@shrkcrft/inspector 0.1.0-alpha.29 → 0.1.0-alpha.30

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 (36) hide show
  1. package/dist/code-intelligence-doctor.d.ts +34 -0
  2. package/dist/code-intelligence-doctor.d.ts.map +1 -1
  3. package/dist/code-intelligence-doctor.js +68 -9
  4. package/dist/doc-references.d.ts +59 -0
  5. package/dist/doc-references.d.ts.map +1 -0
  6. package/dist/doc-references.js +190 -0
  7. package/dist/fuzzy-impact.d.ts.map +1 -1
  8. package/dist/fuzzy-impact.js +11 -20
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -0
  12. package/dist/knowledge-stale.d.ts.map +1 -1
  13. package/dist/knowledge-stale.js +18 -37
  14. package/dist/nearest-id.d.ts +30 -0
  15. package/dist/nearest-id.d.ts.map +1 -0
  16. package/dist/nearest-id.js +62 -0
  17. package/dist/policy-registry.d.ts +15 -0
  18. package/dist/policy-registry.d.ts.map +1 -0
  19. package/dist/policy-registry.js +64 -0
  20. package/dist/query-resolver.d.ts.map +1 -1
  21. package/dist/query-resolver.js +8 -8
  22. package/dist/reference-registry.d.ts +112 -0
  23. package/dist/reference-registry.d.ts.map +1 -0
  24. package/dist/reference-registry.js +239 -0
  25. package/dist/resolve-project-config.d.ts.map +1 -1
  26. package/dist/resolve-project-config.js +24 -6
  27. package/dist/self-config-doctor-v2.d.ts.map +1 -1
  28. package/dist/self-config-doctor-v2.js +37 -86
  29. package/dist/self-config-doctor.d.ts.map +1 -1
  30. package/dist/self-config-doctor.js +20 -37
  31. package/dist/sharkcraft-inspector.d.ts +13 -1
  32. package/dist/sharkcraft-inspector.d.ts.map +1 -1
  33. package/dist/sharkcraft-inspector.js +5 -3
  34. package/dist/test-runner.d.ts.map +1 -1
  35. package/dist/test-runner.js +10 -20
  36. package/package.json +17 -17
@@ -10,6 +10,40 @@ export interface ICodeIntelligenceDoctorOptions {
10
10
  * to flip a fresh fixture into "stale" without changing mtime.
11
11
  */
12
12
  staleThresholdDays?: number;
13
+ /**
14
+ * How far the graph index has diverged from the working tree.
15
+ *
16
+ * THE freshness verdict. Age is a display detail: an index built five days
17
+ * ago with nothing changed since is current, and one built a minute ago with
18
+ * a file changed since is not. Judging by age alone produced the exact
19
+ * contradiction this input exists to end — `graph status` reporting `stale`
20
+ * while this digest reported `fresh (1m ago)` on the same index in the same
21
+ * second, and every arch/cycle count derived from it inheriting the staleness
22
+ * unmarked.
23
+ *
24
+ * Injected because `detectGraphFreshness` lives in `@shrkcrft/graph`, which
25
+ * sits ABOVE inspector in the layer order. Callers that can see the graph
26
+ * (cli, mcp-server) pass it; when it is absent the checks report
27
+ * "not verified" rather than guessing from a timestamp.
28
+ */
29
+ graphDivergence?: IGraphDivergence;
30
+ }
31
+ /**
32
+ * The working-tree divergence of a stored index.
33
+ *
34
+ * Structurally identical to `@shrkcrft/graph`'s `IGraphFreshness` so a caller
35
+ * can pass that value straight through — declared here because this layer
36
+ * cannot import that package.
37
+ */
38
+ export interface IGraphDivergence {
39
+ /** False when no index has been built at all. */
40
+ readonly hasIndex: boolean;
41
+ /** Indexed files whose content changed since. */
42
+ readonly modified: readonly string[];
43
+ /** Files on disk the index has never seen. */
44
+ readonly added: readonly string[];
45
+ /** Indexed files that no longer exist. */
46
+ readonly deleted: readonly string[];
13
47
  }
