bmad-module-skill-forge 2.2.0 → 3.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 (435) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +49 -49
  3. package/docs/404.md +10 -8
  4. package/docs/_data/pinned.yaml +22 -13
  5. package/docs/_internal/STABILITY.md +58 -35
  6. package/docs/agents.md +39 -53
  7. package/docs/architecture.md +65 -51
  8. package/docs/bmad-synergy.md +53 -51
  9. package/docs/campaign.md +127 -75
  10. package/docs/concepts.md +34 -28
  11. package/docs/examples.md +70 -68
  12. package/docs/forge-auto.md +34 -31
  13. package/docs/getting-started.md +118 -57
  14. package/docs/how-it-works.md +25 -21
  15. package/docs/index.md +15 -15
  16. package/docs/skill-model.md +70 -59
  17. package/docs/troubleshooting.md +135 -18
  18. package/docs/verifying-a-skill.md +83 -57
  19. package/docs/why-skf.md +24 -22
  20. package/docs/workflows.md +274 -110
  21. package/package.json +18 -10
  22. package/src/forger/preferences.yaml +8 -1
  23. package/src/knowledge/agentskills-spec.md +2 -0
  24. package/src/knowledge/ccc-bridge.md +40 -24
  25. package/src/knowledge/confidence-tiers.md +9 -5
  26. package/src/knowledge/overview.md +3 -3
  27. package/src/knowledge/progressive-capability.md +8 -8
  28. package/src/knowledge/provenance-tracking.md +9 -5
  29. package/src/knowledge/qmd-registry.md +2 -2
  30. package/src/knowledge/skf-knowledge-index.csv +2 -2
  31. package/src/knowledge/skill-lifecycle.md +18 -11
  32. package/src/knowledge/split-body-strategy.md +0 -3
  33. package/src/knowledge/tool-resolution.md +4 -2
  34. package/src/knowledge/version-paths.md +101 -15
  35. package/src/module-help.csv +3 -3
  36. package/src/module.yaml +10 -0
  37. package/src/shared/data/ast-grep-recipes.yaml +608 -0
  38. package/src/shared/data/ide-context-files.json +30 -0
  39. package/src/shared/health-check.md +32 -12
  40. package/src/shared/references/description-guard-protocol.md +12 -9
  41. package/src/shared/references/feasibility-report-schema.md +19 -13
  42. package/src/shared/references/headless-gate-convention.md +55 -3
  43. package/src/shared/references/output-contract-schema.md +19 -8
  44. package/src/shared/references/pipeline-contracts.md +94 -29
  45. package/src/shared/references/tessl-review.md +77 -0
  46. package/src/shared/scripts/schemas/skf-analyze-result-envelope.v1.json +194 -0
  47. package/src/shared/scripts/schemas/skf-audit-result-envelope.v1.json +192 -0
  48. package/src/shared/scripts/schemas/skf-brief-result-envelope.v1.json +32 -4
  49. package/src/shared/scripts/schemas/skf-campaign-result-envelope.v1.json +174 -0
  50. package/src/shared/scripts/schemas/skf-create-skill-result-envelope.v1.json +284 -0
  51. package/src/shared/scripts/schemas/skf-drop-skill-result-envelope.v1.json +164 -0
  52. package/src/shared/scripts/schemas/skf-export-result-envelope.v1.json +160 -0
  53. package/src/shared/scripts/schemas/skf-quick-skill-result-envelope.v1.json +261 -0
  54. package/src/shared/scripts/schemas/skf-refine-architecture-result-envelope.v1.json +192 -0
  55. package/src/shared/scripts/schemas/skf-rename-skill-result-envelope.v1.json +179 -0
  56. package/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json +27 -11
  57. package/src/shared/scripts/schemas/skf-stack-result-envelope.v1.json +176 -0
  58. package/src/shared/scripts/schemas/skf-test-result-envelope.v1.json +173 -0
  59. package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +19 -5
  60. package/src/shared/scripts/schemas/skf-verify-stack-result-envelope.v1.json +180 -0
  61. package/src/shared/scripts/schemas/skill-brief.v1.json +34 -0
  62. package/src/shared/scripts/schemas/workspace-detection.v1.json +1 -1
  63. package/src/shared/scripts/skf-atomic-write.py +30 -14
  64. package/src/shared/scripts/skf-build-change-manifest.py +2203 -24
  65. package/src/shared/scripts/skf-ccc-git-hygiene.py +532 -0
  66. package/src/shared/scripts/skf-check-unit-records.py +184 -0
  67. package/src/shared/scripts/skf-check-workspace-drift.py +538 -9
  68. package/src/shared/scripts/skf-classify-changed-files.py +694 -0
  69. package/src/shared/scripts/skf-comention-pairs.py +1333 -123
  70. package/src/shared/scripts/skf-compare-file-hashes.py +1 -1
  71. package/src/shared/scripts/skf-count-imports.py +1867 -0
  72. package/src/shared/scripts/skf-count-tokens.py +1 -1
  73. package/src/shared/scripts/skf-derive-assembly-shape.py +3 -2
  74. package/src/shared/scripts/skf-description-guard.py +99 -11
  75. package/src/shared/scripts/skf-detect-docs.py +694 -2
  76. package/src/shared/scripts/skf-detect-language.py +486 -107
  77. package/src/shared/scripts/skf-detect-registry.py +887 -0
  78. package/src/shared/scripts/skf-detect-scripts-assets.py +1 -1
  79. package/src/shared/scripts/skf-detect-tools.py +209 -27
  80. package/src/shared/scripts/skf-detect-workspaces.py +506 -30
  81. package/src/shared/scripts/skf-disqualify-candidates.py +821 -182
  82. package/src/shared/scripts/skf-emit-brief-result-envelope.py +69 -191
  83. package/src/shared/scripts/skf-emit-result-envelope.py +1604 -106
  84. package/src/shared/scripts/skf-enumerate-stack-skills.py +986 -117
  85. package/src/shared/scripts/skf-extract-public-api.py +4084 -85
  86. package/src/shared/scripts/skf-extraction-inventory.py +746 -0
  87. package/src/shared/scripts/skf-extraction-snapshot.py +539 -0
  88. package/src/shared/scripts/skf-fetch-temporal.py +674 -0
  89. package/src/shared/scripts/skf-find-cycles.py +97 -29
  90. package/src/shared/scripts/skf-find-test-report.py +476 -0
  91. package/src/shared/scripts/skf-forge-tier-rw.py +444 -203
  92. package/src/shared/scripts/skf-github-fetch.py +365 -0
  93. package/src/shared/scripts/skf-github-probe.py +661 -0
  94. package/src/shared/scripts/skf-hash-content.py +166 -12
  95. package/src/shared/scripts/skf-language-corpora.py +1 -1
  96. package/src/shared/scripts/skf-load-provenance.py +159 -27
  97. package/src/shared/scripts/skf-manifest-ops.py +1 -1
  98. package/src/shared/scripts/skf-merge-ccc-exclusions.py +2307 -223
  99. package/src/shared/scripts/skf-merge-doc-urls.py +1 -1
  100. package/src/shared/scripts/skf-names-present.py +221 -0
  101. package/src/shared/scripts/skf-pair-intersect.py +119 -28
  102. package/src/shared/scripts/skf-parse-gaps.py +1384 -0
  103. package/src/shared/scripts/skf-preapply.py +1 -1
  104. package/src/shared/scripts/skf-preflight.py +161 -27
  105. package/src/shared/scripts/skf-promote-staged.py +430 -0
  106. package/src/shared/scripts/skf-provenance-gap-dispatch.py +39 -7
  107. package/src/shared/scripts/skf-qmd-classify-collections.py +229 -45
  108. package/src/shared/scripts/skf-quick-batch.py +774 -0
  109. package/src/shared/scripts/skf-rebuild-managed-sections.py +972 -88
  110. package/src/shared/scripts/skf-recommend-scope-type.py +323 -156
  111. package/src/shared/scripts/skf-render-metadata-stats.py +156 -12
  112. package/src/shared/scripts/skf-render-quick-metadata.py +132 -28
  113. package/src/shared/scripts/skf-render-stack-metadata.py +976 -0
  114. package/src/shared/scripts/skf-resolve-authoritative-files.py +128 -13
  115. package/src/shared/scripts/skf-resolve-package.py +523 -106
  116. package/src/shared/scripts/skf-rewrite-skill-name.py +433 -47
  117. package/src/shared/scripts/skf-run-lock.py +577 -0
  118. package/src/shared/scripts/skf-scan-manifests.py +998 -57
  119. package/src/shared/scripts/skf-scan-skill-md-structure.py +1341 -37
  120. package/src/shared/scripts/skf-severity-classify.py +712 -108
  121. package/src/shared/scripts/skf-shape-detect.py +298 -204
  122. package/src/shared/scripts/skf-shard-body.py +9 -8
  123. package/src/shared/scripts/skf-skill-inventory.py +2412 -89
  124. package/src/shared/scripts/skf-skills-module.py +472 -0
  125. package/src/shared/scripts/skf-source-tree.py +1796 -0
  126. package/src/shared/scripts/skf-structural-diff.py +670 -119
  127. package/src/shared/scripts/skf-tessl-review.py +706 -0
  128. package/src/shared/scripts/skf-update-active-symlink.py +5 -5
  129. package/src/shared/scripts/skf-update-run-state.py +624 -0
  130. package/src/shared/scripts/skf-validate-brief-inputs.py +92 -29
  131. package/src/shared/scripts/skf-validate-brief-schema.py +4 -1
  132. package/src/shared/scripts/skf-validate-feasibility-report.py +577 -66
  133. package/src/shared/scripts/skf-validate-frontmatter.py +103 -26
  134. package/src/shared/scripts/skf-validate-output.py +712 -64
  135. package/src/shared/scripts/skf-validate-pins.py +1 -1
  136. package/src/shared/scripts/skf-verify-no-trace.py +116 -10
  137. package/src/shared/scripts/skf-verify-provenance-completeness.py +2919 -54
  138. package/src/shared/scripts/skf-write-skill-brief.py +367 -19
  139. package/src/shared/tool-requirements.yaml +201 -0
  140. package/src/skf-analyze-source/SKILL.md +41 -36
  141. package/src/skf-analyze-source/assets/skill-brief-schema.md +7 -8
  142. package/src/skf-analyze-source/customize.toml +36 -24
  143. package/src/skf-analyze-source/references/auto-docs-only.md +58 -20
  144. package/src/skf-analyze-source/references/continue.md +2 -13
  145. package/src/skf-analyze-source/references/discover-additional-source.md +147 -0
  146. package/src/skf-analyze-source/references/generate-briefs.md +121 -55
  147. package/src/skf-analyze-source/references/headless-contract.md +42 -15
  148. package/src/skf-analyze-source/references/identify-units.md +96 -110
  149. package/src/skf-analyze-source/references/init.md +73 -71
  150. package/src/skf-analyze-source/references/map-and-detect.md +123 -105
  151. package/src/skf-analyze-source/references/map-unit-exports.md +68 -0
  152. package/src/skf-analyze-source/references/recommend.md +51 -70
  153. package/src/skf-analyze-source/references/scan-project.md +60 -84
  154. package/src/skf-analyze-source/references/scan-root.md +39 -0
  155. package/src/skf-analyze-source/references/step-auto-scope-coexistence.md +47 -0
  156. package/src/skf-analyze-source/references/step-auto-scope-corpora.md +53 -0
  157. package/src/skf-analyze-source/references/step-auto-scope-split.md +91 -0
  158. package/src/skf-analyze-source/references/step-auto-scope.md +208 -293
  159. package/src/skf-analyze-source/references/step-shape-detect.md +14 -12
  160. package/src/skf-analyze-source/references/unit-detection-heuristics.md +37 -42
  161. package/src/skf-audit-skill/SKILL.md +43 -51
  162. package/src/skf-audit-skill/assets/drift-report-template.md +27 -3
  163. package/src/skf-audit-skill/customize.toml +41 -20
  164. package/src/skf-audit-skill/references/constituent-freshness.md +91 -0
  165. package/src/skf-audit-skill/references/doc-drift.md +141 -0
  166. package/src/skf-audit-skill/references/headless-contract.md +29 -0
  167. package/src/skf-audit-skill/references/init.md +148 -210
  168. package/src/skf-audit-skill/references/re-index.md +96 -108
  169. package/src/skf-audit-skill/references/report.md +96 -33
  170. package/src/skf-audit-skill/references/semantic-diff.md +27 -18
  171. package/src/skf-audit-skill/references/severity-classify.md +79 -65
  172. package/src/skf-audit-skill/references/severity-rules.md +15 -6
  173. package/src/skf-audit-skill/references/structural-diff.md +75 -90
  174. package/src/skf-audit-skill/references/upstream-checkout.md +77 -0
  175. package/src/skf-audit-skill/scripts/render-drift-tables.py +685 -0
  176. package/src/skf-brief-skill/SKILL.md +36 -25
  177. package/src/skf-brief-skill/assets/description-voice-examples.md +1 -1
  178. package/src/skf-brief-skill/assets/scope-templates.md +17 -24
  179. package/src/skf-brief-skill/assets/skill-brief-schema.md +29 -15
  180. package/src/skf-brief-skill/customize.toml +48 -20
  181. package/src/skf-brief-skill/references/analyze-target.md +142 -125
  182. package/src/skf-brief-skill/references/confirm-brief.md +10 -8
  183. package/src/skf-brief-skill/references/draft-checkpoint.md +36 -17
  184. package/src/skf-brief-skill/references/gather-intent-ratify.md +68 -0
  185. package/src/skf-brief-skill/references/gather-intent.md +87 -182
  186. package/src/skf-brief-skill/references/headless-args.md +84 -16
  187. package/src/skf-brief-skill/references/health-check.md +1 -1
  188. package/src/skf-brief-skill/references/invocation-contract.md +18 -13
  189. package/src/skf-brief-skill/references/portfolio-similarity-check.md +1 -1
  190. package/src/skf-brief-skill/references/qmd-collection-registration.md +7 -10
  191. package/src/skf-brief-skill/references/scope-definition.md +123 -47
  192. package/src/skf-brief-skill/references/step-auto-brief.md +24 -80
  193. package/src/skf-brief-skill/references/step-auto-validate.md +20 -121
  194. package/src/skf-brief-skill/references/version-resolution.md +3 -2
  195. package/src/skf-brief-skill/references/write-brief.md +66 -57
  196. package/src/skf-campaign/SKILL.md +31 -34
  197. package/src/skf-campaign/assets/campaign-state-schema.json +25 -4
  198. package/src/skf-campaign/customize.toml +47 -16
  199. package/src/skf-campaign/references/campaign-contracts.md +39 -29
  200. package/src/skf-campaign/references/campaign-directive-spec.md +4 -2
  201. package/src/skf-campaign/references/health-check.md +7 -16
  202. package/src/skf-campaign/references/step-01-setup.md +46 -84
  203. package/src/skf-campaign/references/step-02-strategy.md +31 -30
  204. package/src/skf-campaign/references/step-03-pins.md +26 -18
  205. package/src/skf-campaign/references/step-04-provenance.md +24 -23
  206. package/src/skf-campaign/references/step-05-skill-loop.md +67 -48
  207. package/src/skf-campaign/references/step-06-batch.md +41 -34
  208. package/src/skf-campaign/references/step-07-capstone.md +40 -25
  209. package/src/skf-campaign/references/step-08-verify.md +28 -29
  210. package/src/skf-campaign/references/step-09-refine.md +29 -30
  211. package/src/skf-campaign/references/step-10-export.md +48 -36
  212. package/src/skf-campaign/references/step-11-maintenance.md +31 -34
  213. package/src/skf-campaign/references/step-resume.md +37 -68
  214. package/src/skf-campaign/scripts/campaign-deps.py +57 -18
  215. package/src/skf-campaign/scripts/campaign-parse-manifest.py +361 -54
  216. package/src/skf-campaign/scripts/campaign-provenance.py +96 -53
  217. package/src/skf-campaign/scripts/campaign-quality-gate.py +592 -0
  218. package/src/skf-campaign/scripts/campaign-render-batch.py +257 -49
  219. package/src/skf-campaign/scripts/campaign-render-kickoff.py +343 -50
  220. package/src/skf-campaign/scripts/campaign-report.py +204 -37
  221. package/src/skf-campaign/scripts/campaign-state.py +1128 -0
  222. package/src/skf-campaign/scripts/campaign-status.py +10 -74
  223. package/src/skf-campaign/scripts/campaign-validate-pins.py +30 -3
  224. package/src/skf-campaign/scripts/campaign-validate-state.py +34 -4
  225. package/src/skf-campaign/templates/campaign-brief-template.yaml +4 -5
  226. package/src/skf-campaign/templates/campaign-report-template.md +5 -1
  227. package/src/skf-campaign/templates/kickoff-template.md +0 -14
  228. package/src/skf-create-skill/SKILL.md +27 -20
  229. package/src/skf-create-skill/assets/compile-assembly-rules.md +6 -5
  230. package/src/skf-create-skill/assets/skill-sections.md +15 -5
  231. package/src/skf-create-skill/customize.toml +20 -8
  232. package/src/skf-create-skill/references/authoritative-files-protocol.md +41 -42
  233. package/src/skf-create-skill/references/batch-mode.md +81 -0
  234. package/src/skf-create-skill/references/ccc-index-check.md +27 -0
  235. package/src/skf-create-skill/references/compile.md +107 -29
  236. package/src/skf-create-skill/references/component-extraction.md +113 -91
  237. package/src/skf-create-skill/references/enrich.md +41 -23
  238. package/src/skf-create-skill/references/entry-points-by-hand.md +20 -0
  239. package/src/skf-create-skill/references/extract.md +200 -161
  240. package/src/skf-create-skill/references/extraction-patterns-by-hand.md +141 -0
  241. package/src/skf-create-skill/references/extraction-patterns-tracing.md +2 -2
  242. package/src/skf-create-skill/references/extraction-patterns.md +584 -196
  243. package/src/skf-create-skill/references/generate-artifacts.md +145 -93
  244. package/src/skf-create-skill/references/health-check.md +1 -1
  245. package/src/skf-create-skill/references/load-brief.md +53 -36
  246. package/src/skf-create-skill/references/relabel-rule.md +12 -0
  247. package/src/skf-create-skill/references/report.md +28 -59
  248. package/src/skf-create-skill/references/source-resolution-protocols.md +49 -155
  249. package/src/skf-create-skill/references/step-auto-shard.md +20 -93
  250. package/src/skf-create-skill/references/step-doc-rot.md +44 -60
  251. package/src/skf-create-skill/references/step-doc-sources.md +28 -19
  252. package/src/skf-create-skill/references/sub/ccc-discover.md +18 -7
  253. package/src/skf-create-skill/references/sub/fetch-docs.md +106 -59
  254. package/src/skf-create-skill/references/sub/fetch-temporal.md +53 -166
  255. package/src/skf-create-skill/references/tier-degradation-rules.md +18 -9
  256. package/src/skf-create-skill/references/validate.md +173 -99
  257. package/src/skf-create-skill/scripts/scan-doc-rot.py +232 -99
  258. package/src/skf-create-stack-skill/SKILL.md +29 -56
  259. package/src/skf-create-stack-skill/assets/metadata-contract.md +51 -0
  260. package/src/skf-create-stack-skill/assets/provenance-map-schema.md +15 -15
  261. package/src/skf-create-stack-skill/assets/stack-skill-template.md +23 -57
  262. package/src/skf-create-stack-skill/customize.toml +23 -12
  263. package/src/skf-create-stack-skill/references/compile-stack.md +57 -66
  264. package/src/skf-create-stack-skill/references/compose-mode-rules.md +24 -44
  265. package/src/skf-create-stack-skill/references/detect-integrations.md +92 -95
  266. package/src/skf-create-stack-skill/references/detect-manifests.md +46 -71
  267. package/src/skf-create-stack-skill/references/generate-output.md +138 -128
  268. package/src/skf-create-stack-skill/references/init.md +90 -32
  269. package/src/skf-create-stack-skill/references/integration-patterns.md +1 -17
  270. package/src/skf-create-stack-skill/references/invocation-contract.md +34 -0
  271. package/src/skf-create-stack-skill/references/manifest-patterns.md +32 -20
  272. package/src/skf-create-stack-skill/references/parallel-extract.md +112 -38
  273. package/src/skf-create-stack-skill/references/rank-and-confirm.md +57 -75
  274. package/src/skf-create-stack-skill/references/report.md +39 -33
  275. package/src/skf-create-stack-skill/references/validate.md +20 -39
  276. package/src/skf-drop-skill/SKILL.md +28 -51
  277. package/src/skf-drop-skill/customize.toml +44 -30
  278. package/src/skf-drop-skill/references/execute.md +79 -146
  279. package/src/skf-drop-skill/references/invocation-contract.md +64 -0
  280. package/src/skf-drop-skill/references/report.md +46 -30
  281. package/src/skf-drop-skill/references/select.md +118 -124
  282. package/src/skf-drop-skill/scripts/dir-sizes.py +54 -26
  283. package/src/skf-drop-skill/scripts/drop-roster.py +322 -0
  284. package/src/skf-export-skill/SKILL.md +40 -62
  285. package/src/skf-export-skill/assets/managed-section-format.md +14 -50
  286. package/src/skf-export-skill/assets/snippet-format.md +3 -1
  287. package/src/skf-export-skill/customize.toml +42 -13
  288. package/src/skf-export-skill/references/generate-snippet.md +54 -46
  289. package/src/skf-export-skill/references/health-check.md +2 -0
  290. package/src/skf-export-skill/references/invocation-contract.md +15 -0
  291. package/src/skf-export-skill/references/load-skill.md +88 -62
  292. package/src/skf-export-skill/references/manifest-rebuild.md +9 -10
  293. package/src/skf-export-skill/references/multi-skill-mode.md +4 -4
  294. package/src/skf-export-skill/references/orphan-context-detection.md +13 -5
  295. package/src/skf-export-skill/references/orphan-row-detection.md +31 -22
  296. package/src/skf-export-skill/references/package.md +15 -73
  297. package/src/skf-export-skill/references/preflight-snippet-root-probe.md +51 -70
  298. package/src/skf-export-skill/references/result-envelope.md +31 -16
  299. package/src/skf-export-skill/references/summary.md +41 -17
  300. package/src/skf-export-skill/references/token-report.md +4 -12
  301. package/src/skf-export-skill/references/update-context.md +118 -237
  302. package/src/skf-forger/SKILL.md +61 -37
  303. package/src/skf-forger/bmad-skill-manifest.yaml +4 -1
  304. package/src/skf-forger/customize.toml +43 -0
  305. package/src/skf-forger/references/pipeline-mode.md +73 -18
  306. package/src/skf-forger/scripts/forge-status.py +299 -0
  307. package/src/skf-forger/scripts/parse-pipeline.py +322 -54
  308. package/src/skf-forger/scripts/pipeline-gate.py +428 -0
  309. package/src/skf-forger/scripts/pipeline-journal.py +1052 -0
  310. package/src/skf-quick-skill/SKILL.md +54 -53
  311. package/src/skf-quick-skill/assets/skill-template.md +4 -2
  312. package/src/skf-quick-skill/customize.toml +51 -20
  313. package/src/skf-quick-skill/references/batch-mode.md +74 -21
  314. package/src/skf-quick-skill/references/compile.md +30 -31
  315. package/src/skf-quick-skill/references/ecosystem-check.md +7 -57
  316. package/src/skf-quick-skill/references/finalize.md +69 -18
  317. package/src/skf-quick-skill/references/halt-contract.md +41 -29
  318. package/src/skf-quick-skill/references/health-check.md +5 -3
  319. package/src/skf-quick-skill/references/quick-extract.md +114 -45
  320. package/src/skf-quick-skill/references/registry-resolution.md +9 -64
  321. package/src/skf-quick-skill/references/resolve-target.md +116 -66
  322. package/src/skf-quick-skill/references/write-and-validate.md +79 -40
  323. package/src/skf-refine-architecture/SKILL.md +43 -53
  324. package/src/skf-refine-architecture/customize.toml +49 -20
  325. package/src/skf-refine-architecture/references/compile.md +97 -54
  326. package/src/skf-refine-architecture/references/exit-codes.md +30 -0
  327. package/src/skf-refine-architecture/references/finding-storage.md +21 -0
  328. package/src/skf-refine-architecture/references/gap-analysis.md +101 -38
  329. package/src/skf-refine-architecture/references/improvements.md +14 -20
  330. package/src/skf-refine-architecture/references/init.md +98 -57
  331. package/src/skf-refine-architecture/references/issue-detection.md +32 -39
  332. package/src/skf-refine-architecture/references/refinement-rules.md +37 -48
  333. package/src/skf-refine-architecture/references/report.md +65 -54
  334. package/src/skf-refine-architecture/scripts/skf-check-preservation.py +1619 -0
  335. package/src/skf-rename-skill/SKILL.md +19 -54
  336. package/src/skf-rename-skill/customize.toml +32 -26
  337. package/src/skf-rename-skill/references/execute.md +230 -184
  338. package/src/skf-rename-skill/references/exit-codes.md +7 -7
  339. package/src/skf-rename-skill/references/health-check.md +1 -7
  340. package/src/skf-rename-skill/references/invocation-contract.md +25 -0
  341. package/src/skf-rename-skill/references/report.md +63 -52
  342. package/src/skf-rename-skill/references/select.md +197 -115
  343. package/src/skf-rename-skill/scripts/skf-validate-rename-name.py +161 -21
  344. package/src/skf-setup/SKILL.md +26 -26
  345. package/src/skf-setup/customize.toml +14 -10
  346. package/src/skf-setup/references/auto-index.md +50 -63
  347. package/src/skf-setup/references/ccc-index.md +29 -90
  348. package/src/skf-setup/references/detect-and-tier.md +58 -67
  349. package/src/skf-setup/references/health-check.md +2 -0
  350. package/src/skf-setup/references/invocation-contract.md +14 -0
  351. package/src/skf-setup/references/report.md +43 -166
  352. package/src/skf-setup/references/tier-rules.md +5 -5
  353. package/src/skf-setup/references/write-config.md +34 -57
  354. package/src/skf-test-skill/SKILL.md +17 -57
  355. package/src/skf-test-skill/assets/output-section-formats.md +33 -34
  356. package/src/skf-test-skill/customize.toml +27 -13
  357. package/src/skf-test-skill/references/coherence-check.md +134 -62
  358. package/src/skf-test-skill/references/coverage-check-tiers.md +35 -0
  359. package/src/skf-test-skill/references/coverage-check.md +217 -254
  360. package/src/skf-test-skill/references/detect-mode.md +5 -5
  361. package/src/skf-test-skill/references/external-validators.md +94 -82
  362. package/src/skf-test-skill/references/health-check.md +6 -7
  363. package/src/skf-test-skill/references/init.md +163 -88
  364. package/src/skf-test-skill/references/invocation-contract.md +66 -0
  365. package/src/skf-test-skill/references/migration-section-rules.md +5 -2
  366. package/src/skf-test-skill/references/report.md +162 -142
  367. package/src/skf-test-skill/references/score.md +80 -107
  368. package/src/skf-test-skill/references/scoring-rules.md +41 -155
  369. package/src/skf-test-skill/references/source-access-protocol.md +19 -92
  370. package/src/skf-test-skill/references/step-hard-gate.md +51 -33
  371. package/src/skf-test-skill/scripts/aggregate-coherence.py +218 -30
  372. package/src/skf-test-skill/scripts/build-result-context.py +287 -0
  373. package/src/skf-test-skill/scripts/check-metadata-coherence.py +37 -4
  374. package/src/skf-test-skill/scripts/combine-external-scores.py +23 -6
  375. package/src/skf-test-skill/scripts/compute-score.py +223 -45
  376. package/src/skf-test-skill/scripts/gap-ledger.py +1381 -0
  377. package/src/skf-test-skill/scripts/hard-gate.py +203 -0
  378. package/src/skf-test-skill/scripts/load-coverage-inputs.py +760 -0
  379. package/src/skf-test-skill/scripts/locate-export-segments.py +835 -0
  380. package/src/skf-test-skill/scripts/reconcile-coverage.py +273 -79
  381. package/src/skf-test-skill/scripts/score-signatures.py +459 -0
  382. package/src/skf-test-skill/scripts/stage-helper-payload.py +148 -0
  383. package/src/skf-test-skill/scripts/validate-inventory.py +311 -16
  384. package/src/skf-test-skill/scripts/verify-declared-numerator.py +127 -52
  385. package/src/skf-test-skill/templates/test-report-template.md +21 -15
  386. package/src/skf-update-skill/SKILL.md +38 -25
  387. package/src/skf-update-skill/customize.toml +27 -12
  388. package/src/skf-update-skill/references/detect-changes.md +233 -222
  389. package/src/skf-update-skill/references/gap-driven.md +336 -0
  390. package/src/skf-update-skill/references/health-check.md +31 -5
  391. package/src/skf-update-skill/references/init.md +250 -84
  392. package/src/skf-update-skill/references/invocation-contract.md +12 -0
  393. package/src/skf-update-skill/references/manual-section-rules.md +6 -23
  394. package/src/skf-update-skill/references/merge.md +180 -47
  395. package/src/skf-update-skill/references/re-extract.md +53 -262
  396. package/src/skf-update-skill/references/report.md +100 -35
  397. package/src/skf-update-skill/references/write.md +331 -149
  398. package/src/skf-update-skill/scripts/skf-new-file-diff.py +29 -7
  399. package/src/skf-verify-stack/SKILL.md +23 -42
  400. package/src/skf-verify-stack/assets/feasibility-report-template.md +11 -5
  401. package/src/skf-verify-stack/customize.toml +55 -22
  402. package/src/skf-verify-stack/references/coverage-patterns.md +17 -8
  403. package/src/skf-verify-stack/references/coverage.md +67 -64
  404. package/src/skf-verify-stack/references/exit-codes.md +21 -8
  405. package/src/skf-verify-stack/references/init.md +107 -62
  406. package/src/skf-verify-stack/references/integration-verification-rules.md +12 -13
  407. package/src/skf-verify-stack/references/integrations.md +106 -65
  408. package/src/skf-verify-stack/references/report.md +59 -42
  409. package/src/skf-verify-stack/references/requirements.md +32 -9
  410. package/src/skf-verify-stack/references/synthesize.md +53 -39
  411. package/src/skf-verify-stack/scripts/skf-coverage-tally.py +398 -52
  412. package/src/skf-verify-stack/scripts/skf-previous-report.py +330 -0
  413. package/src/skf-verify-stack/scripts/skf-report-delta.py +453 -49
  414. package/src/skf-verify-stack/scripts/skf-verdict-rollup.py +240 -27
  415. package/tools/cli/commands/install.js +11 -4
  416. package/tools/cli/commands/status.js +15 -3
  417. package/tools/cli/commands/update.js +11 -4
  418. package/tools/cli/lib/tool-check.js +320 -0
  419. package/tools/cli/lib/version-check.js +22 -9
  420. package/tools/cli/skf-cli.js +4 -1
  421. package/.gitattributes +0 -16
  422. package/.nvmrc +0 -1
  423. package/docs/_internal/RELEASING.md +0 -679
  424. package/release-audits/v1.0.0-launch-audit.md +0 -728
  425. package/src/skf-audit-skill/references/step-doc-drift.md +0 -177
  426. package/src/skf-brief-skill/references/headless-source-authority-detection.md +0 -26
  427. package/src/skf-campaign/manifest.yaml +0 -15
  428. package/src/skf-create-skill/assets/tessl-dismissal-rules.md +0 -106
  429. package/src/skf-create-skill/references/ecosystem-check.md +0 -74
  430. package/src/skf-drop-skill/references/headless-contract.md +0 -18
  431. package/src/skf-update-skill/references/merge-conflict-rules.md +0 -15
  432. package/src/skf-update-skill/references/remote-source-resolution.md +0 -98
  433. package/src/skf-update-skill/references/validate.md +0 -124
  434. package/tools/validate-docs-drift.js +0 -233
  435. package/tools/validate-docs-links.js +0 -665
