bmad-module-skill-forge 8.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/docs/_data/pinned.yaml +7 -7
  3. package/docs/verifying-a-skill.md +9 -9
  4. package/docs/workflows.md +1 -1
  5. package/package.json +1 -1
  6. package/src/shared/scripts/skf-extract-public-api.py +15 -8
  7. package/src/shared/scripts/skf-verify-provenance-completeness.py +331 -105
  8. package/src/skf-analyze-source/SKILL.md +1 -1
  9. package/src/skf-audit-skill/SKILL.md +1 -1
  10. package/src/skf-brief-skill/SKILL.md +1 -1
  11. package/src/skf-campaign/SKILL.md +1 -1
  12. package/src/skf-create-skill/SKILL.md +1 -1
  13. package/src/skf-create-stack-skill/SKILL.md +1 -1
  14. package/src/skf-drop-skill/SKILL.md +1 -1
  15. package/src/skf-export-skill/SKILL.md +1 -1
  16. package/src/skf-forger/SKILL.md +1 -1
  17. package/src/skf-quick-skill/SKILL.md +1 -1
  18. package/src/skf-refine-architecture/SKILL.md +1 -1
  19. package/src/skf-rename-skill/SKILL.md +1 -1
  20. package/src/skf-setup/SKILL.md +1 -1
  21. package/src/skf-test-skill/SKILL.md +1 -1
  22. package/src/skf-test-skill/assets/output-section-formats.md +2 -2
  23. package/src/skf-test-skill/customize.toml +10 -0
  24. package/src/skf-test-skill/references/coverage-check-branches.md +2 -2
  25. package/src/skf-test-skill/references/coverage-check.md +8 -4
  26. package/src/skf-test-skill/references/init.md +1 -1
  27. package/src/skf-test-skill/references/inventory-contract.md +11 -7
  28. package/src/skf-test-skill/references/report.md +2 -1
  29. package/src/skf-test-skill/references/scoring-rules.md +2 -2
  30. package/src/skf-test-skill/references/signature-comparison-rules.md +7 -5
  31. package/src/skf-test-skill/references/source-access-protocol.md +1 -1
  32. package/src/skf-test-skill/scripts/gap-ledger.py +105 -53
  33. package/src/skf-test-skill/scripts/load-coverage-inputs.py +336 -59
  34. package/src/skf-test-skill/scripts/reconcile-coverage.py +46 -18
  35. package/src/skf-test-skill/scripts/score-signatures.py +527 -130
  36. package/src/skf-test-skill/scripts/validate-inventory.py +528 -68
  37. package/src/skf-test-skill/templates/test-report-template.md +4 -3
  38. package/src/skf-update-skill/SKILL.md +1 -1
  39. package/src/skf-verify-stack/SKILL.md +1 -1
@@ -25,9 +25,10 @@ nextWorkflow: ''
25
25
  Each stage writes its section in place of the heading below that it owns and
26
26
  the placeholder comment under that heading, so every heading occurs once.
27
27
  Before the result files are written, report.md §4c checks that each heading
28
- occurs exactly once and that no placeholder comment is left: a stage that
29
- skipped its section stops the run there. Do not reorder or delete the
30
- headings or their placeholder comments.
28
+ occurs exactly once, that no placeholder comment is left and that the title
29
+ above names the skill (init.md §6c fills it): a stage that skipped its
30
+ section stops the run there. Do not change the title line, and do not
31
+ reorder or delete the headings or their placeholder comments.
31
32
 
32
33
  Heading / owning step:
33
34
  Test Summary → detect-mode §2
@@ -86,7 +86,7 @@ Headless callers: the inputs, flags, gate map, outputs and the `SKF_UPDATE_RESUL
86
86
  uv run {resolveCustomizationHelper} --skill {skill-root} --project-root {project-root} --key workflow
87
87
  ```
88
88
 
