@deftai/directive-content 0.64.0 → 0.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.githooks/_deft-run.sh +14 -0
  2. package/.githooks/pre-commit +9 -10
  3. package/.githooks/pre-push +4 -7
  4. package/QUICK-START.md +8 -4
  5. package/Taskfile.yml +32 -14
  6. package/UPGRADING.md +40 -0
  7. package/commands.md +46 -41
  8. package/conventions/rule-ownership.json +1 -1
  9. package/docs/BROWNFIELD.md +37 -33
  10. package/docs/directive-lifecycle.md +2 -2
  11. package/docs/getting-started.md +8 -8
  12. package/package.json +1 -1
  13. package/packs/skills/skills-pack-0.1.json +28 -28
  14. package/skills/deft-directive-article-review/SKILL.md +4 -4
  15. package/skills/deft-directive-build/SKILL.md +37 -37
  16. package/skills/deft-directive-cost/SKILL.md +6 -6
  17. package/skills/deft-directive-debug/SKILL.md +4 -4
  18. package/skills/deft-directive-decompose/SKILL.md +15 -15
  19. package/skills/deft-directive-gh-arch/SKILL.md +3 -3
  20. package/skills/deft-directive-gh-slice/SKILL.md +2 -2
  21. package/skills/deft-directive-interview/SKILL.md +12 -12
  22. package/skills/deft-directive-pre-pr/SKILL.md +3 -3
  23. package/skills/deft-directive-probe/SKILL.md +9 -9
  24. package/skills/deft-directive-refinement/SKILL.md +65 -65
  25. package/skills/deft-directive-release/SKILL.md +3 -3
  26. package/skills/deft-directive-review-cycle/SKILL.md +4 -4
  27. package/skills/deft-directive-setup/SKILL.md +71 -71
  28. package/skills/deft-directive-swarm/SKILL.md +94 -94
  29. package/skills/deft-directive-sync/SKILL.md +55 -55
  30. package/skills/deft-directive-triage/SKILL.md +15 -15
  31. package/tasks/architecture.yml +3 -1
  32. package/tasks/cache.yml +20 -10
  33. package/tasks/capacity.yml +8 -4
  34. package/tasks/change.yml +8 -10
  35. package/tasks/changelog.yml +3 -1
  36. package/tasks/codebase.yml +20 -10
  37. package/tasks/commit.yml +4 -8
  38. package/tasks/engine.yml +16 -4
  39. package/tasks/install.yml +4 -8
  40. package/tasks/issue.yml +8 -10
  41. package/tasks/migrate.yml +24 -8
  42. package/tasks/packs.yml +32 -16
  43. package/tasks/policy.yml +24 -12
  44. package/tasks/pr.yml +16 -8
  45. package/tasks/prd.yml +9 -12
  46. package/tasks/project.yml +14 -14
  47. package/tasks/reconcile.yml +4 -8
  48. package/tasks/roadmap.yml +9 -5
  49. package/tasks/scm.yml +36 -18
  50. package/tasks/scope-undo.yml +3 -1
  51. package/tasks/scope.yml +40 -26
  52. package/tasks/session.yml +4 -2
  53. package/tasks/slice.yml +8 -10
  54. package/tasks/spec.yml +10 -12
  55. package/tasks/swarm.yml +20 -10
  56. package/tasks/triage-actions.yml +32 -16
  57. package/tasks/triage-bootstrap.yml +4 -2
  58. package/tasks/triage-bulk.yml +20 -10
  59. package/tasks/triage-classify.yml +4 -2
  60. package/tasks/triage-queue.yml +12 -6
  61. package/tasks/triage-reconcile.yml +4 -2
  62. package/tasks/triage-scope-drift.yml +4 -2
  63. package/tasks/triage-scope.yml +4 -2
  64. package/tasks/triage-smoketest.yml +4 -2
  65. package/tasks/triage-subscribe.yml +8 -4
  66. package/tasks/triage-summary.yml +4 -2
  67. package/tasks/triage-welcome.yml +4 -2
  68. package/tasks/ts.yml +3 -1
  69. package/tasks/umbrella.yml +1 -7
  70. package/tasks/vbrief.yml +25 -17
  71. package/tasks/verify.yml +107 -48
  72. package/templates/agent-prompt-preamble.md +16 -16
  73. package/templates/agents-entry.md +23 -19
  74. package/vbrief/conformance/extensions/valid/extension-at-root.vbrief.json +31 -0
  75. package/vbrief/conformance/extensions/valid/nested-extension-value.vbrief.json +19 -0
  76. package/vbrief/schemas/xbrief-core-0.8.schema.json +786 -0
@@ -2,12 +2,12 @@
2
2
  name: deft-directive-sync
3
3
  description: >-
4
4
  Session-start framework sync skill. Pulls latest deft submodule, validates
5
- vBRIEF lifecycle structure, checks folder/status consistency, detects stale
5
+ xBRIEF lifecycle structure, checks folder/status consistency, detects stale
6
6
  origins (RFC D12), and summarizes changes.
7
7
  triggers:
8
8
  - good morning
9
9
  - update deft
10
- - update vbrief
10
+ - update xbrief
11
11
  - sync frameworks
12
12
  ---
13
13
  <!-- AUTO-GENERATED by task packs:render -- DO NOT EDIT MANUALLY -->
@@ -18,7 +18,7 @@ triggers:
18
18
 
19
19
  # Deft Directive Sync
20
20
 
21
- Session-start framework sync -- pull latest deft submodule updates, validate vBRIEF lifecycle structure, and detect stale origins.
21
+ Session-start framework sync -- pull latest deft submodule updates, validate xBRIEF lifecycle structure, and detect stale origins.
22
22
 
