@deftai/directive-content 0.59.0 → 0.60.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 (184) hide show
  1. package/.githooks/pre-push +10 -9
  2. package/Taskfile.yml +48 -58
  3. package/UPGRADING.md +1 -1
  4. package/docs/assets/directive-lifecycle-diagram.png +0 -0
  5. package/docs/directive-lifecycle.md +73 -0
  6. package/docs/getting-started.md +5 -1
  7. package/package.json +3 -3
  8. package/packs/skills/skills-pack-0.1.json +22 -22
  9. package/scm/github.md +20 -2
  10. package/tasks/change.yml +16 -31
  11. package/tasks/ci.yml +8 -0
  12. package/tasks/commit.yml +12 -19
  13. package/tasks/core.yml +10 -0
  14. package/tasks/engine.yml +42 -0
  15. package/tasks/framework.yml +3 -0
  16. package/tasks/install.yml +20 -19
  17. package/tasks/migrate.yml +26 -15
  18. package/tasks/project.yml +16 -0
  19. package/tasks/toolchain.yml +15 -5
  20. package/tasks/vbrief.yml +4 -3
  21. package/tasks/verify.yml +12 -14
  22. package/scripts/_agents_md.py +0 -494
  23. package/scripts/_cache_fetch.py +0 -635
  24. package/scripts/_cache_quota.py +0 -529
  25. package/scripts/_cache_refresh.py +0 -163
  26. package/scripts/_cache_validate.py +0 -209
  27. package/scripts/_content_root.py +0 -42
  28. package/scripts/_doctor_state.py +0 -277
  29. package/scripts/_event_detect.py +0 -305
  30. package/scripts/_events.py +0 -514
  31. package/scripts/_lifecycle_hygiene.py +0 -568
  32. package/scripts/_pathspec.py +0 -91
  33. package/scripts/_policy_show_cli.py +0 -266
  34. package/scripts/_precutover.py +0 -92
  35. package/scripts/_project_context.py +0 -224
  36. package/scripts/_project_definition_io.py +0 -164
  37. package/scripts/_relocate_snapshot.py +0 -209
  38. package/scripts/_relocate_states.py +0 -343
  39. package/scripts/_resolve_preflight_path.py +0 -152
  40. package/scripts/_safe_subprocess.py +0 -167
  41. package/scripts/_session_start_hook.py +0 -205
  42. package/scripts/_sor_gate_diff.py +0 -365
  43. package/scripts/_stdio_utf8.py +0 -59
  44. package/scripts/_triage_bootstrap_gitignore.py +0 -904
  45. package/scripts/_triage_classify_cli.py +0 -122
  46. package/scripts/_triage_queue_cli.py +0 -625
  47. package/scripts/_triage_scope_cli.py +0 -343
  48. package/scripts/_triage_scope_drift_cli.py +0 -121
  49. package/scripts/_triage_scope_ignores.py +0 -286
  50. package/scripts/_triage_scope_milestone.py +0 -432
  51. package/scripts/_triage_scope_mutations.py +0 -337
  52. package/scripts/_triage_scope_renderers.py +0 -207
  53. package/scripts/_triage_smoketest_stages.py +0 -674
  54. package/scripts/_triage_subscribe_cli.py +0 -140
  55. package/scripts/_triage_welcome_cli.py +0 -421
  56. package/scripts/_vbrief_build.py +0 -239
  57. package/scripts/_vbrief_fidelity.py +0 -479
  58. package/scripts/_vbrief_legacy.py +0 -589
  59. package/scripts/_vbrief_reconciliation.py +0 -883
  60. package/scripts/_vbrief_routing.py +0 -277
  61. package/scripts/_vbrief_safety.py +0 -778
  62. package/scripts/_vbrief_sources.py +0 -312
  63. package/scripts/_vbrief_speckit.py +0 -262
  64. package/scripts/_vbrief_story_quality.py +0 -353
  65. package/scripts/_vbrief_validation.py +0 -299
  66. package/scripts/build_dist.py +0 -412
  67. package/scripts/cache.py +0 -1078
  68. package/scripts/cache_scanner.py +0 -745
  69. package/scripts/candidates_log.py +0 -432
  70. package/scripts/capacity_backfill.py +0 -680
  71. package/scripts/capacity_show.py +0 -653
  72. package/scripts/ci_local.py +0 -689
  73. package/scripts/code_structure_validate.py +0 -765
  74. package/scripts/codebase_default_extractor.py +0 -495
  75. package/scripts/codebase_map.py +0 -304
  76. package/scripts/codebase_map_fresh.py +0 -104
  77. package/scripts/codebase_projection_registry.py +0 -94
  78. package/scripts/codebase_provider.py +0 -582
  79. package/scripts/doctor.py +0 -2552
  80. package/scripts/framework_commands.py +0 -505
  81. package/scripts/gh_rest.py +0 -882
  82. package/scripts/github_auth_modes.py +0 -437
  83. package/scripts/github_body.py +0 -292
  84. package/scripts/ip_risk.py +0 -531
  85. package/scripts/issue_emit.py +0 -670
  86. package/scripts/issue_ingest.py +0 -1064
  87. package/scripts/migrate_preflight.py +0 -418
  88. package/scripts/migrate_vbrief.py +0 -2677
  89. package/scripts/monitor_pr.py +0 -401
  90. package/scripts/pack_migrate_lessons.py +0 -336
  91. package/scripts/pack_migrate_patterns.py +0 -254
  92. package/scripts/pack_migrate_rules.py +0 -350
  93. package/scripts/pack_migrate_skills.py +0 -423
  94. package/scripts/pack_migrate_strategies.py +0 -311
  95. package/scripts/pack_migrate_swarm_spec.py +0 -250
  96. package/scripts/pack_render.py +0 -434
  97. package/scripts/packs_slice.py +0 -712
  98. package/scripts/platform_capabilities.py +0 -336
  99. package/scripts/policy.py +0 -2826
  100. package/scripts/policy_set.py +0 -324
  101. package/scripts/pr_check_closing_keywords.py +0 -524
  102. package/scripts/pr_check_protected_issues.py +0 -267
  103. package/scripts/pr_merge_readiness.py +0 -1004
  104. package/scripts/pr_wait_mergeable.py +0 -669
  105. package/scripts/prd_render.py +0 -159
  106. package/scripts/preflight_architecture_sor.py +0 -974
  107. package/scripts/preflight_branch.py +0 -289
  108. package/scripts/preflight_cache.py +0 -974
  109. package/scripts/preflight_gh.py +0 -721
  110. package/scripts/preflight_implementation.py +0 -272
  111. package/scripts/preflight_story_start.py +0 -838
  112. package/scripts/preflight_wip_cap.py +0 -149
  113. package/scripts/probe_session.py +0 -545
  114. package/scripts/project_render.py +0 -293
  115. package/scripts/quarantine_ext.py +0 -237
  116. package/scripts/reconcile_issues.py +0 -1442
  117. package/scripts/refresh-path.ps1 +0 -107
  118. package/scripts/release.py +0 -2030
  119. package/scripts/release_e2e.py +0 -1011
  120. package/scripts/release_publish.py +0 -486
  121. package/scripts/release_rollback.py +0 -980
  122. package/scripts/relocate.py +0 -1034
  123. package/scripts/resolve_changelog_unreleased.py +0 -667
  124. package/scripts/resolve_version.py +0 -490
  125. package/scripts/resume_conditions.py +0 -706
  126. package/scripts/ritual_sentinel.py +0 -609
  127. package/scripts/roadmap_render.py +0 -635
  128. package/scripts/rule_ownership_lint.py +0 -325
  129. package/scripts/scm.py +0 -591
  130. package/scripts/scope_audit_log.py +0 -387
  131. package/scripts/scope_decompose.py +0 -654
  132. package/scripts/scope_demote.py +0 -509
  133. package/scripts/scope_lifecycle.py +0 -1126
  134. package/scripts/scope_undo.py +0 -772
  135. package/scripts/session_start.py +0 -406
  136. package/scripts/setup_ghx.py +0 -339
  137. package/scripts/setup_windows.ps1 +0 -220
  138. package/scripts/slice_audit.py +0 -585
  139. package/scripts/slice_record.py +0 -530
  140. package/scripts/slice_record_existing.py +0 -692
  141. package/scripts/slug_normalize.py +0 -178
  142. package/scripts/spec_render.py +0 -477
  143. package/scripts/spec_validate.py +0 -238
  144. package/scripts/subagent_monitor.py +0 -658
  145. package/scripts/swarm_complete_cohort.py +0 -644
  146. package/scripts/swarm_launch.py +0 -1206
  147. package/scripts/swarm_readiness.py +0 -554
  148. package/scripts/swarm_verify_review_clean.py +0 -438
  149. package/scripts/swarm_worktrees.py +0 -497
  150. package/scripts/toolchain-check.py +0 -52
  151. package/scripts/triage_actions.py +0 -871
  152. package/scripts/triage_bootstrap.py +0 -1153
  153. package/scripts/triage_bulk.py +0 -630
  154. package/scripts/triage_classify.py +0 -932
  155. package/scripts/triage_help.py +0 -1685
  156. package/scripts/triage_queue.py +0 -1944
  157. package/scripts/triage_reconcile.py +0 -581
  158. package/scripts/triage_refresh.py +0 -643
  159. package/scripts/triage_scope.py +0 -999
  160. package/scripts/triage_scope_drift.py +0 -575
  161. package/scripts/triage_smoketest.py +0 -396
  162. package/scripts/triage_subscribe.py +0 -399
  163. package/scripts/triage_summary.py +0 -1011
  164. package/scripts/triage_welcome.py +0 -1178
  165. package/scripts/ts_check_lane.py +0 -86
  166. package/scripts/validate-links.py +0 -64
  167. package/scripts/validate_strategy_output.py +0 -212
  168. package/scripts/vbrief_activate.py +0 -228
  169. package/scripts/vbrief_migrate_conformance.py +0 -368
  170. package/scripts/vbrief_reconcile_graph.py +0 -306
  171. package/scripts/vbrief_reconcile_labels.py +0 -460
  172. package/scripts/vbrief_reconcile_umbrellas.py +0 -741
  173. package/scripts/vbrief_validate.py +0 -1144
  174. package/scripts/verify-stubs.py +0 -61
  175. package/scripts/verify_capacity.py +0 -160
  176. package/scripts/verify_encoding.py +0 -699
  177. package/scripts/verify_hooks_installed.py +0 -206
  178. package/scripts/verify_investigation.py +0 -360
  179. package/scripts/verify_judgment_gates.py +0 -827
  180. package/scripts/verify_no_task_runtime.py +0 -171
  181. package/scripts/verify_scm_boundary.py +0 -509
  182. package/scripts/verify_session_ritual.py +0 -389
  183. package/scripts/verify_tools.py +0 -426
  184. package/scripts/verify_vbrief_conformance.py +0 -478
