bmad-module-skill-forge 2.1.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 +51 -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 +14 -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 +117 -9
- package/src/shared/scripts/skf-detect-docs.py +892 -4
- 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 +215 -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 +17 -6
- 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 +55 -18
- package/src/skf-create-skill/references/sub/ccc-discover.md +18 -7
- package/src/skf-create-skill/references/sub/fetch-docs.md +106 -57
- 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 -89
- package/src/skf-setup/references/detect-and-tier.md +58 -66
- 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 -645
- 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
|
@@ -1,36 +1,31 @@
|
|
|
1
1
|
# /// script
|
|
2
|
-
# requires-python = ">=3.
|
|
2
|
+
# requires-python = ">=3.11"
|
|
3
3
|
# dependencies = []
|
|
4
4
|
# ///
|
|
5
|
-
"""SKF Emit Brief Result Envelope
|
|
5
|
+
"""SKF Emit Brief Result Envelope: skf-brief-skill's name for the shared emitter.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
(SKF_BRIEF_RESULT_JSON) is documented in
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
log can break if the model decides to rename a key, reorder properties,
|
|
15
|
-
or swap a null for an empty string. This script is the single source of
|
|
16
|
-
truth: it takes a context payload as JSON on stdin, derives the
|
|
17
|
-
exit_code from the halt_reason deterministically, validates the
|
|
18
|
-
assembled envelope against the JSON Schema at
|
|
19
|
-
`src/shared/scripts/schemas/skf-brief-result-envelope.v1.json`, and
|
|
20
|
-
emits the line in a fixed shape.
|
|
7
|
+
An alias of `skf-emit-result-envelope.py ... --workflow skf-brief-skill`,
|
|
8
|
+
kept so the brief step files that call it keep working. The envelope
|
|
9
|
+
contract (SKF_BRIEF_RESULT_JSON) is documented in the Result Contract
|
|
10
|
+
section of src/skf-brief-skill/references/invocation-contract.md; its
|
|
11
|
+
schema, `schemas/skf-brief-result-envelope.v1.json`, holds the whole contract,
|
|
12
|
+
including the halt_reason to exit_code mapping, and the shared emitter
|
|
13
|
+
enforces it. Nothing here restates it.
|
|
21
14
|
|
|
22
15
|
Subcommands:
|
|
23
16
|
|
|
24
|
-
emit Read context payload as JSON on stdin, derive exit_code
|
|
25
|
-
validate against the schema, emit the
|
|
17
|
+
emit Read the context payload as JSON on stdin, derive exit_code
|
|
18
|
+
from halt_reason, validate against the schema, emit the
|
|
26
19
|
`SKF_BRIEF_RESULT_JSON: {one-line JSON}` prefix line on
|
|
27
|
-
stdout (or stderr if --target=stderr).
|
|
20
|
+
stdout (or stderr if --target=stderr). Same as
|
|
21
|
+
`skf-emit-result-envelope.py emit --workflow skf-brief-skill`,
|
|
22
|
+
except that it keeps the tolerance of the helper it replaced
|
|
23
|
+
(below).
|
|
28
24
|
|
|
29
|
-
validate Read an envelope (without the prefix) as JSON on stdin
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
envelope before consuming it.
|
|
25
|
+
validate Read an envelope (without the prefix) as JSON on stdin and
|
|
26
|
+
verify it against the schema. Silent + exit 0 on success;
|
|
27
|
+
non-zero exit + stderr error on failure. Same as
|
|
28
|
+
`skf-emit-result-envelope.py validate --workflow skf-brief-skill`.
|
|
34
29
|
|
|
35
30
|
Context payload shape (consumed by `emit`):
|
|
36
31
|
|
|
@@ -45,15 +40,24 @@ Context payload shape (consumed by `emit`):
|
|
|
45
40
|
"forge-tier-missing" | "target-inaccessible" |
|
|
46
41
|
"gh-auth-failed" | "write-failed" |
|
|
47
42
|
"overwrite-cancelled" | "user-cancelled",
|
|
48
|
-
"mode": null | "auto"
|
|
43
|
+
"mode": null | "auto",
|
|
44
|
+
"warnings": ["..."],
|
|
45
|
+
"customization_resolver_unavailable": "reason" | null
|
|
49
46
|
}
|
|
50
47
|
|
|
51
|
-
The caller does NOT supply exit_code
|
|
52
|
-
halt_reason
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
The caller does NOT supply exit_code: the emitter derives it from
|
|
49
|
+
halt_reason with the schema's mapping. `warnings` and a
|
|
50
|
+
`customization_resolver_unavailable` reason land in the envelope's
|
|
51
|
+
optional `warnings` list, which is left out while it is empty.
|
|
55
52
|
|
|
56
|
-
|
|
53
|
+
Like the helper it replaced, `emit` refuses no payload for a key the
|
|
54
|
+
envelope has no field for, or for an exit_code it typed: the key is
|
|
55
|
+
dropped with the warning `payload_key_ignored: <key>`, and the exit_code
|
|
56
|
+
is derived from halt_reason as always, with the warning
|
|
57
|
+
`exit_code_overridden: <given> (halt_reason <reason> maps to <code>)` when
|
|
58
|
+
the two differ. A halt that stages one key too many still emits its line.
|
|
59
|
+
The line is ASCII JSON, so a payload with no such key prints the line the
|
|
60
|
+
old helper printed, byte for byte.
|
|
57
61
|
|
|
58
62
|
CLI:
|
|
59
63
|
|
|
@@ -65,183 +69,55 @@ CLI:
|
|
|
65
69
|
from __future__ import annotations
|
|
66
70
|
|
|
67
71
|
import argparse
|
|
68
|
-
import
|
|
72
|
+
import importlib.util
|
|
69
73
|
import sys
|
|
74
|
+
from pathlib import Path
|
|
70
75
|
from typing import Any
|
|
71
76
|
|
|
77
|
+
WORKFLOW = "skf-brief-skill"
|
|
72
78
|
PREFIX = "SKF_BRIEF_RESULT_JSON: "
|
|
79
|
+
EMITTER = Path(__file__).resolve().parent / "skf-emit-result-envelope.py"
|
|
73
80
|
|
|
74
|
-
VALID_STATUS = {"success", "error"}
|
|
75
|
-
VALID_HALT_REASONS = {
|
|
76
|
-
None,
|
|
77
|
-
"input-missing",
|
|
78
|
-
"input-invalid",
|
|
79
|
-
"forge-tier-missing",
|
|
80
|
-
"target-inaccessible",
|
|
81
|
-
"gh-auth-failed",
|
|
82
|
-
"write-failed",
|
|
83
|
-
"overwrite-cancelled",
|
|
84
|
-
"user-cancelled",
|
|
85
|
-
}
|
|
86
|
-
VALID_SCOPE_TYPES = {
|
|
87
|
-
None,
|
|
88
|
-
"full-library",
|
|
89
|
-
"specific-modules",
|
|
90
|
-
"public-api",
|
|
91
|
-
"component-library",
|
|
92
|
-
"reference-app",
|
|
93
|
-
"docs-only",
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
# Canonical halt_reason → exit_code mapping (mirrors SKILL.md Exit Codes table).
|
|
97
|
-
HALT_TO_EXIT = {
|
|
98
|
-
None: 0,
|
|
99
|
-
"input-missing": 2,
|
|
100
|
-
"input-invalid": 2,
|
|
101
|
-
"forge-tier-missing": 3,
|
|
102
|
-
"target-inaccessible": 3,
|
|
103
|
-
"gh-auth-failed": 3,
|
|
104
|
-
"write-failed": 4,
|
|
105
|
-
"overwrite-cancelled": 5,
|
|
106
|
-
"user-cancelled": 6,
|
|
107
|
-
}
|
|
108
81
|
|
|
109
|
-
|
|
82
|
+
def _emitter():
|
|
83
|
+
"""Load the shared emitter from beside this script (source tree or install)."""
|
|
84
|
+
spec = importlib.util.spec_from_file_location("skf_emit_result_envelope", EMITTER)
|
|
85
|
+
if spec is None or spec.loader is None:
|
|
86
|
+
sys.stderr.write(f"skf-emit-brief-result-envelope: cannot load {EMITTER}\n")
|
|
87
|
+
sys.exit(2)
|
|
88
|
+
module = importlib.util.module_from_spec(spec)
|
|
89
|
+
spec.loader.exec_module(module)
|
|
90
|
+
return module
|
|
110
91
|
|
|
111
|
-
# Envelope key order — fixed so byte-stable diffs are possible.
|
|
112
|
-
KEY_ORDER = [
|
|
113
|
-
"status",
|
|
114
|
-
"brief_path",
|
|
115
|
-
"skill_name",
|
|
116
|
-
"version",
|
|
117
|
-
"language",
|
|
118
|
-
"scope_type",
|
|
119
|
-
"exit_code",
|
|
120
|
-
"halt_reason",
|
|
121
|
-
"mode",
|
|
122
|
-
]
|
|
123
92
|
|
|
124
|
-
|
|
125
|
-
def _die(message: str, code: int = 1) -> None:
|
|
126
|
-
sys.stderr.write(f"skf-emit-brief-result-envelope: {message}\n")
|
|
127
|
-
sys.exit(code)
|
|
93
|
+
core = _emitter()
|
|
128
94
|
|
|
129
95
|
|
|
130
96
|
def assemble(ctx: dict[str, Any]) -> dict[str, Any]:
|
|
131
|
-
"""Build the envelope from a context payload, deriving exit_code."""
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if
|
|
138
|
-
_die(
|
|
139
|
-
|
|
140
|
-
f"got {halt_reason!r}"
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
if status == "success" and halt_reason is not None:
|
|
144
|
-
_die(f"halt_reason must be null when status is 'success'; got {halt_reason!r}")
|
|
145
|
-
if status == "error" and halt_reason is None:
|
|
146
|
-
_die("halt_reason must be set when status is 'error'")
|
|
147
|
-
|
|
148
|
-
scope_type = ctx.get("scope_type")
|
|
149
|
-
if scope_type not in VALID_SCOPE_TYPES:
|
|
150
|
-
_die(
|
|
151
|
-
f"scope_type must be one of {sorted(t for t in VALID_SCOPE_TYPES if t is not None)} or null; "
|
|
152
|
-
f"got {scope_type!r}"
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
skill_name = ctx.get("skill_name")
|
|
156
|
-
if not skill_name or not isinstance(skill_name, str):
|
|
157
|
-
_die(f"skill_name is required and must be a non-empty string; got {skill_name!r}")
|
|
158
|
-
|
|
159
|
-
mode = ctx.get("mode")
|
|
160
|
-
if mode not in VALID_MODES:
|
|
161
|
-
_die(f"mode must be one of {sorted(m for m in VALID_MODES if m is not None)} or null; got {mode!r}")
|
|
162
|
-
|
|
163
|
-
envelope = {
|
|
164
|
-
"status": status,
|
|
165
|
-
"brief_path": ctx.get("brief_path"),
|
|
166
|
-
"skill_name": skill_name,
|
|
167
|
-
"version": ctx.get("version"),
|
|
168
|
-
"language": ctx.get("language"),
|
|
169
|
-
"scope_type": scope_type,
|
|
170
|
-
"exit_code": HALT_TO_EXIT[halt_reason],
|
|
171
|
-
"halt_reason": halt_reason,
|
|
172
|
-
"mode": mode,
|
|
173
|
-
}
|
|
174
|
-
# Re-emit in canonical key order
|
|
175
|
-
return {k: envelope[k] for k in KEY_ORDER}
|
|
97
|
+
"""Build the envelope from a context payload, deriving exit_code. Exits non-zero when invalid."""
|
|
98
|
+
schema, schema_path = core.load_workflow_schema(WORKFLOW)
|
|
99
|
+
ctx, tolerated = core.tolerant_payload(schema, ctx)
|
|
100
|
+
warnings = core._merged(core._payload_list(ctx, "warnings", str), core._resolver_warning(ctx), tolerated)
|
|
101
|
+
envelope = core.build_envelope(schema, ctx, halt=False, warnings=warnings)
|
|
102
|
+
errors = core.contract_errors(schema, envelope)
|
|
103
|
+
if errors:
|
|
104
|
+
core._die(1, f"the {WORKFLOW} envelope fails {schema_path.name}: {'; '.join(errors)}")
|
|
105
|
+
return envelope
|
|
176
106
|
|
|
177
107
|
|
|
178
108
|
def validate(envelope: dict[str, Any]) -> None:
|
|
179
109
|
"""Validate an envelope dict against the schema. Exits non-zero on failure."""
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if
|
|
183
|
-
_die(
|
|
184
|
-
extra = set(envelope.keys()) - required
|
|
185
|
-
if extra:
|
|
186
|
-
_die(f"envelope has unexpected keys: {sorted(extra)}")
|
|
187
|
-
if envelope.get("status") not in VALID_STATUS:
|
|
188
|
-
_die(f"status invalid: {envelope.get('status')!r}")
|
|
189
|
-
if envelope.get("halt_reason") not in VALID_HALT_REASONS:
|
|
190
|
-
_die(f"halt_reason invalid: {envelope.get('halt_reason')!r}")
|
|
191
|
-
if envelope.get("scope_type") not in VALID_SCOPE_TYPES:
|
|
192
|
-
_die(f"scope_type invalid: {envelope.get('scope_type')!r}")
|
|
193
|
-
if envelope.get("mode") not in VALID_MODES:
|
|
194
|
-
_die(f"mode invalid: {envelope.get('mode')!r}")
|
|
195
|
-
if envelope.get("exit_code") not in {0, 2, 3, 4, 5, 6}:
|
|
196
|
-
_die(f"exit_code invalid: {envelope.get('exit_code')!r}")
|
|
197
|
-
expected_exit = HALT_TO_EXIT[envelope.get("halt_reason")]
|
|
198
|
-
if envelope.get("exit_code") != expected_exit:
|
|
199
|
-
_die(
|
|
200
|
-
f"exit_code {envelope.get('exit_code')!r} does not match canonical mapping "
|
|
201
|
-
f"for halt_reason {envelope.get('halt_reason')!r} (expected {expected_exit})"
|
|
202
|
-
)
|
|
203
|
-
if not envelope.get("skill_name") or not isinstance(envelope.get("skill_name"), str):
|
|
204
|
-
_die("skill_name must be a non-empty string")
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
def cmd_emit(target_stream: str) -> int:
|
|
208
|
-
raw = sys.stdin.read()
|
|
209
|
-
if not raw or not raw.strip():
|
|
210
|
-
_die("emit: empty stdin (expected JSON context payload)")
|
|
211
|
-
try:
|
|
212
|
-
ctx = json.loads(raw)
|
|
213
|
-
except json.JSONDecodeError as e:
|
|
214
|
-
_die(f"emit: invalid JSON on stdin: {e}")
|
|
215
|
-
if not isinstance(ctx, dict):
|
|
216
|
-
_die("emit: context payload must be a JSON object")
|
|
217
|
-
|
|
218
|
-
envelope = assemble(ctx)
|
|
219
|
-
line = PREFIX + json.dumps(envelope, separators=(",", ":"))
|
|
220
|
-
if target_stream == "stderr":
|
|
221
|
-
print(line, file=sys.stderr)
|
|
222
|
-
else:
|
|
223
|
-
print(line)
|
|
224
|
-
return 0
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
def cmd_validate() -> int:
|
|
228
|
-
raw = sys.stdin.read()
|
|
229
|
-
if not raw or not raw.strip():
|
|
230
|
-
_die("validate: empty stdin (expected envelope JSON)")
|
|
231
|
-
try:
|
|
232
|
-
envelope = json.loads(raw)
|
|
233
|
-
except json.JSONDecodeError as e:
|
|
234
|
-
_die(f"validate: invalid JSON on stdin: {e}")
|
|
235
|
-
if not isinstance(envelope, dict):
|
|
236
|
-
_die("validate: envelope must be a JSON object")
|
|
237
|
-
validate(envelope)
|
|
238
|
-
return 0
|
|
110
|
+
schema, _ = core.load_workflow_schema(WORKFLOW)
|
|
111
|
+
errors = core.contract_errors(schema, envelope)
|
|
112
|
+
if errors:
|
|
113
|
+
core._die(1, "; ".join(errors))
|
|
239
114
|
|
|
240
115
|
|
|
241
116
|
def main() -> int:
|
|
117
|
+
core._force_utf8(sys.stdin, sys.stdout, sys.stderr)
|
|
242
118
|
parser = argparse.ArgumentParser(
|
|
243
119
|
prog="skf-emit-brief-result-envelope",
|
|
244
|
-
description="
|
|
120
|
+
description="SKF_BRIEF_RESULT_JSON envelope emitter for skf-brief-skill (alias of skf-emit-result-envelope.py).",
|
|
245
121
|
)
|
|
246
122
|
sub = parser.add_subparsers(dest="cmd", required=True)
|
|
247
123
|
|
|
@@ -250,7 +126,7 @@ def main() -> int:
|
|
|
250
126
|
"--target",
|
|
251
127
|
choices=["stdout", "stderr"],
|
|
252
128
|
default="stdout",
|
|
253
|
-
help="Output stream for the prefixed envelope line
|
|
129
|
+
help="Output stream for the prefixed envelope line: stdout for a run's success line, stderr for a HARD HALT's.",
|
|
254
130
|
)
|
|
255
131
|
|
|
256
132
|
sub.add_parser("validate", help="Read envelope JSON on stdin, exit 0 if schema-valid")
|
|
@@ -258,9 +134,11 @@ def main() -> int:
|
|
|
258
134
|
args = parser.parse_args()
|
|
259
135
|
|
|
260
136
|
if args.cmd == "emit":
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
137
|
+
core.run_emit(WORKFLOW, halt=False, label="emit", target=args.target, tolerant=True)
|
|
138
|
+
return 0
|
|
139
|
+
if args.cmd == "validate":
|
|
140
|
+
core.cmd_validate(WORKFLOW)
|
|
141
|
+
return 0
|
|
264
142
|
return 2
|
|
265
143
|
|
|
266
144
|
|