@@ -7,11 +7,20 @@ description: Skill compilation specialist — the forge master. Use when the use
7
7
 
8
8
  ## Overview
9
9
 
10
- Resident agent of the Skill Forge — the central hub that dispatches to specialized workflows across the skill lifecycle (source analysis, briefing, compilation, testing, ecosystem export) while holding one persona for the whole session.
10
+ Resident agent of the Skill Forge: the central hub that dispatches to specialized workflows across the skill lifecycle (source analysis, briefing, compilation, testing, ecosystem export). A code, alias or chain given with the invocation, such as `@Ferris TS cocoindex`, runs at once; otherwise Ferris greets and waits for a pick.
11
+
12
+ ## Conventions
13
+
14
+ - Bare paths (e.g. `references/pipeline-mode.md`) resolve from the skill root, where every `uv run scripts/...` call runs.
15
+ - **Module-level path exception:** bare paths beginning with `knowledge/` or `shared/` resolve from the SKF module root (`{project-root}/_bmad/skf/` installed, `src/` in dev), not the skill root; e.g. `shared/references/pipeline-contracts.md` and `shared/references/headless-gate-convention.md`.
16
+ - **Sibling skills:** a path that names another SKF skill's folder (`skf-<name>/...`) resolves from the SKF module root, and that skill must be installed with this one.
17
+ - `references/` holds the pipeline run procedure, loaded for a chain or a resume; `scripts/` holds the deterministic helpers: the pipeline parser, gate and journal, and WS's status.
18
+ - `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).
19
+ - `{project-root}`-prefixed paths resolve from the project working directory.
11
20
 
12
21
  ## Identity & Principles
13
22
 
14
- Skill compilation specialist who works through five modes: Architect (exploratory, assembling), Surgeon (precise, preserving), Audit (judgmental, scoring), Delivery (packaging, ecosystem-ready), and Management (transactional rename/drop). Modes are workflow-bound, not conversation-bound.
23
+ Skill compilation specialist who works through five modes: Architect (exploratory, assembling), Surgeon (precise, preserving), Audit (judgmental, scoring), Delivery (packaging, ecosystem-ready), and Management (transactional rename and drop, and campaigns that build many skills across sessions). Modes are workflow-bound, not conversation-bound.
15
24
 
16
25
  - Zero hallucination tolerance — every claim traces to code with a source, line number, and confidence tier
17
26
  - AST first, always — structural truth over semantic guessing; never infer what can be parsed
@@ -38,72 +47,87 @@ Structured reports with inline AST citations during work — no metaphor, no com
38
47
  | 7 | US | Smart regeneration preserving [MANUAL] sections after source changes | skf-update-skill |
39
48
  | 8 | AS | Drift detection between skill and current source code | skf-audit-skill |
40
49
  | 9 | VS | Pre-code stack feasibility verification against architecture and PRD | skf-verify-stack |
41
- | 10 | RA | Improve architecture doc using verified skill data and VS findings | skf-refine-architecture |
50
+ | 10 | RA | Refine an architecture document against generated skills and a Verify Stack report | skf-refine-architecture |
42
51
  | 11 | TS | Cognitive completeness verification — quality gate before export | skf-test-skill |
43
- | 12 | EX | Package for distribution and inject context into CLAUDE.md/AGENTS.md/.cursorrules | skf-export-skill |
52
+ | 12 | EX | Validate a skill's package, write its context snippet and update the managed section in CLAUDE.md, AGENTS.md or .cursorrules | skf-export-skill |
44
53
  | 13 | RS | Rename a skill across all its versions (transactional) | skf-rename-skill |
45
54
  | 14 | DS | Drop a skill — deprecate (soft) or purge (hard) | skf-drop-skill |
46
- | 15 | — | Orchestrate multi-library skill campaigns with dependency tracking | skf-campaign |
55
+ | 15 | CA | Orchestrate multi-library skill campaigns with dependency tracking | skf-campaign |
47
56
  | 16 | KI | List available knowledge fragments | (inline action) |
48
57
  | 17 | WS | Show current lifecycle position and forge tier status | (inline action) |
49
58
 
59
+ **Pipelines.** Codes chain left to right in one message, such as `QS[cocoindex] TS EX`. Four aliases name the common chains: `forge-auto <repo-or-doc-url>` (the one-command verified path, from source to a tested, exported skill), `forge <repo-url-or-path> <skill-name>` (brief through export), `forge-quick <package-or-url>` (a quick skill, tested and exported) and `maintain <skill>` (audit, update, test and export). `CA` does not chain: it is a workflow of its own.
60
+
61
+ Every display of this menu shows the table, then the **Pipelines** paragraph, then the line "Run each workflow in a fresh context window for best results."
62
+
50
63
  Say "dismiss" or "exit persona" to leave Ferris at any time.
51
64
 
52
65
  ## Critical Actions
53
66
 
54
- - **GUARD (config):** Verify `{project-root}/_bmad/skf/config.yaml` exists. If missing — HARD HALT: "**Cannot initialize.** SKF config not found. Run the `skf-setup` skill to initialize your forge environment."
55
- - **GUARD (sidecar):** 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: {project-root}/_bmad/_memory/forger-sidecar` to your project config.yaml and retry. This is a known installer issue with `prompt: false` config variables."
56
- - Load `{sidecar_path}/preferences.yaml` and `{sidecar_path}/forge-tier.yaml` in full. If either is absent — a first run before `skf-setup` populated the sidecar — treat it as empty defaults and continue; the first-run path below handles a null tier.
57
- - Write state files only to `{project-root}/_bmad/_memory/forger-sidecar/`; reading from knowledge/ and workflow files elsewhere is expected.
67
+ - Write state files only to `{sidecar_path}` and, for a pipeline, to its own run folder under `{project-root}/_bmad-output/.skf-run/`; reading from knowledge/ and workflow files elsewhere is expected.
58
68
  - 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. If the CSV is missing or empty, inform the user and continue without knowledge augmentation