@@ -1,14 +1,17 @@
1
1
  #!/usr/bin/env sh
2
- # .githooks/pre-push -- detection-bound branch-protection gate (#747).
2
+ # .githooks/pre-push -- refspec-aware default-branch push gate (#1019 / #1814).
3
3
  #
4
4
  # Activated by `git config core.hooksPath .githooks` -- idempotent setup
5
5
  # performed by `task setup` (the directive repo itself) OR by the deft
6
6
  # installer, which copies this hook to the consumer root .githooks/ and sets
7
- # core.hooksPath for vendored consumer projects (#1463). Mirrors the
8
- # pre-commit shape: pre-push defends against the case where a user opted out
9
- # at commit time (e.g. DEFT_ALLOW_DEFAULT_BRANCH_COMMIT in a single shell)
10
- # but still tries to push to the default branch in a fresh shell. The same
11
- # scripts run in both hooks so behavior stays consistent.
7
+ # core.hooksPath for vendored consumer projects (#1463).
8
+ #
9
+ # Pre-push does NOT invoke preflight_branch.py (#747 gate #1). That gate
10
+ # inspects HEAD only, so benign operations checked out on the default branch
11
+ # (deleting a merged feature branch, pushing a non-default ref) false-positive
12
+ # before the refspec-aware gate can approve them (#1814 Option A). HEAD-only
13
+ # default-branch protection remains on pre-commit; pre-push relies on
14
+ # preflight_gh --pre-push-stdin (gate #2) for refspec-aware protection.
12
15
 
