@deftai/directive-runtime 0.127.0 → 0.129.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/.githooks/_directive-run.sh +30 -0
- package/.githooks/pre-commit +4 -24
- package/.githooks/pre-push +11 -17
- package/Taskfile.yml +16 -15
- package/contracts/design-critique.md +5 -0
- package/dist/cli-router/route-argv.js +1 -0
- package/dist/contract-entry.js +2 -0
- package/dist/coverage-hotspots.js +2 -2
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +7 -0
- package/dist/policy.d.ts +4 -2
- package/dist/policy.js +101 -2
- package/dist/pre-pr-run.d.ts +2 -0
- package/dist/pre-pr-run.js +40 -0
- package/dist/render-cli/capability-map-cli.d.ts +3 -0
- package/dist/render-cli/capability-map-cli.js +6 -0
- package/dist/setup-wiring.d.ts +16 -1
- package/dist/setup-wiring.js +47 -3
- package/dist/setup.d.ts +4 -0
- package/dist/setup.js +7 -1
- package/dist/verify-ac.js +29 -2
- package/docs/getting-started.md +2 -0
- package/docs/known-limitations.md +1 -0
- package/docs/launcher.md +10 -0
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +1 -1
- package/skills/deft-directive-pre-pr/SKILL.md +13 -3
- package/tasks/agent.yml +0 -2
- package/tasks/cache.yml +0 -16
- package/tasks/capacity.yml +0 -4
- package/tasks/change.yml +0 -4
- package/tasks/codebase.yml +0 -10
- package/tasks/commit.yml +0 -2
- package/tasks/coverage.yml +0 -2
- package/tasks/decision.yml +0 -4
- package/tasks/directive.yml +0 -1
- package/tasks/docs.yml +6 -10
- package/tasks/engine-invoke.cjs +79 -0
- package/tasks/engine-invoke.test.cjs +84 -0
- package/tasks/engine.yml +27 -88
- package/tasks/eval.yml +0 -8
- package/tasks/feedback.yml +0 -2
- package/tasks/install.yml +0 -4
- package/tasks/issue.yml +0 -3
- package/tasks/lifecycle.yml +0 -1
- package/tasks/materialize.cjs +246 -0
- package/tasks/materialize.test.cjs +103 -0
- package/tasks/materialize.yml +13 -0
- package/tasks/migrate.yml +0 -6
- package/tasks/packs.yml +0 -16
- package/tasks/plan-sequence.yml +0 -8
- package/tasks/policy.yml +0 -24
- package/tasks/pr.yml +0 -6
- package/tasks/prd.yml +0 -2
- package/tasks/product-signal.yml +0 -10
- package/tasks/project.yml +0 -8
- package/tasks/reconcile.yml +0 -2
- package/tasks/review-monitor.yml +0 -4
- package/tasks/roadmap.yml +0 -4
- package/tasks/scm.yml +0 -32
- package/tasks/scope.yml +0 -30
- package/tasks/slice.yml +0 -4
- package/tasks/spec.yml +0 -6
- package/tasks/subagent.yml +0 -4
- package/tasks/swarm.yml +0 -7
- package/tasks/toolchain.yml +0 -4
- package/tasks/triage-actions.yml +0 -8
- package/tasks/triage-bootstrap.yml +0 -1
- package/tasks/triage-bulk.yml +0 -5
- package/tasks/triage-classify.yml +0 -2
- package/tasks/triage-evaluate.yml +0 -1
- package/tasks/triage-metrics.yml +0 -2
- package/tasks/triage-queue.yml +0 -3
- package/tasks/triage-reconcile.yml +0 -1
- package/tasks/triage-scope-drift.yml +0 -1
- package/tasks/triage-scope.yml +0 -1
- package/tasks/triage-smoketest.yml +0 -1
- package/tasks/triage-subscribe.yml +0 -2
- package/tasks/tutorial.yml +0 -20
- package/tasks/umbrella.yml +0 -2
- package/tasks/value.yml +0 -2
- package/tasks/vbrief.yml +0 -12
- package/tasks/verify.yml +0 -140
- package/tasks/xbrief.yml +0 -6
- package/templates/design-critique-brief.md +3 -0
- package/vendor/directive-content/.githooks/_directive-run.sh +30 -0
- package/vendor/directive-content/.githooks/pre-commit +4 -24
- package/vendor/directive-content/.githooks/pre-push +11 -17
- package/vendor/directive-content/Taskfile.yml +16 -15
- package/vendor/directive-content/contracts/design-critique.md +5 -0
- package/vendor/directive-content/docs/getting-started.md +2 -0
- package/vendor/directive-content/docs/known-limitations.md +1 -0
- package/vendor/directive-content/docs/launcher.md +10 -0
- package/vendor/directive-content/packs/skills/skills-pack-0.1.json +1 -1
- package/vendor/directive-content/skills/deft-directive-pre-pr/SKILL.md +13 -3
- package/vendor/directive-content/tasks/agent.yml +0 -2
- package/vendor/directive-content/tasks/cache.yml +0 -16
- package/vendor/directive-content/tasks/capacity.yml +0 -4
- package/vendor/directive-content/tasks/change.yml +0 -4
- package/vendor/directive-content/tasks/codebase.yml +0 -10
- package/vendor/directive-content/tasks/commit.yml +0 -2
- package/vendor/directive-content/tasks/coverage.yml +0 -2
- package/vendor/directive-content/tasks/decision.yml +0 -4
- package/vendor/directive-content/tasks/directive.yml +0 -1
- package/vendor/directive-content/tasks/docs.yml +6 -10
- package/vendor/directive-content/tasks/engine-invoke.cjs +79 -0
- package/vendor/directive-content/tasks/engine-invoke.test.cjs +84 -0
- package/vendor/directive-content/tasks/engine.yml +27 -88
- package/vendor/directive-content/tasks/eval.yml +0 -8
- package/vendor/directive-content/tasks/feedback.yml +0 -2
- package/vendor/directive-content/tasks/install.yml +0 -4
- package/vendor/directive-content/tasks/issue.yml +0 -3
- package/vendor/directive-content/tasks/lifecycle.yml +0 -1
- package/vendor/directive-content/tasks/materialize.cjs +246 -0
- package/vendor/directive-content/tasks/materialize.test.cjs +103 -0
- package/vendor/directive-content/tasks/materialize.yml +13 -0
- package/vendor/directive-content/tasks/migrate.yml +0 -6
- package/vendor/directive-content/tasks/packs.yml +0 -16
- package/vendor/directive-content/tasks/plan-sequence.yml +0 -8
- package/vendor/directive-content/tasks/policy.yml +0 -24
- package/vendor/directive-content/tasks/pr.yml +0 -6
- package/vendor/directive-content/tasks/prd.yml +0 -2
- package/vendor/directive-content/tasks/product-signal.yml +0 -10
- package/vendor/directive-content/tasks/project.yml +0 -8
- package/vendor/directive-content/tasks/reconcile.yml +0 -2
- package/vendor/directive-content/tasks/review-monitor.yml +0 -4
- package/vendor/directive-content/tasks/roadmap.yml +0 -4
- package/vendor/directive-content/tasks/scm.yml +0 -32
- package/vendor/directive-content/tasks/scope.yml +0 -30
- package/vendor/directive-content/tasks/slice.yml +0 -4
- package/vendor/directive-content/tasks/spec.yml +0 -6
- package/vendor/directive-content/tasks/subagent.yml +0 -4
- package/vendor/directive-content/tasks/swarm.yml +0 -7
- package/vendor/directive-content/tasks/toolchain.yml +0 -4
- package/vendor/directive-content/tasks/triage-actions.yml +0 -8
- package/vendor/directive-content/tasks/triage-bootstrap.yml +0 -1
- package/vendor/directive-content/tasks/triage-bulk.yml +0 -5
- package/vendor/directive-content/tasks/triage-classify.yml +0 -2
- package/vendor/directive-content/tasks/triage-evaluate.yml +0 -1
- package/vendor/directive-content/tasks/triage-metrics.yml +0 -2
- package/vendor/directive-content/tasks/triage-queue.yml +0 -3
- package/vendor/directive-content/tasks/triage-reconcile.yml +0 -1
- package/vendor/directive-content/tasks/triage-scope-drift.yml +0 -1
- package/vendor/directive-content/tasks/triage-scope.yml +0 -1
- package/vendor/directive-content/tasks/triage-smoketest.yml +0 -1
- package/vendor/directive-content/tasks/triage-subscribe.yml +0 -2
- package/vendor/directive-content/tasks/tutorial.yml +0 -20
- package/vendor/directive-content/tasks/umbrella.yml +0 -2
- package/vendor/directive-content/tasks/value.yml +0 -2
- package/vendor/directive-content/tasks/vbrief.yml +0 -12
- package/vendor/directive-content/tasks/verify.yml +0 -140
- package/vendor/directive-content/tasks/xbrief.yml +0 -6
- package/vendor/directive-content/templates/design-critique-brief.md +3 -0
- package/vendor/directive-core/dist/.tsbuildinfo +1 -1
- package/vendor/directive-core/dist/content-root.d.ts.map +1 -1
- package/vendor/directive-core/dist/content-root.js +8 -1
- package/vendor/directive-core/dist/content-root.js.map +1 -1
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts +13 -5
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.js +60 -2
- package/vendor/directive-core/dist/coverage-hotspots/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/doctor/checks.d.ts.map +1 -1
- package/vendor/directive-core/dist/doctor/checks.js +5 -3
- package/vendor/directive-core/dist/doctor/checks.js.map +1 -1
- package/vendor/directive-core/dist/hooks/scope.d.ts +57 -0
- package/vendor/directive-core/dist/hooks/scope.d.ts.map +1 -1
- package/vendor/directive-core/dist/hooks/scope.js +171 -0
- package/vendor/directive-core/dist/hooks/scope.js.map +1 -1
- package/vendor/directive-core/dist/index.d.ts +1 -0
- package/vendor/directive-core/dist/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/index.js +1 -0
- package/vendor/directive-core/dist/index.js.map +1 -1
- package/vendor/directive-core/dist/init-deposit/scaffold.d.ts +1 -1
- package/vendor/directive-core/dist/init-deposit/scaffold.d.ts.map +1 -1
- package/vendor/directive-core/dist/init-deposit/scaffold.js +1 -1
- package/vendor/directive-core/dist/init-deposit/scaffold.js.map +1 -1
- package/vendor/directive-core/dist/packs/pack-render.d.ts +6 -1
- package/vendor/directive-core/dist/packs/pack-render.d.ts.map +1 -1
- package/vendor/directive-core/dist/packs/pack-render.js +103 -78
- package/vendor/directive-core/dist/packs/pack-render.js.map +1 -1
- package/vendor/directive-core/dist/packs/packs-root.d.ts +53 -0
- package/vendor/directive-core/dist/packs/packs-root.d.ts.map +1 -0
- package/vendor/directive-core/dist/packs/packs-root.js +83 -0
- package/vendor/directive-core/dist/packs/packs-root.js.map +1 -0
- package/vendor/directive-core/dist/packs/packs-slice.d.ts.map +1 -1
- package/vendor/directive-core/dist/packs/packs-slice.js +6 -6
- package/vendor/directive-core/dist/packs/packs-slice.js.map +1 -1
- package/vendor/directive-core/dist/policy/coverage-mode.d.ts +84 -0
- package/vendor/directive-core/dist/policy/coverage-mode.d.ts.map +1 -0
- package/vendor/directive-core/dist/policy/coverage-mode.js +226 -0
- package/vendor/directive-core/dist/policy/coverage-mode.js.map +1 -0
- package/vendor/directive-core/dist/policy/index.d.ts +2 -0
- package/vendor/directive-core/dist/policy/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/policy/index.js +60 -40
- package/vendor/directive-core/dist/policy/index.js.map +1 -1
- package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-closing-keywords/main.js +137 -7
- package/vendor/directive-core/dist/pr-closing-keywords/main.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts +2 -0
- package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.js +109 -14
- package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/evaluate.d.ts +2 -0
- package/vendor/directive-core/dist/pre-pr-controller/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/evaluate.js +11 -1
- package/vendor/directive-core/dist/pre-pr-controller/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +10 -0
- package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.js +15 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/types.d.ts +20 -1
- package/vendor/directive-core/dist/pre-pr-controller/types.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/types.js +2 -0
- package/vendor/directive-core/dist/pre-pr-controller/types.js.map +1 -1
- package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts +40 -3
- package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts.map +1 -1
- package/vendor/directive-core/dist/preflight-gh/pre-push.js +353 -27
- package/vendor/directive-core/dist/preflight-gh/pre-push.js.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.d.ts +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.d.ts.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.js +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.js.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.d.ts +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.js +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.js.map +1 -1
- package/vendor/directive-core/dist/release/main.d.ts.map +1 -1
- package/vendor/directive-core/dist/release/main.js +3 -2
- package/vendor/directive-core/dist/release/main.js.map +1 -1
- package/vendor/directive-core/dist/release/version.d.ts +14 -0
- package/vendor/directive-core/dist/release/version.d.ts.map +1 -1
- package/vendor/directive-core/dist/release/version.js +28 -0
- package/vendor/directive-core/dist/release/version.js.map +1 -1
- package/vendor/directive-core/dist/render/project-render.d.ts.map +1 -1
- package/vendor/directive-core/dist/render/project-render.js +1 -0
- package/vendor/directive-core/dist/render/project-render.js.map +1 -1
- package/vendor/directive-core/dist/scope/file-scope-coverage-warn.d.ts +21 -0
- package/vendor/directive-core/dist/scope/file-scope-coverage-warn.d.ts.map +1 -0
- package/vendor/directive-core/dist/scope/file-scope-coverage-warn.js +95 -0
- package/vendor/directive-core/dist/scope/file-scope-coverage-warn.js.map +1 -0
- package/vendor/directive-core/dist/swarm/launch-cli.d.ts.map +1 -1
- package/vendor/directive-core/dist/swarm/launch-cli.js +12 -0
- package/vendor/directive-core/dist/swarm/launch-cli.js.map +1 -1
- package/vendor/directive-core/dist/swarm/launch.d.ts +6 -0
- package/vendor/directive-core/dist/swarm/launch.d.ts.map +1 -1
- package/vendor/directive-core/dist/swarm/launch.js +11 -0
- package/vendor/directive-core/dist/swarm/launch.js.map +1 -1
- package/vendor/directive-core/dist/swarm/leftover-before-activation.d.ts +27 -0
- package/vendor/directive-core/dist/swarm/leftover-before-activation.d.ts.map +1 -0
- package/vendor/directive-core/dist/swarm/leftover-before-activation.js +31 -0
- package/vendor/directive-core/dist/swarm/leftover-before-activation.js.map +1 -0
- package/vendor/directive-core/dist/verify-env/verify-hooks-installed.d.ts +3 -3
- package/vendor/directive-core/dist/verify-env/verify-hooks-installed.d.ts.map +1 -1
- package/vendor/directive-core/dist/verify-env/verify-hooks-installed.js +7 -11
- package/vendor/directive-core/dist/verify-env/verify-hooks-installed.js.map +1 -1
- package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.d.ts.map +1 -1
- package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.js +1 -0
- package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.js.map +1 -1
- package/.githooks/_deft-run.sh +0 -47
- package/vendor/directive-content/.githooks/_deft-run.sh +0 -47
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Thin tip→pin materialize (#5805 Prefer-A Bound P3/P4).
|
|
6
|
+
* Stages + packs via existing scripts, then replaces this checkout's
|
|
7
|
+
* node_modules/@deftai/directive-runtime only. No package.json/lockfile
|
|
8
|
+
* location-spec mutation. Serializes via a lockfile under .deft-scratch.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { spawnSync } = require("node:child_process");
|
|
12
|
+
const fs = require("node:fs");
|
|
13
|
+
const os = require("node:os");
|
|
14
|
+
const path = require("node:path");
|
|
15
|
+
|
|
16
|
+
const PIN_PKG = path.join("node_modules", "@deftai", "directive-runtime");
|
|
17
|
+
const LOCK_REL = path.join(".deft-scratch", "materialize-runtime.lock");
|
|
18
|
+
const OVERLAY_REL = path.join(".deft-scratch", "materialize-runtime-overlay.json");
|
|
19
|
+
|
|
20
|
+
function fail(msg, code = 2) {
|
|
21
|
+
console.error(`materialize:runtime: ${msg}`);
|
|
22
|
+
process.exit(code);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function runNode(script, args, opts = {}) {
|
|
26
|
+
const r = spawnSync(process.execPath, [script, ...args], {
|
|
27
|
+
cwd: opts.cwd,
|
|
28
|
+
encoding: "utf8",
|
|
29
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
30
|
+
env: process.env,
|
|
31
|
+
});
|
|
32
|
+
if (r.status !== 0) {
|
|
33
|
+
const err = new Error(
|
|
34
|
+
`${path.basename(script)} failed (exit ${r.status}): ${r.stderr || r.stdout || ""}`.trim(),
|
|
35
|
+
);
|
|
36
|
+
err.code = r.status || 2;
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
return (r.stdout || "").trim();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function acquireLock(projectRoot) {
|
|
43
|
+
const lockPath = path.join(projectRoot, LOCK_REL);
|
|
44
|
+
fs.mkdirSync(path.dirname(lockPath), { recursive: true });
|
|
45
|
+
try {
|
|
46
|
+
const fd = fs.openSync(lockPath, "wx");
|
|
47
|
+
fs.writeFileSync(fd, `${process.pid}\n${new Date().toISOString()}\n`);
|
|
48
|
+
fs.closeSync(fd);
|
|
49
|
+
return lockPath;
|
|
50
|
+
} catch (err) {
|
|
51
|
+
if (err && err.code === "EEXIST") {
|
|
52
|
+
const locked = new Error(
|
|
53
|
+
`another materialize is in progress (lock ${lockPath}); reject second writer`,
|
|
54
|
+
);
|
|
55
|
+
locked.code = "EEXIST";
|
|
56
|
+
throw locked;
|
|
57
|
+
}
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function releaseLock(lockPath) {
|
|
63
|
+
try {
|
|
64
|
+
fs.unlinkSync(lockPath);
|
|
65
|
+
} catch {
|
|
66
|
+
/* ignore */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** True when dir is safe to replace: missing, or a real directory whose realpath is under checkoutRoot. */
|
|
71
|
+
function isCheckoutOwnedDir(dir, checkoutRoot) {
|
|
72
|
+
try {
|
|
73
|
+
const st = fs.lstatSync(dir);
|
|
74
|
+
if (st.isSymbolicLink()) {
|
|
75
|
+
// pnpm pin is often a symlink into the checkout store — allow when realpath stays in-tree.
|
|
76
|
+
if (!checkoutRoot) return false;
|
|
77
|
+
let real;
|
|
78
|
+
try {
|
|
79
|
+
real = fs.realpathSync(dir);
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const rootReal = fs.realpathSync(checkoutRoot);
|
|
84
|
+
const rel = path.relative(rootReal, real);
|
|
85
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
86
|
+
}
|
|
87
|
+
if (!st.isDirectory()) return false;
|
|
88
|
+
if (!checkoutRoot) return true;
|
|
89
|
+
let real;
|
|
90
|
+
try {
|
|
91
|
+
real = fs.realpathSync(dir);
|
|
92
|
+
} catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const rootReal = fs.realpathSync(checkoutRoot);
|
|
96
|
+
const rel = path.relative(rootReal, real);
|
|
97
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
98
|
+
} catch {
|
|
99
|
+
return true; // missing is fine; we will create
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function rmrf(target) {
|
|
104
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function movePath(src, dest) {
|
|
108
|
+
try {
|
|
109
|
+
fs.renameSync(src, dest);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
if (err && err.code === "EXDEV") {
|
|
112
|
+
fs.cpSync(src, dest, { recursive: true, force: true });
|
|
113
|
+
rmrf(src);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function materialize(projectRoot, opts = {}) {
|
|
121
|
+
const root = path.resolve(projectRoot);
|
|
122
|
+
const stageScript = path.join(root, "packages", "runtime", "scripts", "stage-bundle.mjs");
|
|
123
|
+
const packScript = path.join(root, "packages", "runtime", "scripts", "pack-staged-runtime.mjs");
|
|
124
|
+
if (!fs.existsSync(stageScript) || !fs.existsSync(packScript)) {
|
|
125
|
+
throw new Error("stage-bundle/pack-staged-runtime scripts missing; run from framework-source checkout");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const pinDir = path.join(root, PIN_PKG);
|
|
129
|
+
if (fs.existsSync(pinDir) && !isCheckoutOwnedDir(pinDir, root)) {
|
|
130
|
+
throw new Error(`refusing to mutate linked/shared pin at ${pinDir}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const lockPath = acquireLock(root);
|
|
134
|
+
const priorPinUsable = fs.existsSync(path.join(pinDir, "dist", "bin.js"));
|
|
135
|
+
let priorBackup = null;
|
|
136
|
+
let stageDir;
|
|
137
|
+
let packDir;
|
|
138
|
+
let extractDir;
|
|
139
|
+
try {
|
|
140
|
+
stageDir = fs.mkdtempSync(path.join(os.tmpdir(), "deft-materialize-stage-"));
|
|
141
|
+
packDir = fs.mkdtempSync(path.join(os.tmpdir(), "deft-materialize-pack-"));
|
|
142
|
+
runNode(stageScript, [stageDir], { cwd: root });
|
|
143
|
+
const tgz = runNode(packScript, [stageDir, packDir], { cwd: root });
|
|
144
|
+
if (!tgz || !fs.existsSync(tgz)) fail(`pack did not emit tgz (got ${JSON.stringify(tgz)})`);
|
|
145
|
+
|
|
146
|
+
extractDir = fs.mkdtempSync(path.join(os.tmpdir(), "deft-materialize-extract-"));
|
|
147
|
+
const tar = spawnSync(
|
|
148
|
+
process.platform === "win32" ? "tar.exe" : "tar",
|
|
149
|
+
["-xzf", tgz, "-C", extractDir],
|
|
150
|
+
{ encoding: "utf8" },
|
|
151
|
+
);
|
|
152
|
+
if (tar.status !== 0) {
|
|
153
|
+
throw Object.assign(new Error(`tar extract failed: ${tar.stderr || tar.stdout || ""}`.trim()), { code: tar.status || 2 });
|
|
154
|
+
}
|
|
155
|
+
const entries = fs.readdirSync(extractDir);
|
|
156
|
+
if (entries.length !== 1) throw new Error(`expected one package folder in tgz, got ${entries.join(",")}`);
|
|
157
|
+
const extracted = path.join(extractDir, entries[0]);
|
|
158
|
+
|
|
159
|
+
const parent = path.dirname(pinDir);
|
|
160
|
+
fs.mkdirSync(parent, { recursive: true });
|
|
161
|
+
const stagingPin = path.join(parent, `.directive-runtime-next-${process.pid}`);
|
|
162
|
+
rmrf(stagingPin);
|
|
163
|
+
movePath(extracted, stagingPin);
|
|
164
|
+
if (!fs.existsSync(path.join(stagingPin, "dist", "bin.js"))) {
|
|
165
|
+
throw new Error("staged pin bin missing before replacement");
|
|
166
|
+
}
|
|
167
|
+
// Keep recoverable backup until replacement succeeds.
|
|
168
|
+
if (fs.existsSync(pinDir)) {
|
|
169
|
+
priorBackup = path.join(parent, `.directive-runtime-prev-${process.pid}`);
|
|
170
|
+
rmrf(priorBackup);
|
|
171
|
+
movePath(pinDir, priorBackup);
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
movePath(stagingPin, pinDir);
|
|
175
|
+
} catch (err) {
|
|
176
|
+
if (priorBackup && fs.existsSync(priorBackup)) {
|
|
177
|
+
try {
|
|
178
|
+
movePath(priorBackup, pinDir);
|
|
179
|
+
priorBackup = null;
|
|
180
|
+
} catch {
|
|
181
|
+
/* best-effort restore */
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
if (priorBackup) {
|
|
187
|
+
rmrf(priorBackup);
|
|
188
|
+
priorBackup = null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
let head = "unknown";
|
|
192
|
+
try {
|
|
193
|
+
const g = spawnSync("git", ["rev-parse", "HEAD"], { cwd: root, encoding: "utf8" });
|
|
194
|
+
if (g.status === 0) head = g.stdout.trim();
|
|
195
|
+
} catch {
|
|
196
|
+
/* ignore */
|
|
197
|
+
}
|
|
198
|
+
const overlay = {
|
|
199
|
+
schema: "deft.materialize.runtime.overlay.v1",
|
|
200
|
+
writtenAt: new Date().toISOString(),
|
|
201
|
+
projectRoot: root,
|
|
202
|
+
pinPath: pinDir,
|
|
203
|
+
sourceRevision: head,
|
|
204
|
+
tarball: path.basename(tgz),
|
|
205
|
+
note: "Local tip overlay into checkout pin; package.json/lockfile pins unchanged. Normal PM install restores registry pin.",
|
|
206
|
+
};
|
|
207
|
+
fs.writeFileSync(path.join(root, OVERLAY_REL), `${JSON.stringify(overlay, null, 2)}\n`);
|
|
208
|
+
if (!fs.existsSync(path.join(pinDir, "dist", "bin.js"))) {
|
|
209
|
+
throw new Error("materialize completed but pin bin missing");
|
|
210
|
+
}
|
|
211
|
+
process.stdout.write(`materialize:runtime: installed tip into ${pinDir}\n`);
|
|
212
|
+
process.stdout.write(`materialize:runtime: overlay ${path.join(root, OVERLAY_REL)}\n`);
|
|
213
|
+
return overlay;
|
|
214
|
+
} catch (err) {
|
|
215
|
+
if (priorPinUsable) {
|
|
216
|
+
console.error("materialize:runtime: failed after stage/pack; prior pin left in place");
|
|
217
|
+
}
|
|
218
|
+
throw err;
|
|
219
|
+
} finally {
|
|
220
|
+
releaseLock(lockPath);
|
|
221
|
+
if (stageDir) rmrf(stageDir);
|
|
222
|
+
if (packDir) rmrf(packDir);
|
|
223
|
+
if (extractDir) rmrf(extractDir);
|
|
224
|
+
if (priorBackup) rmrf(priorBackup);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (require.main === module) {
|
|
229
|
+
const root = process.argv[2] || process.cwd();
|
|
230
|
+
try {
|
|
231
|
+
materialize(root);
|
|
232
|
+
} catch (err) {
|
|
233
|
+
fail(err && err.message ? err.message : String(err), err && err.code ? Number(err.code) || 2 : 2);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
module.exports = {
|
|
238
|
+
materialize,
|
|
239
|
+
acquireLock,
|
|
240
|
+
releaseLock,
|
|
241
|
+
isCheckoutOwnedDir,
|
|
242
|
+
movePath,
|
|
243
|
+
PIN_PKG,
|
|
244
|
+
LOCK_REL,
|
|
245
|
+
OVERLAY_REL,
|
|
246
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const assert = require("node:assert/strict");
|
|
5
|
+
const {
|
|
6
|
+
mkdtempSync,
|
|
7
|
+
mkdirSync,
|
|
8
|
+
writeFileSync,
|
|
9
|
+
symlinkSync,
|
|
10
|
+
rmSync,
|
|
11
|
+
existsSync,
|
|
12
|
+
readFileSync,
|
|
13
|
+
} = require("node:fs");
|
|
14
|
+
const { tmpdir } = require("node:os");
|
|
15
|
+
const { join } = require("node:path");
|
|
16
|
+
const { describe, it, after } = require("node:test");
|
|
17
|
+
const {
|
|
18
|
+
acquireLock,
|
|
19
|
+
releaseLock,
|
|
20
|
+
isCheckoutOwnedDir,
|
|
21
|
+
movePath,
|
|
22
|
+
materialize,
|
|
23
|
+
LOCK_REL,
|
|
24
|
+
} = require("./materialize.cjs");
|
|
25
|
+
|
|
26
|
+
const roots = [];
|
|
27
|
+
function tempRoot() {
|
|
28
|
+
const root = mkdtempSync(join(tmpdir(), "mat-test-"));
|
|
29
|
+
roots.push(root);
|
|
30
|
+
return root;
|
|
31
|
+
}
|
|
32
|
+
after(() => {
|
|
33
|
+
for (const root of roots) {
|
|
34
|
+
try {
|
|
35
|
+
rmSync(root, { recursive: true, force: true });
|
|
36
|
+
} catch {
|
|
37
|
+
/* ignore */
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe("materialize isolation (#5805 P4)", () => {
|
|
43
|
+
it("acquireLock rejects a second writer", () => {
|
|
44
|
+
const root = tempRoot();
|
|
45
|
+
const lock = acquireLock(root);
|
|
46
|
+
assert.ok(existsSync(join(root, LOCK_REL)));
|
|
47
|
+
assert.throws(() => acquireLock(root), /another materialize|second writer|EEXIST|in progress/i);
|
|
48
|
+
releaseLock(lock);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("isCheckoutOwnedDir is false for a symlink outside the checkout", () => {
|
|
52
|
+
const root = tempRoot();
|
|
53
|
+
const outside = tempRoot();
|
|
54
|
+
const real = join(outside, "real-pkg");
|
|
55
|
+
const link = join(root, "linked-pkg");
|
|
56
|
+
mkdirSync(real, { recursive: true });
|
|
57
|
+
try {
|
|
58
|
+
symlinkSync(real, link, "junction");
|
|
59
|
+
} catch {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
assert.equal(isCheckoutOwnedDir(link, root), false);
|
|
63
|
+
assert.equal(isCheckoutOwnedDir(real, outside), true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("isCheckoutOwnedDir allows in-tree symlink (pnpm-style)", () => {
|
|
67
|
+
const root = tempRoot();
|
|
68
|
+
const store = join(root, ".pnpm", "pkg");
|
|
69
|
+
const link = join(root, "node_modules", "@deftai", "directive-runtime");
|
|
70
|
+
mkdirSync(store, { recursive: true });
|
|
71
|
+
mkdirSync(join(root, "node_modules", "@deftai"), { recursive: true });
|
|
72
|
+
try {
|
|
73
|
+
symlinkSync(store, link, "junction");
|
|
74
|
+
} catch {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
assert.equal(isCheckoutOwnedDir(link, root), true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("missing destination is treated as checkout-owned (creatable)", () => {
|
|
81
|
+
const root = tempRoot();
|
|
82
|
+
assert.equal(isCheckoutOwnedDir(join(root, "missing"), root), true);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("movePath falls back when rename would need copy semantics", () => {
|
|
86
|
+
const root = tempRoot();
|
|
87
|
+
const src = join(root, "src-dir");
|
|
88
|
+
const dest = join(root, "dest-dir");
|
|
89
|
+
mkdirSync(src, { recursive: true });
|
|
90
|
+
writeFileSync(join(src, "f.txt"), "ok");
|
|
91
|
+
movePath(src, dest);
|
|
92
|
+
assert.equal(readFileSync(join(dest, "f.txt"), "utf8"), "ok");
|
|
93
|
+
assert.equal(existsSync(src), false);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("failed materialize releases the lock so retries can proceed", () => {
|
|
97
|
+
const root = tempRoot();
|
|
98
|
+
assert.throws(() => materialize(root), /stage-bundle|pack-staged|missing/i);
|
|
99
|
+
assert.equal(existsSync(join(root, LOCK_REL)), false);
|
|
100
|
+
const lock = acquireLock(root);
|
|
101
|
+
releaseLock(lock);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
version: "3"
|
|
2
|
+
|
|
3
|
+
vars:
|
|
4
|
+
DEFT_ROOT: '{{joinPath .TASKFILE_DIR ".."}}'
|
|
5
|
+
|
|
6
|
+
tasks:
|
|
7
|
+
runtime:
|
|
8
|
+
desc: "Build tip staged-runtime and replace this checkout node_modules/@deftai/directive-runtime only (#5805). No lockfile/location-spec mutation."
|
|
9
|
+
dir: "{{.USER_WORKING_DIR}}"
|
|
10
|
+
deps:
|
|
11
|
+
- task: :engine:_ts-build
|
|
12
|
+
cmds:
|
|
13
|
+
- node "{{.TASKFILE_DIR}}/materialize.cjs" "{{.USER_WORKING_DIR}}"
|
|
@@ -15,8 +15,6 @@ tasks:
|
|
|
15
15
|
# run the in-product migrator (retired from current npm deposits).
|
|
16
16
|
desc: "Detect pre-v0.20 document model and report the frozen-release migration path (#2068). Three-state exit (#793)."
|
|
17
17
|
dir: '{{.USER_WORKING_DIR}}'
|
|
18
|
-
deps:
|
|
19
|
-
- task: :engine:_ts-build
|
|
20
18
|
cmds:
|
|
21
19
|
- task: :engine:invoke
|
|
22
20
|
vars:
|
|
@@ -27,8 +25,6 @@ tasks:
|
|
|
27
25
|
# v0.59.0 tag only — current deposits must not ship that target.
|
|
28
26
|
desc: "Migrate consumer vbrief/ layout to xbrief/ with semantic v0.6->v0.8 transforms (#2110 / #2034). Hop 2 of the frozen two-hop path (#4092)."
|
|
29
27
|
dir: '{{.USER_WORKING_DIR}}'
|
|
30
|
-
deps:
|
|
31
|
-
- task: :engine:_ts-build
|
|
32
28
|
cmds:
|
|
33
29
|
- task: :engine:invoke
|
|
34
30
|
vars:
|
|
@@ -37,8 +33,6 @@ tasks:
|
|
|
37
33
|
category-b:
|
|
38
34
|
desc: "Namespace Category B bare plan keys (policy / completedNote) under x-directive/ across the corpus (#1650 / #2034)."
|
|
39
35
|
dir: '{{.USER_WORKING_DIR}}'
|
|
40
|
-
deps:
|
|
41
|
-
- task: :engine:_ts-build
|
|
42
36
|
cmds:
|
|
43
37
|
- task: :engine:invoke
|
|
44
38
|
vars:
|
|
@@ -30,8 +30,6 @@ tasks:
|
|
|
30
30
|
slice:
|
|
31
31
|
desc: "Named, structured slice access to a content pack (#1283, #1295). -- task packs:slice <pack> <name> [-- --since YYYY-MM | --tag T | --trigger KW] [--list] [--list-packs] [--json]"
|
|
32
32
|
dir: '{{.USER_WORKING_DIR}}'
|
|
33
|
-
deps:
|
|
34
|
-
- task: ":engine:_ts-build"
|
|
35
33
|
cmds:
|
|
36
34
|
- task: :engine:invoke
|
|
37
35
|
vars:
|
|
@@ -40,8 +38,6 @@ tasks:
|
|
|
40
38
|
render:
|
|
41
39
|
desc: "Regenerate every content-pack projection from its canonical source (ADR-001): meta/lessons.md (lessons), the proof SKILL.md (skills), coding/testing.md (rules), strategies/yolo.md (strategies). -- task packs:render [-- --pack rules] [--check]"
|
|
42
40
|
dir: '{{.USER_WORKING_DIR}}'
|
|
43
|
-
deps:
|
|
44
|
-
- task: ":engine:_ts-build"
|
|
45
41
|
cmds:
|
|
46
42
|
- task: :engine:invoke
|
|
47
43
|
vars:
|
|
@@ -50,8 +46,6 @@ tasks:
|
|
|
50
46
|
render-skills:
|
|
51
47
|
desc: "One-shot migration: rebuild packs/skills/skills-pack-0.1.json from skills/*/SKILL.md + the AGENTS.md Skill Routing table (#1295)."
|
|
52
48
|
dir: '{{.USER_WORKING_DIR}}'
|
|
53
|
-
deps:
|
|
54
|
-
- task: ":engine:_ts-build"
|
|
55
49
|
cmds:
|
|
56
50
|
- task: :engine:invoke
|
|
57
51
|
vars:
|
|
@@ -60,8 +54,6 @@ tasks:
|
|
|
60
54
|
render-rules:
|
|
61
55
|
desc: "One-shot migration: rebuild packs/rules/rules-pack-0.1.json from the RFC2119 directives in coding/*.md (#1296)."
|
|
62
56
|
dir: '{{.USER_WORKING_DIR}}'
|
|
63
|
-
deps:
|
|
64
|
-
- task: ":engine:_ts-build"
|
|
65
57
|
cmds:
|
|
66
58
|
- task: :engine:invoke
|
|
67
59
|
vars:
|
|
@@ -70,8 +62,6 @@ tasks:
|
|
|
70
62
|
render-strategies:
|
|
71
63
|
desc: "One-shot migration: rebuild packs/strategies/strategies-pack-0.1.json from strategies/*.md (#1296)."
|
|
72
64
|
dir: '{{.USER_WORKING_DIR}}'
|
|
73
|
-
deps:
|
|
74
|
-
- task: ":engine:_ts-build"
|
|
75
65
|
cmds:
|
|
76
66
|
- task: :engine:invoke
|
|
77
67
|
vars:
|
|
@@ -80,8 +70,6 @@ tasks:
|
|
|
80
70
|
render-patterns:
|
|
81
71
|
desc: "One-shot migration: rebuild packs/patterns/patterns-pack-0.1.json from patterns/*.md (#1637)."
|
|
82
72
|
dir: '{{.USER_WORKING_DIR}}'
|
|
83
|
-
deps:
|
|
84
|
-
- task: ":engine:_ts-build"
|
|
85
73
|
cmds:
|
|
86
74
|
- task: :engine:invoke
|
|
87
75
|
vars:
|
|
@@ -90,8 +78,6 @@ tasks:
|
|
|
90
78
|
render-swarm-spec:
|
|
91
79
|
desc: "One-shot migration: rebuild packs/swarm-spec/swarm-spec-pack-0.1.json from swarm/*.md (#1637)."
|
|
92
80
|
dir: '{{.USER_WORKING_DIR}}'
|
|
93
|
-
deps:
|
|
94
|
-
- task: ":engine:_ts-build"
|
|
95
81
|
cmds:
|
|
96
82
|
- task: :engine:invoke
|
|
97
83
|
vars:
|
|
@@ -100,8 +86,6 @@ tasks:
|
|
|
100
86
|
verify-drift:
|
|
101
87
|
desc: "Drift gate: fail (exit 1) when ANY pack projection (meta/lessons.md, the skills proof SKILL.md, coding/testing.md, strategies/yolo.md) diverges from a freshly rendered buffer. Wired into `task check` and surfaced as `task verify:pack-drift`."
|
|
102
88
|
dir: '{{.USER_WORKING_DIR}}'
|
|
103
|
-
deps:
|
|
104
|
-
- task: ":engine:_ts-build"
|
|
105
89
|
cmds:
|
|
106
90
|
- task: :engine:invoke
|
|
107
91
|
vars:
|
|
@@ -9,8 +9,6 @@ tasks:
|
|
|
9
9
|
set:
|
|
10
10
|
desc: "Set the active ordered-plan sequence from --file JSON (#2402)"
|
|
11
11
|
dir: '{{.USER_WORKING_DIR}}'
|
|
12
|
-
deps:
|
|
13
|
-
- task: :engine:_ts-build
|
|
14
12
|
cmds:
|
|
15
13
|
- task: :engine:invoke
|
|
16
14
|
vars:
|
|
@@ -19,8 +17,6 @@ tasks:
|
|
|
19
17
|
current:
|
|
20
18
|
desc: "Show the current ordered-plan entry (#2402)"
|
|
21
19
|
dir: '{{.USER_WORKING_DIR}}'
|
|
22
|
-
deps:
|
|
23
|
-
- task: :engine:_ts-build
|
|
24
20
|
cmds:
|
|
25
21
|
- task: :engine:invoke
|
|
26
22
|
vars:
|
|
@@ -29,8 +25,6 @@ tasks:
|
|
|
29
25
|
clear:
|
|
30
26
|
desc: "Clear the active ordered-plan sequence (#2402)"
|
|
31
27
|
dir: '{{.USER_WORKING_DIR}}'
|
|
32
|
-
deps:
|
|
33
|
-
- task: :engine:_ts-build
|
|
34
28
|
cmds:
|
|
35
29
|
- task: :engine:invoke
|
|
36
30
|
vars:
|
|
@@ -39,8 +33,6 @@ tasks:
|
|
|
39
33
|
advance:
|
|
40
34
|
desc: "Mark current entry complete and advance the ordered-plan index (#2402)"
|
|
41
35
|
dir: '{{.USER_WORKING_DIR}}'
|
|
42
|
-
deps:
|
|
43
|
-
- task: :engine:_ts-build
|
|
44
36
|
cmds:
|
|
45
37
|
- task: :engine:invoke
|
|
46
38
|
vars:
|
|
@@ -25,8 +25,6 @@ tasks:
|
|
|
25
25
|
# retired `python -m scripts.policy` launcher is gone.
|
|
26
26
|
desc: "Inspect every registered typed-policy field on vbrief/PROJECT-DEFINITION.vbrief.json (#1148 / N8). -- task policy:show [-- --format=json] [--changed-only] [--field=<name>]"
|
|
27
27
|
dir: '{{.USER_WORKING_DIR}}'
|
|
28
|
-
deps:
|
|
29
|
-
- task: :engine:_ts-build
|
|
30
28
|
cmds:
|
|
31
29
|
- task: :engine:invoke
|
|
32
30
|
vars:
|
|
@@ -35,8 +33,6 @@ tasks:
|
|
|
35
33
|
enforce-branches:
|
|
36
34
|
desc: "Set plan.policy.allowDirectCommitsToMaster=false (enforce feature branches). Audits to meta/policy-changes.log. (#746)"
|
|
37
35
|
dir: '{{.USER_WORKING_DIR}}'
|
|
38
|
-
deps:
|
|
39
|
-
- task: :engine:_ts-build
|
|
40
36
|
cmds:
|
|
41
37
|
- task: :engine:invoke
|
|
42
38
|
vars:
|
|
@@ -45,8 +41,6 @@ tasks:
|
|
|
45
41
|
allow-direct-commits:
|
|
46
42
|
desc: "Set plan.policy.allowDirectCommitsToMaster=true (capability-cost: branch-protection OFF). Requires --confirm to apply. (#746)"
|
|
47
43
|
dir: '{{.USER_WORKING_DIR}}'
|
|
48
|
-
deps:
|
|
49
|
-
- task: :engine:_ts-build
|
|
50
44
|
cmds:
|
|
51
45
|
- task: :engine:invoke
|
|
52
46
|
vars:
|
|
@@ -55,8 +49,6 @@ tasks:
|
|
|
55
49
|
allow-destructive-gh-verbs:
|
|
56
50
|
desc: "Set plan.policy.allowDestructiveGhVerbs=true (capability-cost: #1019 preflight-gh OFF). Requires --confirm to apply. (#4384)"
|
|
57
51
|
dir: '{{.USER_WORKING_DIR}}'
|
|
58
|
-
deps:
|
|
59
|
-
- task: :engine:_ts-build
|
|
60
52
|
cmds:
|
|
61
53
|
- task: :engine:invoke
|
|
62
54
|
vars:
|
|
@@ -65,8 +57,6 @@ tasks:
|
|
|
65
57
|
enforce-destructive-gh-verbs:
|
|
66
58
|
desc: "Set plan.policy.allowDestructiveGhVerbs=false (enforce #1019 preflight-gh). Audits to meta/policy-changes.log. (#4384)"
|
|
67
59
|
dir: '{{.USER_WORKING_DIR}}'
|
|
68
|
-
deps:
|
|
69
|
-
- task: :engine:_ts-build
|
|
70
60
|
cmds:
|
|
71
61
|
- task: :engine:invoke
|
|
72
62
|
vars:
|
|
@@ -75,8 +65,6 @@ tasks:
|
|
|
75
65
|
enable-value-feedback:
|
|
76
66
|
desc: "Opt in to value-feedback surfaces (#1709). Requires --confirm after the capability-cost disclosure prints. -- task policy:enable-value-feedback -- [--confirm] [--json]"
|
|
77
67
|
dir: '{{.USER_WORKING_DIR}}'
|
|
78
|
-
deps:
|
|
79
|
-
- task: :engine:_ts-build
|
|
80
68
|
cmds:
|
|
81
69
|
- task: :engine:invoke
|
|
82
70
|
vars:
|
|
@@ -85,8 +73,6 @@ tasks:
|
|
|
85
73
|
disable-host-hooks:
|
|
86
74
|
desc: "Disable plan.policy.hostHooks.<host> (capability-cost: deft-hook guardrails removed; tracked). Requires --host and --confirm. -- task policy:disable-host-hooks -- --host <claude|cursor|grok|codex> --confirm"
|
|
87
75
|
dir: '{{.USER_WORKING_DIR}}'
|
|
88
|
-
deps:
|
|
89
|
-
- task: :engine:_ts-build
|
|
90
76
|
cmds:
|
|
91
77
|
- task: :engine:invoke
|
|
92
78
|
vars:
|
|
@@ -95,8 +81,6 @@ tasks:
|
|
|
95
81
|
clear-value-feedback:
|
|
96
82
|
desc: "Remove typed plan.policy.valueFeedback so trusted-org repos return to org-auto resolution (#2822). -- task policy:clear-value-feedback"
|
|
97
83
|
dir: '{{.USER_WORKING_DIR}}'
|
|
98
|
-
deps:
|
|
99
|
-
- task: :engine:_ts-build
|
|
100
84
|
cmds:
|
|
101
85
|
- task: :engine:invoke
|
|
102
86
|
vars:
|
|
@@ -105,8 +89,6 @@ tasks:
|
|
|
105
89
|
set-spec-guard-enforcement:
|
|
106
90
|
desc: "Promote plan.policy.specGuard.driftGuard.enforcement advise|shadow|enforce (#5350). Requires --set and --confirm. Refuse advise→enforce skip without shadow attestation. -- task policy:set-spec-guard-enforcement -- --set shadow|enforce --confirm"
|
|
107
91
|
dir: '{{.USER_WORKING_DIR}}'
|
|
108
|
-
deps:
|
|
109
|
-
- task: :engine:_ts-build
|
|
110
92
|
cmds:
|
|
111
93
|
- task: :engine:invoke
|
|
112
94
|
vars:
|
|
@@ -115,8 +97,6 @@ tasks:
|
|
|
115
97
|
wip-cap:
|
|
116
98
|
desc: "Set plan.policy.wipCap=N (#1124 / D4 of #1119). Requires --set N --confirm. Default cap is 20 (#2319; raised from the original 10 per umbrella #1119 Current Shape v3)."
|
|
117
99
|
dir: '{{.USER_WORKING_DIR}}'
|
|
118
|
-
deps:
|
|
119
|
-
- task: :engine:_ts-build
|
|
120
100
|
cmds:
|
|
121
101
|
- task: :engine:invoke
|
|
122
102
|
vars:
|
|
@@ -125,8 +105,6 @@ tasks:
|
|
|
125
105
|
subagent-backend:
|
|
126
106
|
desc: "DEPRECATED (superseded by `task swarm:routing-set`, #1739). Was: Set plan.policy.swarmSubagentBackend (#1531a). -- task policy:subagent-backend -- --set composer|grok-build|cursor-cloud"
|
|
127
107
|
dir: '{{.USER_WORKING_DIR}}'
|
|
128
|
-
deps:
|
|
129
|
-
- task: :engine:_ts-build
|
|
130
108
|
cmds:
|
|
131
109
|
- cmd: echo "[deft deprecation] task policy:subagent-backend is superseded by 'task swarm:routing-set' (#1739). The swarmSubagentBackend enum is no longer the active routing surface." 1>&2
|
|
132
110
|
silent: true
|
|
@@ -137,8 +115,6 @@ tasks:
|
|
|
137
115
|
subagent-backends:
|
|
138
116
|
desc: "DEPRECATED (superseded by `task swarm:routing-set` / `task verify:routing`, #1739). Was: Probe sub-agent backend ids, role capabilities, and availability (#1531a). -- task policy:subagent-backends [-- --format=json]"
|
|
139
117
|
dir: '{{.USER_WORKING_DIR}}'
|
|
140
|
-
deps:
|
|
141
|
-
- task: :engine:_ts-build
|
|
142
118
|
cmds:
|
|
143
119
|
- cmd: echo "[deft deprecation] task policy:subagent-backends is superseded by 'task verify:routing -- --advise' and 'task swarm:routing-set' (#1739). The swarmSubagentBackend enum is no longer the active routing surface." 1>&2
|
|
144
120
|
silent: true
|
|
@@ -21,7 +21,6 @@ vars:
|
|
|
21
21
|
tasks:
|
|
22
22
|
check-protected-issues:
|
|
23
23
|
desc: "Verify NO protected (umbrella / staying-OPEN) issue is GitHub-side linked to a PR before squash merge (#701)"
|
|
24
|
-
deps: [":engine:_ts-build"]
|
|
25
24
|
dir: '{{.USER_WORKING_DIR}}'
|
|
26
25
|
cmds:
|
|
27
26
|
- task: :engine:invoke
|
|
@@ -40,7 +39,6 @@ tasks:
|
|
|
40
39
|
check-closing-keywords:
|
|
41
40
|
desc: "Scan PR body + commits for closing-keyword FP contexts (#737) and unallowlisted real closes / intent mode (#3015 class D). Default --mode both."
|
|
42
41
|
dir: '{{.USER_WORKING_DIR}}'
|
|
43
|
-
deps: [":engine:_ts-build"]
|
|
44
42
|
env:
|
|
45
43
|
PYTHONUTF8: "1"
|
|
46
44
|
cmds:
|
|
@@ -59,7 +57,6 @@ tasks:
|
|
|
59
57
|
# Companion test: tests/cli/test_pr_merge_readiness.py
|
|
60
58
|
merge-ready:
|
|
61
59
|
desc: "Verify a PR's Greptile review body satisfies the merge exit condition (confidence >3, no P0/P1, HEAD-SHA fresh, not errored)"
|
|
62
|
-
deps: [":engine:_ts-build"]
|
|
63
60
|
dir: '{{.USER_WORKING_DIR}}'
|
|
64
61
|
cmds:
|
|
65
62
|
- task: :engine:invoke
|
|
@@ -88,7 +85,6 @@ tasks:
|
|
|
88
85
|
# Companion test: tests/cli/test_pr_wait_mergeable.py
|
|
89
86
|
wait-mergeable-and-merge:
|
|
90
87
|
desc: "Wait until PR is mergeable (resilient cascade, #1368) and squash-merge with admin (#1369); Layer-3 protected-issue check (#701) chains before any merge call"
|
|
91
|
-
deps: [":engine:_ts-build"]
|
|
92
88
|
dir: '{{.USER_WORKING_DIR}}'
|
|
93
89
|
cmds:
|
|
94
90
|
- task: :engine:invoke
|
|
@@ -117,7 +113,6 @@ tasks:
|
|
|
117
113
|
# Companion tests: packages/core/src/pr-watch/*.test.ts
|
|
118
114
|
watch:
|
|
119
115
|
desc: "Blocking poll of a PR to a terminal three-state verdict (0 CLEAN / 1 NEW_P0_P1 / 2 ERRORED|STALL|TIMEOUT|config); --one-shot for a single probe (#1056)"
|
|
120
|
-
deps: [":engine:_ts-build"]
|
|
121
116
|
dir: '{{.USER_WORKING_DIR}}'
|
|
122
117
|
cmds:
|
|
123
118
|
- task: :engine:invoke
|
|
@@ -133,7 +128,6 @@ tasks:
|
|
|
133
128
|
# Contract: content/contracts/finish-loop.md
|
|
134
129
|
finish-loop:
|
|
135
130
|
desc: "Walk-away PR finish loop: grant gate + pr:watch until CLEAN; exit 1 address / human-merge; exit 2 BLOCKED without grant (#871)"
|
|
136
|
-
deps: [":engine:_ts-build"]
|
|
137
131
|
dir: '{{.USER_WORKING_DIR}}'
|
|
138
132
|
cmds:
|
|
139
133
|
- task: :engine:invoke
|
|
@@ -27,8 +27,6 @@ tasks:
|
|
|
27
27
|
stakeholder-safe narratives into a human-readable PRD.md. Explicit --spec remains
|
|
28
28
|
supported. PRD.md is never authoritative -- the resolved xBRIEF is the source of truth.
|
|
29
29
|
dir: '{{.USER_WORKING_DIR}}'
|
|
30
|
-
deps:
|
|
31
|
-
- task: :engine:_ts-build
|
|
32
30
|
cmds:
|
|
33
31
|
- task: :engine:invoke
|
|
34
32
|
vars:
|