@deftai/directive-content 0.65.0 → 0.66.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/.githooks/pre-commit +3 -1
- package/QUICK-START.md +8 -4
- package/Taskfile.yml +31 -14
- package/UPGRADING.md +19 -5
- package/commands.md +46 -41
- package/conventions/rule-ownership.json +1 -1
- package/docs/BROWNFIELD.md +37 -33
- package/docs/directive-lifecycle.md +2 -2
- package/docs/getting-started.md +8 -8
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +28 -28
- package/skills/deft-directive-article-review/SKILL.md +4 -4
- package/skills/deft-directive-build/SKILL.md +37 -37
- package/skills/deft-directive-cost/SKILL.md +6 -6
- package/skills/deft-directive-debug/SKILL.md +4 -4
- package/skills/deft-directive-decompose/SKILL.md +15 -15
- package/skills/deft-directive-gh-arch/SKILL.md +3 -3
- package/skills/deft-directive-gh-slice/SKILL.md +2 -2
- package/skills/deft-directive-interview/SKILL.md +12 -12
- package/skills/deft-directive-pre-pr/SKILL.md +3 -3
- package/skills/deft-directive-probe/SKILL.md +9 -9
- package/skills/deft-directive-refinement/SKILL.md +65 -65
- package/skills/deft-directive-release/SKILL.md +3 -3
- package/skills/deft-directive-review-cycle/SKILL.md +4 -4
- package/skills/deft-directive-setup/SKILL.md +71 -71
- package/skills/deft-directive-swarm/SKILL.md +94 -94
- package/skills/deft-directive-sync/SKILL.md +55 -55
- package/skills/deft-directive-triage/SKILL.md +15 -15
- package/tasks/architecture.yml +3 -1
- package/tasks/cache.yml +20 -10
- package/tasks/capacity.yml +8 -4
- package/tasks/change.yml +8 -10
- package/tasks/changelog.yml +3 -1
- package/tasks/codebase.yml +20 -10
- package/tasks/commit.yml +4 -8
- package/tasks/engine.yml +18 -4
- package/tasks/install.yml +4 -8
- package/tasks/issue.yml +8 -10
- package/tasks/migrate.yml +24 -8
- package/tasks/packs.yml +32 -16
- package/tasks/policy.yml +24 -12
- package/tasks/pr.yml +16 -8
- package/tasks/prd.yml +9 -12
- package/tasks/project.yml +14 -14
- package/tasks/reconcile.yml +4 -8
- package/tasks/roadmap.yml +9 -5
- package/tasks/scm.yml +36 -18
- package/tasks/scope-undo.yml +3 -1
- package/tasks/scope.yml +40 -26
- package/tasks/session.yml +4 -2
- package/tasks/slice.yml +8 -10
- package/tasks/spec.yml +10 -12
- package/tasks/swarm.yml +20 -10
- package/tasks/triage-actions.yml +32 -16
- package/tasks/triage-bootstrap.yml +4 -2
- package/tasks/triage-bulk.yml +20 -10
- package/tasks/triage-classify.yml +4 -2
- package/tasks/triage-queue.yml +12 -6
- package/tasks/triage-reconcile.yml +4 -2
- package/tasks/triage-scope-drift.yml +4 -2
- package/tasks/triage-scope.yml +4 -2
- package/tasks/triage-smoketest.yml +4 -2
- package/tasks/triage-subscribe.yml +8 -4
- package/tasks/triage-summary.yml +4 -2
- package/tasks/triage-welcome.yml +4 -2
- package/tasks/ts.yml +3 -1
- package/tasks/umbrella.yml +1 -7
- package/tasks/vbrief.yml +25 -17
- package/tasks/verify.yml +102 -50
- package/templates/agent-prompt-preamble.md +26 -23
- package/templates/agents-entry.md +33 -19
- package/vbrief/conformance/extensions/valid/extension-at-root.vbrief.json +31 -0
- package/vbrief/conformance/extensions/valid/nested-extension-value.vbrief.json +19 -0
- 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
|
-
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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. `
|
|
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 `
|
|
66
|
-
- `SPECIFICATION.md` with real content: "SPECIFICATION.md contains non-redirect content -- this file is deprecated; use scope
|
|
67
|
-
- `PROJECT.md` with real content: "PROJECT.md contains non-redirect content -- this file is deprecated; use `PROJECT-DEFINITION.
|
|
68
|
-
- Missing `PROJECT-DEFINITION.
|
|
69
|
-
- Scope
|
|
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+ (
|
|
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
|
|
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 `./
|
|
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:
|
|
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.
|
|
127
|
+
### 3b: PROJECT-DEFINITION.xbrief.json Validation
|
|
128
128
|
|
|
129
129
|
! Validate the project identity gestalt file:
|
|
130
130
|
|
|
131
|
-
1. ! Check that `./
|
|
132
|
-
- If missing: "WARNING: PROJECT-DEFINITION.
|
|
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 `
|
|
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 `
|
|
139
|
-
- Scan `
|
|
140
|
-
- If stale: "WARNING: PROJECT-DEFINITION.
|
|
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
|
|
142
|
+
### 3c: Validate Root-Level xBRIEF Files
|
|
143
143
|
|
|
144
|
-
! Validate all `./
|
|
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 `
|
|
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
|
|
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 `./
|
|
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
|
|
158
|
+
! Verify that each scope xBRIEF's `plan.status` matches its folder location.
|
|
159
159
|
|
|
160
|
-
1. ! Scan all scope
|
|
161
|
-
2. ! For each
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
188
|
-
- "{N}
|
|
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}
|
|
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
|
|
198
|
-
- ~ If stale or externally-closed
|
|
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
|
|
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.
|
|
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
|
|
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 `
|
|
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 `
|
|
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.
|
|
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 (`
|
|
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
|
|
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 `
|
|
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. **
|
|
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+ (
|
|
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 `./
|
|
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
|
|
287
|
-
- ⊗ Auto-move
|
|
288
|
-
- ⊗ Auto-update
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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.
|
|
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-
|
|
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 `
|
|
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/
|
|
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 `
|
|
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 `
|
|
102
|
-
4. ~ When the audit surfaces a stale acceptance (`accept` decision whose issue is no longer referenced by any `
|
|
103
|
-
5. ⊗ Skip the Phase 4 audit -- silent exit leaves the operator without a record of what landed in `
|
|
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`
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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
|
|
package/tasks/architecture.yml
CHANGED
|
@@ -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
|
-
-
|
|
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: :
|
|
35
|
+
- task: :engine:_ts-build
|
|
36
36
|
cmds:
|
|
37
|
-
-
|
|
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: :
|
|
45
|
+
- task: :engine:_ts-build
|
|
44
46
|
cmds:
|
|
45
|
-
-
|
|
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: :
|
|
55
|
+
- task: :engine:_ts-build
|
|
52
56
|
cmds:
|
|
53
|
-
-
|
|
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: :
|
|
65
|
+
- task: :engine:_ts-build
|
|
60
66
|
cmds:
|
|
61
|
-
-
|
|
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: :
|
|
75
|
+
- task: :engine:_ts-build
|
|
68
76
|
cmds:
|
|
69
|
-
-
|
|
77
|
+
- task: :engine:invoke
|
|
78
|
+
vars:
|
|
79
|
+
ENGINE_CMD: 'cache prune {{.CLI_ARGS}}'
|
package/tasks/capacity.yml
CHANGED
|
@@ -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: :
|
|
28
|
+
- task: :engine:_ts-build
|
|
29
29
|
cmds:
|
|
30
|
-
-
|
|
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: :
|
|
38
|
+
- task: :engine:_ts-build
|
|
37
39
|
cmds:
|
|
38
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
27
|
+
- task: :engine:invoke
|
|
28
|
+
vars:
|
|
29
|
+
ENGINE_CMD: 'change-init --project-root "{{.USER_WORKING_DIR}}" --name {{.CLI_ARGS}}'
|
package/tasks/changelog.yml
CHANGED
|
@@ -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
|
-
-
|
|
24
|
+
- task: :engine:invoke
|
|
25
|
+
vars:
|
|
26
|
+
ENGINE_CMD: 'changelog-resolve-unreleased {{.CLI_ARGS}}'
|
package/tasks/codebase.yml
CHANGED
|
@@ -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: :
|
|
13
|
+
- task: :engine:_ts-build
|
|
14
14
|
cmds:
|
|
15
|
-
-
|
|
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: :
|
|
23
|
+
- task: :engine:_ts-build
|
|
22
24
|
cmds:
|
|
23
|
-
-
|
|
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: :
|
|
33
|
+
- task: :engine:_ts-build
|
|
30
34
|
cmds:
|
|
31
|
-
-
|
|
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: :
|
|
43
|
+
- task: :engine:_ts-build
|
|
38
44
|
cmds:
|
|
39
|
-
-
|
|
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: :
|
|
53
|
+
- task: :engine:_ts-build
|
|
46
54
|
cmds:
|
|
47
|
-
-
|
|
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
|
-
-
|
|
17
|
+
- task: :engine:invoke
|
|
18
|
+
vars:
|
|
19
|
+
ENGINE_CMD: 'commit-lint --project-root "{{.USER_WORKING_DIR}}"'
|