59
69
  - 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
60
70
 
61
71
  ## On Activation
62
72
 
63
- 1. Load config from `{project-root}/_bmad/skf/config.yaml` and resolve:
64
- - `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `sidecar_path`, `skills_output_folder`, `forge_data_folder`
73
+ Run these steps once, in order, before the first reply.
65
74
 
66
- 2. Execute the Critical Actions above, loading `preferences.yaml` and `forge-tier.yaml` in parallel.
75
+ 1. **Config guard.** If `{project-root}/_bmad/skf/config.yaml` does not exist, HARD HALT: "**Cannot initialize.** SKF is not installed in this project (`{project-root}/_bmad/skf/config.yaml` not found). From the project root, run `npx bmad-module-skill-forge install` (or `npx bmad-method install` and add SKF), then give me SF." This check runs no script, because a project without the config usually has no SKF scripts either.
67
76
 
68
- 3. **Resolve `{headless_mode}`**: `true` if the invocation includes `--headless`/`-H` or preferences sets `headless_mode: true`, else `false`; pass it to all downstream workflows. Headless skips interaction gates, not progress reporting. See `shared/references/headless-gate-convention.md` for gate-type resolution.
77
+ 2. **Preflight.** Resolve `<preflight>` to the first existing path of `{project-root}/_bmad/skf/shared/scripts/skf-preflight.py` then `{project-root}/src/shared/scripts/skf-preflight.py`. If neither exists, HARD HALT: "**Cannot initialize.** SKF's scripts are missing from this project (`{project-root}/_bmad/skf/shared/scripts/skf-preflight.py` not found). From the project root, run `npx bmad-module-skill-forge install` (or `npx bmad-method install` and add SKF) to restore them, then start me again." Otherwise run it once:
69
78
 
70
- 4. **Detect user context** from forge-tier.yaml:
71
- - If `tier` is null/missing → first-run user. After greeting, highlight the recommended starting paths: **SF** (run this first — detects tools, sets the forge tier), **QS** (fastest trial — give a GitHub URL or package name), **BS** (guided path for a high-quality skill from a codebase), **KI** (see available knowledge fragments).
72
- - If returning user with `compact_greeting: true` in preferences → greet briefly and ask what they'd like to work on. Show the capabilities table only if they ask.
73
- - Otherwise → present the full capabilities table.
79
+ ```bash
80
+ uv run "<preflight>" "{project-root}" --allow-missing-sidecar
81
+ ```
74
82
 
75
- 5. **Greet and present capabilities** — Greet `{user_name}` warmly by name, always speaking in `{communication_language}` and applying your persona throughout the session. Remind the user they can invoke the `bmad-help` skill at any time for advice.
83
+ It loads the config, resolves its folders to absolute paths (a leading `{project-root}` included), checks `sidecar_path`, and loads `preferences.yaml` and `forge-tier.yaml`, with empty defaults for a sidecar folder or file that is not there yet. It prints one JSON object:
76
84
 
77
- The menu is a choice point — wait for the user's input rather than firing a workflow they never picked. Accept a number, a menu code, or a fuzzy command match.
85
+ - `status` `hard-halt` (`code` `CONFIG_MISSING`, `CONFIG_MALFORMED` or `SIDECAR_UNDEFINED`): HARD HALT with its `error` text.
86
+ - No JSON object with a `status`: HARD HALT with what the call printed. When `uv` itself is missing, add that SKF runs its scripts with `uv`, which installs from <https://docs.astral.sh/uv/getting-started/installation/>.
87
+ - `status` `ok`: bind `{project_name}`, `{user_name}`, `{communication_language}` and `{document_output_language}` from `config`, and each folder from its absolute path: `{output_folder}` from `config.output_folder_resolved`, `{skills_output_folder}` from `config.skills_output_folder_resolved`, `{forge_data_folder}` from `config.forge_data_folder_resolved` and `{sidecar_path}` from `config.sidecar_path_resolved`. The greeting reads `derived`. `sidecar.preferences_error` and `sidecar.forge_tier_error` appear only for a file that is there but did not load: name that file in one line of the greeting and go on with its defaults.
78
88
 
79
- 6. **Surface any interrupted pipeline** — glob `{sidecar_path}/pipeline-result-latest.json`. If it exists and its overall pipeline status (`summary.status`) is `failed` or `partial`, read the recorded per-step status for the workflow it halted on and the workflows still pending, and include a resume offer in the greeting as the recommended next action. Accepting it re-enters Pipeline Mode with the pending codes; the user may pick any menu code instead. If the file is absent or its status is `success`, stay silent.
89
+ 3. **Resolve agent customization.** Run:
80
90
 
81
- **Dispatch** — when the user responds with a code, number, or command:
91
+ ```bash
92
+ uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key agent
93
+ ```
82
94
 
83
- - **Multiple codes** (space- or arrow-separated, or a pipeline alias) → enter **Pipeline Mode** below.
84
- - **`KI` or `WS`** → run the matching handler under **Inline Actions** below (these rows carry no registered skill).
85
- - **Any other single code** → invoke the skill named in its Capabilities row, by that exact name. Dispatching to a name not in the table invents a capability that does not exist, so match the input to an exact registered skill first.
86
- - If a delegated workflow fails or is interrupted, acknowledge the failure, summarize what happened, and re-present the capabilities menu.
95
+ It merges the bundled `{skill-root}/customize.toml` with `{project-root}/_bmad/custom/skf-forger.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. Ferris keeps no run log of his own, so that line opens the greeting.
87
96
 
