@shrkcrft/inspector 0.1.0-alpha.31 → 0.1.0-alpha.32
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/agent-task-prep.d.ts.map +1 -1
- package/dist/agent-task-prep.js +9 -1
- package/dist/codemod-assist.d.ts.map +1 -1
- package/dist/codemod-assist.js +3 -1
- package/dist/comment-syntax.d.ts +15 -0
- package/dist/comment-syntax.d.ts.map +1 -0
- package/dist/comment-syntax.js +15 -0
- package/dist/contribution-load-failures.d.ts +18 -2
- package/dist/contribution-load-failures.d.ts.map +1 -1
- package/dist/contribution-load-failures.js +20 -3
- package/dist/contributions-report.js +2 -2
- package/dist/convention-applicability.d.ts +46 -0
- package/dist/convention-applicability.d.ts.map +1 -0
- package/dist/convention-applicability.js +247 -0
- package/dist/convention-filter-level.d.ts +13 -0
- package/dist/convention-filter-level.d.ts.map +1 -0
- package/dist/convention-filter-level.js +13 -0
- package/dist/convention-registry.d.ts +29 -4
- package/dist/convention-registry.d.ts.map +1 -1
- package/dist/convention-registry.js +58 -23
- package/dist/custom-checks.d.ts.map +1 -1
- package/dist/custom-checks.js +6 -4
- package/dist/decision-records.d.ts +4 -0
- package/dist/decision-records.d.ts.map +1 -1
- package/dist/decision-records.js +165 -66
- package/dist/declared-reference-coverage.d.ts +1 -1
- package/dist/declared-reference-coverage.d.ts.map +1 -1
- package/dist/declared-reference-coverage.js +6 -1
- package/dist/feedback-ingestion.d.ts.map +1 -1
- package/dist/feedback-ingestion.js +7 -1
- package/dist/file-languages.d.ts +9 -0
- package/dist/file-languages.d.ts.map +1 -0
- package/dist/file-languages.js +91 -0
- package/dist/fix-preview.d.ts.map +1 -1
- package/dist/fix-preview.js +78 -17
- package/dist/fuzzy-impact.d.ts.map +1 -1
- package/dist/fuzzy-impact.js +2 -1
- package/dist/git-helpers.d.ts +29 -4
- package/dist/git-helpers.d.ts.map +1 -1
- package/dist/git-helpers.js +69 -10
- package/dist/i-contribution-file-validation.d.ts +8 -0
- package/dist/i-contribution-file-validation.d.ts.map +1 -1
- package/dist/i-convention-applicability-reason.d.ts +29 -0
- package/dist/i-convention-applicability-reason.d.ts.map +1 -0
- package/dist/i-convention-applicability-reason.js +1 -0
- package/dist/i-convention-applicability.d.ts +9 -0
- package/dist/i-convention-applicability.d.ts.map +1 -0
- package/dist/i-convention-applicability.js +1 -0
- package/dist/i-convention-scope.d.ts +19 -0
- package/dist/i-convention-scope.d.ts.map +1 -0
- package/dist/i-convention-scope.js +1 -0
- package/dist/i-file-language.d.ts +11 -0
- package/dist/i-file-language.d.ts.map +1 -0
- package/dist/i-file-language.js +1 -0
- package/dist/i-not-applicable-convention.d.ts +17 -0
- package/dist/i-not-applicable-convention.d.ts.map +1 -0
- package/dist/i-not-applicable-convention.js +1 -0
- package/dist/i-reference-pack-origin.d.ts +13 -0
- package/dist/i-reference-pack-origin.d.ts.map +1 -0
- package/dist/i-reference-pack-origin.js +1 -0
- package/dist/i-stale-path-hint-input.d.ts +18 -0
- package/dist/i-stale-path-hint-input.d.ts.map +1 -0
- package/dist/i-stale-path-hint-input.js +1 -0
- package/dist/i-unverifiable-remedy-group.d.ts +10 -0
- package/dist/i-unverifiable-remedy-group.d.ts.map +1 -0
- package/dist/i-unverifiable-remedy-group.js +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/knowledge-authoring.d.ts +1 -1
- package/dist/knowledge-authoring.d.ts.map +1 -1
- package/dist/knowledge-authoring.js +7 -6
- package/dist/knowledge-contribution-slots.d.ts +18 -0
- package/dist/knowledge-contribution-slots.d.ts.map +1 -0
- package/dist/knowledge-contribution-slots.js +25 -0
- package/dist/knowledge-entry-rejections.d.ts +17 -0
- package/dist/knowledge-entry-rejections.d.ts.map +1 -0
- package/dist/knowledge-entry-rejections.js +79 -0
- package/dist/knowledge-entry-verdict-record.d.ts +12 -0
- package/dist/knowledge-entry-verdict-record.d.ts.map +1 -1
- package/dist/knowledge-min-referenced-valve.d.ts +12 -0
- package/dist/knowledge-min-referenced-valve.d.ts.map +1 -0
- package/dist/knowledge-min-referenced-valve.js +12 -0
- package/dist/knowledge-rejected-entry.d.ts +28 -0
- package/dist/knowledge-rejected-entry.d.ts.map +1 -0
- package/dist/knowledge-rejected-entry.js +1 -0
- package/dist/knowledge-rename-command.d.ts +20 -0
- package/dist/knowledge-rename-command.d.ts.map +1 -0
- package/dist/knowledge-rename-command.js +34 -0
- package/dist/knowledge-rename-verb.d.ts +11 -0
- package/dist/knowledge-rename-verb.d.ts.map +1 -0
- package/dist/knowledge-rename-verb.js +11 -0
- package/dist/knowledge-rename.d.ts +1 -1
- package/dist/knowledge-rename.d.ts.map +1 -1
- package/dist/knowledge-rename.js +6 -5
- package/dist/knowledge-stale-gate.d.ts +2 -0
- package/dist/knowledge-stale-gate.d.ts.map +1 -1
- package/dist/knowledge-stale-gate.js +75 -3
- package/dist/knowledge-stale-quality-gate.d.ts.map +1 -1
- package/dist/knowledge-stale-quality-gate.js +34 -4
- package/dist/knowledge-stale.d.ts +10 -0
- package/dist/knowledge-stale.d.ts.map +1 -1
- package/dist/knowledge-stale.js +227 -33
- package/dist/knowledge-unverifiable-remedy.d.ts +56 -0
- package/dist/knowledge-unverifiable-remedy.d.ts.map +1 -0
- package/dist/knowledge-unverifiable-remedy.js +0 -0
- package/dist/pack-contributions-inventory.d.ts.map +1 -1
- package/dist/pack-contributions-inventory.js +4 -2
- package/dist/propose-knowledge.js +3 -2
- package/dist/reference-pack-origin.d.ts +18 -0
- package/dist/reference-pack-origin.d.ts.map +1 -0
- package/dist/reference-pack-origin.js +38 -0
- package/dist/repository-stats.d.ts.map +1 -1
- package/dist/repository-stats.js +3 -77
- package/dist/resolve-project-config.d.ts.map +1 -1
- package/dist/resolve-project-config.js +10 -1
- package/dist/self-config-doctor-v2.d.ts +1 -1
- package/dist/self-config-doctor-v2.d.ts.map +1 -1
- package/dist/self-config-doctor-v2.js +76 -12
- package/dist/self-config-doctor.d.ts.map +1 -1
- package/dist/self-config-doctor.js +2 -1
- package/dist/sharkcraft-inspector.d.ts.map +1 -1
- package/dist/sharkcraft-inspector.js +52 -12
- package/dist/stale-path-hint.d.ts +3 -0
- package/dist/stale-path-hint.d.ts.map +1 -0
- package/dist/stale-path-hint.js +47 -0
- package/dist/template-authoring.d.ts +1 -1
- package/dist/template-authoring.d.ts.map +1 -1
- package/dist/template-authoring.js +2 -1
- package/dist/validate-contribution-file.d.ts.map +1 -1
- package/dist/validate-contribution-file.js +15 -10
- package/dist/why-file.d.ts.map +1 -1
- package/dist/why-file.js +5 -4
- package/package.json +17 -17
package/dist/knowledge-rename.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Schema: sharkcraft.knowledge-rename/v2.
|
|
8
8
|
*/
|
|
9
|
+
import { knowledgeAnchors, knowledgeReferences, } from '@shrkcrft/knowledge';
|
|
9
10
|
export const KNOWLEDGE_RENAME_SCHEMA = 'sharkcraft.knowledge-rename/v2';
|
|
10
11
|
function clone(v) {
|
|
11
12
|
return JSON.parse(JSON.stringify(v));
|
|
@@ -13,14 +14,14 @@ function clone(v) {
|
|
|
13
14
|
export function buildRenameSymbolPlan(inspection, opts) {
|
|
14
15
|
const matches = [];
|
|
15
16
|
for (const entry of inspection.knowledgeEntries) {
|
|
16
|
-
for (const ref of entry
|
|
17
|
+
for (const ref of knowledgeReferences(entry)) {
|
|
17
18
|
if (ref.kind === 'symbol' && ref.symbol === opts.from) {
|
|
18
19
|
const after = clone(ref);
|
|
19
20
|
after.symbol = opts.to;
|
|
20
21
|
matches.push({ entryId: entry.id, field: 'reference', before: ref, after });
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
for (const anchor of entry
|
|
24
|
+
for (const anchor of knowledgeAnchors(entry)) {
|
|
24
25
|
if (anchor.kind === 'symbol' && anchor.symbol === opts.from) {
|
|
25
26
|
const after = clone(anchor);
|
|
26
27
|
after.symbol = opts.to;
|
|
@@ -39,14 +40,14 @@ export function buildRenameSymbolPlan(inspection, opts) {
|
|
|
39
40
|
export function buildRenameFilePlan(inspection, opts) {
|
|
40
41
|
const matches = [];
|
|
41
42
|
for (const entry of inspection.knowledgeEntries) {
|
|
42
|
-
for (const ref of entry
|
|
43
|
+
for (const ref of knowledgeReferences(entry)) {
|
|
43
44
|
if (ref.path === opts.from) {
|
|
44
45
|
const after = clone(ref);
|
|
45
46
|
after.path = opts.to;
|
|
46
47
|
matches.push({ entryId: entry.id, field: 'reference', before: ref, after });
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
for (const anchor of entry
|
|
50
|
+
for (const anchor of knowledgeAnchors(entry)) {
|
|
50
51
|
if (anchor.path === opts.from) {
|
|
51
52
|
const after = clone(anchor);
|
|
52
53
|
after.path = opts.to;
|
|
@@ -65,7 +66,7 @@ export function buildRenameFilePlan(inspection, opts) {
|
|
|
65
66
|
export function buildAnchorUpdatePlan(inspection, opts) {
|
|
66
67
|
const matches = [];
|
|
67
68
|
for (const entry of inspection.knowledgeEntries) {
|
|
68
|
-
for (const anchor of entry
|
|
69
|
+
for (const anchor of knowledgeAnchors(entry)) {
|
|
69
70
|
if (anchor.id !== opts.anchorId)
|
|
70
71
|
continue;
|
|
71
72
|
const after = clone(anchor);
|
|
@@ -26,6 +26,8 @@ import { type IKnowledgeStaleReport } from './knowledge-stale.js';
|
|
|
26
26
|
import type { IKnowledgeStaleGateFlags } from './knowledge-stale-gate-flags.js';
|
|
27
27
|
import type { IKnowledgeStaleGateInput } from './knowledge-stale-gate-input.js';
|
|
28
28
|
import type { IKnowledgeStaleGate } from './knowledge-stale-gate-result.js';
|
|
29
|
+
/** The stale-check rule of the knowledge entries the loader refused (round 15 follow-up, F3). */
|
|
30
|
+
export declare const KNOWLEDGE_REJECTED_RULE_ID = "knowledge-rejected-entries";
|
|
29
31
|
/**
|
|
30
32
|
* Every `--fail-on` category. `all` keeps its historical meaning (any stale or
|
|
31
33
|
* missing reference); the round-11 categories are opt-in BY NAME, so no
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-stale-gate.d.ts","sourceRoot":"","sources":["../src/knowledge-stale-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAqC,KAAK,eAAe,EAAyB,MAAM,gBAAgB,CAAC;AAGhH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"knowledge-stale-gate.d.ts","sourceRoot":"","sources":["../src/knowledge-stale-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAqC,KAAK,eAAe,EAAyB,MAAM,gBAAgB,CAAC;AAGhH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAQ5E,iGAAiG;AACjG,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAOvE;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAazD,CAAC;AAKF,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK7D;AAED,wCAAwC;AACxC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;AAiDD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,wBAAwB,GAC9B,mBAAmB,CA8VrB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAC3B,cAAc,EAAE,OAAO,EACvB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CASpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE;IACzC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,GAAG,wBAAwB,CA8B3B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CASnF"}
|
|
@@ -3,7 +3,12 @@ import { formatKnowledgeReference } from '@shrkcrft/knowledge';
|
|
|
3
3
|
import { declaredReferenceCoverage } from "./declared-reference-coverage.js";
|
|
4
4
|
import { KnowledgeEntryVerdict } from "./knowledge-entry-verdict.js";
|
|
5
5
|
import { ReferenceCheckOutcome } from "./knowledge-stale.js";
|
|
6
|
+
import { KnowledgeMinReferencedValve } from "./knowledge-min-referenced-valve.js";
|
|
7
|
+
import { REJECTED_AT_LOAD } from "./knowledge-entry-rejections.js";
|
|
8
|
+
import { unverifiableEntryRemedy, unverifiableRemedy } from "./knowledge-unverifiable-remedy.js";
|
|
6
9
|
import { ReferenceFailure } from "./reference-failure.js";
|
|
10
|
+
/** The stale-check rule of the knowledge entries the loader refused (round 15 follow-up, F3). */
|
|
11
|
+
export const KNOWLEDGE_REJECTED_RULE_ID = 'knowledge-rejected-entries';
|
|
7
12
|
/** The proposed exits (the CLI's `ExitCode` values; the inspector cannot import the CLI). */
|
|
8
13
|
const VERIFIED_PASS = 0;
|
|
9
14
|
const FAILURE = 1;
|
|
@@ -75,6 +80,10 @@ function emptyScopeReason(report, input) {
|
|
|
75
80
|
if (report.entries === 0 && failed.length > 0) {
|
|
76
81
|
return `${plural(failed.length, 'knowledge file', 'knowledge files')} never loaded — ${loadFailureList(failed)} — so no knowledge was loaded`;
|
|
77
82
|
}
|
|
83
|
+
// Round 15 follow-up (F3): entries WERE declared — the loader refused them all.
|
|
84
|
+
if (report.entries === 0 && report.rejectedEntries.length > 0) {
|
|
85
|
+
return `every declared knowledge entry (${report.rejectedEntries.length}) was rejected at load, so none was checked`;
|
|
86
|
+
}
|
|
78
87
|
if (report.entries === 0)
|
|
79
88
|
return 'no knowledge entries are declared';
|
|
80
89
|
const alsoFailed = failed.length > 0 ? `, and ${plural(failed.length, 'knowledge file', 'knowledge files')} never loaded (${loadFailureList(failed)})` : '';
|
|
@@ -110,6 +119,12 @@ export function evaluateKnowledgeStaleGate(report, input) {
|
|
|
110
119
|
const invalidRefs = declaredRefs.filter((c) => c.outcome === ReferenceCheckOutcome.Invalid);
|
|
111
120
|
const invalidAnchors = report.anchorChecks.filter((a) => a.outcome === ReferenceCheckOutcome.Invalid);
|
|
112
121
|
const invalidCount = invalidRefs.length + invalidAnchors.length;
|
|
122
|
+
// Round 15 follow-up (F3): entries the LOADER refused. INVALID-class: never
|
|
123
|
+
// in scope, never checked — a coverage shortfall of their own rule (exit 2),
|
|
124
|
+
// a failure under `--fail-on invalid` (exit 1). No valve accepts them:
|
|
125
|
+
// `--min-referenced` accepts the run's unverifiable remainder and
|
|
126
|
+
// `--allow-empty` an empty scope, never this rule.
|
|
127
|
+
const rejected = report.rejectedEntries;
|
|
113
128
|
const reasons = [];
|
|
114
129
|
// The historical modes, unchanged (they are mutually exclusive by design).
|
|
115
130
|
if (input.ci) {
|
|
@@ -162,6 +177,9 @@ export function evaluateKnowledgeStaleGate(report, input) {
|
|
|
162
177
|
if (failOn.has('invalid') && invalidCount > 0) {
|
|
163
178
|
reasons.push(`${plural(invalidCount, 'malformed reference', 'malformed references')} (--fail-on=invalid)`);
|
|
164
179
|
}
|
|
180
|
+
if (failOn.has('invalid') && rejected.length > 0) {
|
|
181
|
+
reasons.push(`${plural(rejected.length, 'knowledge entry', 'knowledge entries')} rejected at load (--fail-on=invalid)`);
|
|
182
|
+
}
|
|
165
183
|
const requireRefs = input.requireReferences || failOn.has('unverifiable');
|
|
166
184
|
if (requireRefs && cov.unverifiable > 0) {
|
|
167
185
|
reasons.push(`${plural(cov.unverifiable, 'entry declares', 'entries declare')} no checkable reference (--require-references)`);
|
|
@@ -243,11 +261,16 @@ export function evaluateKnowledgeStaleGate(report, input) {
|
|
|
243
261
|
const rules = [];
|
|
244
262
|
if (cov.entriesInScope > 0) {
|
|
245
263
|
const violations = [];
|
|
264
|
+
// The file declaring each knowledge entry — a violation names the file to
|
|
265
|
+
// edit (round 15: a Markdown entry's, its .md).
|
|
266
|
+
const declaredIn = new Map(report.entryVerdicts.map((v) => [v.entryId, v.source]));
|
|
246
267
|
for (const c of [...report.referenceChecks, ...assetFailing, ...(failOn.has('implicit') ? implicitFailing : [])]) {
|
|
247
268
|
if (!isFailing(c.outcome))
|
|
248
269
|
continue;
|
|
270
|
+
const file = c.assetKind ? undefined : declaredIn.get(c.entryId);
|
|
249
271
|
violations.push({
|
|
250
272
|
id: c.entryId,
|
|
273
|
+
...(file !== undefined ? { file } : {}),
|
|
251
274
|
message: `${formatKnowledgeReference(c.reference)} — ${c.message}`,
|
|
252
275
|
...(c.suggestion ? { hint: c.suggestion } : {}),
|
|
253
276
|
});
|
|
@@ -272,7 +295,9 @@ export function evaluateKnowledgeStaleGate(report, input) {
|
|
|
272
295
|
violations.push({
|
|
273
296
|
id: v.entryId,
|
|
274
297
|
file: v.source,
|
|
275
|
-
|
|
298
|
+
// THE per-entry remedy (round 15 closing, A4): an entry whose
|
|
299
|
+
// references exist but are malformed read "declare references[]".
|
|
300
|
+
message: `UNVERIFIABLE (${v.reason ?? 'no checkable reference'}) — ${unverifiableEntryRemedy(v)}`,
|
|
276
301
|
});
|
|
277
302
|
}
|
|
278
303
|
}
|
|
@@ -303,6 +328,40 @@ export function evaluateKnowledgeStaleGate(report, input) {
|
|
|
303
328
|
...(waiver !== undefined ? { unitAcceptance: waiver } : {}),
|
|
304
329
|
});
|
|
305
330
|
}
|
|
331
|
+
// Round 15 follow-up (F3): knowledge entries the loader REFUSED — their own
|
|
332
|
+
// rule, pushed at ANY scope and corpus size (a clean sweep of the rest, a
|
|
333
|
+
// changeset, `--allow-empty` or `--min-referenced` never covers them). By
|
|
334
|
+
// default `skipped` — nothing was checked, the shortfall settles the run to
|
|
335
|
+
// 2 — and `failed` under `--fail-on invalid`, the INVALID-class contract of a
|
|
336
|
+
// malformed reference.
|
|
337
|
+
if (rejected.length > 0) {
|
|
338
|
+
const failing = failOn.has('invalid');
|
|
339
|
+
rules.push({
|
|
340
|
+
id: KNOWLEDGE_REJECTED_RULE_ID,
|
|
341
|
+
type: 'knowledge',
|
|
342
|
+
status: failing ? 'failed' : 'skipped',
|
|
343
|
+
severity: 'error',
|
|
344
|
+
counts: { rejected: rejected.length },
|
|
345
|
+
violations: failing
|
|
346
|
+
? rejected.map((r) => ({
|
|
347
|
+
id: r.label,
|
|
348
|
+
file: r.source,
|
|
349
|
+
message: `REJECTED AT LOAD${r.pack !== undefined ? ` (pack ${r.pack})` : ''} — ${r.message}`,
|
|
350
|
+
}))
|
|
351
|
+
: [],
|
|
352
|
+
...(failing
|
|
353
|
+
? {}
|
|
354
|
+
: { skipReason: `${plural(rejected.length, 'knowledge entry was', 'knowledge entries were')} rejected at load — never checked` }),
|
|
355
|
+
coverage: {
|
|
356
|
+
unit: 'knowledge entries',
|
|
357
|
+
expected: rejected.length,
|
|
358
|
+
examined: 0,
|
|
359
|
+
unexamined: rejected.slice(0, COVERAGE_LABEL_CAP).map((r) => r.label),
|
|
360
|
+
unexaminedTotal: rejected.length,
|
|
361
|
+
reason: `${REJECTED_AT_LOAD} — the loader refused them (\`shrk self-config doctor\` names why); no valve accepts them`,
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
}
|
|
306
365
|
// Knowledge-bearing files that never loaded: their own rule, so the envelope
|
|
307
366
|
// names each one and the shortfall rides into the settled verdict whatever
|
|
308
367
|
// the rest of the corpus proved. `error` — a source that could not be read is
|
|
@@ -331,15 +390,28 @@ export function evaluateKnowledgeStaleGate(report, input) {
|
|
|
331
390
|
},
|
|
332
391
|
});
|
|
333
392
|
}
|
|
334
|
-
|
|
393
|
+
// A refused entry's sentence rides next to whichever lead the run has — it is
|
|
394
|
+
// never the whole story, and never dropped from it (round 15 follow-up, F3).
|
|
395
|
+
const rejectedLead = rejected.length > 0
|
|
396
|
+
? `${plural(rejected.length, 'knowledge entry was', 'knowledge entries were')} rejected at load and never checked (listed above as INVALID): ${rejected
|
|
397
|
+
.slice(0, LOAD_FAILURES_NAMED)
|
|
398
|
+
.map((r) => r.label)
|
|
399
|
+
.join(', ')}${rejected.length > LOAD_FAILURES_NAMED ? ` (+${rejected.length - LOAD_FAILURES_NAMED} more)` : ''} — fix each (\`shrk self-config doctor\` names why); \`--fail-on invalid\` makes this a failure, and no valve accepts it.`
|
|
400
|
+
: undefined;
|
|
401
|
+
const loadLead = loadFailures.length > 0
|
|
335
402
|
? `${plural(loadFailures.length, 'knowledge file', 'knowledge files')} never loaded, so ${loadFailures.length === 1 ? 'its entries were' : 'their entries were'} never checked: ${loadFailureList(loadFailures)}. Fix the file (\`shrk doctor\` names the error) — --allow-empty never accepts a load failure.`
|
|
403
|
+
: undefined;
|
|
404
|
+
const restLead = loadFailures.length > 0
|
|
405
|
+
? undefined
|
|
336
406
|
: discoveryFailed
|
|
337
407
|
? `Loaded 0 knowledge entries from ${d.resolvedRoot} — nothing was checked.`
|
|
338
408
|
: cov.entriesInScope > 0 && cov.unverifiable > 0
|
|
339
|
-
? `${plural(cov.unverifiable, 'entry', 'entries')} of ${cov.entriesInScope} (${formatPct(cov.unverifiable / cov.entriesInScope)}) ${cov.unverifiable === 1 ? 'declares' : 'declare'} no checkable reference, so ${cov.unverifiable === 1 ? 'it was' : 'they were'} never checked.
|
|
409
|
+
? `${plural(cov.unverifiable, 'entry', 'entries')} of ${cov.entriesInScope} (${formatPct(cov.unverifiable / cov.entriesInScope)}) ${cov.unverifiable === 1 ? 'declares' : 'declare'} no checkable reference, so ${cov.unverifiable === 1 ? 'it was' : 'they were'} never checked. ${unverifiableRemedy(report.entryVerdicts, KnowledgeMinReferencedValve.Flag)}`
|
|
340
410
|
: invalidCount > 0
|
|
341
411
|
? `${plural(invalidCount, 'reference is', 'references are')} MALFORMED (listed above as INVALID) and ${invalidCount === 1 ? 'was' : 'were'} never checked — fix the kind or the missing field; \`--fail-on invalid\` makes this a failure.`
|
|
342
412
|
: undefined;
|
|
413
|
+
const leads = [loadLead, rejectedLead, restLead].filter((l) => l !== undefined);
|
|
414
|
+
const notVerifiedLead = leads.length > 0 ? leads.join(' ') : undefined;
|
|
343
415
|
return {
|
|
344
416
|
proposed,
|
|
345
417
|
reasons,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-stale-quality-gate.d.ts","sourceRoot":"","sources":["../src/knowledge-stale-quality-gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"knowledge-stale-quality-gate.d.ts","sourceRoot":"","sources":["../src/knowledge-stale-quality-gate.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,+DAA+D;AAC/D,eAAO,MAAM,uBAAuB,oBAAoB,CAAC;AAQzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,qBAAqB,EACjC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA2G7B"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { describeInspectionDiscovery } from "./inspection-discovery.js";
|
|
2
|
+
import { knowledgeRejectedEntries } from "./knowledge-entry-rejections.js";
|
|
2
3
|
import { buildKnowledgeStaleReport } from "./knowledge-stale.js";
|
|
3
4
|
import { evaluateKnowledgeStaleGate, formatPct, knowledgeStaleGateInput, settleKnowledgeStaleGate, } from "./knowledge-stale-gate.js";
|
|
5
|
+
import { KnowledgeMinReferencedValve } from "./knowledge-min-referenced-valve.js";
|
|
6
|
+
import { unverifiableFileRemedies, unverifiableRemedy } from "./knowledge-unverifiable-remedy.js";
|
|
4
7
|
import { warmReferenceRegistries } from "./reference-registry.js";
|
|
5
8
|
/** The quality-bundle gate id of the knowledge stale-check. */
|
|
6
9
|
export const KNOWLEDGE_STALE_GATE_ID = 'knowledge-stale';
|
|
7
10
|
/** Unverifiable entry ids carried in the gate's data (the verb's JSON has all of them). */
|
|
8
11
|
const UNVERIFIABLE_IDS_SHOWN = 20;
|
|
12
|
+
/** Refused entries named in the notes before the rest are summarised. */
|
|
13
|
+
const REJECTED_NOTES_SHOWN = 5;
|
|
9
14
|
/**
|
|
10
15
|
* The knowledge stale-check as ONE quality gate — decided by THE gate the verb
|
|
11
16
|
* settles (`evaluateKnowledgeStaleGate` + `settleKnowledgeStaleGate`), with the
|
|
@@ -30,9 +35,12 @@ export async function knowledgeStaleQualityGate(inspection, changedFiles) {
|
|
|
30
35
|
const base = { id: KNOWLEDGE_STALE_GATE_ID, label: 'Knowledge stale-check', runsShell: false };
|
|
31
36
|
const discovery = describeInspectionDiscovery(inspection);
|
|
32
37
|
// A knowledge file that failed to load is never a deliberate skip — the
|
|
33
|
-
// corpus is partial (or gone), and the gate says so.
|
|
38
|
+
// corpus is partial (or gone), and the gate says so. Neither is a corpus
|
|
39
|
+
// whose entries the loader REFUSED (round 15 follow-up, F3): they were
|
|
40
|
+
// declared, and nothing they claim was checked.
|
|
34
41
|
const loadFailed = discovery.knowledgeLoadFailures.length > 0;
|
|
35
|
-
|
|
42
|
+
const refused = knowledgeRejectedEntries(inspection).length > 0;
|
|
43
|
+
if (inspection.knowledgeEntries.length === 0 && !loadFailed && !refused) {
|
|
36
44
|
return {
|
|
37
45
|
...base,
|
|
38
46
|
passed: true,
|
|
@@ -46,7 +54,7 @@ export async function knowledgeStaleQualityGate(inspection, changedFiles) {
|
|
|
46
54
|
// A bare warm keeps any command resolver a CLI caller already injected.
|
|
47
55
|
await warmReferenceRegistries(inspection);
|
|
48
56
|
const report = buildKnowledgeStaleReport(inspection, changedFiles ? { changedFiles } : {});
|
|
49
|
-
if (changedFiles && report.entriesInScope === 0 && !loadFailed) {
|
|
57
|
+
if (changedFiles && report.entriesInScope === 0 && !loadFailed && report.rejectedEntries.length === 0) {
|
|
50
58
|
return {
|
|
51
59
|
...base,
|
|
52
60
|
passed: true,
|
|
@@ -75,6 +83,7 @@ export async function knowledgeStaleQualityGate(inspection, changedFiles) {
|
|
|
75
83
|
const settled = settleKnowledgeStaleGate(gate);
|
|
76
84
|
const c = report.coverage;
|
|
77
85
|
const share = c.entriesInScope > 0 ? formatPct(c.unverifiable / c.entriesInScope) : '0%';
|
|
86
|
+
const rejected = report.rejectedEntries;
|
|
78
87
|
return {
|
|
79
88
|
...base,
|
|
80
89
|
// 1 fails; 2 "passed" over PART of its scope (`partial`), which the one
|
|
@@ -83,17 +92,38 @@ export async function knowledgeStaleQualityGate(inspection, changedFiles) {
|
|
|
83
92
|
blocking: true,
|
|
84
93
|
executed: true,
|
|
85
94
|
notes: [
|
|
86
|
-
`entries in scope ${c.entriesInScope} · verified ${c.verified} · stale ${c.stale} · unverifiable ${c.unverifiable} (${share})`,
|
|
95
|
+
`entries in scope ${c.entriesInScope} · verified ${c.verified} · stale ${c.stale} · unverifiable ${c.unverifiable} (${share})${rejected.length > 0 ? ` · rejected at load ${rejected.length}` : ''}`,
|
|
87
96
|
...gate.reasons,
|
|
88
97
|
...settled.shortfalls.map((s) => `NOT VERIFIED — ${s}`),
|
|
98
|
+
// Round 15 follow-up (F3): each entry the loader refused, named with the
|
|
99
|
+
// file to fix — the same wording as the stale-check's INVALID row.
|
|
100
|
+
...rejected
|
|
101
|
+
.slice(0, REJECTED_NOTES_SHOWN)
|
|
102
|
+
.map((r) => `${r.label} (${r.source}${r.pack !== undefined ? `, pack ${r.pack}` : ''}) — ${r.message}`),
|
|
103
|
+
...(rejected.length > REJECTED_NOTES_SHOWN
|
|
104
|
+
? [`… ${rejected.length - REJECTED_NOTES_SHOWN} more rejected at load (\`shrk knowledge stale-check\` lists all)`]
|
|
105
|
+
: []),
|
|
106
|
+
// Round 15: the fix, in THIS surface's terms — quality refuses
|
|
107
|
+
// `--min-referenced`, so the valve it names is the config key.
|
|
108
|
+
...(settled.exit === 2 && c.unverifiable > 0
|
|
109
|
+
? [
|
|
110
|
+
`remedy: ${unverifiableRemedy(report.entryVerdicts, KnowledgeMinReferencedValve.Config)}`,
|
|
111
|
+
...unverifiableFileRemedies(report.entryVerdicts),
|
|
112
|
+
]
|
|
113
|
+
: []),
|
|
89
114
|
...settled.accepted,
|
|
90
115
|
],
|
|
91
116
|
data: {
|
|
92
117
|
coverage: c,
|
|
93
118
|
unverifiableIds: report.unverifiableIds.slice(0, UNVERIFIABLE_IDS_SHOWN),
|
|
119
|
+
// Round 15 follow-up (F3): refused entries, capped like the ids above.
|
|
120
|
+
rejectedEntries: rejected.slice(0, UNVERIFIABLE_IDS_SHOWN),
|
|
94
121
|
failureCounts: report.failureCounts,
|
|
95
122
|
settledExit: settled.exit,
|
|
96
123
|
shortfalls: settled.shortfalls,
|
|
124
|
+
// What an explicit valve accepted (`knowledgeCheck.minReferenced`, a
|
|
125
|
+
// waiver) — `shrk quality` hoists it into the run's `accepted`.
|
|
126
|
+
accepted: settled.accepted,
|
|
97
127
|
...(settled.exit === 2 ? { partial: true } : {}),
|
|
98
128
|
},
|
|
99
129
|
};
|
|
@@ -30,6 +30,7 @@ import type { IKnowledgeKindBucket } from './knowledge-kind-bucket.js';
|
|
|
30
30
|
import type { IKnowledgeReferenceKindBucket } from './knowledge-reference-kind-bucket.js';
|
|
31
31
|
import type { IKnowledgeStaleAdvisory } from './knowledge-stale-advisory.js';
|
|
32
32
|
import type { IKnowledgeAgedEntry } from './knowledge-aged-entry.js';
|
|
33
|
+
import type { IKnowledgeRejectedEntry } from './knowledge-rejected-entry.js';
|
|
33
34
|
import { ReferenceAssetKind } from './reference-asset-kind.js';
|
|
34
35
|
export declare const KNOWLEDGE_STALE_SCHEMA = "sharkcraft.knowledge-stale/v1";
|
|
35
36
|
export declare enum ReferenceCheckOutcome {
|
|
@@ -165,6 +166,15 @@ export interface IKnowledgeStaleReport {
|
|
|
165
166
|
entryVerdicts: ReadonlyArray<IKnowledgeEntryVerdictRecord>;
|
|
166
167
|
/** Every unverifiable entry id in scope (renderers cap; this never does). */
|
|
167
168
|
unverifiableIds: ReadonlyArray<string>;
|
|
169
|
+
/**
|
|
170
|
+
* Round 15 follow-up (F3): knowledge-family entries the LOADER REFUSED (THE
|
|
171
|
+
* rejection channel, `knowledgeRejectedEntries`). Never in {@link entries} or
|
|
172
|
+
* {@link entryVerdicts} — nothing they claim was read, let alone checked — so
|
|
173
|
+
* the verdict counts each one UNEXAMINED (an INVALID-class row; `--fail-on
|
|
174
|
+
* invalid` makes it a failure). Never narrowed by `changedFiles`: a refused
|
|
175
|
+
* entry's references were never read, so no changeset can prove it untouched.
|
|
176
|
+
*/
|
|
177
|
+
rejectedEntries: ReadonlyArray<IKnowledgeRejectedEntry>;
|
|
168
178
|
/** Non-ok checks per {@link ReferenceFailure} — knowledge references, anchors and other assets. */
|
|
169
179
|
failureCounts: Readonly<Record<ReferenceFailure, number>>;
|
|
170
180
|
/** Per asset kind. `scanned: 0` means NOT IN SWEEP — say so, never render it as clean zeros. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,
|
|
1
|
+
{"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"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"}
|