@shrkcrft/cli 0.1.0-alpha.23 → 0.1.0-alpha.25

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.
Files changed (62) hide show
  1. package/dist/commands/changelog-data.d.ts +25 -0
  2. package/dist/commands/changelog-data.d.ts.map +1 -0
  3. package/dist/commands/changelog-data.js +70 -0
  4. package/dist/commands/changelog.command.d.ts +3 -0
  5. package/dist/commands/changelog.command.d.ts.map +1 -0
  6. package/dist/commands/changelog.command.js +100 -0
  7. package/dist/commands/changes.command.d.ts.map +1 -1
  8. package/dist/commands/changes.command.js +4 -0
  9. package/dist/commands/check.command.d.ts.map +1 -1
  10. package/dist/commands/check.command.js +182 -17
  11. package/dist/commands/command-catalog.d.ts +11 -0
  12. package/dist/commands/command-catalog.d.ts.map +1 -1
  13. package/dist/commands/command-catalog.js +99 -0
  14. package/dist/commands/compress.command.d.ts.map +1 -1
  15. package/dist/commands/compress.command.js +15 -1
  16. package/dist/commands/constructs.command.d.ts.map +1 -1
  17. package/dist/commands/constructs.command.js +49 -14
  18. package/dist/commands/context.command.d.ts.map +1 -1
  19. package/dist/commands/context.command.js +31 -19
  20. package/dist/commands/finish.command.d.ts +3 -0
  21. package/dist/commands/finish.command.d.ts.map +1 -0
  22. package/dist/commands/finish.command.js +70 -0
  23. package/dist/commands/gate.command.d.ts.map +1 -1
  24. package/dist/commands/gate.command.js +6 -1
  25. package/dist/commands/gen.command.d.ts.map +1 -1
  26. package/dist/commands/gen.command.js +65 -9
  27. package/dist/commands/graph-code-subverbs.d.ts.map +1 -1
  28. package/dist/commands/graph-code-subverbs.js +56 -25
  29. package/dist/commands/help.command.d.ts.map +1 -1
  30. package/dist/commands/help.command.js +20 -2
  31. package/dist/commands/impact.command.d.ts.map +1 -1
  32. package/dist/commands/impact.command.js +17 -22
  33. package/dist/commands/policy-lint.command.d.ts.map +1 -1
  34. package/dist/commands/policy-lint.command.js +46 -8
  35. package/dist/commands/registry.command.d.ts.map +1 -1
  36. package/dist/commands/registry.command.js +71 -13
  37. package/dist/commands/reuse.command.d.ts.map +1 -1
  38. package/dist/commands/reuse.command.js +80 -14
  39. package/dist/commands/smart-context.command.d.ts.map +1 -1
  40. package/dist/commands/smart-context.command.js +34 -42
  41. package/dist/commands/task.command.d.ts.map +1 -1
  42. package/dist/commands/task.command.js +33 -16
  43. package/dist/commands/trace.command.d.ts.map +1 -1
  44. package/dist/commands/trace.command.js +73 -3
  45. package/dist/commands/wiring.command.d.ts +12 -0
  46. package/dist/commands/wiring.command.d.ts.map +1 -0
  47. package/dist/commands/wiring.command.js +384 -0
  48. package/dist/diff/collect-changed-paths.d.ts +5 -3
  49. package/dist/diff/collect-changed-paths.d.ts.map +1 -1
  50. package/dist/diff/collect-changed-paths.js +73 -36
  51. package/dist/diff/deleted-orphans.d.ts +42 -0
  52. package/dist/diff/deleted-orphans.d.ts.map +1 -0
  53. package/dist/diff/deleted-orphans.js +46 -0
  54. package/dist/finish/run-finish.d.ts +62 -0
  55. package/dist/finish/run-finish.d.ts.map +1 -0
  56. package/dist/finish/run-finish.js +239 -0
  57. package/dist/main.d.ts.map +1 -1
  58. package/dist/main.js +6 -0
  59. package/dist/validation/typecheck-emitted.d.ts +36 -0
  60. package/dist/validation/typecheck-emitted.d.ts.map +1 -0
  61. package/dist/validation/typecheck-emitted.js +109 -0
  62. package/package.json +33 -33
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Machine-readable command-SURFACE delta, shipped inside the binary so
3
+ * `shrk changelog` is authoritative for the exact build in use and works
4
+ * offline. This is NOT the full human CHANGELOG.md — it records only the delta
5
+ * an agent needs to re-orient after an upgrade: which verbs/flags were added,
6
+ * which changed behavior, which were removed. Keep it in sync with CHANGELOG.md
7
+ * when a release lands; the version keys must match `SHARKCRAFT_VERSION`.
8
+ *
9
+ * Ordered oldest → newest; the renderer sorts as needed.
10
+ */
11
+ /** One version's command-surface delta. */
12
+ export interface IReleaseSurfaceDelta {
13
+ /** Exact release version, e.g. `0.1.0-alpha.24`. */
14
+ readonly version: string;
15
+ /** One-line headline for the release. */
16
+ readonly title: string;
17
+ /** New verbs / flags this version introduced. */
18
+ readonly added: readonly string[];
19
+ /** Verbs / flags whose behavior or defaults changed. */
20
+ readonly changed: readonly string[];
21
+ /** Verbs / flags removed or renamed away. */
22
+ readonly removed: readonly string[];
23
+ }
24
+ export declare const RELEASE_SURFACE_DELTAS: readonly IReleaseSurfaceDelta[];
25
+ //# sourceMappingURL=changelog-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog-data.d.ts","sourceRoot":"","sources":["../../src/commands/changelog-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,eAAO,MAAM,sBAAsB,EAAE,SAAS,oBAAoB,EA2DjE,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Machine-readable command-SURFACE delta, shipped inside the binary so
3
+ * `shrk changelog` is authoritative for the exact build in use and works
4
+ * offline. This is NOT the full human CHANGELOG.md — it records only the delta
5
+ * an agent needs to re-orient after an upgrade: which verbs/flags were added,
6
+ * which changed behavior, which were removed. Keep it in sync with CHANGELOG.md
7
+ * when a release lands; the version keys must match `SHARKCRAFT_VERSION`.
8
+ *
9
+ * Ordered oldest → newest; the renderer sorts as needed.
10
+ */
11
+ export const RELEASE_SURFACE_DELTAS = [
12
+ {
13
+ version: '0.1.0-alpha.23',
14
+ title: 'Correctness, gate trust, security & pack-distributable invariants',
15
+ added: [
16
+ '`shrk registry <name> list | exists <id> | where <id>` — declarable registry inventory (pack-distributable).',
17
+ '`shrk policy run --changed-only` / `--since` — finding-diff-scoped policy runs.',
18
+ '`shrk search tuning explain` — why a query ranked the way it did.',
19
+ ],
20
+ changed: [
21
+ '`graph context`/`search`/`callers`/`impact` report a true `total` + `truncated` instead of a silent per-file cap.',
22
+ 'Incremental reindex no longer drops inbound edges; renamed barrel re-exports (`export { X as Y }`) now resolve.',
23
+ ],
24
+ removed: [],
25
+ },
26
+ {
27
+ version: '0.1.0-alpha.24',
28
+ title: 'Runtime wiring, write-safety & the author loop',
29
+ added: [
30
+ '`shrk wiring chain | unprovided | orphans` — the registration/DI graph beside the import graph.',
31
+ '`shrk wiring test <candidate>` / `shrk check wiring --explain <ruleId>` — declared vs registered set, no config write.',
32
+ '`shrk trace "<literal>"` — generalize registry tracing to any cross-layer string contract.',
33
+ '`shrk check orphans [--since <ref>] [--staged]` — first-class diff-robust reverse-closure.',
34
+ '`shrk finish` (a.k.a. `review --run`) — one changed-only "safe to finish?" verdict.',
35
+ '`--limit N` (`--limit 0` = all) on graph read commands (default 50).',
36
+ ],
37
+ changed: [
38
+ '`shrk impact --deleted` no longer ENOBUFS — the git diff is streamed via a shared `runGitLines`.',
39
+ 'Pack-health scores quality (resolved cross-refs, runnable verification), not mere presence.',
40
+ '`compress --type code` is a real strategy (was markdown-only).',
41
+ ],
42
+ removed: [],
43
+ },
44
+ {
45
+ version: '0.1.0-alpha.25',
46
+ title: 'Earned & change-attributable verdicts',
47
+ added: [
48
+ '`shrk changelog [--since <version>] [--all] [--json]` — the command-surface delta of the running build.',
49
+ '`shrk registry <name> exists <id> --fail-if-taken | --fail-if-missing` — guard-mode exit codes for pre-author checks.',
50
+ '`shrk registry <name> exists <id> --resolve` — map a synonym to the canonical id (registry `aliases`) before the test.',
51
+ '`shrk check registry-lifecycle --changed-only` — diff-scoped lifecycle check that terminates in seconds.',
52
+ '`shrk gen --typecheck` — compile the emitted file set against the detected tsconfig as a PRE-WRITE gate (a template bug fails at generation and REFUSES the write; nothing lands on disk).',
53
+ '`shrk gen --print` — inspect the rendered file bodies in one step (alias of `--show-content`).',
54
+ '`shrk graph cycles --include-type-edges` — opt back into counting type-only import edges.',
55
+ '`shrk context` / `shrk task --summary` (`--brief`) — the terse orientation view (now opt-in).',
56
+ ],
57
+ changed: [
58
+ '`shrk check wiring --changed-only` never renders a green verdict over 0 evaluated rules; reports `M of N (K skipped)`.',
59
+ '`shrk check registry-lifecycle` no longer hangs — bounded scan + wall-clock budget + partial-result flush; skip-dirs are configurable via `registryLifecycle.skipDirs`.',
60
+ 'Cycle detection excludes type-only import edges by default (clears phantom architecture reds).',
61
+ '`shrk gate` is change-scoped by default — reds only on change-introduced findings; baseline debt is a non-blocking bucket.',
62
+ '`shrk context` / `shrk task` render the FULL body by default (parity with why/reuse/knowledge get).',
63
+ '`shrk reuse` applies a confidence floor (weak keyword collisions → did-you-mean, score exposed) and shows the consumer total.',
64
+ '`compress --type code` labels its lossy fidelity (banner + JSON `fidelity`).',
65
+ '`changes summary` attributes areas from the declared layer/area taxonomy instead of bucketing to `unknown`.',
66
+ '`smart-context "<task>"` accepts `--task`, and fails loud (banner) when the local model is degraded instead of returning a stale guide dump.',
67
+ ],
68
+ removed: [],
69
+ },
70
+ ];
@@ -0,0 +1,3 @@
1
+ import { type ICommandHandler } from '../command-registry.js';
2
+ export declare const changelogCommand: ICommandHandler;
3
+ //# sourceMappingURL=changelog.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog.command.d.ts","sourceRoot":"","sources":["../../src/commands/changelog.command.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AA4ChC,eAAO,MAAM,gBAAgB,EAAE,eA4D9B,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { SHARKCRAFT_VERSION } from '@shrkcrft/shared';
2
+ import { flagBool, flagString, } from "../command-registry.js";
3
+ import { asJson, header } from "../output/format-output.js";
4
+ import { RELEASE_SURFACE_DELTAS } from "./changelog-data.js";
5
+ /** Parse `X.Y.Z[-alpha.N]` into a comparable tuple. A release outranks its prerelease. */
6
+ function parseVersion(v) {
7
+ const [coreStr, preStr] = v.replace(/^v/, '').split('-');
8
+ const parts = (coreStr ?? '').split('.').map((n) => Number(n) || 0);
9
+ const core = [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];
10
+ // No prerelease sorts ABOVE any prerelease of the same core; a prerelease
11
+ // sorts by its trailing number (alpha.24 < alpha.25).
12
+ let pre = Number.POSITIVE_INFINITY;
13
+ if (preStr) {
14
+ const m = preStr.match(/(\d+)/);
15
+ pre = m ? Number(m[1]) : 0;
16
+ }
17
+ return { core, pre };
18
+ }
19
+ /** -1 / 0 / 1 comparator over version strings. */
20
+ function compareVersions(a, b) {
21
+ const pa = parseVersion(a);
22
+ const pb = parseVersion(b);
23
+ for (let i = 0; i < 3; i += 1) {
24
+ const d = (pa.core[i] ?? 0) - (pb.core[i] ?? 0);
25
+ if (d !== 0)
26
+ return d < 0 ? -1 : 1;
27
+ }
28
+ if (pa.pre === pb.pre)
29
+ return 0;
30
+ return pa.pre < pb.pre ? -1 : 1;
31
+ }
32
+ function renderDeltaText(d) {
33
+ const lines = [`\n${d.version} — ${d.title}`];
34
+ const section = (label, items) => {
35
+ if (items.length === 0)
36
+ return;
37
+ lines.push(` ${label}:`);
38
+ for (const it of items)
39
+ lines.push(` • ${it}`);
40
+ };
41
+ section('Added', d.added);
42
+ section('Changed', d.changed);
43
+ section('Removed', d.removed);
44
+ return lines.join('\n') + '\n';
45
+ }
46
+ export const changelogCommand = {
47
+ name: 'changelog',
48
+ description: "The shrk command-surface delta of the running build — which verbs/flags were added, changed, or removed. Sourced from an in-binary release-notes asset (offline, authoritative for this exact build). `--since <version>` shows the cumulative delta since a prior version.",
49
+ usage: 'shrk changelog [--since <version>] [--all] [--json]',
50
+ booleanFlags: new Set(['all', 'json']),
51
+ run(args) {
52
+ const wantJson = flagBool(args, 'json');
53
+ const since = flagString(args, 'since');
54
+ const all = flagBool(args, 'all');
55
+ const current = SHARKCRAFT_VERSION;
56
+ // Newest-first for display.
57
+ const sorted = [...RELEASE_SURFACE_DELTAS].sort((a, b) => compareVersions(b.version, a.version));
58
+ let selected;
59
+ let scope;
60
+ if (all) {
61
+ selected = sorted;
62
+ scope = 'all recorded versions';
63
+ }
64
+ else if (since) {
65
+ // Cumulative delta: every recorded version strictly newer than `since`.
66
+ selected = sorted.filter((d) => compareVersions(d.version, since) > 0);
67
+ scope = `since ${since}`;
68
+ }
69
+ else {
70
+ // Default: the entry matching the running build, else the newest recorded.
71
+ const exact = sorted.find((d) => compareVersions(d.version, current) === 0);
72
+ selected = exact ? [exact] : sorted.slice(0, 1);
73
+ scope = exact ? `running build (${current})` : `latest recorded (running build ${current} has no recorded surface delta)`;
74
+ }
75
+ if (wantJson) {
76
+ process.stdout.write(asJson({
77
+ schema: 'sharkcraft.changelog/v1',
78
+ runningVersion: current,
79
+ scope,
80
+ ...(since ? { since } : {}),
81
+ count: selected.length,
82
+ versions: selected,
83
+ }) + '\n');
84
+ return 0;
85
+ }
86
+ process.stdout.write(header(`shrk changelog — ${scope}`));
87
+ if (selected.length === 0) {
88
+ process.stdout.write(since
89
+ ? ` No recorded surface changes since ${since}.\n`
90
+ : ' No recorded surface changes.\n');
91
+ return 0;
92
+ }
93
+ for (const d of selected)
94
+ process.stdout.write(renderDeltaText(d));
95
+ if (!all && !since) {
96
+ process.stdout.write('\n(pass --since <version> for the cumulative delta, or --all for every recorded version.)\n');
97
+ }
98
+ return 0;
99
+ },
100
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"changes.command.d.ts","sourceRoot":"","sources":["../../src/commands/changes.command.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AA2HhC,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
1
+ {"version":3,"file":"changes.command.d.ts","sourceRoot":"","sources":["../../src/commands/changes.command.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAiIhC,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
@@ -59,6 +59,10 @@ async function runChangesSummary(args) {
59
59
  for (const [area, list] of Object.entries(report.filesByArea)) {
60
60
  process.stdout.write(` ${area.padEnd(20)} (${list.length})\n`);
61
61
  }
62
+ if (report.unknownFiles > 0) {
63
+ process.stdout.write(` ! ${report.unknownFiles}/${report.totalFiles} file(s) (${Math.round(report.unknownRate * 100)}%) matched no declared area — ` +
64
+ 'the layer/area taxonomy may be missing globs (classifier diagnostic, not a low-risk signal).\n');
65
+ }
62
66
  if (report.touchedMcpTools.length > 0) {
63
67
  process.stdout.write('\nMCP tools touched (verify read-only invariant):\n');
64
68
  for (const m of report.touchedMcpTools)
@@ -1 +1 @@
1
- {"version":3,"file":"check.command.d.ts","sourceRoot":"","sources":["../../src/commands/check.command.ts"],"names":[],"mappings":"AAoBA,OAAO,EAML,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAurBhC,eAAO,MAAM,YAAY,EAAE,eAyE1B,CAAC"}
1
+ {"version":3,"file":"check.command.d.ts","sourceRoot":"","sources":["../../src/commands/check.command.ts"],"names":[],"mappings":"AAoBA,OAAO,EAML,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAm1BhC,eAAO,MAAM,YAAY,EAAE,eAoG1B,CAAC"}
@@ -4,9 +4,11 @@ import * as nodePath from 'node:path';
4
4
  import { flagBool, flagNumber, flagString, flagVars, resolveCwd, } from "../command-registry.js";
5
5
  import { asJson, header, kv } from "../output/format-output.js";
6
6
  import { maybeRunInWatchMode } from "../output/watch-loop.js";
7
+ import { computeDeletedOrphans } from "../diff/deleted-orphans.js";
8
+ import { renderWiringExplain } from "./wiring.command.js";
7
9
  import { validateTemplateVariables } from '@shrkcrft/templates';
8
10
  import { FileChangeType, planGeneration } from '@shrkcrft/generator';
9
- import { evaluateBoundaries, loadTsconfigPaths, runWiring, scanImports, summarizeImports, } from '@shrkcrft/boundaries';
11
+ import { evaluateBoundaries, explainWiring, loadTsconfigPaths, runWiring, scanImports, summarizeImports, } from '@shrkcrft/boundaries';
10
12
  function knowledgeGroup(inspection) {
11
13
  const dup = inspection.validationIssues.filter((i) => i.code === 'duplicate-id');
12
14
  const missing = inspection.validationIssues.filter((i) => i.code !== 'duplicate-id');
@@ -542,6 +544,27 @@ async function checkWiring(args) {
542
544
  }
543
545
  const rules = loaded.value.config.wiringRules ?? [];
544
546
  const planeDiagnostics = loaded.value.planeDiagnostics;
547
+ // `--explain <ruleId>`: dry-run ONE rule and print the declared + registered
548
+ // sets it extracts (file:line), the set-difference, and the verdict — the
549
+ // author-loop view of what the gate sees, without re-running the whole gate.
550
+ if (args.flags.has('explain')) {
551
+ const explainId = flagString(args, 'explain');
552
+ if (!explainId) {
553
+ process.stderr.write('Usage: shrk check wiring --explain <ruleId> [--json]\n');
554
+ return 2;
555
+ }
556
+ const rule = rules.find((r) => r.id === explainId);
557
+ if (!rule) {
558
+ const ids = rules.map((r) => r.id);
559
+ if (wantJson) {
560
+ process.stdout.write(asJson({ ok: false, error: 'not-found', ruleId: explainId, available: ids }) + '\n');
561
+ return 2;
562
+ }
563
+ process.stderr.write(`No wiring rule "${explainId}". Configured rules: ${ids.length > 0 ? ids.join(', ') : '(none)'}\n`);
564
+ return 2;
565
+ }
566
+ return renderWiringExplain(explainWiring(cwd, rule), wantJson);
567
+ }
545
568
  if (rules.length === 0) {
546
569
  if (wantJson) {
547
570
  process.stdout.write(asJson({ schema: 'sharkcraft.wiring/v1', rules: [], violations: [], verdict: 'pass' }) + '\n');
@@ -570,20 +593,42 @@ async function checkWiring(args) {
570
593
  const report = planeDiagnostics.length > 0
571
594
  ? { ...reportRaw, diagnostics: [...reportRaw.diagnostics, ...planeDiagnostics] }
572
595
  : reportRaw;
596
+ // Truthful evaluation accounting so a subset run never reads as a full green.
597
+ // configured — every wiring rule declared (the honest denominator).
598
+ // selected — rules that survived --changed-only / --only narrowing.
599
+ // evaluated — rules that actually ran a comparison (globs matched >0 files).
600
+ // skippedByScope — configured − selected (dropped by the diff/only narrowing).
601
+ // matchedNothing — selected − evaluated (in scope but matched 0 files).
602
+ const configured = rules.length;
603
+ const selected = report.rules.length;
604
+ const evaluated = report.evaluated;
605
+ const skippedByScope = Math.max(0, configured - selected);
606
+ const matchedNothing = Math.max(0, selected - evaluated);
607
+ const notVerified = Math.max(0, configured - evaluated);
608
+ const allEvaluated = evaluated === configured;
609
+ const scopeNote = changedOnly || since ? ' by --changed-only' : '';
610
+ const parts = [];
611
+ if (skippedByScope > 0)
612
+ parts.push(`${skippedByScope} skipped${scopeNote}`);
613
+ if (matchedNothing > 0)
614
+ parts.push(`${matchedNothing} matched no files`);
615
+ const breakdown = parts.length > 0 ? ` (${parts.join(', ')})` : '';
573
616
  if (wantJson) {
574
- process.stdout.write(asJson(report) + '\n');
617
+ // Carry the honest counts so a machine consumer can tell "0 evaluated" from
618
+ // a real green, and see how many rules the scope skipped.
619
+ process.stdout.write(asJson({ ...report, configured, selected, evaluated, skippedByScope, matchedNothing, notVerified }) + '\n');
575
620
  return report.verdict === 'errors' ? 1 : 0;
576
621
  }
577
622
  process.stdout.write(header('Wiring check'));
578
623
  // `evaluated` counts rules that actually ran a comparison (globs matched >0
579
624
  // files). When 0 rules evaluated but rules ARE configured, say so loudly —
580
625
  // "checked nothing" must never read as the green "every token is wired" pass.
581
- if (report.evaluated === 0) {
582
- process.stdout.write(` ! Nothing evaluated — ${report.rules.length} rule(s) configured but none matched files in scope` +
583
- (changedOnly || since ? ' (changed-only).\n' : '.\n'));
626
+ if (evaluated === 0) {
627
+ process.stdout.write(` ! 0 rules evaluated — NOT verified. ${configured} rule(s) configured${breakdown}; ` +
628
+ 'none ran a comparison in scope. Wiring was not checked — this is not a pass.\n');
584
629
  return 0;
585
630
  }
586
- process.stdout.write(kv('rules evaluated', `${report.evaluated} of ${report.rules.length}`) + '\n');
631
+ process.stdout.write(kv('rules evaluated', `${evaluated} of ${configured}${breakdown}`) + '\n');
587
632
  const errors = report.violations.filter((v) => v.severity === 'error').length;
588
633
  const warnings = report.violations.filter((v) => v.severity === 'warning').length;
589
634
  process.stdout.write(kv('violations', `${errors} error(s), ${warnings} warning(s)`) + '\n');
@@ -595,7 +640,16 @@ async function checkWiring(args) {
595
640
  process.stdout.write(` ! ${d}\n`);
596
641
  }
597
642
  if (report.violations.length === 0 && report.diagnostics.length === 0) {
598
- process.stdout.write('\nNo wiring violations — every declared token is registered. ✓\n');
643
+ if (allEvaluated) {
644
+ // Every configured rule ran — the earned full green.
645
+ process.stdout.write('\nNo wiring violations — every declared token is registered. ✓\n');
646
+ }
647
+ else {
648
+ // A subset ran: no violations AMONG WHAT RAN, but not a full green. Never
649
+ // print the unqualified "every declared token is wired" success sentence.
650
+ process.stdout.write(`\nNo wiring violations among the ${evaluated} rule(s) evaluated — ` +
651
+ `${notVerified} of ${configured} NOT verified${breakdown}. Not a full green.\n`);
652
+ }
599
653
  return 0;
600
654
  }
601
655
  if (report.violations.length === 0) {
@@ -619,12 +673,94 @@ async function checkWiring(args) {
619
673
  }
620
674
  return report.verdict === 'errors' ? 1 : 0;
621
675
  }
676
+ /**
677
+ * `shrk check orphans [--since <ref>] [--staged]`: first-class, diff-robust
678
+ * reverse-closure over REMOVED files. Reads the deleted files from the diff
679
+ * (vs `--since`, or the staged index with `--staged`) and queries the
680
+ * code-graph snapshot for surviving files that still import them or reference a
681
+ * symbol they declared — alias-resolved, incl. barrel re-exports. Each survivor
682
+ * is an error with `file:line`; the type checker misses a deleted barrel
683
+ * re-export or string-keyed registration, so this is a write-safety guard an
684
+ * agent can't replicate natively. Generalizes `impact --deleted`; pairs with
685
+ * the composite `finish` gate.
686
+ */
687
+ async function checkOrphans(args) {
688
+ const cwd = resolveCwd(args);
689
+ const wantJson = flagBool(args, 'json');
690
+ const since = flagString(args, 'since');
691
+ const staged = flagBool(args, 'staged');
692
+ const scan = await computeDeletedOrphans(cwd, {
693
+ ...(since ? { since } : {}),
694
+ ...(staged ? { staged: true } : {}),
695
+ });
696
+ if (!scan.ok) {
697
+ if (wantJson) {
698
+ process.stdout.write(asJson({
699
+ schema: 'sharkcraft.deleted-orphans/v1',
700
+ error: scan.error,
701
+ reason: scan.reason,
702
+ orphans: [],
703
+ }) + '\n');
704
+ return 2;
705
+ }
706
+ process.stdout.write(header('Orphan check'));
707
+ process.stdout.write(scan.reason === 'diff-unavailable'
708
+ ? ` ✗ Cannot resolve diff: ${scan.error ?? 'unknown'}\n`
709
+ : ` ✗ ${scan.error ?? 'orphan check unavailable'}\n`);
710
+ return 2;
711
+ }
712
+ const scopeLabel = staged ? 'staged' : `vs ${scan.ref}`;
713
+ // Nothing deleted → there is nothing to check. Report a LOUD skip, not a
714
+ // green "no orphans" — "checked nothing" must never read as "verified clean".
715
+ if (scan.deleted.length === 0) {
716
+ if (wantJson) {
717
+ process.stdout.write(asJson({
718
+ schema: 'sharkcraft.deleted-orphans/v1',
719
+ skipped: true,
720
+ ref: scan.ref,
721
+ resolvedDeleted: [],
722
+ unresolvedDeleted: [],
723
+ orphans: [],
724
+ diagnostics: [`no deleted files (${scopeLabel}) — nothing to check`],
725
+ }) + '\n');
726
+ return 0;
727
+ }
728
+ process.stdout.write(header('Orphan check'));
729
+ process.stdout.write(` ! Nothing deleted (${scopeLabel}) — orphan check skipped.\n`);
730
+ return 0;
731
+ }
732
+ const report = scan.report;
733
+ if (wantJson) {
734
+ process.stdout.write(asJson(report) + '\n');
735
+ return report.orphans.length > 0 ? 1 : 0;
736
+ }
737
+ process.stdout.write(header('Orphan check'));
738
+ process.stdout.write(kv('deleted files', `${scan.deleted.length} (${scopeLabel})`) + '\n');
739
+ if (report.orphans.length === 0) {
740
+ process.stdout.write('\nNo orphaned importers — nothing still references the deleted code. ✓\n');
741
+ for (const d of report.diagnostics.slice(0, 5))
742
+ process.stdout.write(` ! ${d}\n`);
743
+ return 0;
744
+ }
745
+ process.stdout.write(`\n${report.orphans.length} surviving importer(s) still reference deleted code:\n`);
746
+ for (const o of report.orphans.slice(0, 100)) {
747
+ const loc = o.path ? `${o.path}${o.line ? `:${o.line}` : ''}` : o.id;
748
+ const detail = o.via === 'reference' && o.symbol ? `references \`${o.symbol}\`` : 'imports';
749
+ process.stdout.write(` ✗ ${loc} ${detail} from deleted ${o.deletedFile}\n`);
750
+ }
751
+ if (report.orphans.length > 100) {
752
+ process.stdout.write(` … (${report.orphans.length - 100} more)\n`);
753
+ }
754
+ for (const d of report.diagnostics.slice(0, 5))
755
+ process.stdout.write(` ! ${d}\n`);
756
+ return 1;
757
+ }
622
758
  // Main shrk check + subcommands
623
759
  // ────────────────────────────────────────────────────────────────────────
624
760
  export const checkCommand = {
625
761
  name: 'check',
626
762
  description: 'Run SharkCraft-level validation across knowledge / rules / templates / pipelines / packs / action hints / doctor. `check boundaries [--watch [--paths a,b] [--debounce N] [--once]]` re-runs the boundary scan on file changes.',
627
- usage: 'shrk [--cwd <dir>] check [packs|pipelines|knowledge|generation|boundaries|imports|wiring] [--strict] [--min-score <0-100>] [--changed-only] [--since <ref>] [--only <ids>] [--json] [--watch [--paths <list>] [--debounce N] [--once]]',
763
+ usage: 'shrk [--cwd <dir>] check [packs|pipelines|knowledge|generation|boundaries|imports|wiring|orphans] [--strict] [--min-score <0-100>] [--changed-only] [--since <ref>] [--staged] [--only <ids>] [--json] [--watch [--paths <list>] [--debounce N] [--once]]',
628
764
  async run(args) {
629
765
  const sub = args.positional[0];
630
766
  // `check generation <id> <name>` legitimately takes extra positionals;
@@ -647,23 +783,52 @@ export const checkCommand = {
647
783
  return checkImports(args);
648
784
  if (sub === 'wiring')
649
785
  return checkWiring(args);
786
+ if (sub === 'orphans')
787
+ return checkOrphans(args);
650
788
  if (sub === 'registry-lifecycle') {
651
789
  const cwd = resolveCwd(args);
790
+ const changedOnly = flagBool(args, 'changed-only');
791
+ const since = flagString(args, 'since');
792
+ const scope = flagString(args, 'scope');
652
793
  const { buildRegistryLifecycleReport, renderRegistryLifecycleReportText } = await import('@shrkcrft/inspector');
653
- // The scan is a single synchronous pass with no streamed output; on a
654
- // large repo it can run for tens of seconds. Without a heartbeat that
655
- // silence reads as a hang, so announce the work first (human path only —
656
- // JSON consumers want a clean stdout).
657
- if (!flagBool(args, 'json')) {
658
- process.stderr.write('⏳ Scanning source + registries for lifecycle coverage (can take a while on large repos)…\n');
794
+ // `--changed-only` scopes the scan to the diff (tracked + untracked), so it
795
+ // runs inline in seconds; the full-tree scan is bounded by a wall-clock
796
+ // budget and flushes partial results on timeout instead of hanging.
797
+ let files;
798
+ if (changedOnly || since) {
799
+ const changed = resolveChangedFiles({
800
+ projectRoot: cwd,
801
+ ...(since ? { since } : {}),
802
+ ...(changedOnly && !since ? { includeWorktree: true } : {}),
803
+ });
804
+ files = changed.files;
805
+ }
806
+ // Full-tree walk honors the project's skipDirs override (so a repo that
807
+ // registers code under tools/ etc. isn't blinded by the default set).
808
+ let skipDirs;
809
+ if (files === undefined) {
810
+ const loaded = await resolveProjectConfig(cwd);
811
+ if (loaded.ok)
812
+ skipDirs = loaded.value.config.registryLifecycle?.skipDirs;
813
+ }
814
+ // Only the slow full-tree path needs the heartbeat (JSON keeps stdout clean).
815
+ if (!flagBool(args, 'json') && files === undefined) {
816
+ process.stderr.write('⏳ Scanning source + registries for lifecycle coverage (bounded by a wall-clock budget)…\n');
659
817
  }
660
- const report = buildRegistryLifecycleReport({ projectRoot: cwd });
818
+ const report = buildRegistryLifecycleReport({
819
+ projectRoot: cwd,
820
+ ...(files !== undefined ? { files } : {}),
821
+ ...(scope ? { scope } : {}),
822
+ ...(skipDirs ? { skipDirs } : {}),
823
+ });
824
+ // Deterministic non-zero on timeout so a wedged scan fails loud, not silent.
825
+ const exit = report.timedOut ? 2 : report.missingRemovers.length === 0 ? 0 : 1;
661
826
  if (flagBool(args, 'json')) {
662
827
  process.stdout.write(asJson(report) + '\n');
663
- return report.missingRemovers.length === 0 ? 0 : 1;
828
+ return exit;
664
829
  }
665
830
  process.stdout.write(renderRegistryLifecycleReportText(report));
666
- return report.missingRemovers.length === 0 ? 0 : 1;
831
+ return exit;
667
832
  }
668
833
  const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
669
834
  const readiness = buildAiReadinessReport(inspection);
@@ -245,6 +245,17 @@ export declare function commandLifecycle(e: ICommandCatalogEntry): CommandLifecy
245
245
  * membership.
246
246
  */
247
247
  export declare function defaultShowInHelp(e: ICommandCatalogEntry): boolean;
248
+ /**
249
+ * The "explain / dry-run" command family: entries that show you what a gate,
250
+ * ranker, or graph *sees* before you act (`search tuning explain`, `wiring
251
+ * explain`/`wiring test`, `boundaries explain`, `surface explain`, …). Several
252
+ * carry an Advanced surface, so {@link defaultShowInHelp} hides them despite
253
+ * being high-value — which is exactly why an agent finds them only by guessing.
254
+ * `shrk --full-help` lists this family in a dedicated section so they stop
255
+ * being hidden. Returns callable entries only (retired/deprecated/alias and
256
+ * R46-pruned are excluded), sorted by command.
257
+ */
258
+ export declare function listExplainFamily(): readonly ICommandCatalogEntry[];
248
259
  /**
249
260
  * Short "Use this when…" line derived from `surface`, `taskRole`,
250
261
  * `preferredCommand`, `replacedBy`, and `machineOnly`. Empty string when
@@ -1 +1 @@
1
- {"version":3,"file":"command-catalog.d.ts","sourceRoot":"","sources":["../../src/commands/command-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-catalog.d.ts","sourceRoot":"","sources":["../../src/commands/command-catalog.ts"],"names":[],"mappings":"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"}