13
16
  REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)"
14
17
  if [ -z "$REPO_ROOT" ]; then
@@ -111,9 +114,7 @@ deft_py() {
111
114
  fi
112
115
  }
113
116
 
114
- deft_py "$SCRIPTS_DIR/preflight_branch.py" --project-root "$REPO_ROOT" || exit $?
115
-
116
- # Step 2: destructive-gh-verb gate (#1019). Reads per-ref stdin lines from
117
+ # Refspec-aware default-branch push gate (#1019). Reads per-ref stdin lines from
117
118
  # git pre-push (one line per ref: <local_ref> <local_oid> <remote_ref> <remote_oid>)
118
119
  # and refuses pushes touching the default branch (force-push or otherwise).
119
120
  # DEFT_ALLOW_DESTRUCTIVE_GH_VERBS=1 is the per-shell emergency bypass.
package/Taskfile.yml CHANGED
@@ -70,9 +70,6 @@ env:
70
70
  UV_PROJECT: '{{.TASKFILE_DIR}}'
71
71
 
72
72
  includes:
73
- core:
74
- taskfile: ./tasks/core.yml
75
- optional: true
76
73
  ts:
77
74
  taskfile: ./tasks/ts.yml
78
75
  optional: true
@@ -141,9 +138,6 @@ includes:
141
138
  pr:
142
139
  taskfile: ./tasks/pr.yml
143
140
  optional: true
144
- ci:
145
- taskfile: ./tasks/ci.yml
146
- optional: true
147
141
  policy:
148
142
  taskfile: ./tasks/policy.yml