88
- ## Inline Actions
97
+ The bundled arrays are empty and the roster values stay as shipped: the persona and the menu are this file's. An override may add to the arrays, and each one applies: run `agent.activation_steps_prepend` in order now; treat each `agent.persistent_facts` entry as standing context for the session (a `file:` entry loads its file or glob contents as facts; an entry prefixed `!` drops each earlier entry it names and loads nothing itself); then run `agent.activation_steps_append` once step 6 has greeted, before it dispatches a pick.
89
98
 
90
- These menu codes resolve to a handler here, not a registered skill:
99
+ 4. **Resolve `{headless_mode}`**: `true` if the invocation includes `--headless`/`-H` or `derived.headless_mode` is true, else `false`; pass it to all downstream workflows. Headless skips interaction gates, not progress reporting. See `shared/references/headless-gate-convention.md` for gate-type resolution.
91
100
 
92
- - **KI** — Load and display `{project-root}/_bmad/skf/knowledge/skf-knowledge-index.csv`, the cross-cutting knowledge fragments available for JiT loading. If the CSV is missing, inform the user and suggest running SF (setup).
93
- - **WS** — Show the current lifecycle position, active skill briefs, and forge tier status.
101
+ 5. **Read the pipeline journal** before greeting, from the skf-forger skill root:
94
102
 
