@deftai/directive-content 0.59.0 → 0.61.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 (190) hide show
  1. package/.githooks/pre-commit +10 -128
  2. package/.githooks/pre-push +8 -108
  3. package/Taskfile.yml +48 -58
  4. package/UPGRADING.md +19 -3
  5. package/docs/assets/directive-lifecycle-diagram.png +0 -0
  6. package/docs/directive-lifecycle.md +73 -0
  7. package/docs/getting-started.md +5 -1
  8. package/package.json +3 -3
  9. package/packs/skills/skills-pack-0.1.json +1 -1
  10. package/packs/strategies/strategies-pack-0.1.json +19 -19
  11. package/scm/github.md +37 -6
  12. package/skills/deft-directive-setup/SKILL.md +24 -15
  13. package/strategies/speckit.md +14 -14
  14. package/strategies/v0-20-contract.md +12 -1
  15. package/tasks/change.yml +16 -31
  16. package/tasks/ci.yml +8 -0
  17. package/tasks/commit.yml +12 -19
  18. package/tasks/core.yml +10 -0
  19. package/tasks/engine.yml +42 -0
  20. package/tasks/framework.yml +3 -0
  21. package/tasks/install.yml +20 -19
  22. package/tasks/migrate.yml +26 -15
  23. package/tasks/project.yml +26 -0
  24. package/tasks/toolchain.yml +15 -5
  25. package/tasks/vbrief.yml +4 -3
  26. package/tasks/verify.yml +12 -14
  27. package/templates/agents-entry.md +1 -1
  28. package/scripts/_agents_md.py +0 -494
  29. package/scripts/_cache_fetch.py +0 -635
  30. package/scripts/_cache_quota.py +0 -529
  31. package/scripts/_cache_refresh.py +0 -163
  32. package/scripts/_cache_validate.py +0 -209
  33. package/scripts/_content_root.py +0 -42
  34. package/scripts/_doctor_state.py +0 -277
  35. package/scripts/_event_detect.py +0 -305
  36. package/scripts/_events.py +0 -514
  37. package/scripts/_lifecycle_hygiene.py +0 -568
  38. package/scripts/_pathspec.py +0 -91
  39. package/scripts/_policy_show_cli.py +0 -266
  40. package/scripts/_precutover.py +0 -92
  41. package/scripts/_project_context.py +0 -224
  42. package/scripts/_project_definition_io.py +0 -164
  43. package/scripts/_relocate_snapshot.py +0 -209
  44. package/scripts/_relocate_states.py +0 -343
  45. package/scripts/_resolve_preflight_path.py +0 -152
  46. package/scripts/_safe_subprocess.py +0 -167
  47. package/scripts/_session_start_hook.py +0 -205
  48. package/scripts/_sor_gate_diff.py +0 -365
  49. package/scripts/_stdio_utf8.py +0 -59
  50. package/scripts/_triage_bootstrap_gitignore.py +0 -904
  51. package/scripts/_triage_classify_cli.py +0 -122
  52. package/scripts/_triage_queue_cli.py +0 -625
  53. package/scripts/_triage_scope_cli.py +0 -343
  54. package/scripts/_triage_scope_drift_cli.py +0 -121
  55. package/scripts/_triage_scope_ignores.py +0 -286
  56. package/scripts/_triage_scope_milestone.py +0 -432
  57. package/scripts/_triage_scope_mutations.py +0 -337
  58. package/scripts/_triage_scope_renderers.py +0 -207
  59. package/scripts/_triage_smoketest_stages.py +0 -674
  60. package/scripts/_triage_subscribe_cli.py +0 -140
  61. package/scripts/_triage_welcome_cli.py +0 -421
  62. package/scripts/_vbrief_build.py +0 -239
  63. package/scripts/_vbrief_fidelity.py +0 -479
  64. package/scripts/_vbrief_legacy.py +0 -589
  65. package/scripts/_vbrief_reconciliation.py +0 -883
  66. package/scripts/_vbrief_routing.py +0 -277
  67. package/scripts/_vbrief_safety.py +0 -778
  68. package/scripts/_vbrief_sources.py +0 -312
  69. package/scripts/_vbrief_speckit.py +0 -262
  70. package/scripts/_vbrief_story_quality.py +0 -353
  71. package/scripts/_vbrief_validation.py +0 -299
  72. package/scripts/build_dist.py +0 -412
  73. package/scripts/cache.py +0 -1078
  74. package/scripts/cache_scanner.py +0 -745
  75. package/scripts/candidates_log.py +0 -432
  76. package/scripts/capacity_backfill.py +0 -680
  77. package/scripts/capacity_show.py +0 -653
  78. package/scripts/ci_local.py +0 -689
  79. package/scripts/code_structure_validate.py +0 -765
  80. package/scripts/codebase_default_extractor.py +0 -495
  81. package/scripts/codebase_map.py +0 -304
  82. package/scripts/codebase_map_fresh.py +0 -104
  83. package/scripts/codebase_projection_registry.py +0 -94
  84. package/scripts/codebase_provider.py +0 -582
  85. package/scripts/doctor.py +0 -2552
  86. package/scripts/framework_commands.py +0 -505
  87. package/scripts/gh_rest.py +0 -882
  88. package/scripts/github_auth_modes.py +0 -437
  89. package/scripts/github_body.py +0 -292
  90. package/scripts/ip_risk.py +0 -531
  91. package/scripts/issue_emit.py +0 -670
  92. package/scripts/issue_ingest.py +0 -1064
  93. package/scripts/migrate_preflight.py +0 -418
  94. package/scripts/migrate_vbrief.py +0 -2677
  95. package/scripts/monitor_pr.py +0 -401
  96. package/scripts/pack_migrate_lessons.py +0 -336
  97. package/scripts/pack_migrate_patterns.py +0 -254
  98. package/scripts/pack_migrate_rules.py +0 -350
  99. package/scripts/pack_migrate_skills.py +0 -423
  100. package/scripts/pack_migrate_strategies.py +0 -311
  101. package/scripts/pack_migrate_swarm_spec.py +0 -250
  102. package/scripts/pack_render.py +0 -434
  103. package/scripts/packs_slice.py +0 -712
  104. package/scripts/platform_capabilities.py +0 -336
  105. package/scripts/policy.py +0 -2826
  106. package/scripts/policy_set.py +0 -324
  107. package/scripts/pr_check_closing_keywords.py +0 -524
  108. package/scripts/pr_check_protected_issues.py +0 -267
  109. package/scripts/pr_merge_readiness.py +0 -1004
  110. package/scripts/pr_wait_mergeable.py +0 -669
  111. package/scripts/prd_render.py +0 -159
  112. package/scripts/preflight_architecture_sor.py +0 -974
  113. package/scripts/preflight_branch.py +0 -289
  114. package/scripts/preflight_cache.py +0 -974
  115. package/scripts/preflight_gh.py +0 -721
  116. package/scripts/preflight_implementation.py +0 -272
  117. package/scripts/preflight_story_start.py +0 -838
  118. package/scripts/preflight_wip_cap.py +0 -149
  119. package/scripts/probe_session.py +0 -545
  120. package/scripts/project_render.py +0 -293
  121. package/scripts/quarantine_ext.py +0 -237
  122. package/scripts/reconcile_issues.py +0 -1442
  123. package/scripts/refresh-path.ps1 +0 -107
  124. package/scripts/release.py +0 -2030
  125. package/scripts/release_e2e.py +0 -1011
  126. package/scripts/release_publish.py +0 -486
  127. package/scripts/release_rollback.py +0 -980
  128. package/scripts/relocate.py +0 -1034
  129. package/scripts/resolve_changelog_unreleased.py +0 -667
  130. package/scripts/resolve_version.py +0 -490
  131. package/scripts/resume_conditions.py +0 -706
  132. package/scripts/ritual_sentinel.py +0 -609
  133. package/scripts/roadmap_render.py +0 -635
  134. package/scripts/rule_ownership_lint.py +0 -325
  135. package/scripts/scm.py +0 -591
  136. package/scripts/scope_audit_log.py +0 -387
  137. package/scripts/scope_decompose.py +0 -654
  138. package/scripts/scope_demote.py +0 -509
  139. package/scripts/scope_lifecycle.py +0 -1126
  140. package/scripts/scope_undo.py +0 -772
  141. package/scripts/session_start.py +0 -406
  142. package/scripts/setup_ghx.py +0 -339
  143. package/scripts/setup_windows.ps1 +0 -220
  144. package/scripts/slice_audit.py +0 -585
  145. package/scripts/slice_record.py +0 -530
  146. package/scripts/slice_record_existing.py +0 -692
  147. package/scripts/slug_normalize.py +0 -178
  148. package/scripts/spec_render.py +0 -477
  149. package/scripts/spec_validate.py +0 -238
  150. package/scripts/subagent_monitor.py +0 -658
  151. package/scripts/swarm_complete_cohort.py +0 -644
  152. package/scripts/swarm_launch.py +0 -1206
  153. package/scripts/swarm_readiness.py +0 -554
  154. package/scripts/swarm_verify_review_clean.py +0 -438
  155. package/scripts/swarm_worktrees.py +0 -497
  156. package/scripts/toolchain-check.py +0 -52
  157. package/scripts/triage_actions.py +0 -871
  158. package/scripts/triage_bootstrap.py +0 -1153
  159. package/scripts/triage_bulk.py +0 -630
  160. package/scripts/triage_classify.py +0 -932
  161. package/scripts/triage_help.py +0 -1685
  162. package/scripts/triage_queue.py +0 -1944
  163. package/scripts/triage_reconcile.py +0 -581
  164. package/scripts/triage_refresh.py +0 -643
  165. package/scripts/triage_scope.py +0 -999
  166. package/scripts/triage_scope_drift.py +0 -575
  167. package/scripts/triage_smoketest.py +0 -396
  168. package/scripts/triage_subscribe.py +0 -399
  169. package/scripts/triage_summary.py +0 -1011
  170. package/scripts/triage_welcome.py +0 -1178
  171. package/scripts/ts_check_lane.py +0 -86
  172. package/scripts/validate-links.py +0 -64
  173. package/scripts/validate_strategy_output.py +0 -212
  174. package/scripts/vbrief_activate.py +0 -228
  175. package/scripts/vbrief_migrate_conformance.py +0 -368
  176. package/scripts/vbrief_reconcile_graph.py +0 -306
  177. package/scripts/vbrief_reconcile_labels.py +0 -460
  178. package/scripts/vbrief_reconcile_umbrellas.py +0 -741
  179. package/scripts/vbrief_validate.py +0 -1144
  180. package/scripts/verify-stubs.py +0 -61
  181. package/scripts/verify_capacity.py +0 -160
  182. package/scripts/verify_encoding.py +0 -699
  183. package/scripts/verify_hooks_installed.py +0 -206
  184. package/scripts/verify_investigation.py +0 -360
  185. package/scripts/verify_judgment_gates.py +0 -827
  186. package/scripts/verify_no_task_runtime.py +0 -171
  187. package/scripts/verify_scm_boundary.py +0 -509
  188. package/scripts/verify_session_ritual.py +0 -389
  189. package/scripts/verify_tools.py +0 -426
  190. package/scripts/verify_vbrief_conformance.py +0 -478
