Compare commits

..

1 Commits

Author SHA1 Message Date
Alex Verkhovsky 7fe1ae3e73
Merge 60ead57e4c into 956c43ff62 2026-03-09 10:45:46 -06:00
17 changed files with 22 additions and 203 deletions

View File

@ -1,183 +0,0 @@
name: Publish
on:
push:
branches: [main]
paths:
- "src/**"
- "tools/cli/**"
- "package.json"
workflow_dispatch:
inputs:
bump:
description: "Version bump type"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major
concurrency:
group: publish
cancel-in-progress: ${{ github.event_name == 'push' }}
permissions:
id-token: write
contents: write
jobs:
publish:
if: github.event_name != 'workflow_dispatch' || github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
cache: "npm"
registry-url: "https://registry.npmjs.org"
- name: Debug trusted publishing identity
run: |
echo "GitHub workflow context:"
echo " repository: ${{ github.repository }}"
echo " repository_owner: ${{ github.repository_owner }}"
echo " ref: ${{ github.ref }}"
echo " event_name: ${{ github.event_name }}"
echo " workflow: ${{ github.workflow }}"
echo " workflow_ref: ${{ github.workflow_ref }}"
echo " actor: ${{ github.actor }}"
WORKFLOW_FILE=$(node -e "
const ref = process.argv[1] || '';
const match = ref.match(/\.github\/workflows\/([^@]+)@/);
process.stdout.write(match ? match[1] : '');
" "${{ github.workflow_ref }}")
echo " workflow_filename_for_npm: ${WORKFLOW_FILE:-unknown}"
echo "OIDC claims (sanitized):"
RESPONSE=$(curl -fsS -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=npm:registry.npmjs.org")
ID_TOKEN=$(node -e "
const fs = require('fs');
const data = JSON.parse(fs.readFileSync(0, 'utf8'));
process.stdout.write(data.value || '');
" <<<"$RESPONSE")
node -e "
const token = process.argv[1];
if (!token) {
console.log(JSON.stringify({ error: 'missing_id_token' }, null, 2));
process.exit(0);
}
const payloadPart = token.split('.')[1] || '';
const padded = payloadPart.replace(/-/g, '+').replace(/_/g, '/') + '='.repeat((4 - (payloadPart.length % 4)) % 4);
const claims = JSON.parse(Buffer.from(padded, 'base64').toString('utf8'));
const out = {
iss: claims.iss,
sub: claims.sub,
aud: claims.aud,
repository: claims.repository,
repository_owner: claims.repository_owner,
workflow: claims.workflow,
workflow_ref: claims.workflow_ref,
job_workflow_ref: claims.job_workflow_ref,
ref: claims.ref,
environment: claims.environment || null,
runner_environment: claims.runner_environment || null,
};
console.log(JSON.stringify(out, null, 2));
" "$ID_TOKEN"
- name: Configure git user
if: github.event_name == 'workflow_dispatch'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Derive next prerelease version
if: github.event_name == 'push'
run: |
NEXT_VER=$(npm view bmad-method@next version 2>/dev/null || echo "")
LATEST_VER=$(npm view bmad-method@latest version 2>/dev/null || echo "")
# Determine the best base version for the next prerelease.
BASE=$(node -e "
const semver = require('semver');
const next = process.argv[1] || null;
const latest = process.argv[2] || null;
if (!next && !latest) process.exit(0);
if (!next) { console.log(latest); process.exit(0); }
if (!latest) { console.log(next); process.exit(0); }
const nextBase = next.replace(/-next\.\d+$/, '');
console.log(semver.gt(latest, nextBase) ? latest : next);
" "$NEXT_VER" "$LATEST_VER")
if [ -n "$BASE" ]; then
npm version "$BASE" --no-git-tag-version --allow-same-version
fi
npm version prerelease --preid=next --no-git-tag-version
- name: Bump stable version
if: github.event_name == 'workflow_dispatch'
run: 'npm version ${{ inputs.bump }} -m "chore(release): v%s [skip ci]"'
- name: Debug publish target and registry state
run: |
echo "Local package target:"
node -e "
const pkg = require('./package.json');
console.log(JSON.stringify({ name: pkg.name, version: pkg.version }, null, 2));
"
echo "Registry package view (bmad-method):"
npm view bmad-method name version dist-tags --json || true
- name: Publish prerelease to npm
if: github.event_name == 'push'
run: npm publish --tag next --provenance
- name: Publish stable release to npm
if: github.event_name == 'workflow_dispatch'
run: npm publish --tag latest --provenance
- name: Push version commit and tag
if: github.event_name == 'workflow_dispatch'
run: git push origin main --follow-tags
- name: Create GitHub Release
if: github.event_name == 'workflow_dispatch'
run: |
TAG="v$(node -p 'require("./package.json").version')"
gh release create "$TAG" --generate-notes
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Notify Discord
if: github.event_name == 'workflow_dispatch'
continue-on-error: true
run: |
set -o pipefail
source .github/scripts/discord-helpers.sh
[ -z "$WEBHOOK" ] && exit 0
VERSION=$(node -p 'require("./package.json").version')
RELEASE_URL="${{ github.server_url }}/${{ github.repository }}/releases/tag/v${VERSION}"
MSG=$(printf '📦 **[bmad-method v%s released](<%s>)**' "$VERSION" "$RELEASE_URL" | esc)
jq -n --arg content "$MSG" '{content: $content}' | curl -sf --retry 2 -X POST "$WEBHOOK" -H "Content-Type: application/json" -d @-
env:
WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}

View File

@ -73,7 +73,7 @@ After searching, use the [feature request template](https://github.com/bmad-code
### Target Branch
Submit PRs to the `main` branch. We use trunk-based development. Every push to `main` auto-publishes to `npm` under the `next` tag. Stable releases are cut ~weekly to the `latest` tag.
Submit PRs to the `main` branch. We use [trunk-based development](https://trunkbaseddevelopment.com/branch-for-release/): `main` is the trunk where all work lands, and stable release branches receive only cherry-picked fixes.
### PR Size

View File

@ -128,7 +128,7 @@ Recap that the brief captures everything needed to guide subsequent product deve
### 5. Suggest next steps
Product Brief complete. Invoke the `bmad-help` skill.
Product Brief complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
---

View File

@ -87,7 +87,7 @@ Offer validation workflows to ensure PRD is ready for implementation:
### 4. Suggest Next Workflows
PRD complete. Invoke the `bmad-help` skill.
PRD complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
### 5. Final Completion Confirmation

View File

@ -197,7 +197,7 @@ Display:
- **IF X (Exit):**
- Display: "**Validation Report Saved:** {validationReportPath}"
- Display: "**Summary:** {overall status} - {recommendation}"
- PRD Validation complete. Invoke the `bmad-help` skill.
- PRD Validation complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
- **IF Any other:** Help user, then redisplay menu

View File

@ -82,7 +82,7 @@ Update the main workflow status file:
### 3. Suggest Next Steps
UX Design complete. Invoke the `bmad-help` skill.
UX Design complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
### 5. Final Completion Confirmation

View File

@ -109,7 +109,7 @@ The assessment found [number] issues requiring attention. Review the detailed re
The implementation readiness workflow is now complete. The report contains all findings and recommendations for the user to consider.
Implementation Readiness complete. Invoke the `bmad-help` skill.
Implementation Readiness complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
---

View File

@ -41,7 +41,7 @@ completedAt: '{{current_date}}'
### 3. Next Steps Guidance
Architecture complete. Invoke the `bmad-help` skill.
Architecture complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
Upon Completion of task output: offer to answer any questions about the Architecture Document.

View File

@ -144,6 +144,6 @@ If all validations pass:
When C is selected, the workflow is complete and the epics.md is ready for development.
Epics and Stories complete. Invoke the `bmad-help` skill.
Epics and Stories complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md`
Upon Completion of task output: offer to answer any questions about the Epics and Stories.

View File

@ -30,4 +30,4 @@ Run the tests using your project's test command.
---
**Need more comprehensive test coverage?** Install [Test Architect (TEA)](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/) for advanced workflows.
**Need more comprehensive testing?** Install [Test Architect (TEA)](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/) for advanced workflows.

View File

@ -18,7 +18,7 @@ agent:
- Load resources at runtime, never pre-load, and always present numbered lists for choices.
critical_actions:
- 'Always greet the user and let them know they can invoke the `bmad-help` skill at any time to get advice on what to do next, and they can combine it with what they need help with <example>Invoke the `bmad-help` skill with a question like "where should I start with an idea I have that does XYZ?"</example>'
- "Always greet the user and let them know they can use `/bmad-help` at any time to get advice on what to do next, and they can combine that with what they need help with <example>`/bmad-help where should I start with an idea I have that does XYZ`</example>"
menu:
- trigger: "LT or fuzzy match on list-tasks"

View File

@ -1,7 +1,7 @@
module,phase,name,code,sequence,workflow-file,command,required,agent,options,description,output-location,outputs
core,anytime,Brainstorming,BSP,,_bmad/core/workflows/brainstorming/workflow.md,bmad-brainstorming,false,analyst,,"Generate diverse ideas through interactive techniques. Use early in ideation phase or when stuck generating ideas.",{output_folder}/brainstorming/brainstorming-session-{{date}}.md,,
core,anytime,Party Mode,PM,,_bmad/core/workflows/party-mode/workflow.md,bmad-party-mode,false,party-mode facilitator,,"Orchestrate multi-agent discussions. Use when you need multiple agent perspectives or want agents to collaborate.",,
core,anytime,bmad-help,BH,,skill:bmad-help,bmad-help,false,,,"Get unstuck by showing what workflow steps come next or answering BMad Method questions.",,
core,anytime,bmad-help,BH,,_bmad/core/tasks/help.md,bmad-help,false,,,"Get unstuck by showing what workflow steps come next or answering BMad Method questions.",,
core,anytime,Index Docs,ID,,_bmad/core/tasks/index-docs.xml,bmad-index-docs,false,,,"Create lightweight index for quick LLM scanning. Use when LLM needs to understand available docs without loading everything.",,
core,anytime,Shard Document,SD,,_bmad/core/tasks/shard-doc.xml,bmad-shard-doc,false,,,"Split large documents into smaller files by sections. Use when doc becomes too large (>500 lines) to manage effectively.",,
core,anytime,Editorial Review - Prose,EP,,skill:bmad-editorial-review-prose,bmad-editorial-review-prose,false,,,"Review prose for clarity, tone, and communication issues. Use after drafting to polish written content.",report located with target document,"three-column markdown table with suggested fixes",

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,6 +0,0 @@
---
name: bmad-help
description: 'Analyzes what is done and the users query and offers advice on what to do next. Use if user says what should I do next or what do I do now'
---
Follow the instructions in [workflow.md](workflow.md).

View File

@ -1 +0,0 @@
type: skill

View File

@ -3,6 +3,11 @@ editorial-review-structure.xml:
type: task
description: "Structural editor that proposes cuts, reorganization, and simplification while preserving comprehension"
help.md:
canonicalId: bmad-help
type: task
description: "Analyzes what is done and the users query and offers advice on what to do next"
index-docs.xml:
canonicalId: bmad-index-docs
type: task

View File

@ -1,3 +1,7 @@
---
name: help
description: 'Analyzes what is done and the users query and offers advice on what to do next. Use if user says what should I do next or what do I do now'
---
# Task: BMAD Help

View File

@ -8,7 +8,7 @@
<step n="3">Remember: user's name is {user_name}</step>
{AGENT_SPECIFIC_STEPS}
<step n="{MENU_STEP}">Show greeting using {user_name} from config, communicate in {communication_language}, then display numbered list of ALL menu items from menu section</step>
<step n="{HELP_STEP}">Let {user_name} know they can invoke the `bmad-help` skill at any time to get advice on what to do next, and that they can combine it with what they need help with <example>Invoke the `bmad-help` skill with a question like "where should I start with an idea I have that does XYZ?"</example></step>
<step n="{HELP_STEP}">Let {user_name} know they can type command `/bmad-help` at any time to get advice on what to do next, and that they can combine that with what they need help with <example>`/bmad-help where should I start with an idea I have that does XYZ`</example></step>
<step n="{HALT_STEP}">STOP and WAIT for user input - do NOT execute menu items automatically - accept number or cmd trigger or fuzzy command match</step>
<step n="{INPUT_STEP}">On user input: Number → process menu item[n] | Text → case-insensitive substring match | Multiple matches → ask user to clarify | No match → show "Not recognized"</step>
<step n="{EXECUTE_STEP}">When processing a menu item: Check menu-handlers section below - extract any attributes from the selected menu item (exec, tmpl, data, action, multi) and follow the corresponding handler instructions</step>