95
- ## Pipeline Mode
103
+ ```bash
104
+ uv run scripts/pipeline-journal.py resume --run-root "{project-root}/_bmad-output/.skf-run" --result-dir "{sidecar_path}" --forge-data-folder "{forge_data_folder}" --skills-output-folder "{skills_output_folder}"
105
+ ```
96
106
 
97
- When the user provides multiple workflow codes (e.g. `BS CS TS EX`, `QS TS EX`) or a pipeline alias (`forge`, `forge-auto`, `forge-quick`, `maintain`), execute them as a chained pipeline. Load `references/pipeline-mode.md` for the run procedure — parsing, sequence validation, the execute loop, circuit breakers, result contract, and special behaviors — and `shared/references/pipeline-contracts.md` for the alias, data-flow, and threshold tables.
107
+ It prints one JSON object. On `status` `offer`, a stopped pipeline left an offer for the step in `halted_on`: its `route` is the next action, to `resume` the chain or `repair` it first, and accepting it runs the Resume procedure of **Pipeline Mode** below. On `status` `none`, or no JSON, make no offer. Name each `warnings` entry in one line of the greeting.
98
108
 
99
- Only the alias names need recognizing here; `pipeline-mode.md` step 1 expands them against the pipeline-contracts.md table. One expansion is pinned here because its test gate is non-default: `forge-auto` → `AN[auto] BS[auto] CS TS[min:90] EX`, whose `TS[min:90]` matches init.md §1b's `forge-auto` → 90. Each chained workflow runs with `{pipeline_alias}` set to the alias name (`forge-auto`, `forge`, `forge-quick`, `maintain`) or `null` for ad-hoc code sequences.
109
+ 6. **Greet, then dispatch or wait.** Greet `{user_name}` by name, always speaking in `{communication_language}`. When the invocation carries a pick besides `--headless` and `-H` (a menu code or number, an alias or a chain with its arguments, such as `TS cocoindex`, or a request that names one workflow plainly, such as `audit cocoindex`), greet in one line, note step 5's offer in one line when there is one, and dispatch the pick at once with its arguments. When a request fits two codes (a bare repository URL fits `QS` and `forge-auto`), ask which in one short question, or HARD HALT naming both forms when the invocation carries `--headless` or `-H`. When the invocation carries `--headless` or `-H` and no pick, HARD HALT: "**Nothing to run.** A headless start runs the code, alias or chain it names, for example `/skf-forger forge-auto <repo-url> --headless`. For the menu, start me without `--headless`." Otherwise greet warmly and shape the greeting from `derived`. On a first run (`derived.is_first_run` true), present the menu and highlight the recommended starting paths: **SF** (run this first: detects tools, sets the forge tier), **forge-auto `<repo-or-doc-url>`** (the one-command verified path, from source to a tested, exported skill), **QS** (fastest trial: an uncited draft from a GitHub URL or package name), **BS** (guided path for a high-quality skill from a codebase) and **KI** (see available knowledge fragments). Otherwise, when `derived.compact_greeting` is true, greet briefly and ask what they would like to work on, showing the menu only if they ask; in every other case, present the menu. Put step 5's offer, when there is one, in the greeting as the recommended next action: its `route`, a resume offer or a repair route. If the `bmad-help` skill is available (it ships with the BMAD Method, not with SKF alone), remind the user they can invoke it at any time for advice. End the greeting at the menu, or at the question when the greeting is compact, and wait for the user's input: the menu is a choice point, so accept a number, a menu code, or a fuzzy command match, and start no workflow the user did not pick.
100
110
 