89
- It merges the bundled `{skill-root}/customize.toml` with `{project-root}/_bmad/custom/skf-update-skill.toml` (team overrides, committed) and `.user.toml` (personal overrides, gitignored). When it exits non-zero, prints no JSON or is missing, print one line, `[activation/warn] customization_resolver_unavailable: <reason>` (`<reason>`: its first stderr line, `not found` when the script is missing, `no JSON` when it printed none). If the resolver cannot run, read `{skill-root}/customize.toml` alone and use its bundled defaults: the `{project-root}/_bmad/custom/` overrides do not apply to this run. Record the warning in the run log at once: write `customization_resolver_unavailable: <reason>` to `{run_dir}/resolver-warning.txt` with a file write (a resolver error can hold quotes or `$( )`, so never echo it or type it into an argument), then run `uv run {emitEnvelopeHelper} record --run-dir "{run_dir}" --warning "$(cat "{run_dir}/resolver-warning.txt")"` from `{project-root}`.
89
+ It merges the bundled `{skill-root}/customize.toml` with `{project-root}/_bmad/custom/skf-update-skill.toml` (team overrides, committed) and `.user.toml` (personal overrides, gitignored). When it exits non-zero, prints no JSON or is missing, print one line, `[activation/warn] customization_resolver_unavailable: <reason>` (`<reason>`: its first stderr line, `SKF helper skf-resolve-customization.py not found` when the script is missing, `no JSON` when it printed none). If the resolver cannot run, read `{skill-root}/customize.toml` alone and use its bundled defaults: the `{project-root}/_bmad/custom/` overrides do not apply to this run. Record the warning in the run log at once: write `customization_resolver_unavailable: <reason>` to `{run_dir}/resolver-warning.txt` with a file write (a resolver error can hold quotes or `$( )`, so never echo it or type it into an argument), then run `uv run {emitEnvelopeHelper} record --run-dir "{run_dir}" --warning "$(cat "{run_dir}/resolver-warning.txt")"` from `{project-root}`.
90
90
 
91
91
  Apply the resolved values so no surface is a silent no-op: execute each entry in `workflow.activation_steps_prepend` in order now; treat every entry in `workflow.persistent_facts` as standing context for the whole run (entries prefixed `file:` are paths or globs whose contents load as facts: the bundled default loads every `project-context.md` under `{project-root}`; an entry prefixed `!` drops each earlier entry it names and loads nothing itself, so an override's `"!file:{project-root}/**/project-context.md"` turns that default off); resolve `{onCompleteCommand}` ← `workflow.on_complete` if non-empty, else empty string, and stash it in workflow context (`references/report.md` §5b runs it after a finished run's result files, never in `--detect-only`, `--dry-run` or a halt; empty = no-op). After activation completes, execute each entry in `workflow.activation_steps_append` in order before `init.md` runs.
92
92
 
@@ -91,7 +91,7 @@ When `{headless_mode}` is true, step 6 prints one `SKF_VERIFY_STACK_RESULT_JSON:
91
91
  uv run {resolveCustomizationHelper} --skill {skill-root} --project-root {project-root} --key workflow
92
92
  ```
93
93
 
94
- It merges the bundled `{skill-root}/customize.toml` with `{project-root}/_bmad/custom/skf-verify-stack.toml` (team overrides, committed) and `.user.toml` (personal overrides, gitignored). When it exits non-zero, prints no JSON or is missing, print one line, `[activation/warn] customization_resolver_unavailable: <reason>` (`<reason>`: its first stderr line, `not found` when the script is missing, `no JSON` when it printed none). If the resolver cannot run, read `{skill-root}/customize.toml` alone and use its bundled defaults: the `{project-root}/_bmad/custom/` overrides do not apply to this run. In that case keep the reason as `{customization_resolver_unavailable}` (unset when the resolver ran) for init.md to record once it has created `{run_dir}`.
94
+ It merges the bundled `{skill-root}/customize.toml` with `{project-root}/_bmad/custom/skf-verify-stack.toml` (team overrides, committed) and `.user.toml` (personal overrides, gitignored). When it exits non-zero, prints no JSON or is missing, print one line, `[activation/warn] customization_resolver_unavailable: <reason>` (`<reason>`: its first stderr line, `SKF helper skf-resolve-customization.py not found` when the script is missing, `no JSON` when it printed none). If the resolver cannot run, read `{skill-root}/customize.toml` alone and use its bundled defaults: the `{project-root}/_bmad/custom/` overrides do not apply to this run. In that case keep the reason as `{customization_resolver_unavailable}` (unset when the resolver ran) for init.md to record once it has created `{run_dir}`.
95
95
 
96
96
  Apply the path-scalar fallback now so stage files don't repeat it: `{reportTemplatePath}` ← `workflow.report_template_path` if non-empty, else `assets/feasibility-report-template.md`. An empty or absent value falls through to that default, and init.md §4 loads the variable as it is. Bind `{outputFolderPath}` ← `{forge_data_folder}`, always (no setting moves it): the report and its `-latest` copy go where create-stack-skill and refine-architecture look for them, and step 1 finds the earlier reports there.
97
97