@deftai/directive 0.119.12 → 0.120.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/authz.js +41 -7
- package/dist/changelog-check.js +14 -6
- package/dist/check.js +5 -0
- package/dist/dispatch.d.ts +2 -2
- package/dist/dispatch.js +21 -0
- package/dist/init-cli/update.js +7 -0
- package/dist/ownership-doctor.d.ts +10 -0
- package/dist/ownership-doctor.js +96 -0
- package/dist/ownership-fix.d.ts +10 -0
- package/dist/ownership-fix.js +93 -0
- package/dist/pre-pr-run.d.ts +39 -0
- package/dist/pre-pr-run.js +514 -0
- package/dist/vbrief-preflight.js +6 -0
- package/dist/verify-completed-tracked.d.ts +4 -1
- package/dist/verify-completed-tracked.js +60 -9
- package/dist/verify-consumer-header-placeholder.d.ts +12 -0
- package/dist/verify-consumer-header-placeholder.js +73 -0
- package/dist/verify-ownership.d.ts +10 -0
- package/dist/verify-ownership.js +90 -0
- package/dist/verify-persisted-planning-narratives.d.ts +12 -0
- package/dist/verify-persisted-planning-narratives.js +82 -0
- package/dist/verify-review-monitor.js +40 -11
- package/dist/wsl-ownership-guard.d.ts +2 -0
- package/dist/wsl-ownership-guard.js +15 -0
- package/package.json +3 -3
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI for verify:consumer-header-placeholder (#4544 Prefer-A).
|
|
4
|
+
*
|
|
5
|
+
* Fail closed when product-mutation completion still leaves the unmanaged
|
|
6
|
+
* AGENTS.md header on the exact scaffold edit-me placeholder. Process-only
|
|
7
|
+
* and custom headers pass. Returned failure only.
|
|
8
|
+
*/
|
|
9
|
+
import { resolve } from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { evaluateConsumerHeaderPlaceholderAtRoot } from "@deftai/directive-core/check";
|
|
12
|
+
function takeProjectRootValue(argv, index) {
|
|
13
|
+
const next = argv[index + 1];
|
|
14
|
+
if (next === undefined || next.length === 0 || next.startsWith("-")) {
|
|
15
|
+
return { error: "argument --project-root: expected one argument", next: index };
|
|
16
|
+
}
|
|
17
|
+
return { value: next, next: index + 1 };
|
|
18
|
+
}
|
|
19
|
+
/** Parse verify-consumer-header-placeholder CLI args. */
|
|
20
|
+
export function parseArgs(argv) {
|
|
21
|
+
const parsed = {
|
|
22
|
+
projectRoot: ".",
|
|
23
|
+
quiet: false,
|
|
24
|
+
};
|
|
25
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
26
|
+
const arg = argv[i];
|
|
27
|
+
if (arg === "--quiet") {
|
|
28
|
+
parsed.quiet = true;
|
|
29
|
+
}
|
|
30
|
+
else if (arg === "--project-root") {
|
|
31
|
+
const taken = takeProjectRootValue(argv, i);
|
|
32
|
+
if (taken.error !== undefined) {
|
|
33
|
+
return { ...parsed, error: taken.error };
|
|
34
|
+
}
|
|
35
|
+
parsed.projectRoot = taken.value ?? parsed.projectRoot;
|
|
36
|
+
i = taken.next;
|
|
37
|
+
}
|
|
38
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
39
|
+
const value = arg.slice("--project-root=".length);
|
|
40
|
+
if (value.length === 0 || value.startsWith("-")) {
|
|
41
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
42
|
+
}
|
|
43
|
+
parsed.projectRoot = value;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
/** Run the gate and return the process exit code. */
|
|
52
|
+
export function run(argv) {
|
|
53
|
+
const args = parseArgs(argv);
|
|
54
|
+
if (args.error !== undefined) {
|
|
55
|
+
process.stderr.write(`verify_consumer_header_placeholder: ${args.error}\n`);
|
|
56
|
+
return 2;
|
|
57
|
+
}
|
|
58
|
+
const projectRoot = resolve(args.projectRoot);
|
|
59
|
+
const result = evaluateConsumerHeaderPlaceholderAtRoot(projectRoot);
|
|
60
|
+
if (result.message.length > 0 && !args.quiet) {
|
|
61
|
+
if (result.ok) {
|
|
62
|
+
process.stdout.write(`${result.message}\n`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
process.stderr.write(`${result.message}\n`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return result.ok ? 0 : 1;
|
|
69
|
+
}
|
|
70
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
71
|
+
process.exit(run(process.argv.slice(2)));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=verify-consumer-header-placeholder.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export interface VerifyOwnershipArgs {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
json: boolean;
|
|
5
|
+
owner: string | null;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseArgs(argv: readonly string[]): VerifyOwnershipArgs;
|
|
9
|
+
export declare function run(argv: readonly string[]): number;
|
|
10
|
+
//# sourceMappingURL=verify-ownership.d.ts.map
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* verify:ownership / verify-ownership (#1617)
|
|
4
|
+
* Fail-closed check for WSL root-runtime ownership mismatch.
|
|
5
|
+
*/
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
import { assertProtectedMutationOwnership, evaluateWslOwnershipGuard, ownershipGuardToDict, } from "@deftai/directive-core/platform";
|
|
8
|
+
import { isDirectEntrypoint } from "./entrypoint.js";
|
|
9
|
+
export function parseArgs(argv) {
|
|
10
|
+
const parsed = {
|
|
11
|
+
projectRoot: ".",
|
|
12
|
+
json: false,
|
|
13
|
+
owner: null,
|
|
14
|
+
};
|
|
15
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
16
|
+
const arg = argv[i];
|
|
17
|
+
if (arg === "--") {
|
|
18
|
+
}
|
|
19
|
+
else if (arg === "--json") {
|
|
20
|
+
parsed.json = true;
|
|
21
|
+
}
|
|
22
|
+
else if (arg === "--project-root") {
|
|
23
|
+
const value = argv[i + 1];
|
|
24
|
+
if (value === undefined) {
|
|
25
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
26
|
+
}
|
|
27
|
+
parsed.projectRoot = value;
|
|
28
|
+
i += 1;
|
|
29
|
+
}
|
|
30
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
31
|
+
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
32
|
+
}
|
|
33
|
+
else if (arg === "--owner") {
|
|
34
|
+
const value = argv[i + 1];
|
|
35
|
+
if (value === undefined) {
|
|
36
|
+
return { ...parsed, error: "argument --owner: expected uid:gid" };
|
|
37
|
+
}
|
|
38
|
+
parsed.owner = value;
|
|
39
|
+
i += 1;
|
|
40
|
+
}
|
|
41
|
+
else if (arg?.startsWith("--owner=")) {
|
|
42
|
+
parsed.owner = arg.slice("--owner=".length);
|
|
43
|
+
}
|
|
44
|
+
else if (arg === "--help" || arg === "-h") {
|
|
45
|
+
return { ...parsed, error: "__help__" };
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
const HELP = "usage: deft verify:ownership [--project-root PATH] [--owner uid:gid] [--json]\n" +
|
|
54
|
+
"Fail closed when WSL root runtime can create root-owned project files (#1617).\n" +
|
|
55
|
+
"Native Windows/macOS always pass. Mount-pinned DrvFs/9p without metadata passes.\n";
|
|
56
|
+
export function run(argv) {
|
|
57
|
+
const args = parseArgs(argv);
|
|
58
|
+
if (args.error === "__help__") {
|
|
59
|
+
process.stdout.write(HELP);
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
if (args.error !== undefined) {
|
|
63
|
+
process.stderr.write(`verify:ownership: ${args.error}\n`);
|
|
64
|
+
return 2;
|
|
65
|
+
}
|
|
66
|
+
const projectRoot = resolve(args.projectRoot);
|
|
67
|
+
const seams = { projectRoot, explicitOwner: args.owner };
|
|
68
|
+
const gate = assertProtectedMutationOwnership(seams);
|
|
69
|
+
if (args.json) {
|
|
70
|
+
process.stdout.write(`${JSON.stringify(ownershipGuardToDict(gate.verdict), null, 2)}\n`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
process.stdout.write(`${gate.message}\n`);
|
|
74
|
+
}
|
|
75
|
+
if (!gate.ok)
|
|
76
|
+
return gate.exitCode;
|
|
77
|
+
// Also surface soft warn / override without failing when not blocked.
|
|
78
|
+
const soft = evaluateWslOwnershipGuard(seams);
|
|
79
|
+
if (soft.status === "warn" || soft.status === "exempt-override") {
|
|
80
|
+
if (!args.json) {
|
|
81
|
+
for (const line of soft.sessionWarnLines)
|
|
82
|
+
process.stderr.write(`${line}\n`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
if (isDirectEntrypoint(import.meta.url)) {
|
|
88
|
+
process.exit(run(process.argv.slice(2)));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=verify-ownership.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
checkConjunct: boolean;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Parse verify:persisted-planning-narratives CLI args (#5176). */
|
|
8
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
9
|
+
/** Run the Prefer-A first-ship planning-narrative bar. */
|
|
10
|
+
export declare function run(argv: string[]): number;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=verify-persisted-planning-narratives.d.ts.map
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI for verify:persisted-planning-narratives (#5176 Prefer-A).
|
|
4
|
+
*
|
|
5
|
+
* Default mode is the unconditional setup Phase 2 bar. `--check-conjunct`
|
|
6
|
+
* mirrors the in-process deft check Prefer-A gate (marker present/unreadable +
|
|
7
|
+
* empty Overview/tech stack → refuse; missing PD / no marker → pass) so
|
|
8
|
+
* Taskfile aggregates like check:merge / check:consumer cannot bypass it.
|
|
9
|
+
*/
|
|
10
|
+
import { resolve } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { checkRejectsEmptyPlanningNarratives, evaluateCheckPersistedPlanningNarratives, } from "@deftai/directive-core/check";
|
|
13
|
+
import { evaluatePersistedPlanningNarratives } from "@deftai/directive-core/project";
|
|
14
|
+
/** Parse verify:persisted-planning-narratives CLI args (#5176). */
|
|
15
|
+
export function parseArgs(argv) {
|
|
16
|
+
const parsed = { projectRoot: ".", checkConjunct: false };
|
|
17
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
18
|
+
const arg = argv[i];
|
|
19
|
+
if (arg === "--project-root") {
|
|
20
|
+
const value = argv[i + 1];
|
|
21
|
+
if (value === undefined) {
|
|
22
|
+
return { ...parsed, error: "argument --project-root: expected one argument" };
|
|
23
|
+
}
|
|
24
|
+
parsed.projectRoot = value;
|
|
25
|
+
i += 1;
|
|
26
|
+
}
|
|
27
|
+
else if (arg?.startsWith("--project-root=")) {
|
|
28
|
+
parsed.projectRoot = arg.slice("--project-root=".length);
|
|
29
|
+
}
|
|
30
|
+
else if (arg === "--check-conjunct") {
|
|
31
|
+
parsed.checkConjunct = true;
|
|
32
|
+
}
|
|
33
|
+
else if (arg === "--help" || arg === "-h") {
|
|
34
|
+
process.stdout.write("usage: verify:persisted-planning-narratives [--project-root PATH] [--check-conjunct]\n\n" +
|
|
35
|
+
"Fail closed when every tracked PROJECT-DEFINITION planning narrative\n" +
|
|
36
|
+
"(Overview + tech stack) is empty/whitespace (#5176 Prefer-A).\n" +
|
|
37
|
+
"Default: unconditional setup Phase 2 bar (missing PD → exit 2).\n" +
|
|
38
|
+
"--check-conjunct: Taskfile/check Prefer-A mirror (marker + empty →\n" +
|
|
39
|
+
"refuse; missing PD / no marker → pass). Reuse deft project:write-narratives.\n");
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return { ...parsed, error: `unrecognized argument: ${arg}` };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
/** Run the Prefer-A first-ship planning-narrative bar. */
|
|
49
|
+
export function run(argv) {
|
|
50
|
+
const args = parseArgs(argv);
|
|
51
|
+
if (args.error !== undefined) {
|
|
52
|
+
process.stderr.write(`verify:persisted-planning-narratives: ${args.error}\n`);
|
|
53
|
+
return 2;
|
|
54
|
+
}
|
|
55
|
+
const projectRoot = resolve(args.projectRoot);
|
|
56
|
+
if (args.checkConjunct) {
|
|
57
|
+
const planning = evaluateCheckPersistedPlanningNarratives(projectRoot);
|
|
58
|
+
if (checkRejectsEmptyPlanningNarratives(planning.narratives, planning.productMutation)) {
|
|
59
|
+
process.stderr.write(`${planning.narratives.message}\n`);
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
if (planning.narratives.ok) {
|
|
63
|
+
process.stdout.write(`${planning.narratives.message}\n`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.stdout.write("verify:persisted-planning-narratives --check-conjunct: pass " +
|
|
67
|
+
`(${planning.narratives.cause}; Prefer-A check conjunct does not refuse)\n`);
|
|
68
|
+
}
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
const result = evaluatePersistedPlanningNarratives(projectRoot);
|
|
72
|
+
if (result.ok) {
|
|
73
|
+
process.stdout.write(`${result.message}\n`);
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
process.stderr.write(`${result.message}\n`);
|
|
77
|
+
return result.code;
|
|
78
|
+
}
|
|
79
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
80
|
+
process.exit(run(process.argv.slice(2)));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=verify-persisted-planning-narratives.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { bindLivePhaseCorrectWait, evaluateMergePathArm, } from "@deftai/directive-core/dist/pr-watch/main.js";
|
|
5
|
-
import { EXIT_CONFIG_ERROR, EXIT_NOT_READY, evaluateReviewMonitorGate, isTier1, REVIEW_MONITOR_HELP, verifyResultToJson, } from "@deftai/directive-core/review-monitor";
|
|
5
|
+
import { EXIT_CONFIG_ERROR, EXIT_NOT_READY, evaluateReviewMonitorGate, formatApproach1BabysitterOneLiner, isTier1, REVIEW_MONITOR_HELP, spawnRedirect, verifyResultToJson, } from "@deftai/directive-core/review-monitor";
|
|
6
6
|
const CALL_SITES = new Set([
|
|
7
7
|
"solo",
|
|
8
8
|
"swarm-phase5-6",
|
|
@@ -134,15 +134,20 @@ export function run(argv) {
|
|
|
134
134
|
const args = parseVerifyReviewMonitorArgs(argv);
|
|
135
135
|
if (args.help) {
|
|
136
136
|
process.stdout.write(REVIEW_MONITOR_HELP);
|
|
137
|
-
process.stdout.write("\n#4882 / #5020 merge-path arm observer (optional):\n" +
|
|
137
|
+
process.stdout.write("\n#4882 / #5020 / #5219 merge-path arm observer (optional):\n" +
|
|
138
138
|
" --merge-path-arm Fail closed when neither live wait nor explicit finish\n" +
|
|
139
139
|
" --live-wait Require still-running wait evidence for this PR\n" +
|
|
140
140
|
" (Tier 1: lease + active polling heartbeat with pid liveness;\n" +
|
|
141
|
-
" lease+flag alone is not armed — #5020)
|
|
141
|
+
" lease+flag alone is not armed — #5020).\n" +
|
|
142
|
+
" On spawn_subagent hosts, lease platform_primitive must be\n" +
|
|
143
|
+
" spawn_subagent and heartbeat parent_id must match the lease\n" +
|
|
144
|
+
" monitor_agent_id, or pr-wait-mergeable only after local\n" +
|
|
145
|
+
" pr:watch CLEAN attestation — #5219;\n" +
|
|
146
|
+
" parent-shell pr:watch (parent_id=pr-watch) does not arm.\n" +
|
|
142
147
|
" --explicit-finish Attest option-C BLOCKED/FAILED finish for this PR\n" +
|
|
143
148
|
" --sticky-lease Attest a fresh sticky lease (not sufficient alone)\n" +
|
|
144
|
-
" Prefer Approach 1 / native pr:watch or post-CLEAN
|
|
145
|
-
" homemade line-parsed --json is not an arm.\n");
|
|
149
|
+
" Prefer Approach 1 / native pr:watch --monitor-agent-id <id> or post-CLEAN\n" +
|
|
150
|
+
" pr:wait-mergeable-and-merge; homemade line-parsed --json is not an arm.\n");
|
|
146
151
|
return 0;
|
|
147
152
|
}
|
|
148
153
|
if (args.error !== undefined) {
|
|
@@ -170,6 +175,7 @@ export function run(argv) {
|
|
|
170
175
|
let arm = null;
|
|
171
176
|
if (args.mergePathArm) {
|
|
172
177
|
// Bind --live-wait to lease (#5018) + process-liveness heartbeat (#5020) on Tier 1.
|
|
178
|
+
// spawn_subagent identity join is already applied in evaluateReviewMonitorGate (#5219).
|
|
173
179
|
const leaseEvidence = result.monitorRecord !== null;
|
|
174
180
|
const liveBind = bindLivePhaseCorrectWait({
|
|
175
181
|
liveWaitFlag: args.liveWait,
|
|
@@ -183,15 +189,38 @@ export function run(argv) {
|
|
|
183
189
|
explicitFinish: args.explicitFinish,
|
|
184
190
|
stickyLeaseActive: args.stickyLease || leaseEvidence,
|
|
185
191
|
});
|
|
186
|
-
if (args.liveWait &&
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
192
|
+
if (args.liveWait && !liveBind.livePhaseCorrectWait && !args.explicitFinish && !arm.armed) {
|
|
193
|
+
const spawnHost = result.tier.primitive === "spawn_subagent";
|
|
194
|
+
const lease = result.monitorRecord;
|
|
195
|
+
let message = liveBind.message;
|
|
196
|
+
if (spawnHost && lease !== null && lease.platform_primitive !== "spawn_subagent") {
|
|
197
|
+
message =
|
|
198
|
+
`unarmed stand-down: Tier-1 spawn_subagent requires lease ` +
|
|
199
|
+
`platform_primitive=spawn_subagent for PR #${args.pr} (#5219); ` +
|
|
200
|
+
`got ${lease.platform_primitive}.\n` +
|
|
201
|
+
` ${spawnRedirect(result.tier)}`;
|
|
202
|
+
}
|
|
203
|
+
else if (spawnHost &&
|
|
204
|
+
lease !== null &&
|
|
205
|
+
lease.platform_primitive === "spawn_subagent" &&
|
|
206
|
+
liveBind.reason === "missing_process_liveness") {
|
|
207
|
+
message =
|
|
208
|
+
`unarmed stand-down: --live-wait for PR #${args.pr} has spawn_subagent lease ` +
|
|
209
|
+
`(monitor_agent_id=${lease.monitor_agent_id}) but no child-bound wait identity ` +
|
|
210
|
+
`(heartbeat parent_id must match monitor_agent_id, or pr-wait-mergeable after ` +
|
|
211
|
+
`pr:watch CLEAN attestation; start child pr:watch before verify; ` +
|
|
212
|
+
`parent-shell pr:watch does not arm) (#5219).\n` +
|
|
213
|
+
` Cheaper path:\n` +
|
|
214
|
+
` ${formatApproach1BabysitterOneLiner(args.pr, lease.monitor_agent_id)}\n` +
|
|
215
|
+
` ${spawnRedirect(result.tier)}`;
|
|
216
|
+
}
|
|
217
|
+
else if (message === null) {
|
|
218
|
+
message = arm.message;
|
|
219
|
+
}
|
|
191
220
|
arm = {
|
|
192
221
|
armed: false,
|
|
193
222
|
reason: "unarmed_stand_down",
|
|
194
|
-
message
|
|
223
|
+
message,
|
|
195
224
|
};
|
|
196
225
|
}
|
|
197
226
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared live WSL ownership gate for protected mutating CLI entry points (#1617).
|
|
3
|
+
* Independent of ritual/doctor cache. ownership:doctor/fix are not gated here.
|
|
4
|
+
*/
|
|
5
|
+
import { assertProtectedMutationOwnership } from "@deftai/directive-core/platform";
|
|
6
|
+
export function refuseIfWslOwnershipBlocked(projectRoot, writeErr = (text) => {
|
|
7
|
+
process.stderr.write(text);
|
|
8
|
+
}) {
|
|
9
|
+
const gate = assertProtectedMutationOwnership({ projectRoot });
|
|
10
|
+
if (gate.ok)
|
|
11
|
+
return null;
|
|
12
|
+
writeErr(`${gate.message}\n`);
|
|
13
|
+
return gate.exitCode;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=wsl-ownership-guard.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.120.0",
|
|
4
4
|
"description": "Directive CLI — npm install path for the Deft Directive framework.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://deftai.github.io/directive/",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"provenance": true
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@deftai/directive-core": "^0.
|
|
39
|
-
"@deftai/directive-content": "^0.
|
|
38
|
+
"@deftai/directive-core": "^0.120.0",
|
|
39
|
+
"@deftai/directive-content": "^0.120.0"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsc -b",
|