@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.
- package/dist/bin.d.ts +3 -0
- package/dist/bin.js +5 -0
- package/dist/branch-parity.d.ts +47 -0
- package/dist/branch-parity.js +263 -0
- package/dist/cache-parity.d.ts +36 -0
- package/dist/cache-parity.js +165 -0
- package/dist/cache.d.ts +4 -0
- package/dist/cache.js +10 -0
- package/dist/capacity-backfill.d.ts +3 -0
- package/dist/capacity-backfill.js +9 -0
- package/dist/capacity-show.d.ts +3 -0
- package/dist/capacity-show.js +9 -0
- package/dist/check.d.ts +10 -0
- package/dist/check.js +60 -0
- package/dist/cli-router/index.d.ts +8 -0
- package/dist/cli-router/index.js +37 -0
- package/dist/cli-router/route-argv.d.ts +32 -0
- package/dist/cli-router/route-argv.js +226 -0
- package/dist/codebase-default-extractor.d.ts +3 -0
- package/dist/codebase-default-extractor.js +9 -0
- package/dist/codebase-map-fresh.d.ts +3 -0
- package/dist/codebase-map-fresh.js +9 -0
- package/dist/codebase-map.d.ts +3 -0
- package/dist/codebase-map.js +9 -0
- package/dist/codebase-parity.d.ts +30 -0
- package/dist/codebase-parity.js +294 -0
- package/dist/codebase-projection-registry.d.ts +3 -0
- package/dist/codebase-projection-registry.js +9 -0
- package/dist/codebase-provider.d.ts +3 -0
- package/dist/codebase-provider.js +9 -0
- package/dist/content-validate-cli/validate-links.d.ts +11 -0
- package/dist/content-validate-cli/validate-links.js +37 -0
- package/dist/content-validate-cli/validate-strategy-output.d.ts +13 -0
- package/dist/content-validate-cli/validate-strategy-output.js +56 -0
- package/dist/content-validate-cli/verify-capacity.d.ts +12 -0
- package/dist/content-validate-cli/verify-capacity.js +54 -0
- package/dist/dispatch.d.ts +26 -0
- package/dist/dispatch.js +569 -0
- package/dist/doctor-parity.d.ts +38 -0
- package/dist/doctor-parity.js +151 -0
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +10 -0
- package/dist/gates-cli/_helpers.d.ts +18 -0
- package/dist/gates-cli/_helpers.js +71 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +15 -0
- package/dist/init-cli/constants.d.ts +5 -0
- package/dist/init-cli/constants.js +5 -0
- package/dist/init-cli/init.d.ts +3 -0
- package/dist/init-cli/init.js +11 -0
- package/dist/init-cli/resolve-binary.d.ts +34 -0
- package/dist/init-cli/resolve-binary.js +78 -0
- package/dist/init-cli/run-deft-install.d.ts +23 -0
- package/dist/init-cli/run-deft-install.js +71 -0
- package/dist/init-cli/update.d.ts +3 -0
- package/dist/init-cli/update.js +11 -0
- package/dist/install-cli/coverage-map.d.ts +14 -0
- package/dist/install-cli/coverage-map.js +111 -0
- package/dist/intake-parity.d.ts +30 -0
- package/dist/intake-parity.js +203 -0
- package/dist/lifecycle-cli/coverage-map.d.ts +16 -0
- package/dist/lifecycle-cli/coverage-map.js +254 -0
- package/dist/lifecycle-cli/helpers.d.ts +8 -0
- package/dist/lifecycle-cli/helpers.js +20 -0
- package/dist/lifecycle-packs-parity.d.ts +30 -0
- package/dist/lifecycle-packs-parity.js +377 -0
- package/dist/orchestration-cli/coverage-map.d.ts +21 -0
- package/dist/orchestration-cli/coverage-map.js +225 -0
- package/dist/orchestration-cli/helpers.d.ts +11 -0
- package/dist/orchestration-cli/helpers.js +35 -0
- package/dist/orchestration-parity.d.ts +38 -0
- package/dist/orchestration-parity.js +364 -0
- package/dist/parity.d.ts +36 -0
- package/dist/parity.js +176 -0
- package/dist/platform-parity.d.ts +26 -0
- package/dist/platform-parity.js +309 -0
- package/dist/policy-parity.d.ts +35 -0
- package/dist/policy-parity.js +214 -0
- package/dist/policy.d.ts +27 -0
- package/dist/policy.js +316 -0
- package/dist/pr-closing-keywords-parity.d.ts +45 -0
- package/dist/pr-closing-keywords-parity.js +259 -0
- package/dist/pr-closing-keywords.d.ts +3 -0
- package/dist/pr-closing-keywords.js +10 -0
- package/dist/pr-merge-readiness-parity.d.ts +44 -0
- package/dist/pr-merge-readiness-parity.js +296 -0
- package/dist/pr-merge-readiness.d.ts +3 -0
- package/dist/pr-merge-readiness.js +10 -0
- package/dist/pr-monitor-parity.d.ts +44 -0
- package/dist/pr-monitor-parity.js +283 -0
- package/dist/pr-monitor.d.ts +3 -0
- package/dist/pr-monitor.js +10 -0
- package/dist/pr-protected-issues-parity.d.ts +41 -0
- package/dist/pr-protected-issues-parity.js +220 -0
- package/dist/pr-protected-issues.d.ts +3 -0
- package/dist/pr-protected-issues.js +10 -0
- package/dist/pr-wait-mergeable-parity.d.ts +45 -0
- package/dist/pr-wait-mergeable-parity.js +340 -0
- package/dist/pr-wait-mergeable.d.ts +3 -0
- package/dist/pr-wait-mergeable.js +10 -0
- package/dist/preflight-cache.d.ts +16 -0
- package/dist/preflight-cache.js +106 -0
- package/dist/preflight-gh.d.ts +12 -0
- package/dist/preflight-gh.js +188 -0
- package/dist/probe-session.d.ts +3 -0
- package/dist/probe-session.js +10 -0
- package/dist/release-e2e-parity.d.ts +31 -0
- package/dist/release-e2e-parity.js +114 -0
- package/dist/release-e2e.d.ts +3 -0
- package/dist/release-e2e.js +10 -0
- package/dist/release-parity.d.ts +40 -0
- package/dist/release-parity.js +223 -0
- package/dist/release-publish-parity.d.ts +36 -0
- package/dist/release-publish-parity.js +138 -0
- package/dist/release-publish.d.ts +3 -0
- package/dist/release-publish.js +10 -0
- package/dist/release-rollback-parity.d.ts +37 -0
- package/dist/release-rollback-parity.js +161 -0
- package/dist/release-rollback.d.ts +3 -0
- package/dist/release-rollback.js +10 -0
- package/dist/release.d.ts +3 -0
- package/dist/release.js +10 -0
- package/dist/render-cli/deft-ts-runner.d.ts +20 -0
- package/dist/render-cli/deft-ts-runner.js +35 -0
- package/dist/render-cli/prd-render-cli.d.ts +2 -0
- package/dist/render-cli/prd-render-cli.js +7 -0
- package/dist/render-cli/project-render-cli.d.ts +2 -0
- package/dist/render-cli/project-render-cli.js +6 -0
- package/dist/render-cli/spec-render-cli.d.ts +2 -0
- package/dist/render-cli/spec-render-cli.js +6 -0
- package/dist/render-cli/spec-validate-cli.d.ts +2 -0
- package/dist/render-cli/spec-validate-cli.js +6 -0
- package/dist/render-parity.d.ts +35 -0
- package/dist/render-parity.js +383 -0
- package/dist/scm-parity.d.ts +39 -0
- package/dist/scm-parity.js +181 -0
- package/dist/scope-lifecycle-parity.d.ts +35 -0
- package/dist/scope-lifecycle-parity.js +177 -0
- package/dist/scope-lifecycle.d.ts +4 -0
- package/dist/scope-lifecycle.js +29 -0
- package/dist/session-parity.d.ts +39 -0
- package/dist/session-parity.js +260 -0
- package/dist/slice-parity.d.ts +36 -0
- package/dist/slice-parity.js +304 -0
- package/dist/slice.d.ts +4 -0
- package/dist/slice.js +29 -0
- package/dist/story-ready-parity.d.ts +49 -0
- package/dist/story-ready-parity.js +254 -0
- package/dist/subagent-monitor.d.ts +3 -0
- package/dist/subagent-monitor.js +10 -0
- package/dist/swarm-parity.d.ts +28 -0
- package/dist/swarm-parity.js +326 -0
- package/dist/toolchain-check.d.ts +3 -0
- package/dist/toolchain-check.js +14 -0
- package/dist/triage-actions-parity.d.ts +33 -0
- package/dist/triage-actions-parity.js +201 -0
- package/dist/triage-actions.d.ts +17 -0
- package/dist/triage-actions.js +144 -0
- package/dist/triage-aux-a-parity.d.ts +35 -0
- package/dist/triage-aux-a-parity.js +172 -0
- package/dist/triage-aux-b-parity.d.ts +32 -0
- package/dist/triage-aux-b-parity.js +308 -0
- package/dist/triage-bootstrap-parity.d.ts +44 -0
- package/dist/triage-bootstrap-parity.js +226 -0
- package/dist/triage-bootstrap.d.ts +24 -0
- package/dist/triage-bootstrap.js +172 -0
- package/dist/triage-bulk.d.ts +17 -0
- package/dist/triage-bulk.js +154 -0
- package/dist/triage-classify-parity.d.ts +40 -0
- package/dist/triage-classify-parity.js +227 -0
- package/dist/triage-classify.d.ts +13 -0
- package/dist/triage-classify.js +76 -0
- package/dist/triage-help.d.ts +3 -0
- package/dist/triage-help.js +10 -0
- package/dist/triage-queue-parity.d.ts +59 -0
- package/dist/triage-queue-parity.js +363 -0
- package/dist/triage-queue.d.ts +17 -0
- package/dist/triage-queue.js +174 -0
- package/dist/triage-reconcile.d.ts +11 -0
- package/dist/triage-reconcile.js +76 -0
- package/dist/triage-refresh.d.ts +7 -0
- package/dist/triage-refresh.js +37 -0
- package/dist/triage-scope-drift.d.ts +12 -0
- package/dist/triage-scope-drift.js +117 -0
- package/dist/triage-scope-parity.d.ts +34 -0
- package/dist/triage-scope-parity.js +218 -0
- package/dist/triage-scope.d.ts +4 -0
- package/dist/triage-scope.js +29 -0
- package/dist/triage-smoketest.d.ts +3 -0
- package/dist/triage-smoketest.js +43 -0
- package/dist/triage-subscribe.d.ts +15 -0
- package/dist/triage-subscribe.js +157 -0
- package/dist/triage-summary-parity.d.ts +50 -0
- package/dist/triage-summary-parity.js +306 -0
- package/dist/triage-summary.d.ts +14 -0
- package/dist/triage-summary.js +77 -0
- package/dist/triage-welcome.d.ts +12 -0
- package/dist/triage-welcome.js +78 -0
- package/dist/ts-check-lane.d.ts +9 -0
- package/dist/ts-check-lane.js +49 -0
- package/dist/validate-content-parity.d.ts +33 -0
- package/dist/validate-content-parity.js +356 -0
- package/dist/vbrief-activate-parity.d.ts +39 -0
- package/dist/vbrief-activate-parity.js +216 -0
- package/dist/vbrief-activate.d.ts +3 -0
- package/dist/vbrief-activate.js +7 -0
- package/dist/vbrief-build-parity.d.ts +28 -0
- package/dist/vbrief-build-parity.js +399 -0
- package/dist/vbrief-build.d.ts +3 -0
- package/dist/vbrief-build.js +8 -0
- package/dist/vbrief-preflight-parity.d.ts +34 -0
- package/dist/vbrief-preflight-parity.js +163 -0
- package/dist/vbrief-preflight.d.ts +12 -0
- package/dist/vbrief-preflight.js +58 -0
- package/dist/vbrief-reconcile-parity.d.ts +22 -0
- package/dist/vbrief-reconcile-parity.js +600 -0
- package/dist/vbrief-reconcile.d.ts +3 -0
- package/dist/vbrief-reconcile.js +7 -0
- package/dist/vbrief-validate-parity.d.ts +27 -0
- package/dist/vbrief-validate-parity.js +122 -0
- package/dist/vbrief-validate.d.ts +3 -0
- package/dist/vbrief-validate.js +8 -0
- package/dist/vbrief-validation-parity.d.ts +28 -0
- package/dist/vbrief-validation-parity.js +645 -0
- package/dist/vbrief-validation.d.ts +3 -0
- package/dist/vbrief-validation.js +8 -0
- package/dist/verify-branch.d.ts +14 -0
- package/dist/verify-branch.js +81 -0
- package/dist/verify-encoding.d.ts +15 -0
- package/dist/verify-encoding.js +86 -0
- package/dist/verify-env-parity.d.ts +28 -0
- package/dist/verify-env-parity.js +272 -0
- package/dist/verify-hooks-installed.d.ts +10 -0
- package/dist/verify-hooks-installed.js +48 -0
- package/dist/verify-investigation.d.ts +3 -0
- package/dist/verify-investigation.js +10 -0
- package/dist/verify-judgment-gates.d.ts +3 -0
- package/dist/verify-judgment-gates.js +10 -0
- package/dist/verify-no-task-runtime.d.ts +3 -0
- package/dist/verify-no-task-runtime.js +16 -0
- package/dist/verify-session-ritual.d.ts +13 -0
- package/dist/verify-session-ritual.js +78 -0
- package/dist/verify-source-cli/rule-ownership-lint.d.ts +12 -0
- package/dist/verify-source-cli/rule-ownership-lint.js +61 -0
- package/dist/verify-source-cli/verify-content-manifest.d.ts +12 -0
- package/dist/verify-source-cli/verify-content-manifest.js +61 -0
- package/dist/verify-source-cli/verify-scm-boundary.d.ts +13 -0
- package/dist/verify-source-cli/verify-scm-boundary.js +66 -0
- package/dist/verify-source-cli/verify-stubs.d.ts +11 -0
- package/dist/verify-source-cli/verify-stubs.js +27 -0
- package/dist/verify-source-parity.d.ts +26 -0
- package/dist/verify-source-parity.js +178 -0
- package/dist/verify-story-ready.d.ts +16 -0
- package/dist/verify-story-ready.js +138 -0
- package/dist/verify-tools.d.ts +13 -0
- package/dist/verify-tools.js +67 -0
- package/dist/verify-wip-cap.d.ts +13 -0
- package/dist/verify-wip-cap.js +62 -0
- package/dist/wip-cap-parity.d.ts +39 -0
- package/dist/wip-cap-parity.js +209 -0
- package/package.json +50 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Golden-output parity harness (#1728): runs BOTH the Python oracle
|
|
4
|
+
* (`scripts/doctor.py`) and the ported TS doctor CLI with identical argv,
|
|
5
|
+
* then diffs exit codes and stdout. Exit 0 only on byte-identical results.
|
|
6
|
+
*
|
|
7
|
+
* Exit codes: 0 parity / 1 divergence / 2 harness setup error.
|
|
8
|
+
*/
|
|
9
|
+
import { spawnSync } from "node:child_process";
|
|
10
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
export const PARITY_SCENARIOS = [
|
|
15
|
+
{ name: "full-json-deft-root", argv: ["--full", "--json"] },
|
|
16
|
+
{ name: "full-quiet-deft-root", argv: ["--full", "--quiet"] },
|
|
17
|
+
{ name: "unknown-flag", argv: ["--not-a-real-flag"] },
|
|
18
|
+
{
|
|
19
|
+
name: "full-json-consumer-fixture",
|
|
20
|
+
argv: ["--full", "--json"],
|
|
21
|
+
setup(root) {
|
|
22
|
+
writeFileSync(join(root, "AGENTS.md"), "<!-- deft:managed-section v3 -->\nbody\n<!-- /deft:managed-section -->\n", "utf8");
|
|
23
|
+
mkdirSync(join(root, ".deft", "core"), { recursive: true });
|
|
24
|
+
writeFileSync(join(root, ".deft", "core", "VERSION"), "tag: v0.1.0\nsha: abcdef0123456789abcdef0123456789abcdef01\nref: v0.1.0\n", "utf8");
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
function runCapture(cmd, args, cwd, env = {}) {
|
|
29
|
+
const merged = {
|
|
30
|
+
...process.env,
|
|
31
|
+
...env,
|
|
32
|
+
DEFT_CACHE_DISABLE: "1",
|
|
33
|
+
};
|
|
34
|
+
for (const key of Object.keys(merged)) {
|
|
35
|
+
if (merged[key] === undefined)
|
|
36
|
+
delete merged[key];
|
|
37
|
+
}
|
|
38
|
+
const result = spawnSync(cmd, args, {
|
|
39
|
+
cwd,
|
|
40
|
+
encoding: "utf8",
|
|
41
|
+
env: merged,
|
|
42
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
status: result.status ?? 2,
|
|
46
|
+
stdout: typeof result.stdout === "string" ? result.stdout : "",
|
|
47
|
+
stderr: typeof result.stderr === "string" ? result.stderr : "",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function resolveDeftRoot() {
|
|
51
|
+
if (process.env.DEFT_ROOT !== undefined && process.env.DEFT_ROOT.length > 0) {
|
|
52
|
+
return resolve(process.env.DEFT_ROOT);
|
|
53
|
+
}
|
|
54
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
55
|
+
}
|
|
56
|
+
/** Normalise volatile lines while preserving doctor semantics. */
|
|
57
|
+
export function normaliseStdout(text) {
|
|
58
|
+
return text
|
|
59
|
+
.split("\n")
|
|
60
|
+
.filter((line) => !line.startsWith("Using CPython") &&
|
|
61
|
+
!line.startsWith("Creating virtual environment") &&
|
|
62
|
+
!line.startsWith("Installed "))
|
|
63
|
+
.join("\n");
|
|
64
|
+
}
|
|
65
|
+
function runScenario(deftRoot, scenario) {
|
|
66
|
+
let cwd = scenario.cwd ?? deftRoot;
|
|
67
|
+
let tempRoot;
|
|
68
|
+
const argv = [...scenario.argv];
|
|
69
|
+
if (scenario.setup) {
|
|
70
|
+
tempRoot = mkdtempSync(join(tmpdir(), "deft-doctor-parity-"));
|
|
71
|
+
scenario.setup(tempRoot);
|
|
72
|
+
cwd = tempRoot;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const pyArgs = ["run", "python", join(deftRoot, "scripts", "doctor.py"), ...argv];
|
|
76
|
+
const tsArgs = [join(deftRoot, "packages", "cli", "dist", "doctor.js"), ...argv];
|
|
77
|
+
const env = { ...scenario.env, PYTHONUTF8: "1" };
|
|
78
|
+
const py = runCapture("uv", pyArgs, cwd, env);
|
|
79
|
+
const ts = runCapture("node", tsArgs, cwd, env);
|
|
80
|
+
return {
|
|
81
|
+
python: { name: scenario.name, exitCode: py.status, stdout: py.stdout, stderr: py.stderr },
|
|
82
|
+
ts: { name: scenario.name, exitCode: ts.status, stdout: ts.stdout, stderr: ts.stderr },
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
if (tempRoot) {
|
|
87
|
+
rmSync(tempRoot, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function diffParity(python, ts) {
|
|
92
|
+
const pythonStdout = normaliseStdout(python.stdout);
|
|
93
|
+
const tsStdout = normaliseStdout(ts.stdout);
|
|
94
|
+
return {
|
|
95
|
+
exitMismatch: python.exitCode !== ts.exitCode,
|
|
96
|
+
stdoutMismatch: pythonStdout !== tsStdout,
|
|
97
|
+
pythonStdout,
|
|
98
|
+
tsStdout,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function runParity() {
|
|
102
|
+
const deftRoot = resolveDeftRoot();
|
|
103
|
+
const scenarios = [];
|
|
104
|
+
for (const scenario of PARITY_SCENARIOS) {
|
|
105
|
+
const ran = runScenario(deftRoot, scenario);
|
|
106
|
+
scenarios.push({
|
|
107
|
+
name: scenario.name,
|
|
108
|
+
pythonExit: ran.python.exitCode,
|
|
109
|
+
tsExit: ran.ts.exitCode,
|
|
110
|
+
...diffParity(ran.python, ran.ts),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const ok = scenarios.every((s) => !s.exitMismatch && !s.stdoutMismatch);
|
|
114
|
+
return { ok, scenarios };
|
|
115
|
+
}
|
|
116
|
+
export function renderReport(result) {
|
|
117
|
+
if (result.ok) {
|
|
118
|
+
return `doctor parity: CLEAN -- Python and TS agree on ${result.scenarios.length} scenario(s).`;
|
|
119
|
+
}
|
|
120
|
+
const lines = ["doctor parity: DIVERGENCE"];
|
|
121
|
+
for (const s of result.scenarios) {
|
|
122
|
+
if (s.exitMismatch || s.stdoutMismatch) {
|
|
123
|
+
lines.push(` scenario: ${s.name}`);
|
|
124
|
+
if (s.exitMismatch) {
|
|
125
|
+
lines.push(` exit mismatch: python=${s.pythonExit} ts=${s.tsExit}`);
|
|
126
|
+
}
|
|
127
|
+
if (s.stdoutMismatch) {
|
|
128
|
+
lines.push(` python stdout (${s.pythonStdout.length} bytes)`);
|
|
129
|
+
lines.push(` ts stdout (${s.tsStdout.length} bytes)`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return lines.join("\n");
|
|
134
|
+
}
|
|
135
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
136
|
+
try {
|
|
137
|
+
const result = runParity();
|
|
138
|
+
if (result.ok) {
|
|
139
|
+
process.stdout.write(`${renderReport(result)}\n`);
|
|
140
|
+
process.exit(0);
|
|
141
|
+
}
|
|
142
|
+
process.stderr.write(`${renderReport(result)}\n`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
const msg = String(err).replace(/\r?\n/g, " ");
|
|
147
|
+
process.stderr.write(`doctor parity: harness error -- ${msg}\n`);
|
|
148
|
+
process.exit(2);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=doctor-parity.js.map
|
package/dist/doctor.d.ts
ADDED
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { cmdDoctor } from "../../core/dist/doctor/main.js";
|
|
4
|
+
export function run(argv) {
|
|
5
|
+
return cmdDoctor(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=doctor.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface DeftTsResult {
|
|
2
|
+
readonly exitCode: number;
|
|
3
|
+
readonly stdout: string;
|
|
4
|
+
readonly stderr: string;
|
|
5
|
+
}
|
|
6
|
+
/** Repo root (deft framework checkout). */
|
|
7
|
+
export declare function repoRoot(): string;
|
|
8
|
+
/** Built `deft-ts` dispatcher binary. */
|
|
9
|
+
export declare function binPath(): string;
|
|
10
|
+
/** Invoke `node packages/cli/dist/bin.js <verb> [...args]`. Pass an empty verb for `--help`. */
|
|
11
|
+
export declare function runDeftTs(verb: string, args?: readonly string[], opts?: {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
env?: NodeJS.ProcessEnv;
|
|
14
|
+
}): DeftTsResult;
|
|
15
|
+
export declare function initGitRepo(root: string): string;
|
|
16
|
+
export declare function writeProjectDef(root: string, policy?: Record<string, unknown>): void;
|
|
17
|
+
export declare function seedProject(policy?: Record<string, unknown>): string;
|
|
18
|
+
//# sourceMappingURL=_helpers.d.ts.map
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
const gatesDir = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
/** Repo root (deft framework checkout). */
|
|
8
|
+
export function repoRoot() {
|
|
9
|
+
return resolve(gatesDir, "..", "..", "..", "..");
|
|
10
|
+
}
|
|
11
|
+
/** Built `deft-ts` dispatcher binary. */
|
|
12
|
+
export function binPath() {
|
|
13
|
+
return join(repoRoot(), "packages/cli/dist/bin.js");
|
|
14
|
+
}
|
|
15
|
+
/** Invoke `node packages/cli/dist/bin.js <verb> [...args]`. Pass an empty verb for `--help`. */
|
|
16
|
+
export function runDeftTs(verb, args = [], opts = {}) {
|
|
17
|
+
const root = repoRoot();
|
|
18
|
+
const argv = verb.length > 0 ? [binPath(), verb, ...args] : [binPath(), ...args];
|
|
19
|
+
const res = spawnSync(process.execPath, argv, {
|
|
20
|
+
cwd: opts.cwd ?? root,
|
|
21
|
+
env: {
|
|
22
|
+
...process.env,
|
|
23
|
+
DEFT_ROOT: root,
|
|
24
|
+
DEFT_CACHE_DISABLE: "1",
|
|
25
|
+
PYTHONUTF8: "1",
|
|
26
|
+
...opts.env,
|
|
27
|
+
},
|
|
28
|
+
encoding: "utf8",
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
exitCode: res.status ?? 1,
|
|
32
|
+
stdout: res.stdout ?? "",
|
|
33
|
+
stderr: res.stderr ?? "",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function initGitRepo(root) {
|
|
37
|
+
writeFileSync(join(root, "README.md"), "fixture\n", "utf8");
|
|
38
|
+
execFileSync("git", ["init", "-q"], { cwd: root, encoding: "utf8" });
|
|
39
|
+
execFileSync("git", ["config", "user.email", "gates-cli@test.local"], {
|
|
40
|
+
cwd: root,
|
|
41
|
+
encoding: "utf8",
|
|
42
|
+
});
|
|
43
|
+
execFileSync("git", ["config", "user.name", "gates-cli"], { cwd: root, encoding: "utf8" });
|
|
44
|
+
execFileSync("git", ["add", "-A"], { cwd: root, encoding: "utf8" });
|
|
45
|
+
execFileSync("git", ["commit", "-q", "-m", "init"], {
|
|
46
|
+
cwd: root,
|
|
47
|
+
encoding: "utf8",
|
|
48
|
+
env: {
|
|
49
|
+
...process.env,
|
|
50
|
+
GIT_AUTHOR_NAME: "gates-cli",
|
|
51
|
+
GIT_AUTHOR_EMAIL: "gates-cli@test.local",
|
|
52
|
+
GIT_COMMITTER_NAME: "gates-cli",
|
|
53
|
+
GIT_COMMITTER_EMAIL: "gates-cli@test.local",
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return execFileSync("git", ["rev-parse", "HEAD"], { cwd: root, encoding: "utf8" }).trim();
|
|
57
|
+
}
|
|
58
|
+
export function writeProjectDef(root, policy = {}) {
|
|
59
|
+
mkdirSync(join(root, "vbrief"), { recursive: true });
|
|
60
|
+
writeFileSync(join(root, "vbrief", "PROJECT-DEFINITION.vbrief.json"), JSON.stringify({
|
|
61
|
+
vBRIEFInfo: { version: "0.6" },
|
|
62
|
+
plan: { title: "T", status: "running", items: [], policy },
|
|
63
|
+
}), "utf8");
|
|
64
|
+
}
|
|
65
|
+
export function seedProject(policy = {}) {
|
|
66
|
+
const root = mkdtempSync(join(tmpdir(), "deft-gates-cli-"));
|
|
67
|
+
writeProjectDef(root, policy);
|
|
68
|
+
initGitRepo(root);
|
|
69
|
+
return root;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=_helpers.js.map
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@deftai/directive` — entrypoint for the deft directive TypeScript engine.
|
|
3
|
+
*
|
|
4
|
+
* Wave-1 skeleton (#1717): `banner()` spans the full dependency chain
|
|
5
|
+
* (cli → core → types), proving the project-reference graph builds and
|
|
6
|
+
* resolves end-to-end. Real commands land in later migration waves.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CLI_PACKAGE: "@deftai/directive";
|
|
9
|
+
/** Renders the engine banner string, sourcing core engine metadata. */
|
|
10
|
+
export declare function banner(): string;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { engineInfo } from "@deftai/directive-core";
|
|
2
|
+
/**
|
|
3
|
+
* `@deftai/directive` — entrypoint for the deft directive TypeScript engine.
|
|
4
|
+
*
|
|
5
|
+
* Wave-1 skeleton (#1717): `banner()` spans the full dependency chain
|
|
6
|
+
* (cli → core → types), proving the project-reference graph builds and
|
|
7
|
+
* resolves end-to-end. Real commands land in later migration waves.
|
|
8
|
+
*/
|
|
9
|
+
export const CLI_PACKAGE = "@deftai/directive";
|
|
10
|
+
/** Renders the engine banner string, sourcing core engine metadata. */
|
|
11
|
+
export function banner() {
|
|
12
|
+
const info = engineInfo();
|
|
13
|
+
return `${CLI_PACKAGE} (engine: ${info.name}@${info.version})`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Canonical headless install argv (#1339 / #1409 / getting-started.md). */
|
|
2
|
+
export declare const CANONICAL_INIT_ARGV: readonly ["--yes", "--repo-root", ".", "--json"];
|
|
3
|
+
/** Canonical headless upgrade argv (#1339 / #1409). */
|
|
4
|
+
export declare const CANONICAL_UPDATE_ARGV: readonly ["--yes", "--upgrade", "--repo-root", ".", "--json"];
|
|
5
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Canonical headless install argv (#1339 / #1409 / getting-started.md). */
|
|
2
|
+
export const CANONICAL_INIT_ARGV = ["--yes", "--repo-root", ".", "--json"];
|
|
3
|
+
/** Canonical headless upgrade argv (#1339 / #1409). */
|
|
4
|
+
export const CANONICAL_UPDATE_ARGV = ["--yes", "--upgrade", "--repo-root", ".", "--json"];
|
|
5
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CANONICAL_INIT_ARGV } from "./constants.js";
|
|
2
|
+
import { runDeftInstall } from "./run-deft-install.js";
|
|
3
|
+
export function runInit(argv, io) {
|
|
4
|
+
return runDeftInstall({
|
|
5
|
+
verb: "init",
|
|
6
|
+
canonicalArgv: CANONICAL_INIT_ARGV,
|
|
7
|
+
userArgv: argv,
|
|
8
|
+
io,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Resolve @deftai/directive package root from a compiled init-cli module URL. */
|
|
2
|
+
export declare function cliPackageRoot(fromModuleUrl?: string): string;
|
|
3
|
+
/** Release artifact basename for the current platform (#11 bundled layout). */
|
|
4
|
+
export declare function releaseArtifactName(platform: NodeJS.Platform, arch: string): string;
|
|
5
|
+
/** Ordered search paths for the bundled deft-install binary. */
|
|
6
|
+
export declare function bundledBinaryCandidates(packageRoot: string, platform: NodeJS.Platform, arch: string): readonly string[];
|
|
7
|
+
export interface ResolveBinaryOptions {
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
platform?: NodeJS.Platform;
|
|
10
|
+
arch?: string;
|
|
11
|
+
packageRoot?: string;
|
|
12
|
+
moduleUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export type ResolveBinaryResult = {
|
|
15
|
+
ok: true;
|
|
16
|
+
path: string;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
reason: "not-found";
|
|
20
|
+
packageRoot: string;
|
|
21
|
+
platform: NodeJS.Platform;
|
|
22
|
+
arch: string;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
reason: "override-unreadable";
|
|
26
|
+
path: string;
|
|
27
|
+
};
|
|
28
|
+
/** Locate the bundled deft-install binary or an explicit DEFT_INSTALL_BINARY override. */
|
|
29
|
+
export declare function resolveBundledDeftInstallBinaryDetailed(options?: ResolveBinaryOptions): ResolveBinaryResult;
|
|
30
|
+
/** Back-compat helper returning only the resolved path. */
|
|
31
|
+
export declare function resolveBundledDeftInstallBinary(options?: ResolveBinaryOptions): string | null;
|
|
32
|
+
export declare function missingBinaryMessage(verb: "init" | "update", packageRoot: string, platform: NodeJS.Platform, arch: string): string;
|
|
33
|
+
export declare function overrideUnreadableMessage(verb: "init" | "update", path: string): string;
|
|
34
|
+
//# sourceMappingURL=resolve-binary.d.ts.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { accessSync, constants as fsConstants } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/** Resolve @deftai/directive package root from a compiled init-cli module URL. */
|
|
5
|
+
export function cliPackageRoot(fromModuleUrl = import.meta.url) {
|
|
6
|
+
return join(dirname(fileURLToPath(fromModuleUrl)), "..", "..");
|
|
7
|
+
}
|
|
8
|
+
/** Release artifact basename for the current platform (#11 bundled layout). */
|
|
9
|
+
export function releaseArtifactName(platform, arch) {
|
|
10
|
+
const normalizedArch = arch === "x64" ? "amd64" : arch === "arm64" ? "arm64" : arch;
|
|
11
|
+
switch (platform) {
|
|
12
|
+
case "win32":
|
|
13
|
+
return `install-windows-${normalizedArch}.exe`;
|
|
14
|
+
case "darwin":
|
|
15
|
+
return `install-macos-${normalizedArch}`;
|
|
16
|
+
case "linux":
|
|
17
|
+
return `install-linux-${normalizedArch}`;
|
|
18
|
+
default:
|
|
19
|
+
return `install-${platform}-${normalizedArch}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Ordered search paths for the bundled deft-install binary. */
|
|
23
|
+
export function bundledBinaryCandidates(packageRoot, platform, arch) {
|
|
24
|
+
const artifact = releaseArtifactName(platform, arch);
|
|
25
|
+
const genericName = platform === "win32" ? "deft-install.exe" : "deft-install";
|
|
26
|
+
return [
|
|
27
|
+
join(packageRoot, "vendor", "deft-install", artifact),
|
|
28
|
+
join(packageRoot, "vendor", "deft-install", genericName),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
function accessMode(platform) {
|
|
32
|
+
return platform === "win32" ? fsConstants.R_OK : fsConstants.R_OK | fsConstants.X_OK;
|
|
33
|
+
}
|
|
34
|
+
function isRunnableBinary(path, platform) {
|
|
35
|
+
try {
|
|
36
|
+
accessSync(path, accessMode(platform));
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Locate the bundled deft-install binary or an explicit DEFT_INSTALL_BINARY override. */
|
|
44
|
+
export function resolveBundledDeftInstallBinaryDetailed(options = {}) {
|
|
45
|
+
const env = options.env ?? process.env;
|
|
46
|
+
const platform = options.platform ?? process.platform;
|
|
47
|
+
const arch = options.arch ?? process.arch;
|
|
48
|
+
const packageRoot = options.packageRoot ?? cliPackageRoot(options.moduleUrl ?? import.meta.url);
|
|
49
|
+
const override = env.DEFT_INSTALL_BINARY?.trim();
|
|
50
|
+
if (override !== undefined && override.length > 0) {
|
|
51
|
+
if (isRunnableBinary(override, platform)) {
|
|
52
|
+
return { ok: true, path: override };
|
|
53
|
+
}
|
|
54
|
+
return { ok: false, reason: "override-unreadable", path: override };
|
|
55
|
+
}
|
|
56
|
+
for (const candidate of bundledBinaryCandidates(packageRoot, platform, arch)) {
|
|
57
|
+
if (isRunnableBinary(candidate, platform)) {
|
|
58
|
+
return { ok: true, path: candidate };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { ok: false, reason: "not-found", packageRoot, platform, arch };
|
|
62
|
+
}
|
|
63
|
+
/** Back-compat helper returning only the resolved path. */
|
|
64
|
+
export function resolveBundledDeftInstallBinary(options = {}) {
|
|
65
|
+
const resolved = resolveBundledDeftInstallBinaryDetailed(options);
|
|
66
|
+
return resolved.ok ? resolved.path : null;
|
|
67
|
+
}
|
|
68
|
+
export function missingBinaryMessage(verb, packageRoot, platform, arch) {
|
|
69
|
+
const expected = bundledBinaryCandidates(packageRoot, platform, arch)[0];
|
|
70
|
+
return (`directive ${verb}: bundled deft-install binary not found (expected ${expected}).\n` +
|
|
71
|
+
"Download a platform installer from https://github.com/deftai/directive/releases " +
|
|
72
|
+
"or set DEFT_INSTALL_BINARY to the absolute path of deft-install.");
|
|
73
|
+
}
|
|
74
|
+
export function overrideUnreadableMessage(verb, path) {
|
|
75
|
+
return (`directive ${verb}: DEFT_INSTALL_BINARY is set to ${path} but the path is missing or not executable.\n` +
|
|
76
|
+
"Fix the path or download a platform installer from https://github.com/deftai/directive/releases.");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=resolve-binary.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DispatchIo } from "../dispatch.js";
|
|
2
|
+
import { type ResolveBinaryOptions, resolveBundledDeftInstallBinaryDetailed } from "./resolve-binary.js";
|
|
3
|
+
export interface BinaryRunResult {
|
|
4
|
+
status: number;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
}
|
|
8
|
+
export type RunBinaryFn = (binary: string, args: readonly string[], cwd: string) => BinaryRunResult;
|
|
9
|
+
/** Safe subprocess capture (#1366): utf-8 text mode with replace semantics. */
|
|
10
|
+
export declare function defaultRunBinary(binary: string, args: readonly string[], cwd: string): BinaryRunResult;
|
|
11
|
+
export interface RunDeftInstallOptions {
|
|
12
|
+
verb: "init" | "update";
|
|
13
|
+
canonicalArgv: readonly string[];
|
|
14
|
+
userArgv?: readonly string[];
|
|
15
|
+
io: DispatchIo;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
resolveBinaryDetailed?: (options?: ResolveBinaryOptions) => ReturnType<typeof resolveBundledDeftInstallBinaryDetailed>;
|
|
18
|
+
resolveBinaryOptions?: ResolveBinaryOptions;
|
|
19
|
+
runBinary?: RunBinaryFn;
|
|
20
|
+
}
|
|
21
|
+
/** Shell out to bundled deft-install with canonical argv and map exit codes. */
|
|
22
|
+
export declare function runDeftInstall(options: RunDeftInstallOptions): number;
|
|
23
|
+
//# sourceMappingURL=run-deft-install.d.ts.map
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { constants as osConstants } from "node:os";
|
|
3
|
+
import { cliPackageRoot, missingBinaryMessage, overrideUnreadableMessage, resolveBundledDeftInstallBinaryDetailed, } from "./resolve-binary.js";
|
|
4
|
+
const SUBPROCESS_MAX_BUFFER = 64 * 1024 * 1024;
|
|
5
|
+
function signalExitCode(signal) {
|
|
6
|
+
const signum = osConstants.signals[signal];
|
|
7
|
+
return 128 + (typeof signum === "number" ? signum : 0);
|
|
8
|
+
}
|
|
9
|
+
/** Safe subprocess capture (#1366): utf-8 text mode with replace semantics. */
|
|
10
|
+
export function defaultRunBinary(binary, args, cwd) {
|
|
11
|
+
const result = spawnSync(binary, [...args], {
|
|
12
|
+
cwd,
|
|
13
|
+
env: process.env,
|
|
14
|
+
encoding: "utf8",
|
|
15
|
+
maxBuffer: SUBPROCESS_MAX_BUFFER,
|
|
16
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
17
|
+
});
|
|
18
|
+
let status = result.status;
|
|
19
|
+
let stderr = typeof result.stderr === "string" ? result.stderr : "";
|
|
20
|
+
if (status === null) {
|
|
21
|
+
if (result.signal !== null && result.signal !== undefined) {
|
|
22
|
+
status = signalExitCode(result.signal);
|
|
23
|
+
}
|
|
24
|
+
else if (result.error) {
|
|
25
|
+
status = 2;
|
|
26
|
+
if (stderr.trim().length === 0) {
|
|
27
|
+
stderr = result.error.message;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
status = 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
status,
|
|
36
|
+
stdout: typeof result.stdout === "string" ? result.stdout : "",
|
|
37
|
+
stderr,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function writeCaptured(text, write) {
|
|
41
|
+
if (text.length === 0)
|
|
42
|
+
return;
|
|
43
|
+
write(text.endsWith("\n") ? text : `${text}\n`);
|
|
44
|
+
}
|
|
45
|
+
/** Shell out to bundled deft-install with canonical argv and map exit codes. */
|
|
46
|
+
export function runDeftInstall(options) {
|
|
47
|
+
const resolveDetailed = options.resolveBinaryDetailed ?? resolveBundledDeftInstallBinaryDetailed;
|
|
48
|
+
const resolveOptions = options.resolveBinaryOptions ?? {};
|
|
49
|
+
const resolved = resolveDetailed(resolveOptions);
|
|
50
|
+
if (!resolved.ok) {
|
|
51
|
+
if (resolved.reason === "override-unreadable") {
|
|
52
|
+
options.io.writeErr(`${overrideUnreadableMessage(options.verb, resolved.path)}\n`);
|
|
53
|
+
return 2;
|
|
54
|
+
}
|
|
55
|
+
const packageRoot = resolved.packageRoot ??
|
|
56
|
+
resolveOptions.packageRoot ??
|
|
57
|
+
cliPackageRoot(resolveOptions.moduleUrl ?? import.meta.url);
|
|
58
|
+
const platform = resolved.platform ?? resolveOptions.platform ?? process.platform;
|
|
59
|
+
const arch = resolved.arch ?? resolveOptions.arch ?? process.arch;
|
|
60
|
+
options.io.writeErr(`${missingBinaryMessage(options.verb, packageRoot, platform, arch)}\n`);
|
|
61
|
+
return 2;
|
|
62
|
+
}
|
|
63
|
+
const args = [...options.canonicalArgv, ...(options.userArgv ?? [])];
|
|
64
|
+
const cwd = options.cwd ?? process.cwd();
|
|
65
|
+
const runBinary = options.runBinary ?? defaultRunBinary;
|
|
66
|
+
const result = runBinary(resolved.path, args, cwd);
|
|
67
|
+
writeCaptured(result.stdout, options.io.writeOut);
|
|
68
|
+
writeCaptured(result.stderr, options.io.writeErr);
|
|
69
|
+
return result.status === 0 ? 0 : result.status;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=run-deft-install.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CANONICAL_UPDATE_ARGV } from "./constants.js";
|
|
2
|
+
import { runDeftInstall } from "./run-deft-install.js";
|
|
3
|
+
export function runUpdate(argv, io) {
|
|
4
|
+
return runDeftInstall({
|
|
5
|
+
verb: "update",
|
|
6
|
+
canonicalArgv: CANONICAL_UPDATE_ARGV,
|
|
7
|
+
userArgv: argv,
|
|
8
|
+
io,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wave 8.5 s7 install/migrate CLI tail — retire-vs-retarget coverage map (#1838).
|
|
3
|
+
* Primary deliverable is duplicated in the PR body for Wave 9 mechanical teardown.
|
|
4
|
+
*/
|
|
5
|
+
export type InstallCliTailClassification = "retire-at-Wave-9" | "retarget";
|
|
6
|
+
export interface InstallCliTailEntry {
|
|
7
|
+
readonly pythonTest: string;
|
|
8
|
+
readonly classification: InstallCliTailClassification;
|
|
9
|
+
readonly rationale: string;
|
|
10
|
+
readonly vitestSpec?: string;
|
|
11
|
+
}
|
|
12
|
+
/** One-line rationale per in-scope tests/cli file (Bucket C audit). */
|
|
13
|
+
export declare const INSTALL_CLI_TAIL_COVERAGE_MAP: readonly InstallCliTailEntry[];
|
|
14
|
+
//# sourceMappingURL=coverage-map.d.ts.map
|