@deftai/directive 0.55.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 (261) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.js +5 -0
  3. package/dist/branch-parity.d.ts +47 -0
  4. package/dist/branch-parity.js +263 -0
  5. package/dist/cache-parity.d.ts +36 -0
  6. package/dist/cache-parity.js +165 -0
  7. package/dist/cache.d.ts +4 -0
  8. package/dist/cache.js +10 -0
  9. package/dist/capacity-backfill.d.ts +3 -0
  10. package/dist/capacity-backfill.js +9 -0
  11. package/dist/capacity-show.d.ts +3 -0
  12. package/dist/capacity-show.js +9 -0
  13. package/dist/check.d.ts +10 -0
  14. package/dist/check.js +60 -0
  15. package/dist/cli-router/index.d.ts +8 -0
  16. package/dist/cli-router/index.js +37 -0
  17. package/dist/cli-router/route-argv.d.ts +32 -0
  18. package/dist/cli-router/route-argv.js +226 -0
  19. package/dist/codebase-default-extractor.d.ts +3 -0
  20. package/dist/codebase-default-extractor.js +9 -0
  21. package/dist/codebase-map-fresh.d.ts +3 -0
  22. package/dist/codebase-map-fresh.js +9 -0
  23. package/dist/codebase-map.d.ts +3 -0
  24. package/dist/codebase-map.js +9 -0
  25. package/dist/codebase-parity.d.ts +30 -0
  26. package/dist/codebase-parity.js +294 -0
  27. package/dist/codebase-projection-registry.d.ts +3 -0
  28. package/dist/codebase-projection-registry.js +9 -0
  29. package/dist/codebase-provider.d.ts +3 -0
  30. package/dist/codebase-provider.js +9 -0
  31. package/dist/content-validate-cli/validate-links.d.ts +11 -0
  32. package/dist/content-validate-cli/validate-links.js +37 -0
  33. package/dist/content-validate-cli/validate-strategy-output.d.ts +13 -0
  34. package/dist/content-validate-cli/validate-strategy-output.js +56 -0
  35. package/dist/content-validate-cli/verify-capacity.d.ts +12 -0
  36. package/dist/content-validate-cli/verify-capacity.js +54 -0
  37. package/dist/dispatch.d.ts +26 -0
  38. package/dist/dispatch.js +569 -0
  39. package/dist/doctor-parity.d.ts +38 -0
  40. package/dist/doctor-parity.js +151 -0
  41. package/dist/doctor.d.ts +3 -0
  42. package/dist/doctor.js +10 -0
  43. package/dist/gates-cli/_helpers.d.ts +18 -0
  44. package/dist/gates-cli/_helpers.js +71 -0
  45. package/dist/index.d.ts +11 -0
  46. package/dist/index.js +15 -0
  47. package/dist/init-cli/constants.d.ts +5 -0
  48. package/dist/init-cli/constants.js +5 -0
  49. package/dist/init-cli/init.d.ts +3 -0
  50. package/dist/init-cli/init.js +11 -0
  51. package/dist/init-cli/resolve-binary.d.ts +34 -0
  52. package/dist/init-cli/resolve-binary.js +78 -0
  53. package/dist/init-cli/run-deft-install.d.ts +23 -0
  54. package/dist/init-cli/run-deft-install.js +71 -0
  55. package/dist/init-cli/update.d.ts +3 -0
  56. package/dist/init-cli/update.js +11 -0
  57. package/dist/install-cli/coverage-map.d.ts +14 -0
  58. package/dist/install-cli/coverage-map.js +111 -0
  59. package/dist/intake-parity.d.ts +30 -0
  60. package/dist/intake-parity.js +203 -0
  61. package/dist/lifecycle-cli/coverage-map.d.ts +16 -0
  62. package/dist/lifecycle-cli/coverage-map.js +254 -0
  63. package/dist/lifecycle-cli/helpers.d.ts +8 -0
  64. package/dist/lifecycle-cli/helpers.js +20 -0
  65. package/dist/lifecycle-packs-parity.d.ts +30 -0
  66. package/dist/lifecycle-packs-parity.js +377 -0
  67. package/dist/orchestration-cli/coverage-map.d.ts +21 -0
  68. package/dist/orchestration-cli/coverage-map.js +225 -0
  69. package/dist/orchestration-cli/helpers.d.ts +11 -0
  70. package/dist/orchestration-cli/helpers.js +35 -0
  71. package/dist/orchestration-parity.d.ts +38 -0
  72. package/dist/orchestration-parity.js +364 -0
  73. package/dist/parity.d.ts +36 -0
  74. package/dist/parity.js +176 -0
  75. package/dist/platform-parity.d.ts +26 -0
  76. package/dist/platform-parity.js +309 -0
  77. package/dist/policy-parity.d.ts +35 -0
  78. package/dist/policy-parity.js +214 -0
  79. package/dist/policy.d.ts +27 -0
  80. package/dist/policy.js +316 -0
  81. package/dist/pr-closing-keywords-parity.d.ts +45 -0
  82. package/dist/pr-closing-keywords-parity.js +259 -0
  83. package/dist/pr-closing-keywords.d.ts +3 -0
  84. package/dist/pr-closing-keywords.js +10 -0
  85. package/dist/pr-merge-readiness-parity.d.ts +44 -0
  86. package/dist/pr-merge-readiness-parity.js +296 -0
  87. package/dist/pr-merge-readiness.d.ts +3 -0
  88. package/dist/pr-merge-readiness.js +10 -0
  89. package/dist/pr-monitor-parity.d.ts +44 -0
  90. package/dist/pr-monitor-parity.js +283 -0
  91. package/dist/pr-monitor.d.ts +3 -0
  92. package/dist/pr-monitor.js +10 -0
  93. package/dist/pr-protected-issues-parity.d.ts +41 -0
  94. package/dist/pr-protected-issues-parity.js +220 -0
  95. package/dist/pr-protected-issues.d.ts +3 -0
  96. package/dist/pr-protected-issues.js +10 -0
  97. package/dist/pr-wait-mergeable-parity.d.ts +45 -0
  98. package/dist/pr-wait-mergeable-parity.js +340 -0
  99. package/dist/pr-wait-mergeable.d.ts +3 -0
  100. package/dist/pr-wait-mergeable.js +10 -0
  101. package/dist/preflight-cache.d.ts +16 -0
  102. package/dist/preflight-cache.js +106 -0
  103. package/dist/preflight-gh.d.ts +12 -0
  104. package/dist/preflight-gh.js +188 -0
  105. package/dist/probe-session.d.ts +3 -0
  106. package/dist/probe-session.js +10 -0
  107. package/dist/release-e2e-parity.d.ts +31 -0
  108. package/dist/release-e2e-parity.js +114 -0
  109. package/dist/release-e2e.d.ts +3 -0
  110. package/dist/release-e2e.js +10 -0
  111. package/dist/release-parity.d.ts +40 -0
  112. package/dist/release-parity.js +223 -0
  113. package/dist/release-publish-parity.d.ts +36 -0
  114. package/dist/release-publish-parity.js +138 -0
  115. package/dist/release-publish.d.ts +3 -0
  116. package/dist/release-publish.js +10 -0
  117. package/dist/release-rollback-parity.d.ts +37 -0
  118. package/dist/release-rollback-parity.js +161 -0
  119. package/dist/release-rollback.d.ts +3 -0
  120. package/dist/release-rollback.js +10 -0
  121. package/dist/release.d.ts +3 -0
  122. package/dist/release.js +10 -0
  123. package/dist/render-cli/deft-ts-runner.d.ts +20 -0
  124. package/dist/render-cli/deft-ts-runner.js +35 -0
  125. package/dist/render-cli/prd-render-cli.d.ts +2 -0
  126. package/dist/render-cli/prd-render-cli.js +7 -0
  127. package/dist/render-cli/project-render-cli.d.ts +2 -0
  128. package/dist/render-cli/project-render-cli.js +6 -0
  129. package/dist/render-cli/spec-render-cli.d.ts +2 -0
  130. package/dist/render-cli/spec-render-cli.js +6 -0
  131. package/dist/render-cli/spec-validate-cli.d.ts +2 -0
  132. package/dist/render-cli/spec-validate-cli.js +6 -0
  133. package/dist/render-parity.d.ts +35 -0
  134. package/dist/render-parity.js +383 -0
  135. package/dist/scm-parity.d.ts +39 -0
  136. package/dist/scm-parity.js +181 -0
  137. package/dist/scope-lifecycle-parity.d.ts +35 -0
  138. package/dist/scope-lifecycle-parity.js +177 -0
  139. package/dist/scope-lifecycle.d.ts +4 -0
  140. package/dist/scope-lifecycle.js +29 -0
  141. package/dist/session-parity.d.ts +39 -0
  142. package/dist/session-parity.js +260 -0
  143. package/dist/slice-parity.d.ts +36 -0
  144. package/dist/slice-parity.js +304 -0
  145. package/dist/slice.d.ts +4 -0
  146. package/dist/slice.js +29 -0
  147. package/dist/story-ready-parity.d.ts +49 -0
  148. package/dist/story-ready-parity.js +254 -0
  149. package/dist/subagent-monitor.d.ts +3 -0
  150. package/dist/subagent-monitor.js +10 -0
  151. package/dist/swarm-parity.d.ts +28 -0
  152. package/dist/swarm-parity.js +326 -0
  153. package/dist/toolchain-check.d.ts +3 -0
  154. package/dist/toolchain-check.js +14 -0
  155. package/dist/triage-actions-parity.d.ts +33 -0
  156. package/dist/triage-actions-parity.js +201 -0
  157. package/dist/triage-actions.d.ts +17 -0
  158. package/dist/triage-actions.js +144 -0
  159. package/dist/triage-aux-a-parity.d.ts +35 -0
  160. package/dist/triage-aux-a-parity.js +172 -0
  161. package/dist/triage-aux-b-parity.d.ts +32 -0
  162. package/dist/triage-aux-b-parity.js +308 -0
  163. package/dist/triage-bootstrap-parity.d.ts +44 -0
  164. package/dist/triage-bootstrap-parity.js +226 -0
  165. package/dist/triage-bootstrap.d.ts +24 -0
  166. package/dist/triage-bootstrap.js +172 -0
  167. package/dist/triage-bulk.d.ts +17 -0
  168. package/dist/triage-bulk.js +154 -0
  169. package/dist/triage-classify-parity.d.ts +40 -0
  170. package/dist/triage-classify-parity.js +227 -0
  171. package/dist/triage-classify.d.ts +13 -0
  172. package/dist/triage-classify.js +76 -0
  173. package/dist/triage-help.d.ts +3 -0
  174. package/dist/triage-help.js +10 -0
  175. package/dist/triage-queue-parity.d.ts +59 -0
  176. package/dist/triage-queue-parity.js +363 -0
  177. package/dist/triage-queue.d.ts +17 -0
  178. package/dist/triage-queue.js +174 -0
  179. package/dist/triage-reconcile.d.ts +11 -0
  180. package/dist/triage-reconcile.js +76 -0
  181. package/dist/triage-refresh.d.ts +7 -0
  182. package/dist/triage-refresh.js +37 -0
  183. package/dist/triage-scope-drift.d.ts +12 -0
  184. package/dist/triage-scope-drift.js +117 -0
  185. package/dist/triage-scope-parity.d.ts +34 -0
  186. package/dist/triage-scope-parity.js +218 -0
  187. package/dist/triage-scope.d.ts +4 -0
  188. package/dist/triage-scope.js +29 -0
  189. package/dist/triage-smoketest.d.ts +3 -0
  190. package/dist/triage-smoketest.js +43 -0
  191. package/dist/triage-subscribe.d.ts +15 -0
  192. package/dist/triage-subscribe.js +157 -0
  193. package/dist/triage-summary-parity.d.ts +50 -0
  194. package/dist/triage-summary-parity.js +306 -0
  195. package/dist/triage-summary.d.ts +14 -0
  196. package/dist/triage-summary.js +77 -0
  197. package/dist/triage-welcome.d.ts +12 -0
  198. package/dist/triage-welcome.js +78 -0
  199. package/dist/ts-check-lane.d.ts +9 -0
  200. package/dist/ts-check-lane.js +49 -0
  201. package/dist/validate-content-parity.d.ts +33 -0
  202. package/dist/validate-content-parity.js +356 -0
  203. package/dist/vbrief-activate-parity.d.ts +39 -0
  204. package/dist/vbrief-activate-parity.js +216 -0
  205. package/dist/vbrief-activate.d.ts +3 -0
  206. package/dist/vbrief-activate.js +7 -0
  207. package/dist/vbrief-build-parity.d.ts +28 -0
  208. package/dist/vbrief-build-parity.js +399 -0
  209. package/dist/vbrief-build.d.ts +3 -0
  210. package/dist/vbrief-build.js +8 -0
  211. package/dist/vbrief-preflight-parity.d.ts +34 -0
  212. package/dist/vbrief-preflight-parity.js +163 -0
  213. package/dist/vbrief-preflight.d.ts +12 -0
  214. package/dist/vbrief-preflight.js +58 -0
  215. package/dist/vbrief-reconcile-parity.d.ts +22 -0
  216. package/dist/vbrief-reconcile-parity.js +600 -0
  217. package/dist/vbrief-reconcile.d.ts +3 -0
  218. package/dist/vbrief-reconcile.js +7 -0
  219. package/dist/vbrief-validate-parity.d.ts +27 -0
  220. package/dist/vbrief-validate-parity.js +122 -0
  221. package/dist/vbrief-validate.d.ts +3 -0
  222. package/dist/vbrief-validate.js +8 -0
  223. package/dist/vbrief-validation-parity.d.ts +28 -0
  224. package/dist/vbrief-validation-parity.js +645 -0
  225. package/dist/vbrief-validation.d.ts +3 -0
  226. package/dist/vbrief-validation.js +8 -0
  227. package/dist/verify-branch.d.ts +14 -0
  228. package/dist/verify-branch.js +81 -0
  229. package/dist/verify-encoding.d.ts +15 -0
  230. package/dist/verify-encoding.js +86 -0
  231. package/dist/verify-env-parity.d.ts +28 -0
  232. package/dist/verify-env-parity.js +272 -0
  233. package/dist/verify-hooks-installed.d.ts +10 -0
  234. package/dist/verify-hooks-installed.js +48 -0
  235. package/dist/verify-investigation.d.ts +3 -0
  236. package/dist/verify-investigation.js +10 -0
  237. package/dist/verify-judgment-gates.d.ts +3 -0
  238. package/dist/verify-judgment-gates.js +10 -0
  239. package/dist/verify-no-task-runtime.d.ts +3 -0
  240. package/dist/verify-no-task-runtime.js +16 -0
  241. package/dist/verify-session-ritual.d.ts +13 -0
  242. package/dist/verify-session-ritual.js +78 -0
  243. package/dist/verify-source-cli/rule-ownership-lint.d.ts +12 -0
  244. package/dist/verify-source-cli/rule-ownership-lint.js +61 -0
  245. package/dist/verify-source-cli/verify-content-manifest.d.ts +12 -0
  246. package/dist/verify-source-cli/verify-content-manifest.js +61 -0
  247. package/dist/verify-source-cli/verify-scm-boundary.d.ts +13 -0
  248. package/dist/verify-source-cli/verify-scm-boundary.js +66 -0
  249. package/dist/verify-source-cli/verify-stubs.d.ts +11 -0
  250. package/dist/verify-source-cli/verify-stubs.js +27 -0
  251. package/dist/verify-source-parity.d.ts +26 -0
  252. package/dist/verify-source-parity.js +178 -0
  253. package/dist/verify-story-ready.d.ts +16 -0
  254. package/dist/verify-story-ready.js +138 -0
  255. package/dist/verify-tools.d.ts +13 -0
  256. package/dist/verify-tools.js +67 -0
  257. package/dist/verify-wip-cap.d.ts +13 -0
  258. package/dist/verify-wip-cap.js +62 -0
  259. package/dist/wip-cap-parity.d.ts +39 -0
  260. package/dist/wip-cap-parity.js +209 -0
  261. package/package.json +50 -0
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ interface ParsedArgs {
3
+ projectRoot?: string;
4
+ source?: string;
5
+ repo?: string;
6
+ maxAgeHours?: number;
7
+ forIssue?: number;
8
+ allowStale?: boolean;
9
+ allowMissingBootstrap?: boolean;
10
+ quiet?: boolean;
11
+ error?: string;
12
+ }
13
+ export declare function parseArgs(argv: string[]): ParsedArgs;
14
+ export declare function run(argv: string[]): number;
15
+ export {};
16
+ //# sourceMappingURL=preflight-cache.d.ts.map
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * preflight-cache.ts -- CLI for the cache-freshness gate (#1127).
4
+ *
5
+ * Usage:
6
+ * deft-ts preflight-cache --project-root <path> --allow-missing-bootstrap
7
+ * deft-ts preflight-cache --project-root <path> --for-issue <N>
8
+ *
9
+ * Thin shim -- delegates to @deftai/directive-core/preflight-cache.
10
+ */
11
+ import { fileURLToPath } from "node:url";
12
+ import { evaluate } from "@deftai/directive-core/preflight-cache";
13
+ export function parseArgs(argv) {
14
+ const parsed = {};
15
+ for (let i = 0; i < argv.length; i++) {
16
+ const arg = argv[i] ?? "";
17
+ if (arg === "--project-root") {
18
+ const next = argv[i + 1];
19
+ if (next === undefined)
20
+ return { ...parsed, error: "argument --project-root: expected one argument" };
21
+ parsed.projectRoot = next;
22
+ i++;
23
+ }
24
+ else if (arg.startsWith("--project-root=")) {
25
+ parsed.projectRoot = arg.slice("--project-root=".length);
26
+ }
27
+ else if (arg === "--source") {
28
+ const next = argv[i + 1];
29
+ if (next === undefined)
30
+ return { ...parsed, error: "argument --source: expected one argument" };
31
+ parsed.source = next;
32
+ i++;
33
+ }
34
+ else if (arg === "--repo") {
35
+ const next = argv[i + 1];
36
+ if (next === undefined)
37
+ return { ...parsed, error: "argument --repo: expected one argument" };
38
+ parsed.repo = next;
39
+ i++;
40
+ }
41
+ else if (arg === "--max-age-hours") {
42
+ const next = argv[i + 1];
43
+ if (next === undefined)
44
+ return { ...parsed, error: "argument --max-age-hours: expected one argument" };
45
+ parsed.maxAgeHours = Number.parseInt(next, 10);
46
+ i++;
47
+ }
48
+ else if (arg === "--for-issue") {
49
+ const next = argv[i + 1];
50
+ if (next === undefined)
51
+ return { ...parsed, error: "argument --for-issue: expected one argument" };
52
+ parsed.forIssue = Number.parseInt(next, 10);
53
+ i++;
54
+ }
55
+ else if (arg === "--allow-stale") {
56
+ parsed.allowStale = true;
57
+ }
58
+ else if (arg === "--allow-missing-bootstrap") {
59
+ parsed.allowMissingBootstrap = true;
60
+ }
61
+ else if (arg === "--quiet") {
62
+ parsed.quiet = true;
63
+ }
64
+ else {
65
+ return { ...parsed, error: `unrecognized argument: ${arg}` };
66
+ }
67
+ }
68
+ return parsed;
69
+ }
70
+ export function run(argv) {
71
+ const args = parseArgs(argv);
72
+ if (args.error !== undefined) {
73
+ process.stderr.write(`preflight-cache: ${args.error}\n`);
74
+ return 2;
75
+ }
76
+ const projectRoot = args.projectRoot ?? ".";
77
+ const result = evaluate(projectRoot, {
78
+ source: args.source,
79
+ repo: args.repo,
80
+ maxAgeHours: args.maxAgeHours ?? null,
81
+ forIssue: args.forIssue ?? null,
82
+ allowStale: args.allowStale ?? false,
83
+ allowMissingBootstrap: args.allowMissingBootstrap ?? false,
84
+ });
85
+ const quiet = args.quiet ?? false;
86
+ if (result.code === 0) {
87
+ if (!quiet) {
88
+ if (result.message.startsWith("⚠")) {
89
+ process.stderr.write(`${result.message}\n`);
90
+ }
91
+ else {
92
+ process.stdout.write(`${result.message}\n`);
93
+ }
94
+ }
95
+ }
96
+ else {
97
+ process.stderr.write(`${result.message}\n`);
98
+ }
99
+ return result.code;
100
+ }
101
+ /* v8 ignore start -- entry guard */
102
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
103
+ process.exit(run(process.argv.slice(2)));
104
+ }
105
+ /* v8 ignore stop */
106
+ //# sourceMappingURL=preflight-cache.js.map
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ interface ParsedArgs {
3
+ mode?: "self-test" | "command" | "pre-push-stdin";
4
+ command?: string;
5
+ defaultBranches?: Set<string>;
6
+ quiet?: boolean;
7
+ error?: string;
8
+ }
9
+ export declare function parseArgs(argv: string[]): ParsedArgs;
10
+ export declare function run(argv: string[]): number | Promise<number>;
11
+ export {};
12
+ //# sourceMappingURL=preflight-gh.d.ts.map
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * preflight-gh.ts -- CLI for the destructive-gh-verb gate (#1019).
4
+ *
5
+ * Usage:
6
+ * deft-ts preflight-gh --self-test
7
+ * deft-ts preflight-gh --command "<gh ...>"
8
+ * deft-ts preflight-gh --pre-push-stdin (reads from stdin)
9
+ *
10
+ * Thin shim -- delegates to @deftai/directive-core/preflight-gh.
11
+ */
12
+ import { createInterface } from "node:readline";
13
+ import { fileURLToPath } from "node:url";
14
+ import { DEFAULT_BRANCHES, ENV_BYPASS, evaluateCommand, runSelfTest, } from "@deftai/directive-core/preflight-gh";
15
+ export function parseArgs(argv) {
16
+ const parsed = { defaultBranches: new Set(DEFAULT_BRANCHES) };
17
+ for (let i = 0; i < argv.length; i++) {
18
+ const arg = argv[i] ?? "";
19
+ if (arg === "--self-test") {
20
+ parsed.mode = "self-test";
21
+ }
22
+ else if (arg === "--pre-push-stdin") {
23
+ parsed.mode = "pre-push-stdin";
24
+ }
25
+ else if (arg === "--command") {
26
+ const next = argv[i + 1];
27
+ if (next === undefined) {
28
+ return { ...parsed, error: "argument --command: expected one argument" };
29
+ }
30
+ parsed.mode = "command";
31
+ parsed.command = next;
32
+ i++;
33
+ }
34
+ else if (arg === "--quiet") {
35
+ parsed.quiet = true;
36
+ }
37
+ else if (arg === "--default-branch") {
38
+ const next = argv[i + 1];
39
+ if (next === undefined) {
40
+ return { ...parsed, error: "argument --default-branch: expected one argument" };
41
+ }
42
+ parsed.defaultBranches ??= new Set();
43
+ parsed.defaultBranches.add(next);
44
+ i++;
45
+ }
46
+ else if (arg === "--project-root") {
47
+ // accepted for parity with preflight_branch.py; ignored here
48
+ i++;
49
+ }
50
+ else {
51
+ return { ...parsed, error: `unrecognized argument: ${arg}` };
52
+ }
53
+ }
54
+ return parsed;
55
+ }
56
+ export function run(argv) {
57
+ const args = parseArgs(argv);
58
+ if (args.error !== undefined) {
59
+ process.stderr.write(`preflight-gh: ${args.error}\n`);
60
+ return 2;
61
+ }
62
+ const quiet = args.quiet ?? false;
63
+ const branches = args.defaultBranches ?? new Set(DEFAULT_BRANCHES);
64
+ if (args.mode === "self-test") {
65
+ const [code, msg] = runSelfTest();
66
+ if (code === 0) {
67
+ if (!quiet)
68
+ process.stdout.write(`${msg}\n`);
69
+ }
70
+ else {
71
+ process.stderr.write(`${msg}\n`);
72
+ }
73
+ return code;
74
+ }
75
+ if (args.mode === "command" && args.command !== undefined) {
76
+ const [code, msg] = evaluateCommand(args.command, branches);
77
+ if (code === 0) {
78
+ if (!quiet)
79
+ process.stdout.write(`${msg}\n`);
80
+ }
81
+ else {
82
+ process.stderr.write(`${msg}\n`);
83
+ }
84
+ return code;
85
+ }
86
+ if (args.mode === "pre-push-stdin") {
87
+ return runPrePushStdin(branches, quiet);
88
+ }
89
+ process.stderr.write("preflight-gh: one of --self-test / --command / --pre-push-stdin required\n");
90
+ return 2;
91
+ }
92
+ function parsePrePushLines(text) {
93
+ return text
94
+ .split("\n")
95
+ .map((l) => l.trim())
96
+ .filter((l) => l.length > 0)
97
+ .flatMap((l) => {
98
+ const parts = l.split(/\s+/);
99
+ if (parts.length !== 4)
100
+ return [];
101
+ return [
102
+ {
103
+ localRef: parts[0] ?? "",
104
+ localOid: parts[1] ?? "",
105
+ remoteRef: parts[2] ?? "",
106
+ remoteOid: parts[3] ?? "",
107
+ },
108
+ ];
109
+ });
110
+ }
111
+ const ZERO_OID_RE = /^0+$/;
112
+ function evaluatePrePush(refs, branches) {
113
+ if (refs.length === 0) {
114
+ return [0, "✓ deft destructive-gh-verb gate (pre-push): no refs in stdin -- nothing to gate."];
115
+ }
116
+ const branchesLower = new Set([...branches].map((b) => b.toLowerCase()));
117
+ const blocked = [];
118
+ for (const { localRef, localOid, remoteRef, remoteOid } of refs) {
119
+ const branch = remoteRef.replace(/^refs\/heads\//, "");
120
+ if (!branchesLower.has(branch.toLowerCase()))
121
+ continue;
122
+ if (ZERO_OID_RE.test(remoteOid)) {
123
+ blocked.push(`create ${branch} (local=${localRef})`);
124
+ }
125
+ else if (ZERO_OID_RE.test(localOid)) {
126
+ blocked.push(`delete ${branch}`);
127
+ }
128
+ else {
129
+ blocked.push(`update ${branch} (local=${localRef})`);
130
+ }
131
+ }
132
+ if (blocked.length === 0) {
133
+ return [
134
+ 0,
135
+ "✓ deft destructive-gh-verb gate (pre-push): no pushes to default branches detected -- proceeding.",
136
+ ];
137
+ }
138
+ const bypass = (process.env[ENV_BYPASS] ?? "").trim().toLowerCase();
139
+ if (["1", "true", "yes", "on"].includes(bypass)) {
140
+ return [
141
+ 0,
142
+ `⚠ deft destructive-gh-verb gate (pre-push): default-branch push detected (${blocked.join("; ")}) but ${ENV_BYPASS}=1 is set -- policy bypassed for this invocation.`,
143
+ ];
144
+ }
145
+ return [
146
+ 1,
147
+ [
148
+ "❌ deft destructive-gh-verb gate (pre-push): refusing to push directly to the default branch.",
149
+ ` Detail: ${blocked.join("; ")}`,
150
+ "",
151
+ " How to proceed:",
152
+ " • push to a feature branch and open a PR",
153
+ ` • or set the env-var bypass for this shell: ${ENV_BYPASS}=1`,
154
+ " See scm/github.md (## Destructive gh verbs (#1019)).",
155
+ ].join("\n"),
156
+ ];
157
+ }
158
+ function runPrePushStdin(branches, quiet) {
159
+ return new Promise((resolve) => {
160
+ const lines = [];
161
+ const rl = createInterface({ input: process.stdin });
162
+ rl.on("line", (l) => lines.push(l));
163
+ rl.on("close", () => {
164
+ const refs = parsePrePushLines(lines.join("\n"));
165
+ const [code, msg] = evaluatePrePush(refs, branches);
166
+ if (code === 0) {
167
+ if (!quiet)
168
+ process.stdout.write(`${msg}\n`);
169
+ }
170
+ else {
171
+ process.stderr.write(`${msg}\n`);
172
+ }
173
+ resolve(code);
174
+ });
175
+ });
176
+ }
177
+ /* v8 ignore start -- entry guard */
178
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
179
+ const result = run(process.argv.slice(2));
180
+ if (result instanceof Promise) {
181
+ result.then((code) => process.exit(code)).catch(() => process.exit(2));
182
+ }
183
+ else {
184
+ process.exit(result);
185
+ }
186
+ }
187
+ /* v8 ignore stop */
188
+ //# sourceMappingURL=preflight-gh.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function run(argv: string[]): number;
3
+ //# sourceMappingURL=probe-session.d.ts.map
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from "node:url";
3
+ import { cmdProbeSession } from "@deftai/directive-core/orchestration";
4
+ export function run(argv) {
5
+ return cmdProbeSession(argv);
6
+ }
7
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
8
+ process.exit(run(process.argv.slice(2)));
9
+ }
10
+ //# sourceMappingURL=probe-session.js.map
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ export interface CommandCapture {
3
+ readonly exitCode: number;
4
+ readonly stdout: string;
5
+ readonly stderr: string;
6
+ }
7
+ export interface ParityScenario {
8
+ readonly name: string;
9
+ readonly argv: readonly string[];
10
+ readonly compareStdout?: boolean;
11
+ }
12
+ export interface ParityDiff {
13
+ readonly name: string;
14
+ readonly exitMismatch: boolean;
15
+ readonly outputMismatch: boolean;
16
+ readonly pythonExit: number;
17
+ readonly tsExit: number;
18
+ readonly pythonOutput: string;
19
+ readonly tsOutput: string;
20
+ readonly stream: "stdout" | "stderr";
21
+ }
22
+ export interface ParityResult {
23
+ readonly ok: boolean;
24
+ readonly diffs: ParityDiff[];
25
+ }
26
+ export declare const PARITY_SCENARIOS: readonly ParityScenario[];
27
+ /** Normalise volatile repo slugs and ISO dates in stderr while preserving semantics. */
28
+ export declare function normaliseStderr(text: string): string;
29
+ export declare function runParity(): ParityResult;
30
+ export declare function renderReport(result: ParityResult): string;
31
+ //# sourceMappingURL=release-e2e-parity.d.ts.map
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Golden-output parity harness (#1729): runs BOTH the Python oracle
4
+ * (`scripts/release_e2e.py`) and the ported TS release:e2e CLI with
5
+ * identical argv, then diffs exit codes and normalised stderr/stdout.
6
+ */
7
+ import { spawnSync } from "node:child_process";
8
+ import { dirname, join, resolve } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ export const PARITY_SCENARIOS = [
11
+ { name: "help", argv: ["--help"], compareStdout: true },
12
+ { name: "dry-run", argv: ["--dry-run"] },
13
+ { name: "dry-run-keep-repo", argv: ["--dry-run", "--keep-repo"] },
14
+ {
15
+ name: "dry-run-project-root",
16
+ argv: ["--dry-run", "--owner", "deftai", "--project-root", "/tmp/deft-e2e-parity-root"],
17
+ },
18
+ ];
19
+ /** Normalise volatile repo slugs and ISO dates in stderr while preserving semantics. */
20
+ export function normaliseStderr(text) {
21
+ return text
22
+ .replace(/deftai-release-test-\d{14}-[0-9a-f]{6}/g, "deftai-release-test-YYYYMMDDHHMMSS-uuid6")
23
+ .replace(/\d{4}-\d{2}-\d{2}/g, "YYYY-MM-DD");
24
+ }
25
+ function runCapture(cmd, args, cwd) {
26
+ const result = spawnSync(cmd, args, {
27
+ cwd,
28
+ encoding: "utf8",
29
+ env: {
30
+ ...process.env,
31
+ DEFT_CACHE_DISABLE: "1",
32
+ PYTHONUTF8: "1",
33
+ },
34
+ stdio: ["ignore", "pipe", "pipe"],
35
+ });
36
+ return {
37
+ exitCode: result.status ?? 2,
38
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
39
+ stderr: typeof result.stderr === "string" ? result.stderr : "",
40
+ };
41
+ }
42
+ function resolveDeftRoot() {
43
+ if (process.env.DEFT_ROOT !== undefined && process.env.DEFT_ROOT.length > 0) {
44
+ return resolve(process.env.DEFT_ROOT);
45
+ }
46
+ return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
47
+ }
48
+ function runScenario(deftRoot, scenario) {
49
+ const argv = [...scenario.argv];
50
+ const py = runCapture("uv", ["run", "python", join(deftRoot, "scripts", "release_e2e.py"), ...argv], deftRoot);
51
+ const ts = runCapture("node", [join(deftRoot, "packages", "cli", "dist", "release-e2e.js"), ...argv], deftRoot);
52
+ const stream = scenario.compareStdout ? "stdout" : "stderr";
53
+ let pythonOutput = stream === "stdout" ? py.stdout : py.stderr;
54
+ let tsOutput = stream === "stdout" ? ts.stdout : ts.stderr;
55
+ if (stream === "stderr") {
56
+ pythonOutput = normaliseStderr(pythonOutput);
57
+ tsOutput = normaliseStderr(tsOutput);
58
+ }
59
+ return {
60
+ name: scenario.name,
61
+ exitMismatch: py.exitCode !== ts.exitCode,
62
+ outputMismatch: pythonOutput !== tsOutput,
63
+ pythonExit: py.exitCode,
64
+ tsExit: ts.exitCode,
65
+ pythonOutput,
66
+ tsOutput,
67
+ stream,
68
+ };
69
+ }
70
+ export function runParity() {
71
+ const deftRoot = resolveDeftRoot();
72
+ const diffs = PARITY_SCENARIOS.map((scenario) => runScenario(deftRoot, scenario));
73
+ const ok = diffs.every((d) => !d.exitMismatch && !d.outputMismatch);
74
+ return { ok, diffs };
75
+ }
76
+ export function renderReport(result) {
77
+ if (result.ok) {
78
+ return `release-e2e parity: CLEAN -- Python and TS agree on ${result.diffs.length} scenario(s).`;
79
+ }
80
+ const lines = ["release-e2e parity: DIVERGENCE"];
81
+ for (const d of result.diffs) {
82
+ if (d.exitMismatch || d.outputMismatch) {
83
+ lines.push(` scenario: ${d.name}`);
84
+ if (d.exitMismatch) {
85
+ lines.push(` exit mismatch: python=${d.pythonExit} ts=${d.tsExit}`);
86
+ }
87
+ if (d.outputMismatch) {
88
+ lines.push(` stream: ${d.stream}`);
89
+ lines.push(` python (${d.pythonOutput.length} bytes):`);
90
+ lines.push(d.pythonOutput);
91
+ lines.push(` ts (${d.tsOutput.length} bytes):`);
92
+ lines.push(d.tsOutput);
93
+ }
94
+ }
95
+ }
96
+ return lines.join("\n");
97
+ }
98
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
99
+ try {
100
+ const result = runParity();
101
+ if (result.ok) {
102
+ process.stdout.write(`${renderReport(result)}\n`);
103
+ process.exit(0);
104
+ }
105
+ process.stderr.write(`${renderReport(result)}\n`);
106
+ process.exit(1);
107
+ }
108
+ catch (err) {
109
+ const msg = String(err).replace(/\r?\n/g, " ");
110
+ process.stderr.write(`release-e2e parity: harness error -- ${msg}\n`);
111
+ process.exit(2);
112
+ }
113
+ }
114
+ //# sourceMappingURL=release-e2e-parity.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function run(argv: string[]): number;
3
+ //# sourceMappingURL=release-e2e.d.ts.map
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from "node:url";
3
+ import { cmdReleaseE2e } from "../../core/dist/release-e2e/main.js";
4
+ export function run(argv) {
5
+ return cmdReleaseE2e(argv);
6
+ }
7
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
8
+ process.exit(run(process.argv.slice(2)));
9
+ }
10
+ //# sourceMappingURL=release-e2e.js.map
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ export declare const SAMPLE_CHANGELOG = " Changelog\n\nAll notable changes to the project.\n\n## [Unreleased]\n\n### Added\n- New release automation (#74)\n\n### Changed\n- Refactored module X\n\n### Fixed\n- Bug Y\n\n## [0.20.2] - 2026-04-24\n\n### Added\n- Prior change\n\n## [0.20.0] - 2026-04-23\n\n### Added\n- Older change\n\n[Unreleased]: https://github.com/deftai/directive/compare/v0.20.2...HEAD\n[0.20.2]: https://github.com/deftai/directive/compare/v0.20.0...v0.20.2\n[0.20.0]: https://github.com/deftai/directive/compare/v0.19.0...v0.20.0\n";
3
+ export interface ScenarioResult {
4
+ readonly name: string;
5
+ readonly exitCode: number;
6
+ readonly stdout: string;
7
+ readonly stderr: string;
8
+ }
9
+ export interface ParityScenario {
10
+ readonly name: string;
11
+ readonly argv: readonly string[];
12
+ readonly setup?: (root: string) => void;
13
+ readonly compareStdout?: boolean;
14
+ }
15
+ export interface ParityResult {
16
+ readonly ok: boolean;
17
+ readonly scenarios: Array<{
18
+ readonly name: string;
19
+ readonly exitMismatch: boolean;
20
+ readonly pythonExit: number;
21
+ readonly tsExit: number;
22
+ readonly outputMismatch: boolean;
23
+ readonly pythonOutput: string;
24
+ readonly tsOutput: string;
25
+ readonly stream: "stdout" | "stderr";
26
+ }>;
27
+ }
28
+ export declare const PARITY_SCENARIOS: readonly ParityScenario[];
29
+ /** Normalise volatile ISO dates in stderr while preserving semantics. */
30
+ export declare function normaliseStderr(text: string): string;
31
+ export declare function pickOutput(result: ScenarioResult, stream: "stdout" | "stderr"): string;
32
+ export declare function diffParity(python: ScenarioResult, ts: ScenarioResult, stream: "stdout" | "stderr"): {
33
+ exitMismatch: boolean;
34
+ outputMismatch: boolean;
35
+ pythonOutput: string;
36
+ tsOutput: string;
37
+ };
38
+ export declare function runParity(): ParityResult;
39
+ export declare function renderReport(result: ParityResult): string;
40
+ //# sourceMappingURL=release-parity.d.ts.map