bmad-module-skill-forge 0.9.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.
- package/.claude-plugin/marketplace.json +39 -0
- package/.gitattributes +16 -0
- package/README.md +105 -38
- package/docs/404.md +13 -10
- package/docs/RELEASING.md +185 -0
- package/docs/STABILITY.md +123 -0
- package/docs/_data/pinned.yaml +98 -0
- package/docs/agents.md +16 -11
- package/docs/architecture.md +221 -0
- package/docs/bmad-synergy.md +11 -13
- package/docs/concepts.md +18 -108
- package/docs/examples.md +121 -80
- package/docs/getting-started.md +85 -147
- package/docs/how-it-works.md +25 -536
- package/docs/index.md +44 -27
- package/docs/skill-model.md +328 -0
- package/docs/troubleshooting.md +39 -0
- package/docs/verifying-a-skill.md +232 -0
- package/docs/why-skf.md +93 -0
- package/docs/workflows.md +119 -13
- package/package.json +25 -4
- package/src/README.md +23 -25
- package/src/forger/forge-tier.yaml +4 -2
- package/src/forger/preferences.yaml +7 -1
- package/src/knowledge/agentskills-spec.md +1 -1
- package/src/knowledge/architecture-verification.md +1 -1
- package/src/knowledge/ccc-bridge.md +16 -15
- package/src/knowledge/overview.md +11 -11
- package/src/knowledge/progressive-capability.md +3 -3
- package/src/knowledge/provenance-tracking.md +9 -3
- package/src/knowledge/qmd-registry.md +8 -8
- package/src/knowledge/skf-knowledge-index.csv +2 -2
- package/src/knowledge/skill-lifecycle.md +16 -1
- package/src/knowledge/split-body-strategy.md +1 -1
- package/src/knowledge/version-paths.md +17 -12
- package/src/module-help.csv +18 -17
- package/src/module.yaml +4 -0
- package/src/shared/health-check.md +372 -0
- package/src/shared/references/feasibility-report-schema.md +86 -0
- package/src/shared/references/headless-gate-convention.md +62 -0
- package/src/shared/references/output-contract-schema.md +35 -0
- package/src/shared/references/pipeline-contracts.md +102 -0
- package/src/shared/scripts/skf-atomic-write.py +370 -0
- package/src/shared/scripts/skf-manifest-ops.py +236 -0
- package/src/shared/scripts/skf-preflight.py +164 -0
- package/src/shared/scripts/skf-rebuild-managed-sections.py +201 -0
- package/src/shared/scripts/skf-severity-classify.py +163 -0
- package/src/shared/scripts/skf-skill-inventory.py +210 -0
- package/src/shared/scripts/skf-structural-diff.py +257 -0
- package/src/shared/scripts/skf-validate-frontmatter.py +318 -0
- package/src/shared/scripts/skf-validate-output.py +247 -0
- package/src/skf-analyze-source/SKILL.md +57 -0
- package/src/skf-analyze-source/assets/skill-brief-schema.md +125 -0
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +124 -0
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01-init.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01b-continue.md +4 -59
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-02-scan-project.md +7 -68
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-03-identify-units.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-04-map-and-detect.md +7 -68
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-05-recommend.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-06-generate-briefs.md +14 -66
- package/src/skf-analyze-source/steps-c/step-07-health-check.md +22 -0
- package/src/skf-audit-skill/SKILL.md +59 -0
- package/src/{workflows/audit-skill/data → skf-audit-skill/assets}/drift-report-template.md +7 -7
- package/src/{workflows/audit-skill/data → skf-audit-skill/references}/severity-rules.md +11 -11
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-01-init.md +24 -68
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-02-re-index.md +36 -71
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-03-structural-diff.md +21 -63
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-04-semantic-diff.md +6 -65
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-05-severity-classify.md +5 -63
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-06-report.md +10 -59
- package/src/skf-audit-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-brief-skill/SKILL.md +53 -0
- package/src/{workflows/brief-skill/data → skf-brief-skill/assets}/scope-templates.md +23 -0
- package/src/skf-brief-skill/assets/skill-brief-schema.md +206 -0
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-01-gather-intent.md +6 -67
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-02-analyze-target.md +6 -66
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-03-scope-definition.md +12 -68
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-04-confirm-brief.md +5 -63
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-05-write-brief.md +10 -69
- package/src/skf-brief-skill/steps-c/step-06-health-check.md +22 -0
- package/src/skf-create-skill/SKILL.md +63 -0
- package/src/{workflows/create-skill/data → skf-create-skill/assets}/compile-assembly-rules.md +60 -0
- package/src/{workflows/create-skill/data → skf-create-skill/assets}/skill-sections.md +92 -23
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +102 -0
- package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns-tracing.md +13 -13
- package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns.md +8 -3
- package/src/skf-create-skill/references/source-resolution-protocols.md +239 -0
- package/src/{workflows/create-skill/data → skf-create-skill/references}/tier-degradation-rules.md +8 -7
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-01-load-brief.md +25 -63
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-02-ecosystem-check.md +8 -64
- package/src/skf-create-skill/steps-c/step-03-extract.md +379 -0
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-03d-component-extraction.md +18 -35
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-04-enrich.md +12 -69
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-05-compile.md +71 -75
- package/src/skf-create-skill/steps-c/step-06-validate.md +267 -0
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-07-generate-artifacts.md +30 -74
- package/src/skf-create-skill/steps-c/step-08-report.md +145 -0
- package/src/skf-create-skill/steps-c/step-09-health-check.md +23 -0
- package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-02b-ccc-discover.md +8 -66
- package/src/skf-create-skill/steps-c/sub/step-03b-fetch-temporal.md +229 -0
- package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-03c-fetch-docs.md +18 -42
- package/src/skf-create-stack-skill/SKILL.md +64 -0
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/assets}/stack-skill-template.md +2 -1
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/compose-mode-rules.md +19 -5
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/integration-patterns.md +1 -1
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/manifest-patterns.md +10 -10
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-01-init.md +14 -55
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-02-detect-manifests.md +29 -63
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-03-rank-and-confirm.md +9 -59
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-04-parallel-extract.md +29 -64
- package/src/skf-create-stack-skill/steps-c/step-05-detect-integrations.md +164 -0
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-06-compile-stack.md +7 -60
- package/src/skf-create-stack-skill/steps-c/step-07-generate-output.md +328 -0
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-08-validate.md +17 -63
- package/src/skf-create-stack-skill/steps-c/step-09-report.md +128 -0
- package/src/skf-create-stack-skill/steps-c/step-10-health-check.md +22 -0
- package/src/skf-drop-skill/SKILL.md +57 -0
- package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-01-select.md +9 -69
- package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-02-execute.md +30 -106
- package/src/skf-drop-skill/steps-c/step-03-report.md +83 -0
- package/src/skf-drop-skill/steps-c/step-04-health-check.md +22 -0
- package/src/skf-export-skill/SKILL.md +57 -0
- package/src/skf-export-skill/assets/managed-section-format.md +138 -0
- package/src/{workflows/export-skill/data → skf-export-skill/assets}/snippet-format.md +8 -12
- package/src/skf-export-skill/steps-c/step-01-load-skill.md +247 -0
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-02-package.md +5 -58
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-03-generate-snippet.md +15 -77
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-04-update-context.md +59 -133
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-05-token-report.md +4 -58
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-06-summary.md +20 -64
- package/src/skf-export-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-forger/SKILL.md +110 -0
- package/src/skf-forger/bmad-skill-manifest.yaml +11 -0
- package/src/skf-quick-skill/SKILL.md +56 -0
- package/src/{workflows/quick-skill/data → skf-quick-skill/references}/registry-resolution.md +6 -6
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-01-resolve-target.md +9 -62
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-02-ecosystem-check.md +5 -59
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-03-quick-extract.md +18 -61
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-04-compile.md +6 -60
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-05-validate.md +58 -78
- package/src/skf-quick-skill/steps-c/step-06-write.md +73 -0
- package/src/skf-quick-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-refine-architecture/SKILL.md +57 -0
- package/src/{workflows/refine-architecture/data → skf-refine-architecture/references}/refinement-rules.md +16 -16
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-01-init.md +6 -63
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-02-gap-analysis.md +29 -71
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-03-issue-detection.md +5 -65
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-04-improvements.md +5 -64
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-05-compile.md +5 -56
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-06-report.md +14 -64
- package/src/skf-refine-architecture/steps-c/step-07-health-check.md +22 -0
- package/src/skf-rename-skill/SKILL.md +58 -0
- package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-01-select.md +12 -73
- package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-02-execute.md +32 -113
- package/src/skf-rename-skill/steps-c/step-03-report.md +83 -0
- package/src/skf-rename-skill/steps-c/step-04-health-check.md +22 -0
- package/src/skf-setup/SKILL.md +55 -0
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01-detect-and-tier.md +6 -62
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01b-ccc-index.md +9 -65
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-02-write-config.md +15 -60
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-03-auto-index.md +7 -66
- package/src/skf-setup/steps-c/step-04-report.md +92 -0
- package/src/skf-setup/steps-c/step-05-health-check.md +22 -0
- package/src/skf-test-skill/SKILL.md +59 -0
- package/src/skf-test-skill/references/migration-section-rules.md +114 -0
- package/src/skf-test-skill/references/scoring-rules.md +207 -0
- package/src/skf-test-skill/references/source-access-protocol.md +109 -0
- package/src/skf-test-skill/scripts/compute-score.py +310 -0
- package/src/skf-test-skill/steps-c/step-01-init.md +238 -0
- package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-02-detect-mode.md +4 -62
- package/src/skf-test-skill/steps-c/step-03-coverage-check.md +347 -0
- package/src/skf-test-skill/steps-c/step-04-coherence-check.md +239 -0
- package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-04b-external-validators.md +42 -77
- package/src/skf-test-skill/steps-c/step-05-score.md +266 -0
- package/src/skf-test-skill/steps-c/step-06-report.md +290 -0
- package/src/skf-test-skill/steps-c/step-07-health-check.md +25 -0
- package/src/skf-test-skill/templates/test-report-template.md +58 -0
- package/src/skf-update-skill/SKILL.md +58 -0
- package/src/{workflows/update-skill/data → skf-update-skill/references}/manual-section-rules.md +6 -6
- package/src/{workflows/update-skill/data → skf-update-skill/references}/merge-conflict-rules.md +5 -5
- package/src/skf-update-skill/references/remote-source-resolution.md +94 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-01-init.md +22 -69
- package/src/skf-update-skill/steps-c/step-02-detect-changes.md +255 -0
- package/src/skf-update-skill/steps-c/step-03-re-extract.md +336 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-04-merge.md +60 -72
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-05-validate.md +5 -62
- package/src/skf-update-skill/steps-c/step-06-write.md +278 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-07-report.md +11 -66
- package/src/skf-update-skill/steps-c/step-08-health-check.md +22 -0
- package/src/skf-verify-stack/SKILL.md +60 -0
- package/src/skf-verify-stack/assets/feasibility-report-template.md +76 -0
- package/src/{workflows/verify-stack/data → skf-verify-stack/references}/coverage-patterns.md +12 -4
- package/src/skf-verify-stack/references/integration-verification-rules.md +78 -0
- package/src/skf-verify-stack/steps-c/step-01-init.md +178 -0
- package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-02-coverage.md +27 -72
- package/src/skf-verify-stack/steps-c/step-03-integrations.md +179 -0
- package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-04-requirements.md +14 -67
- package/src/skf-verify-stack/steps-c/step-05-synthesize.md +147 -0
- package/src/skf-verify-stack/steps-c/step-06-report.md +156 -0
- package/src/skf-verify-stack/steps-c/step-07-health-check.md +25 -0
- package/tools/cli/commands/install.js +1 -1
- package/tools/cli/commands/status.js +21 -23
- package/tools/cli/commands/uninstall.js +11 -19
- package/tools/cli/commands/update.js +2 -2
- package/tools/cli/lib/ide-skills.js +216 -0
- package/tools/cli/lib/installer.js +29 -52
- package/tools/cli/lib/manifest.js +11 -5
- package/tools/cli/lib/platform-codes.yaml +223 -0
- package/tools/cli/lib/ui.js +76 -47
- package/tools/validate-docs-drift.js +193 -0
- package/src/agents/forger.agent.yaml +0 -114
- package/src/workflows/README.md +0 -174
- package/src/workflows/analyze-source/data/skill-brief-schema.md +0 -125
- package/src/workflows/analyze-source/data/unit-detection-heuristics.md +0 -124
- package/src/workflows/analyze-source/workflow.md +0 -61
- package/src/workflows/audit-skill/workflow.md +0 -64
- package/src/workflows/brief-skill/data/skill-brief-schema.md +0 -159
- package/src/workflows/brief-skill/workflow.md +0 -58
- package/src/workflows/create-skill/data/source-resolution-protocols.md +0 -200
- package/src/workflows/create-skill/steps-c/step-03-extract.md +0 -301
- package/src/workflows/create-skill/steps-c/step-03b-fetch-temporal.md +0 -253
- package/src/workflows/create-skill/steps-c/step-06-validate.md +0 -254
- package/src/workflows/create-skill/steps-c/step-08-report.md +0 -176
- package/src/workflows/create-skill/workflow.md +0 -53
- package/src/workflows/create-stack-skill/steps-c/step-05-detect-integrations.md +0 -196
- package/src/workflows/create-stack-skill/steps-c/step-07-generate-output.md +0 -270
- package/src/workflows/create-stack-skill/steps-c/step-09-report.md +0 -145
- package/src/workflows/create-stack-skill/workflow.md +0 -59
- package/src/workflows/drop-skill/steps-c/step-03-report.md +0 -135
- package/src/workflows/drop-skill/workflow.md +0 -63
- package/src/workflows/export-skill/data/managed-section-format.md +0 -103
- package/src/workflows/export-skill/steps-c/step-01-load-skill.md +0 -237
- package/src/workflows/export-skill/workflow.md +0 -58
- package/src/workflows/quick-skill/steps-c/step-06-write.md +0 -179
- package/src/workflows/quick-skill/workflow.md +0 -58
- package/src/workflows/refine-architecture/workflow.md +0 -61
- package/src/workflows/rename-skill/steps-c/step-03-report.md +0 -132
- package/src/workflows/rename-skill/workflow.md +0 -64
- package/src/workflows/setup-forge/steps-c/step-04-report.md +0 -156
- package/src/workflows/setup-forge/workflow.md +0 -51
- package/src/workflows/test-skill/data/scoring-rules.md +0 -123
- package/src/workflows/test-skill/data/source-access-protocol.md +0 -51
- package/src/workflows/test-skill/steps-c/step-01-init.md +0 -217
- package/src/workflows/test-skill/steps-c/step-03-coverage-check.md +0 -280
- package/src/workflows/test-skill/steps-c/step-04-coherence-check.md +0 -271
- package/src/workflows/test-skill/steps-c/step-05-score.md +0 -222
- package/src/workflows/test-skill/steps-c/step-06-report.md +0 -207
- package/src/workflows/test-skill/templates/test-report-template.md +0 -28
- package/src/workflows/test-skill/workflow.md +0 -57
- package/src/workflows/update-skill/data/remote-source-resolution.md +0 -57
- package/src/workflows/update-skill/steps-c/step-02-detect-changes.md +0 -221
- package/src/workflows/update-skill/steps-c/step-03-re-extract.md +0 -256
- package/src/workflows/update-skill/steps-c/step-06-write.md +0 -265
- package/src/workflows/update-skill/workflow.md +0 -56
- package/src/workflows/verify-stack/data/feasibility-report-template.md +0 -63
- package/src/workflows/verify-stack/data/integration-verification-rules.md +0 -73
- package/src/workflows/verify-stack/steps-c/step-01-init.md +0 -179
- package/src/workflows/verify-stack/steps-c/step-03-integrations.md +0 -195
- package/src/workflows/verify-stack/steps-c/step-05-synthesize.md +0 -191
- package/src/workflows/verify-stack/steps-c/step-06-report.md +0 -197
- package/src/workflows/verify-stack/workflow.md +0 -61
- package/tools/cli/lib/compiler.js +0 -306
- package/tools/cli/lib/ide-commands.js +0 -244
- /package/src/{workflows/analyze-source → skf-analyze-source}/templates/analysis-report-template.md +0 -0
- /package/src/{workflows/quick-skill/data → skf-quick-skill/assets}/skill-template.md +0 -0
- /package/src/{workflows/setup-forge/data → skf-setup/references}/tier-rules.md +0 -0
- /package/src/{workflows/test-skill/data → skf-test-skill/assets}/output-section-formats.md +0 -0
package/tools/cli/lib/ui.js
CHANGED
|
@@ -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 =
|
|
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(
|
|
64
|
-
console.log(row(chalk.dim('
|
|
65
|
-
console.log(
|
|
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(`
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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 (
|
|
301
|
+
if (selectedIdes.length === 0) {
|
|
301
302
|
ideDisplay = 'your IDE';
|
|
302
|
-
} else if (
|
|
303
|
-
ideDisplay = ideNames[
|
|
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
|
-
|
|
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}: ${
|
|
322
|
-
|
|
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: ${
|
|
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"
|