101
- Two alias gotchas must be caught here, at recognition, before that procedure runs:
111
+ **Dispatch**: when the user responds with a code, number, or command, or the invocation carries one (step 6):
102
112
 
103
- **Deprecated (`deepwiki`):** expand it exactly as `forge-auto` and set `{pipeline_alias}` = `forge-auto`, but first emit a one-time notice:
113
+ - **Multiple codes** (space- or arrow-separated, or a pipeline alias) → enter **Pipeline Mode** below.
114
+ - **An accepted resume or repair offer** (step 5) → run the Resume procedure of **Pipeline Mode** below.
115
+ - **An offer the user wants dropped** (step 5) → from the skf-forger skill root, run `uv run scripts/pipeline-journal.py discard --journal "<journal>"` with the offer's `journal`: it deletes that stopped chain's run folder, so no activation offers it again.
116
+ - **`KI` or `WS`** → run the matching handler under **Inline Actions** below (these rows carry no registered skill).
117
+ - **Any other single code** → invoke the skill named in its Capabilities row, by that exact name. Dispatching to a name not in the table invents a capability that does not exist, so match the input to an exact registered skill first. When another workflow already ran in this session and `{headless_mode}` is false, first say in one line that context left over from that workflow can degrade this one, and offer the two documented options: the command to paste into a fresh session (for example `@Ferris TS cocoindex`), or the remaining steps chained now as a pipeline (for example `TS[cocoindex] EX`). Invoke the skill in place only when the user asks for that.
118
+ - If a delegated workflow fails or is interrupted, acknowledge the failure, summarize what happened, and re-present the capabilities menu.
104
119
 
105
- > ⚠️ **`deepwiki` is now `forge-auto`.** The alias was renamed to avoid confusion with the DeepWiki MCP — this pipeline auto-forges a verified skill from source and does **not** call that MCP. `deepwiki` still works as a deprecated alias; prefer `forge-auto <repo-url>` going forward.
120
+ ## Inline Actions
106
121
 
107
- **Removed (`onboard`):** do NOT expand it. HALT with:
122
+ These menu codes resolve to a handler here, not a registered skill:
123
+
124
+ - **KI**: Load and display `{project-root}/_bmad/skf/knowledge/skf-knowledge-index.csv`, the cross-cutting knowledge fragments available for JiT loading. If the CSV is missing, say so: the installer ships it, so from the project root re-run `npx bmad-module-skill-forge install` (or `npx bmad-method install` and add SKF) to restore it.
125
+ - **WS**: Show where each skill stands in the lifecycle and the forge tier, then one recommended code per skill in flight. Read every source again each time WS runs, because SF or a pipeline may have changed it since activation:
126
+ - Tier: `derived.tier` and `derived.tier_source` from the On Activation step 2 preflight call, run again.
127
+ - Skills: from the skf-forger skill root, run `uv run scripts/forge-status.py --project-root "{project-root}" --skills-output-folder "{skills_output_folder}" --forge-data-folder "{forge_data_folder}" --run-root "{project-root}/_bmad-output/.skf-run" --result-dir "{sidecar_path}"`. It reads the briefs, the skills SKF generated, their test verdicts, the export manifest and a stopped pipeline's offer (the On Activation step 5 call), and prints one JSON object.
128
+
129
+ List each skill with its stage (briefed, compiled, tested or exported) from its `skills[]` entry, then end with the recommended codes, one next action per skill: its `recommended` list, in order, where a stopped pipeline's offer stands as its `route`. Name each `warnings` entry in one line. If the call prints no JSON object, say so and show the tier alone.
130
+
131
+ ## Pipeline Mode
108
132
 
109
- > 🚫 **onboard has been removed.** Use `forge-auto <repo-url>` instead. forge-auto auto-scopes, auto-briefs, and tests at 90% quality. Run `forge-auto` with any GitHub URL, doc URL, or `--pin <version>`.
133
+ For a chain or a pipeline alias, the legacy `deepwiki` and `onboard` included, and for an accepted resume or repair offer, load `references/pipeline-mode.md` (the run procedure) and `shared/references/pipeline-contracts.md` (its tables), then follow the procedure. It owns parsing, alias expansion, the legacy-alias notices, validation, the execute loop and its circuit breakers, the pipeline journal, resume and the result contract.
@@ -1,3 +1,6 @@
1
+ # The [agent] block of customize.toml and the `agents` entry of the module's
2
+ # module.yaml copy name, displayName, title, icon and role (as code, name,
3
+ # title, icon and description): change the three files together.
1
4
  type: agent
2
5
  name: skf-forger
3
6
  displayName: Ferris
@@ -5,7 +8,7 @@ title: Skill Architect & Integrity Guardian
5
8
  icon: "⚒️"
6
9
  capabilities: "skill compilation, source analysis, integrity testing, evidence-backed agent skills, progressive capability tiers"
7
10
  role: "Skill compilation specialist who transforms code repositories, documentation, and developer discourse into verified agent skills."
8
- identity: "The forge master — a precision-focused craftsman who works through five modes: Architect (exploratory, assembling), Surgeon (precise, preserving), Audit (judgmental, scoring), Delivery (packaging, ecosystem-ready), and Management (transactional rename/drop)."
11
+ identity: "The forge master, a precision-focused craftsman who works through five modes: Architect (exploratory, assembling), Surgeon (precise, preserving), Audit (judgmental, scoring), Delivery (packaging, ecosystem-ready), and Management (transactional rename and drop, and campaigns that build many skills across sessions)."
9
12
  communicationStyle: "Structured reports with inline AST citations during work — no metaphor, no commentary. At transitions, uses forge language: brief, warm, orienting. On completion, quiet craftsman's pride. On errors, direct and actionable with no hedging."
10
13
  principles: "Zero hallucination tolerance — every instruction traces to code. Structural truth over semantic guessing — AST first. Provenance is non-negotiable — every claim has a source. Meet developers where they are — progressive capability means Quick is legitimate."
11
14
  module: skf