23
23
  > **Canonical bootstrap / update path (#761 npm cutover):** Install and upgrade via npm: `npm i -g @deftai/directive` (install) or `npm i -g @deftai/directive@latest` (upgrade); Node >= 20 is required. For machines without Node, the frozen legacy Go installer (`deft-install` / platform-specific `install-*` from GitHub Releases) is a no-Node bootstrap bridge (#1912) -- migrate to npm once Node is available. After a session start the canonical `scripts/doctor.py --session --json` (`deft doctor` / `task doctor`) reports install + payload state and, when the manifest sha shows the payload is stale, recommends `npm i -g @deftai/directive@latest`. Legacy `run upgrade` / `task upgrade` are metadata-only acknowledgment (they do NOT replace the payload), and git-submodule / `task framework:doctor` paths are back-compat only -- the submodule sync in Phases 1-2 below is the legacy update flow, de-emphasized in UPGRADING.md / README. See UPGRADING.md and #761 / #1912.
24
24
 
@@ -30,7 +30,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
30
30
 
31
31
  ## When to Use
32
32
 
33
- - User says "good morning", "update deft", "update vbrief", or "sync frameworks"
33
+ - User says "good morning", "update deft", "update xbrief", or "sync frameworks"
34
34
  - Beginning of a new session where framework updates may be available
35
35
  - After a known upstream deft release
36
36
 
@@ -50,9 +50,9 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
50
50
 
51
51
  A project is **pre-cutover** if ANY of the following are true. This prose mirrors the executable helper in `scripts/_precutover.py`; when in doubt, the helper is canonical.
52
52
 
53
- 1. `SPECIFICATION.md` exists and is neither a deprecation redirect nor a current generated spec export. A current generated spec export contains `<!-- Purpose: rendered specification -->` and `<!-- Source of truth: vbrief/specification.vbrief.json -->`, and `vbrief/specification.vbrief.json` plus all five lifecycle folders exist.
53
+ 1. `SPECIFICATION.md` exists and is neither a deprecation redirect nor a current generated spec export. A current generated spec export contains `<!-- Purpose: rendered specification -->` and `<!-- Source of truth: xbrief/specification.xbrief.json -->`, and `xbrief/specification.xbrief.json` plus all five lifecycle folders exist.
54
54
  2. `PROJECT.md` exists and contains neither the legacy `<!-- deft:deprecated-redirect -->` sentinel NOR the current `Purpose: deprecation redirect` canonical-banner marker (real content, not a deprecation redirect)
55
- 3. `vbrief/specification.vbrief.json` exists but the lifecycle folders (`vbrief/proposed/`, `vbrief/pending/`, `vbrief/active/`, `vbrief/completed/`, `vbrief/cancelled/`) do NOT exist
55
+ 3. `xbrief/specification.xbrief.json` exists but the lifecycle folders (`xbrief/proposed/`, `xbrief/pending/`, `xbrief/active/`, `xbrief/completed/`, `xbrief/cancelled/`) do NOT exist
56
56
 
57
57
  ### Action on Detection
58
58
 
@@ -62,18 +62,18 @@ A project is **pre-cutover** if ANY of the following are true. This prose mirror
62
62
 
63
63
  ! Include specific details about what was detected:
64
64
 
65
- - Missing lifecycle folders: "Create lifecycle folders via the frozen v0.59.0 migrator (#2068), or manually add `vbrief/{proposed,pending,active,completed,cancelled}/` after migrating narratives"
66
- - `SPECIFICATION.md` with real content: "SPECIFICATION.md contains non-redirect content -- this file is deprecated; use scope vBRIEFs in `vbrief/` instead"
67
- - `PROJECT.md` with real content: "PROJECT.md contains non-redirect content -- this file is deprecated; use `PROJECT-DEFINITION.vbrief.json` instead"
68
- - Missing `PROJECT-DEFINITION.vbrief.json`: "Run `task project:render` to generate the project definition"
69
- - Scope vBRIEF in wrong folder: "Status is '{status}' but file is in {folder}/ -- run `task scope:activate <file>` to fix"
65
+ - Missing lifecycle folders: "Create lifecycle folders via the frozen v0.59.0 migrator (#2068), or manually add `xbrief/{proposed,pending,active,completed,cancelled}/` after migrating narratives"
66
+ - `SPECIFICATION.md` with real content: "SPECIFICATION.md contains non-redirect content -- this file is deprecated; use scope xBRIEFs in `xbrief/` instead"
67
+ - `PROJECT.md` with real content: "PROJECT.md contains non-redirect content -- this file is deprecated; use `PROJECT-DEFINITION.xbrief.json` instead"
68
+ - Missing `PROJECT-DEFINITION.xbrief.json`: "Run `task project:render` to generate the project definition"
69
+ - Scope xBRIEF in wrong folder: "Status is '{status}' but file is in {folder}/ -- run `task scope:activate <file>` to fix"
70
70
 
71
71
  ### Model State in Sync Output
72
72
 
73
73
  ! Include a **Document Model** line in the Phase 7 summary:
74
74
 
75
75
  - Pre-cutover detected: "**Document Model**: pre-v0.20 (legacy) -- follow UPGRADING.md § Frozen pre-v0.20 document-model migration (#2068)"
76
- - Post-cutover (lifecycle folders present, no stale artifacts): "**Document Model**: v0.20+ (vBRIEF-centric) -- OK"
76
+ - Post-cutover (lifecycle folders present, no stale artifacts): "**Document Model**: v0.20+ (xBRIEF-centric) -- OK"
77
77
  - Post-cutover with tampered placeholders: "**Document Model**: v0.20+ with warnings -- SPECIFICATION.md or PROJECT.md contains non-redirect content"
78
78
 
79
79
  ⊗ Skip model state detection during sync -- always report the document model state.
@@ -108,57 +108,57 @@ A project is **pre-cutover** if ANY of the following are true. This prose mirror
108
108
 
109
109
  ## Phase 3 -- Structure Validation
110
110
 
111
- ! Validate the vBRIEF lifecycle folder structure and project files.
111
+ ! Validate the xBRIEF lifecycle folder structure and project files.
112
112
 
113
113
  ### 3a: Lifecycle Folder Structure
114
114
 
115
115
  ! Verify all required lifecycle folders exist:
116
116
 
117
- 1. ! Check that the following directories exist under `./vbrief/`:
117
+ 1. ! Check that the following directories exist under `./xbrief/`:
118
118
  - `proposed/`
119
119
  - `pending/`
120
120
  - `active/`
121
121
  - `completed/`
122
122
  - `cancelled/`
123
123
  2. ! Report any missing folders with a clear warning:
124
- - "WARNING: vbrief/{folder}/ does not exist -- lifecycle structure is incomplete"
124
+ - "WARNING: xbrief/{folder}/ does not exist -- lifecycle structure is incomplete"
125
125
  3. ~ If folders are missing, suggest `task migrate:preflight` and the frozen v0.59.0 migrator path (#2068), or creating them manually after migration
126
126
 
127
- ### 3b: PROJECT-DEFINITION.vbrief.json Validation
127
+ ### 3b: PROJECT-DEFINITION.xbrief.json Validation
128
128
 
129
129
  ! Validate the project identity gestalt file:
130
130
 
131
- 1. ! Check that `./vbrief/PROJECT-DEFINITION.vbrief.json` exists
132
- - If missing: "WARNING: PROJECT-DEFINITION.vbrief.json not found -- run `task project:render` to create"
131
+ 1. ! Check that `./xbrief/PROJECT-DEFINITION.xbrief.json` exists
132
+ - If missing: "WARNING: PROJECT-DEFINITION.xbrief.json not found -- run `task project:render` to create"
133
133
  2. ! If the file exists, validate it is well-formed:
134
134
  - Valid JSON (`python3 -m json.tool` or equivalent)
135
- - Top-level `vBRIEFInfo` envelope with `version` field equal to `"0.6"`
135
+ - Top-level `xBRIEFInfo` envelope with `version` field equal to `"0.6"`
136
136
  - `plan` object with `title`, `status`, and `items` fields present
137
137
  - `plan.narratives` values are plain strings (not objects or arrays)
138
- 3. ! **Freshness check**: Compare `vBRIEFInfo.updated` (or `vBRIEFInfo.created` if no `updated`) against recent scope completions:
139
- - Scan `vbrief/completed/` for vBRIEFs with `vBRIEFInfo.updated` timestamps newer than the PROJECT-DEFINITION timestamp
140
- - If stale: "WARNING: PROJECT-DEFINITION.vbrief.json may be stale -- {N} scopes completed since last update. Run `task project:render` to refresh."
138
+ 3. ! **Freshness check**: Compare `xBRIEFInfo.updated` (or `xBRIEFInfo.created` if no `updated`) against recent scope completions:
139
+ - Scan `xbrief/completed/` for xBRIEFs with `xBRIEFInfo.updated` timestamps newer than the PROJECT-DEFINITION timestamp
140
+ - If stale: "WARNING: PROJECT-DEFINITION.xbrief.json may be stale -- {N} scopes completed since last update. Run `task project:render` to refresh."
141
141
 
142
- ### 3c: Validate Root-Level vBRIEF Files
142
+ ### 3c: Validate Root-Level xBRIEF Files
143
143
 
144
- ! Validate all `./vbrief/*.vbrief.json` files at the vbrief root:
144
+ ! Validate all `./xbrief/*.xbrief.json` files at the xbrief root:
145
145
 
146
146
  1. ! Check each file is valid JSON
147
147
  2. ! Verify structural conformance:
148
- - Top-level `vBRIEFInfo` envelope with `version` field present
148
+ - Top-level `xBRIEFInfo` envelope with `version` field present
149
149
  - `plan` object with `title`, `status`, and `items` fields present
150
150
  - `plan.status` values from valid enum: draft, proposed, approved, pending, running, completed, blocked, cancelled
151
- 3. ~ Use `task vbrief:validate` if available for deeper validation
151
+ 3. ~ Use `task xbrief:validate` if available for deeper validation
152
152
  4. ! Report any validation failures with file name and specific violation
153
153
 
154
- ⊗ Overwrite or modify project-level `./vbrief/*.vbrief.json` files -- those are project data, not framework files. Report issues and let the user decide how to fix them.
154
+ ⊗ Overwrite or modify project-level `./xbrief/*.xbrief.json` files -- those are project data, not framework files. Report issues and let the user decide how to fix them.
155
155
 
156
156
  ## Phase 4 -- Lifecycle Consistency Check
157
157
 
158
- ! Verify that each scope vBRIEF's `plan.status` matches its folder location.
158
+ ! Verify that each scope xBRIEF's `plan.status` matches its folder location.
159
159
 
160
- 1. ! Scan all scope vBRIEFs in lifecycle folders (`proposed/`, `pending/`, `active/`, `completed/`, `cancelled/`)
161
- 2. ! For each vBRIEF, check `plan.status` against the expected statuses for its folder:
160
+ 1. ! Scan all scope xBRIEFs in lifecycle folders (`proposed/`, `pending/`, `active/`, `completed/`, `cancelled/`)
161
+ 2. ! For each xBRIEF, check `plan.status` against the expected statuses for its folder:
162
162
  - `proposed/`: status should be `draft` or `proposed`
163
163
  - `pending/`: status should be `approved` or `pending`
164
164
  - `active/`: status should be `running` or `blocked`
@@ -166,38 +166,38 @@ A project is **pre-cutover** if ANY of the following are true. This prose mirror
166
166
  - `cancelled/`: status should be `cancelled`
167
167
  3. ! Report any mismatches:
168
168
  - "MISMATCH: {filename} in {folder}/ has status '{status}' -- expected one of [{expected_statuses}]"
169
- 4. ~ Per vbrief.md convention, trust the status field and suggest correcting the folder location:
169
+ 4. ~ Per `vbrief/vbrief.md` convention, trust the status field and suggest correcting the folder location:
170
170
  - "Suggested fix: move {filename} to {correct_folder}/ (status '{status}' is authoritative)"
171
171
 
172
- ⊗ Auto-move vBRIEFs to fix folder/status mismatches -- report only; user decides during refinement or ad-hoc
172
+ ⊗ Auto-move xBRIEFs to fix folder/status mismatches -- report only; user decides during refinement or ad-hoc
173
173
 
174
174
  ## Phase 5 -- Origin Freshness (RFC D12)
175
175
 
176
- ! For vBRIEFs with external origin references, detect staleness and externally-closed origins.
176
+ ! For xBRIEFs with external origin references, detect staleness and externally-closed origins.
177
177
 
178
178
  ### Step 1: Scan Origins
179
179
 
180
- 1. ! For each vBRIEF in `proposed/` and `pending/` with a `github-issue` reference in `plan.references` or top-level `references`:
180
+ 1. ! For each xBRIEF in `proposed/` and `pending/` with a `github-issue` reference in `plan.references` or top-level `references`:
181
181
  - Extract the issue number from the reference URL or `id` field
182
182
  - Fetch the issue: `gh issue view {N} --repo {owner/repo} --json updatedAt,state`
183
- 2. ! Compare the issue's `updatedAt` against the vBRIEF's `vBRIEFInfo.updated` (or `vBRIEFInfo.created` if no `updated` field)
183
+ 2. ! Compare the issue's `updatedAt` against the xBRIEF's `xBRIEFInfo.updated` (or `xBRIEFInfo.created` if no `updated` field)
184
184
 
185
185
  ### Step 2: Categorize and Report
186
186
 
187
- 1. ! **Stale origins** -- issue `updatedAt` is newer than vBRIEF `updated` timestamp:
188
- - "{N} vBRIEFs have origins updated since last sync"
187
+ 1. ! **Stale origins** -- issue `updatedAt` is newer than xBRIEF `updated` timestamp:
188
+ - "{N} xBRIEFs have origins updated since last sync"
189
189
  - List each: "{filename}: Issue #{N} updated {time_delta} ago"
190
190
  2. ! **Externally closed origins** -- issue state is `CLOSED`:
191
- - "{N} vBRIEFs have origins that were closed externally"
191
+ - "{N} xBRIEFs have origins that were closed externally"
192
192
  - List each: "{filename}: Issue #{N} is closed ({close_reason})"
193
193
  3. ~ **Current origins** -- no changes detected (report count only)
194
194
 
195
195
  ### Step 3: Recommendation
196
196
 
197
- - ! Report only -- never auto-update vBRIEFs based on origin changes
198
- - ~ If stale or externally-closed vBRIEFs are found, suggest: "Run a refinement session (`skills/deft-directive-refinement/SKILL.md`) to reconcile stale origins with user approval."
197
+ - ! Report only -- never auto-update xBRIEFs based on origin changes
198
+ - ~ If stale or externally-closed xBRIEFs are found, suggest: "Run a refinement session (`skills/deft-directive-refinement/SKILL.md`) to reconcile stale origins with user approval."
199
199
 
200
- ⊗ Auto-update vBRIEFs based on origin freshness checks -- report only; user decides during refinement
200
+ ⊗ Auto-update xBRIEFs based on origin freshness checks -- report only; user decides during refinement
201
201
 
202
202
  ## Phase 6 -- Framework Sync
203
203
 
@@ -213,10 +213,10 @@ After structure validation, sync framework-level assets.
213
213
 
214
214
  ### 6b: Check codebase MAP freshness
215
215
 
216
- ~ If `./.planning/codebase/MAP.md` exists, or `PROJECT-DEFINITION.vbrief.json` declares a `projectionManifest[]` entry with `kind: "codebase-map"`, run `task verify:codebase-map-fresh` when the command resolves. If it reports drift, recommend `task codebase:map` and note that the generated MAP is advisory unless the operator asked to refresh projections.
216
+ ~ If `./.planning/codebase/MAP.md` exists, or `PROJECT-DEFINITION.xbrief.json` declares a `projectionManifest[]` entry with `kind: "codebase-map"`, run `task verify:codebase-map-fresh` when the command resolves. If it reports drift, recommend `task codebase:map` and note that the generated MAP is advisory unless the operator asked to refresh projections.
217
217
 
218
218
  - ! Keep `plan.architecture.codeStructure` and configured provider artifacts authoritative; the MAP is a generated projection.
219
- - ⊗ Auto-edit canonical vBRIEF metadata to make the MAP fresh during sync -- report drift and let the operator choose a follow-up.
219
+ - ⊗ Auto-edit canonical xBRIEF metadata to make the MAP fresh during sync -- report drift and let the operator choose a follow-up.
220
220
 
221
221
  ### 6c: List new skills
222
222
 
@@ -228,23 +228,23 @@ After structure validation, sync framework-level assets.
228
228
 
229
229
  ## Phase 6d -- Legacy Artifact Review (post-migration, one-time)
230
230
 
231
- ! If `vbrief/migration/LEGACY-REPORT.md` exists (and has NOT been renamed to `LEGACY-REPORT.reviewed.md`), walk the operator through each captured legacy section and record their disposition inline in the same file. This phase surfaces the non-canonical content that `task migrate:vbrief` preserved via the `LegacyArtifacts` narrative mechanism (#505).
231
+ ! If `xbrief/migration/LEGACY-REPORT.md` exists (and has NOT been renamed to `LEGACY-REPORT.reviewed.md`), walk the operator through each captured legacy section and record their disposition inline in the same file. This phase surfaces the non-canonical content that `task migrate:xbrief` preserved via the `LegacyArtifacts` narrative mechanism (#505).
232
232
 
233
233
  ### Detection
234
234
 
235
- 1. ! Check for `vbrief/migration/LEGACY-REPORT.md` in the project root.
235
+ 1. ! Check for `xbrief/migration/LEGACY-REPORT.md` in the project root.
236
236
  2. ! If the file is absent or `LEGACY-REPORT.reviewed.md` exists (reviewed form), skip Phase 6d silently and proceed to Phase 7.
237
237
  3. ! If `LEGACY-REPORT.md` is present and has NOT been renamed, begin the review loop below.
238
238
 
239
239
  ### Review loop
240
240
 
241
241
  1. ! Present the report summary (sources + per-bucket section counts) to the user.
242
- 2. ! For each captured section listed under `## specification.vbrief.json -> LegacyArtifacts`, `## PROJECT-DEFINITION.vbrief.json -> LegacyArtifacts`, and `## PRD.md content (flagged: hand-edited)`:
242
+ 2. ! For each captured section listed under `## specification.xbrief.json -> LegacyArtifacts`, `## PROJECT-DEFINITION.xbrief.json -> LegacyArtifacts`, and `## PRD.md content (flagged: hand-edited)`:
243
243
  - Restate the section title, source file + line range, and size.
244
244
  - Offer exactly three disposition options: **Keep** (leave inside `LegacyArtifacts`), **Fold into {suggested narrative}** (move into a canonical narrative key), or **Drop** (remove from `LegacyArtifacts`, with explicit user confirmation).
245
- - ~ If a sidecar pointer is present (`vbrief/legacy/{stem}-{slug}.md`), open the sidecar for the user before offering options so the full content is visible.
245
+ - ~ If a sidecar pointer is present (`xbrief/legacy/{stem}-{slug}.md`), open the sidecar for the user before offering options so the full content is visible.
246
246
  3. ! Record each disposition inline in the same `LEGACY-REPORT.md` file under a new `## Reviewed` section with one entry per legacy item: original section, user's decision, target location (if folded) or confirmation note (if kept/dropped), and the reviewer's timestamp.
247
- 4. ! For a **Fold** decision, the agent updates the target vBRIEF's narrative key AND deletes only the corresponding section from the `LegacyArtifacts` narrative -- never the file.
247
+ 4. ! For a **Fold** decision, the agent updates the target xBRIEF's narrative key AND deletes only the corresponding section from the `LegacyArtifacts` narrative -- never the file.
248
248
  5. ! For a **Drop** decision, the agent removes only the corresponding section from the `LegacyArtifacts` narrative.
249
249
  6. ! Once all sections carry a recorded disposition, rename the file to `LEGACY-REPORT.reviewed.md`. The file is kept so the audit trail remains -- ⊗ MUST NOT delete either form.
250
250
 
@@ -254,7 +254,7 @@ After structure validation, sync framework-level assets.
254
254
  - ⊗ Auto-dispose of legacy artifacts without user input -- every section requires an explicit decision.
255
255
  - ⊗ Rename to `.reviewed.md` before every captured section has a recorded disposition in the `## Reviewed` section.
256
256
  - ⊗ Drop a legacy section without explicit user confirmation (even if the section looks obviously stale).
257
- - ⊗ Silently delete sidecar files under `vbrief/legacy/` -- they are referenced from `LegacyArtifacts` and are part of the audit trail.
257
+ - ⊗ Silently delete sidecar files under `xbrief/legacy/` -- they are referenced from `LegacyArtifacts` and are part of the audit trail.
258
258
 
259
259
  ## Phase 7 -- Summary
260
260
 
@@ -263,10 +263,10 @@ After structure validation, sync framework-level assets.
263
263
  1. **DEFT version change**: old commit -> new commit (or "already up to date")
264
264
  2. **Structure validation**: lifecycle folders status (all present / missing folders listed)
265
265
  3. **PROJECT-DEFINITION status**: valid / missing / stale (with freshness details)
266
- 4. **vBRIEF validation results**: pass/fail per file, with details on any failures
266
+ 4. **xBRIEF validation results**: pass/fail per file, with details on any failures
267
267
  5. **Lifecycle consistency**: all consistent / N mismatches found (with details)
268
268
  6. **Origin freshness**: N stale / N externally-closed / N current (with details)
269
- 7. **Document Model**: pre-v0.20 (legacy) / v0.20+ (vBRIEF-centric) OK / v0.20+ with warnings (see Pre-Cutover Detection Guard)
269
+ 7. **Document Model**: pre-v0.20 (legacy) / v0.20+ (xBRIEF-centric) OK / v0.20+ with warnings (see Pre-Cutover Detection Guard)
270
270
  8. **AGENTS.md status**: current / has upstream changes / needs review
271
271
  9. **Codebase MAP status**: current / stale / absent / not configured (advisory)
272
272
  10. **New skills**: list any newly added skills with descriptions
@@ -281,8 +281,8 @@ chore(deft): update deft submodule to <short-hash>
281
281
  ## Anti-Patterns
282
282
 
283
283
  - ⊗ Auto-commit submodule changes without user approval
284
- - ⊗ Overwrite project-level `./vbrief/*.vbrief.json` files -- those are project data
284
+ - ⊗ Overwrite project-level `./xbrief/*.xbrief.json` files -- those are project data
285
285
  - ⊗ Skip the pre-flight dirty check -- a dirty submodule can cause merge conflicts or data loss
286
- - ⊗ Include a separate fetch of the vBRIEF schema from upstream deftai/vBRIEF -- that is a CI concern (see #128), not a user sync task
287
- - ⊗ Auto-move vBRIEFs to fix folder/status mismatches -- report only; never auto-fix
288
- - ⊗ Auto-update vBRIEFs based on origin freshness -- report only; user decides during refinement
286
+ - ⊗ Include a separate fetch of the xBRIEF schema from upstream deftai/xBRIEF -- that is a CI concern (see #128), not a user sync task
287
+ - ⊗ Auto-move xBRIEFs to fix folder/status mismatches -- report only; never auto-fix
288
+ - ⊗ Auto-update xBRIEFs based on origin freshness -- report only; user decides during refinement
@@ -26,7 +26,7 @@ triggers:
26
26
 
27
27
  # Deft Directive Triage
28
28
 
29
- Triage-cache hygiene + "what's next?" queue selection. Operates against the unified `.deft-cache/github-issue/` mirror (#883 Story 2) and the append-only `vbrief/.eval/candidates.jsonl` audit log (#845 Story 2); writes only via the canonical `task triage:*` verbs.
29
+ Triage-cache hygiene + "what's next?" queue selection. Operates against the unified `.deft-cache/github-issue/` mirror (#883 Story 2) and the append-only `xbrief/.eval/candidates.jsonl` audit log (#845 Story 2); writes only via the canonical `task triage:*` verbs.
30
30
 
31
31
  Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
32
32
 
@@ -44,7 +44,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
44
44
 
45
45
  1. ! Run `task verify:cache-fresh` (D5 / #1127). Exit 0 -> proceed to Phase 1. Exit 1 (stale or blocked) -> refresh per the printed remediation. Exit 2 (no bootstrap) -> run `task triage:bootstrap` first.
46
46
  2. ~ Refresh path: `task cache:fetch-all -- --source=github-issue --repo OWNER/NAME` for an already-bootstrapped project (idempotent, TTL-aware, re-applies the #883 scanner v2 quarantine rules); `task triage:bootstrap` for a first-time seed.
47
- 3. ~ If `vbrief/active/*.vbrief.json` references are in play, run `task triage:refresh-active` to compare cached `meta.json.fetched_at` against live upstream `updatedAt` and surface drift before the queue is rendered.
47
+ 3. ~ If `xbrief/active/*.xbrief.json` references are in play, run `task triage:refresh-active` to compare cached `meta.json.fetched_at` against live upstream `updatedAt` and surface drift before the queue is rendered.
48
48
  4. ~ When the one-liner emitted by the session-start ritual carries a `[scope-drift] N` segment (D14 / #1133), run `task triage:scope-drift` to see the per-label / per-milestone breakdown of upstream signals on cached open issues that fall outside the active `plan.policy.triageScope[]` subscription. The output documents both opt-in (`task triage:subscribe -- --label=<L>`) and opt-out (`task triage:scope-drift -- --ignore-label=<L>`) paths -- pick one before walking the queue so the cohort reflects the operator's current intent rather than a stale subscription.
49
49
  5. ⊗ Walk the queue against a stale cache -- the audit log will record decisions against bodies the operator never actually saw.
50
50
 
@@ -53,8 +53,8 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
53
53
  ! Inspect the auto-classification audit log so manually-decided items are not re-walked, and surface anomalies before the queue render.
54
54
 
55
55
  1. ! Run `task triage:classify --list` (D10 / #1129) to render the effective universal + consumer auto-classification rules and the active hold-marker list.
56
- 2. ! Walk recent entries in `vbrief/.eval/candidates.jsonl` for anomalies: classifier disagreements against the operator's prior decisions, repeated `defer` cycles on the same issue, or `needs-ac` records older than the freshness window. Surface anomalies to the operator before Phase 2; do NOT auto-fix.
57
- 3. ~ When the operator wants to widen / narrow the corpus, consult `task triage:scope --list` (D12 / #1131) to see the active `plan.policy.triageScope[]` subscription. Subscription edits belong in PROJECT-DEFINITION.vbrief.json, not in this skill.
56
+ 2. ! Walk recent entries in `xbrief/.eval/candidates.jsonl` for anomalies: classifier disagreements against the operator's prior decisions, repeated `defer` cycles on the same issue, or `needs-ac` records older than the freshness window. Surface anomalies to the operator before Phase 2; do NOT auto-fix.
57
+ 3. ~ When the operator wants to widen / narrow the corpus, consult `task triage:scope --list` (D12 / #1131) to see the active `plan.policy.triageScope[]` subscription. Subscription edits belong in PROJECT-DEFINITION.xbrief.json, not in this skill.
58
58
  4. ~ Issue-label hygiene: labels feed triage queue ranking, issue gauges, hygiene sweeps, and lifecycle reconciliation. When this skill exposes an unlabeled issue or a downstream issue-creation step, recommend choosing one or more suitable labels from the repository's existing label set via `gh label list` or the labels API, or explicitly note that no label was applied. This is a recommendation, not a gate.
59
59
  5. ⊗ Re-classify items already terminally decided (accept / reject / mark-duplicate) without explicit operator approval -- the audit log is append-only and supersession runs through Layer 5 (`task triage:reset <N>`), not through silent re-walks.
60
60
  6. ⊗ Block issue creation solely because no label was selected, or invent ad hoc labels outside the repository's existing label set.
@@ -64,19 +64,19 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
64
64
  ! Render the ranked queue before suggesting any specific issue. The cache-as-authoritative rule in AGENTS.md (`## Cache-as-authoritative work selection (#1149)`) is binding: the agent ! MUST consult `task triage:queue` and surface the result before proposing work from memory.
65
65
 
66
66
  1. ! Run `task triage:queue --limit=N` (D11 / #1128) -- default `N=10` per the umbrella Current Shape v3 WIP cap. Output is grouped `[RESUME]` -> `[URGENT]` -> untriaged -> other; within-group ordering follows the consumer-supplied `plan.policy.triageRankingLabels[]` (framework default empty per §12 boundary), tiebroken by `updated_at` descending.
67
- 2. ! For per-item detail, run `task triage:show <N>` -- prints the cached upstream payload, the latest triage decision, the audit timeline, and the active-vBRIEF reference flag. Exit 0 on hit, 1 on cache miss (re-sync per Phase 0).
67
+ 2. ! For per-item detail, run `task triage:show <N>` -- prints the cached upstream payload, the latest triage decision, the audit timeline, and the active-xBRIEF reference flag. Exit 0 on hit, 1 on cache miss (re-sync per Phase 0).
68
68
  3. ~ Present the ranked queue verbatim; do NOT silently re-rank, drop, or annotate beyond what the canonical renderer emits. If the operator wants a different ordering they edit `plan.policy.triageRankingLabels[]` and re-run.
69
69
  4. ⊗ Recommend a specific issue without consulting `task triage:queue` first, or recommend an issue absent from the queue without first running `task triage:show` to surface why (cache miss / outside subscription / terminal decision).
70
70
 
71
71
  ## Phase 3 -- Decide
72
72
 
73
- ! Walk per-item decisions through the canonical `task triage:*` verbs. The skill does NOT reimplement the audit-log append, schema validation, or `vbrief/proposed/` write inline -- the tasks are the canonical implementation (mirrors the #537 ingest-task discipline).
73
+ ! Walk per-item decisions through the canonical `task triage:*` verbs. The skill does NOT reimplement the audit-log append, schema validation, or `xbrief/proposed/` write inline -- the tasks are the canonical implementation (mirrors the #537 ingest-task discipline).
74
74
 
75
75
  For each candidate the operator selects from the Phase 2 queue, render the canonical numbered action menu and dispatch the matching verb:
76
76
 
77
77
  ```
78
78
  What would you like to do with this candidate?
79
- 1. Accept -- `task triage:accept <N>` (writes proposed/ vBRIEF + audit-log entry)
79
+ 1. Accept -- `task triage:accept <N>` (writes proposed/ xBRIEF + audit-log entry)
80
80
  2. Reject -- `task triage:reject <N>` (audit-log entry only; terminal)
81
81
  3. Defer -- `task triage:defer <N> [--resume-on <event>]` (non-terminal; resurfaces)
82
82
  4. Needs-AC -- `task triage:needs-ac <N>` (non-terminal; flags missing acceptance criteria)
@@ -90,7 +90,7 @@ What would you like to do with this candidate?
90
90
  - ! On `Discuss`, halt the action sequence immediately, prompt `What would you like to discuss?`, and resume only on an explicit user signal. ⊗ Implicit resumption.
91
91
  - ! On `Back`, un-buffer the prior candidate's selection and re-render its action menu -- permitted only before the action has dispatched to a `task triage:*` command. Once dispatched, the audit entry is committed; revisions go through Layer 5 (`task triage:reset`).
92
92
  - ~ Bulk patterns: `task triage:bulk-{accept,reject,defer,needs-ac}` (#845 Story 4) for clear label-driven sweeps; bulk results still flow through the audit log so history stays coherent.
93
- - ⊗ Write to `vbrief/proposed/` directly -- only `task triage:accept` (which delegates to `task issue:ingest`) is authorised for that surface.
93
+ - ⊗ Write to `xbrief/proposed/` directly -- only `task triage:accept` (which delegates to `task issue:ingest`) is authorised for that surface.
94
94
 
95
95
  ## Phase 4 -- Audit
96
96
 
@@ -98,17 +98,17 @@ What would you like to do with this candidate?
98
98
 
99
99
  1. ! Run `task triage:audit --format=json` (D11 / #1128) -- emits the stable `{generated_at, repo, vbrief_staleness, entry_count, entries: [...]}` schema; pipe through `jq` to surface this session's appended entries. For historical look-back, add the #1180 filters: `task triage:audit --since=30d --action=demote --format=json | jq` answers "how many demotes in the last 30 days?" in one call. `--since=<window>` accepts the framework duration grammar (`Nd` / `Nh` / `Nm` / `Nw` / `Ns` or ISO-8601 `PnDTnHnMnS`); `--action=<verb>` filters to a single decision verb (`accept` / `reject` / `defer` / `needs-ac` / `mark-duplicate` / `reset` / `resume-eligible`). Both filters compose with `--format=text` and `--format=json`. The framework deliberately does NOT compute trend lines or apply falsification gates -- the contract is read raw, transform with `jq`.
100
100
  2. ! Run `task triage:summary` (D2 / #1122) -- prints the canonical one-liner `[triage] N untriaged · S stale-defer · M in-flight · WIP X/Y [⚠] [· [scope-drift] N]`. The WIP cap default is 10 per the umbrella Current Shape v3 (overridable via typed `plan.policy.wipCap`). The `⚠` glyph fires only at-or-above cap. The `[scope-drift] N` segment (D14 / #1133) appears only when at least one unsubscribed label/milestone meets the framework `_DRIFT_MIN_ISSUES = 3` threshold; suppressed at zero.
101
- 3. ~ When the summary surfaces a non-zero `[scope-drift] N` (D14 / #1133), surface it to the operator alongside `task triage:scope-drift` output and the matching `task triage:subscribe` / `task triage:unsubscribe` / `task triage:scope-drift -- --ignore-label=<L>` remediation. Subscription mutations record a `subscription-change` audit entry under `vbrief/.eval/subscription-history.jsonl` (sidecar of the existing `candidates.jsonl` audit surface) so future operators can replay how the subscription evolved. After every mutation, run `task triage:bootstrap -- --resume` to backfill newly-subscribed entries / mark newly-out-of-scope entries.
102
- 4. ~ When the audit surfaces a stale acceptance (`accept` decision whose issue is no longer referenced by any `vbrief/active/`), surface it to the operator -- the typical fix is a fresh ingest via `task issue:ingest -- <N>` or a `task triage:reset <N>` if the acceptance was in error.
103
- 5. ⊗ Skip the Phase 4 audit -- silent exit leaves the operator without a record of what landed in `vbrief/proposed/` this session, which is the typical recurrence vector for "what did I just accept?" confusion.
101
+ 3. ~ When the summary surfaces a non-zero `[scope-drift] N` (D14 / #1133), surface it to the operator alongside `task triage:scope-drift` output and the matching `task triage:subscribe` / `task triage:unsubscribe` / `task triage:scope-drift -- --ignore-label=<L>` remediation. Subscription mutations record a `subscription-change` audit entry under `xbrief/.eval/subscription-history.jsonl` (sidecar of the existing `candidates.jsonl` audit surface) so future operators can replay how the subscription evolved. After every mutation, run `task triage:bootstrap -- --resume` to backfill newly-subscribed entries / mark newly-out-of-scope entries.
102
+ 4. ~ When the audit surfaces a stale acceptance (`accept` decision whose issue is no longer referenced by any `xbrief/active/`), surface it to the operator -- the typical fix is a fresh ingest via `task issue:ingest -- <N>` or a `task triage:reset <N>` if the acceptance was in error.
103
+ 5. ⊗ Skip the Phase 4 audit -- silent exit leaves the operator without a record of what landed in `xbrief/proposed/` this session, which is the typical recurrence vector for "what did I just accept?" confusion.
104
104
 
105
- ! Before reporting an umbrella or epic's current status during triage (what is done, what blocks, wave order), fetch `repos/<owner>/<repo>/issues/<N>/comments` via REST, read the `## Current shape (as of pass-N)` comment and any linked context/`LockedDecisions` vBRIEF — never conclude status from the issue body alone (claim-cites-state-surface, #2066 / AGENTS.md #1152).
105
+ ! Before reporting an umbrella or epic's current status during triage (what is done, what blocks, wave order), fetch `repos/<owner>/<repo>/issues/<N>/comments` via REST, read the `## Current shape (as of pass-N)` comment and any linked context/`LockedDecisions` xBRIEF — never conclude status from the issue body alone (claim-cites-state-surface, #2066 / AGENTS.md #1152).
106
106
 
107
107
  ## Reversibility
108
108
 
109
109
  ! To undo a decision, run `task triage:reset <N>`. This writes a `reset` audit entry referencing the prior decision id; history is **never** deleted. `task triage:reset` is the canonical Layer 5 reversibility verb (resolves the V3 audit from 2026-05-13). After a reset, the candidate re-enters the untriaged group on the next `task triage:queue` render so it can be re-walked through Phase 3.
110
110
 
111
- ⊗ Edit or delete prior entries in `vbrief/.eval/candidates.jsonl` to "undo" a decision -- the log is append-only by design and any external mutation breaks the `merge=union` rebase ergonomic (#1144 / N4).
111
+ ⊗ Edit or delete prior entries in `xbrief/.eval/candidates.jsonl` to "undo" a decision -- the log is append-only by design and any external mutation breaks the `merge=union` rebase ergonomic (#1144 / N4).
112
112
 
113
113
  ## Anti-Patterns
114
114
 
@@ -116,7 +116,7 @@ What would you like to do with this candidate?
116
116
  - ⊗ Walk the queue against a stale cache (Phase 0 gate skipped).
117
117
  - ⊗ Reimplement audit-log append / `proposed/` write inline -- the `task triage:*` verbs own those surfaces (#845, #883).
118
118
  - ⊗ Treat `defer` / `needs-ac` as terminal -- they intentionally resurface on the next pass.
119
- - ⊗ Edit `vbrief/.eval/candidates.jsonl` directly to revoke a decision -- use `task triage:reset <N>`.
119
+ - ⊗ Edit `xbrief/.eval/candidates.jsonl` directly to revoke a decision -- use `task triage:reset <N>`.
120
120
 
121
121
  ## EXIT
122
122
 
@@ -124,7 +124,7 @@ What would you like to do with this candidate?
124
124
 
125
125
  ! Provide chaining instructions:
126
126
 
127
- - **Ingestion / evaluation of accepted items**: chain into `skills/deft-directive-refinement/SKILL.md` -- refinement's Phase 1 ingests the `vbrief/proposed/` items this skill just wrote into the rest of the lifecycle.
127
+ - **Ingestion / evaluation of accepted items**: chain into `skills/deft-directive-refinement/SKILL.md` -- refinement's Phase 1 ingests the `xbrief/proposed/` items this skill just wrote into the rest of the lifecycle.
128
128
  - **Cohort dispatch**: chain into `skills/deft-directive-swarm/SKILL.md` -- swarm Phase 0 is queue-driven (N2 / #1142) and consumes the same `task triage:queue` ordering you just walked.
129
129
  - **Fresh-state refresh before re-entry**: run `task cache:fetch-all -- --source=github-issue --repo OWNER/NAME` then re-enter this skill when ready to continue.
130
130
 
@@ -10,4 +10,6 @@ tasks:
10
10
  # Per conventions/task-caching.md: no sources/generates because this target
11
11
  # forwards user-supplied story paths and flags via CLI_ARGS.
12
12
  cmds:
13
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" architecture-preflight-sor {{.CLI_ARGS}}
13
+ - task: :engine:invoke
14
+ vars:
15
+ ENGINE_CMD: 'architecture-preflight-sor {{.CLI_ARGS}}'
package/tasks/cache.yml CHANGED
@@ -32,38 +32,48 @@ tasks:
32
32
  desc: "Cache an entry -- task cache:put -- <source> <key> --raw-file PATH [--ttl-seconds N]"
33
33
  dir: '{{.USER_WORKING_DIR}}'
34
34
  deps:
35
- - task: :ts:build
35
+ - task: :engine:_ts-build
36
36
  cmds:
37
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" cache put {{.CLI_ARGS}}
37
+ - task: :engine:invoke
38
+ vars:
39
+ ENGINE_CMD: 'cache put {{.CLI_ARGS}}'
38
40
 
39
41
  get:
40
42
  desc: "Read an entry -- task cache:get -- <source> <key> [--allow-stale | --no-stale]"
41
43
  dir: '{{.USER_WORKING_DIR}}'
42
44
  deps:
43
- - task: :ts:build
45
+ - task: :engine:_ts-build
44
46
  cmds:
45
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" cache get {{.CLI_ARGS}}
47
+ - task: :engine:invoke
48
+ vars:
49
+ ENGINE_CMD: 'cache get {{.CLI_ARGS}}'
46
50
 
47
51
  invalidate:
48
52
  desc: "Drop an entry -- task cache:invalidate -- <source> <key> [--reason TEXT]"
49
53
  dir: '{{.USER_WORKING_DIR}}'
50
54
  deps:
51
- - task: :ts:build
55
+ - task: :engine:_ts-build
52
56
  cmds:
53
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" cache invalidate {{.CLI_ARGS}}
57
+ - task: :engine:invoke
58
+ vars:
59
+ ENGINE_CMD: 'cache invalidate {{.CLI_ARGS}}'
54
60
 
55
61
  fetch-all:
56
62
  desc: "Bulk populate -- task cache:fetch-all -- --source github-issue --repo OWNER/NAME [--batch-size N] [--delay-ms N] [--ttl-seconds N] [--no-refresh-closed to skip open→closed reconcile]"
57
63
  dir: '{{.USER_WORKING_DIR}}'
58
64
  deps:
59
- - task: :ts:build
65
+ - task: :engine:_ts-build
60
66
  cmds:
61
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" cache fetch-all {{.CLI_ARGS}}
67
+ - task: :engine:invoke
68
+ vars:
69
+ ENGINE_CMD: 'cache fetch-all {{.CLI_ARGS}}'
62
70
 
63
71
  prune:
64
72
  desc: "Drop expired or LRU-evict -- task cache:prune -- [--older-than-days 30] [--source github-issue] [--dry-run] [--to-cap]"
65
73
  dir: '{{.USER_WORKING_DIR}}'
66
74
  deps:
67
- - task: :ts:build
75
+ - task: :engine:_ts-build
68
76
  cmds:
69
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" cache prune {{.CLI_ARGS}}
77
+ - task: :engine:invoke
78
+ vars:
79
+ ENGINE_CMD: 'cache prune {{.CLI_ARGS}}'
@@ -25,14 +25,18 @@ tasks:
25
25
  desc: "Capacity allocation target-vs-actual mix (advisory, offline). task capacity:show [-- --project-root <path>]"
26
26
  dir: '{{.USER_WORKING_DIR}}'
27
27
  deps:
28
- - task: :ts:build
28
+ - task: :engine:_ts-build
29
29
  cmds:
30
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" capacity-show --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
30
+ - task: :engine:invoke
31
+ vars:
32
+ ENGINE_CMD: 'capacity-show --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
31
33
 
32
34
  backfill:
33
35
  desc: "One-time capacity-bucket backfill for completed vBRIEFs (#1606): infer capacityBucket from origin-issue labels + stamp completedAt from git. Dry-run by default; idempotent; never touches cost. -- task capacity:backfill [-- --apply] [--window-only] [--cache-dir <path>] [--json]"
34
36
  dir: '{{.USER_WORKING_DIR}}'
35
37
  deps:
36
- - task: :ts:build
38
+ - task: :engine:_ts-build
37
39
  cmds:
38
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" capacity-backfill --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
40
+ - task: :engine:invoke
41
+ vars:
42
+ ENGINE_CMD: 'capacity-backfill --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
package/tasks/change.yml CHANGED
@@ -7,25 +7,23 @@ vars:
7
7
  DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
8
8
 
9
9
  tasks:
10
- _ts-build:
11
- internal: true
12
- desc: "Build @deftai/cli dist/ before TS-backed gates run (#1828 s2)."
13
- dir: '{{.USER_WORKING_DIR}}'
14
- cmds:
15
- - pnpm --dir "{{.DEFT_ROOT}}" run build
16
10
 
17
11
  changelog:check:
18
12
  desc: Verify CHANGELOG.md has an [Unreleased] section with at least one entry
19
13
  dir: '{{.USER_WORKING_DIR}}'
20
14
  deps:
21
- - _ts-build
15
+ - task: :engine:_ts-build
22
16
  cmds:
23
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" changelog-check --project-root "{{.USER_WORKING_DIR}}"
17
+ - task: :engine:invoke
18
+ vars:
19
+ ENGINE_CMD: 'changelog-check --project-root "{{.USER_WORKING_DIR}}"'
24
20
 
25
21
  change:init:
26
22
  desc: Create a new change proposal directory structure in history/changes/<name>/
27
23
  dir: '{{.USER_WORKING_DIR}}'
28
24
  deps:
29
- - _ts-build
25
+ - task: :engine:_ts-build
30
26
  cmds:
31
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" change-init --project-root "{{.USER_WORKING_DIR}}" --name {{.CLI_ARGS}}
27
+ - task: :engine:invoke
28
+ vars:
29
+ ENGINE_CMD: 'change-init --project-root "{{.USER_WORKING_DIR}}" --name {{.CLI_ARGS}}'
@@ -21,4 +21,6 @@ tasks:
21
21
  desc: "Union-merge CHANGELOG.md [Unreleased] conflicts (#911) -- task changelog:resolve-unreleased [-- --changelog-path PATH] [--dry-run]"
22
22
  dir: '{{.USER_WORKING_DIR}}'
23
23
  cmds:
24
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" changelog-resolve-unreleased {{.CLI_ARGS}}
24
+ - task: :engine:invoke
25
+ vars:
26
+ ENGINE_CMD: 'changelog-resolve-unreleased {{.CLI_ARGS}}'
@@ -10,38 +10,48 @@ tasks:
10
10
  # Per conventions/task-caching.md: no sources/generates because this task
11
11
  # forwards user-supplied paths and project-root flags via CLI_ARGS.
12
12
  deps:
13
- - task: :ts:build
13
+ - task: :engine:_ts-build
14
14
  cmds:
15
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" code-structure-validate --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
15
+ - task: :engine:invoke
16
+ vars:
17
+ ENGINE_CMD: 'code-structure-validate --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
16
18
 
17
19
  extract-default:
18
20
  desc: "Emit the dependency-free default codebase-map artifact to stdout (#1595 PR3)."
19
21
  dir: '{{.USER_WORKING_DIR}}'
20
22
  deps:
21
- - task: :ts:build
23
+ - task: :engine:_ts-build
22
24
  cmds:
23
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" codebase-default-extractor --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
25
+ - task: :engine:invoke
26
+ vars:
27
+ ENGINE_CMD: 'codebase-default-extractor --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
24
28
 
25
29
  provider-map:
26
30
  desc: "Select an external codebase-map provider or fall back to the default artifact (#1595 PR3)."
27
31
  dir: '{{.USER_WORKING_DIR}}'
28
32
  deps:
29
- - task: :ts:build
33
+ - task: :engine:_ts-build
30
34
  cmds:
31
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" codebase-provider --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
35
+ - task: :engine:invoke
36
+ vars:
37
+ ENGINE_CMD: 'codebase-provider --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
32
38
 
33
39
  map:
34
40
  desc: "Generate .planning/codebase/MAP.md from the selected codebase-map artifact (#1595 PR4)."
35
41
  dir: '{{.USER_WORKING_DIR}}'
36
42
  deps:
37
- - task: :ts:build
43
+ - task: :engine:_ts-build
38
44
  cmds:
39
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" codebase-map --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
45
+ - task: :engine:invoke
46
+ vars:
47
+ ENGINE_CMD: 'codebase-map --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
40
48
 
41
49
  projection-registry:
42
50
  desc: "Inspect registered codebase projection kinds (#1595 PR3)."
43
51
  dir: '{{.USER_WORKING_DIR}}'
44
52
  deps:
45
- - task: :ts:build
53
+ - task: :engine:_ts-build
46
54
  cmds:
47
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" codebase-projection-registry {{.CLI_ARGS}}
55
+ - task: :engine:invoke
56
+ vars:
57
+ ENGINE_CMD: 'codebase-projection-registry {{.CLI_ARGS}}'
package/tasks/commit.yml CHANGED
@@ -7,17 +7,13 @@ vars:
7
7
  DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
8
8
 
9
9
  tasks:
10
- _ts-build:
11
- internal: true
12
- desc: "Build @deftai/cli dist/ before TS-backed gates run (#1828 s2)."
13
- dir: '{{.USER_WORKING_DIR}}'
14
- cmds:
15
- - pnpm --dir "{{.DEFT_ROOT}}" run build
16
10
 
17
11
  commit:lint:
18
12
  desc: Validate HEAD commit message against conventional commit format
19
13
  dir: '{{.USER_WORKING_DIR}}'
20
14
  deps:
21
- - _ts-build
15
+ - task: :engine:_ts-build
22
16
  cmds:
23
- - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" commit-lint --project-root "{{.USER_WORKING_DIR}}"
17
+ - task: :engine:invoke
18
+ vars:
19
+ ENGINE_CMD: 'commit-lint --project-root "{{.USER_WORKING_DIR}}"'