@deftai/directive-content 0.55.2 → 0.56.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 (217) hide show
  1. package/.githooks/pre-commit +143 -0
  2. package/.githooks/pre-push +121 -0
  3. package/QUICK-START.md +2 -2
  4. package/Taskfile.yml +934 -0
  5. package/UPGRADING.md +47 -1
  6. package/events/README.md +3 -3
  7. package/package.json +5 -4
  8. package/scripts/_agents_md.py +494 -0
  9. package/scripts/_cache_fetch.py +635 -0
  10. package/scripts/_cache_quota.py +529 -0
  11. package/scripts/_cache_refresh.py +163 -0
  12. package/scripts/_cache_validate.py +209 -0
  13. package/scripts/_content_root.py +42 -0
  14. package/scripts/_doctor_state.py +277 -0
  15. package/scripts/_event_detect.py +305 -0
  16. package/scripts/_events.py +514 -0
  17. package/scripts/_lifecycle_hygiene.py +568 -0
  18. package/scripts/_pathspec.py +91 -0
  19. package/scripts/_policy_show_cli.py +266 -0
  20. package/scripts/_precutover.py +92 -0
  21. package/scripts/_project_context.py +224 -0
  22. package/scripts/_project_definition_io.py +164 -0
  23. package/scripts/_relocate_snapshot.py +209 -0
  24. package/scripts/_relocate_states.py +343 -0
  25. package/scripts/_resolve_preflight_path.py +152 -0
  26. package/scripts/_safe_subprocess.py +167 -0
  27. package/scripts/_session_start_hook.py +205 -0
  28. package/scripts/_sor_gate_diff.py +365 -0
  29. package/scripts/_stdio_utf8.py +59 -0
  30. package/scripts/_triage_bootstrap_gitignore.py +904 -0
  31. package/scripts/_triage_classify_cli.py +122 -0
  32. package/scripts/_triage_queue_cli.py +625 -0
  33. package/scripts/_triage_scope_cli.py +343 -0
  34. package/scripts/_triage_scope_drift_cli.py +121 -0
  35. package/scripts/_triage_scope_ignores.py +286 -0
  36. package/scripts/_triage_scope_milestone.py +432 -0
  37. package/scripts/_triage_scope_mutations.py +337 -0
  38. package/scripts/_triage_scope_renderers.py +207 -0
  39. package/scripts/_triage_smoketest_stages.py +674 -0
  40. package/scripts/_triage_subscribe_cli.py +140 -0
  41. package/scripts/_triage_welcome_cli.py +421 -0
  42. package/scripts/_vbrief_build.py +239 -0
  43. package/scripts/_vbrief_fidelity.py +479 -0
  44. package/scripts/_vbrief_legacy.py +589 -0
  45. package/scripts/_vbrief_reconciliation.py +883 -0
  46. package/scripts/_vbrief_routing.py +277 -0
  47. package/scripts/_vbrief_safety.py +778 -0
  48. package/scripts/_vbrief_sources.py +312 -0
  49. package/scripts/_vbrief_speckit.py +262 -0
  50. package/scripts/_vbrief_story_quality.py +353 -0
  51. package/scripts/_vbrief_validation.py +299 -0
  52. package/scripts/build_dist.py +412 -0
  53. package/scripts/cache.py +1078 -0
  54. package/scripts/cache_scanner.py +745 -0
  55. package/scripts/candidates_log.py +432 -0
  56. package/scripts/capacity_backfill.py +680 -0
  57. package/scripts/capacity_show.py +653 -0
  58. package/scripts/ci_local.py +689 -0
  59. package/scripts/code_structure_validate.py +765 -0
  60. package/scripts/codebase_default_extractor.py +495 -0
  61. package/scripts/codebase_map.py +304 -0
  62. package/scripts/codebase_map_fresh.py +104 -0
  63. package/scripts/codebase_projection_registry.py +94 -0
  64. package/scripts/codebase_provider.py +582 -0
  65. package/scripts/doctor.py +2257 -0
  66. package/scripts/framework_commands.py +505 -0
  67. package/scripts/gh_rest.py +882 -0
  68. package/scripts/github_auth_modes.py +437 -0
  69. package/scripts/github_body.py +292 -0
  70. package/scripts/ip_risk.py +531 -0
  71. package/scripts/issue_emit.py +670 -0
  72. package/scripts/issue_ingest.py +1064 -0
  73. package/scripts/migrate_preflight.py +418 -0
  74. package/scripts/migrate_vbrief.py +2677 -0
  75. package/scripts/monitor_pr.py +401 -0
  76. package/scripts/pack_migrate_lessons.py +336 -0
  77. package/scripts/pack_migrate_patterns.py +254 -0
  78. package/scripts/pack_migrate_rules.py +350 -0
  79. package/scripts/pack_migrate_skills.py +423 -0
  80. package/scripts/pack_migrate_strategies.py +311 -0
  81. package/scripts/pack_migrate_swarm_spec.py +250 -0
  82. package/scripts/pack_render.py +434 -0
  83. package/scripts/packs_slice.py +712 -0
  84. package/scripts/platform_capabilities.py +336 -0
  85. package/scripts/policy.py +2826 -0
  86. package/scripts/policy_set.py +324 -0
  87. package/scripts/pr_check_closing_keywords.py +524 -0
  88. package/scripts/pr_check_protected_issues.py +267 -0
  89. package/scripts/pr_merge_readiness.py +1004 -0
  90. package/scripts/pr_wait_mergeable.py +669 -0
  91. package/scripts/prd_render.py +159 -0
  92. package/scripts/preflight_architecture_sor.py +974 -0
  93. package/scripts/preflight_branch.py +289 -0
  94. package/scripts/preflight_cache.py +974 -0
  95. package/scripts/preflight_gh.py +721 -0
  96. package/scripts/preflight_implementation.py +272 -0
  97. package/scripts/preflight_story_start.py +838 -0
  98. package/scripts/preflight_wip_cap.py +149 -0
  99. package/scripts/probe_session.py +545 -0
  100. package/scripts/project_render.py +293 -0
  101. package/scripts/quarantine_ext.py +237 -0
  102. package/scripts/reconcile_issues.py +1442 -0
  103. package/scripts/refresh-path.ps1 +107 -0
  104. package/scripts/release.py +2030 -0
  105. package/scripts/release_e2e.py +1011 -0
  106. package/scripts/release_publish.py +486 -0
  107. package/scripts/release_rollback.py +980 -0
  108. package/scripts/relocate.py +1034 -0
  109. package/scripts/resolve_changelog_unreleased.py +667 -0
  110. package/scripts/resolve_version.py +490 -0
  111. package/scripts/resume_conditions.py +706 -0
  112. package/scripts/ritual_sentinel.py +609 -0
  113. package/scripts/roadmap_render.py +635 -0
  114. package/scripts/rule_ownership_lint.py +325 -0
  115. package/scripts/scm.py +591 -0
  116. package/scripts/scope_audit_log.py +387 -0
  117. package/scripts/scope_decompose.py +654 -0
  118. package/scripts/scope_demote.py +509 -0
  119. package/scripts/scope_lifecycle.py +1126 -0
  120. package/scripts/scope_undo.py +772 -0
  121. package/scripts/session_start.py +406 -0
  122. package/scripts/setup_ghx.py +339 -0
  123. package/scripts/setup_windows.ps1 +220 -0
  124. package/scripts/slice_audit.py +585 -0
  125. package/scripts/slice_record.py +530 -0
  126. package/scripts/slice_record_existing.py +692 -0
  127. package/scripts/slug_normalize.py +178 -0
  128. package/scripts/spec_render.py +477 -0
  129. package/scripts/spec_validate.py +238 -0
  130. package/scripts/subagent_monitor.py +658 -0
  131. package/scripts/swarm_complete_cohort.py +644 -0
  132. package/scripts/swarm_launch.py +1206 -0
  133. package/scripts/swarm_readiness.py +554 -0
  134. package/scripts/swarm_verify_review_clean.py +438 -0
  135. package/scripts/swarm_worktrees.py +497 -0
  136. package/scripts/toolchain-check.py +52 -0
  137. package/scripts/triage_actions.py +871 -0
  138. package/scripts/triage_bootstrap.py +1153 -0
  139. package/scripts/triage_bulk.py +630 -0
  140. package/scripts/triage_classify.py +932 -0
  141. package/scripts/triage_help.py +1685 -0
  142. package/scripts/triage_queue.py +1944 -0
  143. package/scripts/triage_reconcile.py +581 -0
  144. package/scripts/triage_refresh.py +643 -0
  145. package/scripts/triage_scope.py +999 -0
  146. package/scripts/triage_scope_drift.py +575 -0
  147. package/scripts/triage_smoketest.py +396 -0
  148. package/scripts/triage_subscribe.py +399 -0
  149. package/scripts/triage_summary.py +1011 -0
  150. package/scripts/triage_welcome.py +1178 -0
  151. package/scripts/ts_check_lane.py +86 -0
  152. package/scripts/validate-links.py +64 -0
  153. package/scripts/validate_strategy_output.py +212 -0
  154. package/scripts/vbrief_activate.py +228 -0
  155. package/scripts/vbrief_migrate_conformance.py +368 -0
  156. package/scripts/vbrief_reconcile_graph.py +306 -0
  157. package/scripts/vbrief_reconcile_labels.py +460 -0
  158. package/scripts/vbrief_reconcile_umbrellas.py +741 -0
  159. package/scripts/vbrief_validate.py +1195 -0
  160. package/scripts/verify-stubs.py +61 -0
  161. package/scripts/verify_capacity.py +160 -0
  162. package/scripts/verify_encoding.py +699 -0
  163. package/scripts/verify_hooks_installed.py +206 -0
  164. package/scripts/verify_investigation.py +360 -0
  165. package/scripts/verify_judgment_gates.py +827 -0
  166. package/scripts/verify_no_task_runtime.py +171 -0
  167. package/scripts/verify_scm_boundary.py +509 -0
  168. package/scripts/verify_session_ritual.py +389 -0
  169. package/scripts/verify_tools.py +426 -0
  170. package/scripts/verify_vbrief_conformance.py +478 -0
  171. package/tasks/architecture.yml +13 -0
  172. package/tasks/cache.yml +69 -0
  173. package/tasks/capacity.yml +38 -0
  174. package/tasks/change.yml +46 -0
  175. package/tasks/changelog.yml +24 -0
  176. package/tasks/ci.yml +49 -0
  177. package/tasks/codebase.yml +47 -0
  178. package/tasks/commit.yml +30 -0
  179. package/tasks/core.yml +126 -0
  180. package/tasks/deployments.yml +54 -0
  181. package/tasks/framework.yml +74 -0
  182. package/tasks/install.yml +60 -0
  183. package/tasks/issue.yml +50 -0
  184. package/tasks/migrate.yml +73 -0
  185. package/tasks/packs.yml +92 -0
  186. package/tasks/policy.yml +75 -0
  187. package/tasks/pr.yml +89 -0
  188. package/tasks/prd.yml +39 -0
  189. package/tasks/project.yml +27 -0
  190. package/tasks/reconcile.yml +32 -0
  191. package/tasks/relocate.yml +56 -0
  192. package/tasks/roadmap.yml +28 -0
  193. package/tasks/scm.yml +126 -0
  194. package/tasks/scope-undo.yml +36 -0
  195. package/tasks/scope.yml +141 -0
  196. package/tasks/session.yml +19 -0
  197. package/tasks/setup.yml +37 -0
  198. package/tasks/slice.yml +69 -0
  199. package/tasks/spec.yml +41 -0
  200. package/tasks/swarm.yml +85 -0
  201. package/tasks/toolchain.yml +13 -0
  202. package/tasks/triage-actions.yml +94 -0
  203. package/tasks/triage-bootstrap.yml +43 -0
  204. package/tasks/triage-bulk.yml +75 -0
  205. package/tasks/triage-classify.yml +30 -0
  206. package/tasks/triage-queue.yml +50 -0
  207. package/tasks/triage-reconcile.yml +29 -0
  208. package/tasks/triage-scope-drift.yml +29 -0
  209. package/tasks/triage-scope.yml +31 -0
  210. package/tasks/triage-smoketest.yml +33 -0
  211. package/tasks/triage-subscribe.yml +36 -0
  212. package/tasks/triage-summary.yml +29 -0
  213. package/tasks/triage-welcome.yml +32 -0
  214. package/tasks/ts.yml +328 -0
  215. package/tasks/vbrief.yml +206 -0
  216. package/tasks/verify.yml +292 -0
  217. package/templates/agents-entry.md +1 -1