149
143
  optional: true
@@ -307,6 +301,24 @@ includes:
307
301
  packs:
308
302
  taskfile: ./tasks/packs.yml
309
303
  optional: true
304
+ # Maintainer-only Python self-test lanes (#1813 contributor path / #2022
305
+ # Phase 2). `internal: true` hides `core:*` / `ci:*` from `task -l` and
306
+ # blocks direct CLI invocation on consumer installs; only
307
+ # `check:framework-source` below wires them as deps. Consumer `task check`
308
+ # dispatches to `check:consumer` (TS / deft verbs — no uv/python).
309
+ core:
310
+ taskfile: ./tasks/core.yml
311
+ optional: true
312
+ internal: true
313
+ ci:
314
+ taskfile: ./tasks/ci.yml
315
+ optional: true
316
+ internal: true
317
+ # npm consumer deposits resolve verbs through global `deft` when the vendored
318
+ # packages/cli/dist/bin.js is absent (#2022 Phase 3).
319
+ engine:
320
+ taskfile: ./tasks/engine.yml
321
+ optional: true
310
322
 
311
323
  tasks:
312
324
  default:
@@ -320,14 +332,16 @@ tasks:
320
332
  desc: "Run the context-appropriate pre-commit gate: full framework self-check in this repo, consumer-safe gate from vendored installs (#1519)."
321
333
  dir: '{{.USER_WORKING_DIR}}'
322
334
  deps:
323
- - task: verify:_ts-build
335
+ - task: engine:_ts-build
324
336
  cmds:
325
- # Oracle/fallback (parity): scripts/_project_context.py --dispatch-task-check (#1854 s5).
326
- - node "{{.TASKFILE_DIR}}/packages/cli/dist/bin.js" check --framework-root "{{.TASKFILE_DIR}}" --project-root "{{.USER_WORKING_DIR}}"
337
+ - task: engine:invoke
338
+ vars:
339
+ ENGINE_CMD: 'check --framework-root "{{.TASKFILE_DIR}}" --project-root "{{.USER_WORKING_DIR}}"'
327
340
 
328
341
  check:framework-source:
329
- desc: "Run all framework source-repo pre-commit checks explicitly (skips @pytest.mark.slow tests via pyproject addopts -- run `task check:slow` for the slow lane, #975)."
342
+ desc: "Run all framework source-repo pre-commit checks explicitly (skips @pytest.mark.slow tests via pyproject addopts -- run `task check:slow` for the slow lane, #975). Sole wired consumer of maintainer-only core:* / ci:* Python lanes (#2022 Phase 2)."
330
343
  deps:
344
+ # Maintainer-only Python lanes (tasks/core.yml) — not on check:consumer.
331
345
  - core:validate
332
346
  - core:lint
333
347
  - core:test
@@ -359,7 +373,7 @@ tasks:
359
373
  desc: "Run the consumer-safe Deft quality gate for vendored installs (#1519)."
360
374
  deps:
361
375
  - doctor
362
- - toolchain:check
376
+ - toolchain:check-consumer
363
377
  - verify:branch
364
378
  - verify:cache-fresh
365
379
  - verify:wip-cap
@@ -395,12 +409,11 @@ tasks:
395
409
  desc: "Deterministic v0.20 strategy output shape gate (#1166 s2). Fails on non-date-prefixed vBRIEFs in lifecycle dirs, missing PROJECT-DEFINITION.vbrief.json, or legacy specification.vbrief.json in user projects."
396
410
  dir: '{{.USER_WORKING_DIR}}'
397
411
  deps:
398
- - task: verify:_ts-build
399
- vars:
400
- DEFT_ROOT: "{{.TASKFILE_DIR}}"
412
+ - task: engine:_ts-build
401
413
  cmds:
402
- # Oracle/fallback (parity): scripts/validate_strategy_output.py (#1854 s3).
403
- - node "{{.TASKFILE_DIR}}/packages/cli/dist/bin.js" validate-strategy-output --project-root "{{.USER_WORKING_DIR}}"
414
+ - task: engine:invoke
415
+ vars:
416
+ ENGINE_CMD: 'validate-strategy-output --project-root "{{.USER_WORKING_DIR}}"'
404
417
 
405
418
  # Pack-projection drift gate (#1294 / #1283, ADR-001). User-facing alias for
406
419
  # `packs:verify-drift`, defined at the root Taskfile so it carries the
@@ -434,40 +447,24 @@ tasks:
434
447
  # addopts=` reset overrides the pyproject default of `-m 'not slow'`
435
448
  # so the `-m slow` selector here actually picks up the marked tests.
436
449
  check:slow:
