bmad-module-skill-forge 0.10.0 → 0.10.1-alpha.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 (268) hide show
  1. package/.claude-plugin/marketplace.json +39 -0
  2. package/.gitattributes +16 -0
  3. package/README.md +105 -38
  4. package/docs/404.md +13 -10
  5. package/docs/RELEASING.md +185 -0
  6. package/docs/STABILITY.md +123 -0
  7. package/docs/_data/pinned.yaml +98 -0
  8. package/docs/agents.md +16 -11
  9. package/docs/architecture.md +221 -0
  10. package/docs/bmad-synergy.md +11 -13
  11. package/docs/concepts.md +18 -108
  12. package/docs/examples.md +121 -80
  13. package/docs/getting-started.md +85 -147
  14. package/docs/how-it-works.md +25 -536
  15. package/docs/index.md +44 -27
  16. package/docs/skill-model.md +328 -0
  17. package/docs/troubleshooting.md +39 -0
  18. package/docs/verifying-a-skill.md +232 -0
  19. package/docs/why-skf.md +93 -0
  20. package/docs/workflows.md +119 -13
  21. package/package.json +25 -4
  22. package/src/README.md +23 -25
  23. package/src/forger/forge-tier.yaml +4 -2
  24. package/src/forger/preferences.yaml +7 -1
  25. package/src/knowledge/agentskills-spec.md +1 -1
  26. package/src/knowledge/architecture-verification.md +1 -1
  27. package/src/knowledge/ccc-bridge.md +16 -15
  28. package/src/knowledge/overview.md +11 -11
  29. package/src/knowledge/progressive-capability.md +3 -3
  30. package/src/knowledge/provenance-tracking.md +9 -3
  31. package/src/knowledge/qmd-registry.md +8 -8
  32. package/src/knowledge/skf-knowledge-index.csv +2 -2
  33. package/src/knowledge/skill-lifecycle.md +16 -1
  34. package/src/knowledge/split-body-strategy.md +1 -1
  35. package/src/knowledge/version-paths.md +17 -12
  36. package/src/module-help.csv +18 -17
  37. package/src/shared/health-check.md +372 -0
  38. package/src/shared/references/feasibility-report-schema.md +86 -0
  39. package/src/shared/references/headless-gate-convention.md +62 -0
  40. package/src/shared/references/output-contract-schema.md +35 -0
  41. package/src/shared/references/pipeline-contracts.md +102 -0
  42. package/src/shared/scripts/skf-atomic-write.py +370 -0
  43. package/src/shared/scripts/skf-manifest-ops.py +236 -0
  44. package/src/shared/scripts/skf-preflight.py +164 -0
  45. package/src/shared/scripts/skf-rebuild-managed-sections.py +201 -0
  46. package/src/shared/scripts/skf-severity-classify.py +163 -0
  47. package/src/shared/scripts/skf-skill-inventory.py +210 -0
  48. package/src/shared/scripts/skf-structural-diff.py +257 -0
  49. package/src/shared/scripts/skf-validate-frontmatter.py +318 -0
  50. package/src/shared/scripts/skf-validate-output.py +247 -0
  51. package/src/skf-analyze-source/SKILL.md +57 -0
  52. package/src/skf-analyze-source/assets/skill-brief-schema.md +125 -0
  53. package/src/skf-analyze-source/references/unit-detection-heuristics.md +124 -0
  54. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01-init.md +6 -66
  55. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01b-continue.md +4 -59
  56. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-02-scan-project.md +7 -68
  57. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-03-identify-units.md +6 -66
  58. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-04-map-and-detect.md +7 -68
  59. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-05-recommend.md +6 -66
  60. package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-06-generate-briefs.md +14 -71
  61. package/src/skf-analyze-source/steps-c/step-07-health-check.md +22 -0
  62. package/src/skf-audit-skill/SKILL.md +59 -0
  63. package/src/{workflows/audit-skill/data → skf-audit-skill/assets}/drift-report-template.md +7 -7
  64. package/src/{workflows/audit-skill/data → skf-audit-skill/references}/severity-rules.md +11 -11
  65. package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-01-init.md +24 -68
  66. package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-02-re-index.md +36 -71
  67. package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-03-structural-diff.md +21 -63
  68. package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-04-semantic-diff.md +6 -65
  69. package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-05-severity-classify.md +5 -63
  70. package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-06-report.md +10 -64
  71. package/src/skf-audit-skill/steps-c/step-07-health-check.md +22 -0
  72. package/src/skf-brief-skill/SKILL.md +53 -0
  73. package/src/{workflows/brief-skill/data → skf-brief-skill/assets}/scope-templates.md +23 -0
  74. package/src/skf-brief-skill/assets/skill-brief-schema.md +206 -0
  75. package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-01-gather-intent.md +6 -67
  76. package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-02-analyze-target.md +6 -66
  77. package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-03-scope-definition.md +12 -68
  78. package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-04-confirm-brief.md +5 -63
  79. package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-05-write-brief.md +10 -70
  80. package/src/skf-brief-skill/steps-c/step-06-health-check.md +22 -0
  81. package/src/skf-create-skill/SKILL.md +63 -0
  82. package/src/{workflows/create-skill/data → skf-create-skill/assets}/compile-assembly-rules.md +60 -0
  83. package/src/{workflows/create-skill/data → skf-create-skill/assets}/skill-sections.md +92 -23
  84. package/src/skf-create-skill/assets/tessl-dismissal-rules.md +102 -0
  85. package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns-tracing.md +13 -13
  86. package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns.md +8 -3
  87. package/src/skf-create-skill/references/source-resolution-protocols.md +239 -0
  88. package/src/{workflows/create-skill/data → skf-create-skill/references}/tier-degradation-rules.md +8 -7
  89. package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-01-load-brief.md +25 -63
  90. package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-02-ecosystem-check.md +8 -64
  91. package/src/skf-create-skill/steps-c/step-03-extract.md +379 -0
  92. package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-03d-component-extraction.md +18 -35
  93. package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-04-enrich.md +12 -69
  94. package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-05-compile.md +71 -75
  95. package/src/skf-create-skill/steps-c/step-06-validate.md +267 -0
  96. package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-07-generate-artifacts.md +30 -74
  97. package/src/skf-create-skill/steps-c/step-08-report.md +145 -0
  98. package/src/skf-create-skill/steps-c/step-09-health-check.md +23 -0
  99. package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-02b-ccc-discover.md +8 -66
  100. package/src/skf-create-skill/steps-c/sub/step-03b-fetch-temporal.md +229 -0
  101. package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-03c-fetch-docs.md +18 -42
  102. package/src/skf-create-stack-skill/SKILL.md +64 -0
  103. package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/assets}/stack-skill-template.md +2 -1
  104. package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/compose-mode-rules.md +19 -5
  105. package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/integration-patterns.md +1 -1
  106. package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/manifest-patterns.md +10 -10
  107. package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-01-init.md +14 -55
  108. package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-02-detect-manifests.md +29 -63
  109. package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-03-rank-and-confirm.md +9 -59
  110. package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-04-parallel-extract.md +29 -64
  111. package/src/skf-create-stack-skill/steps-c/step-05-detect-integrations.md +164 -0
  112. package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-06-compile-stack.md +7 -60
  113. package/src/skf-create-stack-skill/steps-c/step-07-generate-output.md +328 -0
  114. package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-08-validate.md +17 -63
  115. package/src/skf-create-stack-skill/steps-c/step-09-report.md +128 -0
  116. package/src/skf-create-stack-skill/steps-c/step-10-health-check.md +22 -0
  117. package/src/skf-drop-skill/SKILL.md +57 -0
  118. package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-01-select.md +9 -69
  119. package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-02-execute.md +30 -106
  120. package/src/skf-drop-skill/steps-c/step-03-report.md +83 -0
  121. package/src/skf-drop-skill/steps-c/step-04-health-check.md +22 -0
  122. package/src/skf-export-skill/SKILL.md +57 -0
  123. package/src/skf-export-skill/assets/managed-section-format.md +138 -0
  124. package/src/{workflows/export-skill/data → skf-export-skill/assets}/snippet-format.md +8 -12
  125. package/src/skf-export-skill/steps-c/step-01-load-skill.md +247 -0
  126. package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-02-package.md +5 -58
  127. package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-03-generate-snippet.md +15 -77
  128. package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-04-update-context.md +59 -133
  129. package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-05-token-report.md +4 -58
  130. package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-06-summary.md +16 -68
  131. package/src/skf-export-skill/steps-c/step-07-health-check.md +22 -0
  132. package/src/skf-forger/SKILL.md +110 -0
  133. package/src/skf-forger/bmad-skill-manifest.yaml +11 -0
  134. package/src/skf-quick-skill/SKILL.md +56 -0
  135. package/src/{workflows/quick-skill/data → skf-quick-skill/references}/registry-resolution.md +6 -6
  136. package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-01-resolve-target.md +9 -62
  137. package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-02-ecosystem-check.md +5 -59
  138. package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-03-quick-extract.md +18 -61
  139. package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-04-compile.md +6 -60
  140. package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-05-validate.md +58 -78
  141. package/src/skf-quick-skill/steps-c/step-06-write.md +73 -0
  142. package/src/skf-quick-skill/steps-c/step-07-health-check.md +22 -0
  143. package/src/skf-refine-architecture/SKILL.md +57 -0
  144. package/src/{workflows/refine-architecture/data → skf-refine-architecture/references}/refinement-rules.md +16 -16
  145. package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-01-init.md +6 -63
  146. package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-02-gap-analysis.md +29 -71
  147. package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-03-issue-detection.md +5 -65
  148. package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-04-improvements.md +5 -64
  149. package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-05-compile.md +5 -56
  150. package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-06-report.md +11 -64
  151. package/src/skf-refine-architecture/steps-c/step-07-health-check.md +22 -0
  152. package/src/skf-rename-skill/SKILL.md +58 -0
  153. package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-01-select.md +12 -73
  154. package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-02-execute.md +32 -113
  155. package/src/skf-rename-skill/steps-c/step-03-report.md +83 -0
  156. package/src/skf-rename-skill/steps-c/step-04-health-check.md +22 -0
  157. package/src/skf-setup/SKILL.md +55 -0
  158. package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01-detect-and-tier.md +6 -62
  159. package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01b-ccc-index.md +9 -65
  160. package/src/{workflows/setup-forge → skf-setup}/steps-c/step-02-write-config.md +15 -60
  161. package/src/{workflows/setup-forge → skf-setup}/steps-c/step-03-auto-index.md +7 -66
  162. package/src/skf-setup/steps-c/step-04-report.md +92 -0
  163. package/src/skf-setup/steps-c/step-05-health-check.md +22 -0
  164. package/src/skf-test-skill/SKILL.md +59 -0
  165. package/src/skf-test-skill/references/migration-section-rules.md +114 -0
  166. package/src/skf-test-skill/references/scoring-rules.md +207 -0
  167. package/src/skf-test-skill/references/source-access-protocol.md +109 -0
  168. package/src/skf-test-skill/scripts/compute-score.py +310 -0
  169. package/src/skf-test-skill/steps-c/step-01-init.md +238 -0
  170. package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-02-detect-mode.md +4 -62
  171. package/src/skf-test-skill/steps-c/step-03-coverage-check.md +347 -0
  172. package/src/skf-test-skill/steps-c/step-04-coherence-check.md +239 -0
  173. package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-04b-external-validators.md +42 -77
  174. package/src/skf-test-skill/steps-c/step-05-score.md +266 -0
  175. package/src/skf-test-skill/steps-c/step-06-report.md +290 -0
  176. package/src/skf-test-skill/steps-c/step-07-health-check.md +25 -0
  177. package/src/skf-test-skill/templates/test-report-template.md +58 -0
  178. package/src/skf-update-skill/SKILL.md +58 -0
  179. package/src/{workflows/update-skill/data → skf-update-skill/references}/manual-section-rules.md +6 -6
  180. package/src/{workflows/update-skill/data → skf-update-skill/references}/merge-conflict-rules.md +5 -5
  181. package/src/skf-update-skill/references/remote-source-resolution.md +94 -0
  182. package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-01-init.md +22 -69
  183. package/src/skf-update-skill/steps-c/step-02-detect-changes.md +255 -0
  184. package/src/skf-update-skill/steps-c/step-03-re-extract.md +336 -0
  185. package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-04-merge.md +60 -72
  186. package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-05-validate.md +5 -62
  187. package/src/skf-update-skill/steps-c/step-06-write.md +278 -0
  188. package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-07-report.md +11 -69
  189. package/src/skf-update-skill/steps-c/step-08-health-check.md +22 -0
  190. package/src/skf-verify-stack/SKILL.md +60 -0
  191. package/src/skf-verify-stack/assets/feasibility-report-template.md +76 -0
  192. package/src/{workflows/verify-stack/data → skf-verify-stack/references}/coverage-patterns.md +12 -4
  193. package/src/skf-verify-stack/references/integration-verification-rules.md +78 -0
  194. package/src/skf-verify-stack/steps-c/step-01-init.md +178 -0
  195. package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-02-coverage.md +27 -72
  196. package/src/skf-verify-stack/steps-c/step-03-integrations.md +179 -0
  197. package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-04-requirements.md +14 -67
  198. package/src/skf-verify-stack/steps-c/step-05-synthesize.md +147 -0
  199. package/src/skf-verify-stack/steps-c/step-06-report.md +156 -0
  200. package/src/skf-verify-stack/steps-c/step-07-health-check.md +25 -0
  201. package/tools/cli/commands/install.js +1 -1
  202. package/tools/cli/commands/status.js +21 -23
  203. package/tools/cli/commands/uninstall.js +11 -19
  204. package/tools/cli/commands/update.js +2 -2
  205. package/tools/cli/lib/ide-skills.js +216 -0
  206. package/tools/cli/lib/installer.js +29 -52
  207. package/tools/cli/lib/manifest.js +11 -5
  208. package/tools/cli/lib/platform-codes.yaml +223 -0
  209. package/tools/cli/lib/ui.js +76 -47
  210. package/tools/validate-docs-drift.js +193 -0
  211. package/src/agents/forger.agent.yaml +0 -114
  212. package/src/workflows/README.md +0 -174
  213. package/src/workflows/analyze-source/data/skill-brief-schema.md +0 -125
  214. package/src/workflows/analyze-source/data/unit-detection-heuristics.md +0 -124
  215. package/src/workflows/analyze-source/workflow.md +0 -61
  216. package/src/workflows/audit-skill/workflow.md +0 -64
  217. package/src/workflows/brief-skill/data/skill-brief-schema.md +0 -159
  218. package/src/workflows/brief-skill/workflow.md +0 -58
  219. package/src/workflows/create-skill/data/source-resolution-protocols.md +0 -200
  220. package/src/workflows/create-skill/steps-c/step-03-extract.md +0 -301
  221. package/src/workflows/create-skill/steps-c/step-03b-fetch-temporal.md +0 -253
  222. package/src/workflows/create-skill/steps-c/step-06-validate.md +0 -254
  223. package/src/workflows/create-skill/steps-c/step-08-report.md +0 -179
  224. package/src/workflows/create-skill/workflow.md +0 -53
  225. package/src/workflows/create-stack-skill/steps-c/step-05-detect-integrations.md +0 -196
  226. package/src/workflows/create-stack-skill/steps-c/step-07-generate-output.md +0 -270
  227. package/src/workflows/create-stack-skill/steps-c/step-09-report.md +0 -150
  228. package/src/workflows/create-stack-skill/workflow.md +0 -59
  229. package/src/workflows/drop-skill/steps-c/step-03-report.md +0 -136
  230. package/src/workflows/drop-skill/workflow.md +0 -63
  231. package/src/workflows/export-skill/data/managed-section-format.md +0 -103
  232. package/src/workflows/export-skill/steps-c/step-01-load-skill.md +0 -237
  233. package/src/workflows/export-skill/workflow.md +0 -58
  234. package/src/workflows/quick-skill/steps-c/step-06-write.md +0 -178
  235. package/src/workflows/quick-skill/workflow.md +0 -58
  236. package/src/workflows/refine-architecture/workflow.md +0 -61
  237. package/src/workflows/rename-skill/steps-c/step-03-report.md +0 -133
  238. package/src/workflows/rename-skill/workflow.md +0 -64
  239. package/src/workflows/setup-forge/steps-c/step-04-report.md +0 -159
  240. package/src/workflows/setup-forge/workflow.md +0 -51
  241. package/src/workflows/shared/health-check.md +0 -231
  242. package/src/workflows/test-skill/data/scoring-rules.md +0 -123
  243. package/src/workflows/test-skill/data/source-access-protocol.md +0 -51
  244. package/src/workflows/test-skill/steps-c/step-01-init.md +0 -217
  245. package/src/workflows/test-skill/steps-c/step-03-coverage-check.md +0 -280
  246. package/src/workflows/test-skill/steps-c/step-04-coherence-check.md +0 -271
  247. package/src/workflows/test-skill/steps-c/step-05-score.md +0 -222
  248. package/src/workflows/test-skill/steps-c/step-06-report.md +0 -208
  249. package/src/workflows/test-skill/templates/test-report-template.md +0 -28
  250. package/src/workflows/test-skill/workflow.md +0 -57
  251. package/src/workflows/update-skill/data/remote-source-resolution.md +0 -57
  252. package/src/workflows/update-skill/steps-c/step-02-detect-changes.md +0 -221
  253. package/src/workflows/update-skill/steps-c/step-03-re-extract.md +0 -256
  254. package/src/workflows/update-skill/steps-c/step-06-write.md +0 -265
  255. package/src/workflows/update-skill/workflow.md +0 -56
  256. package/src/workflows/verify-stack/data/feasibility-report-template.md +0 -63
  257. package/src/workflows/verify-stack/data/integration-verification-rules.md +0 -73
  258. package/src/workflows/verify-stack/steps-c/step-01-init.md +0 -179
  259. package/src/workflows/verify-stack/steps-c/step-03-integrations.md +0 -195
  260. package/src/workflows/verify-stack/steps-c/step-05-synthesize.md +0 -191
  261. package/src/workflows/verify-stack/steps-c/step-06-report.md +0 -200
  262. package/src/workflows/verify-stack/workflow.md +0 -61
  263. package/tools/cli/lib/compiler.js +0 -306
  264. package/tools/cli/lib/ide-commands.js +0 -244
  265. /package/src/{workflows/analyze-source → skf-analyze-source}/templates/analysis-report-template.md +0 -0
  266. /package/src/{workflows/quick-skill/data → skf-quick-skill/assets}/skill-template.md +0 -0
  267. /package/src/{workflows/setup-forge/data → skf-setup/references}/tier-rules.md +0 -0
  268. /package/src/{workflows/test-skill/data → skf-test-skill/assets}/output-section-formats.md +0 -0
