@deftai/directive 0.96.0 → 0.98.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.
@@ -83,6 +83,9 @@ export const SUBCOMMAND_ROUTES = {
83
83
  "policy:allow-direct-commits": ["policy", "allow-direct-commits"],
84
84
  "policy:allow-bot-merge": ["policy", "allow-bot-merge"],
85
85
  "policy:enable-value-feedback": ["policy", "enable-value-feedback"],
86
+ "policy:coverage-check-resume-preset": ["policy", "coverage-check-resume-preset"],
87
+ "policy:coverage-check-resume-dismiss": ["policy", "coverage-check-resume-dismiss"],
88
+ "policy:coverage-check-resume-later": ["policy", "coverage-check-resume-later"],
86
89
  "policy:clear-value-feedback": ["policy", "clear-value-feedback"],
87
90
  "authz:show": ["authz", "show"],
88
91
  "authz:uat-start": ["authz", "uat-start"],
@@ -10,7 +10,7 @@ export interface DispatchIo {
10
10
  writeErr: (text: string) => void;
11
11
  }
12
12
  /** CLI modules in packages/cli/src (excluding parity harnesses and bin/index). */
13
- export declare const CLI_MODULE_VERBS: readonly ["agents-refresh", "cache", "check", "capacity-backfill", "capacity-show", "codebase-default-extractor", "codebase-map", "codebase-map-fresh", "codebase-projection-registry", "codebase-provider", "doctor", "install-upgrade", "install-uninstall", "migrate-preflight", "migrate-xbrief", "migrate-category-b", "framework-check-updates", "hook-dispatch", "umbrella-current-shape", "changelog-check", "change-init", "commit-lint", "coverage-hotspots", "policy", "authz", "escalation-cli", "pr-closing-keywords", "pr-merge-readiness", "pr-monitor", "pr-protected-issues", "pr-wait-mergeable", "pr-watch", "pr-finish-loop", "directive-finish-loop", "preflight-cache", "preflight-gh", "probe-session", "release", "release-e2e", "release-publish", "release-rollback", "scope-lifecycle", "lifecycle-event", "lifecycle-stats", "session-start", "session-ready", "plan-sequence", "slice", "subagent-monitor", "toolchain-check", "triage-actions", "triage-bootstrap", "triage-bulk", "triage-classify", "triage-help", "triage-queue", "triage-reconcile", "triage-refresh", "triage-scope", "triage-scope-drift", "triage-smoketest", "triage-subscribe", "triage-summary", "triage-welcome", "ts-check-lane", "vbrief-activate", "vbrief-build", "vbrief-preflight", "vbrief-reconcile", "vbrief-validate", "vbrief-validation", "xbrief-create", "xbrief-verify", "verify-branch", "verify-encoding", "verify-forward-coverage", "verify-hooks-installed", "verify-investigation", "verify-judgment-gates", "verify-no-task-runtime", "validate-links", "validate-strategy-output", "verify-biome-config", "verify-bridge-drift", "verify-capacity", "verify-contained-writes", "verify-content-manifest", "verify-skill-external-fetch-gate", "verify-contract-drift", "verify-cursor-tier1", "verify-openclaw-tier1", "verify-go-freeze", "verify-scm-boundary", "verify-session-ritual", "verify-plan-sequence", "verify-stubs", "verify-xbrief-drift", "rule-ownership-lint", "verify-story-ready", "verify-review-monitor", "verify-l4-owner", "verify-subagent-alive", "review-monitor-register", "review-monitor-release", "verify-tools", "verify-wip-cap", "verify-orphan-active", "verify-agents-md-budget", "verify-agents-md-advisory", "verify-eval-health-relocation", "verify-eval-triggers-relocation", "eval-health", "eval-run", "eval-report", "eval-triggers"];
13
+ export declare const CLI_MODULE_VERBS: readonly ["agents-refresh", "cache", "check", "capacity-backfill", "capacity-show", "codebase-default-extractor", "codebase-map", "codebase-map-fresh", "codebase-projection-registry", "codebase-provider", "doctor", "install-upgrade", "install-uninstall", "migrate-preflight", "migrate-xbrief", "migrate-category-b", "framework-check-updates", "hook-dispatch", "umbrella-current-shape", "changelog-check", "change-init", "commit-lint", "coverage-hotspots", "policy", "authz", "escalation-cli", "pr-closing-keywords", "pr-merge-readiness", "pr-monitor", "pr-protected-issues", "pr-wait-mergeable", "pr-watch", "pr-finish-loop", "directive-finish-loop", "preflight-cache", "preflight-gh", "probe-session", "release", "release-e2e", "release-publish", "release-rollback", "scope-lifecycle", "lifecycle-event", "lifecycle-stats", "session-start", "session-ready", "plan-sequence", "slice", "subagent-monitor", "toolchain-check", "triage-actions", "triage-bootstrap", "triage-bulk", "triage-classify", "triage-help", "triage-queue", "triage-reconcile", "triage-refresh", "triage-scope", "triage-scope-drift", "triage-smoketest", "triage-subscribe", "triage-summary", "triage-welcome", "ts-check-lane", "vbrief-activate", "vbrief-build", "vbrief-preflight", "vbrief-reconcile", "vbrief-validate", "vbrief-validation", "xbrief-create", "xbrief-verify", "verify-branch", "verify-encoding", "verify-forward-coverage", "verify-test-boundary", "verify-scope-provenance", "verify-consumer-check-contract", "verify-hooks-installed", "verify-investigation", "verify-judgment-gates", "verify-no-task-runtime", "validate-links", "validate-strategy-output", "verify-biome-config", "verify-bridge-drift", "verify-capacity", "verify-contained-writes", "verify-content-manifest", "verify-skill-external-fetch-gate", "verify-contract-drift", "verify-cursor-tier1", "verify-openclaw-tier1", "verify-go-freeze", "verify-scm-boundary", "verify-session-ritual", "verify-plan-sequence", "verify-stubs", "verify-xbrief-drift", "rule-ownership-lint", "verify-story-ready", "verify-review-monitor", "verify-l4-owner", "verify-subagent-alive", "review-monitor-register", "review-monitor-release", "verify-tools", "verify-wip-cap", "verify-orphan-active", "verify-agents-md-budget", "verify-agents-md-advisory", "verify-eval-health-relocation", "verify-eval-triggers-relocation", "eval-health", "eval-run", "eval-report", "eval-triggers"];
14
14
  /** Core-only CLI entrypoints without a packages/cli wrapper. */
15
15
  export declare const CORE_MODULE_VERBS: readonly ["scm", "scm-readiness", "github-auth-modes", "github-body", "issue-emit", "issue-ingest", "issue-sync-from-xbrief", "reconcile-issues", "swarm-launch", "swarm-complete-cohort", "swarm-finalize-cohort", "swarm-readiness", "swarm-routing-verify", "swarm-routing-set", "swarm-verify-review-clean", "swarm-worktrees", "framework-commands", "pack-render", "packs-slice", "prd-render", "export-spec", "project-render", "roadmap-render", "rule-map", "spec-render", "spec-validate", "code-structure-validate", "pack-migrate-skills", "pack-migrate-rules", "pack-migrate-strategies", "pack-migrate-patterns", "pack-migrate-swarm-spec", "policy-set", "setup-ghx", "scope-undo", "scope-demote", "scope-decompose", "changelog-resolve-unreleased", "architecture-preflight-sor", "feedback-file", "value-readback", "product-signal", "freshness-report"];
16
16
  /** Colon aliases for triage-actions (mirrors cli-router SUBCOMMAND_ROUTES). */
package/dist/dispatch.js CHANGED
@@ -102,6 +102,9 @@ export const CLI_MODULE_VERBS = [
102
102
  "verify-branch",
103
103
  "verify-encoding",
104
104
  "verify-forward-coverage",
105
+ "verify-test-boundary",
106
+ "verify-scope-provenance",
107
+ "verify-consumer-check-contract",
105
108
  "verify-hooks-installed",
106
109
  "verify-investigation",
107
110
  "verify-judgment-gates",
@@ -208,6 +211,9 @@ export const POLICY_ACTION_ALIAS_SUBCOMMANDS = {
208
211
  "policy:allow-bot-merge": "allow-bot-merge",
209
212
  "policy:enable-value-feedback": "enable-value-feedback",
210
213
  "policy:clear-value-feedback": "clear-value-feedback",
214
+ "policy:coverage-check-resume-preset": "coverage-check-resume-preset",
215
+ "policy:coverage-check-resume-dismiss": "coverage-check-resume-dismiss",
216
+ "policy:coverage-check-resume-later": "coverage-check-resume-later",
211
217
  "policy:disable-directive": "disable-directive",
212
218
  "policy:enable-directive": "enable-directive",
213
219
  };
@@ -259,6 +265,9 @@ export const VERB_ALIASES = {
259
265
  "hook:dispatch": "hook-dispatch",
260
266
  "verify:encoding": "verify-encoding",
261
267
  "verify:forward-coverage": "verify-forward-coverage",
268
+ "verify:test-boundary": "verify-test-boundary",
269
+ "verify:scope-provenance": "verify-scope-provenance",
270
+ "verify:consumer-check-contract": "verify-consumer-check-contract",
262
271
  "coverage:hotspots": "coverage-hotspots",
263
272
  "verify:branch": "verify-branch",
264
273
  "verify:vbrief-conformance": "vbrief-validate",
package/dist/policy.d.ts CHANGED
@@ -7,7 +7,7 @@ interface ShowArgs {
7
7
  error?: string;
8
8
  }
9
9
  interface SetArgs {
10
- cmd: "show" | "enforce-branches" | "allow-direct-commits" | "allow-bot-merge" | "enable-value-feedback" | "clear-value-feedback" | "disable-directive" | "enable-directive" | "resolve";
10
+ cmd: "show" | "enforce-branches" | "allow-direct-commits" | "allow-bot-merge" | "enable-value-feedback" | "clear-value-feedback" | "coverage-check-resume-preset" | "coverage-check-resume-dismiss" | "coverage-check-resume-later" | "disable-directive" | "enable-directive" | "resolve";
11
11
  confirm: boolean;
12
12
  actor: string;
13
13
  note: string;
@@ -15,6 +15,9 @@ interface SetArgs {
15
15
  format: "text" | "json";
16
16
  changedOnly: boolean;
17
17
  field: string | null;
18
+ /** Strict | hatch-aware for coverage-check-resume-preset; reason for dismiss. */
19
+ preset?: string;
20
+ reason?: string;
18
21
  error?: string;
19
22
  }
20
23
  /** Parse policy:show flags (mirrors _policy_show_cli.py). */
package/dist/policy.js CHANGED
@@ -6,7 +6,7 @@
6
6
  import { existsSync } from "node:fs";
7
7
  import { resolve as pathResolve, relative } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
- import { ALLOW_BOT_MERGE_CAPABILITY_COST, clearValueFeedback, createNoDeftDirectiveFlag, describeShadowedPlanExtension, detectNoDeftDirective, detectShadowedPlanExtensions, disclosureLine, enableValueFeedback, FIELD_VALUE_FEEDBACK, FIELD_VALUE_FEEDBACK_CLI_ALIAS, formatValueFeedbackStatusLine, humanMergeDisclosureLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_FLAG_NAME, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, policyColonInvocation, projectDefinitionPath, pythonListRepr, pythonStringRepr, registeredPolicyNames, removeNoDeftDirectiveFlag, renderJson, renderText, resolveHumanMergePolicy, resolvePolicy, resolveValueFeedback, setPolicy, setRequireHumanMerge, } from "@deftai/directive-core/policy";
9
+ import { ALLOW_BOT_MERGE_CAPABILITY_COST, applyHatchAwareCoverageCheckResumePreset, applyLaterCoverageCheckResumeSkip, applyStrictCoverageCheckResumePreset, clearValueFeedback, createNoDeftDirectiveFlag, describeShadowedPlanExtension, detectNoDeftDirective, detectShadowedPlanExtensions, disclosureLine, dismissCoverageCheckResume, enableValueFeedback, FIELD_VALUE_FEEDBACK, FIELD_VALUE_FEEDBACK_CLI_ALIAS, formatValueFeedbackStatusLine, humanMergeDisclosureLine, inspectAllPolicies, inspectOnePolicy, loadProjectDefinition, NO_DEFT_DIRECTIVE_DISABLED_MESSAGE, NO_DEFT_DIRECTIVE_FLAG_NAME, NO_DEFT_DIRECTIVE_INCONSISTENT_MESSAGE, policyColonInvocation, projectDefinitionPath, pythonListRepr, pythonStringRepr, registeredPolicyNames, removeNoDeftDirectiveFlag, renderJson, renderText, resolveHumanMergePolicy, resolvePolicy, resolveValueFeedback, setPolicy, setRequireHumanMerge, } from "@deftai/directive-core/policy";
10
10
  const CAPABILITY_COST_DISCLOSURE = "\u26a0 Capability-cost disclosure -- enabling direct commits to the default " +
11
11
  "branch turns OFF the deft branch-protection policy.\n" +
12
12
  " \u2022 Pre-commit + pre-push hooks will no longer block default-branch " +
@@ -114,7 +114,7 @@ export function parseShowArgs(argv) {
114
114
  /** Parse argv for the policy CLI (show + set subcommands). */
115
115
  export function parseArgs(argv) {
116
116
  if (argv.length === 0) {
117
- const usage = "usage: policy [show|enforce-branches|allow-direct-commits|allow-bot-merge|enable-value-feedback|clear-value-feedback|disable-directive|enable-directive|resolve] ...";
117
+ const usage = "usage: policy [show|enforce-branches|allow-direct-commits|allow-bot-merge|enable-value-feedback|clear-value-feedback|coverage-check-resume-preset|coverage-check-resume-dismiss|coverage-check-resume-later|disable-directive|enable-directive|resolve] ...";
118
118
  return makeSetError(usage);
119
119
  }
120
120
  const cmd = argv[0];
@@ -151,6 +151,9 @@ export function parseArgs(argv) {
151
151
  cmd === "allow-bot-merge" ||
152
152
  cmd === "enable-value-feedback" ||
153
153
  cmd === "clear-value-feedback" ||
154
+ cmd === "coverage-check-resume-preset" ||
155
+ cmd === "coverage-check-resume-dismiss" ||
156
+ cmd === "coverage-check-resume-later" ||
154
157
  cmd === "disable-directive" ||
155
158
  cmd === "enable-directive") {
156
159
  let confirm = false;
@@ -164,16 +167,44 @@ export function parseArgs(argv) {
164
167
  ? policyColonInvocation("enable-value-feedback")
165
168
  : cmd === "clear-value-feedback"
166
169
  ? policyColonInvocation("clear-value-feedback")
167
- : cmd === "disable-directive"
168
- ? policyColonInvocation("disable-directive")
169
- : policyColonInvocation("enable-directive");
170
+ : cmd === "coverage-check-resume-preset"
171
+ ? policyColonInvocation("coverage-check-resume-preset")
172
+ : cmd === "coverage-check-resume-dismiss"
173
+ ? policyColonInvocation("coverage-check-resume-dismiss")
174
+ : cmd === "coverage-check-resume-later"
175
+ ? policyColonInvocation("coverage-check-resume-later")
176
+ : cmd === "disable-directive"
177
+ ? policyColonInvocation("disable-directive")
178
+ : policyColonInvocation("enable-directive");
170
179
  let note = "";
171
180
  let projectRoot = ".";
181
+ let preset = "";
182
+ let reason = "";
172
183
  for (let i = 1; i < argv.length; i += 1) {
173
184
  const arg = argv[i];
174
185
  if (arg === "--confirm") {
175
186
  confirm = true;
176
187
  }
188
+ else if (arg === "--preset") {
189
+ const v = argv[i + 1];
190
+ if (v === undefined)
191
+ return makeSetError("argument --preset: expected one argument");
192
+ preset = v;
193
+ i += 1;
194
+ }
195
+ else if (arg?.startsWith("--preset=")) {
196
+ preset = arg.slice("--preset=".length);
197
+ }
198
+ else if (arg === "--reason") {
199
+ const v = argv[i + 1];
200
+ if (v === undefined)
201
+ return makeSetError("argument --reason: expected one argument");
202
+ reason = v;
203
+ i += 1;
204
+ }
205
+ else if (arg?.startsWith("--reason=")) {
206
+ reason = arg.slice("--reason=".length);
207
+ }
177
208
  else if (arg === "--actor") {
178
209
  const v = argv[i + 1];
179
210
  if (v === undefined)
@@ -204,6 +235,10 @@ export function parseArgs(argv) {
204
235
  else if (arg?.startsWith("--project-root=")) {
205
236
  projectRoot = arg.slice("--project-root=".length);
206
237
  }
238
+ else if (cmd === "coverage-check-resume-preset" &&
239
+ (arg === "strict" || arg === "hatch-aware")) {
240
+ preset = arg;
241
+ }
207
242
  else {
208
243
  return makeSetError(`unrecognized argument: ${arg}`);
209
244
  }
@@ -217,6 +252,8 @@ export function parseArgs(argv) {
217
252
  format: "text",
218
253
  changedOnly: false,
219
254
  field: null,
255
+ preset,
256
+ reason,
220
257
  };
221
258
  }
222
259
  return makeSetError(`unknown subcommand: ${cmd}`);
@@ -456,6 +493,15 @@ export function run(argv) {
456
493
  if (args.cmd === "clear-value-feedback") {
457
494
  return runClearValueFeedback(args);
458
495
  }
496
+ if (args.cmd === "coverage-check-resume-preset") {
497
+ return runCoverageCheckResumePreset(args);
498
+ }
499
+ if (args.cmd === "coverage-check-resume-dismiss") {
500
+ return runCoverageCheckResumeDismiss(args);
501
+ }
502
+ if (args.cmd === "coverage-check-resume-later") {
503
+ return runCoverageCheckResumeLater();
504
+ }
459
505
  if (args.cmd === "disable-directive") {
460
506
  return runDisableDirective(args);
461
507
  }
@@ -464,6 +510,42 @@ export function run(argv) {
464
510
  }
465
511
  return 2;
466
512
  }
513
+ /** Apply Strict or Hatch-aware coverageDebt+checkResume preset (#3189). */
514
+ function runCoverageCheckResumePreset(args) {
515
+ const root = pathResolve(args.projectRoot);
516
+ const preset = (args.preset ?? "").trim().toLowerCase();
517
+ if (preset !== "strict" && preset !== "hatch-aware") {
518
+ process.stdout.write("usage: policy coverage-check-resume-preset --preset strict|hatch-aware [--project-root PATH]\n" +
519
+ " (or: policy:coverage-check-resume-preset strict|hatch-aware)\n");
520
+ return 1;
521
+ }
522
+ const result = preset === "strict"
523
+ ? applyStrictCoverageCheckResumePreset(root, { actor: args.actor, note: args.note })
524
+ : applyHatchAwareCoverageCheckResumePreset(root, { actor: args.actor, note: args.note });
525
+ process.stdout.write(result.stdout);
526
+ return result.exitCode;
527
+ }
528
+ /** Dismiss-with-reason for coverageDebt+checkResume (#3189). */
529
+ function runCoverageCheckResumeDismiss(args) {
530
+ const root = pathResolve(args.projectRoot);
531
+ const reason = (args.reason ?? "").trim();
532
+ if (reason.length === 0) {
533
+ process.stdout.write("usage: policy coverage-check-resume-dismiss --reason TEXT [--project-root PATH]\n");
534
+ return 1;
535
+ }
536
+ const result = dismissCoverageCheckResume(root, reason, {
537
+ actor: args.actor,
538
+ note: args.note,
539
+ });
540
+ process.stdout.write(result.stdout);
541
+ return result.exitCode;
542
+ }
543
+ /** Later skip — no PROJECT-DEFINITION write (#3189). */
544
+ function runCoverageCheckResumeLater() {
545
+ const result = applyLaterCoverageCheckResumeSkip();
546
+ process.stdout.write(result.stdout);
547
+ return result.exitCode;
548
+ }
467
549
  if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1]) {
468
550
  process.exit(run(process.argv.slice(2)));
469
551
  }
@@ -12,6 +12,11 @@ export interface ParsedArgs {
12
12
  allowCrossRepo: boolean;
13
13
  /** Opt-in: include closed issues (default open-only, #3125). */
14
14
  includeClosed: boolean;
15
+ /**
16
+ * Opt-in re-enrich: re-plan already-stamped issues with additive label deltas
17
+ * (#3197). Requires --mirror; dry-run by default until --apply.
18
+ */
19
+ reEnrich: boolean;
15
20
  /** Raw --author value (LOGIN, @me, comma allow-list); null = no filter (#3129). */
16
21
  author: string | null;
17
22
  /** Apply batch size (rate-limit awareness). */
@@ -36,6 +36,7 @@ export function parseArgs(argv) {
36
36
  repo: null,
37
37
  allowCrossRepo: false,
38
38
  includeClosed: false,
39
+ reEnrich: false,
39
40
  author: null,
40
41
  batchSize: null,
41
42
  delayMs: null,
@@ -64,6 +65,9 @@ export function parseArgs(argv) {
64
65
  else if (arg === "--include-closed") {
65
66
  parsed.includeClosed = true;
66
67
  }
68
+ else if (arg === "--re-enrich") {
69
+ parsed.reEnrich = true;
70
+ }
67
71
  else if (arg === "--author-mine") {
68
72
  parsed.author = "@me";
69
73
  }
@@ -185,6 +189,12 @@ export function parseArgs(argv) {
185
189
  error: "--apply requires --mirror (Tier-1 label mirror / bootstrap mass-triage, #1423)",
186
190
  };
187
191
  }
192
+ if (parsed.reEnrich && !parsed.doMirror) {
193
+ return {
194
+ ...parsed,
195
+ error: "--re-enrich requires --mirror (additive re-plan of already-stamped issues, #3197)",
196
+ };
197
+ }
188
198
  if ((parsed.includeClosed ||
189
199
  parsed.author !== null ||
190
200
  parsed.batchSize !== null ||
@@ -244,6 +254,7 @@ export function run(argv, options = {}) {
244
254
  repo: args.repo,
245
255
  allowCrossRepo: args.allowCrossRepo,
246
256
  includeClosed: args.includeClosed,
257
+ reEnrich: args.reEnrich,
247
258
  ...(authorFilter !== null && authorFilter !== undefined ? { authorFilter } : {}),
248
259
  ...(args.batchSize !== null ? { batchSize: args.batchSize } : {}),
249
260
  ...(args.delayMs !== null ? { delayMs: args.delayMs } : {}),
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ interface ParsedArgs {
3
+ projectRoot: string;
4
+ frameworkSource: boolean;
5
+ enforce: boolean;
6
+ quiet: boolean;
7
+ error?: string;
8
+ }
9
+ export declare function parseArgs(argv: string[]): ParsedArgs;
10
+ export declare function run(argv: string[]): number;
11
+ export {};
12
+ //# sourceMappingURL=verify-consumer-check-contract.d.ts.map
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for verify:consumer-check-contract (#3145).
4
+ */
5
+ import { resolve } from "node:path";
6
+ import { consumerCheckContract } from "@deftai/directive-core";
7
+ import { isDirectEntrypoint } from "./entrypoint.js";
8
+ export function parseArgs(argv) {
9
+ const parsed = {
10
+ projectRoot: ".",
11
+ frameworkSource: false,
12
+ enforce: true,
13
+ quiet: false,
14
+ };
15
+ for (let i = 0; i < argv.length; i += 1) {
16
+ const arg = argv[i];
17
+ if (arg === "--quiet") {
18
+ parsed.quiet = true;
19
+ }
20
+ else if (arg === "--enforce") {
21
+ parsed.enforce = true;
22
+ }
23
+ else if (arg === "--warn") {
24
+ parsed.enforce = false;
25
+ }
26
+ else if (arg === "--framework-source") {
27
+ parsed.frameworkSource = true;
28
+ }
29
+ else if (arg === "--project-root") {
30
+ const value = argv[i + 1];
31
+ if (value === undefined) {
32
+ return { ...parsed, error: "argument --project-root: expected one argument" };
33
+ }
34
+ parsed.projectRoot = value;
35
+ i += 1;
36
+ }
37
+ else if (arg?.startsWith("--project-root=")) {
38
+ parsed.projectRoot = arg.slice("--project-root=".length);
39
+ }
40
+ else {
41
+ return { ...parsed, error: `unrecognized argument: ${arg}` };
42
+ }
43
+ }
44
+ return parsed;
45
+ }
46
+ export function run(argv) {
47
+ const args = parseArgs(argv);
48
+ if (args.error !== undefined) {
49
+ process.stderr.write(`verify_consumer_check_contract: ${args.error}\n`);
50
+ return 2;
51
+ }
52
+ const projectRoot = resolve(args.projectRoot);
53
+ const result = consumerCheckContract.evaluateConsumerCheckContract(projectRoot, {
54
+ frameworkSource: args.frameworkSource,
55
+ enforce: args.enforce,
56
+ });
57
+ if (result.exitCode === 0) {
58
+ if (!args.quiet) {
59
+ process.stdout.write(`${result.message}\n`);
60
+ }
61
+ }
62
+ else {
63
+ process.stderr.write(`${result.message}\n`);
64
+ }
65
+ return result.exitCode;
66
+ }
67
+ if (isDirectEntrypoint(import.meta.url)) {
68
+ process.exit(run(process.argv.slice(2)));
69
+ }
70
+ //# sourceMappingURL=verify-consumer-check-contract.js.map
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ interface ParsedArgs {
3
+ projectRoot: string;
4
+ baseRef: string;
5
+ enforce: boolean;
6
+ quiet: boolean;
7
+ error?: string;
8
+ }
9
+ export declare function parseArgs(argv: string[]): ParsedArgs;
10
+ export declare function run(argv: string[]): number;
11
+ export {};
12
+ //# sourceMappingURL=verify-scope-provenance.d.ts.map
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for verify:scope-provenance (#3145).
4
+ */
5
+ import { resolve } from "node:path";
6
+ import { scopeProvenance } from "@deftai/directive-core";
7
+ import { isDirectEntrypoint } from "./entrypoint.js";
8
+ export function parseArgs(argv) {
9
+ const parsed = {
10
+ projectRoot: ".",
11
+ // Empty means use PR-aware default (origin/master...), not bare HEAD.
12
+ baseRef: "",
13
+ enforce: false,
14
+ quiet: false,
15
+ };
16
+ for (let i = 0; i < argv.length; i += 1) {
17
+ const arg = argv[i];
18
+ if (arg === "--quiet") {
19
+ parsed.quiet = true;
20
+ }
21
+ else if (arg === "--enforce") {
22
+ parsed.enforce = true;
23
+ }
24
+ else if (arg === "--warn") {
25
+ parsed.enforce = false;
26
+ }
27
+ else if (arg === "--project-root") {
28
+ const value = argv[i + 1];
29
+ if (value === undefined) {
30
+ return { ...parsed, error: "argument --project-root: expected one argument" };
31
+ }
32
+ parsed.projectRoot = value;
33
+ i += 1;
34
+ }
35
+ else if (arg?.startsWith("--project-root=")) {
36
+ parsed.projectRoot = arg.slice("--project-root=".length);
37
+ }
38
+ else if (arg === "--base-ref") {
39
+ const value = argv[i + 1];
40
+ if (value === undefined) {
41
+ return { ...parsed, error: "argument --base-ref: expected one argument" };
42
+ }
43
+ parsed.baseRef = value;
44
+ i += 1;
45
+ }
46
+ else if (arg?.startsWith("--base-ref=")) {
47
+ parsed.baseRef = arg.slice("--base-ref=".length);
48
+ }
49
+ else {
50
+ return { ...parsed, error: `unrecognized argument: ${arg}` };
51
+ }
52
+ }
53
+ return parsed;
54
+ }
55
+ export function run(argv) {
56
+ const args = parseArgs(argv);
57
+ if (args.error !== undefined) {
58
+ process.stderr.write(`verify_scope_provenance: ${args.error}\n`);
59
+ return 2;
60
+ }
61
+ const projectRoot = resolve(args.projectRoot);
62
+ const result = scopeProvenance.evaluateScopeProvenance(projectRoot, {
63
+ ...(args.baseRef.length > 0 ? { baseRef: args.baseRef } : {}),
64
+ enforce: args.enforce,
65
+ });
66
+ if (result.exitCode === 0) {
67
+ if (!args.quiet) {
68
+ process.stdout.write(`${result.message}\n`);
69
+ }
70
+ }
71
+ else {
72
+ process.stderr.write(`${result.message}\n`);
73
+ }
74
+ return result.exitCode;
75
+ }
76
+ if (isDirectEntrypoint(import.meta.url)) {
77
+ process.exit(run(process.argv.slice(2)));
78
+ }
79
+ //# sourceMappingURL=verify-scope-provenance.js.map
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ interface ParsedArgs {
3
+ projectRoot: string;
4
+ policyPath: string | null;
5
+ enforce: boolean | undefined;
6
+ quiet: boolean;
7
+ error?: string;
8
+ }
9
+ export declare function parseArgs(argv: string[]): ParsedArgs;
10
+ export declare function run(argv: string[]): number;
11
+ export {};
12
+ //# sourceMappingURL=verify-test-boundary.d.ts.map
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for verify:test-boundary (#3145).
4
+ */
5
+ import { resolve } from "node:path";
6
+ import { testBoundary } from "@deftai/directive-core";
7
+ import { isDirectEntrypoint } from "./entrypoint.js";
8
+ export function parseArgs(argv) {
9
+ const parsed = {
10
+ projectRoot: ".",
11
+ policyPath: null,
12
+ enforce: undefined,
13
+ quiet: false,
14
+ };
15
+ for (let i = 0; i < argv.length; i += 1) {
16
+ const arg = argv[i];
17
+ if (arg === "--quiet") {
18
+ parsed.quiet = true;
19
+ }
20
+ else if (arg === "--enforce") {
21
+ parsed.enforce = true;
22
+ }
23
+ else if (arg === "--warn") {
24
+ parsed.enforce = false;
25
+ }
26
+ else if (arg === "--project-root") {
27
+ const value = argv[i + 1];
28
+ if (value === undefined) {
29
+ return { ...parsed, error: "argument --project-root: expected one argument" };
30
+ }
31
+ parsed.projectRoot = value;
32
+ i += 1;
33
+ }
34
+ else if (arg?.startsWith("--project-root=")) {
35
+ parsed.projectRoot = arg.slice("--project-root=".length);
36
+ }
37
+ else if (arg === "--policy") {
38
+ const value = argv[i + 1];
39
+ if (value === undefined) {
40
+ return { ...parsed, error: "argument --policy: expected one argument" };
41
+ }
42
+ parsed.policyPath = value;
43
+ i += 1;
44
+ }
45
+ else if (arg?.startsWith("--policy=")) {
46
+ parsed.policyPath = arg.slice("--policy=".length);
47
+ }
48
+ else {
49
+ return { ...parsed, error: `unrecognized argument: ${arg}` };
50
+ }
51
+ }
52
+ return parsed;
53
+ }
54
+ export function run(argv) {
55
+ const args = parseArgs(argv);
56
+ if (args.error !== undefined) {
57
+ process.stderr.write(`verify_test_boundary: ${args.error}\n`);
58
+ return 2;
59
+ }
60
+ const projectRoot = resolve(args.projectRoot);
61
+ const policyPath = args.policyPath !== null ? resolve(args.policyPath) : null;
62
+ const result = testBoundary.evaluateTestBoundary(projectRoot, {
63
+ policyPath,
64
+ enforce: args.enforce,
65
+ quiet: args.quiet,
66
+ });
67
+ if (result.exitCode === 0) {
68
+ if (!args.quiet) {
69
+ process.stdout.write(`${result.message}\n`);
70
+ }
71
+ }
72
+ else {
73
+ process.stderr.write(`${result.message}\n`);
74
+ }
75
+ return result.exitCode;
76
+ }
77
+ if (isDirectEntrypoint(import.meta.url)) {
78
+ process.exit(run(process.argv.slice(2)));
79
+ }
80
+ //# sourceMappingURL=verify-test-boundary.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deftai/directive",
3
- "version": "0.96.0",
3
+ "version": "0.98.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/",
@@ -34,8 +34,8 @@
34
34
  "provenance": true
35
35
  },
36
36
  "dependencies": {
37
- "@deftai/directive-core": "^0.96.0",
38
- "@deftai/directive-content": "^0.96.0"
37
+ "@deftai/directive-core": "^0.98.0",
38
+ "@deftai/directive-content": "^0.98.0"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsc -b"