437
- desc: "Run the @pytest.mark.slow test lane (watchdog regression suite excluded from `task check` by default, #975)"
450
+ desc: "Run the @pytest.mark.slow test lane (watchdog regression suite excluded from `task check` by default, #975). Maintainer-only Python lane — not part of `check:consumer`."
438
451
  cmds:
439
452
  # `--project` pins uv to the framework root so ancestor pyproject.toml
440
453
  # files cannot hijack the resolver via uv's upward walk (#1011).
441
454
  - uv --project "{{.TASKFILE_DIR}}" run pytest tests/ -o addopts= -m slow
442
455
 
443
- test:
444
- desc: Run test suite (alias for core:test)
445
- cmds:
446
- - task: core:test
447
- test:coverage:
448
- desc: Run tests with coverage (alias for core:test:coverage)
449
- cmds:
450
- - task: core:test:coverage
451
- lint:
452
- desc: Lint and type-check Python code (alias for core:lint)
453
- cmds:
454
- - task: core:lint
455
- fmt:
456
- desc: Format Python code (alias for core:fmt)
457
- cmds:
458
- - task: core:fmt
456
+ # Maintainer-only packaging aliases (#2022 Phase 2). `core:*` is internal;
457
+ # these root aliases remain callable for release Step 6 (`task build`) and
458
+ # local maintainer workflows. Not wired into `check:consumer`.
459
459
  build:
460
- desc: Package framework for distribution (alias for core:build)
460
+ desc: Package framework for distribution (maintainer-only; alias for core:build)
461
461
  cmds:
462
462
  - task: core:build
463
463
  clean:
464
- desc: Clean generated artifacts (alias for core:clean)
464
+ desc: Clean generated artifacts (maintainer-only; alias for core:clean)
465
465
  cmds:
466
466
  - task: core:clean
467
- validate:
468
- desc: Validate all markdown files (alias for core:validate)
469
- cmds:
470
- - task: core:validate
467
+
471
468
  install:
472
469
  desc: Install deft (alias for install:install)
473
470
  cmds:
@@ -477,7 +474,7 @@ tasks:
477
474
  cmds:
478
475
  - task: install:uninstall
479
476
  # User-facing upgrade entrypoint (#1061). Aliases the install:upgrade
480
- # wrapper that delegates to `run upgrade`. Cited by the doctor's
477
+ # wrapper that delegates to the native deft-ts install-upgrade handler. Cited by the doctor's
481
478
  # failure prose and docs/install-manifest.md as the canonical
482
479
  # post-drift repair entrypoint for the AGENTS.md / manifest /
483
480
  # .deft-version triple.
@@ -485,10 +482,6 @@ tasks:
485
482
  desc: "Upgrade deft framework -- refresh AGENTS.md + write install manifest + regenerate .deft-version (alias for install:upgrade, #1061)"
486
483
  cmds:
487
484
  - task: install:upgrade
488
- stats:
489
- desc: Show framework statistics (alias for core:stats)
490
- cmds:
491
- - task: core:stats
492
485
 
493
486
  # #1272: canonical doctor surface -- thin shim that forwards to
494
487
  # ``.deft/core/run doctor``. The ``run`` CLI owns the diagnostic
@@ -502,16 +495,18 @@ tasks:
502
495
  # in ``tasks/framework.yml`` now prints a redaction notice pointing
503
496
  # the operator at this surface.
504
497
  doctor:
505
- desc: "Canonical doctor surface (#1272) -- task doctor [-- --session | --fix | --json | --quiet]. Shim for `.deft/core/run doctor`."
498
+ desc: "Canonical doctor surface (#1272) -- task doctor [-- --session | --fix | --json | --quiet]. Uses vendored bin.js in source checkouts or global deft on npm consumer deposits (#2022 Phase 3)."
506
499
  dir: '{{.USER_WORKING_DIR}}'
507
- env:
508
- PYTHONUTF8: "1"
509
500
  cmds:
510
- - uv --project "{{.TASKFILE_DIR}}" run --frozen python "{{.TASKFILE_DIR}}/run" doctor {{.CLI_ARGS}}
501
+ - task: engine:invoke
502
+ vars:
503
+ ENGINE_CMD: 'doctor --project-root "{{.USER_WORKING_DIR}}" {{.CLI_ARGS}}'
511
504
 
512
505
  setup:
513
506
  desc: "Idempotent local-dev setup: configure git hooks (#747); detect-and-prompt ghx (#884). Sets core.hooksPath=.githooks so .githooks/pre-commit + .githooks/pre-push run."
514
507
  dir: '{{.USER_WORKING_DIR}}'
508
+ deps:
509
+ - verify:_ts-build
515
510
  env:
516
511
  PYTHONUTF8: "1"
517
512
  cmds:
@@ -568,24 +563,19 @@ tasks:
568
563
  # GitHub CLI cache proxy. Default invocation here passes --check so
569
564
  # `task setup` never prompts on a clean re-run; operators wanting to
570
565
  # opt in run `task setup:ghx` (defined below) which is the
571
- # interactive entry point. The script is pure-stdlib so it works
572
- # before `uv sync` has run on a fresh worktree; `uv run` is still
573
- # the canonical dispatcher to keep the python interpreter consistent
574
- # with every other Taskfile-dispatched script. `--project` pins uv
575
- # to the framework root so ancestor pyproject.toml files cannot
576
- # hijack the resolver via uv's upward walk (#1011).
577
- - uv --project "{{.TASKFILE_DIR}}" run python "{{.TASKFILE_DIR}}/scripts/setup_ghx.py" --check
566
+ # interactive entry point. Native TypeScript handler (#2022 Phase 1).
567
+ - node "{{.TASKFILE_DIR}}/packages/cli/dist/bin.js" setup:ghx --check
578
568
 
579
569
  setup:ghx:
580
570
  desc: "Consent-gated ghx (brunoborges/ghx) installer (#884) -- task setup:ghx [-- --yes]"
581
571
  dir: '{{.USER_WORKING_DIR}}'
582
- env:
583
- PYTHONUTF8: "1"
572
+ deps:
573
+ - verify:_ts-build
584
574
  # Per `conventions/task-caching.md` (#574): no `sources:` / `generates:`
585
575
  # because the script forwards user-facing flags via {{.CLI_ARGS}}
586
576
  # (notably --yes for non-interactive CI / scripted approval).
587
577
  cmds:
588
- - uv --project "{{.TASKFILE_DIR}}" run python "{{.TASKFILE_DIR}}/scripts/setup_ghx.py" {{.CLI_ARGS}}
578
+ - node "{{.TASKFILE_DIR}}/packages/cli/dist/bin.js" setup:ghx {{.CLI_ARGS}}
589
579
 
590
580
  # Release pipeline tasks (#74 + #716 safety hardening, namespace flatten #718).
591
581
  #