@@ -17,6 +17,7 @@ const fs = require('fs-extra');
17
17
  const yaml = require('js-yaml');
18
18
  const { readManifest } = require('./manifest');
19
19
  const { compareVersions } = require('./version-check');
20
+ const { getAvailablePlatforms, getDetectionMarkers } = require('./ide-skills');
20
21
 
21
22
  const SKF_FOLDER = '_bmad/skf';
22
23
 
@@ -42,30 +43,44 @@ class UI {
42
43
  logoLines = [' S K F'];
43
44
  }
44
45
 
45
- const w = 54;
46
+ const w = 72;
46
47
  const frame = brand.dark;
47
48
  const top = frame(' ╔' + '═'.repeat(w) + '╗');
48
49
  const mid = frame(' ╟' + '─'.repeat(w) + '╢');
49
50
  const bottom = frame(' ╚' + '═'.repeat(w) + '╝');
51
+ const rule = frame(' ' + '━'.repeat(w));
50
52
  const row = (content) => {
51
53
  // eslint-disable-next-line no-control-regex -- stripping ANSI escape codes for visual width calculation
52
54
  const stripped = content.replaceAll(/\u001B\[\d+(?:;\d+)*m/g, '');
53
55
  const pad = Math.max(0, w - stripped.length - 2);
54
56
  return frame(' ║ ') + content + ' '.repeat(pad) + frame(' ║');
55
57
  };
58
+ const empty = row('');
59
+ const indent = ' ';
56
60
 
57
61
  console.log();
58
62
  console.log(top);
63
+ console.log(empty);
59
64
  for (const line of logoLines) {
60
- console.log(row(brand.amber.bold(line.replace(/\s+$/, ''))));
65
+ console.log(row(indent + brand.amber.bold(line.replace(/\s+$/, ''))));
61
66
  }
67
+ console.log(empty);
62
68
  console.log(mid);
63
- console.log(row(chalk.white.bold('Skill Forge') + chalk.dim(` v${version}`)));
64
- console.log(row(chalk.dim('Agent Skill Compiler') + ' '.repeat(15) + brand.spark('⚒')));
65
- console.log(mid);
66
- console.log(row(chalk.dim('Code · Docs · Discourse → Verified agent skills')));
69
+ console.log(row(indent + chalk.white.bold('Skill Forge') + ' ' + brand.spark('⚒') + ' ' + chalk.dim('Agent Skill Compiler')));
70
+ console.log(row(indent + chalk.dim('Turn code and docs into instructions AI agents can actually follow.')));
71
+ console.log(row(indent + chalk.dim(`v${version} · MIT License · Open Source`)));
67
72
  console.log(bottom);
68
73
  console.log();
74
+ console.log(rule);
75
+ console.log();
76
+ const resource = (label, url) => ' ' + chalk.dim(label.padEnd(10)) + brand.amber(url);
77
+ console.log(resource('Docs', 'https://armelhbobdad.github.io/bmad-module-skill-forge'));
78
+ console.log(resource('GitHub', 'https://github.com/armelhbobdad/bmad-module-skill-forge'));
79
+ console.log(resource('Discord', 'https://discord.gg/gk8jAdXWmj'));
80
+ console.log(resource('Support', 'https://buymeacoffee.com/armelhbobdad'));
81
+ console.log();
82
+ console.log(rule);
83
+ console.log();
69
84
 
70
85
  intro(brand.amber('Skill Forge Installer'));
71
86
  }