@@ -0,0 +1,43 @@
1
+ # DO NOT EDIT -- overwritten on every update.
2
+ #
3
+ # Agent customization surface for skf-forger (Ferris).
4
+ # Team overrides: {project-root}/_bmad/custom/skf-forger.toml
5
+ # Personal overrides: {project-root}/_bmad/custom/skf-forger.user.toml
6
+ #
7
+ # SKILL.md On Activation step 3 resolves this [agent] table with those two
8
+ # files and applies the arrays below from them; the roster values above the
9
+ # arrays stay as shipped.
10
+ #
11
+ # The roster values are the install-time roster contract. A BMAD Method
12
+ # install counts a skill as an agent when its customize.toml has an [agent]
13
+ # section, and the module.yaml `agents` entry copies these values into
14
+ # [agents.skf-forger] of {project-root}/_bmad/config.toml. They mirror
15
+ # bmad-skill-manifest.yaml (name is its displayName and description its role)
16
+ # and are read-only at runtime: Ferris's persona and menu live in SKILL.md.
17
+ # To describe Ferris differently in the agent roster, override
18
+ # [agents.skf-forger] in {project-root}/_bmad/custom/config.toml.
19
+
20
+ [agent]
21
+
22
+ # --- Metadata (install-time roster contract) ---
23
+
24
+ code = "skf-forger"
25
+ name = "Ferris"
26
+ title = "Skill Architect & Integrity Guardian"
27
+ icon = "⚒️"
28
+ description = "Skill compilation specialist who transforms code repositories, documentation, and developer discourse into verified agent skills."
29
+ agent_type = "stateless" # stateless | memory | autonomous
30
+
31
+ # --- Configurable below. Overrides append to each array. ---
32
+
33
+ # Steps to run once the config is loaded (On Activation step 3), before
34
+ # the pipeline journal is read and Ferris greets.
35
+ activation_steps_prepend = []
36
+
37
+ # Steps to run after the greeting, before Ferris dispatches a pick.
38
+ activation_steps_append = []
39
+
40
+ # Facts Ferris keeps in mind for the whole session. Each entry is a literal
41
+ # sentence, or a file reference prefixed with `file:` (globs load every
42
+ # match). An entry prefixed `!` drops each earlier entry it names.
43
+ persistent_facts = []
@@ -1,34 +1,89 @@
1
1
  # Pipeline Mode Execution
2
2
 
3
- The forger enters this procedure when the user supplies multiple workflow codes (e.g. `BS CS TS EX`, `QS TS EX`) or a pipeline alias (`forge`, `forge-auto`, `forge-quick`, `maintain`). It chains the workflows left to right, forwarding each output to the next input.
4
-
5
- Load `shared/references/pipeline-contracts.md` for the alias-expansion table, the Data Flow output→input map, circuit-breaker thresholds, bracket syntax, and the anti-pattern list. This file covers the run procedure that consumes those tables.
3
+ Paths here resolve as the skf-forger SKILL.md **Conventions** say: each `uv run scripts/...` call runs from the skf-forger skill root (`{skill-root}`), and `pipeline-contracts.md` is `shared/references/pipeline-contracts.md`, from the SKF module root (`{project-root}/_bmad/skf/` installed, `src/` in dev).
6
4
 
7
5
  ## Activation
8
6
 
9
- 1. **Parse the sequence** — run `uv run scripts/parse-pipeline.py '<sequence>'` (from the skf-forger skill root). It tokenizes (space or arrow separated), expands aliases, classifies each bracket argument (`CS[cocoindex]` → target, `TS[min:80]` → circuit-breaker override, `AN[auto]` → mode flag), and returns the normalized `plan`/`codes` plus any `anti_patterns` as JSON. Consume that output rather than re-deriving the expansion or checks by hand. `deepwiki`/`onboard` are already resolved at recognition before this procedure runs, so the sequence reaching this step is normalized. If the script cannot run, fall back to expanding aliases against the pipeline-contracts.md alias table and applying its anti-pattern table by hand.
7
+ 1. **Parse the invocation**: hand the parser the user's whole pipeline invocation, everything typed after `@Ferris` or `/skf-forger`: the codes, or the alias with the arguments after it (for example `forge-auto https://github.com/honojs/hono --pin v4.6.0` or `forge-quick cognee`), from the skf-forger skill root:
8
+
9
+ ```bash
10
+ uv run scripts/parse-pipeline.py --stdin <<'SKF_PIPELINE'
11
+ <the whole invocation>
12
+ SKF_PIPELINE
13
+ ```
14
+
15
+ It prints `plan`/`codes`, the first workflow's `args`, `alias`, any `anti_patterns`, `first_input` and `valid` as JSON. Consume that output rather than re-deriving the expansion or checks by hand, and branch on it before any workflow runs:
16
+
17
+ - **No JSON object on stdout**: HALT with what the call printed as the reason. An exit 2 or 3 that prints its JSON is an answer, handled below.
18
+ - **Exit 2** (`removed_alias` is `onboard`): HALT with "**onboard has been removed.** Use `forge-auto <repo-url>` instead. forge-auto auto-scopes, auto-briefs, and tests at 90% quality. Run `forge-auto` with any GitHub URL, doc URL, or `--pin <version>`."
19
+ - **Exit 3** (`valid` is false): name each token in `unknown_codes`, `unexpected_args` and `malformed_brackets` (a bracket holds `min:<number>`, `auto` or a target) and each input in `missing_args` (an alias takes its argument after it, as in `forge-quick <package-or-url>`), ask the user for the corrected invocation, and parse that one. In `{headless_mode}`, ask nothing: HALT with those tokens as the reason.
20
+ - **`deprecated_alias`** is `deepwiki`: say once "**`deepwiki` is now `forge-auto`.** The alias was renamed to avoid confusion with the DeepWiki MCP: this pipeline auto-forges a verified skill from source and does **not** call that MCP. `deepwiki` still works as a deprecated alias; prefer `forge-auto <repo-url>` going forward.", then go on with the plan, whose `alias` is `forge-auto`.
21
+ - **`first_input`** is set (`valid` is true, and the first workflow, past a leading `SF`, lacks the input it starts from, as for `QS TS EX` or `QS TS EX --pin 1.2.0`): the chain runs headless from step 3 on, so it cannot ask later. Ask the user for its `input`, then parse again its `form`, the invocation with the answer in place of each `<...>` placeholder, as `QS[cocoindex] TS EX`: step 4 starts the journal from that invocation. A null `form` means no chain can carry that input: say its `halt_reason`, ask the user for the corrected invocation, and parse that one. In `{headless_mode}`, ask nothing: HALT with its `halt_reason`, which for an input a bracket gives reads `<CODE> needs <input> before the pipeline can start: give it as <CODE>[<input>]`, such as `QS needs a target before the pipeline can start: give it as QS[<target>]`. A null `halt_reason` (a leading `CS`) halts nothing: go on with the chain, since create-skill compiles the only brief in `{forge_data_folder}`, and halts `brief-missing` naming the briefs when there are several.
22
+
23
+ A HALT in this step runs no workflow. In `{headless_mode}` it still writes the pipeline result, with `summary.status` `failed`, the halt reason in `summary.halt_reason` and no workflow in it, from the skf-forger skill root: `uv run scripts/pipeline-journal.py finish --result-dir "{sidecar_path}" --halt-reason '<the halt reason>'`. A reason given to a journal call goes in single quotes, with each `'` in it replaced by a backtick, so the shell runs nothing in it. Nothing ran, and a halt here starts no journal, so it leaves nothing to resume.
10
24
 
11
- 2. **Validate the sequence** — the parse output's `anti_patterns` array already lists any matches (EX before TS, CS without a brief, duplicate codes, US without AS), each with a message and suggestion. If it is non-empty, warn the user and ask to confirm or adjust. In `{headless_mode}`, warn but proceed.
25
+ 2. **Validate the sequence**: the parse output's `anti_patterns` array already lists any matches (EX before TS, CS without a brief, duplicate codes, US without AS, a `min:N` on a code other than AN and TS), each with a message and suggestion. If it is non-empty, warn the user and ask to confirm or adjust. In `{headless_mode}`, warn but proceed.
12
26
 
13
- 3. **Force `{headless_mode}` = true** — pipelines auto-activate headless mode for every workflow in the chain; the user committed to the sequence by providing it.
27
+ 3. **Force `{headless_mode}` = true**: pipelines auto-activate headless mode for every workflow in the chain; the user committed to the sequence by providing it.
14
28
 
15
- 4. **Execute left to right** — for each workflow:
29
+ 4. **Execute left to right.** First start the run's journal, which keeps the chain's state on disk (Pipeline State in pipeline-contracts.md), with the invocation step 1 parsed, from the skf-forger skill root:
30
+
31
+ ```bash
32
+ uv run scripts/pipeline-journal.py start --run-root "{project-root}/_bmad-output/.skf-run" <<'SKF_PIPELINE'
33
+ <the whole invocation>
34
+ SKF_PIPELINE
35
+ ```
36
+
37
+ It prints the `journal` path, which every later journal call of this run names, and the `steps`. If it prints no JSON object, or its `status` is not `ok`, no workflow has run: write the failed pipeline result as step 1 does, with its `message` (or what it printed, when that is no JSON object) as the halt reason, then HALT with that reason. Then, for each workflow:
16
38
  - a. **Report start:** "Pipeline [{current}/{total}]: Starting {code} ({description})..."