14
48
  /**
15
49
  * Read every code-intelligence package's persisted state and produce a
@@ -1 +1 @@
1
- {"version":3,"file":"code-intelligence-doctor.d.ts","sourceRoot":"","sources":["../src/code-intelligence-doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAoKvE,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,8BAAmC,GAC3C,YAAY,EAAE,CAkBhB"}
1
+ {"version":3,"file":"code-intelligence-doctor.d.ts","sourceRoot":"","sources":["../src/code-intelligence-doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAoKvE,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,eAAe,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAiBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,8BAAmC,GAC3C,YAAY,EAAE,CAkBhB"}
@@ -43,6 +43,23 @@ function sumValues(rec) {
43
43
  }
44
44
  return total;
45
45
  }
46
+ /** Files the index is behind by, or `undefined` when divergence was not measured. */
47
+ function behindCount(d) {
48
+ if (!d || !d.hasIndex)
49
+ return undefined;
50
+ return d.modified.length + d.added.length + d.deleted.length;
51
+ }
52
+ /** A human summary of what diverged, for the stale message. */
53
+ function divergenceSummary(d) {
54
+ const parts = [];
55
+ if (d.modified.length > 0)
56
+ parts.push(`${d.modified.length} modified`);
57
+ if (d.added.length > 0)
58
+ parts.push(`${d.added.length} new`);
59
+ if (d.deleted.length > 0)
60
+ parts.push(`${d.deleted.length} deleted`);
61
+ return parts.join(', ');
62
+ }
46
63
  /**
47
64
  * Read every code-intelligence package's persisted state and produce a
48
65
  * compact set of doctor findings. The function is sync (matches the
@@ -53,12 +70,12 @@ export function buildCodeIntelligenceChecks(projectRoot, options = {}) {
53
70
  const nowMs = options.nowMs ?? Date.now();
54
71
  const staleDays = options.staleThresholdDays ?? STALE_THRESHOLD_DAYS;
55
72
  const checks = [];
56
- checks.push(...graphChecks(projectRoot, nowMs, staleDays));
73
+ checks.push(...graphChecks(projectRoot, nowMs, options.graphDivergence));
57
74
  checks.push(...ruleGraphChecks(projectRoot, nowMs, staleDays));
58
75
  checks.push(...apiSurfaceChecks(projectRoot, nowMs, staleDays));
59
76
  checks.push(...qualityGateChecks(projectRoot, nowMs, staleDays));
60
77
  checks.push(...migrationChecks(projectRoot));
61
- checks.push(...architectureChecks(projectRoot, nowMs, staleDays));
78
+ checks.push(...architectureChecks(projectRoot, nowMs, staleDays, options.graphDivergence));
62
79
  checks.push(...impactRunChecks(projectRoot, nowMs, staleDays));
63
80
  checks.push(...frameworkChecks(projectRoot, nowMs, staleDays));
64
81
  checks.push(...structuralRegistryChecks(projectRoot));
@@ -87,7 +104,7 @@ const EXPECTED_SCHEMAS = [
87
104
  { rel: 'structural/patterns.json', expected: 'sharkcraft.structural-pattern-registry/v1', package: '@shrkcrft/structural-search' },
88
105
  { rel: 'context-planner/intent-benchmark.json', expected: 'sharkcraft.intent-benchmark/v1', package: '@shrkcrft/context-planner' },
89
106
  ];
90
- function graphChecks(projectRoot, nowMs, staleDays) {
107
+ function graphChecks(projectRoot, nowMs, divergence) {
91
108
  const metaPath = nodePath.join(projectRoot, '.sharkcraft', 'graph', 'meta.json');
92
109
  if (!existsSync(metaPath)) {
93
110
  return [
@@ -116,8 +133,11 @@ function graphChecks(projectRoot, nowMs, staleDays) {
116
133
  ];
117
134
  }
118
135
  const days = ageDays(manifest.lastIndexedAt, nowMs);
119
- const stale = days !== undefined && days > staleDays;
120
- const ageStr = days !== undefined ? ` (${fmtAge(days)})` : '';
136
+ // Divergence is the verdict; age is a display detail. `behind === undefined`
137
+ // means nobody measured it which is NOT a pass, so the check says so
138
+ // instead of falling back to the timestamp that caused the contradiction.
139
+ const behind = behindCount(divergence);
140
+ const ageStr = days !== undefined ? ` (indexed ${fmtAge(days)})` : '';
121
141
  const counts = `${manifest.filesIndexed ?? 0} files, ${sumValues(manifest.nodesByKind)} nodes, ${sumValues(manifest.edgesByKind)} edges`;
122
142
  const cycleTag = typeof manifest.cycleCount === 'number' && manifest.cycleCount > 0
123
143
  ? `, ${manifest.cycleCount} cycle${manifest.cycleCount === 1 ? '' : 's'}` +
@@ -126,14 +146,30 @@ function graphChecks(projectRoot, nowMs, staleDays) {
126
146
  : '')
127
147
  : '';
128
148
  const out = [];
129
- if (stale) {
149
+ if (behind === undefined) {
150
+ // Nothing measured the divergence, so "current" would be a guess. The
151
+ // loud-skip contract the six rule planes honour says an unverified result
152
+ // is neither a pass nor a failure — it is "nothing was verified".
153
+ out.push({
154
+ id: 'code-intelligence-graph',
155
+ title: 'Code-intelligence graph index',
156
+ severity: DoctorSeverity.Info,
157
+ advisory: true,
158
+ category: CATEGORY,
159
+ message: `Graph index freshness NOT VERIFIED${ageStr} — ${counts}${cycleTag}.`,
160
+ fix: 'Run `shrk graph status` for the divergence-checked verdict.',
161
+ whyThisMatters: 'Age is not freshness: an index built days ago with nothing changed since is current, and one built a minute ago with a file changed since is not. Reporting the timestamp as a verdict is how a stale index gets read as authoritative.',
162
+ });
163
+ }
164
+ else if (behind > 0) {
130
165
  out.push({
131
166
  id: 'code-intelligence-graph',
132
167
  title: 'Code-intelligence graph index',
133
168
  severity: DoctorSeverity.Warning,
134
169
  advisory: true,
135
170
  category: CATEGORY,
136
- message: `Graph index is stale${ageStr} ${counts}${cycleTag}.`,
171
+ message: `Graph index STALE ${behind} file(s) changed since index ` +
172
+ `(${divergenceSummary(divergence)})${ageStr}; ${counts}${cycleTag}.`,
137
173
  fix: 'Re-index with `shrk graph index --changed` (or `--full`).',
138
174
  whyThisMatters: 'Stale code graph makes `shrk impact`, `shrk graph callers`, and context packs return outdated answers.',
139
175
  });
@@ -144,7 +180,7 @@ function graphChecks(projectRoot, nowMs, staleDays) {
144
180
  title: 'Code-intelligence graph index',
145
181
  severity: DoctorSeverity.Ok,
146
182
  category: CATEGORY,
147
- message: `Graph index fresh${ageStr} — ${counts}${cycleTag}.`,
183
+ message: `Graph index current${ageStr} — ${counts}${cycleTag}.`,
148
184
  });
149
185
  }
150
186
  // Cycles ≥ a heuristic threshold of 5 (or any 3+-file cycle) become
@@ -400,7 +436,7 @@ function qualityGateChecks(projectRoot, nowMs, staleDays) {
400
436
  },
401
437
  ];
402
438
  }
403
- function architectureChecks(projectRoot, nowMs, staleDays) {
439
+ function architectureChecks(projectRoot, nowMs, staleDays, divergence) {
404
440
  const archDir = nodePath.join(projectRoot, '.sharkcraft', 'architecture');
405
441
  const baselinePath = nodePath.join(archDir, 'baseline.json');
406
442
  const lastPath = nodePath.join(archDir, 'last.json');
@@ -477,6 +513,29 @@ function architectureChecks(projectRoot, nowMs, staleDays) {
477
513
  (baseline.countsBySeverity?.['error'] ?? 0);
478
514
  const warnDelta = (last.countsBySeverity?.['warning'] ?? 0) -
479
515
  (baseline.countsBySeverity?.['warning'] ?? 0);
516
+ // A delta computed from an index the working tree has moved past is neither
517
+ // a green nor a red — it is "nothing was verified". This is the loud-skip
518
+ // contract the six data-defined rule planes already honour, extended to the
519
+ // graph-derived findings. It failed in both directions before: a digest
520
+ // under-reported real architecture debt 5-of-6 while displaying "fresh", and
521
+ // the same stale snapshot can just as easily report a violation that has
522
+ // already been fixed.
523
+ const behind = behindCount(divergence);
524
+ if (behind !== undefined && behind > 0) {
525
+ return [
526
+ {
527
+ id: 'code-intelligence-architecture',
528
+ title: 'Architecture baseline',
529
+ severity: DoctorSeverity.Info,
530
+ advisory: true,
531
+ category: CATEGORY,
532
+ message: `Architecture delta NOT VERIFIED — the graph index is ${behind} file(s) behind ` +
533
+ `(${divergenceSummary(divergence)}), so any count derived from it is out of date.`,
534
+ fix: 'Re-index with `shrk graph index --changed`, then `shrk arch check`.',
535
+ whyThisMatters: 'A count from a stale index misses violations in files it never saw AND reports ones already fixed. Presenting it as a number invites acting on both.',
536
+ },
537
+ ];
538
+ }
480
539
  if (newCount === 0 && errDelta <= 0 && warnDelta <= 0) {
481
540
  return [
482
541
  {
@@ -0,0 +1,59 @@
1
+ import type { IDocReferenceRule } from '@shrkcrft/core';
2
+ import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
3
+ /**
4
+ * The prose-reference linter.
5
+ *
6
+ * Scans configured docs for id-shaped tokens and asserts each resolves to a
7
+ * real registered id. The failure it exists to catch is silent: a table of
8
+ * template ids in a README or an agent skill file drifts from the registry and
9
+ * nothing — no build, no type-check, no existing gate — notices until someone
10
+ * runs the command and it fails.
11
+ *
12
+ * Everything here is deterministic text work plus a registry lookup. No model,
13
+ * no network, no guessing what a doc "meant".
14
+ */
15
+ /** One token the rule considered. */
16
+ export interface IDocReferenceToken {
17
+ readonly token: string;
18
+ /** Project-relative path of the document. */
19
+ readonly file: string;
20
+ /** 1-based line. */
21
+ readonly line: number;
22
+ /** The registry that accepted it, when it resolved. */
23
+ readonly resolvedAs?: string;
24
+ /** Why it was not treated as a reference, when it was skipped. */
25
+ readonly skipped?: 'context' | 'exempt' | 'exempt-marker';
26
+ }
27
+ /** An id-shaped token that resolved to nothing. */
28
+ export interface IDocReferenceFinding {
29
+ readonly ruleId: string;
30
+ readonly token: string;
31
+ readonly file: string;
32
+ readonly line: number;
33
+ readonly severity: 'error' | 'warning';
34
+ readonly message: string;
35
+ /** Closest registered ids, nearest first. Empty when nothing is close. */
36
+ readonly didYouMean: readonly string[];
37
+ readonly hint?: string;
38
+ }
39
+ /** One rule's outcome. */
40
+ export interface IDocReferenceResult {
41
+ readonly ruleId: string;
42
+ readonly description?: string;
43
+ readonly severity: 'error' | 'warning';
44
+ readonly status: 'passed' | 'failed' | 'skipped' | 'error';
45
+ /** Documents the globs matched. */
46
+ readonly filesScanned: number;
47
+ /** Tokens that counted as references (context-gated, non-exempt). */
48
+ readonly tokensChecked: number;
49
+ /** Tokens matched but deliberately not treated as references. */
50
+ readonly tokensSkipped: number;
51
+ readonly findings: readonly IDocReferenceFinding[];
52
+ /** Every token considered — the `explain` view. */
53
+ readonly tokens: readonly IDocReferenceToken[];
54
+ readonly skipReason?: string;
55
+ readonly error?: string;
56
+ }
57
+ /** Evaluate one doc-reference rule against the tree. */
58
+ export declare function checkDocReferences(projectRoot: string, rule: IDocReferenceRule, inspection: ISharkcraftInspection, excludeDirs?: readonly string[]): IDocReferenceResult;
59
+ //# sourceMappingURL=doc-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-references.d.ts","sourceRoot":"","sources":["../src/doc-references.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAUxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;;;;;;;;;;GAWG;AAEH,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,eAAe,CAAC;CAC3D;AAED,mDAAmD;AACnD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,0BAA0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IAC3D,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACnD,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAmDD,wDAAwD;AACxD,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,qBAAqB,EACjC,WAAW,GAAE,SAAS,MAAM,EAAO,GAClC,mBAAmB,CA6JrB"}
@@ -0,0 +1,190 @@
1
+ import { dotDirsNamedBy, matchesAny, readMatchingFiles, safeCompile } from '@shrkcrft/boundaries';
2
+ import { nearestIds } from "./nearest-id.js";
3
+ import { emptyReferenceKinds, isCacheBackedKind, referenceIdExists, referenceIdPool, } from "./reference-registry.js";
4
+ /** Matches `<!-- marker -->`, with or without a trailing `: reason`. */
5
+ function markerRe(marker) {
6
+ const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
7
+ return new RegExp(`<!--\\s*${escaped}\\s*(?::[^>]*)?-->`);
8
+ }
9
+ /** Character ranges of a line that sit inside a `code span`. */
10
+ function backtickRanges(line) {
11
+ const ranges = [];
12
+ const re = /(`+)([^`]*?)\1/g;
13
+ let m;
14
+ while ((m = re.exec(line)) !== null) {
15
+ ranges.push({ start: m.index, end: m.index + m[0].length });
16
+ }
17
+ return ranges;
18
+ }
19
+ /**
20
+ * Whether a match at `index` counts as a reference under the rule's context
21
+ * gate.
22
+ *
23
+ * `insideFence` is passed separately because a fenced block spans lines: its
24
+ * contents are code regardless of backticks on the line itself.
25
+ */
26
+ function passesContext(rule, line, index, insideFence) {
27
+ const mode = rule.requireContext ?? 'backtick';
28
+ if (mode === 'off')
29
+ return true;
30
+ if (mode === 'after') {
31
+ // "Follows a cue word" has to mean IMMEDIATELY follows. A plain
32
+ // `includes` would qualify every later token on the line too, because the
33
+ // cue still appears somewhere before it — so `shrk gen nge.a — and nge.b`
34
+ // would lint `nge.b` as well. Only whitespace may separate the two.
35
+ const before = line.slice(0, index).toLowerCase();
36
+ return (rule.afterWords ?? []).some((w) => {
37
+ const cue = w.toLowerCase();
38
+ const at = before.lastIndexOf(cue);
39
+ if (at === -1)
40
+ return false;
41
+ return before.slice(at + cue.length).trim() === '';
42
+ });
43
+ }
44
+ if (insideFence)
45
+ return true;
46
+ return backtickRanges(line).some((r) => index >= r.start && index < r.end);
47
+ }
48
+ /** Evaluate one doc-reference rule against the tree. */
49
+ export function checkDocReferences(projectRoot, rule, inspection, excludeDirs = []) {
50
+ const severity = rule.severity ?? 'error';
51
+ const base = {
52
+ ruleId: rule.id,
53
+ ...(rule.description ? { description: rule.description } : {}),
54
+ severity,
55
+ };
56
+ const compiled = safeCompile(rule.tokenPattern, `${rule.tokenPatternFlags ?? ''}g`);
57
+ if (compiled.error || !compiled.re) {
58
+ return {
59
+ ...base,
60
+ status: 'error',
61
+ filesScanned: 0,
62
+ tokensChecked: 0,
63
+ tokensSkipped: 0,
64
+ findings: [],
65
+ tokens: [],
66
+ error: `tokenPattern ${compiled.error}`,
67
+ };
68
+ }
69
+ const kinds = rule.resolvesAs;
70
+ // Resolving against an EMPTY registry cannot succeed, so every id checked
71
+ // against it is reported unresolved — a gate confidently flagging CORRECT
72
+ // usage. That is worse than no gate at all (it is the fastest way to get one
73
+ // switched off), so refuse loudly instead of emitting a page of false
74
+ // findings.
75
+ const empty = emptyReferenceKinds(inspection, kinds);
76
+ if (empty.length === kinds.length && kinds.length > 0) {
77
+ const warmable = empty.filter(isCacheBackedKind);
78
+ return {
79
+ ...base,
80
+ status: 'error',
81
+ filesScanned: 0,
82
+ tokensChecked: 0,
83
+ tokensSkipped: 0,
84
+ findings: [],
85
+ tokens: [],
86
+ error: `no ids are registered for ${empty.join(' / ')} — nothing could resolve, ` +
87
+ `so every reference would be reported wrong` +
88
+ (warmable.length > 0
89
+ ? ` (call warmReferenceRegistries() before checking, or this repo has no ${warmable.join(' / ')})`
90
+ : ''),
91
+ };
92
+ }
93
+ // Prose lives in places the code walkers deliberately avoid — an agent skill
94
+ // file sits in `.claude/skills`. The rule's own globs say which dot-dirs it
95
+ // means, and it gets exactly those.
96
+ const cache = readMatchingFiles(projectRoot, rule.files, new Set(excludeDirs), dotDirsNamedBy(rule.files));
97
+ const docs = [...cache.entries()]
98
+ .filter(([path]) => matchesAny(path, rule.files))
99
+ .sort(([a], [b]) => a.localeCompare(b));
100
+ const pool = referenceIdPool(inspection, kinds);
101
+ const exempt = new Set(rule.exempt ?? []);
102
+ const marker = rule.exemptMarker;
103
+ const tokens = [];
104
+ const findings = [];
105
+ for (const [file, content] of docs) {
106
+ const lines = content.split('\n');
107
+ let insideFence = false;
108
+ for (const [i, rawLine] of lines.entries()) {
109
+ // A ``` toggles the fenced-code state for every FOLLOWING line; the fence
110
+ // line itself carries no tokens worth checking.
111
+ if (/^\s*```/.test(rawLine)) {
112
+ insideFence = !insideFence;
113
+ continue;
114
+ }
115
+ // `<!-- ref-allow -->` and `<!-- ref-allow: why this is not a reference -->`
116
+ // both count. An exemption whose whole justification is that it was
117
+ // reviewed in a diff needs somewhere to say WHY, and a marker that must
118
+ // be byte-exact leaves the reason to a comment on another line — where
119
+ // this gate cannot see it, so the exemption silently stops applying.
120
+ const markerHit = marker !== undefined && markerRe(marker).test(rawLine);
121
+ compiled.re.lastIndex = 0;
122
+ let m;
123
+ while ((m = compiled.re.exec(rawLine)) !== null) {
124
+ const token = m[0];
125
+ const site = { token, file, line: i + 1 };
126
+ if (markerHit) {
127
+ tokens.push({ ...site, skipped: 'exempt-marker' });
128
+ continue;
129
+ }
130
+ if (exempt.has(token)) {
131
+ tokens.push({ ...site, skipped: 'exempt' });
132
+ continue;
133
+ }
134
+ if (!passesContext(rule, rawLine, m.index, insideFence)) {
135
+ tokens.push({ ...site, skipped: 'context' });
136
+ continue;
137
+ }
138
+ const resolvedAs = kinds.find((kind) => referenceIdExists(inspection, kind, token));
139
+ if (resolvedAs !== undefined) {
140
+ tokens.push({ ...site, resolvedAs });
141
+ continue;
142
+ }
143
+ tokens.push(site);
144
+ const suggestions = nearestIds(token, pool).map((n) => n.id);
145
+ findings.push({
146
+ ruleId: rule.id,
147
+ ...site,
148
+ severity,
149
+ message: `"${token}" is not a registered ${kinds.join(' / ')}`,
150
+ didYouMean: suggestions,
151
+ ...(rule.hint ? { hint: rule.hint } : {}),
152
+ });
153
+ // A zero-width match would loop forever; nudge past it.
154
+ if (m[0].length === 0)
155
+ compiled.re.lastIndex += 1;
156
+ }
157
+ }
158
+ }
159
+ const tokensChecked = tokens.filter((t) => t.skipped === undefined).length;
160
+ const tokensSkipped = tokens.length - tokensChecked;
161
+ // A rule that CHECKED nothing enforced nothing. Which of "0 docs" or "0
162
+ // tokens" happened matters to whoever has to fix it, so the reason says.
163
+ if (tokensChecked === 0) {
164
+ const failed = rule.failOnEmpty ?? severity === 'error';
165
+ return {
166
+ ...base,
167
+ status: failed ? 'failed' : 'skipped',
168
+ filesScanned: docs.length,
169
+ tokensChecked,
170
+ tokensSkipped,
171
+ findings: [],
172
+ tokens,
173
+ skipReason: docs.length === 0
174
+ ? `0 documents matched (${rule.files.join(', ')})`
175
+ : `${docs.length} document(s) scanned but no token counted as a reference` +
176
+ (tokensSkipped > 0
177
+ ? ` (${tokensSkipped} matched and were skipped — check \`requireContext\`)`
178
+ : ''),
179
+ };
180
+ }
181
+ return {
182
+ ...base,
183
+ status: findings.length > 0 && severity === 'error' ? 'failed' : findings.length > 0 ? 'failed' : 'passed',
184
+ filesScanned: docs.length,
185
+ tokensChecked,
186
+ tokensSkipped,
187
+ findings,
188
+ tokens,
189
+ };
190
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"fuzzy-impact.d.ts","sourceRoot":"","sources":["../src/fuzzy-impact.ts"],"names":[],"mappings":"AA2BA,OAAO,EACL,cAAc,EAEd,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,eAAO,MAAM,8BAA8B,0CAA0C,CAAC;AAEtF,oBAAY,qBAAqB;IAC/B,SAAS,eAAe;IACxB,SAAS,cAAc;IACvB,SAAS,eAAe;IACxB,UAAU,gBAAgB;IAC1B,OAAO,aAAa;IACpB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,8BAA8B,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,sEAAsE;IACtE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;IACrC,2EAA2E;IAC3E,eAAe,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,kCAAkC;IAClC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA+aD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,0BAA+B,GACvC,sBAAsB,CA+BxB"}
1
+ {"version":3,"file":"fuzzy-impact.d.ts","sourceRoot":"","sources":["../src/fuzzy-impact.ts"],"names":[],"mappings":"AA2BA,OAAO,EACL,cAAc,EAEd,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAKvE,eAAO,MAAM,8BAA8B,0CAA0C,CAAC;AAEtF,oBAAY,qBAAqB;IAC/B,SAAS,eAAe;IACxB,SAAS,cAAc;IACvB,SAAS,eAAe;IACxB,UAAU,gBAAgB;IAC1B,OAAO,aAAa;IACpB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,8BAA8B,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,sEAAsE;IACtE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;IACrC,2EAA2E;IAC3E,eAAe,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,kCAAkC;IAClC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAqaD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,0BAA+B,GACvC,sBAAsB,CA+BxB"}
@@ -27,6 +27,8 @@ import { existsSync } from 'node:fs';
27
27
  import * as nodePath from 'node:path';
28
28
  import { QueryMatchKind, resolveQuery, } from "./query-resolver.js";
29
29
  import { HELPERS } from "./helper-registry.js";
30
+ import { listConstructs } from "./construct-registry.js";
31
+ import { listPlaybooks } from "./playbook-registry.js";
30
32
  export const FUZZY_IMPACT_RESOLUTION_SCHEMA = 'sharkcraft.fuzzy-impact-resolution/v1';
31
33
  export var FuzzyImpactSourceKind;
32
34
  (function (FuzzyImpactSourceKind) {
@@ -45,22 +47,11 @@ export var FuzzyImpactSourceKind;
45
47
  FuzzyImpactSourceKind["Unresolved"] = "unresolved";
46
48
  })(FuzzyImpactSourceKind || (FuzzyImpactSourceKind = {}));
47
49
  function listConstructsFrom(inspection) {
48
- // 1) Pre-warmed sync cache.
49
- const direct = inspection.constructs;
50
- if (direct && direct.length > 0)
51
- return direct;
52
- // 2) Registry with list() — duck-typed.
53
- const reg = inspection
54
- .constructRegistry;
55
- if (reg && typeof reg.list === 'function') {
56
- try {
57
- return reg.list();
58
- }
59
- catch {
60
- return [];
61
- }
62
- }
63
- return [];
50
+ // One source. The two structural casts that used to precede this
51
+ // (`inspection.constructs`, then `inspection.constructRegistry.list()`) read
52
+ // properties nothing assigns, so this function returned [] in production
53
+ // while tests that faked those properties passed.
54
+ return listConstructs(inspection);
64
55
  }
65
56
  function constructFor(inspection, id) {
66
57
  return listConstructsFrom(inspection).find((c) => c.id === id);
@@ -145,10 +136,10 @@ function knowledgeFileReferences(inspection, knowledgeId) {
145
136
  return out;
146
137
  }
147
138
  function playbookFiles(inspection, playbookId) {
148
- const reg = inspection.playbookRegistry;
149
- if (!reg || typeof reg.get !== 'function')
150
- return [];
151
- const playbook = reg.get(playbookId);
139
+ // `listPlaybooks` is the same source `shrk playbooks list` reads. The
140
+ // previous `inspection.playbookRegistry?.get()` cast pointed at a property
141
+ // nothing ever assigned, so every playbook expanded to zero files.
142
+ const playbook = listPlaybooks(inspection).find((p) => p.id === playbookId);
152
143
  if (!playbook)
153
144
  return [];
154
145
  const out = [];
package/dist/index.d.ts CHANGED
@@ -95,6 +95,7 @@ export * from './demo-package.js';
95
95
  export * from './release-readiness.js';
96
96
  export * from './pack-release-check.js';
97
97
  export * from './playbook-registry.js';
98
+ export * from './policy-registry.js';
98
99
  export * from './playbook-script.js';
99
100
  export * from './search-index.js';
100
101
  export * from './search-tuning-registry.js';
@@ -229,4 +230,7 @@ export * from './grounding/validate-extracted-plan.js';
229
230
  export * from './grounding/build-grounding.js';
230
231
  export * from './grounding/nx-projects.js';
231
232
  export * from './why-file.js';
233
+ export * from './nearest-id.js';
234
+ export * from './reference-registry.js';
235
+ export * from './doc-references.js';
232
236
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -95,6 +95,7 @@ export * from "./demo-package.js";
95
95
  export * from "./release-readiness.js";
96
96
  export * from "./pack-release-check.js";
97
97
  export * from "./playbook-registry.js";
98
+ export * from "./policy-registry.js";
98
99
  export * from "./playbook-script.js";
99
100
  export * from "./search-index.js";
100
101
  export * from "./search-tuning-registry.js";
@@ -240,3 +241,6 @@ export * from "./grounding/build-grounding.js";
240
241
  export * from "./grounding/nx-projects.js";
241
242
  // DX/feedback3 — `shrk why <file>` report builder.
242
243
  export * from "./why-file.js";
244
+ export * from "./nearest-id.js";
245
+ export * from "./reference-registry.js";
246
+ export * from "./doc-references.js";
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"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"}