package/UPGRADING.md CHANGED
@@ -318,7 +318,7 @@ The relocator does NOT auto-rewrite consumer-owned files (the canonical reason:
318
318
  - `AGENTS.md` head/tail (above and below the managed-section markers) -- replace `deft/run` with `.deft/core/run` and `Full guidelines: deft/main.md` with `Full guidelines: .deft/core/main.md`.
319
319
  - CI workflow files (`.github/workflows/*.yml`) -- replace any `deft/run <task>` invocations.
320
320
  - Project scripts (`scripts/`, `Makefile`, `Taskfile.yml`, dotfiles) that hardcode the legacy path.
321
- - README / docs / contributor-onboarding prose that points new contributors at `deft/run` for bootstrap.
321
+ - README / docs / contributor-onboarding prose that points new contributors at `directive bootstrap` for first-time setup (replaces legacy `deft/run bootstrap` / `run project` / `run spec` shims).
322
322
 
323
323
  The advisory grep output is the operator's worklist; treat it as a finite todo. Once every flagged occurrence is either updated to `.deft/core/run` or explicitly acknowledged as legacy-friendly redirect-stub content (e.g. the `skills/deft-{sync,setup,...}/SKILL.md` redirect stubs that intentionally retain `deft/run` per [#411](https://github.com/deftai/directive/issues/411)), commit the changes alongside the relocate. (F1 #1015)
324
324
 
@@ -0,0 +1,73 @@
1
+ # The Directive Lifecycle (Conceptual Overview)
2
+
3
+ A single-picture mental model of how Deft Directive turns an idea into shipped,
4
+ auditable work — and keeps doing so as the project grows. It is **not** a one-and-done
5
+ pipeline; it is two connected phases that loop.
6
+
7
+ > **See also**: [getting-started.md](./getting-started.md) | [commands.md](../commands.md) | [strategies/README.md](../strategies/README.md) | [CONCEPTS.md](../../docs/CONCEPTS.md) | [ARCHITECTURE.md](../../docs/ARCHITECTURE.md)
8
+ >
9
+ > The `CONCEPTS.md` / `ARCHITECTURE.md` links resolve in the framework source repo; in an installed `.deft/core/docs/` they are maintainer-side references that may not be present.
10
+
11
+ ![Deft Directive lifecycle: an inception phase (Concept → Strategy Analysis → Specification + Artifacts) feeding a recurring per-session phase (Session Start → Triage/Refine → Slice → Swarm → Review/Fix → Ship) that loops back through new issues and features](./assets/directive-lifecycle-diagram.png)
12
+
13
+ > This diagram is a **conceptual overview**, not a command reference. The bubble labels are
14
+ > plain-language stages; the [stage → real surface](#stage--real-surface) table below maps
15
+ > each one to the actual strategy, skill, or `task` command that implements it.
16
+
17
+ ## The two phases
18
+
19
+ ### 1. At inception (run once, re-run as needed)
20
+
21
+ A project starts with a **Concept**. That concept passes through **Strategy Analysis** — an
22
+ iterative loop of *looking* at the terrain and *deep thinking* about the approach — until it
23
+ produces a **Specification + Artifacts** (the project definition and the first proposed scope
24
+ vBRIEFs).
25
+
26
+ Strategy analysis is deliberately a loop, not a step: you can map, then probe, then discuss,
27
+ then map again before the spec stabilizes. It is also re-entered later "as needed" when a piece
28
+ of work turns out to be big or fuzzy enough to need rethinking rather than just refining.
29
+
30
+ ### 2. Resume (the usual entry, every session)
31
+
32
+ Once a specification exists, the everyday on-ramp is **Session Start** — the session-start
33
+ ritual answering "what's next?". From there work flows through the queue:
34
+
35
+ - **Triage + Refine/Rethink** — the queue of candidate work. New **issues** and **features**
36
+ both enter here. Each item is either sliced forward, or — when it needs more thought —
37
+ escalated back up to Strategy Analysis (the *rethink* path).
38
+ - **Slice** — break refined scope into independently-grabbable vertical slices.
39
+ - **Swarm** — dispatch parallel agents against the sliced stories.
40
+ - **Review/Fix** — a tight, skill-driven loop that resolves reviewer findings until the work is
41
+ merge-ready. Review comes **after** the swarm, not before.
42
+ - **Ship** — merge and release.
43
+
44
+ Shipping is not the end: it **surfaces new issues and features**, which flow back into the
45
+ Triage queue. The specification and artifacts produced at inception also feed proposed scopes
46
+ into the same queue. Every pass is iterative.
47
+
48
+ ## Stage → real surface
49
+
50
+ The diagram's labels are conceptual. Here is what each one actually corresponds to in the
51
+ framework:
52
+
53
+ | Diagram label | What it really is |
54
+ |---|---|
55
+ | **Concept** | The initial idea / project framing — entry into [`deft-directive-setup`](../skills/deft-directive-setup/SKILL.md) or a `/deft:change`. |
56
+ | **Look** | Mapping and exploring the terrain — [`strategies/map.md`](../strategies/map.md) (`/deft:run:map`), codebase structure. |
57
+ | **Deep Think** | Adversarial / alignment analysis — [`strategies/probe.md`](../strategies/probe.md), [`strategies/discuss.md`](../strategies/discuss.md), [`strategies/research.md`](../strategies/research.md), and `deft-directive-gh-arch`. |
58
+ | **Strategy Analysis** | The preparatory strategies cycling through the [strategy chaining gate](../strategies/README.md) before spec generation. |
59
+ | **Spec / Specification + Artifacts** | Output of the spec-generating strategies (interview, speckit, …): `vbrief/PROJECT-DEFINITION.vbrief.json` plus dated `vbrief/proposed/` scope vBRIEFs. |
60
+ | **Resume / Session Start** | The session-start ritual — `task session:start` and the `task triage:welcome` "what's next" one-liner. |
61
+ | **Triage + Refine/Rethink** | The triage cache and refinement loop — `task triage:*`, [`deft-directive-triage`](../skills/deft-directive-triage/SKILL.md), [`deft-directive-refinement`](../skills/deft-directive-refinement/SKILL.md). "Rethink" = escalate back to Strategy Analysis. |
62
+ | **Slice** | Vertical-slice decomposition — [`deft-directive-gh-slice`](../skills/deft-directive-gh-slice/SKILL.md) and [`deft-directive-decompose`](../skills/deft-directive-decompose/SKILL.md). |
63
+ | **Swarm** | Parallel local agent orchestration — [`deft-directive-swarm`](../skills/deft-directive-swarm/SKILL.md), `task swarm:*`. |
64
+ | **Review/Fix** | Bot-reviewer response loop — [`deft-directive-review-cycle`](../skills/deft-directive-review-cycle/SKILL.md) and [`deft-directive-pre-pr`](../skills/deft-directive-pre-pr/SKILL.md). |
65
+ | **Ship** | PR merge and release — `task pr:*` and [`deft-directive-release`](../skills/deft-directive-release/SKILL.md). |
66
+ | **Issues / Features** | GitHub issues and feature requests mirrored into `.deft-cache/` and surfaced as triage candidates. |
67
+
68
+ ## Why it loops
69
+
70
+ The central claim of the picture is that Directive is **reiterative**. Strategy analysis is
71
+ front-loaded but re-entrant. Triage either slices work forward or rethinks it. Review/fix
72
+ cycles until merge-ready. And shipping generates the next round of issues and features. The
73
+ framework is built to be re-entered every session, not walked once.
@@ -2,7 +2,11 @@
2
2
 
3
3
  Deft Directive is a Taskfile-first framework for AI-assisted software work. It combines agent guidance, deterministic gates, vBRIEF lifecycle metadata, installer/doctor handoff, and cache-backed backlog workflows. This guide walks through installation, preferences, project setup, and the first scope workflow.
4
4
 
5
- > **Note**: This guide is an orientation layer. For current architecture details, see [ARCHITECTURE.md](../../docs/ARCHITECTURE.md); for command behavior, see [commands.md](../commands.md).
5
+ > **Note**: This guide is an orientation layer. For a single-picture mental model of how Directive turns an idea into shipped work, see [the Directive lifecycle](./directive-lifecycle.md); for command behavior, see [commands.md](../commands.md); for current architecture details, see [ARCHITECTURE.md](../../docs/ARCHITECTURE.md).
6
+
7
+ ## The shape of the workflow
8
+
9
+ Before the mechanics below, it helps to see the whole loop. Directive is two connected phases that repeat: an **inception** phase (Concept → Strategy Analysis → Specification + Artifacts) that feeds a recurring **per-session** phase (Session Start → Triage/Refine → Slice → Swarm → Review/Fix → Ship), where shipping surfaces new issues and features that flow back into the queue. The full picture, with a stage-to-real-command mapping table, lives in [the Directive lifecycle overview](./directive-lifecycle.md).
6
10
 
7
11
  ## Deft & Directive (naming)
8
12
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deftai/directive-content",
3
- "version": "0.59.0",
4
- "description": "Shippable Directive framework content in the consumer .deft/core/ layout (C1 flatten), plus the engine surfaces (.githooks/, Taskfile.yml, tasks/, scripts/) the deposit wires. Refs #11, #1669, #1967.",
3
+ "version": "0.60.0",
4
+ "description": "Shippable Directive framework content in the consumer .deft/core/ layout (C1 flatten), plus the engine surfaces (.githooks/, Taskfile.yml, tasks/) the deposit wires. Python-free per #2022 Phase 3. Refs #11, #1669, #1967.",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "**/*",
@@ -17,7 +17,7 @@
17
17
  "provenance": true
18
18
  },
19
19
  "scripts": {
20
- "prepack": "node --input-type=module -e \"import{cpSync,existsSync,readdirSync,rmSync}from'node:fs';import{dirname,join}from'node:path';import{fileURLToPath}from'node:url';const pkg=dirname(fileURLToPath(import.meta.url));const root=join(pkg,'..','..');const keep=(s)=>!s.includes('__pycache__')&&!s.endsWith('.pyc');const src=join(root,'content');for(const name of readdirSync(src)){const from=join(src,name);const to=join(pkg,name);if(existsSync(to))rmSync(to,{recursive:true,force:true});cpSync(from,to,{recursive:true,filter:keep});}for(const name of ['.githooks','Taskfile.yml','tasks','scripts']){const from=join(root,name);if(!existsSync(from))continue;const to=join(pkg,name);if(existsSync(to))rmSync(to,{recursive:true,force:true});cpSync(from,to,{recursive:true,filter:keep});}\"",
20
+ "prepack": "node --input-type=module -e \"import{cpSync,existsSync,readdirSync,rmSync}from'node:fs';import{dirname,join}from'node:path';import{fileURLToPath}from'node:url';const pkg=dirname(fileURLToPath(import.meta.url));const root=join(pkg,'..','..');const keep=(s)=>!s.includes('__pycache__')&&!s.endsWith('.pyc')&&!s.endsWith('.py');const src=join(root,'content');for(const name of readdirSync(src)){const from=join(src,name);const to=join(pkg,name);if(existsSync(to))rmSync(to,{recursive:true,force:true});cpSync(from,to,{recursive:true,filter:keep});}for(const name of ['.githooks','Taskfile.yml','tasks']){const from=join(root,name);if(!existsSync(from))continue;const to=join(pkg,name);if(existsSync(to))rmSync(to,{recursive:true,force:true});cpSync(from,to,{recursive:true,filter:keep});}\"",
21
21
  "postpack": "node --input-type=module -e \"import{readdirSync,rmSync}from'node:fs';import{dirname,join}from'node:path';import{fileURLToPath}from'node:url';const pkg=dirname(fileURLToPath(import.meta.url));for(const name of readdirSync(pkg)){if(name==='package.json')continue;rmSync(join(pkg,name),{recursive:true,force:true});}\""
22
22
  }
23
23
  }