bmad-module-skill-forge 2.0.0 → 2.0.1
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/.nvmrc +1 -1
- package/docs/_data/pinned.yaml +1 -1
- package/package.json +2 -2
- package/src/knowledge/skill-lifecycle.md +1 -1
- package/src/module-help.csv +2 -2
- package/src/shared/scripts/skf-comention-pairs.py +350 -0
- package/src/shared/scripts/skf-count-tokens.py +222 -0
- package/src/shared/scripts/skf-detect-docs.py +232 -1
- package/src/shared/scripts/skf-detect-language.py +77 -0
- package/src/shared/scripts/skf-detect-tools.py +105 -2
- package/src/shared/scripts/skf-enumerate-stack-skills.py +111 -2
- package/src/shared/scripts/skf-find-cycles.py +246 -0
- package/src/shared/scripts/skf-hash-content.py +487 -2
- package/src/shared/scripts/skf-manifest-ops.py +67 -1
- package/src/shared/scripts/skf-rebuild-managed-sections.py +180 -0
- package/src/shared/scripts/skf-recommend-scope-type.py +1 -2
- package/src/shared/scripts/skf-render-metadata-stats.py +499 -0
- package/src/shared/scripts/skf-rewrite-skill-name.py +308 -0
- package/src/shared/scripts/skf-shard-body.py +461 -0
- package/src/shared/scripts/skf-skill-inventory.py +139 -3
- package/src/shared/scripts/skf-structural-diff.py +307 -67
- package/src/shared/scripts/skf-validate-brief-schema.py +39 -1
- package/src/shared/scripts/skf-validate-feasibility-report.py +234 -0
- package/src/shared/scripts/skf-validate-frontmatter.py +17 -12
- package/src/shared/scripts/skf-validate-output.py +443 -10
- package/src/shared/scripts/skf-validate-pins.py +1 -1
- package/src/shared/scripts/skf-verify-no-trace.py +214 -0
- package/src/shared/scripts/skf-verify-provenance-completeness.py +439 -0
- package/src/skf-analyze-source/SKILL.md +17 -32
- package/src/skf-analyze-source/customize.toml +2 -0
- package/src/skf-analyze-source/references/auto-docs-only.md +116 -0
- package/src/skf-analyze-source/references/continue.md +8 -13
- package/src/skf-analyze-source/references/generate-briefs.md +28 -12
- package/src/skf-analyze-source/references/headless-contract.md +33 -0
- package/src/skf-analyze-source/references/health-check.md +1 -2
- package/src/skf-analyze-source/references/identify-units.md +25 -36
- package/src/skf-analyze-source/references/init.md +12 -25
- package/src/skf-analyze-source/references/map-and-detect.md +8 -20
- package/src/skf-analyze-source/references/recommend.md +4 -14
- package/src/skf-analyze-source/references/scan-project.md +3 -11
- package/src/skf-analyze-source/references/step-auto-scope.md +42 -180
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +2 -2
- package/src/skf-audit-skill/SKILL.md +9 -6
- package/src/skf-audit-skill/customize.toml +2 -0
- package/src/skf-audit-skill/references/init.md +58 -32
- package/src/skf-audit-skill/references/re-index.md +15 -34
- package/src/skf-audit-skill/references/report.md +11 -58
- package/src/skf-audit-skill/references/semantic-diff.md +4 -22
- package/src/skf-audit-skill/references/severity-classify.md +53 -87
- package/src/skf-audit-skill/references/step-doc-drift.md +49 -19
- package/src/skf-audit-skill/references/structural-diff.md +43 -68
- package/src/skf-brief-skill/SKILL.md +7 -36
- package/src/skf-brief-skill/assets/scope-templates.md +1 -1
- package/src/skf-brief-skill/customize.toml +14 -0
- package/src/skf-brief-skill/references/analyze-target.md +6 -14
- package/src/skf-brief-skill/references/confirm-brief.md +2 -14
- package/src/skf-brief-skill/references/draft-checkpoint.md +8 -8
- package/src/skf-brief-skill/references/gather-intent.md +19 -22
- package/src/skf-brief-skill/references/headless-args.md +1 -1
- package/src/skf-brief-skill/references/health-check.md +1 -22
- package/src/skf-brief-skill/references/invocation-contract.md +37 -0
- package/src/skf-brief-skill/references/scope-definition.md +4 -14
- package/src/skf-brief-skill/references/step-auto-brief.md +1 -5
- package/src/skf-brief-skill/references/step-auto-validate.md +1 -5
- package/src/skf-brief-skill/references/version-resolution.md +1 -1
- package/src/skf-brief-skill/references/write-brief.md +17 -10
- package/src/skf-campaign/SKILL.md +15 -84
- package/src/skf-campaign/customize.toml +2 -0
- package/src/skf-campaign/manifest.yaml +4 -0
- package/src/skf-campaign/references/campaign-contracts.md +67 -0
- package/src/skf-campaign/references/campaign-directive-spec.md +14 -103
- package/src/skf-campaign/references/step-01-setup.md +4 -5
- package/src/skf-campaign/references/step-02-strategy.md +8 -3
- package/src/skf-campaign/references/step-03-pins.md +1 -1
- package/src/skf-campaign/references/step-04-provenance.md +1 -1
- package/src/skf-campaign/references/step-05-skill-loop.md +1 -1
- package/src/skf-campaign/references/step-06-batch.md +7 -6
- package/src/skf-campaign/references/step-11-maintenance.md +2 -2
- package/src/skf-campaign/references/step-resume.md +9 -8
- package/src/skf-campaign/scripts/campaign-deps.py +10 -1
- package/src/skf-campaign/scripts/campaign-render-batch.py +199 -0
- package/src/skf-campaign/scripts/campaign-status.py +162 -0
- package/src/skf-campaign/templates/campaign-brief-template.yaml +1 -1
- package/src/skf-create-skill/SKILL.md +14 -3
- package/src/skf-create-skill/assets/compile-assembly-rules.md +17 -38
- package/src/skf-create-skill/assets/skill-sections.md +9 -100
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +4 -13
- package/src/skf-create-skill/customize.toml +13 -0
- package/src/skf-create-skill/references/authoritative-files-protocol.md +7 -7
- package/src/skf-create-skill/references/compile.md +34 -47
- package/src/skf-create-skill/references/component-extraction.md +8 -35
- package/src/skf-create-skill/references/ecosystem-check.md +9 -25
- package/src/skf-create-skill/references/enrich.md +4 -17
- package/src/skf-create-skill/references/extract.md +14 -29
- package/src/skf-create-skill/references/extraction-patterns-tracing.md +1 -1
- package/src/skf-create-skill/references/extraction-patterns.md +7 -7
- package/src/skf-create-skill/references/generate-artifacts.md +9 -23
- package/src/skf-create-skill/references/health-check.md +1 -1
- package/src/skf-create-skill/references/load-brief.md +16 -18
- package/src/skf-create-skill/references/report.md +12 -15
- package/src/skf-create-skill/references/source-resolution-protocols.md +3 -3
- package/src/skf-create-skill/references/step-auto-shard.md +52 -25
- package/src/skf-create-skill/references/step-doc-rot.md +30 -12
- package/src/skf-create-skill/references/step-doc-sources.md +2 -2
- package/src/skf-create-skill/references/sub/ccc-discover.md +2 -13
- package/src/skf-create-skill/references/sub/fetch-docs.md +8 -50
- package/src/skf-create-skill/references/sub/fetch-temporal.md +5 -20
- package/src/skf-create-skill/references/tier-degradation-rules.md +6 -8
- package/src/skf-create-skill/references/validate.md +59 -28
- package/src/skf-create-skill/scripts/scan-doc-rot.py +245 -0
- package/src/skf-create-stack-skill/SKILL.md +15 -9
- package/src/skf-create-stack-skill/assets/provenance-map-schema.md +1 -1
- package/src/skf-create-stack-skill/customize.toml +10 -0
- package/src/skf-create-stack-skill/references/compile-stack.md +7 -8
- package/src/skf-create-stack-skill/references/compose-mode-rules.md +2 -13
- package/src/skf-create-stack-skill/references/detect-integrations.md +49 -54
- package/src/skf-create-stack-skill/references/detect-manifests.md +37 -30
- package/src/skf-create-stack-skill/references/generate-output.md +24 -75
- package/src/skf-create-stack-skill/references/init.md +9 -81
- package/src/skf-create-stack-skill/references/manifest-patterns.md +5 -35
- package/src/skf-create-stack-skill/references/parallel-extract.md +12 -27
- package/src/skf-create-stack-skill/references/rank-and-confirm.md +6 -6
- package/src/skf-create-stack-skill/references/report.md +27 -62
- package/src/skf-create-stack-skill/references/validate.md +35 -31
- package/src/skf-drop-skill/SKILL.md +20 -23
- package/src/skf-drop-skill/customize.toml +10 -0
- package/src/skf-drop-skill/references/execute.md +51 -31
- package/src/skf-drop-skill/references/headless-contract.md +18 -0
- package/src/skf-drop-skill/references/health-check.md +1 -13
- package/src/skf-drop-skill/references/report.md +42 -10
- package/src/skf-drop-skill/references/select.md +88 -48
- package/src/skf-drop-skill/scripts/dir-sizes.py +116 -0
- package/src/skf-export-skill/SKILL.md +17 -14
- package/src/skf-export-skill/assets/managed-section-format.md +2 -5
- package/src/skf-export-skill/customize.toml +10 -6
- package/src/skf-export-skill/references/generate-snippet.md +21 -35
- package/src/skf-export-skill/references/load-skill.md +44 -42
- package/src/skf-export-skill/references/multi-skill-mode.md +1 -1
- package/src/skf-export-skill/references/orphan-context-detection.md +11 -3
- package/src/skf-export-skill/references/package.md +27 -33
- package/src/skf-export-skill/references/preflight-snippet-root-probe.md +24 -5
- package/src/skf-export-skill/references/result-envelope.md +28 -0
- package/src/skf-export-skill/references/summary.md +11 -5
- package/src/skf-export-skill/references/token-report.md +42 -24
- package/src/skf-export-skill/references/update-context.md +32 -33
- package/src/skf-forger/SKILL.md +27 -39
- package/src/skf-forger/references/pipeline-mode.md +34 -0
- package/src/skf-forger/scripts/parse-pipeline.py +270 -0
- package/src/skf-quick-skill/SKILL.md +10 -60
- package/src/skf-quick-skill/customize.toml +9 -0
- package/src/skf-quick-skill/references/batch-mode.md +6 -4
- package/src/skf-quick-skill/references/compile.md +15 -52
- package/src/skf-quick-skill/references/ecosystem-check.md +5 -20
- package/src/skf-quick-skill/references/finalize.md +12 -6
- package/src/skf-quick-skill/references/halt-contract.md +54 -0
- package/src/skf-quick-skill/references/health-check.md +3 -4
- package/src/skf-quick-skill/references/quick-extract.md +7 -18
- package/src/skf-quick-skill/references/registry-resolution.md +1 -23
- package/src/skf-quick-skill/references/resolve-target.md +27 -34
- package/src/skf-quick-skill/references/write-and-validate.md +10 -25
- package/src/skf-refine-architecture/SKILL.md +14 -7
- package/src/skf-refine-architecture/customize.toml +9 -0
- package/src/skf-refine-architecture/references/compile.md +9 -7
- package/src/skf-refine-architecture/references/gap-analysis.md +21 -50
- package/src/skf-refine-architecture/references/health-check.md +1 -1
- package/src/skf-refine-architecture/references/improvements.md +9 -25
- package/src/skf-refine-architecture/references/init.md +9 -16
- package/src/skf-refine-architecture/references/issue-detection.md +10 -25
- package/src/skf-refine-architecture/references/refinement-rules.md +4 -16
- package/src/skf-refine-architecture/references/report.md +13 -10
- package/src/skf-rename-skill/SKILL.md +11 -21
- package/src/skf-rename-skill/customize.toml +10 -0
- package/src/skf-rename-skill/references/execute.md +107 -78
- package/src/skf-rename-skill/references/exit-codes.md +12 -0
- package/src/skf-rename-skill/references/report.md +16 -8
- package/src/skf-rename-skill/references/select.md +69 -42
- package/src/skf-rename-skill/scripts/skf-validate-rename-name.py +161 -0
- package/src/skf-setup/SKILL.md +20 -12
- package/src/skf-setup/customize.toml +10 -0
- package/src/skf-setup/references/auto-index.md +9 -10
- package/src/skf-setup/references/ccc-index.md +14 -15
- package/src/skf-setup/references/detect-and-tier.md +6 -8
- package/src/skf-setup/references/report.md +22 -31
- package/src/skf-setup/references/tier-rules.md +2 -32
- package/src/skf-setup/references/write-config.md +9 -10
- package/src/skf-test-skill/SKILL.md +10 -8
- package/src/skf-test-skill/customize.toml +2 -0
- package/src/skf-test-skill/references/coherence-check.md +19 -31
- package/src/skf-test-skill/references/coverage-check.md +109 -75
- package/src/skf-test-skill/references/detect-mode.md +10 -41
- package/src/skf-test-skill/references/external-validators.md +11 -19
- package/src/skf-test-skill/references/init.md +38 -20
- package/src/skf-test-skill/references/migration-section-rules.md +4 -4
- package/src/skf-test-skill/references/report.md +60 -40
- package/src/skf-test-skill/references/score.md +32 -64
- package/src/skf-test-skill/references/scoring-rules.md +6 -62
- package/src/skf-test-skill/references/source-access-protocol.md +6 -6
- package/src/skf-test-skill/references/step-hard-gate.md +1 -3
- package/src/skf-test-skill/scripts/aggregate-coherence.py +276 -0
- package/src/skf-test-skill/scripts/check-metadata-coherence.py +359 -0
- package/src/skf-test-skill/scripts/combine-external-scores.py +190 -0
- package/src/skf-test-skill/scripts/compute-score.py +131 -1
- package/src/skf-test-skill/scripts/reconcile-coverage.py +327 -0
- package/src/skf-test-skill/scripts/validate-inventory.py +251 -0
- package/src/skf-test-skill/scripts/verify-declared-numerator.py +192 -0
- package/src/skf-update-skill/SKILL.md +17 -5
- package/src/skf-update-skill/customize.toml +14 -0
- package/src/skf-update-skill/references/detect-changes.md +19 -37
- package/src/skf-update-skill/references/health-check.md +3 -9
- package/src/skf-update-skill/references/init.md +39 -32
- package/src/skf-update-skill/references/manual-section-rules.md +1 -2
- package/src/skf-update-skill/references/merge-conflict-rules.md +1 -52
- package/src/skf-update-skill/references/merge.md +13 -57
- package/src/skf-update-skill/references/re-extract.md +12 -24
- package/src/skf-update-skill/references/report.md +14 -7
- package/src/skf-update-skill/references/validate.md +32 -30
- package/src/skf-update-skill/references/write.md +86 -51
- package/src/skf-update-skill/scripts/skf-new-file-diff.py +167 -0
- package/src/skf-verify-stack/SKILL.md +11 -21
- package/src/skf-verify-stack/customize.toml +12 -3
- package/src/skf-verify-stack/references/coverage-patterns.md +1 -29
- package/src/skf-verify-stack/references/coverage.md +21 -10
- package/src/skf-verify-stack/references/exit-codes.md +14 -0
- package/src/skf-verify-stack/references/health-check.md +1 -1
- package/src/skf-verify-stack/references/init.md +20 -25
- package/src/skf-verify-stack/references/integration-verification-rules.md +10 -19
- package/src/skf-verify-stack/references/integrations.md +44 -49
- package/src/skf-verify-stack/references/report.md +28 -34
- package/src/skf-verify-stack/references/requirements.md +3 -3
- package/src/skf-verify-stack/references/synthesize.md +36 -39
- package/src/skf-verify-stack/scripts/skf-coverage-tally.py +196 -0
- package/src/skf-verify-stack/scripts/skf-report-delta.py +256 -0
- package/src/skf-verify-stack/scripts/skf-verdict-rollup.py +258 -0
- package/src/skf-rename-skill/references/rebuild-context.md +0 -110
|
@@ -19,18 +19,12 @@ emitBriefEnvelopeProbeOrder:
|
|
|
19
19
|
|
|
20
20
|
# Step 2: Analyze Target
|
|
21
21
|
|
|
22
|
-
## STEP GOAL:
|
|
23
|
-
|
|
24
|
-
To analyze the target repository by resolving its location, reading its structure, detecting the primary language, and listing top-level modules and exports — providing the user with a factual foundation for scoping decisions.
|
|
25
|
-
|
|
26
22
|
## Rules
|
|
27
23
|
|
|
28
|
-
- Focus only on analysis — do not define scope yet (Step 03)
|
|
29
24
|
- Do not make scoping decisions or recommendations
|
|
30
25
|
- Do not hallucinate or guess about repository contents
|
|
31
|
-
- All user-facing output in `{communication_language}`
|
|
32
26
|
|
|
33
|
-
##
|
|
27
|
+
## Sequence
|
|
34
28
|
|
|
35
29
|
### 1. Resolve Target Location
|
|
36
30
|
|
|
@@ -67,7 +61,7 @@ Distinguish the failure class before reporting. In headless mode, every branch b
|
|
|
67
61
|
**For local paths:**
|
|
68
62
|
- Verify the directory exists
|
|
69
63
|
- List the directory tree
|
|
70
|
-
- If path
|
|
64
|
+
- If the path does not exist: HALT (exit code 3, `halt_reason: "target-inaccessible"`) — "**Error:** Directory not found at {path}. Verify the path is correct." In headless mode, emit the error envelope per **step 5 §4b** with `halt_reason: "target-inaccessible"` before the HALT (pass the resolved `{skill_name}`, or the `"unknown"` placeholder documented in §4b if it is not yet set), matching the GitHub-target failure branches above so a missing local path surfaces the same `SKF_BRIEF_RESULT_JSON` failure class.
|
|
71
65
|
|
|
72
66
|
Display: "**Resolving target...**"
|
|
73
67
|
|
|
@@ -141,7 +135,9 @@ The script returns `{language, confidence, detection_source, fallback_to_extensi
|
|
|
141
135
|
**Confidence:** {confidence}
|
|
142
136
|
**Detection source:** {detection_source}"
|
|
143
137
|
|
|
144
|
-
If `
|
|
138
|
+
**Headless language override.** If `language_hint` was supplied as a headless argument, use it as the confirmed `{language}` (overriding the detected value) and carry it forward to §4 and step 03. The detector still runs so the "Detected language" line reflects what the source signals, but the explicit hint wins and the step 03 §4 low-confidence override does not fire. When `language_hint` is absent, carry the detected `{language}` forward.
|
|
139
|
+
|
|
140
|
+
If `confidence` is `low` (or `unknown` is returned for `language`) and no `language_hint` was supplied: flag for user override in step 03 §4.
|
|
145
141
|
|
|
146
142
|
### 4. List Top-Level Modules and Exports
|
|
147
143
|
|
|
@@ -291,13 +287,9 @@ Pause briefly for user input. If the user provides corrections or asks questions
|
|
|
291
287
|
|
|
292
288
|
- After analysis report is presented to user and any corrections addressed, load, read entire file, then execute {nextStepFile}
|
|
293
289
|
|
|
294
|
-
####
|
|
290
|
+
#### Execution rules:
|
|
295
291
|
|
|
296
292
|
- This is a soft auto-proceed step — present the pause prompt, wait briefly for user input
|
|
297
293
|
- If user provides corrections: address them, then proceed
|
|
298
294
|
- If no user input after a brief pause: proceed directly to step 03
|
|
299
295
|
|
|
300
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
301
|
-
|
|
302
|
-
ONLY WHEN the analysis is complete and the summary has been presented to the user will you load and read fully `scope-definition.md` to begin scope definition.
|
|
303
|
-
|
|
@@ -9,17 +9,11 @@ partyModeSkill: '/bmad-party-mode'
|
|
|
9
9
|
|
|
10
10
|
# Step 4: Confirm Brief
|
|
11
11
|
|
|
12
|
-
## STEP GOAL:
|
|
13
|
-
|
|
14
|
-
To present the complete skill brief in human-readable format, highlighting all fields that will be written to skill-brief.yaml, and obtain explicit user approval before writing.
|
|
15
|
-
|
|
16
12
|
## Rules
|
|
17
13
|
|
|
18
|
-
- Focus only on presenting and confirming — do not write files yet (Step 05)
|
|
19
14
|
- Do not proceed without explicit user approval (P2 confirmation gate)
|
|
20
|
-
- All user-facing output in `{communication_language}`
|
|
21
15
|
|
|
22
|
-
##
|
|
16
|
+
## Sequence
|
|
23
17
|
|
|
24
18
|
### 1. Assemble Complete Brief
|
|
25
19
|
|
|
@@ -162,15 +156,9 @@ Display: **Select an Option:** [R] Revise Scope [A] Advanced Elicitation [P] Par
|
|
|
162
156
|
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). Cancellation here is non-destructive — step 5 has not run, no skill-brief.yaml file exists yet. `[X]` is interactive-only; the headless GATE never reaches this branch.
|
|
163
157
|
- IF Any other comments or queries: help user respond, apply any field adjustments, re-present brief if changed, then [Redisplay Menu Options](#5-present-menu-options)
|
|
164
158
|
|
|
165
|
-
####
|
|
159
|
+
#### Execution rules:
|
|
166
160
|
|
|
167
|
-
- ALWAYS halt and wait for user input after presenting menu
|
|
168
161
|
- **GATE [default: C]** — If `{headless_mode}`: auto-proceed with [C] Confirm, log: "headless: auto-confirm brief"
|
|
169
|
-
- ONLY proceed to write step when user selects 'C'
|
|
170
162
|
- After other menu items execution, return to this menu
|
|
171
163
|
- User can chat, request field changes, or ask questions — always respond and then redisplay menu
|
|
172
164
|
|
|
173
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
174
|
-
|
|
175
|
-
ONLY WHEN C is selected and the user has explicitly approved the brief will you load and read fully `write-brief.md` to write the skill-brief.yaml file.
|
|
176
|
-
|
|
@@ -4,31 +4,31 @@ The `.brief-draft.json` file at `{forge_data_folder}/{skill-name}/.brief-draft.j
|
|
|
4
4
|
|
|
5
5
|
**Headless mode skips this entire lifecycle** — the run completes in a single invocation, so no resume is meaningful and no checkpoint is written.
|
|
6
6
|
|
|
7
|
-
The two halves of the lifecycle (resume
|
|
7
|
+
The two halves of the lifecycle (resume after the target is confirmed in §3, write on §7 confirmation) form a pair. This file documents both so a single load covers them.
|
|
8
8
|
|
|
9
|
-
## Half 1 — Resume Check (loaded from §
|
|
9
|
+
## Half 1 — Resume Check (loaded from §3 after the target is confirmed)
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Keyed on the confirmed **target**, not the derived skill name, so the offer can fire right after §3 — before the returning user re-answers version (§3b), intent (§4), or scope (§5), which is exactly the state a draft restores. The caller (gather-intent §3) has already globbed `{forge_data_folder}/*/.brief-draft.json`, kept only drafts whose `target_repo` equals the confirmed target (or whose `doc_urls` contain it, for docs-only) with no `skill-brief.yaml` beside them, and selected the most-recently-modified survivor. Its directory basename is the candidate skill `name`. Present the resume prompt for that draft.
|
|
12
12
|
|
|
13
|
-
When
|
|
13
|
+
When a live draft is found, present:
|
|
14
14
|
|
|
15
15
|
```
|
|
16
16
|
**An in-progress draft for `{name}` was found** (last updated: {mtime}).
|
|
17
17
|
[Y] Resume from the saved draft (jump to §8 with prior answers restored)
|
|
18
|
-
[N] Start fresh (
|
|
18
|
+
[N] Start fresh (ignore this draft and keep gathering)
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
### `[Y]` — Resume
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Restore the candidate `name` (the matched draft's directory basename), then load the JSON and restore the captured fields: `target_repo`, `source_type`, `source_authority`, `target_version`, `doc_urls`, `intent`, `scope_hint`, `description`, `forge_tier`, `tier_source`. Then jump directly to §8 — **skip §3b, §4, §5, §6, §7, and §7b** — so the version, intent, scope, and description the draft already holds are never re-gathered.
|
|
24
24
|
|
|
25
|
-
The skip rule for §7b is load-bearing: re-running §7b would overwrite the user's previously accepted `description` with a fresh candidate synthesized from the seed material. The restored `description` is authoritative.
|
|
25
|
+
The skip rule for §7b is load-bearing: re-running §7b would overwrite the user's previously accepted `description` with a fresh candidate synthesized from the seed material. The restored `description` is authoritative. §6 is skipped too, so the restored `name` is used as-is — it already cleared the collision and portfolio-similarity checks in the session that wrote the draft.
|
|
26
26
|
|
|
27
27
|
The user can still revise any field at step 4 §3 if a refinement is needed after the full brief is visible.
|
|
28
28
|
|
|
29
29
|
### `[N]` — Start fresh
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Leave the draft in place and continue forward to §3b — the normal gather flow (§3b version, §4 intent, §5 scope, §6 name) resumes, and the §6 collision / portfolio-similarity checks run in their usual place. Do not delete the draft here: the skill name has not been chosen yet, so there is nothing to key a deletion on. If the user lands on the same name, step 5's atomic write overwrites the stale draft; otherwise it stays a harmless orphan that the resume check offers again on a future run targeting the same repo.
|
|
32
32
|
|
|
33
33
|
## Half 2 — Checkpoint Write (loaded from §7 after summary confirmation)
|
|
34
34
|
|
|
@@ -21,10 +21,6 @@ emitBriefEnvelopeProbeOrder:
|
|
|
21
21
|
|
|
22
22
|
# Step 1: Gather Intent
|
|
23
23
|
|
|
24
|
-
## STEP GOAL:
|
|
25
|
-
|
|
26
|
-
To initialize the brief-skill workflow by discovering the forge tier configuration, then gathering the user's target repository, intent, and any upfront scope hints for skill creation.
|
|
27
|
-
|
|
28
24
|
## Rules
|
|
29
25
|
|
|
30
26
|
- Focus only on gathering intent — do not analyze the repo yet (Step 02)
|
|
@@ -32,7 +28,7 @@ To initialize the brief-skill workflow by discovering the forge tier configurati
|
|
|
32
28
|
- Open-ended discovery facilitation — collect target repo, user intent, scope hints, skill name
|
|
33
29
|
- All user-facing output in `{communication_language}`
|
|
34
30
|
|
|
35
|
-
##
|
|
31
|
+
## Sequence
|
|
36
32
|
|
|
37
33
|
### 1. Discover Forge Tier
|
|
38
34
|
|
|
@@ -72,7 +68,7 @@ Attempt to load `{forgeTierFile}`:
|
|
|
72
68
|
1. **Load upstream brief path:** Read `brief_path` from the pipeline data context (passed by the forger from AN's `SKF_ANALYZE_RESULT_JSON` `brief_paths[]`). If `brief_path` is not available, HARD HALT with exit code 2 (`input-missing`): "**Auto mode requires `brief_path` in pipeline context — AN must run before BS[auto].**"
|
|
73
69
|
2. **Load source repo:** Read `source_repo` from the pipeline data context (the target repo URL or path, forwarded by the forger). If not available, attempt to extract it from the upstream brief at `brief_path`.
|
|
74
70
|
3. "**Auto mode activated — bypassing interactive brief workflow.**"
|
|
75
|
-
4. **Route to auto-brief:** Load, read fully, then execute `references/step-auto-brief.md
|
|
71
|
+
4. **Route to auto-brief:** Load, read fully, then execute `references/step-auto-brief.md`, and hand off there — do not fall through to §2 or any subsequent section of this file.
|
|
76
72
|
|
|
77
73
|
**IF `{auto_mode}` is NOT true:**
|
|
78
74
|
Continue to §2 as normal — the entire interactive flow below is unchanged.
|
|
@@ -85,12 +81,6 @@ Continue to §2 as normal — the entire interactive flow below is unchanged.
|
|
|
85
81
|
|
|
86
82
|
I'll help you define exactly what to skill and produce a `skill-brief.yaml` that drives the create-skill compilation workflow.
|
|
87
83
|
|
|
88
|
-
We'll work through this together:
|
|
89
|
-
1. **Now:** Understand what you want to skill and why
|
|
90
|
-
2. **Next:** Analyze the target repo structure
|
|
91
|
-
3. **Then:** Define scope boundaries
|
|
92
|
-
4. **Finally:** Confirm and write the brief
|
|
93
|
-
|
|
94
84
|
{If tier override was applied:}
|
|
95
85
|
**Your forge tier:** {override tier} (overridden from {original tier}) — {tier_gloss}
|
|
96
86
|
{Else:}
|
|
@@ -222,6 +212,20 @@ Default to `"community"` if user does not specify or skips.
|
|
|
222
212
|
|
|
223
213
|
Confirm the target.
|
|
224
214
|
|
|
215
|
+
**Draft-resume check (interactive only).** Now that the target is confirmed — and *before* the version prompt (§3b), intent (§4), or scope (§5) spend the user's time — offer to resume an in-progress draft that already covers this exact target, so a returning user re-types nothing. Keying on the target (not the not-yet-derived skill name) is what lets the offer fire this early. When the flow is interactive:
|
|
216
|
+
|
|
217
|
+
1. **Cheap pre-filter** — list any draft file that mentions the confirmed target at all:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
grep -lF "{target}" "{forge_data_folder}"/*/.brief-draft.json 2>/dev/null
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
`{target}` is the repo URL, local path, or primary doc URL just entered. No output → no draft; skip straight to §3b.
|
|
224
|
+
|
|
225
|
+
2. **Confirm each candidate on the target *field*, not free text.** Read the candidate draft's JSON and keep it only if its `target_repo` equals the confirmed target (source targets) or the target appears in its `doc_urls` (docs-only) — this rejects a draft that merely mentions the URL in its `intent` or `description`. Drop any candidate that has a finished `skill-brief.yaml` in the same directory (that brief is done; step 5's overwrite gate owns it).
|
|
226
|
+
|
|
227
|
+
3. If one or more live drafts survive, load `{draftCheckpointFile}` and follow Half 1 (Resume Check) against the most-recently-modified survivor; its directory basename is the candidate skill name. On `[Y]` resume, Half 1 restores every gathered answer and jumps straight to §8 — **§3b, §4, §5, §6, §7, and §7b are all skipped**. Otherwise (headless, no surviving draft, or every match already has a finished brief beside it) skip the load and continue to §3b.
|
|
228
|
+
|
|
225
229
|
### 3b. Gather Target Version
|
|
226
230
|
|
|
227
231
|
This step only collects `target_version` and validates its shape with the regex below — auto-detection runs in step 2 and precedence/invariant resolution lands in step 5's writer script. The canonical precedence rules live in `references/version-resolution.md`; load it from step 2 / step 5 only when the relevant section needs it.
|
|
@@ -320,7 +324,7 @@ Wait for confirmation or alternative.
|
|
|
320
324
|
|
|
321
325
|
**Portfolio-similarity check.** When the flow is interactive AND forge tier is `Deep` AND `tools.qmd` is true in `forge-tier.yaml`, load `{portfolioSimilarityCheckFile}` and follow the procedure there to catch semantic near-duplicates that exact-name collision misses. Otherwise (headless, or tier below Deep, or qmd unavailable) skip the load — the check does not run.
|
|
322
326
|
|
|
323
|
-
|
|
327
|
+
(The resume-a-draft offer for a returning user fires earlier, right after the target is confirmed in §3 — see the §3 "Draft-resume check" — so the intent, scope, and description a draft holds are spared *before* they get re-gathered here.)
|
|
324
328
|
|
|
325
329
|
### 7. Summarize Gathered Intent
|
|
326
330
|
|
|
@@ -340,7 +344,7 @@ Wait for confirmation or alternative.
|
|
|
340
344
|
|
|
341
345
|
Ready to analyze the target repository?"
|
|
342
346
|
|
|
343
|
-
**Draft checkpoint.** When the flow is interactive, load `{draftCheckpointFile}` (or reuse it if already loaded for the §
|
|
347
|
+
**Draft checkpoint.** When the flow is interactive, load `{draftCheckpointFile}` (or reuse it if already loaded for the §3 resume check) and follow Half 2 (Checkpoint Write) to persist the captured state atomically. Headless mode skips this — the run completes in a single invocation, no resume is meaningful.
|
|
344
348
|
|
|
345
349
|
### 7b. Synthesize Skill Description
|
|
346
350
|
|
|
@@ -383,9 +387,8 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
383
387
|
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). When `{headless_mode}` is true the GATE auto-proceeds and never reaches this branch — `[X]` is interactive-only. Cancellation here is non-destructive: no files have been written yet by step 1.
|
|
384
388
|
- IF Any other: Help user, then [Redisplay Menu Options](#8-present-menu-options)
|
|
385
389
|
|
|
386
|
-
####
|
|
390
|
+
#### Execution rules:
|
|
387
391
|
|
|
388
|
-
- ALWAYS halt and wait for user input after presenting menu
|
|
389
392
|
- **Resolve `{validateBriefInputsHelper}`** from `{validateBriefInputsProbeOrder}`; first existing path wins. HALT if no candidate exists.
|
|
390
393
|
|
|
391
394
|
- **GATE [default: use args]** — If `{headless_mode}`, consume pre-supplied arguments and auto-proceed. The full argument set (required/optional, defaults, halt codes, enum values) is documented in `{headlessArgsFile}` — load it now if you need to look up a specific argument. Validation is delegated to `{validateBriefInputsHelper}`; the table is the canonical operator-facing documentation, the script enforces it.
|
|
@@ -416,9 +419,3 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
416
419
|
|
|
417
420
|
**Headless source-authority detection (derive route only — no `from_brief`).** After consuming `normalized`, if `source_authority` is absent AND `source_type=source` AND `target_repo` is a GitHub URL, load `{headlessSourceAuthorityDetectionFile}` and follow the procedure there. Otherwise (precondition unmet, value already supplied, docs-only, or local-path) skip the load — `community` is the implicit default for the unmet branches.
|
|
418
421
|
|
|
419
|
-
- ONLY proceed to next step when user selects 'C'
|
|
420
|
-
|
|
421
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
422
|
-
|
|
423
|
-
ONLY WHEN C is selected and target repository is confirmed will you load and read fully `analyze-target.md` to execute target analysis.
|
|
424
|
-
|
|
@@ -12,7 +12,7 @@ Loaded by step 1 §8 only when `{headless_mode}` is true. Canonical operator-fac
|
|
|
12
12
|
| `source_authority` | no | detected | `official` / `community` / `internal`. When absent and `target_repo` is a GitHub URL, step 1 §8 GATE probes `gh api user` and compares its login to the URL owner — match → `official`, otherwise → `community`. Local-path or `gh api user` failure → `community`. Forced to `community` when `source_type=docs-only` |
|
|
13
13
|
| `target_version` | no | — | Auto-detected in step 2 if absent. Full X.Y.Z semver required (HALT exit 2, `halt_reason: "input-invalid"` on partial forms like `1`, `1.2`, `v2`) |
|
|
14
14
|
| `scope_hint` | no | — | Free-text steering for §5 |
|
|
15
|
-
| `language_hint` | no | — | Overrides language detection
|
|
15
|
+
| `language_hint` | no | — | Overrides language detection — consumed at step 2 §3: the detector still runs for the informational Detected-language line, but the hint becomes the confirmed language and the step 3 §4 low-confidence override does not fire |
|
|
16
16
|
| `scope_type` | no | heuristic | `full-library` / `specific-modules` / `public-api` / `component-library` / `reference-app` / `docs-only`. When absent and `source_type=source`, step 3 §2c runs five signal-driven heuristics (component-registry presence, reference-app keywords, specific-module intent, narrow public API) and uses the first match; falls back to `full-library` only if no heuristic fires. `source_type=docs-only` always short-circuits to `docs-only` |
|
|
17
17
|
| `include` | no | — | Comma-separated globs (used by step 3 §3) |
|
|
18
18
|
| `exclude` | no | — | Comma-separated globs (used by step 3 §3) |
|
|
@@ -9,25 +9,4 @@ nextStepFile: 'shared/health-check.md'
|
|
|
9
9
|
|
|
10
10
|
# Step 6: Workflow Health Check
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Chain to the shared workflow self-improvement health check at `{nextStepFile}`. This is the terminal step of brief-skill — after the shared health check completes, the workflow is fully done.
|
|
15
|
-
|
|
16
|
-
## Rules
|
|
17
|
-
|
|
18
|
-
- No user-facing reports, file writes, or result contracts in this step — those belong in step 5
|
|
19
|
-
- Delegate directly to `{nextStepFile}` with no additional commentary
|
|
20
|
-
- Do not attempt any other action between loading this step and executing `{nextStepFile}`
|
|
21
|
-
- All user-facing output in `{communication_language}`
|
|
22
|
-
|
|
23
|
-
## MANDATORY SEQUENCE
|
|
24
|
-
|
|
25
|
-
Load `{nextStepFile}`, read it fully, then execute it.
|
|
26
|
-
|
|
27
|
-
## Completion criteria
|
|
28
|
-
|
|
29
|
-
This is the terminal step of brief-skill. The workflow is complete when `{nextStepFile}` returns control — do not transition to any further step.
|
|
30
|
-
|
|
31
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
32
|
-
|
|
33
|
-
Step 06 is the terminal stage of brief-skill. After `{nextStepFile}` returns control, the brief-skill workflow is fully complete — do not re-enter step 5 or step 6, do not load any further step file, and do not loop back into the workflow.
|
|
12
|
+
This is the terminal step of brief-skill. Load `{nextStepFile}`, read it fully, then execute it — do nothing else here (no user-facing reports, file writes, or result contracts; those were step 5). After `{nextStepFile}` returns control, the brief-skill workflow is fully complete: do not re-enter step 5 or step 6, load any further step file, or loop back into the workflow.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Invocation Contract — skf-brief-skill
|
|
2
|
+
|
|
3
|
+
Full argument set, gate map, exit codes, and headless result envelope for `skf-brief-skill`. Interactive callers can ignore this file; headless automators and pipeline integrators consult it. This is the canonical statement of the `from_brief` ratify contract — the source of truth for both the interactive (`gather-intent.md` §3.1a) and headless (step 1 §8 GATE) ratify paths.
|
|
4
|
+
|
|
5
|
+
## Invocation Contract
|
|
6
|
+
|
|
7
|
+
| Aspect | Detail |
|
|
8
|
+
|--------|--------|
|
|
9
|
+
| **Inputs** | `target_repo` [required], `skill_name` [required], `scope_hint` [optional], `language_hint` [optional], `target_version` [optional], `source_authority` [optional: official/community/internal, default community], `source_type` [optional: source/docs-only, default source], `doc_urls` [optional: list of `url[,label]` for source_type=docs-only or supplemental], `scope_type` [optional: full-library/specific-modules/public-api/component-library/reference-app/docs-only], `include` [optional: comma-separated globs], `exclude` [optional: comma-separated globs], `scripts_intent` [optional: detect/none/free-text, default detect], `assets_intent` [optional: detect/none/free-text, default detect], `intent` [optional: free-text used to derive description], `force` [optional: overwrite existing brief without prompting], `from_brief` [optional: path to a pre-authored `skill-brief.yaml` to *ratify* — when supplied it is the source of truth, `target_repo`/`skill_name` become optional/derived-from-brief, and the run mirrors the interactive §3.1a ratify path: schema-validate, skip analyze-target/scope-definition, write through the canonical writer in place], `[auto]` [optional: bracket modifier passed via pipeline context — when present, BS loads the upstream brief from `brief_path` in pipeline data, enriches it with doc detection, and writes through the canonical writer; requires `brief_path` from AN's `SKF_ANALYZE_RESULT_JSON`] |
|
|
10
|
+
| **Gates** | step 1: Input Gate [use args] | step 3: Confirm Gate [C] | step 4: Confirm Gate [C] |
|
|
11
|
+
| **Outputs** | `skill-brief.yaml` at `{forge_data_folder}/{skill-name}/skill-brief.yaml`; final `SKF_BRIEF_RESULT_JSON` line on stdout when `{headless_mode}` is true |
|
|
12
|
+
| **Headless** | All gates auto-resolve with heuristic-driven or default action when `{headless_mode}` is true; pre-supplied inputs consumed at the gates that would otherwise prompt; absent `source_authority` and `scope_type` are resolved by signal-driven detection (see `references/headless-args.md`); existing briefs are preserved unless `--force` was supplied (HALT with `overwrite-cancelled` otherwise); supplying `from_brief <path>` instead routes the step 1 GATE to the ratify path described in the `from_brief` Inputs cell (schema-validate, skip analyze/scope, write in place — no `--force` needed) rather than deriving a new brief |
|
|
13
|
+
| **Transient-failure retry** | This workflow does **not** auto-retry network or subprocess failures. A failed `gh` fetch (analyze-target.md §1, portfolio-similarity-check.md), QMD probe, or extraction script is logged and surfaced in the final result envelope as a warning, but the workflow continues with whatever signal it has. Headless pipelines that want retry semantics should wrap the invocation at their orchestrator level (e.g. CI re-runner on non-zero exit). Rationale: brief-skill is read-mostly with one terminal write (the YAML at step 5); a partial-signal retry has more failure modes than just re-running the whole workflow, which is cheap. |
|
|
14
|
+
| **Exit codes** | See "Exit Codes" below |
|
|
15
|
+
|
|
16
|
+
## Exit Codes
|
|
17
|
+
|
|
18
|
+
Every HARD HALT in this workflow exits with a stable code so headless automators can branch on the failure class without grepping message text:
|
|
19
|
+
|
|
20
|
+
| Code | Meaning | Raised by |
|
|
21
|
+
| ---- | -------------------- | ------------------------------------------------------------------------------------------ |
|
|
22
|
+
| 0 | success | step 6 (terminal) |
|
|
23
|
+
| 2 | input-missing / input-invalid | step 1 GATE — required headless arg absent (`target_repo`, `skill_name`, or `doc_urls` when `source_type=docs-only`) → `input-missing`; enum violation, malformed semver, non-kebab `skill_name`, or step 5 brief-context schema validation failure → `input-invalid` |
|
|
24
|
+
| 3 | resolution-failure | step 1 §1 (`forge-tier.yaml` missing); step 2 §1 (target inaccessible / `gh auth` fails) |
|
|
25
|
+
| 4 | write-failure | step 1 §1 pre-flight write probe (data folder unwritable: read-only mount, disk full, permissions denied); step 5 §4 (write to `{forge_data_folder}/{skill-name}/skill-brief.yaml` failed) |
|
|
26
|
+
| 5 | overwrite-cancelled | step 5 §2 (existing brief, `force` not supplied) |
|
|
27
|
+
| 6 | user-cancelled | any interactive menu in step 1/03/04 (user selected `[X]` Cancel and exit) |
|
|
28
|
+
|
|
29
|
+
## Result Contract (Headless)
|
|
30
|
+
|
|
31
|
+
When `{headless_mode}` is true, step 5 emits a single-line JSON envelope on **stdout** before chaining to step 6, and every HARD HALT emits the same envelope shape on **stderr** with `status: "error"`:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
SKF_BRIEF_RESULT_JSON: {"status":"success|error","brief_path":"…|null","skill_name":"…","version":"…|null","language":"…|null","scope_type":"…|null","exit_code":0,"halt_reason":null,"mode":"auto|null"}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`status` is `"success"` on the terminal happy path, `"error"` on any HALT. `halt_reason` is one of: `null` (success), `"input-missing"`, `"input-invalid"`, `"forge-tier-missing"`, `"target-inaccessible"`, `"gh-auth-failed"`, `"write-failed"`, `"overwrite-cancelled"`, `"user-cancelled"`. `exit_code` matches the table above. `mode` is `"auto"` when BS was invoked with the `[auto]` flag (pipeline auto-brief generation), `null` otherwise (interactive or headless-without-auto).
|
|
@@ -11,19 +11,13 @@ partyModeSkill: '/bmad-party-mode'
|
|
|
11
11
|
|
|
12
12
|
# Step 3: Scope Definition
|
|
13
13
|
|
|
14
|
-
## STEP GOAL:
|
|
15
|
-
|
|
16
|
-
To collaboratively define the skill's inclusion and exclusion boundaries using the analysis findings from step 02, scope templates, and the user's intent from step 01.
|
|
17
|
-
|
|
18
14
|
## Rules
|
|
19
15
|
|
|
20
|
-
- Focus only on defining scope boundaries — do not write the brief yet (Step 05)
|
|
21
16
|
- Do not make scope decisions unilaterally — user drives all scope choices
|
|
22
17
|
- Produce: scope type, include patterns, exclude patterns
|
|
23
|
-
- All user-facing output in `{communication_language}`
|
|
24
18
|
- **Re-entry from step 4 [R] revise:** prior selections (`scope.type`, `scope.include`, `scope.exclude`, `scope.notes`, `scope.tier_a_include`, `scope.rationale`, `scripts_intent`, `assets_intent`, supplemental `doc_urls`) are preserved as the current state. Re-present them at each section as the existing answer; the user only re-confirms or overrides. Do not reset to the §2c template menu unless the user explicitly asks to start scope over. When `scope.rationale` is preserved and the user changes `chosen` (the scope type) on this pass, recompute `accepted_recommendation` (`chosen == recommended`) and refresh `reason` and `recorded` per the §2c capture rules — revise in place, do not append.
|
|
25
19
|
|
|
26
|
-
##
|
|
20
|
+
## Sequence
|
|
27
21
|
|
|
28
22
|
### 1. Present Scope Context
|
|
29
23
|
|
|
@@ -155,6 +149,8 @@ The analysis detected **{language}** with low confidence. Is this correct, or sh
|
|
|
155
149
|
|
|
156
150
|
Wait for confirmation or override.
|
|
157
151
|
|
|
152
|
+
**Headless:** `language_hint`, when supplied, already set the language at step 02 §3; otherwise accept the detected language and continue. This confirmation prompt is interactive-only, so a headless run never stalls here.
|
|
153
|
+
|
|
158
154
|
### 5. Summarize Scope Decisions
|
|
159
155
|
|
|
160
156
|
"**Scope Summary:**
|
|
@@ -200,9 +196,8 @@ Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Conti
|
|
|
200
196
|
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). Cancellation here is non-destructive — no files have been written yet. `[X]` is interactive-only; the headless GATE never reaches this branch.
|
|
201
197
|
- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#6-present-menu-options)
|
|
202
198
|
|
|
203
|
-
####
|
|
199
|
+
#### Execution rules:
|
|
204
200
|
|
|
205
|
-
- ALWAYS halt and wait for user input after presenting menu
|
|
206
201
|
- **GATE [default: C]** — If `{headless_mode}`: consume the headless inputs from step 1 in priority order:
|
|
207
202
|
- If `scope_type` was supplied, use it (must match one of the six valid types) and skip the §2c template menu.
|
|
208
203
|
- Otherwise auto-select via `{recommendScopeTypeHelper}` — invoke the script with the **same payload shape** documented in §2c but with `mode: "headless"` (presence-only matching for the component-registry rule, since `entry_files` may not be available without an interactive context). Use the returned `scope_type` and log `"headless: scope_type={value} from heuristic={matched_heuristic}"`. The script's docs-only short-circuit handles `source_type=docs-only` automatically.
|
|
@@ -210,11 +205,6 @@ Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Conti
|
|
|
210
205
|
- If `scripts_intent`/`assets_intent` were supplied, record them and skip §5b; otherwise default to `detect`.
|
|
211
206
|
- Set `scope.rationale`: `recommended`/`heuristic` from the script (or `recommended = scope_type` arg, `heuristic = "user-supplied-arg"` when `scope_type` was passed); `chosen = <resolved type>`; `accepted_recommendation = (no scope_type arg)`; `reason = "<script rationale>"` (auto path) or `"headless: scope_type supplied as argument"` (arg path); `recorded = {date}`. No prompt — headless never asks "why".
|
|
212
207
|
- Log: `"headless: scope_type={value} include={n} exclude={n} scripts_intent={value} assets_intent={value}"`.
|
|
213
|
-
- ONLY proceed to next step when user selects 'C'
|
|
214
208
|
- After other menu items execution, return to this menu
|
|
215
209
|
- User can chat or ask questions — always respond and then redisplay menu
|
|
216
210
|
|
|
217
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
218
|
-
|
|
219
|
-
ONLY WHEN C is selected and scope boundaries are confirmed will you load and read fully `confirm-brief.md` to present the complete brief for confirmation.
|
|
220
|
-
|
|
@@ -181,8 +181,4 @@ echo '{"status":"error","skill_name":"{skill_name or unknown}","halt_reason":"{r
|
|
|
181
181
|
|
|
182
182
|
### 7. Chain to Auto-Validate
|
|
183
183
|
|
|
184
|
-
Load, read fully, then execute {nextStepFile} to present the auto-brief validation gate, where the user can approve, edit, or reject the brief before the pipeline continues.
|
|
185
|
-
|
|
186
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
187
|
-
|
|
188
|
-
ONLY WHEN the enriched brief has been written and validated will you load and read fully {nextStepFile} to begin the auto-brief validation gate.
|
|
184
|
+
Load, read fully, then execute {nextStepFile} to present the auto-brief validation gate, where the user can approve, edit, or reject the brief before the pipeline continues. Do this only after the enriched brief has been written and validated.
|
|
@@ -200,10 +200,6 @@ echo '{"status":"error","skill_name":"{skill_name or unknown}","halt_reason":"{r
|
|
|
200
200
|
|
|
201
201
|
### 8. Chain
|
|
202
202
|
|
|
203
|
-
Load, read fully, then execute the appropriate next step file
|
|
203
|
+
Load, read fully, then execute the appropriate next step file — only after the user has made their choice and the corresponding action has been taken (envelope emitted or context hydrated):
|
|
204
204
|
- [A]pprove or [E]dit (after final approve): {nextStepFile} (health-check.md)
|
|
205
205
|
- [R]eject: {rejectTargetFile} (confirm-brief.md)
|
|
206
|
-
|
|
207
|
-
## CRITICAL STEP COMPLETION NOTE
|
|
208
|
-
|
|
209
|
-
ONLY WHEN the user has made their choice (approve, edit-then-approve, or reject) and the appropriate action has been taken (envelope emitted or context hydrated) will you load and read fully the next step file.
|
|
@@ -29,7 +29,7 @@ The brief's `version` field is resolved from three candidate sources, in priorit
|
|
|
29
29
|
|
|
30
30
|
## Invariant
|
|
31
31
|
|
|
32
|
-
When `target_version` is set, the written brief
|
|
32
|
+
When `target_version` is set, the written brief must satisfy:
|
|
33
33
|
|
|
34
34
|
```
|
|
35
35
|
brief.target_version == brief.version
|
|
@@ -18,20 +18,15 @@ forgeTierFile: '{sidecar_path}/forge-tier.yaml'
|
|
|
18
18
|
|
|
19
19
|
# Step 5: Write Brief
|
|
20
20
|
|
|
21
|
-
## STEP GOAL:
|
|
22
|
-
|
|
23
|
-
To generate the complete skill-brief.yaml from the approved brief data and write it to the forge data folder, completing the brief-skill workflow.
|
|
24
|
-
|
|
25
21
|
## Rules
|
|
26
22
|
|
|
27
23
|
- Focus only on writing the file — all decisions have been made
|
|
28
24
|
- Do not change any field values without user request — the brief was already approved
|
|
29
|
-
- Create the output directory if it doesn't exist
|
|
30
25
|
- Chains to the local health-check step via `{nextStepFile}` after completion — the user-facing success summary is NOT the terminal step
|
|
31
26
|
- All user-facing output in `{communication_language}`; written artifact (`description`, `notes`) in `{document_output_language}`
|
|
32
27
|
- **Determinism delegation:** YAML rendering, version-precedence, atomic write, the headless result envelope, and the QMD-collection registry mutation are all delegated to shared SKF scripts. The LLM's job in this step is to assemble inputs, branch on script results, and surface user-facing prose — not to render YAML, JSON envelopes, or YAML-mutation diffs in the model.
|
|
33
28
|
|
|
34
|
-
##
|
|
29
|
+
## Sequence
|
|
35
30
|
|
|
36
31
|
### 1. Reference the Schema (LLM context only)
|
|
37
32
|
|
|
@@ -202,10 +197,22 @@ After compilation, you can:
|
|
|
202
197
|
|
|
203
198
|
**Brief-skill workflow complete.**"
|
|
204
199
|
|
|
205
|
-
###
|
|
200
|
+
### 6b. On-Complete Hook (pipeline integration)
|
|
201
|
+
|
|
202
|
+
If `{onCompleteCommand}` is non-empty (resolved at SKILL.md On Activation §3 from `workflow.on_complete`), invoke it now — after the brief has been written (§3) and the result contract finalized (§4b) — as:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
{onCompleteCommand} --result-path={brief_path}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
where `{brief_path}` is the absolute path captured from the §3 response envelope (the freshly written `skill-brief.yaml`, the stable artifact a downstream consumer chains from).
|
|
206
209
|
|
|
207
|
-
|
|
210
|
+
- On success: log to `workflow_warnings[]` as informational only if the hook emitted stderr (`on_complete hook stderr: …`); otherwise no entry.
|
|
211
|
+
- On non-zero exit / process error: log to `workflow_warnings[]` (`on_complete hook failed (exit {code}): {stderr_snippet}`).
|
|
212
|
+
- **Never fail the workflow on hook errors** — the hook is for pipeline integration (chaining into create-skill, Slack, dashboards, CI), not for gating brief production.
|
|
208
213
|
|
|
209
|
-
|
|
214
|
+
When `{onCompleteCommand}` is empty (bundled default), skip this section entirely — no hook is invoked.
|
|
215
|
+
|
|
216
|
+
### 7. Chain to Health Check
|
|
210
217
|
|
|
211
|
-
|
|
218
|
+
Once the brief file has been written and the success summary displayed, load, read the full file, and execute `{nextStepFile}`. The health-check step is the true terminal step — do not stop here even though the summary reads as final.
|