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.
- package/.claude-plugin/marketplace.json +1 -1
- package/README.md +49 -49
- package/docs/404.md +10 -8
- package/docs/_data/pinned.yaml +22 -13
- package/docs/_internal/STABILITY.md +58 -35
- package/docs/agents.md +39 -53
- package/docs/architecture.md +65 -51
- package/docs/bmad-synergy.md +53 -51
- package/docs/campaign.md +127 -75
- package/docs/concepts.md +34 -28
- package/docs/examples.md +70 -68
- package/docs/forge-auto.md +34 -31
- package/docs/getting-started.md +118 -57
- package/docs/how-it-works.md +25 -21
- package/docs/index.md +15 -15
- package/docs/skill-model.md +70 -59
- package/docs/troubleshooting.md +135 -18
- package/docs/verifying-a-skill.md +83 -57
- package/docs/why-skf.md +24 -22
- package/docs/workflows.md +274 -110
- package/package.json +18 -10
- package/src/forger/preferences.yaml +8 -1
- package/src/knowledge/agentskills-spec.md +2 -0
- package/src/knowledge/ccc-bridge.md +40 -24
- package/src/knowledge/confidence-tiers.md +9 -5
- package/src/knowledge/overview.md +3 -3
- package/src/knowledge/progressive-capability.md +8 -8
- package/src/knowledge/provenance-tracking.md +9 -5
- package/src/knowledge/qmd-registry.md +2 -2
- package/src/knowledge/skf-knowledge-index.csv +2 -2
- package/src/knowledge/skill-lifecycle.md +18 -11
- package/src/knowledge/split-body-strategy.md +0 -3
- package/src/knowledge/tool-resolution.md +4 -2
- package/src/knowledge/version-paths.md +101 -15
- package/src/module-help.csv +3 -3
- package/src/module.yaml +10 -0
- package/src/shared/data/ast-grep-recipes.yaml +608 -0
- package/src/shared/data/ide-context-files.json +30 -0
- package/src/shared/health-check.md +32 -12
- package/src/shared/references/description-guard-protocol.md +12 -9
- package/src/shared/references/feasibility-report-schema.md +19 -13
- package/src/shared/references/headless-gate-convention.md +55 -3
- package/src/shared/references/output-contract-schema.md +19 -8
- package/src/shared/references/pipeline-contracts.md +94 -29
- package/src/shared/references/tessl-review.md +77 -0
- package/src/shared/scripts/schemas/skf-analyze-result-envelope.v1.json +194 -0
- package/src/shared/scripts/schemas/skf-audit-result-envelope.v1.json +192 -0
- package/src/shared/scripts/schemas/skf-brief-result-envelope.v1.json +32 -4
- package/src/shared/scripts/schemas/skf-campaign-result-envelope.v1.json +174 -0
- package/src/shared/scripts/schemas/skf-create-skill-result-envelope.v1.json +284 -0
- package/src/shared/scripts/schemas/skf-drop-skill-result-envelope.v1.json +164 -0
- package/src/shared/scripts/schemas/skf-export-result-envelope.v1.json +160 -0
- package/src/shared/scripts/schemas/skf-quick-skill-result-envelope.v1.json +261 -0
- package/src/shared/scripts/schemas/skf-refine-architecture-result-envelope.v1.json +192 -0
- package/src/shared/scripts/schemas/skf-rename-skill-result-envelope.v1.json +179 -0
- package/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json +27 -11
- package/src/shared/scripts/schemas/skf-stack-result-envelope.v1.json +176 -0
- package/src/shared/scripts/schemas/skf-test-result-envelope.v1.json +173 -0
- package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +19 -5
- package/src/shared/scripts/schemas/skf-verify-stack-result-envelope.v1.json +180 -0
- package/src/shared/scripts/schemas/skill-brief.v1.json +34 -0
- package/src/shared/scripts/schemas/workspace-detection.v1.json +1 -1
- package/src/shared/scripts/skf-atomic-write.py +30 -14
- package/src/shared/scripts/skf-build-change-manifest.py +2203 -24
- package/src/shared/scripts/skf-ccc-git-hygiene.py +532 -0
- package/src/shared/scripts/skf-check-unit-records.py +184 -0
- package/src/shared/scripts/skf-check-workspace-drift.py +538 -9
- package/src/shared/scripts/skf-classify-changed-files.py +694 -0
- package/src/shared/scripts/skf-comention-pairs.py +1333 -123
- package/src/shared/scripts/skf-compare-file-hashes.py +1 -1
- package/src/shared/scripts/skf-count-imports.py +1867 -0
- package/src/shared/scripts/skf-count-tokens.py +1 -1
- package/src/shared/scripts/skf-derive-assembly-shape.py +3 -2
- package/src/shared/scripts/skf-description-guard.py +99 -11
- package/src/shared/scripts/skf-detect-docs.py +694 -2
- package/src/shared/scripts/skf-detect-language.py +486 -107
- package/src/shared/scripts/skf-detect-registry.py +887 -0
- package/src/shared/scripts/skf-detect-scripts-assets.py +1 -1
- package/src/shared/scripts/skf-detect-tools.py +209 -27
- package/src/shared/scripts/skf-detect-workspaces.py +506 -30
- package/src/shared/scripts/skf-disqualify-candidates.py +821 -182
- package/src/shared/scripts/skf-emit-brief-result-envelope.py +69 -191
- package/src/shared/scripts/skf-emit-result-envelope.py +1604 -106
- package/src/shared/scripts/skf-enumerate-stack-skills.py +986 -117
- package/src/shared/scripts/skf-extract-public-api.py +4084 -85
- package/src/shared/scripts/skf-extraction-inventory.py +746 -0
- package/src/shared/scripts/skf-extraction-snapshot.py +539 -0
- package/src/shared/scripts/skf-fetch-temporal.py +674 -0
- package/src/shared/scripts/skf-find-cycles.py +97 -29
- package/src/shared/scripts/skf-find-test-report.py +476 -0
- package/src/shared/scripts/skf-forge-tier-rw.py +444 -203
- package/src/shared/scripts/skf-github-fetch.py +365 -0
- package/src/shared/scripts/skf-github-probe.py +661 -0
- package/src/shared/scripts/skf-hash-content.py +166 -12
- package/src/shared/scripts/skf-language-corpora.py +1 -1
- package/src/shared/scripts/skf-load-provenance.py +159 -27
- package/src/shared/scripts/skf-manifest-ops.py +1 -1
- package/src/shared/scripts/skf-merge-ccc-exclusions.py +2307 -223
- package/src/shared/scripts/skf-merge-doc-urls.py +1 -1
- package/src/shared/scripts/skf-names-present.py +221 -0
- package/src/shared/scripts/skf-pair-intersect.py +119 -28
- package/src/shared/scripts/skf-parse-gaps.py +1384 -0
- package/src/shared/scripts/skf-preapply.py +1 -1
- package/src/shared/scripts/skf-preflight.py +161 -27
- package/src/shared/scripts/skf-promote-staged.py +430 -0
- package/src/shared/scripts/skf-provenance-gap-dispatch.py +39 -7
- package/src/shared/scripts/skf-qmd-classify-collections.py +229 -45
- package/src/shared/scripts/skf-quick-batch.py +774 -0
- package/src/shared/scripts/skf-rebuild-managed-sections.py +972 -88
- package/src/shared/scripts/skf-recommend-scope-type.py +323 -156
- package/src/shared/scripts/skf-render-metadata-stats.py +156 -12
- package/src/shared/scripts/skf-render-quick-metadata.py +132 -28
- package/src/shared/scripts/skf-render-stack-metadata.py +976 -0
- package/src/shared/scripts/skf-resolve-authoritative-files.py +128 -13
- package/src/shared/scripts/skf-resolve-package.py +523 -106
- package/src/shared/scripts/skf-rewrite-skill-name.py +433 -47
- package/src/shared/scripts/skf-run-lock.py +577 -0
- package/src/shared/scripts/skf-scan-manifests.py +998 -57
- package/src/shared/scripts/skf-scan-skill-md-structure.py +1341 -37
- package/src/shared/scripts/skf-severity-classify.py +712 -108
- package/src/shared/scripts/skf-shape-detect.py +298 -204
- package/src/shared/scripts/skf-shard-body.py +9 -8
- package/src/shared/scripts/skf-skill-inventory.py +2412 -89
- package/src/shared/scripts/skf-skills-module.py +472 -0
- package/src/shared/scripts/skf-source-tree.py +1796 -0
- package/src/shared/scripts/skf-structural-diff.py +670 -119
- package/src/shared/scripts/skf-tessl-review.py +706 -0
- package/src/shared/scripts/skf-update-active-symlink.py +5 -5
- package/src/shared/scripts/skf-update-run-state.py +624 -0
- package/src/shared/scripts/skf-validate-brief-inputs.py +92 -29
- package/src/shared/scripts/skf-validate-brief-schema.py +4 -1
- package/src/shared/scripts/skf-validate-feasibility-report.py +577 -66
- package/src/shared/scripts/skf-validate-frontmatter.py +103 -26
- package/src/shared/scripts/skf-validate-output.py +712 -64
- package/src/shared/scripts/skf-validate-pins.py +1 -1
- package/src/shared/scripts/skf-verify-no-trace.py +116 -10
- package/src/shared/scripts/skf-verify-provenance-completeness.py +2919 -54
- package/src/shared/scripts/skf-write-skill-brief.py +367 -19
- package/src/shared/tool-requirements.yaml +201 -0
- package/src/skf-analyze-source/SKILL.md +41 -36
- package/src/skf-analyze-source/assets/skill-brief-schema.md +7 -8
- package/src/skf-analyze-source/customize.toml +36 -24
- package/src/skf-analyze-source/references/auto-docs-only.md +58 -20
- package/src/skf-analyze-source/references/continue.md +2 -13
- package/src/skf-analyze-source/references/discover-additional-source.md +147 -0
- package/src/skf-analyze-source/references/generate-briefs.md +121 -55
- package/src/skf-analyze-source/references/headless-contract.md +42 -15
- package/src/skf-analyze-source/references/identify-units.md +96 -110
- package/src/skf-analyze-source/references/init.md +73 -71
- package/src/skf-analyze-source/references/map-and-detect.md +123 -105
- package/src/skf-analyze-source/references/map-unit-exports.md +68 -0
- package/src/skf-analyze-source/references/recommend.md +51 -70
- package/src/skf-analyze-source/references/scan-project.md +60 -84
- package/src/skf-analyze-source/references/scan-root.md +39 -0
- package/src/skf-analyze-source/references/step-auto-scope-coexistence.md +47 -0
- package/src/skf-analyze-source/references/step-auto-scope-corpora.md +53 -0
- package/src/skf-analyze-source/references/step-auto-scope-split.md +91 -0
- package/src/skf-analyze-source/references/step-auto-scope.md +208 -293
- package/src/skf-analyze-source/references/step-shape-detect.md +14 -12
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +37 -42
- package/src/skf-audit-skill/SKILL.md +43 -51
- package/src/skf-audit-skill/assets/drift-report-template.md +27 -3
- package/src/skf-audit-skill/customize.toml +41 -20
- package/src/skf-audit-skill/references/constituent-freshness.md +91 -0
- package/src/skf-audit-skill/references/doc-drift.md +141 -0
- package/src/skf-audit-skill/references/headless-contract.md +29 -0
- package/src/skf-audit-skill/references/init.md +148 -210
- package/src/skf-audit-skill/references/re-index.md +96 -108
- package/src/skf-audit-skill/references/report.md +96 -33
- package/src/skf-audit-skill/references/semantic-diff.md +27 -18
- package/src/skf-audit-skill/references/severity-classify.md +79 -65
- package/src/skf-audit-skill/references/severity-rules.md +15 -6
- package/src/skf-audit-skill/references/structural-diff.md +75 -90
- package/src/skf-audit-skill/references/upstream-checkout.md +77 -0
- package/src/skf-audit-skill/scripts/render-drift-tables.py +685 -0
- package/src/skf-brief-skill/SKILL.md +36 -25
- package/src/skf-brief-skill/assets/description-voice-examples.md +1 -1
- package/src/skf-brief-skill/assets/scope-templates.md +17 -24
- package/src/skf-brief-skill/assets/skill-brief-schema.md +29 -15
- package/src/skf-brief-skill/customize.toml +48 -20
- package/src/skf-brief-skill/references/analyze-target.md +142 -125
- package/src/skf-brief-skill/references/confirm-brief.md +10 -8
- package/src/skf-brief-skill/references/draft-checkpoint.md +36 -17
- package/src/skf-brief-skill/references/gather-intent-ratify.md +68 -0
- package/src/skf-brief-skill/references/gather-intent.md +87 -182
- package/src/skf-brief-skill/references/headless-args.md +84 -16
- package/src/skf-brief-skill/references/health-check.md +1 -1
- package/src/skf-brief-skill/references/invocation-contract.md +18 -13
- package/src/skf-brief-skill/references/portfolio-similarity-check.md +1 -1
- package/src/skf-brief-skill/references/qmd-collection-registration.md +7 -10
- package/src/skf-brief-skill/references/scope-definition.md +123 -47
- package/src/skf-brief-skill/references/step-auto-brief.md +24 -80
- package/src/skf-brief-skill/references/step-auto-validate.md +20 -121
- package/src/skf-brief-skill/references/version-resolution.md +3 -2
- package/src/skf-brief-skill/references/write-brief.md +66 -57
- package/src/skf-campaign/SKILL.md +31 -34
- package/src/skf-campaign/assets/campaign-state-schema.json +25 -4
- package/src/skf-campaign/customize.toml +47 -16
- package/src/skf-campaign/references/campaign-contracts.md +39 -29
- package/src/skf-campaign/references/campaign-directive-spec.md +4 -2
- package/src/skf-campaign/references/health-check.md +7 -16
- package/src/skf-campaign/references/step-01-setup.md +46 -84
- package/src/skf-campaign/references/step-02-strategy.md +31 -30
- package/src/skf-campaign/references/step-03-pins.md +26 -18
- package/src/skf-campaign/references/step-04-provenance.md +24 -23
- package/src/skf-campaign/references/step-05-skill-loop.md +67 -48
- package/src/skf-campaign/references/step-06-batch.md +41 -34
- package/src/skf-campaign/references/step-07-capstone.md +40 -25
- package/src/skf-campaign/references/step-08-verify.md +28 -29
- package/src/skf-campaign/references/step-09-refine.md +29 -30
- package/src/skf-campaign/references/step-10-export.md +48 -36
- package/src/skf-campaign/references/step-11-maintenance.md +31 -34
- package/src/skf-campaign/references/step-resume.md +37 -68
- package/src/skf-campaign/scripts/campaign-deps.py +57 -18
- package/src/skf-campaign/scripts/campaign-parse-manifest.py +361 -54
- package/src/skf-campaign/scripts/campaign-provenance.py +96 -53
- package/src/skf-campaign/scripts/campaign-quality-gate.py +592 -0
- package/src/skf-campaign/scripts/campaign-render-batch.py +257 -49
- package/src/skf-campaign/scripts/campaign-render-kickoff.py +343 -50
- package/src/skf-campaign/scripts/campaign-report.py +204 -37
- package/src/skf-campaign/scripts/campaign-state.py +1128 -0
- package/src/skf-campaign/scripts/campaign-status.py +10 -74
- package/src/skf-campaign/scripts/campaign-validate-pins.py +30 -3
- package/src/skf-campaign/scripts/campaign-validate-state.py +34 -4
- package/src/skf-campaign/templates/campaign-brief-template.yaml +4 -5
- package/src/skf-campaign/templates/campaign-report-template.md +5 -1
- package/src/skf-campaign/templates/kickoff-template.md +0 -14
- package/src/skf-create-skill/SKILL.md +27 -20
- package/src/skf-create-skill/assets/compile-assembly-rules.md +6 -5
- package/src/skf-create-skill/assets/skill-sections.md +15 -5
- package/src/skf-create-skill/customize.toml +20 -8
- package/src/skf-create-skill/references/authoritative-files-protocol.md +41 -42
- package/src/skf-create-skill/references/batch-mode.md +81 -0
- package/src/skf-create-skill/references/ccc-index-check.md +27 -0
- package/src/skf-create-skill/references/compile.md +107 -29
- package/src/skf-create-skill/references/component-extraction.md +113 -91
- package/src/skf-create-skill/references/enrich.md +41 -23
- package/src/skf-create-skill/references/entry-points-by-hand.md +20 -0
- package/src/skf-create-skill/references/extract.md +200 -161
- package/src/skf-create-skill/references/extraction-patterns-by-hand.md +141 -0
- package/src/skf-create-skill/references/extraction-patterns-tracing.md +2 -2
- package/src/skf-create-skill/references/extraction-patterns.md +584 -196
- package/src/skf-create-skill/references/generate-artifacts.md +145 -93
- package/src/skf-create-skill/references/health-check.md +1 -1
- package/src/skf-create-skill/references/load-brief.md +53 -36
- package/src/skf-create-skill/references/relabel-rule.md +12 -0
- package/src/skf-create-skill/references/report.md +28 -59
- package/src/skf-create-skill/references/source-resolution-protocols.md +49 -155
- package/src/skf-create-skill/references/step-auto-shard.md +20 -93
- package/src/skf-create-skill/references/step-doc-rot.md +44 -60
- package/src/skf-create-skill/references/step-doc-sources.md +28 -19
- package/src/skf-create-skill/references/sub/ccc-discover.md +18 -7
- package/src/skf-create-skill/references/sub/fetch-docs.md +106 -59
- package/src/skf-create-skill/references/sub/fetch-temporal.md +53 -166
- package/src/skf-create-skill/references/tier-degradation-rules.md +18 -9
- package/src/skf-create-skill/references/validate.md +173 -99
- package/src/skf-create-skill/scripts/scan-doc-rot.py +232 -99
- package/src/skf-create-stack-skill/SKILL.md +29 -56
- package/src/skf-create-stack-skill/assets/metadata-contract.md +51 -0
- package/src/skf-create-stack-skill/assets/provenance-map-schema.md +15 -15
- package/src/skf-create-stack-skill/assets/stack-skill-template.md +23 -57
- package/src/skf-create-stack-skill/customize.toml +23 -12
- package/src/skf-create-stack-skill/references/compile-stack.md +57 -66
- package/src/skf-create-stack-skill/references/compose-mode-rules.md +24 -44
- package/src/skf-create-stack-skill/references/detect-integrations.md +92 -95
- package/src/skf-create-stack-skill/references/detect-manifests.md +46 -71
- package/src/skf-create-stack-skill/references/generate-output.md +138 -128
- package/src/skf-create-stack-skill/references/init.md +90 -32
- package/src/skf-create-stack-skill/references/integration-patterns.md +1 -17
- package/src/skf-create-stack-skill/references/invocation-contract.md +34 -0
- package/src/skf-create-stack-skill/references/manifest-patterns.md +32 -20
- package/src/skf-create-stack-skill/references/parallel-extract.md +112 -38
- package/src/skf-create-stack-skill/references/rank-and-confirm.md +57 -75
- package/src/skf-create-stack-skill/references/report.md +39 -33
- package/src/skf-create-stack-skill/references/validate.md +20 -39
- package/src/skf-drop-skill/SKILL.md +28 -51
- package/src/skf-drop-skill/customize.toml +44 -30
- package/src/skf-drop-skill/references/execute.md +79 -146
- package/src/skf-drop-skill/references/invocation-contract.md +64 -0
- package/src/skf-drop-skill/references/report.md +46 -30
- package/src/skf-drop-skill/references/select.md +118 -124
- package/src/skf-drop-skill/scripts/dir-sizes.py +54 -26
- package/src/skf-drop-skill/scripts/drop-roster.py +322 -0
- package/src/skf-export-skill/SKILL.md +40 -62
- package/src/skf-export-skill/assets/managed-section-format.md +14 -50
- package/src/skf-export-skill/assets/snippet-format.md +3 -1
- package/src/skf-export-skill/customize.toml +42 -13
- package/src/skf-export-skill/references/generate-snippet.md +54 -46
- package/src/skf-export-skill/references/health-check.md +2 -0
- package/src/skf-export-skill/references/invocation-contract.md +15 -0
- package/src/skf-export-skill/references/load-skill.md +88 -62
- package/src/skf-export-skill/references/manifest-rebuild.md +9 -10
- package/src/skf-export-skill/references/multi-skill-mode.md +4 -4
- package/src/skf-export-skill/references/orphan-context-detection.md +13 -5
- package/src/skf-export-skill/references/orphan-row-detection.md +31 -22
- package/src/skf-export-skill/references/package.md +15 -73
- package/src/skf-export-skill/references/preflight-snippet-root-probe.md +51 -70
- package/src/skf-export-skill/references/result-envelope.md +31 -16
- package/src/skf-export-skill/references/summary.md +41 -17
- package/src/skf-export-skill/references/token-report.md +4 -12
- package/src/skf-export-skill/references/update-context.md +118 -237
- package/src/skf-forger/SKILL.md +61 -37
- package/src/skf-forger/bmad-skill-manifest.yaml +4 -1
- package/src/skf-forger/customize.toml +43 -0
- package/src/skf-forger/references/pipeline-mode.md +73 -18
- package/src/skf-forger/scripts/forge-status.py +299 -0
- package/src/skf-forger/scripts/parse-pipeline.py +322 -54
- package/src/skf-forger/scripts/pipeline-gate.py +428 -0
- package/src/skf-forger/scripts/pipeline-journal.py +1052 -0
- package/src/skf-quick-skill/SKILL.md +54 -53
- package/src/skf-quick-skill/assets/skill-template.md +4 -2
- package/src/skf-quick-skill/customize.toml +51 -20
- package/src/skf-quick-skill/references/batch-mode.md +74 -21
- package/src/skf-quick-skill/references/compile.md +30 -31
- package/src/skf-quick-skill/references/ecosystem-check.md +7 -57
- package/src/skf-quick-skill/references/finalize.md +69 -18
- package/src/skf-quick-skill/references/halt-contract.md +41 -29
- package/src/skf-quick-skill/references/health-check.md +5 -3
- package/src/skf-quick-skill/references/quick-extract.md +114 -45
- package/src/skf-quick-skill/references/registry-resolution.md +9 -64
- package/src/skf-quick-skill/references/resolve-target.md +116 -66
- package/src/skf-quick-skill/references/write-and-validate.md +79 -40
- package/src/skf-refine-architecture/SKILL.md +43 -53
- package/src/skf-refine-architecture/customize.toml +49 -20
- package/src/skf-refine-architecture/references/compile.md +97 -54
- package/src/skf-refine-architecture/references/exit-codes.md +30 -0
- package/src/skf-refine-architecture/references/finding-storage.md +21 -0
- package/src/skf-refine-architecture/references/gap-analysis.md +101 -38
- package/src/skf-refine-architecture/references/improvements.md +14 -20
- package/src/skf-refine-architecture/references/init.md +98 -57
- package/src/skf-refine-architecture/references/issue-detection.md +32 -39
- package/src/skf-refine-architecture/references/refinement-rules.md +37 -48
- package/src/skf-refine-architecture/references/report.md +65 -54
- package/src/skf-refine-architecture/scripts/skf-check-preservation.py +1619 -0
- package/src/skf-rename-skill/SKILL.md +19 -54
- package/src/skf-rename-skill/customize.toml +32 -26
- package/src/skf-rename-skill/references/execute.md +230 -184
- package/src/skf-rename-skill/references/exit-codes.md +7 -7
- package/src/skf-rename-skill/references/health-check.md +1 -7
- package/src/skf-rename-skill/references/invocation-contract.md +25 -0
- package/src/skf-rename-skill/references/report.md +63 -52
- package/src/skf-rename-skill/references/select.md +197 -115
- package/src/skf-rename-skill/scripts/skf-validate-rename-name.py +161 -21
- package/src/skf-setup/SKILL.md +26 -26
- package/src/skf-setup/customize.toml +14 -10
- package/src/skf-setup/references/auto-index.md +50 -63
- package/src/skf-setup/references/ccc-index.md +29 -90
- package/src/skf-setup/references/detect-and-tier.md +58 -67
- package/src/skf-setup/references/health-check.md +2 -0
- package/src/skf-setup/references/invocation-contract.md +14 -0
- package/src/skf-setup/references/report.md +43 -166
- package/src/skf-setup/references/tier-rules.md +5 -5
- package/src/skf-setup/references/write-config.md +34 -57
- package/src/skf-test-skill/SKILL.md +17 -57
- package/src/skf-test-skill/assets/output-section-formats.md +33 -34
- package/src/skf-test-skill/customize.toml +27 -13
- package/src/skf-test-skill/references/coherence-check.md +134 -62
- package/src/skf-test-skill/references/coverage-check-tiers.md +35 -0
- package/src/skf-test-skill/references/coverage-check.md +217 -254
- package/src/skf-test-skill/references/detect-mode.md +5 -5
- package/src/skf-test-skill/references/external-validators.md +94 -82
- package/src/skf-test-skill/references/health-check.md +6 -7
- package/src/skf-test-skill/references/init.md +163 -88
- package/src/skf-test-skill/references/invocation-contract.md +66 -0
- package/src/skf-test-skill/references/migration-section-rules.md +5 -2
- package/src/skf-test-skill/references/report.md +162 -142
- package/src/skf-test-skill/references/score.md +80 -107
- package/src/skf-test-skill/references/scoring-rules.md +41 -155
- package/src/skf-test-skill/references/source-access-protocol.md +19 -92
- package/src/skf-test-skill/references/step-hard-gate.md +51 -33
- package/src/skf-test-skill/scripts/aggregate-coherence.py +218 -30
- package/src/skf-test-skill/scripts/build-result-context.py +287 -0
- package/src/skf-test-skill/scripts/check-metadata-coherence.py +37 -4
- package/src/skf-test-skill/scripts/combine-external-scores.py +23 -6
- package/src/skf-test-skill/scripts/compute-score.py +223 -45
- package/src/skf-test-skill/scripts/gap-ledger.py +1381 -0
- package/src/skf-test-skill/scripts/hard-gate.py +203 -0
- package/src/skf-test-skill/scripts/load-coverage-inputs.py +760 -0
- package/src/skf-test-skill/scripts/locate-export-segments.py +835 -0
- package/src/skf-test-skill/scripts/reconcile-coverage.py +273 -79
- package/src/skf-test-skill/scripts/score-signatures.py +459 -0
- package/src/skf-test-skill/scripts/stage-helper-payload.py +148 -0
- package/src/skf-test-skill/scripts/validate-inventory.py +311 -16
- package/src/skf-test-skill/scripts/verify-declared-numerator.py +127 -52
- package/src/skf-test-skill/templates/test-report-template.md +21 -15
- package/src/skf-update-skill/SKILL.md +38 -25
- package/src/skf-update-skill/customize.toml +27 -12
- package/src/skf-update-skill/references/detect-changes.md +233 -222
- package/src/skf-update-skill/references/gap-driven.md +336 -0
- package/src/skf-update-skill/references/health-check.md +31 -5
- package/src/skf-update-skill/references/init.md +250 -84
- package/src/skf-update-skill/references/invocation-contract.md +12 -0
- package/src/skf-update-skill/references/manual-section-rules.md +6 -23
- package/src/skf-update-skill/references/merge.md +180 -47
- package/src/skf-update-skill/references/re-extract.md +53 -262
- package/src/skf-update-skill/references/report.md +100 -35
- package/src/skf-update-skill/references/write.md +331 -149
- package/src/skf-update-skill/scripts/skf-new-file-diff.py +29 -7
- package/src/skf-verify-stack/SKILL.md +23 -42
- package/src/skf-verify-stack/assets/feasibility-report-template.md +11 -5
- package/src/skf-verify-stack/customize.toml +55 -22
- package/src/skf-verify-stack/references/coverage-patterns.md +17 -8
- package/src/skf-verify-stack/references/coverage.md +67 -64
- package/src/skf-verify-stack/references/exit-codes.md +21 -8
- package/src/skf-verify-stack/references/init.md +107 -62
- package/src/skf-verify-stack/references/integration-verification-rules.md +12 -13
- package/src/skf-verify-stack/references/integrations.md +106 -65
- package/src/skf-verify-stack/references/report.md +59 -42
- package/src/skf-verify-stack/references/requirements.md +32 -9
- package/src/skf-verify-stack/references/synthesize.md +53 -39
- package/src/skf-verify-stack/scripts/skf-coverage-tally.py +398 -52
- package/src/skf-verify-stack/scripts/skf-previous-report.py +330 -0
- package/src/skf-verify-stack/scripts/skf-report-delta.py +453 -49
- package/src/skf-verify-stack/scripts/skf-verdict-rollup.py +240 -27
- package/tools/cli/commands/install.js +11 -4
- package/tools/cli/commands/status.js +15 -3
- package/tools/cli/commands/update.js +11 -4
- package/tools/cli/lib/tool-check.js +320 -0
- package/tools/cli/lib/version-check.js +22 -9
- package/tools/cli/skf-cli.js +4 -1
- package/.gitattributes +0 -16
- package/.nvmrc +0 -1
- package/docs/_internal/RELEASING.md +0 -679
- package/release-audits/v1.0.0-launch-audit.md +0 -728
- package/src/skf-audit-skill/references/step-doc-drift.md +0 -177
- package/src/skf-brief-skill/references/headless-source-authority-detection.md +0 -26
- package/src/skf-campaign/manifest.yaml +0 -15
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +0 -106
- package/src/skf-create-skill/references/ecosystem-check.md +0 -74
- package/src/skf-drop-skill/references/headless-contract.md +0 -18
- package/src/skf-update-skill/references/merge-conflict-rules.md +0 -15
- package/src/skf-update-skill/references/remote-source-resolution.md +0 -98
- package/src/skf-update-skill/references/validate.md +0 -124
- package/tools/validate-docs-drift.js +0 -233
- package/tools/validate-docs-links.js +0 -665
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/armelhbobdad/bmad-module-skill-forge/src/shared/scripts/schemas/skf-quick-skill-result-envelope.v1.json",
|
|
4
|
+
"title": "SKF_QUICK_SKILL_RESULT_JSON envelope (v1)",
|
|
5
|
+
"description": "Single-line JSON document skf-quick-skill prints, prefixed with the literal 'SKF_QUICK_SKILL_RESULT_JSON: ': on stdout when a run finishes (step 6, finalize), and on stderr at every HARD HALT. The shared emitter (skf-emit-result-envelope.py) builds both from a staged payload, so pipelines branch on status, exit_code and halt_reason without parsing the human-readable output. A --batch run prints one per target.",
|
|
6
|
+
"$defs": {
|
|
7
|
+
"skf-envelope": {
|
|
8
|
+
"description": "The shared emitter's settings for this workflow, read by skf-emit-result-envelope.py: the workflow, the line's prefix, the wrapper, the status a halt carries, the exit code of each halt_reason and the result file stem. Nothing in the schema references this entry, so it constrains no envelope.",
|
|
9
|
+
"const": {
|
|
10
|
+
"workflow": "skf-quick-skill",
|
|
11
|
+
"prefix": "SKF_QUICK_SKILL_RESULT_JSON",
|
|
12
|
+
"wrapper": null,
|
|
13
|
+
"halt_status": "error",
|
|
14
|
+
"exit_codes": {
|
|
15
|
+
"input-invalid": 2,
|
|
16
|
+
"resolution-failure": 3,
|
|
17
|
+
"write-failure": 4,
|
|
18
|
+
"overwrite-cancelled": 5,
|
|
19
|
+
"user-cancelled": 6,
|
|
20
|
+
"finalize-blocked": 7,
|
|
21
|
+
"ecosystem-redirect": 8,
|
|
22
|
+
"not-skf-output": 9,
|
|
23
|
+
"flat-layout": 9
|
|
24
|
+
},
|
|
25
|
+
"success_exit_code": 0,
|
|
26
|
+
"result_file": "quick-skill-result"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"type": "object",
|
|
31
|
+
"additionalProperties": false,
|
|
32
|
+
"required": [
|
|
33
|
+
"status",
|
|
34
|
+
"exit_code",
|
|
35
|
+
"phase",
|
|
36
|
+
"halt_reason",
|
|
37
|
+
"error",
|
|
38
|
+
"outputs",
|
|
39
|
+
"summary",
|
|
40
|
+
"skill_package",
|
|
41
|
+
"timestamp",
|
|
42
|
+
"run_id",
|
|
43
|
+
"result_path",
|
|
44
|
+
"headless_decisions",
|
|
45
|
+
"warnings"
|
|
46
|
+
],
|
|
47
|
+
"properties": {
|
|
48
|
+
"status": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"enum": ["success", "error"],
|
|
51
|
+
"description": "'success' when step 6 finished the run, 'error' at every HARD HALT."
|
|
52
|
+
},
|
|
53
|
+
"exit_code": {
|
|
54
|
+
"type": "integer",
|
|
55
|
+
"enum": [0, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
56
|
+
"description": "The exit code of the halt-contract.md table, derived from halt_reason: null gives 0, input-invalid 2, resolution-failure 3, write-failure 4, overwrite-cancelled 5, user-cancelled 6, finalize-blocked 7, ecosystem-redirect 8, not-skf-output and flat-layout 9."
|
|
57
|
+
},
|
|
58
|
+
"phase": {
|
|
59
|
+
"type": ["string", "null"],
|
|
60
|
+
"minLength": 1,
|
|
61
|
+
"description": "The step slug where the HARD HALT fired (resolve-target, ecosystem-check, quick-extract, compile, write-and-validate or finalize), on-activation for a halt before the run starts (SKILL.md On Activation, or batch mode's refusal of --description and --exports), or batch-mode for a batch that cannot start (batch mode section 1). Null on success."
|
|
62
|
+
},
|
|
63
|
+
"halt_reason": {
|
|
64
|
+
"type": ["string", "null"],
|
|
65
|
+
"enum": [
|
|
66
|
+
null,
|
|
67
|
+
"input-invalid",
|
|
68
|
+
"resolution-failure",
|
|
69
|
+
"write-failure",
|
|
70
|
+
"overwrite-cancelled",
|
|
71
|
+
"user-cancelled",
|
|
72
|
+
"finalize-blocked",
|
|
73
|
+
"ecosystem-redirect",
|
|
74
|
+
"not-skf-output",
|
|
75
|
+
"flat-layout"
|
|
76
|
+
],
|
|
77
|
+
"description": "Null on success. The failure class of a HARD HALT, the same value as error.code: pipelines branch on it without grepping the message."
|
|
78
|
+
},
|
|
79
|
+
"error": {
|
|
80
|
+
"oneOf": [
|
|
81
|
+
{ "type": "null" },
|
|
82
|
+
{
|
|
83
|
+
"type": "object",
|
|
84
|
+
"additionalProperties": false,
|
|
85
|
+
"required": ["code", "message"],
|
|
86
|
+
"properties": {
|
|
87
|
+
"code": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"enum": [
|
|
90
|
+
"input-invalid",
|
|
91
|
+
"resolution-failure",
|
|
92
|
+
"write-failure",
|
|
93
|
+
"overwrite-cancelled",
|
|
94
|
+
"user-cancelled",
|
|
95
|
+
"finalize-blocked",
|
|
96
|
+
"ecosystem-redirect",
|
|
97
|
+
"not-skf-output",
|
|
98
|
+
"flat-layout"
|
|
99
|
+
],
|
|
100
|
+
"description": "The halt_reason."
|
|
101
|
+
},
|
|
102
|
+
"message": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"minLength": 1,
|
|
105
|
+
"description": "The halt's reason, the one-line form of the message the step displayed."
|
|
106
|
+
},
|
|
107
|
+
"details": {
|
|
108
|
+
"description": "Optional phase-specific context, for example the folder the ownership halt refused (details.folder) or the file a failed write named (details.failed_path)."
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
"description": "Null on success. The failure of a HARD HALT."
|
|
114
|
+
},
|
|
115
|
+
"outputs": {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"default": {},
|
|
118
|
+
"additionalProperties": false,
|
|
119
|
+
"properties": {
|
|
120
|
+
"skill_md": { "type": "string", "minLength": 1, "description": "Path of {skill_package}/SKILL.md." },
|
|
121
|
+
"context_snippet": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"minLength": 1,
|
|
124
|
+
"description": "Path of {skill_package}/context-snippet.md; absent under --skip-snippet."
|
|
125
|
+
},
|
|
126
|
+
"metadata": { "type": "string", "minLength": 1, "description": "Path of {skill_package}/metadata.json." },
|
|
127
|
+
"active_pointer": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"minLength": 1,
|
|
130
|
+
"description": "Path of the {skill_group}/active pointer the run flipped; absent when it was skipped."
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"description": "The files the run wrote, by kind. Empty at a HARD HALT before step 5 writes; a later halt lists what was already on disk."
|
|
134
|
+
},
|
|
135
|
+
"summary": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"default": {},
|
|
138
|
+
"additionalProperties": false,
|
|
139
|
+
"properties": {
|
|
140
|
+
"skill_name": { "type": "string", "minLength": 1, "description": "The name the skill was written under ({repo_name})." },
|
|
141
|
+
"version": { "type": "string", "minLength": 1, "description": "The version folder the run wrote." },
|
|
142
|
+
"language": { "type": "string", "minLength": 1, "description": "The primary language the run compiled." },
|
|
143
|
+
"exports_documented": { "type": "integer", "minimum": 0, "description": "The exports the compiled SKILL.md documents." },
|
|
144
|
+
"quality_score": {
|
|
145
|
+
"type": ["number", "null"],
|
|
146
|
+
"minimum": 0,
|
|
147
|
+
"description": "skill-check's quality score (0 to 100) of the written package, from step 5. Null when skill-check did not run. It is the score every workflow's skill-check pass computes, not a test-skill score."
|
|
148
|
+
},
|
|
149
|
+
"confidence": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"enum": ["high", "medium", "low"],
|
|
152
|
+
"description": "The extraction confidence step 3 recorded."
|
|
153
|
+
},
|
|
154
|
+
"repo_shape": {
|
|
155
|
+
"type": ["string", "null"],
|
|
156
|
+
"enum": [null, "library", "skills-module", "awesome-list", "docs-site", "examples-only"],
|
|
157
|
+
"description": "The repository shape step 3 recorded, null when it recorded none (a plain library)."
|
|
158
|
+
},
|
|
159
|
+
"language_resolution": {
|
|
160
|
+
"type": ["string", "null"],
|
|
161
|
+
"enum": [null, "hint", "detected", "auto-picked-first", "user-confirmed"],
|
|
162
|
+
"description": "How step 1 chose the language: from a language hint, detected with no competing manifest, the first of several manifests picked by a headless run, or confirmed by the user at the multi-language gate."
|
|
163
|
+
},
|
|
164
|
+
"detected_languages": {
|
|
165
|
+
"type": "array",
|
|
166
|
+
"items": { "type": "string", "minLength": 1 },
|
|
167
|
+
"description": "Every manifest language step 1 detected, in priority order."
|
|
168
|
+
},
|
|
169
|
+
"zero_exports_rescue": {
|
|
170
|
+
"type": ["string", "null"],
|
|
171
|
+
"enum": [null, "user-accepted", "auto-proceeded"],
|
|
172
|
+
"description": "Set when step 3 found no export and no README description and the run went on anyway: a user choice or a headless default."
|
|
173
|
+
},
|
|
174
|
+
"active_pointer": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"enum": ["symlink", "junction", "skipped-no-active-pointer", "skipped-helper-missing"],
|
|
177
|
+
"description": "The kind of {skill_group}/active pointer step 6 flipped, or why it flipped none."
|
|
178
|
+
},
|
|
179
|
+
"validation_issues": {
|
|
180
|
+
"type": "object",
|
|
181
|
+
"additionalProperties": false,
|
|
182
|
+
"required": ["skill_md", "context_snippet", "metadata", "security"],
|
|
183
|
+
"properties": {
|
|
184
|
+
"skill_md": { "type": "integer", "minimum": 0 },
|
|
185
|
+
"context_snippet": { "type": "integer", "minimum": 0 },
|
|
186
|
+
"metadata": { "type": "integer", "minimum": 0 },
|
|
187
|
+
"security": { "type": "integer", "minimum": 0 }
|
|
188
|
+
},
|
|
189
|
+
"description": "The advisory issues step 5's validators returned for each heading of its validation report: skill_md (skill-check's diagnostics, or the frontmatter validator's issues without it, plus the body checks), context_snippet, metadata and security (skill-check's security findings). Auto-fixed issues count nothing, and a check that did not run counts 0."
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
"description": "Empty at a HARD HALT. On success, the run's facts a pipeline branches on."
|
|
193
|
+
},
|
|
194
|
+
"skill_package": {
|
|
195
|
+
"type": ["string", "null"],
|
|
196
|
+
"description": "Absolute path of {skill_package} once step 5 computed it; null before, and at the step 5 ownership halt (the refused folder is in error.details.folder)."
|
|
197
|
+
},
|
|
198
|
+
"timestamp": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"minLength": 1,
|
|
201
|
+
"description": "ISO-8601 UTC time the emitter stamped from the clock."
|
|
202
|
+
},
|
|
203
|
+
"run_id": {
|
|
204
|
+
"type": ["string", "null"],
|
|
205
|
+
"description": "The run folder's id, stamped by the emitter; a --batch target's is the batch run's id and the target's number."
|
|
206
|
+
},
|
|
207
|
+
"result_path": {
|
|
208
|
+
"type": ["string", "null"],
|
|
209
|
+
"description": "The per-run result file this envelope's call wrote under {skill_package}, or null when it wrote none (every halt before metadata.json exists)."
|
|
210
|
+
},
|
|
211
|
+
"headless_decisions": {
|
|
212
|
+
"type": "array",
|
|
213
|
+
"items": {
|
|
214
|
+
"type": "object",
|
|
215
|
+
"additionalProperties": false,
|
|
216
|
+
"required": ["gate", "default_action", "taken_action", "reason"],
|
|
217
|
+
"properties": {
|
|
218
|
+
"gate": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"enum": [
|
|
221
|
+
"resolve-target.ambiguous-package",
|
|
222
|
+
"resolve-target.multi-language",
|
|
223
|
+
"ecosystem-check.ecosystem-match",
|
|
224
|
+
"quick-extract.repo-shape",
|
|
225
|
+
"quick-extract.zero-exports",
|
|
226
|
+
"compile.review",
|
|
227
|
+
"write-and-validate.overwrite"
|
|
228
|
+
],
|
|
229
|
+
"description": "The gate that resolved without a person, named after its step and the gate the step file labels."
|
|
230
|
+
},
|
|
231
|
+
"default_action": {
|
|
232
|
+
"type": "string",
|
|
233
|
+
"minLength": 1,
|
|
234
|
+
"description": "The gate's documented default (for example 'C' or 'Y')."
|
|
235
|
+
},
|
|
236
|
+
"taken_action": {
|
|
237
|
+
"type": "string",
|
|
238
|
+
"minLength": 1,
|
|
239
|
+
"description": "The action the run took."
|
|
240
|
+
},
|
|
241
|
+
"reason": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"minLength": 1,
|
|
244
|
+
"description": "Why, for example 'headless: no user to prompt'."
|
|
245
|
+
},
|
|
246
|
+
"evidence": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"additionalProperties": true,
|
|
249
|
+
"description": "Optional gate-specific data, such as the detected languages or the package that was overwritten."
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
"description": "One entry per gate that resolved on its own during this run, recorded in the run folder's sink the moment it decided. Empty for an interactive run."
|
|
254
|
+
},
|
|
255
|
+
"warnings": {
|
|
256
|
+
"type": "array",
|
|
257
|
+
"items": { "type": "string", "minLength": 1 },
|
|
258
|
+
"description": "Non-fatal anomalies, one string each, such as also_found_in (a package name another registry also holds, kept at the first registry's pick) or customization_resolver_unavailable. Empty when none."
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/armelhbobdad/bmad-module-skill-forge/src/shared/scripts/schemas/skf-refine-architecture-result-envelope.v1.json",
|
|
4
|
+
"title": "SKF_REFINE_ARCHITECTURE_RESULT_JSON envelope (v1)",
|
|
5
|
+
"description": "Single-line JSON document skf-refine-architecture emits when {headless_mode} is true, prefixed with the literal 'SKF_REFINE_ARCHITECTURE_RESULT_JSON: ': once on stdout when step 6 (report) writes the result contract, after step 5's review promoted the refined document, and once on stderr at every HARD HALT (status error). The shared emitter, skf-emit-result-envelope.py, builds every line from the payload a stage stages in the run folder, folds in the auto-decisions and warnings the run recorded there, derives exit_code from halt_reason, stamps run_id and result_path, and checks the line against this schema, so the model never types it. The skill's references/exit-codes.md lists the exit codes and the stage files hold the halt command.",
|
|
6
|
+
"$defs": {
|
|
7
|
+
"skf-envelope": {
|
|
8
|
+
"description": "The shared emitter's settings for this workflow, read by skf-emit-result-envelope.py: the workflow, the line's prefix, the wrapper, the status a halt carries, the exit code of each halt_reason and the result file stem. Nothing in the schema references this entry, so it constrains no envelope.",
|
|
9
|
+
"const": {
|
|
10
|
+
"workflow": "skf-refine-architecture",
|
|
11
|
+
"prefix": "SKF_REFINE_ARCHITECTURE_RESULT_JSON",
|
|
12
|
+
"wrapper": null,
|
|
13
|
+
"halt_status": "error",
|
|
14
|
+
"exit_codes": {
|
|
15
|
+
"input-missing": 2,
|
|
16
|
+
"input-invalid": 2,
|
|
17
|
+
"output-folder-unconfigured": 3,
|
|
18
|
+
"forge-folder-unconfigured": 3,
|
|
19
|
+
"resolution-failure": 3,
|
|
20
|
+
"write-failed": 4,
|
|
21
|
+
"preservation-failed": 4,
|
|
22
|
+
"insufficient-skills": 5,
|
|
23
|
+
"user-cancelled": 6,
|
|
24
|
+
"inventory-unreliable": 7,
|
|
25
|
+
"recovery-failed": 8
|
|
26
|
+
},
|
|
27
|
+
"success_exit_code": 0,
|
|
28
|
+
"result_file": "refine-architecture-result"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"type": "object",
|
|
33
|
+
"additionalProperties": false,
|
|
34
|
+
"required": [
|
|
35
|
+
"status",
|
|
36
|
+
"refined_path",
|
|
37
|
+
"previous_refined_path",
|
|
38
|
+
"previous_pass",
|
|
39
|
+
"gap_count",
|
|
40
|
+
"issue_count",
|
|
41
|
+
"improvement_count",
|
|
42
|
+
"unverified_count",
|
|
43
|
+
"exit_code",
|
|
44
|
+
"halt_reason",
|
|
45
|
+
"run_id",
|
|
46
|
+
"result_path"
|
|
47
|
+
],
|
|
48
|
+
"properties": {
|
|
49
|
+
"status": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"enum": ["success", "error"],
|
|
52
|
+
"description": "'success' when the review approved the draft, the preservation check passed and the refined document was promoted to its output path. 'error' on any HARD HALT."
|
|
53
|
+
},
|
|
54
|
+
"refined_path": {
|
|
55
|
+
"type": ["string", "null"],
|
|
56
|
+
"minLength": 1,
|
|
57
|
+
"default": null,
|
|
58
|
+
"description": "The refined document, refined-architecture-<arch_project_name>.md in the output folder. Null on a halt before the review's [C] promoted the draft: a halt or a cancel before then leaves the output path as it was."
|
|
59
|
+
},
|
|
60
|
+
"previous_refined_path": {
|
|
61
|
+
"type": ["string", "null"],
|
|
62
|
+
"minLength": 1,
|
|
63
|
+
"default": null,
|
|
64
|
+
"description": "Where the earlier refined document went: the review's [C] renames a file already at the output path to refined-architecture-<arch_project_name>-<YYYYMMDD-HHmmss>.md (the run's timestamp, with -2, -3 ... when that name is taken) before it promotes the draft, so it is never overwritten. Null when there was none, and on a halt before the promotion."
|
|
65
|
+
},
|
|
66
|
+
"previous_pass": {
|
|
67
|
+
"type": "boolean",
|
|
68
|
+
"default": false,
|
|
69
|
+
"description": "True when the architecture document held an earlier Refine Architecture pass (RA's marked blocks, the unmarked annotations of an older pass with their Refinement Summary, or a refined-architecture-*.md file): the run set those annotations aside, analyzed the rest and replaced them with one current set."
|
|
70
|
+
},
|
|
71
|
+
"gap_count": {
|
|
72
|
+
"type": "integer",
|
|
73
|
+
"minimum": 0,
|
|
74
|
+
"default": 0,
|
|
75
|
+
"description": "Gap-fill subsections in the refined document, counted by the preservation script from the insertion plan it applied. 0 on a halt."
|
|
76
|
+
},
|
|
77
|
+
"issue_count": {
|
|
78
|
+
"type": "integer",
|
|
79
|
+
"minimum": 0,
|
|
80
|
+
"default": 0,
|
|
81
|
+
"description": "Issue annotations in the refined document, counted from the insertion plan. 0 on a halt."
|
|
82
|
+
},
|
|
83
|
+
"improvement_count": {
|
|
84
|
+
"type": "integer",
|
|
85
|
+
"minimum": 0,
|
|
86
|
+
"default": 0,
|
|
87
|
+
"description": "Improvement suggestions in the refined document, counted from the insertion plan. 0 on a halt."
|
|
88
|
+
},
|
|
89
|
+
"unverified_count": {
|
|
90
|
+
"type": "integer",
|
|
91
|
+
"minimum": 0,
|
|
92
|
+
"default": 0,
|
|
93
|
+
"description": "Technologies the architecture document names that no skill covers, so nothing checked what it says about them (the Refinement Summary's Not verified (no skill) row), counted from the insertion plan. 0 on a halt."
|
|
94
|
+
},
|
|
95
|
+
"exit_code": {
|
|
96
|
+
"type": "integer",
|
|
97
|
+
"enum": [0, 2, 3, 4, 5, 6, 7, 8],
|
|
98
|
+
"description": "Process exit code matching the skill's references/exit-codes.md table, derived from halt_reason: null gives 0, input-missing and input-invalid 2, output-folder-unconfigured, forge-folder-unconfigured and resolution-failure 3, write-failed and preservation-failed 4, insufficient-skills 5, user-cancelled 6, inventory-unreliable 7, recovery-failed 8."
|
|
99
|
+
},
|
|
100
|
+
"halt_reason": {
|
|
101
|
+
"type": ["string", "null"],
|
|
102
|
+
"enum": [
|
|
103
|
+
null,
|
|
104
|
+
"input-missing",
|
|
105
|
+
"input-invalid",
|
|
106
|
+
"output-folder-unconfigured",
|
|
107
|
+
"forge-folder-unconfigured",
|
|
108
|
+
"resolution-failure",
|
|
109
|
+
"write-failed",
|
|
110
|
+
"preservation-failed",
|
|
111
|
+
"insufficient-skills",
|
|
112
|
+
"user-cancelled",
|
|
113
|
+
"inventory-unreliable",
|
|
114
|
+
"recovery-failed"
|
|
115
|
+
],
|
|
116
|
+
"description": "Null on success. One of the documented HALT classes on error, so a pipeline branches on the failure class without parsing the prose message. preservation-failed: the draft would not keep every line of the original architecture document, so it was not promoted."
|
|
117
|
+
},
|
|
118
|
+
"run_id": {
|
|
119
|
+
"type": ["string", "null"],
|
|
120
|
+
"minLength": 1,
|
|
121
|
+
"description": "The run's id, stamped by the emitter from the run folder name: the run's activation timestamp (YYYYMMDD-HHmmss, UTC). Null for a halt before the run folder exists."
|
|
122
|
+
},
|
|
123
|
+
"result_path": {
|
|
124
|
+
"type": ["string", "null"],
|
|
125
|
+
"minLength": 1,
|
|
126
|
+
"description": "The per-run result file the emitter wrote in the output folder, refine-architecture-result-<YYYYMMDD-HHmmss>.json (UTC), beside its refine-architecture-result-latest.json copy. Stamped by the emitter, never typed; step 6 passes it to the on_complete hook. Null on every halt, which writes no result file, and when the write failed (warnings say why)."
|
|
127
|
+
},
|
|
128
|
+
"headless_decisions": {
|
|
129
|
+
"type": "array",
|
|
130
|
+
"items": {
|
|
131
|
+
"type": "object",
|
|
132
|
+
"additionalProperties": false,
|
|
133
|
+
"required": ["gate", "default_action", "taken_action", "reason"],
|
|
134
|
+
"properties": {
|
|
135
|
+
"gate": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"enum": ["init.vs-report", "init.vs-report-unreadable", "gap-analysis.scope", "compile.review"],
|
|
138
|
+
"description": "The gate that auto-resolved: init.vs-report (step 1 answered the [VS] report question with its default, the report the probe found or none), init.vs-report-unreadable (step 1 could not read the --vs-report-path it was given and probed for the report instead), gap-analysis.scope (step 2 kept the derived document scope), compile.review (step 5 approved the draft). The gate records its decision in the run sink the moment it decides."
|
|
139
|
+
},
|
|
140
|
+
"default_action": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"minLength": 1,
|
|
143
|
+
"description": "The action documented as the gate's default, such as 'C' for [C] continue or 'use-found-report'."
|
|
144
|
+
},
|
|
145
|
+
"taken_action": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"minLength": 1,
|
|
148
|
+
"description": "The action the run took. In a headless run it equals default_action."
|
|
149
|
+
},
|
|
150
|
+
"reason": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"minLength": 1,
|
|
153
|
+
"description": "Human-readable rationale, the line the gate logged, such as 'headless: auto-approve compiled architecture'."
|
|
154
|
+
},
|
|
155
|
+
"evidence": {
|
|
156
|
+
"type": "object",
|
|
157
|
+
"additionalProperties": true,
|
|
158
|
+
"description": "Optional gate-specific data, such as the report a headless run used or the in-scope and out-of-scope skills it kept."
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"description": "Optional. One entry per gate that auto-resolved during the run, read from the run sink, so a halt reports the decisions taken before it. Present only when there is at least one."
|
|
163
|
+
},
|
|
164
|
+
"warnings": {
|
|
165
|
+
"type": "array",
|
|
166
|
+
"items": { "type": "string", "minLength": 1 },
|
|
167
|
+
"description": "Optional. Non-fatal anomalies the run recorded in its sink or the emitter raised, one string each, starting with its code: malformed_ra_markers when the document holds an RA marker without its pair (left in place as ordinary text), legacy_blocks_set_aside when an older pass left unmarked RA blocks, which run to the next heading and were set aside unchecked (it names their lines, so a user paragraph inside one is not silently counted as preserved), unknown_scope_skills when --scope-skills names a skill that is not in the inventory, scope_fallback_all_skills when --scope-skills or the document names no inventory skill and every skill is analyzed, out_of_scope_skills when the run's scope left inventory skills out (it counts and names them, so a run scoped with --scope-skills still says what it did not check), customization_resolver_unavailable when the team and user overrides were not applied, and result_file_write_failed when the emitter could not write a result file. Present only when there is at least one."
|
|
168
|
+
},
|
|
169
|
+
"error": {
|
|
170
|
+
"type": "object",
|
|
171
|
+
"additionalProperties": false,
|
|
172
|
+
"required": ["phase", "reason"],
|
|
173
|
+
"properties": {
|
|
174
|
+
"phase": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"minLength": 1,
|
|
177
|
+
"description": "Where the run halted: the step and gate, for example 'init:vs-report' or 'compile:promote'."
|
|
178
|
+
},
|
|
179
|
+
"reason": {
|
|
180
|
+
"type": "string",
|
|
181
|
+
"minLength": 1,
|
|
182
|
+
"description": "The halt message the step displayed, on one line."
|
|
183
|
+
},
|
|
184
|
+
"path": {
|
|
185
|
+
"type": "string",
|
|
186
|
+
"description": "Optional path the failed operation targeted."
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"description": "Present on a HARD HALT only: where the run stopped and why. Pipelines branch on halt_reason and read error for the diagnostic."
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/armelhbobdad/bmad-module-skill-forge/src/shared/scripts/schemas/skf-rename-skill-result-envelope.v1.json",
|
|
4
|
+
"title": "SKF_RENAME_SKILL_RESULT_JSON envelope (v1)",
|
|
5
|
+
"description": "Single-line JSON document skf-rename-skill emits when {headless_mode} is true, prefixed with the literal 'SKF_RENAME_SKILL_RESULT_JSON: ': on stdout when a rename finishes (step 3, report) and at the --dry-run exit (step 1, select), and on stderr at every HARD HALT. The shared emitter (skf-emit-result-envelope.py) builds every line from a staged payload and checks it against this schema, so pipelines branch on status, halt_reason and exit_code without grepping message text.",
|
|
6
|
+
"$defs": {
|
|
7
|
+
"skf-envelope": {
|
|
8
|
+
"description": "The shared emitter's settings for this workflow, read by skf-emit-result-envelope.py: the workflow, the line's prefix, the status a halt carries, the exit code of each halt_reason and the result file stem. Nothing in the schema references this entry, so it constrains no envelope.",
|
|
9
|
+
"const": {
|
|
10
|
+
"workflow": "skf-rename-skill",
|
|
11
|
+
"prefix": "SKF_RENAME_SKILL_RESULT_JSON",
|
|
12
|
+
"wrapper": null,
|
|
13
|
+
"halt_status": "error",
|
|
14
|
+
"exit_codes": {
|
|
15
|
+
"input-missing": 2,
|
|
16
|
+
"input-invalid": 2,
|
|
17
|
+
"manifest-corrupt": 3,
|
|
18
|
+
"nothing-to-rename": 3,
|
|
19
|
+
"copy-failed": 4,
|
|
20
|
+
"write-failed": 4,
|
|
21
|
+
"manifest-write-failed": 4,
|
|
22
|
+
"not-skf-output": 5,
|
|
23
|
+
"flat-layout": 5,
|
|
24
|
+
"name-collision": 5,
|
|
25
|
+
"source-authority-blocked": 5,
|
|
26
|
+
"halted-for-concurrent-run": 5,
|
|
27
|
+
"verify-failed": 5,
|
|
28
|
+
"user-cancelled": 6
|
|
29
|
+
},
|
|
30
|
+
"success_exit_code": 0,
|
|
31
|
+
"result_file": "rename-skill-result"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"required": [
|
|
38
|
+
"status",
|
|
39
|
+
"old_name",
|
|
40
|
+
"new_name",
|
|
41
|
+
"versions_renamed",
|
|
42
|
+
"manifest_rekeyed",
|
|
43
|
+
"context_files_updated",
|
|
44
|
+
"exit_code",
|
|
45
|
+
"halt_reason",
|
|
46
|
+
"headless_decisions"
|
|
47
|
+
],
|
|
48
|
+
"properties": {
|
|
49
|
+
"status": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"enum": ["success", "error", "dry-run"],
|
|
52
|
+
"description": "'success' when the rename finished (step 3). 'dry-run' when --dry-run ended the run after the step 1 confirmation block, with nothing copied, re-keyed or deleted. 'error' on any HARD HALT, with halt_reason naming its class."
|
|
53
|
+
},
|
|
54
|
+
"old_name": {
|
|
55
|
+
"type": ["string", "null"],
|
|
56
|
+
"minLength": 1,
|
|
57
|
+
"description": "The skill being renamed. Null when the run halted before step 1 bound it."
|
|
58
|
+
},
|
|
59
|
+
"new_name": {
|
|
60
|
+
"type": ["string", "null"],
|
|
61
|
+
"minLength": 1,
|
|
62
|
+
"description": "The validated new name. Null when the run halted before step 1 bound it."
|
|
63
|
+
},
|
|
64
|
+
"versions_renamed": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": { "type": "string", "minLength": 1 },
|
|
67
|
+
"uniqueItems": true,
|
|
68
|
+
"description": "On success, the versions whose package step 2 renamed, as step 2 recorded them from its own moves: a version folder without a package is copied but not listed. On a dry run, the versions the rename would touch. Empty on a halt."
|
|
69
|
+
},
|
|
70
|
+
"manifest_rekeyed": {
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"description": "True when step 2 re-keyed the skill's export manifest entry to the new name. False on a dry run and on a halt."
|
|
73
|
+
},
|
|
74
|
+
"context_files_updated": {
|
|
75
|
+
"type": "array",
|
|
76
|
+
"items": { "type": "string", "minLength": 1 },
|
|
77
|
+
"description": "The context files (CLAUDE.md, AGENTS.md, .cursorrules and the like) whose SKF managed section step 2 rebuilt. The rebuild is best-effort and never halts; a file that failed is reported in the step 3 report and the result file, not here. Empty on a dry run and on a halt."
|
|
78
|
+
},
|
|
79
|
+
"exit_code": {
|
|
80
|
+
"type": "integer",
|
|
81
|
+
"enum": [0, 2, 3, 4, 5, 6],
|
|
82
|
+
"description": "Process exit code, derived by the emitter from halt_reason through $defs.skf-envelope.exit_codes (0 when halt_reason is null). references/exit-codes.md says where each code is raised."
|
|
83
|
+
},
|
|
84
|
+
"halt_reason": {
|
|
85
|
+
"type": ["string", "null"],
|
|
86
|
+
"enum": [
|
|
87
|
+
null,
|
|
88
|
+
"input-missing",
|
|
89
|
+
"input-invalid",
|
|
90
|
+
"manifest-corrupt",
|
|
91
|
+
"nothing-to-rename",
|
|
92
|
+
"not-skf-output",
|
|
93
|
+
"flat-layout",
|
|
94
|
+
"name-collision",
|
|
95
|
+
"source-authority-blocked",
|
|
96
|
+
"halted-for-concurrent-run",
|
|
97
|
+
"copy-failed",
|
|
98
|
+
"verify-failed",
|
|
99
|
+
"manifest-write-failed",
|
|
100
|
+
"write-failed",
|
|
101
|
+
"user-cancelled"
|
|
102
|
+
],
|
|
103
|
+
"description": "Null on success and on a dry run. One of the documented HALT classes otherwise. halted-for-concurrent-run fires while another rename of the same skill holds a fresh run lock (step 1), or when this run's lock went stale while it waited at a step 1 gate and another run may have taken it (step 2); error.reason names the run that holds the lock and when it goes stale, never a PID."
|
|
104
|
+
},
|
|
105
|
+
"headless_decisions": {
|
|
106
|
+
"type": "array",
|
|
107
|
+
"items": {
|
|
108
|
+
"type": "object",
|
|
109
|
+
"additionalProperties": false,
|
|
110
|
+
"required": ["gate", "default_action", "taken_action", "reason"],
|
|
111
|
+
"properties": {
|
|
112
|
+
"gate": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"enum": ["source-authority", "confirm-rename"],
|
|
115
|
+
"description": "The gate that auto-resolved: the step 1 source-authority warning or the step 1 confirmation gate. Matches the labels in the stage prose."
|
|
116
|
+
},
|
|
117
|
+
"default_action": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"minLength": 1,
|
|
120
|
+
"description": "The action documented as the gate's default."
|
|
121
|
+
},
|
|
122
|
+
"taken_action": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"minLength": 1,
|
|
125
|
+
"description": "The action the run took."
|
|
126
|
+
},
|
|
127
|
+
"reason": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"minLength": 1,
|
|
130
|
+
"description": "Why the gate resolved without a person, for example 'headless auto-confirm'."
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"description": "One entry per gate that auto-resolved under {headless_mode}, recorded in the run folder's sink the moment the gate decided, so a halt still reports the decisions taken before it. Empty in interactive runs."
|
|
135
|
+
},
|
|
136
|
+
"warnings": {
|
|
137
|
+
"type": "array",
|
|
138
|
+
"items": { "type": "string", "minLength": 1 },
|
|
139
|
+
"description": "Optional. Non-fatal anomalies the run recorded, one string each, such as run-lock-replaced (step 1 took over a stale run lock), run-lock-not-released (a halt could not release the run lock), result_file_write_failed or customization_resolver_unavailable. Present only when the run recorded at least one."
|
|
140
|
+
},
|
|
141
|
+
"run_id": {
|
|
142
|
+
"type": ["string", "null"],
|
|
143
|
+
"minLength": 1,
|
|
144
|
+
"description": "The run's id, the UTC time the run started and a random suffix. It names the run folder, {project-root}/_bmad-output/.skf-run/skf-rename-skill-<run_id>/, which a halt leaves in place with its staged payloads, and it ends the run lock's owner."
|
|
145
|
+
},
|
|
146
|
+
"result_path": {
|
|
147
|
+
"type": ["string", "null"],
|
|
148
|
+
"minLength": 1,
|
|
149
|
+
"description": "The per-run result file step 3 wrote, rename-skill-result-<YYYYMMDD-HHmmss>.json beside rename-skill-result-latest.json in the renamed skill's folder. Null on a dry run, on a halt and when the file could not be written."
|
|
150
|
+
},
|
|
151
|
+
"error": {
|
|
152
|
+
"oneOf": [
|
|
153
|
+
{ "type": "null" },
|
|
154
|
+
{
|
|
155
|
+
"type": "object",
|
|
156
|
+
"additionalProperties": false,
|
|
157
|
+
"required": ["phase", "reason"],
|
|
158
|
+
"properties": {
|
|
159
|
+
"phase": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"minLength": 1,
|
|
162
|
+
"description": "The step and operation that halted, for example 'select:concurrency-guard' or 'execute:copy'."
|
|
163
|
+
},
|
|
164
|
+
"reason": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"minLength": 1,
|
|
167
|
+
"description": "The message the halt displayed."
|
|
168
|
+
},
|
|
169
|
+
"path": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"description": "The path the halt names, when it names one: the lock file, the manifest or a folder."
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
"description": "Optional. Present on a halt: the phase, the message and the path the halt names. Absent on success and on a dry run."
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|