@@ -133,7 +148,7 @@ class UI {
133
148
  }
134
149
  action = choice;
135
150
  } else {
136
- log.info(`Agents and workflows will be installed in ${chalk.white(skfFolder + '/')}`);
151
+ log.info(`Skills will be installed in ${chalk.white(skfFolder + '/')}`);
137
152
  }
138
153
 
139
154
  if (action === 'update') {
@@ -153,16 +168,12 @@ class UI {
153
168
  log.info('Previous configuration detected — defaults pre-populated.');
154
169
  }
155
170
 
156
- const ideOptions = [
157
- { label: 'Claude Code', value: 'claude-code' },
158
- { label: 'Cline', value: 'cline' },
159
- { label: 'Codex', value: 'codex' },
160
- { label: 'Cursor', value: 'cursor' },
161
- { label: 'GitHub Copilot', value: 'github-copilot' },
162
- { label: 'Roo Code', value: 'roo' },
163
- { label: 'Windsurf', value: 'windsurf' },
164
- { label: 'Other', value: 'other' },
165
- ];
171
+ // Build IDE options from platform-codes.yaml
172
+ const platforms = getAvailablePlatforms();
173
+ const ideOptions = platforms.map((p) => ({
174
+ label: p.preferred ? `${p.label} (Recommended)` : p.label,
175
+ value: p.value,
176
+ }));
166
177
 
167
178
  // Pre-check IDEs: saved config takes priority, then auto-detect from directories
168
179
  const savedIdes = savedConfig?.ides || [];
@@ -249,16 +260,7 @@ class UI {
249
260
  }
250
261
 
251
262
  async detectIdes(projectDir) {
252
- const markers = {
253
- 'claude-code': ['.claude'],
254
- cursor: ['.cursor'],
255
- cline: ['.clinerules'],
256
- codex: ['.codex'],
257
- 'github-copilot': ['.github/copilot-instructions.md', '.github/prompts'],
258
- roo: ['.roo', '.roomodes'],
259
- windsurf: ['.windsurf'],
260
- };
261
-
263
+ const markers = getDetectionMarkers();
262
264
  const detected = [];
263
265
  for (const [ide, paths] of Object.entries(markers)) {
264
266
  for (const p of paths) {
@@ -285,31 +287,58 @@ class UI {
285
287
  }
286
288
 
287
289
  displaySuccess(skfFolder, ides = [], action = 'fresh') {
288
- const ideNames = {
289
- 'claude-code': 'Claude Code',
290
- cline: 'Cline',
291
- codex: 'Codex',
292
- cursor: 'Cursor',
293
- 'github-copilot': 'GitHub Copilot',
294
- roo: 'Roo Code',
295
- windsurf: 'Windsurf',
296
- other: 'your IDE',
297
- };
290
+ // Build per-platform lookup tables from platform-codes.yaml
291
+ const ideNames = {};
292
+ const idePrefixes = {};
293
+ for (const p of getAvailablePlatforms()) {
294
+ ideNames[p.value] = p.label;
295
+ idePrefixes[p.value] = p.skillInvocationPrefix; // null = auto-invoke only
296
+ }
297
+
298
+ const selectedIdes = Array.isArray(ides) && ides.length > 0 ? ides : [];
298
299
 
299
300
  let ideDisplay;
300
- if (!ides || ides.length === 0) {
301
+ if (selectedIdes.length === 0) {
301
302
  ideDisplay = 'your IDE';
302
- } else if (ides.length === 1) {
303
- ideDisplay = ideNames[ides[0]] || 'your IDE';
303
+ } else if (selectedIdes.length === 1) {
304
+ ideDisplay = ideNames[selectedIdes[0]] || 'your IDE';
305
+ } else {
306
+ ideDisplay = selectedIdes.map((ide) => ideNames[ide] || ide).join(' or ');
307
+ }
308
+
309
+ // Build per-IDE invocation hints. Skills with a prefix get a literal
310
+ // command; auto-invoke IDEs get a chat-based instruction.
311
+ const invocations = selectedIdes.map((ide) => {
312
+ const name = ideNames[ide] || ide;
313
+ const prefix = idePrefixes[ide];
314
+ if (prefix) {
315
+ return { ide: name, command: `${prefix}skf-forger`, auto: false };
316
+ }
317
+ return { ide: name, command: null, auto: true };
318
+ });
319
+
320
+ // Compose the activate line shown in steps and outro.
321
+ let activateLine;
322
+ if (invocations.length === 0) {
323
+ // Update flow with no IDE list — show both common forms
324
+ activateLine = `${brand.gold('/skf-forger')} ${chalk.dim('(Claude Code)')} ${chalk.dim('·')} ${brand.gold('$skf-forger')} ${chalk.dim('(Codex)')}`;
325
+ } else if (invocations.length === 1) {
326
+ const inv = invocations[0];
327
+ activateLine = inv.auto ? chalk.dim(`${inv.ide} auto-loads skf-forger`) : brand.gold(inv.command);
304
328
  } else {
305
- ideDisplay = ides.map((ide) => ideNames[ide] || ide).join(' or ');
329
+ // Mixed: show one segment per IDE
330
+ activateLine = invocations
331
+ .map((inv) =>
332
+ inv.auto
333
+ ? `${chalk.dim('auto')} ${chalk.dim('(' + inv.ide + ')')}`
334
+ : `${brand.gold(inv.command)} ${chalk.dim('(' + inv.ide + ')')}`,
335
+ )
336
+ .join(' ');
306
337
  }
307
338
 
308
339
  let noteTitle;
309
340
  let noteBody;
310
341
 
311
- const activateCmd = brand.gold('/bmad-agent-skf-forger');
312
-
313
342
  if (action === 'update') {
314
343
  noteTitle = brand.amber.bold('Update complete!');
315
344
  noteBody = [
@@ -318,15 +347,15 @@ class UI {
318
347
  'Your config.yaml and sidecar state are preserved.',
319
348
  '',
320
349
  `${chalk.white.bold('Next Steps')}`,
321
- `1. Reload the agent in ${ideDisplay}: ${activateCmd}`,
322
- '2. Run @Ferris SF to re-detect tools if needed',
350
+ `1. Reload the agent in ${ideDisplay}: ${activateLine}`,
351
+ `2. Then ask Ferris to ${chalk.white('"setup the forge"')} to re-detect tools`,
323
352
  ].join('\n');
324
353
  } else {
325
354
  noteTitle = brand.amber.bold('Installation complete!');
326
355
  noteBody = [
327
356
  `${chalk.white.bold('Get Started')}`,
328
357
  `1. Open this folder in ${ideDisplay}`,
329
- `2. Activate Ferris: ${activateCmd}`,
358
+ `2. Activate Ferris: ${activateLine}`,
330
359
  '3. Ferris (your Skill Architect) will guide you through',
331
360
  ' setting up and forging your first agent skill',
332
361
  ].join('\n');
@@ -335,7 +364,7 @@ class UI {
335
364
  note(noteBody, noteTitle);
336
365
 
337
366
  outro(
338
- `${brand.spark('⚒')} Agent: ${chalk.white('Ferris')} ${chalk.dim('(Skill Architect & Integrity Guardian)')}\n${brand.dark('⚡')} Docs: ${brand.amber('https://armelhbobdad.github.io/bmad-module-skill-forge')}`,
367
+ `${brand.spark('⚒')} Agent: ${chalk.white('Ferris')} ${chalk.dim('(Skill Architect & Integrity Guardian)')}\n${brand.dark('⚡')} Docs: ${brand.amber('https://armelhbobdad.github.io/bmad-module-skill-forge')}\n${brand.gold('▶')} Call the forger: ${activateLine}`,
339
368
  );
340
369
  }
341
370
  }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Documentation Drift Validator
3
+ *
4
+ * Verifies that SKF docs agree with the canonical oh-my-skills output on
5
+ * every version number, commit SHA, and library reference the docs cite.
6
+ *
7
+ * What it checks:
8
+ * - Every skill listed in `docs/_data/pinned.yaml` actually exists at the
9
+ * claimed version and commit in $OMS/skills/<name>/<version>/<name>/metadata.json
10
+ * - The metadata.json `version` field matches the anchor `version`
11
+ * - The metadata.json `source_commit` field matches the anchor `source_commit`
12
+ * - Every `.md` file under `docs/` is grepped for `<library> v?<x.y.z>` strings;
13
+ * any that don't match the currently-pinned version for that library are flagged
14
+ * - Known illustrative libraries (hono, drizzle-orm, ...) are whitelisted and
15
+ * allowed to carry any version number
16
+ *
17
+ * Usage:
18
+ * node tools/validate-docs-drift.js # validate, exit 1 on drift
19
+ * OMS=/path/to/oh-my-skills node tools/validate-docs-drift.js
20
+ *
21
+ * Exit codes:
22
+ * 0 — no drift detected
23
+ * 1 — drift found; fix the docs or update docs/_data/pinned.yaml
24
+ * 2 — infrastructure failure (anchors file missing, oh-my-skills path
25
+ * unreachable, yaml parse error)
26
+ */
27
+
28
+ const fs = require('node:fs');
29
+ const path = require('node:path');
30
+ const yaml = require('js-yaml');
31
+
32
+ const SKF_ROOT = path.resolve(__dirname, '..');
33
+ const DOCS_DIR = path.join(SKF_ROOT, 'docs');
34
+ const ANCHORS_PATH = path.join(DOCS_DIR, '_data', 'pinned.yaml');
35
+
36
+ function loadAnchors() {
37
+ if (!fs.existsSync(ANCHORS_PATH)) {
38
+ console.error(`error: anchors file not found at ${ANCHORS_PATH}`);
39
+ process.exit(2);
40
+ }
41
+ try {
42
+ return yaml.load(fs.readFileSync(ANCHORS_PATH, 'utf8'));
43
+ } catch (error) {
44
+ console.error(`error: could not parse ${ANCHORS_PATH}: ${error.message}`);
45
+ process.exit(2);
46
+ }
47
+ }
48
+
49
+ function resolveOmsPath(anchors) {
50
+ if (process.env.OMS) {
51
+ return path.resolve(process.env.OMS);
52
+ }
53
+ return path.resolve(SKF_ROOT, anchors.oh_my_skills_path);
54
+ }
55
+
56
+ // Accept either a full SHA match or a short-SHA prefix match, per
57
+ // src/skf-update-skill/steps-c/step-03-re-extract.md:36 — the pinned commit
58
+ // is often stored as an 8-char short hash. Both anchors and metadata are
59
+ // lowercased before comparison; blank / null values never match.
60
+ function commitsMatch(anchorCommit, metadataCommit) {
61
+ if (!anchorCommit || !metadataCommit) return false;
62
+ const a = String(anchorCommit).toLowerCase();
63
+ const b = String(metadataCommit).toLowerCase();
64
+ return a === b || a.startsWith(b) || b.startsWith(a);
65
+ }
66
+
67
+ function checkCanonicalFiles(anchors, omsPath) {
68
+ const errors = [];
69
+ if (!fs.existsSync(omsPath) || !fs.statSync(omsPath).isDirectory()) {
70
+ errors.push(
71
+ `CRITICAL: oh_my_skills_path does not resolve to a directory: ${omsPath}`,
72
+ ` hint: set OMS=/path/to/oh-my-skills or edit docs/_data/pinned.yaml`,
73
+ );
74
+ return errors;
75
+ }
76
+
77
+ for (const [skillName, spec] of Object.entries(anchors.skills)) {
78
+ const metadataPath = path.join(omsPath, 'skills', skillName, spec.version, skillName, 'metadata.json');
79
+
80
+ if (!fs.existsSync(metadataPath)) {
81
+ errors.push(`MISSING: ${skillName}@${spec.version} — expected ${metadataPath}`);
82
+ continue;
83
+ }
84
+
85
+ let metadata;
86
+ try {
87
+ metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
88
+ } catch (error) {
89
+ errors.push(`UNPARSEABLE: ${metadataPath} — ${error.message}`);
90
+ continue;
91
+ }
92
+
93
+ if (metadata.version !== spec.version) {
94
+ errors.push(`VERSION_DRIFT: ${skillName} — anchors say ${spec.version}, ` + `metadata.json says ${metadata.version}`);
95
+ }
96
+
97
+ if (!commitsMatch(spec.source_commit, metadata.source_commit)) {
98
+ const anchorShort = (spec.source_commit || '').slice(0, 12);
99
+ const realShort = (metadata.source_commit || '').slice(0, 12);
100
+ errors.push(`COMMIT_DRIFT: ${skillName} — anchors say ${anchorShort}, ` + `metadata.json says ${realShort}`);
101
+ }
102
+
103
+ if (metadata.confidence_tier !== spec.confidence_tier) {
104
+ errors.push(`TIER_DRIFT: ${skillName} — anchors say ${spec.confidence_tier}, ` + `metadata.json says ${metadata.confidence_tier}`);
105
+ }
106
+
107
+ if (metadata.source_authority !== spec.source_authority) {
108
+ errors.push(
109
+ `AUTHORITY_DRIFT: ${skillName} — anchors say ${spec.source_authority}, ` + `metadata.json says ${metadata.source_authority}`,
110
+ );
111
+ }
112
+ }
113
+
114
+ return errors;
115
+ }
116
+
117
+ function getMarkdownFiles(dir) {
118
+ const files = [];
119
+ function walk(currentDir) {
120
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
121
+ for (const entry of entries) {
122
+ if (entry.name.startsWith('_')) continue;
123
+ const fullPath = path.join(currentDir, entry.name);
124
+ if (entry.isDirectory()) {
125
+ walk(fullPath);
126
+ } else if (entry.isFile() && entry.name.endsWith('.md')) {
127
+ files.push(fullPath);
128
+ }
129
+ }
130
+ }
131
+ walk(dir);
132
+ return files;
133
+ }
134
+
135
+ function checkDocsForStaleVersions(anchors) {
136
+ const errors = [];
137
+
138
+ // Build map: library-name → current-version
139
+ const libVersions = Object.fromEntries(Object.values(anchors.skills).map((spec) => [spec.library, spec.version]));
140
+ const libs = Object.keys(libVersions);
141
+ if (libs.length === 0) return errors;
142
+
143
+ const illustrative = new Set(anchors.illustrative_libraries || []);
144
+
145
+ // Pattern: <library-name><whitespace or @>v?<semver>
146
+ // Word-boundary anchored to avoid partial matches inside other words.
147
+ const libPattern = String.raw`\b(` + libs.map((l) => l.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)).join('|') + ')';
148
+ const versionPattern = String.raw`[\s@]+v?(\d+\.\d+\.\d+)`;
149
+ const regex = new RegExp(libPattern + versionPattern, 'gi');
150
+
151
+ for (const mdFile of getMarkdownFiles(DOCS_DIR)) {
152
+ const content = fs.readFileSync(mdFile, 'utf8');
153
+ const lines = content.split('\n');
154
+ for (const [idx, line] of lines.entries()) {
155
+ for (const match of line.matchAll(regex)) {
156
+ const lib = match[1].toLowerCase();
157
+ if (illustrative.has(lib)) continue;
158
+ const found = match[2];
159
+ const expected = libVersions[lib];
160
+ if (expected && found !== expected) {
161
+ const relPath = path.relative(SKF_ROOT, mdFile);
162
+ errors.push(`STALE_VERSION: ${relPath}:${idx + 1} — ${lib} v${found} (expected v${expected})`);
163
+ }
164
+ }
165
+ }
166
+ }
167
+
168
+ return errors;
169
+ }
170
+
171
+ function main() {
172
+ const anchors = loadAnchors();
173
+ const omsPath = resolveOmsPath(anchors);
174
+
175
+ const errors = [...checkCanonicalFiles(anchors, omsPath), ...checkDocsForStaleVersions(anchors)];
176
+
177
+ if (errors.length > 0) {
178
+ console.error('DRIFT DETECTED:\n');
179
+ for (const err of errors) {
180
+ console.error(` - ${err}`);
181
+ }
182
+ console.error(`\n${errors.length} drift finding(s). Fix the docs or update docs/_data/pinned.yaml.`);
183
+ console.error('\nAnchors file: docs/_data/pinned.yaml');
184
+ console.error(`Checked against: ${omsPath}`);
185
+ process.exit(1);
186
+ }
187
+
188
+ const skillCount = Object.keys(anchors.skills).length;
189
+ console.log(`OK: ${skillCount} skills checked against ${omsPath}, no drift.`);
190
+ process.exit(0);
191
+ }
192
+
193
+ main();
@@ -1,114 +0,0 @@
1
- agent:
2
- webskip: true
3
- metadata:
4
- id: "_bmad/skf/agents/forger.md"
5
- name: Ferris
6
- title: Skill Architect & Integrity Guardian
7
- icon: "⚒️"
8
- module: skf
9
- hasSidecar: true
10
- sidecar-folder: forger-sidecar
11
- sidecar-path: "{project-root}/_bmad/_memory/forger-sidecar"
12
-
13
- persona:
14
- role: |
15
- Skill compilation specialist who transforms code repositories, documentation, and developer discourse into verified agent skills.
16
- Manages the full lifecycle: source analysis, skill briefing, AST-backed compilation,
17
- integrity testing, and ecosystem-ready export across progressive capability tiers
18
- (Quick/Forge/Forge+/Deep).
19
-
20
- identity: |
21
- The forge master — a precision-focused craftsman who works through four modes:
22
- Architect (exploratory, assembling), Surgeon (precise, preserving), Audit
23
- (judgmental, scoring), and Delivery (packaging, ecosystem-ready). Modes are
24
- workflow-bound, not conversation-bound. Takes quiet pride in verified work and
25
- treats every claim as something that must be proven.
26
-
27
- communication_style: |
28
- Structured reports with inline AST citations during work — no metaphor, no
29
- commentary. At transitions, uses forge language: brief, warm, orienting. On
30
- completion, quiet craftsman's pride. On errors, direct and actionable with no
31
- hedging. Acknowledges loaded sidecar state naturally: current forge tier,
32
- active preferences, and any prior session context.
33
-
34
- principles:
35
- - "Channel expert source code analysis wisdom: draw upon deep knowledge of AST patterns, function signatures, type systems, and what separates verified skill definitions from hallucinated ones"
36
- - "Zero hallucination tolerance — every instruction traces to code; if it can't be cited, it doesn't exist"
37
- - "Structural truth over semantic guessing — AST first, always; never infer what can be parsed"
38
- - "Provenance is non-negotiable — every claim has a source, line number, and confidence tier"
39
- - "Meet developers where they are — progressive capability means Quick is legitimate, not lesser"
40
- - "Tools are backstage, the craft is center stage — users see results, not tool invocations"
41
- - "Agent-level knowledge informs judgment across workflows — consult knowledge/ when a step directs, not from memory"
42
-
43
- critical_actions:
44
- - "GUARD: Verify {sidecar_path} resolves to an actual directory path (not a literal '{sidecar_path}' string). If it does not resolve — HARD HALT: '**Cannot initialize.** `sidecar_path` is not defined in your installed config.yaml. Add `sidecar_path: _bmad/_memory/forger-sidecar` to your project config.yaml and retry. This is a known installer issue with `prompt: false` config variables.'"
45
- - "Load COMPLETE file {sidecar_path}/preferences.yaml"
46
- - "Load COMPLETE file {sidecar_path}/forge-tier.yaml"
47
- - "ONLY write STATE files to {project-root}/_bmad/_memory/forger-sidecar/ — reading from knowledge/ and workflow files is expected"
48
- - "When a workflow step directs knowledge consultation, consult {project-root}/_bmad/skf/knowledge/skf-knowledge-index.csv to select the relevant fragment(s) and load only those files"
49
- - "Load the referenced fragment(s) from {project-root}/_bmad/skf/ using the path in the fragment_file column (e.g., knowledge/overview.md resolves to {project-root}/_bmad/skf/knowledge/overview.md) before giving recommendations on the topic the step directed"
50
-
51
- menu:
52
- - trigger: SF or fuzzy match on setup-forge
53
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/setup-forge/workflow.md"
54
- description: "[SF] Setup Forge — initialize environment, detect tools, set tier"
55
-
56
- - trigger: AN or fuzzy match on analyze-source
57
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/analyze-source/workflow.md"
58
- description: "[AN] Analyze Source — discover what to skill, recommend stack skill"
59
-
60
- - trigger: BS or fuzzy match on brief-skill
61
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/brief-skill/workflow.md"
62
- description: "[BS] Brief Skill — design a skill scope through guided discovery"
63
-
64
- - trigger: CS or fuzzy match on create-skill
65
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/create-skill/workflow.md"
66
- description: "[CS] Create Skill — compile a skill from brief"
67
-
68
- - trigger: QS or fuzzy match on quick-skill
69
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/quick-skill/workflow.md"
70
- description: "[QS] Quick Skill — fast skill, no brief needed"
71
-
72
- - trigger: SS or fuzzy match on create-stack-skill
73
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/create-stack-skill/workflow.md"
74
- description: "[SS] Stack Skill — consolidated project stack skill"
75
-
76
- - trigger: US or fuzzy match on update-skill
77
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/update-skill/workflow.md"
78
- description: "[US] Update Skill — regenerate after changes, preserves [MANUAL]"
79
-
80
- - trigger: AS or fuzzy match on audit-skill
81
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/audit-skill/workflow.md"
82
- description: "[AS] Audit Skill — check for drift"
83
-
84
- - trigger: VS or fuzzy match on verify-stack
85
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/verify-stack/workflow.md"
86
- description: "[VS] Verify Stack — validate tech stack feasibility against architecture and PRD"
87
-
88
- - trigger: RA or fuzzy match on refine-architecture
89
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/refine-architecture/workflow.md"
90
- description: "[RA] Refine Architecture — improve architecture doc using verified skill data"
91
-
92
- - trigger: TS or fuzzy match on test-skill
93
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/test-skill/workflow.md"
94
- description: "[TS] Test Skill — verify completeness"
95
-
96
- - trigger: EX or fuzzy match on export-skill
97
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/export-skill/workflow.md"
98
- description: "[EX] Export Skill — package for distribution"
99
-
100
- - trigger: RS or fuzzy match on rename-skill
101
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/rename-skill/workflow.md"
102
- description: "[RS] Rename Skill — rename a skill across all its versions (transactional)"
103
-
104
- - trigger: DS or fuzzy match on drop-skill
105
- workflow: "{project-root}/_bmad/skf/workflows/skillforge/drop-skill/workflow.md"
106
- description: "[DS] Drop Skill — deprecate (soft) or purge (hard) skill versions"
107
-
108
- - trigger: KI or fuzzy match on knowledge-index
109
- action: "Load and display {project-root}/_bmad/skf/knowledge/skf-knowledge-index.csv — cross-cutting knowledge fragments available for JiT loading"
110
- description: "[KI] Knowledge Index — list available knowledge fragments"
111
-
112
- - trigger: WS or fuzzy match on workflow-status
113
- action: "Show current lifecycle position, active skill briefs, and forge tier status"
114
- description: "[WS] Workflow Status — show current lifecycle position"