@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-task-prep.d.ts","sourceRoot":"","sources":["../src/agent-task-prep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-task-prep.d.ts","sourceRoot":"","sources":["../src/agent-task-prep.ts"],"names":[],"mappings":"AAsBA,OAAO,EAA8C,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKzG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC/C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpE,QAAQ,CAAC,mBAAmB,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvE,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,SAAS;QAC9B,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3B,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;KACxF,EAAE,CAAC;IACJ;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,SAAS;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3F,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAcD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,oBAAoB,CAAC,CAyF/B"}
|
package/dist/agent-task-prep.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { buildTaskPacket } from "./task-packet.js";
|
|
16
16
|
import { listConventions } from "./convention-registry.js";
|
|
17
|
+
import { conventionApplicability } from "./convention-applicability.js";
|
|
17
18
|
import { listTaskRoutingHints, explainTaskRouting } from "./task-routing-hint-registry.js";
|
|
18
19
|
import { buildUncertaintySummary } from "./uncertainty.js";
|
|
19
20
|
import { matchTerm, prepareTermQuery } from "./match-terms.js";
|
|
@@ -100,7 +101,14 @@ export async function prepareAgentTask(inspection, task) {
|
|
|
100
101
|
generationCommands,
|
|
101
102
|
validationCommands,
|
|
102
103
|
relevantProfiles: [],
|
|
103
|
-
|
|
104
|
+
// THE applicability authority (round 15, 15.1): a convention whose
|
|
105
|
+
// `appliesTo` excludes this workspace (an undetected profile / framework)
|
|
106
|
+
// is not handed to the agent — it used to be the first 5 loaded, whatever
|
|
107
|
+
// they applied to. Per-file filters are decided per file, not here.
|
|
108
|
+
relevantConventions: conventions
|
|
109
|
+
.filter((e) => conventionApplicability(e.convention, inspection).applicable)
|
|
110
|
+
.slice(0, 5)
|
|
111
|
+
.map((e) => ({ id: e.convention.id, title: e.convention.title })),
|
|
104
112
|
routingHints: routing.slice(0, 5).map((m) => ({
|
|
105
113
|
id: m.hint.id,
|
|
106
114
|
title: m.hint.title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codemod-assist.d.ts","sourceRoot":"","sources":["../src/codemod-assist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"codemod-assist.d.ts","sourceRoot":"","sources":["../src/codemod-assist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI7D,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE,oBAAY,eAAe;IACzB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,eAAe,CAAC;IACtB,2DAA2D;IAC3D,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC7D;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,yEAAyE;IACzE,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,qBAAqB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,0CAA0C;IAC1C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,aAAa,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC/C,UAAU,EAAE;QACV,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CAAC;IACF,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAClD,oFAAoF;IACpF,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,+DAA+D;IAC/D,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAmGD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAiGzF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAO9G;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA2ChF"}
|
package/dist/codemod-assist.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { knowledgeRenameCommand } from "./knowledge-rename-command.js";
|
|
2
|
+
import { KnowledgeRenameVerb } from "./knowledge-rename-verb.js";
|
|
1
3
|
export const CODEMOD_ASSIST_SCHEMA = 'sharkcraft.codemod-assist/v1';
|
|
2
4
|
export var CodemodRiskBand;
|
|
3
5
|
(function (CodemodRiskBand) {
|
|
@@ -19,7 +21,7 @@ function defaultExternalTool(rule, fallback) {
|
|
|
19
21
|
return 'eslint custom rule + autofix (when safe)';
|
|
20
22
|
}
|
|
21
23
|
if (tagsLower.has('boundaries') || tagsLower.has('architecture')) {
|
|
22
|
-
return
|
|
24
|
+
return `manual review + targeted rename via ${knowledgeRenameCommand(KnowledgeRenameVerb.RenameSymbol)}`;
|
|
23
25
|
}
|
|
24
26
|
return 'ts-morph (or manual edits when scope is small)';
|
|
25
27
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a language writes a single-line / block comment — the line classifier
|
|
3
|
+
* `shrk stats` counts code / comment / blank lines with. One value per
|
|
4
|
+
* {@link IFileLanguage} (`file-languages.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export declare enum CommentSyntax {
|
|
7
|
+
CFamily = "c-family",
|
|
8
|
+
Hash = "hash",
|
|
9
|
+
Html = "html",
|
|
10
|
+
Sql = "sql",
|
|
11
|
+
Lua = "lua",
|
|
12
|
+
Lisp = "lisp",
|
|
13
|
+
None = "none"
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=comment-syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-syntax.d.ts","sourceRoot":"","sources":["../src/comment-syntax.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,aAAa;IACvB,OAAO,aAAa;IACpB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,IAAI,SAAS;CACd"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a language writes a single-line / block comment — the line classifier
|
|
3
|
+
* `shrk stats` counts code / comment / blank lines with. One value per
|
|
4
|
+
* {@link IFileLanguage} (`file-languages.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export var CommentSyntax;
|
|
7
|
+
(function (CommentSyntax) {
|
|
8
|
+
CommentSyntax["CFamily"] = "c-family";
|
|
9
|
+
CommentSyntax["Hash"] = "hash";
|
|
10
|
+
CommentSyntax["Html"] = "html";
|
|
11
|
+
CommentSyntax["Sql"] = "sql";
|
|
12
|
+
CommentSyntax["Lua"] = "lua";
|
|
13
|
+
CommentSyntax["Lisp"] = "lisp";
|
|
14
|
+
CommentSyntax["None"] = "none";
|
|
15
|
+
})(CommentSyntax || (CommentSyntax = {}));
|
|
@@ -98,9 +98,25 @@ export declare function collectContributionRejections(inspection: ISharkcraftIns
|
|
|
98
98
|
export declare function collectKindOutcomes(inspection: ISharkcraftInspection, kinds: readonly ContributionKind[]): Promise<IKindOutcomes>;
|
|
99
99
|
/** The rejections of `kinds` only — {@link collectKindOutcomes} without the load failures. */
|
|
100
100
|
export declare function collectKindRejections(inspection: ISharkcraftInspection, kinds: readonly ContributionKind[]): Promise<readonly IContributionEntryRejection[]>;
|
|
101
|
+
/** The slot of a whole Markdown document — it has no export and no list position. */
|
|
102
|
+
export declare const MARKDOWN_FILE_SLOT = "Markdown file";
|
|
103
|
+
/**
|
|
104
|
+
* THE slot label of a refused entry (round 15 closing, A5): `default[8]` for a
|
|
105
|
+
* list item, the export name for a single-object export, and
|
|
106
|
+
* {@link MARKDOWN_FILE_SLOT} for a whole Markdown document (index `-1`, no
|
|
107
|
+
* export — a decision record, a Markdown knowledge file), which read
|
|
108
|
+
* `(default)` as if it were a module's default export. Every surface that names
|
|
109
|
+
* where a refused entry sits reads it.
|
|
110
|
+
*/
|
|
111
|
+
export declare function rejectedEntrySlot(r: Pick<IRejectedEntry, 'index' | 'exportName'> & {
|
|
112
|
+
readonly file?: string;
|
|
113
|
+
}): string;
|
|
101
114
|
/**
|
|
102
115
|
* THE one wording of a rejected entry, used on every surface:
|
|
103
|
-
* `'conv.b' (default[8]) — severity: severity must be one of: info, warning, error (got undefined)
|
|
116
|
+
* `'conv.b' (default[8]) — severity: severity must be one of: info, warning, error (got undefined)`,
|
|
117
|
+
* `(no id) (Markdown file) — frontmatter: …` for a Markdown document ({@link rejectedEntrySlot}).
|
|
104
118
|
*/
|
|
105
|
-
export declare function formatEntryRejection(r: Pick<IRejectedEntry, 'entryId' | 'index' | 'exportName' | 'reasons'>
|
|
119
|
+
export declare function formatEntryRejection(r: Pick<IRejectedEntry, 'entryId' | 'index' | 'exportName' | 'reasons'> & {
|
|
120
|
+
readonly file?: string;
|
|
121
|
+
}): string;
|
|
106
122
|
//# sourceMappingURL=contribution-load-failures.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contribution-load-failures.d.ts","sourceRoot":"","sources":["../src/contribution-load-failures.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAU5D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAQlE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,MAAM,WAAW,wBAAwB;IACvC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,QAAQ,CAAC,GAAG,EAAE,oBAAoB,GAAG,UAAU,CAAC;CACjD;AA8BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9G;AAED,sHAAsH;AACtH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAChG,wBAAwB,EAAE,CAe5B;AAED,8FAA8F;AAC9F,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,wBAAwB,EAAE,CAgB5B;AAED,6GAA6G;AAC7G,wBAAgB,cAAc,CAC5B,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,GAAG,GAAE,2BAA2B,CAAC,KAAK,CAAc,GACnD,2BAA2B,EAAE,CAM/B;AA6RD,0GAA0G;AAC1G,eAAO,MAAM,qBAAqB,EAAE,SAAS,gBAAgB,EAAqD,CAAC;AAEnH;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAO,GAC7D,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAE9C;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,qBAAqB,EACjC,gBAAgB,GAAE,SAAS,wBAAwB,EAAO,GACzD,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAqB/C;AAED;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAS9F,CAAC;AAIF;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAKnF;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,qBAAqB,EACjC,kBAAkB,GAAE,SAAS,2BAA2B,EAAO,GAC9D,SAAS,2BAA2B,EAAE,CAkBxC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,8FAA8F;AAC9F,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,OAAO,CAAC,SAAS,2BAA2B,EAAE,CAAC,CAEjD;AAED
|
|
1
|
+
{"version":3,"file":"contribution-load-failures.d.ts","sourceRoot":"","sources":["../src/contribution-load-failures.ts"],"names":[],"mappings":"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"}
|
|
@@ -564,12 +564,29 @@ export async function collectKindOutcomes(inspection, kinds) {
|
|
|
564
564
|
export async function collectKindRejections(inspection, kinds) {
|
|
565
565
|
return (await collectKindOutcomes(inspection, kinds)).rejections;
|
|
566
566
|
}
|
|
567
|
+
/** The slot of a whole Markdown document — it has no export and no list position. */
|
|
568
|
+
export const MARKDOWN_FILE_SLOT = 'Markdown file';
|
|
569
|
+
/**
|
|
570
|
+
* THE slot label of a refused entry (round 15 closing, A5): `default[8]` for a
|
|
571
|
+
* list item, the export name for a single-object export, and
|
|
572
|
+
* {@link MARKDOWN_FILE_SLOT} for a whole Markdown document (index `-1`, no
|
|
573
|
+
* export — a decision record, a Markdown knowledge file), which read
|
|
574
|
+
* `(default)` as if it were a module's default export. Every surface that names
|
|
575
|
+
* where a refused entry sits reads it.
|
|
576
|
+
*/
|
|
577
|
+
export function rejectedEntrySlot(r) {
|
|
578
|
+
if (r.index >= 0)
|
|
579
|
+
return `${r.exportName ?? ''}[${r.index}]`;
|
|
580
|
+
if (r.exportName !== undefined)
|
|
581
|
+
return r.exportName;
|
|
582
|
+
return r.file !== undefined && /\.(?:md|markdown)$/i.test(r.file) ? MARKDOWN_FILE_SLOT : 'default';
|
|
583
|
+
}
|
|
567
584
|
/**
|
|
568
585
|
* THE one wording of a rejected entry, used on every surface:
|
|
569
|
-
* `'conv.b' (default[8]) — severity: severity must be one of: info, warning, error (got undefined)
|
|
586
|
+
* `'conv.b' (default[8]) — severity: severity must be one of: info, warning, error (got undefined)`,
|
|
587
|
+
* `(no id) (Markdown file) — frontmatter: …` for a Markdown document ({@link rejectedEntrySlot}).
|
|
570
588
|
*/
|
|
571
589
|
export function formatEntryRejection(r) {
|
|
572
590
|
const who = r.entryId !== undefined ? `'${r.entryId}'` : '(no id)';
|
|
573
|
-
|
|
574
|
-
return `${who} (${where}) — ${r.reasons.join('; ')}`;
|
|
591
|
+
return `${who} (${rejectedEntrySlot(r)}) — ${r.reasons.join('; ')}`;
|
|
575
592
|
}
|
|
@@ -206,7 +206,7 @@ export function renderContributionsByFileText(report) {
|
|
|
206
206
|
for (const f of report.files) {
|
|
207
207
|
lines.push(` ${fileMark(f)} ${f.file} ${f.kind}${f.packageName ? ` [${f.packageName}]` : ''} ${fileSummary(f)}`);
|
|
208
208
|
for (const r of f.rejected)
|
|
209
|
-
lines.push(` rejected ${formatEntryRejection(r)}`);
|
|
209
|
+
lines.push(` rejected ${formatEntryRejection({ ...r, file: f.file })}`);
|
|
210
210
|
for (const g of f.unresolvableReferences) {
|
|
211
211
|
lines.push(` unresolvable ${g.sourceId} ${g.field} → ${g.kind} ${g.ids.map((id) => `'${id}'`).join(', ')} — ${g.reason === 'undeclarable-kind' ? 'no registry can ever hold this kind' : "this kind's registry is empty here"}`);
|
|
212
212
|
}
|
|
@@ -232,7 +232,7 @@ export function renderContributionsByFileMarkdown(report) {
|
|
|
232
232
|
for (const f of detail) {
|
|
233
233
|
lines.push(`- \`${f.file}\``);
|
|
234
234
|
for (const r of f.rejected)
|
|
235
|
-
lines.push(` - rejected: ${formatEntryRejection(r)}`);
|
|
235
|
+
lines.push(` - rejected: ${formatEntryRejection({ ...r, file: f.file })}`);
|
|
236
236
|
for (const g of f.unresolvableReferences) {
|
|
237
237
|
lines.push(` - unresolvable: ${g.sourceId} ${g.field} → ${g.kind} ${g.ids.join(', ')} (${g.reason})`);
|
|
238
238
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ConventionAppliesToFilter, type IConvention } from '@shrkcrft/plugin-api';
|
|
2
|
+
import { ConventionFilterLevel } from './convention-filter-level.js';
|
|
3
|
+
import type { IConventionApplicability } from './i-convention-applicability.js';
|
|
4
|
+
import type { IConventionScope } from './i-convention-scope.js';
|
|
5
|
+
import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
|
|
6
|
+
/** Where each filter is decided — keyed by the enum, so a new filter without a level is a compile error. */
|
|
7
|
+
export declare const CONVENTION_FILTER_LEVELS: Readonly<Record<ConventionAppliesToFilter, ConventionFilterLevel>>;
|
|
8
|
+
/** The convention's declared values for `filter` — `[]` for an absent filter (or a non-list, which the loader refuses). */
|
|
9
|
+
export declare function declaredAppliesTo(convention: IConvention, filter: ConventionAppliesToFilter): readonly string[];
|
|
10
|
+
/**
|
|
11
|
+
* A file path as the per-file filters AND a rule's patterns read it:
|
|
12
|
+
* project-relative, `/`-separated, no leading `./`. `checkConventionsAgainstFiles`
|
|
13
|
+
* normalizes its file list through this once, so the scope test and every
|
|
14
|
+
* `filePattern` / `expectMatch` / `forbidMatch` regex see ONE spelling of a file
|
|
15
|
+
* (round 15 review: `--files ./src/a.ts` was covered by `fileGlobs: ['src/**']`
|
|
16
|
+
* here and then failed `filePattern: '^src/'` on the raw `./src/a.ts` — a false hit).
|
|
17
|
+
*
|
|
18
|
+
* The spelling is REALPATH-canonical (round 15 follow-up, F9): the file and the
|
|
19
|
+
* project root are both resolved through their symlinks before one is made
|
|
20
|
+
* relative to the other, so a symlinked absolute path (`/link/src/a.ts` with
|
|
21
|
+
* `/link → the project`, or macOS `/var/…` for a root at `/private/var/…`)
|
|
22
|
+
* behaves exactly like its target — it read `../link/src/a.ts`, which no
|
|
23
|
+
* `fileGlobs` selected, so the convention was silently not applicable. A path
|
|
24
|
+
* whose target lies OUTSIDE the project (an in-project symlink to a sibling
|
|
25
|
+
* checkout) keeps its lexical in-project spelling: that is where it is in scope.
|
|
26
|
+
*/
|
|
27
|
+
export declare function conventionFilePath(inspection: ISharkcraftInspection, file: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Does `convention` apply here — to the workspace, and (given `file`) to that
|
|
30
|
+
* file? Without `file` only the workspace filters decide; the per-file ones
|
|
31
|
+
* are listed as `decided per file`. See the module doc for the table.
|
|
32
|
+
*/
|
|
33
|
+
export declare function conventionApplicability(convention: IConvention, inspection: ISharkcraftInspection, file?: string): IConventionApplicability;
|
|
34
|
+
/**
|
|
35
|
+
* Which of `files` `convention` covers — per file through
|
|
36
|
+
* {@link conventionApplicability}, so `conventions check` and the rule-graph
|
|
37
|
+
* bridge (which both call this) cannot disagree.
|
|
38
|
+
*
|
|
39
|
+
* Not applicable when a workspace filter excludes it, or when `files` is
|
|
40
|
+
* non-empty and no file passes the per-file filters (the per-file reasons
|
|
41
|
+
* then count what each filter selected across the list). An EMPTY list keeps
|
|
42
|
+
* a workspace-applicable convention applicable over nothing — the caller's own
|
|
43
|
+
* empty-scope verdict decides that case.
|
|
44
|
+
*/
|
|
45
|
+
export declare function conventionScope(convention: IConvention, inspection: ISharkcraftInspection, files: readonly string[]): IConventionScope;
|
|
46
|
+
//# sourceMappingURL=convention-applicability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention-applicability.d.ts","sourceRoot":"","sources":["../src/convention-applicability.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,yBAAyB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,4GAA4G;AAC5G,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAMtG,CAAC;AAWH,2HAA2H;AAC3H,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,yBAAyB,GAAG,SAAS,MAAM,EAAE,CAG/G;AAwCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAc1F;AAiED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,qBAAqB,EACjC,IAAI,CAAC,EAAE,MAAM,GACZ,wBAAwB,CAQ1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,gBAAgB,CAkDlB"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE convention applicability authority (round 15, 15.1).
|
|
3
|
+
*
|
|
4
|
+
* `IConventionAppliesTo` declares five filters; before this only `fileGlobs`
|
|
5
|
+
* was read — by two different matchers that disagreed (`conventions check`
|
|
6
|
+
* compiled `src/**\/*.ts` so it missed `src/a.ts` and ignored `!`; the
|
|
7
|
+
* rule-graph bridge dropped a convention with no `fileGlobs` that check
|
|
8
|
+
* enforced on every file). `profileIds`, `frameworks` and `languages` were
|
|
9
|
+
* validated, resolved by the doctor, and inert.
|
|
10
|
+
*
|
|
11
|
+
* Every surface now asks THIS module: `conventions check`, the rule-graph
|
|
12
|
+
* bridge, MCP `prepare_agent_task`, and the `conventions list / get / explain`
|
|
13
|
+
* display (which shows the answer and never hides an entry).
|
|
14
|
+
*
|
|
15
|
+
* Semantics — the pack-compatibility precedent (`pack-compatibility.ts`):
|
|
16
|
+
* - within a filter, ANY listed value matches;
|
|
17
|
+
* - EVERY declared filter must match;
|
|
18
|
+
* - an absent or empty filter imposes no constraint.
|
|
19
|
+
*
|
|
20
|
+
* | filter | level | matches when |
|
|
21
|
+
* |------------------|-----------|-----------------------------------------------------------|
|
|
22
|
+
* | `profileIds` | workspace | a listed id is in `inspection.workspace.profiles` |
|
|
23
|
+
* | `frameworks` | workspace | a listed id is in `inspection.workspace.frameworks[].id` |
|
|
24
|
+
* | `languages` | file | the file's language (`fileLanguageOf`) is listed |
|
|
25
|
+
* | `fileGlobs` | file | `globListSelects(file, globs)` — `**` spans zero+ segments, `!` subtracts |
|
|
26
|
+
* | `constructKinds` | reserved | always (not evaluated; the loader warns) |
|
|
27
|
+
*/
|
|
28
|
+
import { realpathSync } from 'node:fs';
|
|
29
|
+
import * as nodePath from 'node:path';
|
|
30
|
+
import { globListSelects } from '@shrkcrft/boundaries';
|
|
31
|
+
import { ConventionAppliesToFilter } from '@shrkcrft/plugin-api';
|
|
32
|
+
import { ConventionFilterLevel } from "./convention-filter-level.js";
|
|
33
|
+
import { fileLanguageOf } from "./file-languages.js";
|
|
34
|
+
/** Where each filter is decided — keyed by the enum, so a new filter without a level is a compile error. */
|
|
35
|
+
export const CONVENTION_FILTER_LEVELS = Object.freeze({
|
|
36
|
+
[ConventionAppliesToFilter.ProfileIds]: ConventionFilterLevel.Workspace,
|
|
37
|
+
[ConventionAppliesToFilter.Frameworks]: ConventionFilterLevel.Workspace,
|
|
38
|
+
[ConventionAppliesToFilter.Languages]: ConventionFilterLevel.File,
|
|
39
|
+
[ConventionAppliesToFilter.FileGlobs]: ConventionFilterLevel.File,
|
|
40
|
+
[ConventionAppliesToFilter.ConstructKinds]: ConventionFilterLevel.Reserved,
|
|
41
|
+
});
|
|
42
|
+
/** Reasons are listed workspace filters first, then per-file, then reserved. */
|
|
43
|
+
const FILTER_ORDER = [
|
|
44
|
+
ConventionAppliesToFilter.ProfileIds,
|
|
45
|
+
ConventionAppliesToFilter.Frameworks,
|
|
46
|
+
ConventionAppliesToFilter.Languages,
|
|
47
|
+
ConventionAppliesToFilter.FileGlobs,
|
|
48
|
+
ConventionAppliesToFilter.ConstructKinds,
|
|
49
|
+
];
|
|
50
|
+
/** The convention's declared values for `filter` — `[]` for an absent filter (or a non-list, which the loader refuses). */
|
|
51
|
+
export function declaredAppliesTo(convention, filter) {
|
|
52
|
+
const value = convention.appliesTo?.[filter];
|
|
53
|
+
return Array.isArray(value) ? value.filter((v) => typeof v === 'string') : [];
|
|
54
|
+
}
|
|
55
|
+
/** One realpath per distinct file per inspection — `conventionScope` judges every file once per per-file filter. */
|
|
56
|
+
const SPELLINGS = new WeakMap();
|
|
57
|
+
/**
|
|
58
|
+
* `abs` with every symlink resolved. A path that does not exist (a file a diff
|
|
59
|
+
* deleted, a path a test names) resolves through its nearest existing ancestor,
|
|
60
|
+
* so `/var/…/gone.ts` and `/private/var/…/gone.ts` still agree.
|
|
61
|
+
*/
|
|
62
|
+
function canonicalPath(abs) {
|
|
63
|
+
let head = abs;
|
|
64
|
+
const tail = [];
|
|
65
|
+
for (;;) {
|
|
66
|
+
try {
|
|
67
|
+
const real = realpathSync(head);
|
|
68
|
+
return tail.length > 0 ? nodePath.join(real, ...tail.reverse()) : real;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
const parent = nodePath.dirname(head);
|
|
72
|
+
if (parent === head)
|
|
73
|
+
return abs;
|
|
74
|
+
tail.push(nodePath.basename(head));
|
|
75
|
+
head = parent;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** The lexical spelling: project-relative for an absolute path, `/`-separated, no leading `./`. */
|
|
80
|
+
function lexicalFilePath(projectRoot, file) {
|
|
81
|
+
let f = nodePath.isAbsolute(file) ? nodePath.relative(projectRoot, file) : file;
|
|
82
|
+
f = f.replace(/\\/g, '/');
|
|
83
|
+
while (f.startsWith('./'))
|
|
84
|
+
f = f.slice(2);
|
|
85
|
+
return f;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* A file path as the per-file filters AND a rule's patterns read it:
|
|
89
|
+
* project-relative, `/`-separated, no leading `./`. `checkConventionsAgainstFiles`
|
|
90
|
+
* normalizes its file list through this once, so the scope test and every
|
|
91
|
+
* `filePattern` / `expectMatch` / `forbidMatch` regex see ONE spelling of a file
|
|
92
|
+
* (round 15 review: `--files ./src/a.ts` was covered by `fileGlobs: ['src/**']`
|
|
93
|
+
* here and then failed `filePattern: '^src/'` on the raw `./src/a.ts` — a false hit).
|
|
94
|
+
*
|
|
95
|
+
* The spelling is REALPATH-canonical (round 15 follow-up, F9): the file and the
|
|
96
|
+
* project root are both resolved through their symlinks before one is made
|
|
97
|
+
* relative to the other, so a symlinked absolute path (`/link/src/a.ts` with
|
|
98
|
+
* `/link → the project`, or macOS `/var/…` for a root at `/private/var/…`)
|
|
99
|
+
* behaves exactly like its target — it read `../link/src/a.ts`, which no
|
|
100
|
+
* `fileGlobs` selected, so the convention was silently not applicable. A path
|
|
101
|
+
* whose target lies OUTSIDE the project (an in-project symlink to a sibling
|
|
102
|
+
* checkout) keeps its lexical in-project spelling: that is where it is in scope.
|
|
103
|
+
*/
|
|
104
|
+
export function conventionFilePath(inspection, file) {
|
|
105
|
+
let cache = SPELLINGS.get(inspection);
|
|
106
|
+
if (!cache) {
|
|
107
|
+
cache = { realRoot: canonicalPath(nodePath.resolve(inspection.projectRoot)), files: new Map() };
|
|
108
|
+
SPELLINGS.set(inspection, cache);
|
|
109
|
+
}
|
|
110
|
+
const known = cache.files.get(file);
|
|
111
|
+
if (known !== undefined)
|
|
112
|
+
return known;
|
|
113
|
+
const real = canonicalPath(nodePath.resolve(inspection.projectRoot, file));
|
|
114
|
+
const rel = nodePath.relative(cache.realRoot, real);
|
|
115
|
+
const inside = rel.length > 0 && rel !== '..' && !rel.startsWith(`..${nodePath.sep}`) && !nodePath.isAbsolute(rel);
|
|
116
|
+
const spelled = inside ? rel.split(nodePath.sep).join('/') : lexicalFilePath(inspection.projectRoot, file);
|
|
117
|
+
cache.files.set(file, spelled);
|
|
118
|
+
return spelled;
|
|
119
|
+
}
|
|
120
|
+
function list(values) {
|
|
121
|
+
return `[${values.join(', ')}]`;
|
|
122
|
+
}
|
|
123
|
+
function reason(filter, declared, observed, matched, detail) {
|
|
124
|
+
return {
|
|
125
|
+
filter,
|
|
126
|
+
level: CONVENTION_FILTER_LEVELS[filter],
|
|
127
|
+
declared,
|
|
128
|
+
observed,
|
|
129
|
+
matched,
|
|
130
|
+
message: `appliesTo.${filter} ${list(declared)}: ${detail}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** A workspace filter: any declared id among the detected ones. */
|
|
134
|
+
function judgeWorkspace(filter, declared, detected, noun) {
|
|
135
|
+
const hit = declared.filter((d) => detected.includes(d));
|
|
136
|
+
if (hit.length > 0)
|
|
137
|
+
return reason(filter, declared, detected, true, `detected ${hit.join(', ')}`);
|
|
138
|
+
const seen = detected.length > 0 ? `detected: ${detected.join(', ')}` : `no ${noun} detected`;
|
|
139
|
+
return reason(filter, declared, detected, false, `none detected (${seen})`);
|
|
140
|
+
}
|
|
141
|
+
function judge(filter, declared, inspection, file) {
|
|
142
|
+
switch (filter) {
|
|
143
|
+
case ConventionAppliesToFilter.ProfileIds:
|
|
144
|
+
return judgeWorkspace(filter, declared, [...(inspection.workspace?.profiles ?? [])], 'profile');
|
|
145
|
+
case ConventionAppliesToFilter.Frameworks:
|
|
146
|
+
return judgeWorkspace(filter, declared, (inspection.workspace?.frameworks ?? []).map((f) => f.id), 'framework');
|
|
147
|
+
case ConventionAppliesToFilter.ConstructKinds:
|
|
148
|
+
return reason(filter, declared, [], true, 'reserved — not evaluated (the convention applies regardless)');
|
|
149
|
+
case ConventionAppliesToFilter.Languages: {
|
|
150
|
+
if (file === undefined)
|
|
151
|
+
return reason(filter, declared, [], true, 'decided per file');
|
|
152
|
+
const path = conventionFilePath(inspection, file);
|
|
153
|
+
const language = fileLanguageOf(path)?.id;
|
|
154
|
+
if (language === undefined)
|
|
155
|
+
return reason(filter, declared, [], false, `${path} has no known language`);
|
|
156
|
+
return reason(filter, declared, [language], declared.includes(language), `${path} is ${language}`);
|
|
157
|
+
}
|
|
158
|
+
case ConventionAppliesToFilter.FileGlobs: {
|
|
159
|
+
if (file === undefined)
|
|
160
|
+
return reason(filter, declared, [], true, 'decided per file');
|
|
161
|
+
const path = conventionFilePath(inspection, file);
|
|
162
|
+
const selected = globListSelects(path, declared);
|
|
163
|
+
return reason(filter, declared, [path], selected, `${selected ? 'selects' : 'does not select'} ${path}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Does `convention` apply here — to the workspace, and (given `file`) to that
|
|
169
|
+
* file? Without `file` only the workspace filters decide; the per-file ones
|
|
170
|
+
* are listed as `decided per file`. See the module doc for the table.
|
|
171
|
+
*/
|
|
172
|
+
export function conventionApplicability(convention, inspection, file) {
|
|
173
|
+
const reasons = [];
|
|
174
|
+
for (const filter of FILTER_ORDER) {
|
|
175
|
+
const declared = declaredAppliesTo(convention, filter);
|
|
176
|
+
if (declared.length === 0)
|
|
177
|
+
continue;
|
|
178
|
+
reasons.push(judge(filter, declared, inspection, file));
|
|
179
|
+
}
|
|
180
|
+
return { applicable: reasons.every((r) => r.matched), reasons };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Which of `files` `convention` covers — per file through
|
|
184
|
+
* {@link conventionApplicability}, so `conventions check` and the rule-graph
|
|
185
|
+
* bridge (which both call this) cannot disagree.
|
|
186
|
+
*
|
|
187
|
+
* Not applicable when a workspace filter excludes it, or when `files` is
|
|
188
|
+
* non-empty and no file passes the per-file filters (the per-file reasons
|
|
189
|
+
* then count what each filter selected across the list). An EMPTY list keeps
|
|
190
|
+
* a workspace-applicable convention applicable over nothing — the caller's own
|
|
191
|
+
* empty-scope verdict decides that case.
|
|
192
|
+
*/
|
|
193
|
+
export function conventionScope(convention, inspection, files) {
|
|
194
|
+
const conventionId = convention.id;
|
|
195
|
+
const workspace = conventionApplicability(convention, inspection);
|
|
196
|
+
if (!workspace.applicable)
|
|
197
|
+
return { conventionId, applicable: false, files: [], reasons: workspace.reasons };
|
|
198
|
+
const perFile = FILTER_ORDER.filter((f) => CONVENTION_FILTER_LEVELS[f] === ConventionFilterLevel.File && declaredAppliesTo(convention, f).length > 0);
|
|
199
|
+
if (perFile.length === 0 || files.length === 0) {
|
|
200
|
+
return { conventionId, applicable: true, files: [...files], reasons: workspace.reasons };
|
|
201
|
+
}
|
|
202
|
+
const covered = [];
|
|
203
|
+
const admitted = new Map();
|
|
204
|
+
const seen = new Map();
|
|
205
|
+
for (const file of files) {
|
|
206
|
+
const verdict = conventionApplicability(convention, inspection, file);
|
|
207
|
+
if (verdict.applicable)
|
|
208
|
+
covered.push(file);
|
|
209
|
+
for (const r of verdict.reasons) {
|
|
210
|
+
if (r.level !== ConventionFilterLevel.File)
|
|
211
|
+
continue;
|
|
212
|
+
if (r.matched)
|
|
213
|
+
admitted.set(r.filter, (admitted.get(r.filter) ?? 0) + 1);
|
|
214
|
+
if (r.filter === ConventionAppliesToFilter.Languages) {
|
|
215
|
+
const s = seen.get(r.filter) ?? new Set();
|
|
216
|
+
for (const o of r.observed)
|
|
217
|
+
s.add(o);
|
|
218
|
+
seen.set(r.filter, s);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (covered.length > 0)
|
|
223
|
+
return { conventionId, applicable: true, files: covered, reasons: workspace.reasons };
|
|
224
|
+
// No file passed: say, per declared per-file filter, what it selected across
|
|
225
|
+
// the list. A filter that admitted NO file excluded the convention (matched:
|
|
226
|
+
// false); one that admitted some did not (matched: true) — unless EVERY
|
|
227
|
+
// per-file filter admitted some file and none passed them all: then the
|
|
228
|
+
// intersection excluded it, and each filter says so. So the excluding reasons
|
|
229
|
+
// are never empty and never name a filter that excluded nothing (round 15
|
|
230
|
+
// review: `fileGlobs` read "selects 1 of 1 file(s)" as an excluding reason).
|
|
231
|
+
const n = files.length;
|
|
232
|
+
const intersectionOnly = perFile.every((filter) => (admitted.get(filter) ?? 0) > 0);
|
|
233
|
+
const together = intersectionOnly ? ' — but no file in scope passes every per-file filter together' : '';
|
|
234
|
+
const aggregated = perFile.map((filter) => {
|
|
235
|
+
const declared = declaredAppliesTo(convention, filter);
|
|
236
|
+
const count = admitted.get(filter) ?? 0;
|
|
237
|
+
const matched = count > 0 && !intersectionOnly;
|
|
238
|
+
if (filter === ConventionAppliesToFilter.Languages) {
|
|
239
|
+
const langs = [...(seen.get(filter) ?? new Set())].sort();
|
|
240
|
+
const detail = `${count} of ${n} file(s) in scope ${count === 1 ? 'is' : 'are'} a listed language (seen: ${langs.length > 0 ? langs.join(', ') : 'none known'})${together}`;
|
|
241
|
+
return reason(filter, declared, langs, matched, detail);
|
|
242
|
+
}
|
|
243
|
+
return reason(filter, declared, [], matched, `selects ${count} of ${n} file(s) in scope${together}`);
|
|
244
|
+
});
|
|
245
|
+
const workspaceReasons = workspace.reasons.filter((r) => r.level !== ConventionFilterLevel.File);
|
|
246
|
+
return { conventionId, applicable: false, files: [], reasons: [...workspaceReasons, ...aggregated] };
|
|
247
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where an `appliesTo` filter is decided (round 15, 15.1) — see
|
|
3
|
+
* `conventionApplicability`.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum ConventionFilterLevel {
|
|
6
|
+
/** Decided once per workspace, from what the workspace detectors saw (`profileIds`, `frameworks`). */
|
|
7
|
+
Workspace = "workspace",
|
|
8
|
+
/** Decided per file (`fileGlobs`, `languages`). */
|
|
9
|
+
File = "file",
|
|
10
|
+
/** Loaded and never evaluated — the convention applies regardless (`constructKinds`). */
|
|
11
|
+
Reserved = "reserved"
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=convention-filter-level.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention-filter-level.d.ts","sourceRoot":"","sources":["../src/convention-filter-level.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,qBAAqB;IAC/B,sGAAsG;IACtG,SAAS,cAAc;IACvB,mDAAmD;IACnD,IAAI,SAAS;IACb,yFAAyF;IACzF,QAAQ,aAAa;CACtB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where an `appliesTo` filter is decided (round 15, 15.1) — see
|
|
3
|
+
* `conventionApplicability`.
|
|
4
|
+
*/
|
|
5
|
+
export var ConventionFilterLevel;
|
|
6
|
+
(function (ConventionFilterLevel) {
|
|
7
|
+
/** Decided once per workspace, from what the workspace detectors saw (`profileIds`, `frameworks`). */
|
|
8
|
+
ConventionFilterLevel["Workspace"] = "workspace";
|
|
9
|
+
/** Decided per file (`fileGlobs`, `languages`). */
|
|
10
|
+
ConventionFilterLevel["File"] = "file";
|
|
11
|
+
/** Loaded and never evaluated — the convention applies regardless (`constructKinds`). */
|
|
12
|
+
ConventionFilterLevel["Reserved"] = "reserved";
|
|
13
|
+
})(ConventionFilterLevel || (ConventionFilterLevel = {}));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type IConvention } from '@shrkcrft/plugin-api';
|
|
1
|
+
import { ConventionSeverity, type IConvention } from '@shrkcrft/plugin-api';
|
|
2
2
|
import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
|
|
3
|
+
import type { INotApplicableConvention } from './i-not-applicable-convention.js';
|
|
3
4
|
import { type IRejectedEntry } from '@shrkcrft/core';
|
|
4
5
|
export declare const CONVENTION_REGISTRY_SCHEMA = "sharkcraft.convention-registry/v1";
|
|
5
6
|
export declare enum ConventionSource {
|
|
@@ -14,7 +15,7 @@ export interface IConventionEntry {
|
|
|
14
15
|
readonly sourceFile: string;
|
|
15
16
|
}
|
|
16
17
|
export interface IConventionDoctorIssue {
|
|
17
|
-
readonly severity:
|
|
18
|
+
readonly severity: ConventionSeverity;
|
|
18
19
|
readonly code: string;
|
|
19
20
|
readonly message: string;
|
|
20
21
|
readonly conventionId?: string;
|
|
@@ -53,7 +54,7 @@ export interface IConventionCheckHit {
|
|
|
53
54
|
readonly ruleId: string;
|
|
54
55
|
readonly file: string;
|
|
55
56
|
readonly line?: number;
|
|
56
|
-
readonly severity:
|
|
57
|
+
readonly severity: ConventionSeverity;
|
|
57
58
|
readonly message: string;
|
|
58
59
|
}
|
|
59
60
|
export interface IConventionCheckReport {
|
|
@@ -61,6 +62,30 @@ export interface IConventionCheckReport {
|
|
|
61
62
|
readonly filesScanned: number;
|
|
62
63
|
readonly hits: readonly IConventionCheckHit[];
|
|
63
64
|
readonly verdict: 'clean' | 'has-violations';
|
|
65
|
+
/**
|
|
66
|
+
* Conventions that do not apply here (round 15, 15.1) — never evaluated, each
|
|
67
|
+
* with the `appliesTo` filters that excluded it. `conventions check` prints
|
|
68
|
+
* every one and accepts it explicitly (`acceptedBy: 'appliesTo'`).
|
|
69
|
+
*/
|
|
70
|
+
readonly notApplicable: readonly INotApplicableConvention[];
|
|
71
|
+
/** How many files in scope each APPLICABLE convention covers, by id (round 15). */
|
|
72
|
+
readonly filesInScope: Readonly<Record<string, number>>;
|
|
64
73
|
}
|
|
65
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Run the loaded conventions against `files`. Which files a convention covers
|
|
76
|
+
* is `conventionScope` — THE applicability authority (round 15), the same one
|
|
77
|
+
* the rule-graph bridge reads — so every `appliesTo` filter scopes, `**`
|
|
78
|
+
* spans zero or more segments, and a `!` glob subtracts (a private matcher
|
|
79
|
+
* here missed `src/a.ts` under `src/**\/*.ts` and ignored `!`). A convention
|
|
80
|
+
* that does not apply is never evaluated and is reported in `notApplicable`.
|
|
81
|
+
*
|
|
82
|
+
* Per covered file, each rule: `filePattern` and `expectMatch` must match the
|
|
83
|
+
* path (a miss is a hit), `forbidMatch` must not (a match is a hit).
|
|
84
|
+
*
|
|
85
|
+
* Every file is read in ONE spelling — `conventionFilePath` (project-relative,
|
|
86
|
+
* `/`-separated, no `./`), the one the scope test reads — so a rule pattern
|
|
87
|
+
* never tests a spelling the glob did not, and a hit names that path (round 15
|
|
88
|
+
* review: `./src/a.ts` was covered by `src/**` and then failed `^src/`).
|
|
89
|
+
*/
|
|
90
|
+
export declare function checkConventionsAgainstFiles(inspection: ISharkcraftInspection, inputFiles: readonly string[]): Promise<IConventionCheckReport>;
|
|
66
91
|
//# sourceMappingURL=convention-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convention-registry.d.ts","sourceRoot":"","sources":["../src/convention-registry.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"convention-registry.d.ts","sourceRoot":"","sources":["../src/convention-registry.ts"],"names":[],"mappings":"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"}
|