@@ -1,61 +0,0 @@
1
- """Scan source files for stub patterns (TODO, FIXME, HACK, return null, bare pass)."""
2
-
3
- import re
4
- import sys
5
- from pathlib import Path
6
-
7
- PATTERNS = [
8
- (re.compile(r"\bTODO\b"), "TODO"),
9
- (re.compile(r"\bFIXME\b"), "FIXME"),
10
- (re.compile(r"\bHACK\b"), "HACK"),
11
- (re.compile(r"\breturn\s+null\b"), "return null"),
12
- ]
13
-
14
- EXCLUDE_DIRS = {
15
- "tests", "vendor", ".git", "backup", "history",
16
- "node_modules", ".venv", "__pycache__", "dist",
17
- "scripts", # exclude tooling scripts (contain pattern strings)
18
- }
19
-
20
- EXTENSIONS = {".py", ".go", ".sh"}
21
-
22
-
23
- def main() -> int:
24
- findings = []
25
-
26
- for f in sorted(Path(".").rglob("*")):
27
- if not f.is_file() or f.suffix not in EXTENSIONS:
28
- continue
29
- if any(p in f.parts for p in EXCLUDE_DIRS):
30
- continue
31
- try:
32
- text = f.read_text("utf-8", errors="replace")
33
- lines = text.splitlines()
34
- for i, line in enumerate(lines, 1):
35
- stripped = line.strip()
36
- # Detect bare 'pass' after a colon-ending line (stub function/method)
37
- if stripped == "pass" and f.suffix == ".py" and i >= 2:
38
- prev = lines[i - 2].strip()
39
- if prev.endswith(":") and not prev.startswith("#"):
40
- findings.append((str(f), i, "bare pass", line.rstrip()))
41
- # Detect keyword patterns
42
- for pat, label in PATTERNS:
43
- if pat.search(line):
44
- findings.append((str(f), i, label, line.rstrip()))
45
- except Exception:
46
- pass
47
-
48
- if findings:
49
- print(f"Found {len(findings)} stub(s):")
50
- for fp, ln, label, text in findings[:50]:
51
- print(f" {fp}:{ln} [{label}] {text[:120]}")
52
- if len(findings) > 50:
53
- print(f" ... and {len(findings) - 50} more")
54
- return 1
55
-
56
- print("No stub patterns found in source files")
57
- return 0
58
-
59
-
60
- if __name__ == "__main__":
61
- sys.exit(main())
@@ -1,160 +0,0 @@
1
- #!/usr/bin/env python3
2
- """verify_capacity.py -- three-state ADVISORY capacity gate (#1419 Slice 4).
3
-
4
- Surfaced via ``task verify:capacity``. Reuses the offline accounting engine in
5
- :mod:`scripts.capacity_show` to evaluate whether the trailing-window backward
6
- mix has drifted away from the configured ``capacityAllocation`` targets.
7
-
8
- Advisory by construction
9
- ------------------------
10
- ``plan.policy.capacityAllocation.enforcement`` defaults to ``"advise"``, and in
11
- that posture this gate ALWAYS exits 0 -- it reports the mix and defers to the
12
- selection ordering. It is therefore safe to run anywhere and is deliberately
13
- NOT wired into the ``task check`` aggregate: a capacity deficit on the
14
- framework's own tree MUST NOT fail-closed and wedge master.
15
-
16
- A non-zero "deficit" exit (1) only fires when ALL of the following hold:
17
-
18
- * ``enforcement == "enforce"`` (explicit per-project opt-in), AND
19
- * the classified-completion sample is at or above ``minSampleSize`` (so the
20
- signal is load-bearing, not noise), AND
21
- * at least one protected bucket is starved past
22
- :data:`DEFICIT_TOLERANCE` of the trailing window's completed weight.
23
-
24
- Exit codes (three-state, mirrors the other deft verify gates):
25
-
26
- * ``0`` -- within targets, OR advisory posture, OR insufficient sample, OR no
27
- capacity policy configured. (This is the only state reachable on the
28
- framework's own ``advise``-default tree.)
29
- * ``1`` -- ``enforce`` posture with a real, sampled deficit.
30
- * ``2`` -- config error (``--project-root`` is not a directory).
31
- """
32
-
33
- from __future__ import annotations
34
-
35
- import argparse
36
- import sys
37
- from datetime import datetime
38
- from pathlib import Path
39
-
40
- # Make sibling helpers importable both as __main__ and when imported by tests.
41
- sys.path.insert(0, str(Path(__file__).resolve().parent))
42
-
43
- from _stdio_utf8 import reconfigure_stdio # noqa: E402
44
- from capacity_show import CapacityReport, compute_report, render_report # noqa: E402
45
- from policy import resolve_capacity_allocation # noqa: E402
46
-
47
- reconfigure_stdio()
48
-
49
- #: Minimum absolute backward-weight deficit (in the report's unit) that an
50
- #: ``enforce``-posture bucket may carry before the gate flags it. A small
51
- #: tolerance absorbs rounding and single-item lumpiness so the gate fires only
52
- #: on a genuine, sustained shortfall.
53
- DEFICIT_TOLERANCE: float = 1.0
54
-
55
-
56
- def _worst_deficit(report: CapacityReport) -> tuple[str, float]:
57
- """Return the ``(bucket_id, deficit)`` with the largest positive deficit."""
58
- worst_id = ""
59
- worst = 0.0
60
- for tally in report.buckets:
61
- deficit = report.bucket_deficit(tally)
62
- if deficit > worst:
63
- worst = deficit
64
- worst_id = tally.bucket_id
65
- return worst_id, worst
66
-
67
-
68
- def evaluate(
69
- project_root: Path, *, now: datetime | None = None
70
- ) -> tuple[int, str]:
71
- """Pure entry point: returns ``(exit_code, message)``.
72
-
73
- See the module docstring for the three-state contract. The ``advise``
74
- default guarantees exit 0 on the framework's own tree.
75
- """
76
- if not project_root.is_dir():
77
- return 2, (
78
- f"verify_capacity: --project-root is not a directory: {project_root}\n"
79
- " Recovery: pass an existing project root."
80
- )
81
-
82
- allocation = resolve_capacity_allocation(project_root)
83
- report = compute_report(project_root, now=now, allocation=allocation)
84
- rendered = render_report(report)
85
-
86
- if allocation.enforcement != "enforce":
87
- return 0, (
88
- f"{rendered}\n"
89
- "verify_capacity: OK -- advisory posture "
90
- f"(enforcement={allocation.enforcement!r}); deferring to ordering."
91
- )
92
-
93
- if not report.configured:
94
- return 0, (
95
- f"{rendered}\n"
96
- "verify_capacity: OK -- no capacityAllocation buckets configured."
97
- )
98
-
99
- if report.advisory_mode:
100
- return 0, (
101
- f"{rendered}\n"
102
- "verify_capacity: OK -- sample below minSampleSize "
103
- f"({report.classified_completions}/{report.min_sample_size}); "
104
- "capacity stays advisory until enough classified completions accrue."
105
- )
106
-
107
- worst_id, worst = _worst_deficit(report)
108
- if worst > DEFICIT_TOLERANCE:
109
- return 1, (
110
- f"{rendered}\n"
111
- f"verify_capacity: DEFICIT -- bucket {worst_id!r} is starved by "
112
- f"{worst:.2f} (enforce posture; tolerance {DEFICIT_TOLERANCE}). "
113
- "Prioritize that bucket or relax its target."
114
- )
115
-
116
- return 0, (
117
- f"{rendered}\n"
118
- "verify_capacity: OK -- all buckets within target tolerance."
119
- )
120
-
121
-
122
- def _build_parser() -> argparse.ArgumentParser:
123
- parser = argparse.ArgumentParser(
124
- prog="verify_capacity.py",
125
- description=(
126
- "Three-state ADVISORY capacity gate (#1419 Slice 4). Exits 0 in the "
127
- "default advise posture (and on insufficient sample / unconfigured "
128
- "policy); exits 1 only under an explicit enforce posture with a "
129
- "sampled deficit; exits 2 on config error. Not wired into "
130
- "`task check` -- capacity must never fail-closed on the framework tree."
131
- ),
132
- )
133
- parser.add_argument(
134
- "--project-root",
135
- default=".",
136
- help="Project root path (default: current working directory).",
137
- )
138
- parser.add_argument(
139
- "--quiet",
140
- action="store_true",
141
- help="Suppress the OK message (errors / deficits still print).",
142
- )
143
- return parser
144
-
145
-
146
- def main(argv: list[str] | None = None) -> int:
147
- parser = _build_parser()
148
- args = parser.parse_args(argv)
149
- project_root = Path(args.project_root).resolve()
150
- code, message = evaluate(project_root)
151
- if code == 0:
152
- if not args.quiet:
153
- print(message)
154
- else:
155
- print(message, file=sys.stderr)
156
- return code
157
-
158
-
159
- if __name__ == "__main__":
160
- sys.exit(main())