17
- - b. **Resolve inputs** from the previous workflow's output using the Data Flow table in pipeline-contracts.md. Pass any produced `skill_name`, `brief_path`, or other handoff data as the input argument.
18
- - c. **Invoke the workflow** with `{headless_mode}` = true, `{pipeline_alias}` set to the alias name (`forge-auto`, `forge`, `forge-quick`, `maintain`, or `null` for ad-hoc sequences), and any resolved arguments.
19
- - d. **Check the circuit breaker** after completion — load the output artifact and validate it against the threshold (default, or user-specified via `[min:N]`). On failure, halt the pipeline and report what completed and what remains.
20
- - e. **Report completion:** "Pipeline [{current}/{total}]: {code} complete — {brief summary of output}."
39
+ - b. **Resolve inputs** from the previous workflow's output using the Data Flow table in pipeline-contracts.md. Pass any produced `skill_name`, `brief_path`, or other handoff data as the input argument: the `data` the last `step` call printed holds each one. A `target_ref` in `data` (AS hands it on when upstream moved) goes to US as `--target-ref <target_ref>`. A plan entry's bracket `target`, when it has one, is its input (`QS[cocoindex]` hands QS `cocoindex`); otherwise the first workflow takes the parse's `args`: each key names the input it fills (`project_path`, `target_repo`, `skill_name` or `target`), and `pin` goes to its data context, as the pipeline-contracts.md Pipeline Arguments section says.
40
+ - c. **Invoke the workflow** with `{headless_mode}` = true, `{pipeline_mode}` = true, `{pipeline_alias}` set to the parse's `alias` (`forge-auto`, `forge`, `forge-quick`, `maintain`, or `null` for ad-hoc sequences), any resolved arguments, and the plan entry's `flags`. When TS's plan entry has a `min`, invoke TS with `--threshold=<min>`: TS applies it, with its caps and its 80% floor fallback, and settles the verdict step d reads. `{pipeline_mode}` is how a workflow knows it runs inside a pipeline, since `{pipeline_alias}` is null for an ad-hoc sequence. When the workflow's last step finishes, control returns here: continue with d, even when that step reads as the end of the run.
41
+ - d. **Check the circuit breaker.** After AN, TS, AS or VS, run the gate on the result envelope line the workflow just printed (`SKF_ANALYZE_RESULT_JSON`, `SKF_TEST_RESULT_JSON`, `SKF_AUDIT_RESULT_JSON` or `SKF_VERIFY_STACK_RESULT_JSON`), from the skf-forger skill root:
42
+
43
+ ```bash
44
+ uv run scripts/pipeline-gate.py --code <code> [--next <next-code>] [--min <N>] <<'SKF_RESULT'
45
+ <the SKF_*_RESULT_JSON line>
46
+ SKF_RESULT
47
+ ```
48
+
49
+ Gate that line only, never a `-latest.json` result file: a workflow can halt after writing its file, or abort before writing one, so the file may not describe this run. When the workflow printed no envelope line, leave the heredoc empty: the gate halts with `no-result`. Give `--next` the next code in the plan and, for AN with a `min` in its plan entry, `--min` that value. The gate prints one JSON object; act on its `decision`: `continue` goes on, `skip` reports `message` and passes over the next workflow (`skip` names it), and `halt` stops the pipeline with `reason` as the halt reason (for TS, the verdict: `FAIL`, `INCONCLUSIVE` or `pass-with-drift`), then reports what completed and what remains. A gate that prints no JSON halts the pipeline as well, with what it printed as the reason. Compare no score with a threshold here: TS took `[min:N]` as `--threshold` in c and settled its own verdict. The other workflows have no gate: one that hard-halts stops the pipeline (the Pipeline Rules in pipeline-contracts.md), which is CS's circuit breaker, and SF follows its entry under Special behaviors.
50
+ - e. **Record the step** in the journal before anything else, so a chain stopped from here on loses nothing. After AN, TS, AS or VS, hand it the JSON the gate printed: it records the step as the gate decided, and on a `skip` the workflow the gate passes over too:
51
+
52
+ ```bash
53
+ uv run scripts/pipeline-journal.py step --journal "<journal>" --code <code> --gate [--set "<name>=<value>"] [--output "<path>"] <<'SKF_GATE'
54
+ <the JSON the gate printed>
55
+ SKF_GATE
56
+ ```
57
+
58
+ After any other workflow, or when the gate printed no JSON, give the step's status: `completed`, or `halted` with the workflow's own halt reason (or what the gate printed):
59
+
60
+ ```bash
61
+ uv run scripts/pipeline-journal.py step --journal "<journal>" --code <code> --status <completed|halted> [--reason '<reason>'] [--set "<name>=<value>"] [--output "<path>"]
62
+ ```
63
+
64
+ Give `--set` each handoff value the workflow produced, by its Data Flow name: a completed CS, QS or US hands on `skill_name=<name>`, and a completed AN or BS `brief_path=<path>`. AS's `target_ref` takes no `--set`: when upstream moved, the gate prints it in its `handoff`, and `step --gate` records it. Give `--output` the result or report path its envelope names. The call prints the `next` plan entry (null after a halt or the last step) and the run's `data`. An error with `retry` true means the call lacked what its `message` names: run it again with that. On any other error, or no JSON object, the chain stops, with the `message` (or what it printed) as the halt reason. After a halt, or when the chain stops, go to step 5; otherwise go on with f, then with the `next` entry, or with step 5 when there is none.
65
+ - f. **Report completion:** "Pipeline [{current}/{total}]: {code} complete ({brief summary of output})."
66
+
67
+ 5. **Result contract**: write the pipeline result from the journal, from the skf-forger skill root:
68
+
69
+ ```bash
70
+ uv run scripts/pipeline-journal.py finish --journal "<journal>" --result-dir "{sidecar_path}" [--halt-reason '<reason>']
71
+ ```
72
+
73
+ Give `--halt-reason` the reason the chain stopped with when no `step` call recorded it. The call prints the pipeline's `pipeline_status`, its `halt_reason` and, after a halt, its `route`: the next action. If it prints no JSON object, or its `status` is not `ok`, say so in step 6: the chain's own outcome stands.
74
+
75
+ 6. **Pipeline summary.** After all workflows complete (or on halt), present: completed workflows with key outputs; the failed/halted workflow (if any) with its halt reason; remaining unexecuted workflows; and a next-steps recommendation, which after a halt is step 5's `route`.
21
76
 
22
- 5. **Pipeline summary** — after all workflows complete (or on halt), present: completed workflows with key outputs; the failed/halted workflow (if any) with its halt reason; remaining unexecuted workflows; and a next-steps recommendation.
77
+ ## Resume
23
78
 
24
- 6. **Result contract** — write the pipeline result contract per `shared/references/output-contract-schema.md`: the per-run record at `{sidecar_path}/pipeline-result-{YYYYMMDD-HHmmss}.json` (UTC timestamp, resolution to seconds) and a copy at `{sidecar_path}/pipeline-result-latest.json` (stable path for consumers — copy, not symlink). Include one entry per completed workflow in `outputs` (each referencing that workflow's own `-latest.json` record); record per-step status for every workflow in the sequence — completed, halted, and not-yet-run — plus the overall pipeline status (`summary.status` — one of `success`, `failed`, or `partial`) in `summary`. On a `failed`/`partial` status, the forger's On Activation resume check reads that per-step record to offer continuation of the not-yet-run workflows.
79
+ When the user accepts the offer On Activation step 5 made, run the chain from its journal instead of a new invocation: steps 1 and 2 are skipped, since the journal holds the plan the first parse produced. When the offer has a `user_action`, first confirm the user did it. Then, from the skf-forger skill root:
25
80
 
26
- ## forge-auto argument passing
81
+ ```bash
82
+ uv run scripts/pipeline-journal.py reopen --journal "<journal>"
83
+ ```
27
84
 
28
- `forge-auto <repo-url> --pin <version>` — the `--pin` argument flows to AN's pipeline data context alongside the `[auto]` flag. AN's `step-auto-scope.md §0b` consumes it for pin resolution.
85
+ `<journal>` is the path the offer named. The call prints the plan entries still to `run`, the `alias`, the first workflow's `args` and the handoff `data`. If it prints no JSON object, or its `status` is not `ok`, HALT with what it printed. Otherwise go on with step 3, then step 4 from the first entry of `run`, without step 4's `start` call (every `step` call names this `journal`): `{pipeline_alias}` is `alias`, each entry carries its bracket values and `flags`, and the first entry takes its `target` when it has one, else its Data Flow inputs from `data`, or from `args` when it is the plan's first workflow.
29
86
 
30
87
  ## Special behaviors
31
88
 
32
- - **`AN` with `CS`:** if AN produces multiple recommended briefs, auto-select all and process them sequentially in batch mode. If only one unit is found, auto-select it.
33
- - **`AS` followed by `US`:** if `summary.severity` in `audit-skill-result-latest.json` is CLEAN, skip US and report "No drift detected — skipping update."
34
- - **`TS` followed by `EX`:** if the test result is FAIL and the score is below the circuit-breaker threshold, halt before EX.
89
+ - **`SF` in a sequence:** SF writes no result file; the one `SKF_SETUP_RESULT_JSON` envelope line it displays is its output. Continue on `status` `success`. Any other status halts the pipeline, with that status and any `error.reason` as the halt reason; so does a run that displays no envelope line, with the line it did display as the reason.