@deftai/directive-core 0.87.0 → 0.88.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/cache/scanner.d.ts +11 -1
- package/dist/cache/scanner.js +29 -4
- package/dist/check/gate-lists.js +1 -0
- package/dist/content-contracts/skills/helpers.d.ts +10 -0
- package/dist/content-contracts/skills/helpers.js +35 -0
- package/dist/deposit/copy-tree.d.ts +19 -1
- package/dist/deposit/copy-tree.js +134 -5
- package/dist/doctor/main.js +48 -0
- package/dist/fs/projection-containment.d.ts +18 -0
- package/dist/fs/projection-containment.js +40 -0
- package/dist/hooks/dispatcher.d.ts +15 -3
- package/dist/hooks/dispatcher.js +149 -6
- package/dist/hooks/tools.d.ts +31 -0
- package/dist/hooks/tools.js +74 -0
- package/dist/init-deposit/agent-hooks.d.ts +1 -1
- package/dist/init-deposit/agent-hooks.js +38 -2
- package/dist/init-deposit/hygiene.d.ts +16 -0
- package/dist/init-deposit/hygiene.js +26 -0
- package/dist/init-deposit/init-dispatch.js +28 -0
- package/dist/init-deposit/prettierignore.js +2 -2
- package/dist/init-deposit/refresh.js +38 -7
- package/dist/init-deposit/scaffold.js +7 -3
- package/dist/init-deposit/xbrief-projections.js +6 -6
- package/dist/intake/issue-ingest.js +11 -2
- package/dist/packs/pack-render.d.ts +33 -0
- package/dist/packs/pack-render.js +155 -9
- package/dist/packs/quarantine-ext.d.ts +10 -0
- package/dist/packs/quarantine-ext.js +26 -2
- package/dist/policy/index.d.ts +1 -0
- package/dist/policy/index.js +1 -0
- package/dist/policy/no-deft-directive.d.ts +59 -0
- package/dist/policy/no-deft-directive.js +103 -0
- package/dist/policy/org-force-on-migration.d.ts +52 -0
- package/dist/policy/org-force-on-migration.js +260 -22
- package/dist/policy/runtime-authority.d.ts +41 -0
- package/dist/policy/runtime-authority.js +274 -0
- package/dist/session/session-start-hook.d.ts +3 -0
- package/dist/session/session-start-hook.js +15 -0
- package/dist/session/session-start.js +30 -0
- package/dist/verify-source/cursor-tier1.js +7 -2
- package/dist/verify-source/openclaw-tier1.js +7 -2
- package/package.json +4 -3
|
@@ -177,4 +177,278 @@ export function evaluateRuntimeAuthorityDirectWrite(input) {
|
|
|
177
177
|
}
|
|
178
178
|
return { allowed: true, reason: null, code: null };
|
|
179
179
|
}
|
|
180
|
+
/** True when token is a shell env assignment (FOO=1 / FOO=). Linear; no nested quantifiers. */
|
|
181
|
+
function isShellEnvAssignToken(token) {
|
|
182
|
+
const eq = token.indexOf("=");
|
|
183
|
+
if (eq <= 0)
|
|
184
|
+
return false;
|
|
185
|
+
const name = token.slice(0, eq);
|
|
186
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
|
|
187
|
+
return false;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Normalize a shell token for classification (#2711).
|
|
192
|
+
* Shell strips quotes, empty quote pairs, and backslash escapes before exec
|
|
193
|
+
* (`g''it` / `g\it` / `'push'` → `git` / `push`). Dropping `'`/`"`/`\` after
|
|
194
|
+
* whitespace split closes those bypasses without nested-quantifier regex. O(n).
|
|
195
|
+
*/
|
|
196
|
+
function normalizeShellToken(token) {
|
|
197
|
+
return token.replace(/['"\\]/g, "");
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Split a shell command into list/pipeline/newline segments without splitting
|
|
201
|
+
* on separators that appear inside quotes or after a backslash escape (#2711).
|
|
202
|
+
* Prevents `printf '%s' ';' 'git push'` and `hello\; git push` false denials.
|
|
203
|
+
*/
|
|
204
|
+
function splitShellSegments(command) {
|
|
205
|
+
const segments = [];
|
|
206
|
+
let cur = "";
|
|
207
|
+
let quote = null;
|
|
208
|
+
for (let i = 0; i < command.length; i++) {
|
|
209
|
+
const c = command[i];
|
|
210
|
+
if (c === undefined)
|
|
211
|
+
break;
|
|
212
|
+
if (quote !== null) {
|
|
213
|
+
if (c === quote)
|
|
214
|
+
quote = null;
|
|
215
|
+
cur += c;
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
// Outside quotes: backslash escapes the next character (including separators).
|
|
219
|
+
if (c === "\\" && i + 1 < command.length) {
|
|
220
|
+
cur += c;
|
|
221
|
+
cur += command[i + 1] ?? "";
|
|
222
|
+
i++;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (c === "'" || c === '"') {
|
|
226
|
+
quote = c;
|
|
227
|
+
cur += c;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
// Outside quotes: list/pipeline separators and newlines start a new segment.
|
|
231
|
+
if (c === "&" && command[i + 1] === "&") {
|
|
232
|
+
segments.push(cur);
|
|
233
|
+
cur = "";
|
|
234
|
+
i++;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (c === "|" && command[i + 1] === "|") {
|
|
238
|
+
segments.push(cur);
|
|
239
|
+
cur = "";
|
|
240
|
+
i++;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (c === ";" || c === "|" || c === "&" || c === "\n" || c === "\r") {
|
|
244
|
+
segments.push(cur);
|
|
245
|
+
cur = "";
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
cur += c;
|
|
249
|
+
}
|
|
250
|
+
segments.push(cur);
|
|
251
|
+
return segments;
|
|
252
|
+
}
|
|
253
|
+
/** Git global options that take a separate value token (not `--opt=value`). */
|
|
254
|
+
const GIT_GLOBAL_VALUE_OPTS = new Set([
|
|
255
|
+
"-C",
|
|
256
|
+
"-c",
|
|
257
|
+
"--git-dir",
|
|
258
|
+
"--work-tree",
|
|
259
|
+
"--namespace",
|
|
260
|
+
"--config-env",
|
|
261
|
+
"--super-prefix",
|
|
262
|
+
"--list-cmds",
|
|
263
|
+
]);
|
|
264
|
+
/**
|
|
265
|
+
* Classify one shell list/pipeline segment for push/merge (#2711).
|
|
266
|
+
* Token walk is O(n) — avoids nested-quantifier ReDoS that CodeQL flags on
|
|
267
|
+
* `git (?:options)* push` style regexes (alerts #77 / #78 on this PR).
|
|
268
|
+
*/
|
|
269
|
+
function classifyShellSegment(segment) {
|
|
270
|
+
const tokens = segment
|
|
271
|
+
.trim()
|
|
272
|
+
.split(/\s+/)
|
|
273
|
+
.filter((t) => t.length > 0);
|
|
274
|
+
let i = 0;
|
|
275
|
+
while (i < tokens.length) {
|
|
276
|
+
const tok = tokens[i];
|
|
277
|
+
if (tok === undefined || !isShellEnvAssignToken(tok))
|
|
278
|
+
break;
|
|
279
|
+
i++;
|
|
280
|
+
}
|
|
281
|
+
const wrapTok = tokens[i];
|
|
282
|
+
if (wrapTok !== undefined) {
|
|
283
|
+
const wrap = normalizeShellToken(wrapTok).toLowerCase();
|
|
284
|
+
if (wrap === "sudo" || wrap === "env" || wrap === "command") {
|
|
285
|
+
i++;
|
|
286
|
+
while (i < tokens.length) {
|
|
287
|
+
const tok = tokens[i];
|
|
288
|
+
if (tok === undefined || !isShellEnvAssignToken(tok))
|
|
289
|
+
break;
|
|
290
|
+
i++;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const binTok = tokens[i];
|
|
295
|
+
if (binTok === undefined)
|
|
296
|
+
return null;
|
|
297
|
+
const bin = normalizeShellToken(binTok).toLowerCase();
|
|
298
|
+
if (bin === "git" || bin === "git.exe") {
|
|
299
|
+
i++;
|
|
300
|
+
// Skip git global options before the subcommand (-C, --git-dir, -c, …).
|
|
301
|
+
while (i < tokens.length) {
|
|
302
|
+
const raw = tokens[i];
|
|
303
|
+
if (raw === undefined)
|
|
304
|
+
return null;
|
|
305
|
+
const t = normalizeShellToken(raw);
|
|
306
|
+
const lower = t.toLowerCase();
|
|
307
|
+
if (!t.startsWith("-")) {
|
|
308
|
+
return lower === "push" ? "push" : null;
|
|
309
|
+
}
|
|
310
|
+
// --opt=value forms never consume a following token.
|
|
311
|
+
if (t.startsWith("--") && t.includes("=")) {
|
|
312
|
+
i++;
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
// Value-taking globals: -C path, --git-dir /repo, -c name=value, …
|
|
316
|
+
if (GIT_GLOBAL_VALUE_OPTS.has(t)) {
|
|
317
|
+
i += 2;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
// Glued short forms: -C/path, -cname=value
|
|
321
|
+
if (t.startsWith("-C") || t.startsWith("-c")) {
|
|
322
|
+
i++;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
// Boolean / other short/long flags without a separate value.
|
|
326
|
+
i++;
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
if (bin === "gh" || bin === "gh.exe") {
|
|
331
|
+
i++;
|
|
332
|
+
while (i < tokens.length) {
|
|
333
|
+
const flagRaw = tokens[i];
|
|
334
|
+
if (flagRaw === undefined)
|
|
335
|
+
break;
|
|
336
|
+
const flag = normalizeShellToken(flagRaw);
|
|
337
|
+
if (!flag.startsWith("-"))
|
|
338
|
+
break;
|
|
339
|
+
i++;
|
|
340
|
+
}
|
|
341
|
+
const pr = tokens[i];
|
|
342
|
+
const merge = tokens[i + 1];
|
|
343
|
+
if (pr !== undefined &&
|
|
344
|
+
merge !== undefined &&
|
|
345
|
+
normalizeShellToken(pr).toLowerCase() === "pr" &&
|
|
346
|
+
normalizeShellToken(merge).toLowerCase() === "merge") {
|
|
347
|
+
return "merge";
|
|
348
|
+
}
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* List all classifiable push/merge ops in a shell command (#2711).
|
|
355
|
+
* Scans every list/pipeline/newline segment so compound commands like
|
|
356
|
+
* `gh pr merge 1 && git push` surface both ops (dispatcher evaluates each).
|
|
357
|
+
* Newlines are delimiters so multi-line scripts cannot hide a later push/merge.
|
|
358
|
+
*/
|
|
359
|
+
export function listShellOps(command) {
|
|
360
|
+
const cmd = command.trim();
|
|
361
|
+
if (cmd.length === 0)
|
|
362
|
+
return [];
|
|
363
|
+
const found = new Set();
|
|
364
|
+
// Quote-aware split so separators inside quotes are not treated as list ops.
|
|
365
|
+
for (const raw of splitShellSegments(cmd)) {
|
|
366
|
+
const op = classifyShellSegment(raw);
|
|
367
|
+
if (op !== null)
|
|
368
|
+
found.add(op);
|
|
369
|
+
}
|
|
370
|
+
const out = [];
|
|
371
|
+
// Stable order for deterministic multi-op evaluation.
|
|
372
|
+
if (found.has("push"))
|
|
373
|
+
out.push("push");
|
|
374
|
+
if (found.has("merge"))
|
|
375
|
+
out.push("merge");
|
|
376
|
+
return out;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Classify a shell command string for push/merge scopes (#2711).
|
|
380
|
+
* Unclassifiable commands return null (fail open at the gate).
|
|
381
|
+
* When a compound command has multiple ops, returns the first of listShellOps
|
|
382
|
+
* (push before merge); prefer listShellOps + evaluate-each for enforcement.
|
|
383
|
+
*
|
|
384
|
+
* Patterns (intentionally narrow; prefer false-open over false-deny):
|
|
385
|
+
* - push: `git push`, `git.exe push`, with optional env / -C / -c prefixes
|
|
386
|
+
* - merge: `gh pr merge`, `gh.exe pr merge`
|
|
387
|
+
*/
|
|
388
|
+
export function classifyShellCommand(command) {
|
|
389
|
+
const ops = listShellOps(command);
|
|
390
|
+
return ops[0] ?? null;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Classify an MCP (or MCP-like) tool name + optional argument blob for push/merge (#2711).
|
|
394
|
+
* Returns null when the tool is not a known push/merge mutation (fail open).
|
|
395
|
+
*/
|
|
396
|
+
export function classifyMcpTool(toolName, argsText = null) {
|
|
397
|
+
const name = toolName.trim().toLowerCase();
|
|
398
|
+
if (name.length === 0)
|
|
399
|
+
return null;
|
|
400
|
+
// Common GitHub MCP / bridge spellings for merge
|
|
401
|
+
if (/merge[_-]?pull[_-]?request/.test(name) ||
|
|
402
|
+
/pull[_-]?request[_-]?merge/.test(name) ||
|
|
403
|
+
/(^|__)merge_pr($|__)/.test(name) ||
|
|
404
|
+
/pr[_-]?merge/.test(name)) {
|
|
405
|
+
return "merge";
|
|
406
|
+
}
|
|
407
|
+
// Push-like tool names (narrow — prefer fail-open)
|
|
408
|
+
if (/(^|__)git[_-]?push($|__)/.test(name) || /push[_-]?branch/.test(name)) {
|
|
409
|
+
return "push";
|
|
410
|
+
}
|
|
411
|
+
if (/push/.test(name) && /(git|branch|remote|ref)/.test(name))
|
|
412
|
+
return "push";
|
|
413
|
+
const blob = (argsText ?? "").toLowerCase();
|
|
414
|
+
if (blob.length > 0) {
|
|
415
|
+
if (/\bgit(?:\.exe)?\s+push\b/.test(blob))
|
|
416
|
+
return "push";
|
|
417
|
+
if (/\bgh(?:\.exe)?\s+pr\s+merge\b/.test(blob))
|
|
418
|
+
return "merge";
|
|
419
|
+
}
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Evaluate scopes.push / scopes.merge for a classifiable shell/MCP operation (#2711).
|
|
424
|
+
* null op → allow (unclassifiable fail-open). disabled policy → allow.
|
|
425
|
+
*/
|
|
426
|
+
export function evaluateRuntimeAuthorityShellOp(input) {
|
|
427
|
+
const { policy, op } = input;
|
|
428
|
+
if (!policy.enabled) {
|
|
429
|
+
return { allowed: true, reason: null, code: null, unclassifiable: op === null };
|
|
430
|
+
}
|
|
431
|
+
if (op === null) {
|
|
432
|
+
return { allowed: true, reason: null, code: null, unclassifiable: true };
|
|
433
|
+
}
|
|
434
|
+
if (op === "push" && !policy.scopes.push) {
|
|
435
|
+
return {
|
|
436
|
+
allowed: false,
|
|
437
|
+
code: "runtime-policy-deny-scope",
|
|
438
|
+
unclassifiable: false,
|
|
439
|
+
reason: "Directive denied this shell/MCP operation: plan.policy.runtimeAuthority.scopes.push is false. " +
|
|
440
|
+
"Grant the push scope in PROJECT-DEFINITION or disable runtimeAuthority.",
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
if (op === "merge" && !policy.scopes.merge) {
|
|
444
|
+
return {
|
|
445
|
+
allowed: false,
|
|
446
|
+
code: "runtime-policy-deny-scope",
|
|
447
|
+
unclassifiable: false,
|
|
448
|
+
reason: "Directive denied this shell/MCP operation: plan.policy.runtimeAuthority.scopes.merge is false. " +
|
|
449
|
+
"Grant the merge scope in PROJECT-DEFINITION or disable runtimeAuthority.",
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
return { allowed: true, reason: null, code: null, unclassifiable: false };
|
|
453
|
+
}
|
|
180
454
|
//# sourceMappingURL=runtime-authority.js.map
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { detectNoDeftDirective } from "../policy/no-deft-directive.js";
|
|
1
2
|
import { writeSentinel } from "./ritual-sentinel.js";
|
|
2
3
|
export interface SessionStartHookOptions {
|
|
3
4
|
readonly resolveVersionFn?: () => string;
|
|
4
5
|
readonly detectBranchFn?: (projectRoot: string) => string | null;
|
|
5
6
|
readonly detectLatestActiveVbriefFn?: (projectRoot: string) => string | null;
|
|
6
7
|
readonly writeSentinelFn?: typeof writeSentinel;
|
|
8
|
+
/** Test seam for #2926 opt-out detection. */
|
|
9
|
+
readonly detectNoDeftDirectiveFn?: typeof detectNoDeftDirective;
|
|
7
10
|
}
|
|
8
11
|
/** Write ``.deft/last-session.json`` from current git state (#1269). */
|
|
9
12
|
export declare function runSessionStartHookWrite(projectRoot: string, options?: SessionStartHookOptions): {
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { resolveVersion } from "../doctor/paths.js";
|
|
2
|
+
import { detectNoDeftDirective, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, } from "../policy/no-deft-directive.js";
|
|
2
3
|
import { detectBranch } from "./git.js";
|
|
3
4
|
import { detectLatestActiveVbrief, writeSentinel } from "./ritual-sentinel.js";
|
|
4
5
|
/** Write ``.deft/last-session.json`` from current git state (#1269). */
|
|
5
6
|
export function runSessionStartHookWrite(projectRoot, options = {}) {
|
|
7
|
+
const detectOptOut = options.detectNoDeftDirectiveFn ?? detectNoDeftDirective;
|
|
8
|
+
// #2926: root opt-out wins — host SessionStart must not write ritual bookkeeping.
|
|
9
|
+
const optOut = detectOptOut(projectRoot);
|
|
10
|
+
if (optOut.present) {
|
|
11
|
+
const lines = [NO_DEFT_DIRECTIVE_DISABLED_MESSAGE];
|
|
12
|
+
if (optOut.inconsistent) {
|
|
13
|
+
lines.push(NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
code: optOut.inconsistent ? 1 : 0,
|
|
17
|
+
stdout: `${lines.join("\n")}\n`,
|
|
18
|
+
stderr: optOut.inconsistent ? `${NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE}\n` : "",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
6
21
|
const detectBranchFn = options.detectBranchFn ?? detectBranch;
|
|
7
22
|
const detectVbriefFn = options.detectLatestActiveVbriefFn ?? detectLatestActiveVbrief;
|
|
8
23
|
const resolveVersionFn = options.resolveVersionFn ?? resolveVersion;
|
|
@@ -4,6 +4,7 @@ import { emitSessionEvalReadback } from "../eval/readback.js";
|
|
|
4
4
|
import { MIGRATE_COMPLETION_NUDGE, shouldEmitMigrateNudge } from "../init-deposit/migrate.js";
|
|
5
5
|
import { detectEnvironmentContext, environmentContextToDict, formatEnvironmentContext, } from "../platform/shell-context.js";
|
|
6
6
|
import { disclosureLine } from "../policy/disclosure.js";
|
|
7
|
+
import { detectNoDeftDirective, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_FLAG_NAME, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, NO_DEFT_DIRECTIVE_INCONSISTENT_POLICY, } from "../policy/no-deft-directive.js";
|
|
7
8
|
import { resolvePolicy } from "../policy/resolve.js";
|
|
8
9
|
import { maybeFormatProductSignalConsentPrompt } from "../product-signal/consent-prompt.js";
|
|
9
10
|
import { maybeRunStalenessTickler } from "../staleness-tickler/run.js";
|
|
@@ -233,6 +234,35 @@ export function runSessionStart(projectRoot, options = {}) {
|
|
|
233
234
|
const deferrals = options.deferrals ?? {};
|
|
234
235
|
const runGit = options.runGit ?? defaultGitRunner;
|
|
235
236
|
const environment = (options.probeEnvironment ?? detectEnvironmentContext)();
|
|
237
|
+
// #2926: official root opt-out wins locally — skip Directive session ritual.
|
|
238
|
+
// disabled = skip ritual (exit 0 clean / 1 inconsistent). ready stays false so
|
|
239
|
+
// automation does not treat opt-out as "session fully initialized for work".
|
|
240
|
+
const optOut = detectNoDeftDirective(projectRoot);
|
|
241
|
+
if (optOut.present) {
|
|
242
|
+
const lines = [NO_DEFT_DIRECTIVE_DISABLED_MESSAGE];
|
|
243
|
+
if (optOut.inconsistent) {
|
|
244
|
+
lines.push(NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE);
|
|
245
|
+
}
|
|
246
|
+
const code = optOut.inconsistent ? 1 : 0;
|
|
247
|
+
return {
|
|
248
|
+
code,
|
|
249
|
+
payload: {
|
|
250
|
+
ready: false,
|
|
251
|
+
exit_code: code,
|
|
252
|
+
disabled: true,
|
|
253
|
+
disabled_via: NO_DEFT_DIRECTIVE_FLAG_NAME,
|
|
254
|
+
inconsistent: optOut.inconsistent,
|
|
255
|
+
inconsistent_policy: optOut.inconsistent
|
|
256
|
+
? NO_DEFT_DIRECTIVE_INCONSISTENT_POLICY
|
|
257
|
+
: undefined,
|
|
258
|
+
deposit_present: optOut.depositPresent,
|
|
259
|
+
posture,
|
|
260
|
+
environment: environmentContextToDict(environment),
|
|
261
|
+
message: NO_DEFT_DIRECTIVE_DISABLED_MESSAGE,
|
|
262
|
+
},
|
|
263
|
+
lines,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
236
266
|
if (posture === READ_ONLY_POSTURE) {
|
|
237
267
|
return runReadOnlySessionStart(projectRoot, options, instant, environment);
|
|
238
268
|
}
|
|
@@ -3,14 +3,19 @@ import { join, resolve } from "node:path";
|
|
|
3
3
|
export const CURSOR_TIER1_TARGETS = [
|
|
4
4
|
{
|
|
5
5
|
path: "content/skills/deft-directive-swarm/SKILL.md",
|
|
6
|
-
label: "swarm Phase 3 capability matrix",
|
|
6
|
+
label: "swarm Phase 3 capability matrix (thin skill)",
|
|
7
7
|
markers: [
|
|
8
8
|
"Probe for the Cursor `Task` tool",
|
|
9
9
|
"cursor-composer",
|
|
10
10
|
"cursor-cloud-agent",
|
|
11
|
-
"
|
|
11
|
+
"host-cursor.md",
|
|
12
12
|
],
|
|
13
13
|
},
|
|
14
|
+
{
|
|
15
|
+
path: "content/skills/deft-directive-swarm/references/host-cursor.md",
|
|
16
|
+
label: "swarm Cursor host adapter",
|
|
17
|
+
markers: ["Step 2e: Cursor Launch", "cursor-composer", "Task"],
|
|
18
|
+
},
|
|
14
19
|
{
|
|
15
20
|
path: "content/skills/deft-directive-review-cycle/SKILL.md",
|
|
16
21
|
label: "review-cycle monitoring tier selection",
|
|
@@ -3,14 +3,19 @@ import { join, resolve } from "node:path";
|
|
|
3
3
|
export const OPENCLAW_TIER1_TARGETS = [
|
|
4
4
|
{
|
|
5
5
|
path: "content/skills/deft-directive-swarm/SKILL.md",
|
|
6
|
-
label: "swarm Phase 3 capability matrix",
|
|
6
|
+
label: "swarm Phase 3 capability matrix (thin skill)",
|
|
7
7
|
markers: [
|
|
8
8
|
"Probe for the OpenClaw `sessions_spawn` tool",
|
|
9
9
|
"sessions_spawn",
|
|
10
10
|
"openclaw",
|
|
11
|
-
"
|
|
11
|
+
"host-openclaw.md",
|
|
12
12
|
],
|
|
13
13
|
},
|
|
14
|
+
{
|
|
15
|
+
path: "content/skills/deft-directive-swarm/references/host-openclaw.md",
|
|
16
|
+
label: "swarm OpenClaw host adapter",
|
|
17
|
+
markers: ["Step 2f: OpenClaw Launch", "sessions_spawn", "openclaw"],
|
|
18
|
+
},
|
|
14
19
|
{
|
|
15
20
|
path: "packages/core/src/swarm/routing.ts",
|
|
16
21
|
label: "swarm routing dispatch_provider",
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.88.0",
|
|
4
4
|
"description": "TypeScript engine core for the Directive framework.",
|
|
5
|
+
"license": "MIT",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
@@ -317,8 +318,8 @@
|
|
|
317
318
|
"provenance": true
|
|
318
319
|
},
|
|
319
320
|
"dependencies": {
|
|
320
|
-
"@deftai/directive-content": "^0.
|
|
321
|
-
"@deftai/directive-types": "^0.
|
|
321
|
+
"@deftai/directive-content": "^0.88.0",
|
|
322
|
+
"@deftai/directive-types": "^0.88.0",
|
|
322
323
|
"archiver": "^8.0.0"
|
|
323
324
|
},
|
|
324
325
|
"scripts": {
|