@shrkcrft/inspector 0.1.0-alpha.28 → 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.
- package/dist/code-intelligence-doctor.d.ts +34 -0
- package/dist/code-intelligence-doctor.d.ts.map +1 -1
- package/dist/code-intelligence-doctor.js +68 -9
- package/dist/doc-references.d.ts +59 -0
- package/dist/doc-references.d.ts.map +1 -0
- package/dist/doc-references.js +190 -0
- package/dist/fuzzy-impact.d.ts.map +1 -1
- package/dist/fuzzy-impact.js +11 -20
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/knowledge-stale.d.ts.map +1 -1
- package/dist/knowledge-stale.js +18 -37
- package/dist/nearest-id.d.ts +30 -0
- package/dist/nearest-id.d.ts.map +1 -0
- package/dist/nearest-id.js +62 -0
- package/dist/policy-registry.d.ts +15 -0
- package/dist/policy-registry.d.ts.map +1 -0
- package/dist/policy-registry.js +64 -0
- package/dist/query-resolver.d.ts.map +1 -1
- package/dist/query-resolver.js +8 -8
- package/dist/reference-registry.d.ts +112 -0
- package/dist/reference-registry.d.ts.map +1 -0
- package/dist/reference-registry.js +239 -0
- package/dist/resolve-project-config.d.ts.map +1 -1
- package/dist/resolve-project-config.js +24 -6
- package/dist/self-config-doctor-v2.d.ts.map +1 -1
- package/dist/self-config-doctor-v2.js +37 -86
- package/dist/self-config-doctor.d.ts.map +1 -1
- package/dist/self-config-doctor.js +20 -37
- package/dist/sharkcraft-inspector.d.ts +13 -1
- package/dist/sharkcraft-inspector.d.ts.map +1 -1
- package/dist/sharkcraft-inspector.js +5 -3
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +10 -20
- 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;
|
|
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,
|
|
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,
|
|
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
|
-
|
|
120
|
-
|
|
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 (
|
|
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
|
|
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
|
|
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;
|
|
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"}
|
package/dist/fuzzy-impact.js
CHANGED
|
@@ -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
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const playbook =
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"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"}
|