@@ -0,0 +1,33 @@
1
+ version: '3'
2
+
3
+ # tasks/triage-smoketest.yml -- N6 (#1146) `task triage:smoketest` end-to-end
4
+ # synthetic test of the cache-as-operator-working-set surface.
5
+ #
6
+ # Wired into the parent Taskfile.yml via the `includes:` block under namespace
7
+ # key `triage-smoketest`. The inner task `smoketest` is reachable as
8
+ # `task triage-smoketest:smoketest`; the parent Taskfile exposes the
9
+ # documented `task triage:smoketest` alias.
10
+ #
11
+ # Per `conventions/task-caching.md` (#574): NO `sources:` / `generates:`
12
+ # declarations because user-facing flags (`--verbose`, `--keep-tempdir`,
13
+ # `--cache-only`, `--fixture`) are forwarded via {{.CLI_ARGS}} and
14
+ # go-task's incremental-build cache layer would silently swallow them.
15
+ #
16
+ # Companion script: scripts/triage_smoketest.py (+ scripts/_triage_smoketest_stages.py)
17
+ # Companion fixture: tests/fixtures/triage_smoketest/
18
+ # Companion tests: tests/test_triage_smoketest.py + tests/test_triage_smoketest_fixture.py
19
+ # Pattern reference: tasks/triage-summary.yml (D2 / #1122).
20
+
21
+ vars:
22
+ DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
23
+
24
+ tasks:
25
+ smoketest:
26
+ desc: "Run the N6 (#1146) end-to-end smoketest against the hermetic 20-issue fixture. Exits 0 on PASS / 1 on first failure. -- task triage:smoketest [-- --verbose] [--keep-tempdir] [--cache-only]"
27
+ internal: true
28
+ deps: [":ts:build"]
29
+ dir: '{{.USER_WORKING_DIR}}'
30
+ env:
31
+ DEFT_ROOT: '{{.DEFT_ROOT}}'
32
+ cmds:
33
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" triage-smoketest {{.CLI_ARGS}}
@@ -0,0 +1,36 @@
1
+ version: '3'
2
+
3
+ # tasks/triage-subscribe.yml -- subscribe / unsubscribe mutation verbs (#1133 / D14).
4
+ #
5
+ # Wired into the parent Taskfile.yml via the `includes:` block under namespace
6
+ # key `triage-subscribe`. Inner tasks `subscribe` / `unsubscribe` are
7
+ # reachable as `task triage-subscribe:subscribe` / `triage-subscribe:unsubscribe`.
8
+ # The parent Taskfile exposes the user-facing `task triage:subscribe` /
9
+ # `task triage:unsubscribe` aliases.
10
+ #
11
+ # Per `conventions/task-caching.md` (#574): NO `sources:` / `generates:`
12
+ # declarations -- user-facing flags (`--label`, `--milestone`, `--issue`,
13
+ # `--issue-note`, `--actor`) are forwarded via {{.CLI_ARGS}}.
14
+ #
15
+ # Companion script: scripts/triage_subscribe.py (+ shim).
16
+ # Companion tests: tests/test_triage_subscribe.py.
17
+
18
+ vars:
19
+ DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
20
+
21
+ tasks:
22
+ subscribe:
23
+ desc: "Subscribe to a label / milestone / issue on plan.policy.triageScope[] (#1133 / D14). -- task triage:subscribe -- (--label=L | --milestone=M | --issue=N)"
24
+ internal: true
25
+ deps: [":ts:build"]
26
+ dir: '{{.USER_WORKING_DIR}}'
27
+ cmds:
28
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" triage-subscribe subscribe --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
29
+
30
+ unsubscribe:
31
+ desc: "Unsubscribe a label / milestone / issue from plan.policy.triageScope[] (#1133 / D14). -- task triage:unsubscribe -- (--label=L | --milestone=M | --issue=N)"
32
+ internal: true
33
+ deps: [":ts:build"]
34
+ dir: '{{.USER_WORKING_DIR}}'
35
+ cmds:
36
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" triage-subscribe unsubscribe --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
@@ -0,0 +1,29 @@
1
+ version: '3'
2
+
3
+ # tasks/triage-summary.yml -- D2 (#1122) `task triage:summary` one-liner surface.
4
+ #
5
+ # Wired into the parent Taskfile.yml via the `includes:` block under namespace
6
+ # key `triage-summary`. The inner task `summary` is reachable as
7
+ # `task triage-summary:summary`; the parent Taskfile exposes the documented
8
+ # `task triage:summary` alias.
9
+ #
10
+ # Per `conventions/task-caching.md` (#574): NO `sources:` / `generates:`
11
+ # declarations because user-facing flags (`--project-root`, `--cache-root`,
12
+ # `--no-history`, `--json`) are forwarded via {{.CLI_ARGS}} and go-task's
13
+ # incremental-build cache layer would silently swallow them.
14
+ #
15
+ # Companion script: scripts/triage_summary.py
16
+ # Companion tests: tests/test_triage_summary.py
17
+ # Pattern reference: tasks/triage-scope.yml (D12 / #1131 / merged via #1190).
18
+
19
+ vars:
20
+ DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
21
+
22
+ tasks:
23
+ summary:
24
+ desc: "Emit the D2 (#1122) one-line triage state for the session-start ritual (N9 / #1149). Always exits 0; appends a JSONL record to vbrief/.eval/summary-history.jsonl. -- task triage:summary -- [--json] [--no-history]"
25
+ internal: true
26
+ deps: [":ts:build"]
27
+ dir: '{{.USER_WORKING_DIR}}'
28
+ cmds:
29
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" triage-summary --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
@@ -0,0 +1,32 @@
1
+ version: '3'
2
+
3
+ # tasks/triage-welcome.yml -- N3 (#1143) `task triage:welcome` 6-phase
4
+ # onboarding ritual surface.
5
+ #
6
+ # Wired into the parent Taskfile.yml via the `includes:` block under
7
+ # namespace key `triage-welcome`. The inner task `welcome` is reachable
8
+ # as `task triage-welcome:welcome`; the parent Taskfile exposes the
9
+ # documented `task triage:welcome` alias.
10
+ #
11
+ # Per `conventions/task-caching.md` (#574): NO `sources:` / `generates:`
12
+ # declarations because user-facing flags (`--project-root`,
13
+ # `--no-subprocess`) are forwarded via {{.CLI_ARGS}} and go-task's
14
+ # incremental-build cache layer would silently swallow them.
15
+ #
16
+ # Companion script: scripts/triage_welcome.py (+ scripts/_triage_welcome_cli.py)
17
+ # Companion tests: tests/test_triage_welcome.py
18
+ # Pattern reference: tasks/triage-summary.yml (D2 / #1122).
19
+
20
+ vars:
21
+ DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
22
+
23
+ tasks:
24
+ welcome:
25
+ desc: "Run the 6-phase onboarding ritual (N3 / #1143): detect prior state, prompt subscription scope, run triage:bootstrap, prompt wipCap, offer WIP relief, print triage:summary. Idempotent; re-run resumes cleanly. -- task triage:welcome -- [--no-subprocess]"
26
+ internal: true
27
+ deps: [":ts:build"]
28
+ dir: '{{.USER_WORKING_DIR}}'
29
+ env:
30
+ DEFT_TASK_PREFIX: '{{.DEFT_TASK_PREFIX | default ""}}'
31
+ cmds:
32
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" triage-welcome --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
package/tasks/ts.yml ADDED
@@ -0,0 +1,328 @@
1
+ version: '3'
2
+
3
+ # TypeScript engine monorepo verbs (#1717). The TS engine lives at the repo
4
+ # root (packages/*) and coexists with the Python/Go engine during the
5
+ # strangler-fig migration.
6
+ #
7
+ # `check:framework-source` now runs the TS lane via the `ts:check-lane`
8
+ # Node-toolchain-aware guard (#1790): when `pnpm` is on PATH it runs
9
+ # lint+build+test, and when it is absent it skips with a notice and exits 0
10
+ # (so the gate still works in Node-less environments, mirroring the #1474
11
+ # vendored-consumer guards). This closed the PR #1780 gap where a TS biome
12
+ # failure passed a local `task check` but reddened CI. The dedicated `ts` CI
13
+ # job still runs the lane unconditionally.
14
+ #
15
+ # DEFT_ROOT resolves to the repo root (this fragment lives in tasks/, so
16
+ # {{.TASKFILE_DIR}}/.. is the root), matching the sibling task fragments.
17
+
18
+ vars:
19
+ DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
20
+
21
+ tasks:
22
+ build:
23
+ desc: "Build the TypeScript engine monorepo (tsc -b project references, #1717)"
24
+ dir: '{{.DEFT_ROOT}}'
25
+ cmds:
26
+ - pnpm run build
27
+
28
+ test:
29
+ desc: "Run the TypeScript engine test suite with coverage (vitest, #1717)"
30
+ dir: '{{.DEFT_ROOT}}'
31
+ cmds:
32
+ - pnpm run test
33
+
34
+ lint:
35
+ desc: "Lint + format-check the TypeScript engine (biome, #1717)"
36
+ dir: '{{.DEFT_ROOT}}'
37
+ cmds:
38
+ - pnpm run lint
39
+
40
+ check-lane:
41
+ desc: "Run the TS lane (lint+build+test) when a Node toolchain is present; skip with a notice otherwise (#1530 local-gate<->CI parity, #1790)."
42
+ dir: '{{.DEFT_ROOT}}'
43
+ cmds:
44
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" ts-check-lane --project-root "{{.DEFT_ROOT}}"
45
+
46
+ encoding:
47
+ desc: "Run the ported verify:encoding gate (TS @deftai/core port, #1718)"
48
+ deps: [build]
49
+ cmds:
50
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/verify-encoding.js" --all --project-root "{{.DEFT_ROOT}}"
51
+
52
+ parity:
53
+ desc: "Golden-diff the ported verify:encoding gate vs the Python oracle, cache-off (#1718)"
54
+ deps: [build]
55
+ cmds:
56
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/parity.js"
57
+
58
+ policy-parity:
59
+ desc: "Golden-diff the ported policy surface vs the Python oracle, cache-off (#1722)"
60
+ deps: [build]
61
+ cmds:
62
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/policy-parity.js"
63
+
64
+ preflight-parity:
65
+ desc: "Golden-diff the ported vBRIEF preflight gate vs the Python oracle, cache-off (#1721)"
66
+ deps: [build]
67
+ cmds:
68
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-preflight-parity.js"
69
+
70
+ story-ready-parity:
71
+ desc: "Golden-diff the ported verify:story-ready gate vs the Python oracle, cache-off (#1720)"
72
+ deps: [build]
73
+ cmds:
74
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/story-ready-parity.js"
75
+
76
+ branch-parity:
77
+ desc: "Golden-diff the ported verify:branch gate vs the Python oracle, cache-off (#1719)"
78
+ deps: [build]
79
+ cmds:
80
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/branch-parity.js"
81
+
82
+ wip-cap-parity:
83
+ desc: "Golden-diff the ported verify:wip-cap gate vs the Python oracle, cache-off (#1723)"
84
+ deps: [build]
85
+ cmds:
86
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/wip-cap-parity.js"
87
+
88
+ scm-parity:
89
+ desc: "Golden-diff the ported scm.py SCM boundary vs the Python oracle, cache-off (#1724)"
90
+ deps: [build]
91
+ cmds:
92
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/scm-parity.js"
93
+
94
+ triage-parity:
95
+ desc: "Golden-diff every ported triage verb vs its Python oracle, cache-off (#1530 Wave 3, #1725)"
96
+ deps: [build]
97
+ cmds:
98
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-queue-parity.js"
99
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-summary-parity.js"
100
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-classify-parity.js"
101
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-actions-parity.js"
102
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-bootstrap-parity.js"
103
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-scope-parity.js"
104
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-aux-a-parity.js"
105
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-aux-b-parity.js"
106
+
107
+ scope-lifecycle-parity:
108
+ desc: "Golden-diff the ported scope:* lifecycle family vs the Python oracle, cache-off (#1726)"
109
+ deps: [build]
110
+ cmds:
111
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/scope-lifecycle-parity.js"
112
+
113
+ slice-parity:
114
+ desc: "Golden-diff the ported slice:* family vs the Python oracle, cache-off (#1727)"
115
+ deps: [build]
116
+ cmds:
117
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/slice-parity.js"
118
+
119
+ cache-parity:
120
+ desc: "Golden-diff the ported unified content cache vs the Python oracle, cache-off (#1728)"
121
+ deps: [build]
122
+ cmds:
123
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/cache-parity.js"
124
+
125
+ doctor-parity:
126
+ desc: "Golden-diff the ported deft doctor vs the Python oracle, cache-off (#1728)"
127
+ deps: [build]
128
+ cmds:
129
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/doctor-parity.js"
130
+
131
+ release-parity:
132
+ desc: "Golden-diff the ported release.py core vs the Python oracle, cache-off (#1729)"
133
+ deps: [build]
134
+ cmds:
135
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-parity.js"
136
+
137
+ release-publish-parity:
138
+ desc: "Golden-diff the ported release_publish.py vs the Python oracle, cache-off (#1729)"
139
+ deps: [build]
140
+ cmds:
141
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-publish-parity.js"
142
+
143
+ release-rollback-parity:
144
+ desc: "Golden-diff the ported release_rollback.py vs the Python oracle, cache-off (#1729)"
145
+ deps: [build]
146
+ cmds:
147
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-rollback-parity.js"
148
+
149
+ release-e2e-parity:
150
+ desc: "Golden-diff the ported release_e2e.py vs the Python oracle, cache-off (#1729)"
151
+ deps: [build]
152
+ cmds:
153
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-e2e-parity.js"
154
+
155
+ pr-merge-readiness-parity:
156
+ desc: "Golden-diff the ported pr_merge_readiness.py vs the Python oracle, cache-off (#1730)"
157
+ deps: [build]
158
+ cmds:
159
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-merge-readiness-parity.js"
160
+
161
+ pr-protected-issues-parity:
162
+ desc: "Golden-diff the ported pr_check_protected_issues.py vs the Python oracle, cache-off (#1730)"
163
+ deps: [build]
164
+ cmds:
165
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-protected-issues-parity.js"
166
+
167
+ pr-closing-keywords-parity:
168
+ desc: "Golden-diff the ported pr_check_closing_keywords.py vs the Python oracle, cache-off (#1730)"
169
+ deps: [build]
170
+ cmds:
171
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-closing-keywords-parity.js"
172
+
173
+ pr-monitor-parity:
174
+ desc: "Golden-diff the ported monitor_pr.py vs the Python oracle, cache-off (#1730)"
175
+ deps: [build]
176
+ cmds:
177
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-monitor-parity.js"
178
+
179
+ pr-wait-mergeable-parity:
180
+ desc: "Golden-diff the ported pr_wait_mergeable.py cascade composer vs the Python oracle, cache-off (#1730)"
181
+ deps: [build]
182
+ cmds:
183
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-wait-mergeable-parity.js"
184
+
185
+ vbrief-build-parity:
186
+ desc: "Golden-diff the ported vBRIEF construction foundation vs the Python oracle, cache-off (#1782 s1)"
187
+ deps: [build]
188
+ cmds:
189
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-build-parity.js"
190
+
191
+ vbrief-reconcile-parity:
192
+ desc: "Golden-diff the ported vBRIEF reconciliation engine vs the Python oracle, cache-off (#1782 s4)"
193
+ deps: [build]
194
+ cmds:
195
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-reconcile-parity.js"
196
+
197
+ vbrief-validation-parity:
198
+ desc: "Golden-diff the ported vBRIEF validation primitives vs the Python oracle, cache-off (#1782 s2)"
199
+ deps: [build]
200
+ cmds:
201
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-validation-parity.js"
202
+
203
+ vbrief-validate-parity:
204
+ desc: "Golden-diff the ported vbrief:validate + verify:vbrief-conformance gates vs the Python oracle, cache-off (#1782 s3)"
205
+ deps: [build]
206
+ cmds:
207
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-validate-parity.js"
208
+
209
+ vbrief-activate-parity:
210
+ desc: "Golden-diff the ported vbrief_activate.py lifecycle verb vs the Python oracle, cache-off (#1782 s5)"
211
+ deps: [build]
212
+ cmds:
213
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-activate-parity.js"
214
+
215
+ verify-env-parity:
216
+ desc: "Golden-diff the ported verify_tools / verify_hooks_installed / toolchain-check / verify_no_task_runtime gates vs the Python oracle, cache-off (#1783 s1)"
217
+ deps: [build]
218
+ cmds:
219
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/verify-env-parity.js"
220
+
221
+ verify-source-parity:
222
+ desc: "Golden-diff the ported source-tree scanner gates vs the Python oracle, cache-off (#1783 s2)"
223
+ deps: [build]
224
+ cmds:
225
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/verify-source-parity.js"
226
+
227
+ validate-content-parity:
228
+ desc: "Golden-diff the ported content validator gates vs the Python oracle, cache-off (#1783 s3)"
229
+ deps: [build]
230
+ cmds:
231
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/validate-content-parity.js"
232
+
233
+ render-parity:
234
+ desc: "Golden-diff the ported spec/PRD/render family vs the Python oracle, cache-off (#1785)"
235
+ deps: [build]
236
+ cmds:
237
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/render-parity.js"
238
+
239
+ codebase-parity:
240
+ desc: "Golden-diff the ported codebase mapping + capacity modules vs the Python oracle, cache-off (#1786)"
241
+ deps: [build]
242
+ cmds:
243
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/codebase-parity.js"
244
+
245
+ intake-parity:
246
+ desc: "Golden-diff the ported issue intake + reconcile surface vs the Python oracle, cache-off (#1784)"
247
+ deps: [build]
248
+ cmds:
249
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/intake-parity.js"
250
+
251
+ lifecycle-packs-parity:
252
+ desc: "Golden-diff the ported lifecycle hygiene + events + packs surface vs the Python oracle, cache-off (#1787 s2)"
253
+ deps: [build]
254
+ cmds:
255
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/lifecycle-packs-parity.js"
256
+
257
+ session-parity:
258
+ desc: "Golden-diff the ported session/ritual core vs the Python oracle, cache-off (#1787 s1)"
259
+ deps: [build]
260
+ cmds:
261
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/session-parity.js"
262
+
263
+ orchestration-parity:
264
+ desc: "Golden-diff the ported monitor/investigation gate verbs vs the Python oracle, cache-off (#1788 s2)"
265
+ deps: [build]
266
+ cmds:
267
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/orchestration-parity.js"
268
+
269
+ swarm-parity:
270
+ desc: "Golden-diff the ported swarm cohort verbs vs the Python oracle, cache-off (#1788 s1)"
271
+ deps: [build]
272
+ cmds:
273
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/swarm-parity.js"
274
+
275
+ platform-parity:
276
+ desc: "Golden-diff the ported AGENTS.md/version/platform utilities vs the Python oracle, cache-off (#1787 s3)"
277
+ deps: [build]
278
+ cmds:
279
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/platform-parity.js"
280
+
281
+ parity-all:
282
+ desc: "Run every TS-port golden-diff parity harness vs the Python oracle (#1530 Wave 2)"
283
+ deps: [build]
284
+ cmds:
285
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/parity.js"
286
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/policy-parity.js"
287
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-preflight-parity.js"
288
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/story-ready-parity.js"
289
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/branch-parity.js"
290
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/wip-cap-parity.js"
291
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/scm-parity.js"
292
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-queue-parity.js"
293
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-summary-parity.js"
294
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-classify-parity.js"
295
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-actions-parity.js"
296
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-bootstrap-parity.js"
297
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-scope-parity.js"
298
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-aux-a-parity.js"
299
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/triage-aux-b-parity.js"
300
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/scope-lifecycle-parity.js"
301
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/slice-parity.js"
302
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/cache-parity.js"
303
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/doctor-parity.js"
304
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-parity.js"
305
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-publish-parity.js"
306
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-rollback-parity.js"
307
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/release-e2e-parity.js"
308
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-merge-readiness-parity.js"
309
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-protected-issues-parity.js"
310
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-closing-keywords-parity.js"
311
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-monitor-parity.js"
312
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/pr-wait-mergeable-parity.js"
313
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-build-parity.js"
314
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-reconcile-parity.js"
315
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-validation-parity.js"
316
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-validate-parity.js"
317
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/vbrief-activate-parity.js"
318
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/verify-env-parity.js"
319
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/verify-source-parity.js"
320
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/validate-content-parity.js"
321
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/render-parity.js"
322
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/codebase-parity.js"
323
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/intake-parity.js"
324
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/lifecycle-packs-parity.js"
325
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/session-parity.js"
326
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/orchestration-parity.js"
327
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/swarm-parity.js"
328
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/platform-parity.js"
@@ -0,0 +1,206 @@
1
+ version: '3'
2
+
3
+ vars:
4
+ DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
5
+
6
+ tasks:
7
+ _ts-build:
8
+ internal: true
9
+ desc: "Build @deftai/cli dist/ before TS-backed gates run (#1828 s2)."
10
+ dir: '{{.DEFT_ROOT}}'
11
+ cmds:
12
+ - pnpm run build
13
+
14
+ validate:
15
+ desc: Validate vBRIEF lifecycle folder structure and cross-file consistency
16
+ dir: '{{.USER_WORKING_DIR}}'
17
+ deps:
18
+ - _ts-build
19
+ cmds:
20
+ # Oracle/fallback (parity): scripts/vbrief_validate.py (#1828 Wave 8).
21
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" vbrief:validate --vbrief-dir "{{.USER_WORKING_DIR}}/vbrief"
22
+
23
+ preflight:
24
+ # Implementation-intent preflight wrapper (#810 / PR #812 fixup;
25
+ # #1046 PR-C / #1047 fail-closed resolver). Skill files
26
+ # (skills/deft-directive-build/SKILL.md Step 0,
27
+ # skills/deft-directive-swarm/SKILL.md Phase 0 Step 1) and the
28
+ # AGENTS.md template (templates/agents-entry.md Implementation Intent
29
+ # Gate block) reference THIS task rather than the underlying Python
30
+ # script directly so the skills are path-prefix-agnostic across the
31
+ # three supported install layouts:
32
+ #
33
+ # 1. ``.deft/core/scripts/...`` (v0.27+ canonical install per #992)
34
+ # 2. ``deft/scripts/...`` (legacy v0.20-v0.26 install)
35
+ # 3. ``scripts/...`` (in-repo case: deft framework itself)
36
+ #
37
+ # The wrapped ``preflight_implementation.py`` script is located
38
+ # via ``scripts/_resolve_preflight_path.py`` (#1046 PR-C / #1047),
39
+ # which probes the three candidate locations under
40
+ # ``{{.USER_WORKING_DIR}}`` in priority order and exits 2 with a
41
+ # structured ``gate misconfigured`` error pointing at
42
+ # ``task framework:doctor`` (#1046 PR-B / #1057) when no candidate
43
+ # resolves. The two-step invocation (resolve, then run) makes the
44
+ # fail-closed semantic explicit: if the resolver returns non-zero
45
+ # the inline ``sh:`` block exits with the same code BEFORE the
46
+ # downstream ``uv run python <script>`` ever fires, so the gate
47
+ # never silently fails open on a misconfigured install (the safety
48
+ # regression #1047 described).
49
+ #
50
+ # The resolver script ITSELF is dispatched via ``{{.DEFT_ROOT}}``
51
+ # (the Taskfile-relative install root) so it lives wherever the
52
+ # framework lives -- the resolver then probes the consumer's
53
+ # project root via ``{{.USER_WORKING_DIR}}``.
54
+ #
55
+ # The task bakes ``--vbrief-path`` so callers pass only the vBRIEF
56
+ # path: ``task vbrief:preflight -- <path>``.
57
+ #
58
+ # CLI_ARGS forwarding (#577): bare ``{{.CLI_ARGS}}`` -- DO NOT wrap
59
+ # in Taskfile-level double quotes. go-task already shell-escapes
60
+ # CLI_ARGS with single quotes, so wrapping in double quotes yields
61
+ # ``"'path'"`` at dispatch time on Windows (pwsh/cmd preserve nested
62
+ # quotes verbatim) and Python's argv receives a literal
63
+ # single-quote-prefixed filename that fails to open. This matches
64
+ # the convention enforced by tests/content/test_taskfile_cli_args.py
65
+ # and used in tasks/scope.yml / migrate.yml / prd.yml / etc.
66
+ # (Greptile P2 suggestion to quote was a false-positive against this
67
+ # project's established convention.)
68
+ #
69
+ # NOTE: NO ``sources:`` / ``generates:`` per ``conventions/task-caching.md``
70
+ # because the vBRIEF path is a user-facing argument forwarded via
71
+ # {{.CLI_ARGS}} and a cached cmds skip would silently swallow it.
72
+ desc: "Preflight an implementation-intent gate (#810): exits 0 only when vBRIEF is in vbrief/active/ AND plan.status == 'running'. Fails closed (#1046 PR-C / #1047) if the wrapped script cannot be resolved."
73
+ dir: '{{.USER_WORKING_DIR}}'
74
+ deps:
75
+ - _ts-build
76
+ cmds:
77
+ # Oracle/fallback (parity): scripts/preflight_implementation.py (#1828 Wave 8).
78
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" vbrief:preflight --vbrief-path {{.CLI_ARGS}}
79
+
80
+ reconcile:graph:
81
+ # Cascade-unblock walker (#1287). Walks vbrief/proposed/, resolves each
82
+ # candidate's plan.metadata.swarm.depends_on[] against current lifecycle
83
+ # state, and promotes (proposed/ -> pending/ via scope_lifecycle) every
84
+ # candidate whose dependencies ALL resolve to a brief in completed/ or
85
+ # cancelled/. Pure-vBRIEF / forge-agnostic: reuses the swarm_readiness.py
86
+ # dep-graph + cycle machinery and the scope_lifecycle promote surface.
87
+ # WIP-cap aware, cycle-safe (exit 1 on a detected cycle), and idempotent
88
+ # (a second run is a no-op). Pass-through flags: --force (override the WIP
89
+ # cap, audited), --dry-run (report without moving), --json (machine
90
+ # summary).
91
+ #
92
+ # CLI_ARGS forwarding (#577): bare ``{{.CLI_ARGS}}`` -- DO NOT wrap in
93
+ # Taskfile-level double quotes. go-task already shell-escapes CLI_ARGS
94
+ # with single quotes; double-wrapping breaks Windows argv. See the
95
+ # preflight task below for the full rationale.
96
+ #
97
+ # NOTE: NO ``sources:`` / ``generates:`` per ``conventions/task-caching.md``
98
+ # because the walk reads/writes lifecycle folders that go-task does not
99
+ # track, so a cached skip would silently swallow real promotions.
100
+ desc: "Reconcile dep graph: promote proposed/ vBRIEFs whose swarm.depends_on[] all resolve to completed/ or cancelled/ (#1287). Flags: --force --dry-run --json."
101
+ dir: '{{.USER_WORKING_DIR}}'
102
+ deps:
103
+ - _ts-build
104
+ cmds:
105
+ # Oracle/fallback (parity): scripts/vbrief_reconcile_graph.py (#1828 Wave 8).
106
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" vbrief-reconcile graph --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
107
+
108
+ reconcile:labels:
109
+ # SCM label reconciliation (#1288). Walks vbrief/proposed/ + pending/ +
110
+ # active/, resolves each brief's linked GitHub issue from its
111
+ # x-vbrief/github-issue reference, and applies/removes a fixed set of
112
+ # managed labels so the forge surface mirrors canonical vBRIEF state:
113
+ # status=blocked or an unresolved swarm.depends_on[] -> status:blocked;
114
+ # kind=epic -> epic + status:tracker; kind=research -> rfc. Mirror (not
115
+ # accumulate): managed labels that no longer apply are removed; labels
116
+ # outside the managed set are never touched. Every forge call routes
117
+ # through scripts/scm.py (#1145) so task verify:scm-boundary stays green,
118
+ # and the verb is idempotent (a second run mutates nothing). Pass-through
119
+ # flags: --repo OWNER/NAME (fallback when a reference URI lacks owner/
120
+ # repo), --dry-run (report without mutating), --json (machine summary).
121
+ #
122
+ # CLI_ARGS forwarding (#577): bare ``{{.CLI_ARGS}}`` -- DO NOT wrap in
123
+ # Taskfile-level double quotes. go-task already shell-escapes CLI_ARGS
124
+ # with single quotes; double-wrapping breaks Windows argv. See the
125
+ # preflight task above for the full rationale.
126
+ #
127
+ # NOTE: NO ``sources:`` / ``generates:`` per ``conventions/task-caching.md``
128
+ # because the walk reads the lifecycle folders and mutates remote forge
129
+ # state that go-task does not track, so a cached skip would silently
130
+ # swallow real label changes.
131
+ desc: "Reconcile SCM labels to mirror vBRIEF state: status:blocked / epic+status:tracker / rfc (#1288). Routes through scripts/scm.py. Flags: --repo --dry-run --json."
132
+ dir: '{{.USER_WORKING_DIR}}'
133
+ deps:
134
+ - _ts-build
135
+ cmds:
136
+ # Oracle/fallback (parity): scripts/vbrief_reconcile_labels.py (#1828 Wave 8).
137
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" vbrief-reconcile labels --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
138
+
139
+ reconcile:umbrellas:
140
+ # Umbrella current-shape auto-update (#1289). Walks every kind=epic
141
+ # vBRIEF, resolves its children from its x-vbrief/plan references,
142
+ # computes the wave structure from the children's swarm.depends_on[]
143
+ # edges, builds the canonical AGENTS.md section-1152 current-shape body
144
+ # (Last updated / Last pass type / Child count / Child-count history /
145
+ # Open children / Closed children / Wave order / Open questions /
146
+ # Reading order), and edits the linked SCM umbrella's current-shape
147
+ # comment IN PLACE so the permalink is preserved and the amendment
148
+ # trail is never touched. When no current-shape comment exists yet, one
149
+ # is created at pass-1. Every forge call routes through scripts/scm.py
150
+ # (#1145) so task verify:scm-boundary stays green, and the verb is
151
+ # idempotent (a second run with unchanged epic state mutates nothing --
152
+ # the pass number is only bumped when the rendered body differs).
153
+ # Pass-through flags: --repo OWNER/NAME (fallback when a reference URI
154
+ # lacks owner/repo), --dry-run (report without mutating), --json
155
+ # (machine summary).
156
+ #
157
+ # CLI_ARGS forwarding (#577): bare ``{{.CLI_ARGS}}`` -- DO NOT wrap in
158
+ # Taskfile-level double quotes. go-task already shell-escapes CLI_ARGS
159
+ # with single quotes; double-wrapping breaks Windows argv. See the
160
+ # preflight task below for the full rationale.
161
+ #
162
+ # NOTE: NO ``sources:`` / ``generates:`` per ``conventions/task-caching.md``
163
+ # because the walk reads the lifecycle folders and mutates remote forge
164
+ # state that go-task does not track, so a cached skip would silently
165
+ # swallow real comment updates.
166
+ desc: "Reconcile epic umbrella current-shape comments to vBRIEF state per AGENTS.md #1152: edit in place (preserve permalink). Routes through scripts/scm.py. Flags: --repo --dry-run --json."
167
+ dir: '{{.USER_WORKING_DIR}}'
168
+ deps:
169
+ - _ts-build
170
+ cmds:
171
+ # Oracle/fallback (parity): scripts/vbrief_reconcile_umbrellas.py (#1828 Wave 8).
172
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" vbrief-reconcile umbrellas --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}
173
+
174
+ activate:
175
+ # Implementation-intent activation gate companion (#810). Idempotent:
176
+ # already-active vBRIEFs print a no-op message and exit 0; pending/
177
+ # vBRIEFs flip plan.status pending|approved -> running, stamp
178
+ # vBRIEFInfo.updated to current ISO8601 UTC, and atomically move to
179
+ # vbrief/active/. Any other source folder is rejected with an
180
+ # actionable message. Pairs with `scripts/preflight_implementation.py`
181
+ # (also reachable via `task vbrief:preflight`): this task is the ONLY
182
+ # supported way to satisfy that gate.
183
+ #
184
+ # Dispatched via `{{.DEFT_ROOT}}/scripts/vbrief_activate.py` mirroring
185
+ # the `tasks/scope.yml` pattern (scope_lifecycle.py) so the JSON edit
186
+ # + atomic move logic is testable. The companion test lives at
187
+ # `tests/cli/test_vbrief_activate.py` to satisfy the forward-coverage
188
+ # rule from main.md.
189
+ #
190
+ # CLI_ARGS forwarding (#577): bare ``{{.CLI_ARGS}}`` -- DO NOT wrap
191
+ # in Taskfile-level double quotes. See the preflight task above for
192
+ # the full rationale; the short version is that go-task already
193
+ # shell-escapes CLI_ARGS with single quotes, and double-wrapping it
194
+ # breaks Windows argv. Spaces in paths survive correctly through
195
+ # bare interpolation.
196
+ #
197
+ # NOTE: NO ``sources:`` / ``generates:`` per ``conventions/task-caching.md``
198
+ # because the vBRIEF path is a user-facing argument forwarded via
199
+ # {{.CLI_ARGS}} and a cached cmds skip would silently swallow it.
200
+ desc: "Activate a vBRIEF: pending/ -> active/ (status: running). Idempotent. (#810)"
201
+ dir: '{{.USER_WORKING_DIR}}'
202
+ deps:
203
+ - _ts-build
204
+ cmds:
205
+ # Oracle/fallback (parity): scripts/vbrief_activate.py (#1828 Wave 8).
206
+ - node "{{.DEFT_ROOT}}/packages/cli/dist/bin.js" vbrief:activate {{.CLI_ARGS}}