Compare commits

...

12 Commits

Author SHA1 Message Date
Marcos Fadul 14be6d8419
Merge bee45a6d58 into 30a98633cd 2026-03-10 14:09:09 +01:00
Alex Verkhovsky 30a98633cd
revert: restore QA checklist wording (#1888) 2026-03-10 05:54:07 -06:00
Alex Verkhovsky b7315c6e32 chore(publish): remove trusted publishing diagnostics 2026-03-10 05:23:33 -06:00
Alex Verkhovsky 6a0046917a fix(publish): pin npm for trusted publishing 2026-03-10 04:09:10 -06:00
Alex Verkhovsky c8f5b60598 fix(publish): remove empty token env and improve auth diagnostics 2026-03-10 03:57:58 -06:00
Alex Verkhovsky 7bc2b5e0e0
fix: isolate npm publish from injected auth config (#1886) 2026-03-10 03:49:01 -06:00
Alex Verkhovsky 1ed5c9d94b
fix: force trusted publish without token auth (#1885)
* fix: force trusted publish without token auth

* chore: always print npm debug logs
2026-03-10 02:42:49 -06:00
Alex Verkhovsky fb76895145
feat: allow manual next channel publish (#1884) 2026-03-10 01:20:28 -06:00
Alex Verkhovsky ebf1513069
fix: remove duplicate publish workflows (#1883)
* fix: remove duplicate publish workflows

* chore: add publish workflow diagnostics
2026-03-09 22:55:07 -06:00
Alex Verkhovsky 10f02a8f15
docs: tweak QA checklist wording (#1882) 2026-03-09 22:30:21 -06:00
Alex Verkhovsky 7857b17626
chore: unify npm publish workflow (#1881)
* ci: add continuous delivery workflows for npm publishing

Add publish-next (auto-prerelease on push to main) and publish-latest
(manual stable release with Discord notification). Update CONTRIBUTING.md
to describe the trunk-based CD model.

* fix(ci): guard publish-latest against non-main dispatch

Reject workflow_dispatch runs from non-main refs to prevent
publishing unintended code or fast-forwarding main unexpectedly.

* chore: unify npm publish workflow
2026-03-09 21:57:44 -06:00
Alex Verkhovsky 063aa58b8d
chore(core): convert help.md to native skill directory (#1874)
* chore(core): convert help.md to native skill directory

Migrate the single-file help.md task to a bmad-help/ skill directory
following the pattern established by bmad-review-adversarial-general.
Update module-help.csv to use skill: reference and remove the entry
from the parent manifest. Fix 7 BMM workflow step files that had
hardcoded file path references to the now-relocated help task.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(prompts): invoke bmad-help as a skill

* style(prompts): format bmad-master agent yaml

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:02:27 -06:00
17 changed files with 151 additions and 167 deletions

View File

@ -1,82 +0,0 @@
name: Publish Latest
on:
workflow_dispatch:
inputs:
bump:
description: "Version bump type"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major
concurrency:
group: publish-latest
permissions:
id-token: write
contents: write
jobs:
publish:
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: Configure git user
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: Bump version
run: 'npm version ${{ inputs.bump }} -m "chore(release): v%s [skip ci]"'
- name: Publish to npm
run: npm publish --tag latest --provenance
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Push version commit and tag
run: git push origin main --follow-tags
- name: Create GitHub Release
run: |
TAG="v$(node -p 'require("./package.json").version')"
gh release create "$TAG" --generate-notes
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Notify Discord
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

@ -1,65 +0,0 @@
name: Publish Next
on:
push:
branches: [main]
paths:
- "src/**"
- "tools/cli/**"
- "package.json"
concurrency:
group: publish-next
cancel-in-progress: true
permissions:
id-token: write
contents: read
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
cache: "npm"
registry-url: "https://registry.npmjs.org"
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Derive next prerelease version
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); }
// If latest is newer than next's base, use latest (next prerelease will be based on it)
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: Publish to npm
run: npm publish --tag next --provenance
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

133
.github/workflows/publish.yaml vendored Normal file
View File

@ -0,0 +1,133 @@
name: Publish
on:
push:
branches: [main]
paths:
- "src/**"
- "tools/cli/**"
- "package.json"
workflow_dispatch:
inputs:
channel:
description: "Publish channel"
required: true
default: "latest"
type: choice
options:
- latest
- next
bump:
description: "Version bump type (latest channel only)"
required: false
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"
- name: Ensure trusted publishing toolchain
run: |
# npm trusted publishing requires Node >= 22.14.0 and npm >= 11.5.1.
npm install --global npm@11.6.2
- name: Configure git user
if: github.event_name == 'workflow_dispatch' && inputs.channel == 'latest'
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' || (github.event_name == 'workflow_dispatch' && inputs.channel == 'next')
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' && inputs.channel == 'latest'
run: 'npm version ${{ inputs.bump }} -m "chore(release): v%s [skip ci]"'
- name: Publish prerelease to npm
if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && inputs.channel == 'next')
run: npm publish --tag next --provenance
- name: Publish stable release to npm
if: github.event_name == 'workflow_dispatch' && inputs.channel == 'latest'
run: npm publish --tag latest --provenance
- name: Push version commit and tag
if: github.event_name == 'workflow_dispatch' && inputs.channel == 'latest'
run: git push origin main --follow-tags
- name: Create GitHub Release
if: github.event_name == 'workflow_dispatch' && inputs.channel == 'latest'
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' && inputs.channel == 'latest'
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

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

View File

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

View File

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

View File

@ -82,7 +82,7 @@ Update the main workflow status file:
### 3. Suggest Next Steps ### 3. Suggest Next Steps
UX Design complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md` UX Design complete. Invoke the `bmad-help` skill.
### 5. Final Completion Confirmation ### 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. The implementation readiness workflow is now complete. The report contains all findings and recommendations for the user to consider.
Implementation Readiness complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md` Implementation Readiness complete. Invoke the `bmad-help` skill.
--- ---

View File

@ -41,7 +41,7 @@ completedAt: '{{current_date}}'
### 3. Next Steps Guidance ### 3. Next Steps Guidance
Architecture complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md` Architecture complete. Invoke the `bmad-help` skill.
Upon Completion of task output: offer to answer any questions about the Architecture Document. 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. When C is selected, the workflow is complete and the epics.md is ready for development.
Epics and Stories complete. Read fully and follow: `{project-root}/_bmad/core/tasks/help.md` Epics and Stories complete. Invoke the `bmad-help` skill.
Upon Completion of task output: offer to answer any questions about the Epics and Stories. Upon Completion of task output: offer to answer any questions about the Epics and Stories.

View File

@ -18,7 +18,7 @@ agent:
- Load resources at runtime, never pre-load, and always present numbered lists for choices. - Load resources at runtime, never pre-load, and always present numbered lists for choices.
critical_actions: critical_actions:
- "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>" - '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>'
menu: menu:
- trigger: "LT or fuzzy match on list-tasks" - 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 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,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,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,,_bmad/core/tasks/help.md,bmad-help,false,,,"Get unstuck by showing what workflow steps come next or answering BMad Method questions.",, 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,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,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,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,,_bmad/core/tasks/editorial-review-prose.xml,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", core,anytime,Editorial Review - Prose,EP,,_bmad/core/tasks/editorial-review-prose.xml,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

@ -0,0 +1,6 @@
---
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

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

View File

@ -1,7 +1,3 @@
---
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 # Task: BMAD Help

View File

@ -8,11 +8,6 @@ editorial-review-structure.xml:
type: task type: task
description: "Structural editor that proposes cuts, reorganization, and simplification while preserving comprehension" 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: index-docs.xml:
canonicalId: bmad-index-docs canonicalId: bmad-index-docs
type: task type: task

View File

@ -8,7 +8,7 @@
<step n="3">Remember: user's name is {user_name}</step> <step n="3">Remember: user's name is {user_name}</step>
{AGENT_SPECIFIC_STEPS} {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="{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 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="{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="{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="{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="{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> <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>