@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,111 @@
1
+ /** One-line rationale per in-scope tests/cli file (Bucket C audit). */
2
+ export const INSTALL_CLI_TAIL_COVERAGE_MAP = [
3
+ {
4
+ pythonTest: "tests/cli/test_migrate_vbrief.py",
5
+ classification: "retire-at-Wave-9",
6
+ rationale: "Exercises scripts/migrate_vbrief.py pre-v0.20 migrator — accepted non-port deleted in #1731.",
7
+ },
8
+ {
9
+ pythonTest: "tests/cli/test_migrate_vbrief_canonical_refs.py",
10
+ classification: "retire-at-Wave-9",
11
+ rationale: "End-to-end migrate_vbrief references/narrative clamp regressions — accepted non-port migrator.",
12
+ },
13
+ {
14
+ pythonTest: "tests/cli/test_migrate_vbrief_fixtures.py",
15
+ classification: "retire-at-Wave-9",
16
+ rationale: "Fixture-driven migrate() routing matrix — accepted non-port pre-cutover migrator tooling.",
17
+ },
18
+ {
19
+ pythonTest: "tests/cli/test_migrate_vbrief_rc4.py",
20
+ classification: "retire-at-Wave-9",
21
+ rationale: "RC4 migrator rollback/reconciliation — accepted non-port migrate_* family (#1731).",
22
+ },
23
+ {
24
+ pythonTest: "tests/cli/test_migrate_preflight.py",
25
+ classification: "retire-at-Wave-9",
26
+ rationale: "scripts/migrate_preflight.py agent-side migrate:vbrief gate — accepted non-port migration tooling.",
27
+ },
28
+ {
29
+ pythonTest: "tests/cli/test_precutover_guard.py",
30
+ classification: "retire-at-Wave-9",
31
+ rationale: "Pre-cutover detection and legacy placeholder checks via _precutover — accepted non-port.",
32
+ },
33
+ {
34
+ pythonTest: "tests/cli/test_cmd_agents_refresh.py",
35
+ classification: "retire-at-Wave-9",
36
+ rationale: "Python run cmd_agents_refresh upgrade-gate companion — no deft-ts verb; retires with legacy run.",
37
+ },
38
+ {
39
+ pythonTest: "tests/cli/test_cmd_check_updates.py",
40
+ classification: "retire-at-Wave-9",
41
+ rationale: "Python run cmd_check_updates remote version probe — no TS port; retires with legacy run module.",
42
+ },
43
+ {
44
+ pythonTest: "tests/cli/test_cmd_doctor.py",
45
+ classification: "retarget",
46
+ rationale: "cmd_doctor survives as deft-ts doctor verb (packages/cli/src/doctor.ts); exit-code parity via dispatch.",
47
+ vitestSpec: "packages/cli/src/install-cli/retarget-dispatch.test.ts",
48
+ },
49
+ {
50
+ pythonTest: "tests/cli/test_cmd_gate.py",
51
+ classification: "retire-at-Wave-9",
52
+ rationale: "Python run cmd_gate universal upgrade gate — no deft-ts verb; retires with legacy run module.",
53
+ },
54
+ {
55
+ pythonTest: "tests/cli/test_cmd_spec.py",
56
+ classification: "retire-at-Wave-9",
57
+ rationale: "Python run cmd_spec interactive spec generator — no deft-ts verb; retires with legacy run.",
58
+ },
59
+ {
60
+ pythonTest: "tests/cli/test_upgrade_gate.py",
61
+ classification: "retire-at-Wave-9",
62
+ rationale: "Python run upgrade gate and cmd_project lifecycle scaffolding — legacy run; no TS equivalent.",
63
+ },
64
+ {
65
+ pythonTest: "tests/cli/test_upgrade_gate_remote_drift.py",
66
+ classification: "retire-at-Wave-9",
67
+ rationale: "Python run _check_upgrade_gate remote-drift integration — legacy run upgrade path.",
68
+ },
69
+ {
70
+ pythonTest: "tests/cli/test_run_bat_path.py",
71
+ classification: "retire-at-Wave-9",
72
+ rationale: "Windows run.bat packaging shim self-relative resolution — build/packaging accepted non-port.",
73
+ },
74
+ {
75
+ pythonTest: "tests/cli/test_run_version.py",
76
+ classification: "retire-at-Wave-9",
77
+ rationale: "Python run VERSION resolution chain — legacy run entrypoint retires with scripts/*.py in #1731.",
78
+ },
79
+ {
80
+ pythonTest: "tests/cli/test_setup_ghx.py",
81
+ classification: "retire-at-Wave-9",
82
+ rationale: "scripts/setup_ghx.py consent-gated installer helper — build/packaging accepted non-port (#1731).",
83
+ },
84
+ {
85
+ pythonTest: "tests/cli/test_safe_subprocess.py",
86
+ classification: "retire-at-Wave-9",
87
+ rationale: "scripts/_safe_subprocess.py UTF-8 capture shim — Python runtime accepted non-port (#1731).",
88
+ },
89
+ {
90
+ pythonTest: "tests/cli/test_task_scripts.py",
91
+ classification: "retarget",
92
+ rationale: "TestToolchainCheck maps to deft-ts toolchain-check; remainder covers legacy Python task scripts without TS verbs.",
93
+ vitestSpec: "packages/cli/src/install-cli/retarget-dispatch.test.ts",
94
+ },
95
+ {
96
+ pythonTest: "tests/cli/test_ts_check_lane.py",
97
+ classification: "retire-at-Wave-9",
98
+ rationale: "scripts/ts_check_lane.py Python meta-guard for pnpm lane — retires once Python CI lane is removed.",
99
+ },
100
+ {
101
+ pythonTest: "tests/cli/test_vendored_install_metadata.py",
102
+ classification: "retire-at-Wave-9",
103
+ rationale: "Vendored Go-install metadata via Python run/doctor/resolve_version — installer deposit accepted non-port.",
104
+ },
105
+ {
106
+ pythonTest: "tests/cli/test_remote_probe_throttle.py",
107
+ classification: "retire-at-Wave-9",
108
+ rationale: "Python run remote-probe throttle state for #801 — legacy run module; no deft-ts verb.",
109
+ },
110
+ ];
111
+ //# sourceMappingURL=coverage-map.js.map
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import { PARITY_SCENARIO_NAMES, type ParityScenarioName } from "@deftai/directive-core/intake/parity-scenarios";
3
+ export interface Capture {
4
+ readonly exitCode: number;
5
+ readonly stdout: string;
6
+ readonly stderr: string;
7
+ }
8
+ export interface ParityCase {
9
+ readonly name: ParityScenarioName;
10
+ readonly runPython: (deftRoot: string) => Capture;
11
+ readonly runTs: (deftRoot: string) => Capture;
12
+ }
13
+ export declare const PARITY_CASES: readonly ParityCase[];
14
+ export interface ParityDiff {
15
+ readonly name: string;
16
+ readonly exitMismatch: boolean;
17
+ readonly stdoutMismatch: boolean;
18
+ readonly stderrMismatch: boolean;
19
+ readonly pythonExit: number;
20
+ readonly tsExit: number;
21
+ }
22
+ export interface ParityResult {
23
+ readonly ok: boolean;
24
+ readonly diffs: ParityDiff[];
25
+ }
26
+ export declare function diffCase(python: Capture, ts: Capture, name: string): ParityDiff;
27
+ export declare function runParity(deftRoot?: string): ParityResult;
28
+ export declare function renderReport(result: ParityResult): string;
29
+ export { PARITY_SCENARIO_NAMES };
30
+ //# sourceMappingURL=intake-parity.d.ts.map
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Golden-output parity harness (#1784): compares TS intake modules vs Python oracle via python -c.
4
+ */
5
+ import { spawnSync } from "node:child_process";
6
+ import { dirname, resolve } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { buildIssueVbrief, CandidatesLogError, extractCrossRefs, IssueState, reconcile, renderIssueBody, resultToDict, validateCandidatesEntry, validateGithubAuth, } from "@deftai/directive-core/intake";
9
+ import { PARITY_SCENARIO_NAMES, SAMPLE_ISSUE, SAMPLE_VBRIEF, } from "@deftai/directive-core/intake/parity-scenarios";
10
+ import { pythonJsonStringify } from "@deftai/directive-core/scm";
11
+ function capture(exitCode, stdout, stderr = "") {
12
+ return { exitCode, stdout, stderr };
13
+ }
14
+ function sortKeysDeep(value) {
15
+ if (Array.isArray(value)) {
16
+ return value.map((item) => sortKeysDeep(item));
17
+ }
18
+ if (value !== null && typeof value === "object") {
19
+ const obj = value;
20
+ const sorted = {};
21
+ for (const key of Object.keys(obj).sort()) {
22
+ sorted[key] = sortKeysDeep(obj[key]);
23
+ }
24
+ return sorted;
25
+ }
26
+ return value;
27
+ }
28
+ function stableJson(value) {
29
+ return `${pythonJsonStringify(sortKeysDeep(value))}\n`;
30
+ }
31
+ function runPythonScript(deftRoot, script) {
32
+ const code = `import importlib.util, json, sys\nfrom pathlib import Path\nroot = Path(${JSON.stringify(deftRoot)})\nsys.path.insert(0, str(root / "scripts"))\n${script}`;
33
+ const result = spawnSync("uv", ["run", "python", "-c", code], {
34
+ cwd: deftRoot,
35
+ encoding: "utf8",
36
+ env: { ...process.env, DEFT_CACHE_DISABLE: "1", PYTHONUTF8: "1" },
37
+ stdio: ["ignore", "pipe", "pipe"],
38
+ });
39
+ return {
40
+ exitCode: result.status ?? 2,
41
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
42
+ stderr: typeof result.stderr === "string" ? result.stderr : "",
43
+ };
44
+ }
45
+ function loadModule(name, rel) {
46
+ return `spec = importlib.util.spec_from_file_location(${JSON.stringify(name)}, root / ${JSON.stringify(rel)})
47
+ mod = importlib.util.module_from_spec(spec)
48
+ sys.modules[${JSON.stringify(name)}] = mod
49
+ spec.loader.exec_module(mod)`;
50
+ }
51
+ export const PARITY_CASES = [
52
+ {
53
+ name: "issue-ingest-build-vbrief",
54
+ runPython(deftRoot) {
55
+ return runPythonScript(deftRoot, `${loadModule("issue_ingest", "scripts/issue_ingest.py")}
56
+ issue = ${JSON.stringify(SAMPLE_ISSUE)}
57
+ vbrief, folder = mod._build_issue_vbrief(issue, "proposed", "https://github.com/owner/repo")
58
+ print(json.dumps({"folder": folder, "vbrief": vbrief}, ensure_ascii=False, sort_keys=True))
59
+ sys.exit(0)`);
60
+ },
61
+ runTs() {
62
+ const [vbrief, folder] = buildIssueVbrief(SAMPLE_ISSUE, "proposed", "https://github.com/owner/repo");
63
+ return capture(0, stableJson({ folder, vbrief }));
64
+ },
65
+ },
66
+ {
67
+ name: "issue-ingest-cross-refs",
68
+ runPython(deftRoot) {
69
+ return runPythonScript(deftRoot, `${loadModule("issue_ingest", "scripts/issue_ingest.py")}
70
+ body = "Closes #10\\nRefs #11\\nBlocked by #12"
71
+ refs = mod._extract_cross_refs(body, "https://github.com/o/r", exclude={10})
72
+ print(json.dumps(refs, ensure_ascii=False, sort_keys=True))
73
+ sys.exit(0)`);
74
+ },
75
+ runTs() {
76
+ const refs = extractCrossRefs("Closes #10\nRefs #11\nBlocked by #12", "https://github.com/o/r", new Set([10]));
77
+ return capture(0, stableJson(refs));
78
+ },
79
+ },
80
+ {
81
+ name: "issue-emit-render-body",
82
+ runPython(deftRoot) {
83
+ return runPythonScript(deftRoot, `${loadModule("issue_emit", "scripts/issue_emit.py")}
84
+ data = ${JSON.stringify(SAMPLE_VBRIEF)}
85
+ print(mod.render_issue_body(data), end="")
86
+ sys.exit(0)`);
87
+ },
88
+ runTs() {
89
+ return capture(0, renderIssueBody(SAMPLE_VBRIEF));
90
+ },
91
+ },
92
+ {
93
+ name: "reconcile-classify",
94
+ runPython(deftRoot) {
95
+ return runPythonScript(deftRoot, `${loadModule("reconcile_issues", "scripts/reconcile_issues.py")}
96
+ report = mod.reconcile({1: ["proposed/a.vbrief.json"]}, {1: mod.IssueState("OPEN")})
97
+ print(json.dumps(report, ensure_ascii=False, sort_keys=True))
98
+ sys.exit(0)`);
99
+ },
100
+ runTs() {
101
+ const report = reconcile(new Map([[1, ["proposed/a.vbrief.json"]]]), new Map([[1, new IssueState("OPEN")]]));
102
+ return capture(0, stableJson(report));
103
+ },
104
+ },
105
+ {
106
+ name: "candidates-validate-reject",
107
+ runPython(deftRoot) {
108
+ return runPythonScript(deftRoot, `${loadModule("candidates_log", "scripts/candidates_log.py")}
109
+ try:
110
+ mod._validate_entry({"decision": "accept"})
111
+ except mod.CandidatesLogError as exc:
112
+ print(str(exc))
113
+ sys.exit(1)
114
+ sys.exit(0)`);
115
+ },
116
+ runTs() {
117
+ try {
118
+ validateCandidatesEntry({ decision: "accept" });
119
+ return capture(0, "");
120
+ }
121
+ catch (exc) {
122
+ if (exc instanceof CandidatesLogError) {
123
+ return capture(1, `${exc.message}\n`);
124
+ }
125
+ throw exc;
126
+ }
127
+ },
128
+ },
129
+ {
130
+ name: "github-auth-invalid-mode",
131
+ runPython(deftRoot) {
132
+ return runPythonScript(deftRoot, `${loadModule("github_auth_modes", "scripts/github_auth_modes.py")}
133
+ result = mod.validate_github_auth("bogus", environ={})
134
+ print(json.dumps(result.to_dict(), ensure_ascii=False, sort_keys=True))
135
+ sys.exit(0)`);
136
+ },
137
+ runTs() {
138
+ const result = validateGithubAuth("bogus", { environ: {} });
139
+ return capture(0, stableJson(resultToDict(result)));
140
+ },
141
+ },
142
+ ];
143
+ function resolveDeftRoot() {
144
+ if (process.env.DEFT_ROOT) {
145
+ return resolve(process.env.DEFT_ROOT);
146
+ }
147
+ return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
148
+ }
149
+ export function diffCase(python, ts, name) {
150
+ return {
151
+ name,
152
+ exitMismatch: python.exitCode !== ts.exitCode,
153
+ stdoutMismatch: python.stdout !== ts.stdout,
154
+ stderrMismatch: python.stderr !== ts.stderr,
155
+ pythonExit: python.exitCode,
156
+ tsExit: ts.exitCode,
157
+ };
158
+ }
159
+ export function runParity(deftRoot = resolveDeftRoot()) {
160
+ const diffs = [];
161
+ for (const testCase of PARITY_CASES) {
162
+ diffs.push(diffCase(testCase.runPython(deftRoot), testCase.runTs(deftRoot), testCase.name));
163
+ }
164
+ return {
165
+ ok: diffs.every((d) => !d.exitMismatch && !d.stdoutMismatch && !d.stderrMismatch),
166
+ diffs,
167
+ };
168
+ }
169
+ export function renderReport(result) {
170
+ if (result.ok) {
171
+ return `intake parity: CLEAN -- Python and TS agree on ${PARITY_CASES.length} case(s).`;
172
+ }
173
+ const lines = ["intake parity: DIVERGENCE"];
174
+ for (const d of result.diffs) {
175
+ if (d.exitMismatch || d.stdoutMismatch || d.stderrMismatch) {
176
+ lines.push(` case: ${d.name}`);
177
+ if (d.exitMismatch)
178
+ lines.push(` exit: python=${d.pythonExit} ts=${d.tsExit}`);
179
+ if (d.stdoutMismatch)
180
+ lines.push(" stdout mismatch");
181
+ if (d.stderrMismatch)
182
+ lines.push(" stderr mismatch");
183
+ }
184
+ }
185
+ return lines.join("\n");
186
+ }
187
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
188
+ try {
189
+ const result = runParity();
190
+ if (result.ok) {
191
+ process.stdout.write(`${renderReport(result)}\n`);
192
+ process.exit(0);
193
+ }
194
+ process.stderr.write(`${renderReport(result)}\n`);
195
+ process.exit(1);
196
+ }
197
+ catch (err) {
198
+ process.stderr.write(`intake parity: harness error -- ${String(err)}\n`);
199
+ process.exit(2);
200
+ }
201
+ }
202
+ export { PARITY_SCENARIO_NAMES };
203
+ //# sourceMappingURL=intake-parity.js.map
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Wave 8.5 Bucket B coverage map: pytest CLI tests → TS vitest / existing-coverage (#1838 s3).
3
+ * Python tests remain in-tree until Wave 9 (#1731); entries tagged wave9-delete are dedup candidates.
4
+ */
5
+ export type CoverageDisposition = "existing-coverage" | "lifecycle-cli-dispatch" | "python-oracle";
6
+ export interface CoverageMapEntry {
7
+ readonly pythonTest: string;
8
+ readonly tsTarget: string;
9
+ readonly disposition: CoverageDisposition;
10
+ readonly wave9Delete: boolean;
11
+ readonly notes: string;
12
+ }
13
+ /** Canonical mapping for lifecycle CLI pytest files in scope of story 1838-s3. */
14
+ export declare const LIFECYCLE_CLI_COVERAGE_MAP: readonly CoverageMapEntry[];
15
+ export declare const LIFECYCLE_PYTHON_TEST_FILES: string[];
16
+ //# sourceMappingURL=coverage-map.d.ts.map
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Wave 8.5 Bucket B coverage map: pytest CLI tests → TS vitest / existing-coverage (#1838 s3).
3
+ * Python tests remain in-tree until Wave 9 (#1731); entries tagged wave9-delete are dedup candidates.
4
+ */
5
+ /** Canonical mapping for lifecycle CLI pytest files in scope of story 1838-s3. */
6
+ export const LIFECYCLE_CLI_COVERAGE_MAP = [
7
+ {
8
+ pythonTest: "tests/cli/test_vbrief_activate.py",
9
+ tsTarget: "packages/core/src/vbrief-activate/{activate,main,coverage-boost}.test.ts + lifecycle-cli/dispatch-vbrief.test.ts",
10
+ disposition: "lifecycle-cli-dispatch",
11
+ wave9Delete: true,
12
+ notes: "Module matrix in core; deft-ts vbrief-activate argv/exit in lifecycle-cli.",
13
+ },
14
+ {
15
+ pythonTest: "tests/cli/test_vbrief_fidelity_legacy.py",
16
+ tsTarget: "packages/core/src/vbrief-validation/fidelity.test.ts",
17
+ disposition: "existing-coverage",
18
+ wave9Delete: true,
19
+ notes: "Legacy fidelity normalization covered in TS vbrief-validation module.",
20
+ },
21
+ {
22
+ pythonTest: "tests/cli/test_vbrief_migrate_conformance.py",
23
+ tsTarget: "packages/core/src/vbrief-validate/main.test.ts (scanVbrief/conformance)",
24
+ disposition: "existing-coverage",
25
+ wave9Delete: true,
26
+ notes: "Conformance scan parity in vbrief-validate TS port.",
27
+ },
28
+ {
29
+ pythonTest: "tests/cli/test_vbrief_preflight_resolver.py",
30
+ tsTarget: "packages/cli/src/vbrief-preflight.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
31
+ disposition: "lifecycle-cli-dispatch",
32
+ wave9Delete: false,
33
+ notes: "Install-layout resolver still Python-only; TS preflight gate + dispatcher alias covered.",
34
+ },
35
+ {
36
+ pythonTest: "tests/cli/test_vbrief_reconcile_graph.py",
37
+ tsTarget: "packages/core/src/vbrief-reconcile/graph.test.ts",
38
+ disposition: "existing-coverage",
39
+ wave9Delete: true,
40
+ notes: "Dependency-graph promotion logic in TS vbrief-reconcile.",
41
+ },
42
+ {
43
+ pythonTest: "tests/cli/test_vbrief_reconcile_labels.py",
44
+ tsTarget: "packages/core/src/vbrief-reconcile/labels.test.ts",
45
+ disposition: "existing-coverage",
46
+ wave9Delete: true,
47
+ notes: "Label/status derivation covered in TS reconcile engine.",
48
+ },
49
+ {
50
+ pythonTest: "tests/cli/test_vbrief_reconcile_umbrellas.py",
51
+ tsTarget: "packages/core/src/vbrief-reconcile/umbrellas.test.ts",
52
+ disposition: "existing-coverage",
53
+ wave9Delete: true,
54
+ notes: "Umbrella current-shape render/parse in TS.",
55
+ },
56
+ {
57
+ pythonTest: "tests/cli/test_vbrief_reconciliation.py",
58
+ tsTarget: "packages/core/src/vbrief-reconcile/reconciliation.test.ts",
59
+ disposition: "existing-coverage",
60
+ wave9Delete: true,
61
+ notes: "Override reconciliation table covered in TS.",
62
+ },
63
+ {
64
+ pythonTest: "tests/cli/test_vbrief_routing.py",
65
+ tsTarget: "packages/core/src/vbrief-build/routing.test.ts",
66
+ disposition: "existing-coverage",
67
+ wave9Delete: true,
68
+ notes: "Status↔folder routing map in TS vbrief-build.",
69
+ },
70
+ {
71
+ pythonTest: "tests/cli/test_vbrief_validate.py",
72
+ tsTarget: "packages/core/src/vbrief-validate/main.test.ts",
73
+ disposition: "lifecycle-cli-dispatch",
74
+ wave9Delete: true,
75
+ notes: "validateAll matrix in core; deft-ts vbrief-validate argv in lifecycle-cli.",
76
+ },
77
+ {
78
+ pythonTest: "tests/cli/test_vbrief_validate_direct.py",
79
+ tsTarget: "packages/core/src/vbrief-validate/branches.test.ts",
80
+ disposition: "existing-coverage",
81
+ wave9Delete: true,
82
+ notes: "Direct validate orchestration branches in TS.",
83
+ },
84
+ {
85
+ pythonTest: "tests/cli/test_vbrief_validate_direct_orchestration.py",
86
+ tsTarget: "packages/core/src/vbrief-validate/branches.test.ts",
87
+ disposition: "existing-coverage",
88
+ wave9Delete: true,
89
+ notes: "Reference/orchestration warnings in TS validate-all.",
90
+ },
91
+ {
92
+ pythonTest: "tests/cli/test_vbrief_validate_issue_536.py",
93
+ tsTarget: "packages/core/src/vbrief-validate/branches.test.ts",
94
+ disposition: "existing-coverage",
95
+ wave9Delete: true,
96
+ notes: "x-vbrief/github-issue reference counting in TS.",
97
+ },
98
+ {
99
+ pythonTest: "tests/cli/test_vbrief_validation.py",
100
+ tsTarget: "packages/core/src/vbrief-validation/validation.test.ts",
101
+ disposition: "lifecycle-cli-dispatch",
102
+ wave9Delete: true,
103
+ notes: "Slug/title normalization in core; deft-ts vbrief-validation argv in lifecycle-cli.",
104
+ },
105
+ {
106
+ pythonTest: "tests/cli/test_scope_decompose.py",
107
+ tsTarget: "packages/core/src/scope/decomposed-refs.test.ts",
108
+ disposition: "python-oracle",
109
+ wave9Delete: false,
110
+ notes: "scope:decompose CLI still Python; unit helpers partially covered in decomposed-refs TS.",
111
+ },
112
+ {
113
+ pythonTest: "tests/cli/test_scope_decompose_unit.py",
114
+ tsTarget: "packages/core/src/scope/decomposed-refs.test.ts",
115
+ disposition: "existing-coverage",
116
+ wave9Delete: false,
117
+ notes: "Pure decomposition helpers; CLI entry remains Python until Wave 9.",
118
+ },
119
+ {
120
+ pythonTest: "tests/cli/test_scope_demote.py",
121
+ tsTarget: "packages/core/src/scope/demote.test.ts",
122
+ disposition: "lifecycle-cli-dispatch",
123
+ wave9Delete: true,
124
+ notes: "Demote transitions in core; deft-ts scope-lifecycle argv in lifecycle-cli.",
125
+ },
126
+ {
127
+ pythonTest: "tests/cli/test_scope_lifecycle.py",
128
+ tsTarget: "packages/core/src/scope/{main,transition,scope-exhaustive}.test.ts",
129
+ disposition: "lifecycle-cli-dispatch",
130
+ wave9Delete: true,
131
+ notes: "Promote/activate/complete matrix in core; scope-lifecycle dispatcher in lifecycle-cli.",
132
+ },
133
+ {
134
+ pythonTest: "tests/cli/test_scope_undo.py",
135
+ tsTarget: "packages/core/src/scope/undo.test.ts",
136
+ disposition: "existing-coverage",
137
+ wave9Delete: true,
138
+ notes: "Undo round-trip covered in TS scope module.",
139
+ },
140
+ {
141
+ pythonTest: "tests/cli/test_issue_emit.py",
142
+ tsTarget: "packages/core/src/intake/issue-emit.test.ts",
143
+ disposition: "lifecycle-cli-dispatch",
144
+ wave9Delete: true,
145
+ notes: "Emit body/render in core; deft-ts issue-emit argv in lifecycle-cli.",
146
+ },
147
+ {
148
+ pythonTest: "tests/cli/test_issue_ingest.py",
149
+ tsTarget: "packages/core/src/intake/{issue-ingest,intake-cli-and-branches}.test.ts + lifecycle-cli/dispatch-intake.test.ts",
150
+ disposition: "lifecycle-cli-dispatch",
151
+ wave9Delete: true,
152
+ notes: "Ingest happy-path/duplicate in core; dispatcher routing in lifecycle-cli.",
153
+ },
154
+ {
155
+ pythonTest: "tests/cli/test_issue_ingest_body_parsing.py",
156
+ tsTarget: "packages/core/src/intake/markdown-scanners.test.ts",
157
+ disposition: "existing-coverage",
158
+ wave9Delete: true,
159
+ notes: "Checkbox/AC body scanners in TS intake module.",
160
+ },
161
+ {
162
+ pythonTest: "tests/cli/test_issue_ingest_canonical_refs.py",
163
+ tsTarget: "packages/core/src/intake/issue-ingest.test.ts",
164
+ disposition: "existing-coverage",
165
+ wave9Delete: true,
166
+ notes: "v0.6 canonical reference shape in TS ingest.",
167
+ },
168
+ {
169
+ pythonTest: "tests/cli/test_issue_ingest_direct.py",
170
+ tsTarget: "packages/core/src/intake/intake-coverage-boost.test.ts",
171
+ disposition: "existing-coverage",
172
+ wave9Delete: true,
173
+ notes: "Repo URL / gh helper branches in TS intake.",
174
+ },
175
+ {
176
+ pythonTest: "tests/cli/test_issue_ingest_escape_corruption.py",
177
+ tsTarget: "packages/core/src/intake/intake-cli-and-branches.test.ts",
178
+ disposition: "existing-coverage",
179
+ wave9Delete: true,
180
+ notes: "Literal escape preservation in TS ingest path.",
181
+ },
182
+ {
183
+ pythonTest: "tests/cli/test_reconcile_issues.py",
184
+ tsTarget: "packages/core/src/intake/reconcile-issues.test.ts",
185
+ disposition: "lifecycle-cli-dispatch",
186
+ wave9Delete: true,
187
+ notes: "Reconcile classification in core; deft-ts reconcile-issues argv in lifecycle-cli.",
188
+ },
189
+ {
190
+ pythonTest: "tests/cli/test_reconcile_issues_754.py",
191
+ tsTarget: "packages/core/src/intake/reconcile-issues.test.ts",
192
+ disposition: "existing-coverage",
193
+ wave9Delete: true,
194
+ notes: "Batch gh state fetch (>500) in TS reconcile module.",
195
+ },
196
+ {
197
+ pythonTest: "tests/cli/test_reconcile_issues_apply.py",
198
+ tsTarget: "packages/core/src/intake/reconcile-issues.test.ts",
199
+ disposition: "existing-coverage",
200
+ wave9Delete: true,
201
+ notes: "Apply/move section-C entries in TS reconcile.",
202
+ },
203
+ {
204
+ pythonTest: "tests/cli/test_reconcile_issues_direct.py",
205
+ tsTarget: "packages/core/src/intake/intake-coverage-boost.test.ts",
206
+ disposition: "existing-coverage",
207
+ wave9Delete: true,
208
+ notes: "gh subprocess error branches in TS reconcile helpers.",
209
+ },
210
+ {
211
+ pythonTest: "tests/cli/test_preflight_architecture_sor.py",
212
+ tsTarget: "python-oracle (scripts/preflight_architecture_sor.py)",
213
+ disposition: "python-oracle",
214
+ wave9Delete: false,
215
+ notes: "Architecture SOR preflight not yet on deft-ts; stays Python until TS port.",
216
+ },
217
+ {
218
+ pythonTest: "tests/cli/test_preflight_branch.py",
219
+ tsTarget: "packages/core/src/branch/evaluate.test.ts + packages/cli/src/verify-branch.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
220
+ disposition: "lifecycle-cli-dispatch",
221
+ wave9Delete: true,
222
+ notes: "Branch gate in core/cli; verify-branch + vbrief:preflight alias via dispatcher.",
223
+ },
224
+ {
225
+ pythonTest: "tests/cli/test_preflight_cache.py",
226
+ tsTarget: "python-oracle (scripts/preflight_cache.py)",
227
+ disposition: "python-oracle",
228
+ wave9Delete: false,
229
+ notes: "verify:cache-fresh still Python-only per Wave 8 notes; TS cache module covers fetch not preflight gate.",
230
+ },
231
+ {
232
+ pythonTest: "tests/cli/test_preflight_gh.py",
233
+ tsTarget: "python-oracle (scripts/preflight_gh.py)",
234
+ disposition: "python-oracle",
235
+ wave9Delete: false,
236
+ notes: "Destructive gh preflight still Python-only; intake github-auth-modes partially overlaps read paths.",
237
+ },
238
+ {
239
+ pythonTest: "tests/cli/test_preflight_implementation.py",
240
+ tsTarget: "packages/core/src/preflight/evaluate.test.ts + packages/cli/src/vbrief-preflight.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
241
+ disposition: "lifecycle-cli-dispatch",
242
+ wave9Delete: true,
243
+ notes: "#810 state matrix in core; vbrief:preflight / vbrief-preflight dispatcher in lifecycle-cli.",
244
+ },
245
+ {
246
+ pythonTest: "tests/cli/test_preflight_story_start.py",
247
+ tsTarget: "packages/core/src/story-ready/evaluate.test.ts + packages/cli/src/verify-story-ready.test.ts + lifecycle-cli/dispatch-preflight.test.ts",
248
+ disposition: "lifecycle-cli-dispatch",
249
+ wave9Delete: true,
250
+ notes: "Gate 0 matrix in core; verify:story-ready alias via deft-ts dispatcher.",
251
+ },
252
+ ];
253
+ export const LIFECYCLE_PYTHON_TEST_FILES = LIFECYCLE_CLI_COVERAGE_MAP.map((e) => e.pythonTest);
254
+ //# sourceMappingURL=coverage-map.js.map
@@ -0,0 +1,8 @@
1
+ export interface CapturedDispatch {
2
+ readonly exitCode: number;
3
+ readonly stdout: string;
4
+ readonly stderr: string;
5
+ }
6
+ /** Invoke the unified deft-ts dispatcher with captured stdout/stderr. */
7
+ export declare function runDispatch(argv: readonly string[]): Promise<CapturedDispatch>;
8
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared helpers for lifecycle CLI retarget specs (#1838 s3).
3
+ */
4
+ import { dispatch } from "../dispatch.js";
5
+ /** Invoke the unified deft-ts dispatcher with captured stdout/stderr. */
6
+ export async function runDispatch(argv) {
7
+ const out = [];
8
+ const err = [];
9
+ const io = {
10
+ writeOut: (text) => {
11
+ out.push(text);
12
+ },
13
+ writeErr: (text) => {
14
+ err.push(text);
15
+ },
16
+ };
17
+ const exitCode = await dispatch([...argv], io);
18
+ return { exitCode, stdout: out.join(""), stderr: err.join("") };
19
+ }
20
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1,30 @@
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 ParityCase {
8
+ readonly name: string;
9
+ readonly runPython: (deftRoot: string, repo: string) => CommandCapture;
10
+ readonly runTs: (deftRoot: string, repo: string) => CommandCapture;
11
+ readonly setup?: (deftRoot: string, repo: string) => void;
12
+ }
13
+ export interface ParityDiff {
14
+ readonly caseName: string;
15
+ readonly exitMismatch: boolean;
16
+ readonly stdoutMismatch: boolean;
17
+ readonly stderrMismatch: boolean;
18
+ readonly pythonExit: number;
19
+ readonly tsExit: number;
20
+ }
21
+ export interface ParityResult {
22
+ readonly ok: boolean;
23
+ readonly diffs: ParityDiff[];
24
+ }
25
+ export declare const PARITY_CASES: readonly ParityCase[];
26
+ export declare function normalizeOutput(text: string): string;
27
+ export declare function diffCase(python: CommandCapture, ts: CommandCapture, caseName: string): ParityDiff;
28
+ export declare function runParity(): ParityResult;
29
+ export declare function renderReport(result: ParityResult): string;
30
+ //# sourceMappingURL=lifecycle-packs-parity.d.ts.map