@promptci/core 0.0.1 → 0.2.0
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/LICENSE +201 -201
- package/README.md +29 -30
- package/dist/action-pinning.d.ts +37 -0
- package/dist/action-pinning.d.ts.map +1 -0
- package/dist/action-pinning.js +277 -0
- package/dist/action-pinning.js.map +1 -0
- package/dist/agent-practices.d.ts +3 -1
- package/dist/agent-practices.d.ts.map +1 -1
- package/dist/agent-practices.js +198 -94
- package/dist/agent-practices.js.map +1 -1
- package/dist/ai-config.d.ts +178 -0
- package/dist/ai-config.d.ts.map +1 -0
- package/dist/ai-config.js +721 -0
- package/dist/ai-config.js.map +1 -0
- package/dist/alias-files.d.ts +33 -0
- package/dist/alias-files.d.ts.map +1 -0
- package/dist/alias-files.js +60 -0
- package/dist/alias-files.js.map +1 -0
- package/dist/baseline.d.ts +17 -1
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +5 -1
- package/dist/baseline.js.map +1 -1
- package/dist/buried-critical.d.ts +17 -0
- package/dist/buried-critical.d.ts.map +1 -0
- package/dist/buried-critical.js +107 -0
- package/dist/buried-critical.js.map +1 -0
- package/dist/canonical-owner.d.ts.map +1 -1
- package/dist/canonical-owner.js +60 -30
- package/dist/canonical-owner.js.map +1 -1
- package/dist/ci-alignment.d.ts.map +1 -1
- package/dist/ci-alignment.js +3 -2
- package/dist/ci-alignment.js.map +1 -1
- package/dist/command-validity.d.ts +16 -0
- package/dist/command-validity.d.ts.map +1 -1
- package/dist/command-validity.js +387 -134
- package/dist/command-validity.js.map +1 -1
- package/dist/conflicts.d.ts.map +1 -1
- package/dist/conflicts.js +4 -44
- package/dist/conflicts.js.map +1 -1
- package/dist/context-analysis.d.ts.map +1 -1
- package/dist/context-analysis.js +13 -2
- package/dist/context-analysis.js.map +1 -1
- package/dist/context-bloat.d.ts +20 -1
- package/dist/context-bloat.d.ts.map +1 -1
- package/dist/context-bloat.js +99 -15
- package/dist/context-bloat.js.map +1 -1
- package/dist/context-optimizer.d.ts.map +1 -1
- package/dist/context-optimizer.js +18 -54
- package/dist/context-optimizer.js.map +1 -1
- package/dist/copilot-instructions-detector.d.ts +24 -0
- package/dist/copilot-instructions-detector.d.ts.map +1 -0
- package/dist/copilot-instructions-detector.js +145 -0
- package/dist/copilot-instructions-detector.js.map +1 -0
- package/dist/cursor-rules-detector.d.ts +17 -0
- package/dist/cursor-rules-detector.d.ts.map +1 -0
- package/dist/cursor-rules-detector.js +110 -0
- package/dist/cursor-rules-detector.js.map +1 -0
- package/dist/custom-rules.d.ts +52 -0
- package/dist/custom-rules.d.ts.map +1 -0
- package/dist/custom-rules.js +303 -0
- package/dist/custom-rules.js.map +1 -0
- package/dist/dead-references.d.ts +8 -2
- package/dist/dead-references.d.ts.map +1 -1
- package/dist/dead-references.js +315 -68
- package/dist/dead-references.js.map +1 -1
- package/dist/dependency-staleness.d.ts +35 -0
- package/dist/dependency-staleness.d.ts.map +1 -0
- package/dist/dependency-staleness.js +1001 -0
- package/dist/dependency-staleness.js.map +1 -0
- package/dist/detectors.d.ts +1 -3
- package/dist/detectors.d.ts.map +1 -1
- package/dist/detectors.js +74 -56
- package/dist/detectors.js.map +1 -1
- package/dist/duplicates.d.ts.map +1 -1
- package/dist/duplicates.js +15 -9
- package/dist/duplicates.js.map +1 -1
- package/dist/evidence.d.ts +39 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +78 -0
- package/dist/evidence.js.map +1 -0
- package/dist/finding-id.d.ts +21 -0
- package/dist/finding-id.d.ts.map +1 -0
- package/dist/finding-id.js +31 -0
- package/dist/finding-id.js.map +1 -0
- package/dist/fix-engine.d.ts +11 -0
- package/dist/fix-engine.d.ts.map +1 -1
- package/dist/fix-engine.js +88 -71
- package/dist/fix-engine.js.map +1 -1
- package/dist/frameworks/dotnet.js +2 -2
- package/dist/frameworks/dotnet.js.map +1 -1
- package/dist/frameworks/python.d.ts.map +1 -1
- package/dist/frameworks/python.js +5 -2
- package/dist/frameworks/python.js.map +1 -1
- package/dist/frameworks/rust.d.ts.map +1 -1
- package/dist/frameworks/rust.js +2 -1
- package/dist/frameworks/rust.js.map +1 -1
- package/dist/git-symlinks.d.ts +30 -0
- package/dist/git-symlinks.d.ts.map +1 -0
- package/dist/git-symlinks.js +161 -0
- package/dist/git-symlinks.js.map +1 -0
- package/dist/gitignore.d.ts +22 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +157 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/health-score.d.ts.map +1 -1
- package/dist/health-score.js +35 -5
- package/dist/health-score.js.map +1 -1
- package/dist/hooks-settings-detector.d.ts +17 -0
- package/dist/hooks-settings-detector.d.ts.map +1 -0
- package/dist/hooks-settings-detector.js +228 -0
- package/dist/hooks-settings-detector.js.map +1 -0
- package/dist/index.d.ts +29 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -6
- package/dist/index.js.map +1 -1
- package/dist/makefile.d.ts +37 -0
- package/dist/makefile.d.ts.map +1 -0
- package/dist/makefile.js +156 -0
- package/dist/makefile.js.map +1 -0
- package/dist/manifest-consistency.d.ts +6 -0
- package/dist/manifest-consistency.d.ts.map +1 -1
- package/dist/manifest-consistency.js +75 -10
- package/dist/manifest-consistency.js.map +1 -1
- package/dist/markdown-fences.d.ts +112 -0
- package/dist/markdown-fences.d.ts.map +1 -0
- package/dist/markdown-fences.js +174 -0
- package/dist/markdown-fences.js.map +1 -0
- package/dist/mcp-config-detector.d.ts +20 -0
- package/dist/mcp-config-detector.d.ts.map +1 -0
- package/dist/mcp-config-detector.js +237 -0
- package/dist/mcp-config-detector.js.map +1 -0
- package/dist/missing-context.d.ts.map +1 -1
- package/dist/missing-context.js +2 -52
- package/dist/missing-context.js.map +1 -1
- package/dist/model-budgets.d.ts +69 -0
- package/dist/model-budgets.d.ts.map +1 -0
- package/dist/model-budgets.js +110 -0
- package/dist/model-budgets.js.map +1 -0
- package/dist/negative-instructions.d.ts +26 -0
- package/dist/negative-instructions.d.ts.map +1 -0
- package/dist/negative-instructions.js +169 -0
- package/dist/negative-instructions.js.map +1 -0
- package/dist/path-containment.d.ts +41 -0
- package/dist/path-containment.d.ts.map +1 -0
- package/dist/path-containment.js +123 -0
- package/dist/path-containment.js.map +1 -0
- package/dist/project-type.d.ts +12 -2
- package/dist/project-type.d.ts.map +1 -1
- package/dist/project-type.js +25 -12
- package/dist/project-type.js.map +1 -1
- package/dist/prompt-cache.d.ts.map +1 -1
- package/dist/prompt-cache.js +33 -24
- package/dist/prompt-cache.js.map +1 -1
- package/dist/promptci-gitignore.d.ts +34 -0
- package/dist/promptci-gitignore.d.ts.map +1 -0
- package/dist/promptci-gitignore.js +42 -0
- package/dist/promptci-gitignore.js.map +1 -0
- package/dist/repo-context.d.ts +80 -0
- package/dist/repo-context.d.ts.map +1 -1
- package/dist/repo-context.js +170 -16
- package/dist/repo-context.js.map +1 -1
- package/dist/report.d.ts +8 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +163 -63
- package/dist/report.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +47 -4
- package/dist/scan.js.map +1 -1
- package/dist/scanner.d.ts +61 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +367 -70
- package/dist/scanner.js.map +1 -1
- package/dist/security-pack.d.ts +20 -0
- package/dist/security-pack.d.ts.map +1 -1
- package/dist/security-pack.js +33 -14
- package/dist/security-pack.js.map +1 -1
- package/dist/skill-supply-chain.d.ts +132 -0
- package/dist/skill-supply-chain.d.ts.map +1 -0
- package/dist/skill-supply-chain.js +2954 -0
- package/dist/skill-supply-chain.js.map +1 -0
- package/dist/skills-detector.d.ts +23 -0
- package/dist/skills-detector.d.ts.map +1 -0
- package/dist/skills-detector.js +279 -0
- package/dist/skills-detector.js.map +1 -0
- package/dist/stale-instructions.d.ts +4 -1
- package/dist/stale-instructions.d.ts.map +1 -1
- package/dist/stale-instructions.js +53 -55
- package/dist/stale-instructions.js.map +1 -1
- package/dist/subagents-detector.d.ts +19 -0
- package/dist/subagents-detector.d.ts.map +1 -0
- package/dist/subagents-detector.js +155 -0
- package/dist/subagents-detector.js.map +1 -0
- package/dist/suppression.d.ts +2 -0
- package/dist/suppression.d.ts.map +1 -1
- package/dist/suppression.js +16 -47
- package/dist/suppression.js.map +1 -1
- package/dist/types.d.ts +62 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +47 -1
- package/dist/types.js.map +1 -1
- package/dist/vague-guidance.d.ts +15 -2
- package/dist/vague-guidance.d.ts.map +1 -1
- package/dist/vague-guidance.js +44 -41
- package/dist/vague-guidance.js.map +1 -1
- package/dist/windsurf-detector.d.ts +22 -0
- package/dist/windsurf-detector.d.ts.map +1 -0
- package/dist/windsurf-detector.js +96 -0
- package/dist/windsurf-detector.js.map +1 -0
- package/dist/within-section-dedup.d.ts +16 -0
- package/dist/within-section-dedup.d.ts.map +1 -0
- package/dist/within-section-dedup.js +148 -0
- package/dist/within-section-dedup.js.map +1 -0
- package/dist/workspace-manifests.d.ts +80 -0
- package/dist/workspace-manifests.d.ts.map +1 -0
- package/dist/workspace-manifests.js +333 -0
- package/dist/workspace-manifests.js.map +1 -0
- package/package.json +11 -8
- package/dist/cheap-model-routing.d.ts +0 -4
- package/dist/cheap-model-routing.d.ts.map +0 -1
- package/dist/cheap-model-routing.js +0 -43
- package/dist/cheap-model-routing.js.map +0 -1
- package/dist/cli-output-filter.d.ts +0 -16
- package/dist/cli-output-filter.d.ts.map +0 -1
- package/dist/cli-output-filter.js +0 -88
- package/dist/cli-output-filter.js.map +0 -1
- package/dist/context-cost.d.ts +0 -4
- package/dist/context-cost.d.ts.map +0 -1
- package/dist/context-cost.js +0 -70
- package/dist/context-cost.js.map +0 -1
- package/dist/context-recommender.d.ts +0 -3
- package/dist/context-recommender.d.ts.map +0 -1
- package/dist/context-recommender.js +0 -329
- package/dist/context-recommender.js.map +0 -1
- package/dist/llm.d.ts +0 -6
- package/dist/llm.d.ts.map +0 -1
- package/dist/llm.js +0 -67
- package/dist/llm.js.map +0 -1
- package/dist/mcp-detector.d.ts +0 -4
- package/dist/mcp-detector.d.ts.map +0 -1
- package/dist/mcp-detector.js +0 -131
- package/dist/mcp-detector.js.map +0 -1
- package/dist/native-tool-preference.d.ts +0 -20
- package/dist/native-tool-preference.d.ts.map +0 -1
- package/dist/native-tool-preference.js +0 -94
- package/dist/native-tool-preference.js.map +0 -1
- package/dist/output-verbosity.d.ts +0 -3
- package/dist/output-verbosity.d.ts.map +0 -1
- package/dist/output-verbosity.js +0 -83
- package/dist/output-verbosity.js.map +0 -1
- package/dist/product-boundary.d.ts +0 -11
- package/dist/product-boundary.d.ts.map +0 -1
- package/dist/product-boundary.js +0 -301
- package/dist/product-boundary.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale-instructions.d.ts","sourceRoot":"","sources":["../src/stale-instructions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stale-instructions.d.ts","sourceRoot":"","sources":["../src/stale-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAsB,aAAa,EAAE,MAAM,YAAY,CAAC;AAoBrF,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,GAAG,GAAE,IAAiB,GAAG,MAAM,CAE1D;AAqKD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,aAAa,EAAE,CAgGjF"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Stale-instruction detector for PromptCI.
|
|
3
3
|
*
|
|
4
4
|
* Flags sections that likely reference outdated content:
|
|
5
|
-
* -
|
|
5
|
+
* - Recent-but-past years that appear outside code blocks (rolling window,
|
|
6
|
+
* see STALE_YEAR_WINDOW below)
|
|
6
7
|
* - Cleanup keywords: "TODO remove", "remove later", "temporary fix", "workaround"
|
|
7
8
|
* - "deprecated" near a version number or tool name
|
|
8
9
|
* - Known old framework versions (React 16, Next.js 9, Unity 2019, etc.)
|
|
@@ -10,14 +11,47 @@
|
|
|
10
11
|
* Findings are heuristic — wording is intentionally cautious.
|
|
11
12
|
*/
|
|
12
13
|
import * as crypto from 'node:crypto';
|
|
14
|
+
import { stripCodeBlocks } from './markdown-fences.js';
|
|
15
|
+
import { snippet } from './evidence.js';
|
|
16
|
+
import { sectionIdPath } from './finding-id.js';
|
|
13
17
|
// ─── Pattern definitions ──────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* BUG-14: the stale-year window is derived from the current date rather than
|
|
20
|
+
* hardcoded. The previous literal alternation (2019…2025) was correct only for
|
|
21
|
+
* calendar 2026 and silently stopped flagging last year's dates every Jan 1.
|
|
22
|
+
*
|
|
23
|
+
* How far back the window reaches. In year Y the detector flags
|
|
24
|
+
* Y-STALE_YEAR_WINDOW … Y-1 inclusive; the current year is never stale, and
|
|
25
|
+
* years older than the window are assumed to be deliberate historical
|
|
26
|
+
* references (founding dates, cited papers, license years) rather than
|
|
27
|
+
* instructions that rotted.
|
|
28
|
+
*/
|
|
29
|
+
const STALE_YEAR_WINDOW = 7;
|
|
30
|
+
/** Seam for tests; production callers always get the real clock. */
|
|
31
|
+
export function currentYear(now = new Date()) {
|
|
32
|
+
return now.getFullYear();
|
|
33
|
+
}
|
|
34
|
+
let cachedYear = 0;
|
|
35
|
+
let cachedYearRe = null;
|
|
14
36
|
/**
|
|
15
37
|
* Years likely stale in an AI instruction context.
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
38
|
+
* Must not be immediately preceded or followed by "/" or "-" (avoids ISO dates
|
|
39
|
+
* like 2022-01-01 or paths like /2022/report) — those are not year references.
|
|
40
|
+
*
|
|
41
|
+
* Rebuilt only when the calendar year changes, so a long-running process that
|
|
42
|
+
* crosses midnight on New Year's Eve picks up the new window.
|
|
19
43
|
*/
|
|
20
|
-
|
|
44
|
+
function staleYearPattern() {
|
|
45
|
+
const year = currentYear();
|
|
46
|
+
if (cachedYearRe && cachedYear === year)
|
|
47
|
+
return cachedYearRe;
|
|
48
|
+
const years = [];
|
|
49
|
+
for (let y = year - STALE_YEAR_WINDOW; y <= year - 1; y++)
|
|
50
|
+
years.push(String(y));
|
|
51
|
+
cachedYear = year;
|
|
52
|
+
cachedYearRe = new RegExp(`(?<![/-])\\b(${years.join('|')})\\b(?![/-])`, 'g');
|
|
53
|
+
return cachedYearRe;
|
|
54
|
+
}
|
|
21
55
|
/**
|
|
22
56
|
* BUG-A1: Section headings that indicate historical records rather than active
|
|
23
57
|
* instructions. Old year references in changelogs and release notes are expected
|
|
@@ -81,14 +115,10 @@ const OLD_VERSION_PATTERNS = [
|
|
|
81
115
|
];
|
|
82
116
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
83
117
|
function issueId(section, tag) {
|
|
84
|
-
const key = `${section
|
|
118
|
+
const key = `${sectionIdPath(section)}:${section.startLine}:${tag}`;
|
|
85
119
|
const hash = crypto.createHash('sha1').update(key).digest('hex').slice(0, 12);
|
|
86
120
|
return `stale-${hash}`;
|
|
87
121
|
}
|
|
88
|
-
function snippet(text, maxLen = 120) {
|
|
89
|
-
const clean = text.replace(/\s+/g, ' ').trim();
|
|
90
|
-
return clean.length <= maxLen ? clean : `${clean.slice(0, maxLen)}…`;
|
|
91
|
-
}
|
|
92
122
|
function collectMatches(text, re) {
|
|
93
123
|
const matches = [];
|
|
94
124
|
let m;
|
|
@@ -117,7 +147,9 @@ function collectOldHtmlTodoMatches(text) {
|
|
|
117
147
|
const cloned = new RegExp(HTML_COMMENT_DATED_TODO_RE.source, HTML_COMMENT_DATED_TODO_RE.flags);
|
|
118
148
|
while ((m = cloned.exec(text)) !== null) {
|
|
119
149
|
const year = Number(m[2]);
|
|
120
|
-
|
|
150
|
+
// BUG-14: was `year <= 2025`. Anything before the current year is a dated
|
|
151
|
+
// marker that has already come due; the current year has not.
|
|
152
|
+
if (year < currentYear()) {
|
|
121
153
|
matches.push(m[0]);
|
|
122
154
|
}
|
|
123
155
|
}
|
|
@@ -142,47 +174,6 @@ function isVersionInNegationContext(text, index) {
|
|
|
142
174
|
const preceding = text.slice(Math.max(0, index - 80), index).toLowerCase();
|
|
143
175
|
return /\b(?:do\s+not|don['']?t|avoid|never|no\s+longer|drop(?:ped|ping)?|remov(?:ed?|ing)|deprecat(?:ed?|ing)|stop(?:ped|ping)?\s+(?:using|support(?:ing)?))\b(?:(?!\n[ \t]*\n)[^.!?])*$/.test(preceding);
|
|
144
176
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Strip fenced code blocks from text before scanning for stale years.
|
|
147
|
-
* Code blocks often contain version pins or changelog entries that are
|
|
148
|
-
* expected to reference specific years and should not trigger the detector.
|
|
149
|
-
*
|
|
150
|
-
* ST3: tracks fence character + length (matching scanner.ts's S1 fix and
|
|
151
|
-
* vague-guidance.ts's V4 fix) instead of a `` ```...``` `` regex, so ~~~
|
|
152
|
-
* fences are also stripped and an unclosed fence correctly swallows the
|
|
153
|
-
* remainder of the text (rather than leaving it unstripped, as
|
|
154
|
-
* `/```[\s\S]*?```/` did when no closing fence existed).
|
|
155
|
-
*/
|
|
156
|
-
function stripCodeBlocks(text, stripInlineCode = true) {
|
|
157
|
-
const lines = text.split('\n');
|
|
158
|
-
const kept = [];
|
|
159
|
-
let inBlock = false;
|
|
160
|
-
let fenceChar = null;
|
|
161
|
-
let fenceLen = 0;
|
|
162
|
-
for (const line of lines) {
|
|
163
|
-
if (!inBlock) {
|
|
164
|
-
const openMatch = /^ {0,3}([`~]{3,})/.exec(line);
|
|
165
|
-
if (openMatch) {
|
|
166
|
-
inBlock = true;
|
|
167
|
-
fenceChar = openMatch[1][0] ?? null;
|
|
168
|
-
fenceLen = openMatch[1].length;
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
kept.push(line);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
const closeMatch = /^ {0,3}([`~]{3,})\s*$/.exec(line);
|
|
175
|
-
if (closeMatch && closeMatch[1][0] === fenceChar && closeMatch[1].length >= fenceLen) {
|
|
176
|
-
inBlock = false;
|
|
177
|
-
fenceChar = null;
|
|
178
|
-
fenceLen = 0;
|
|
179
|
-
}
|
|
180
|
-
// else: still inside the fence — drop the line
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
const noFences = kept.join('\n');
|
|
184
|
-
return stripInlineCode ? noFences.replace(/`[^`\n]+`/g, '') : noFences;
|
|
185
|
-
}
|
|
186
177
|
// ─── Main detector ────────────────────────────────────────────────────────────
|
|
187
178
|
/**
|
|
188
179
|
* Detect sections that may contain stale or outdated instructions.
|
|
@@ -200,13 +191,13 @@ export function detectStaleInstructions(files) {
|
|
|
200
191
|
if (section.heading && HISTORY_SECTION_RE.test(section.heading))
|
|
201
192
|
continue;
|
|
202
193
|
const text = section.text;
|
|
203
|
-
const textNoCode = stripCodeBlocks(text);
|
|
204
|
-
const textNoFencedCode = stripCodeBlocks(text
|
|
194
|
+
const textNoCode = stripCodeBlocks(text, { stripInlineCode: true });
|
|
195
|
+
const textNoFencedCode = stripCodeBlocks(text);
|
|
205
196
|
const evidence = [];
|
|
206
197
|
let confidence = 0;
|
|
207
198
|
const sectionKey = `${file.path}:${section.startLine}`;
|
|
208
199
|
// 1. Stale years — only in prose, not inside code blocks (confidence 0.6)
|
|
209
|
-
const yearMatches = collectMatches(textNoCode,
|
|
200
|
+
const yearMatches = collectMatches(textNoCode, staleYearPattern());
|
|
210
201
|
if (yearMatches.length > 0) {
|
|
211
202
|
evidence.push(`Year reference(s) that may be outdated: ${[...new Set(yearMatches)].join(', ')}`);
|
|
212
203
|
confidence = Math.max(confidence, 0.6);
|
|
@@ -260,6 +251,13 @@ export function detectStaleInstructions(files) {
|
|
|
260
251
|
evidence: [`Section: "${snippet(text, 100)}"`, ...evidence],
|
|
261
252
|
recommendation: 'Review this section for accuracy. Update any outdated version numbers, tool references, ' +
|
|
262
253
|
'or remove temporary notes that are no longer relevant.',
|
|
254
|
+
// BUG-14: advisory only. This finding is deliberately NOT auto-fixable —
|
|
255
|
+
// a year in an instruction file may be a copyright line, a release date,
|
|
256
|
+
// a version pin, or a prose reference, and rewriting it to the current
|
|
257
|
+
// year corrupts every one of those.
|
|
258
|
+
fixRecipe: 'Edit each flagged reference by hand: replace outdated version pins and tool names with ' +
|
|
259
|
+
'current ones, and delete temporary notes that no longer apply. Leave copyright lines, ' +
|
|
260
|
+
'release dates, and historical references as they are.',
|
|
263
261
|
confidence,
|
|
264
262
|
});
|
|
265
263
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale-instructions.js","sourceRoot":"","sources":["../src/stale-instructions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stale-instructions.js","sourceRoot":"","sources":["../src/stale-instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagents Detector (issue #23)
|
|
3
|
+
*
|
|
4
|
+
* Audits subagent definitions (`.claude/agents/*.md`) against known Claude Code
|
|
5
|
+
* conventions and against each other:
|
|
6
|
+
*
|
|
7
|
+
* - Frontmatter validity: present, closed, required `name`/`description`.
|
|
8
|
+
* - Unknown `model`: not a recognized Claude alias or `claude-*` id.
|
|
9
|
+
* - Unknown `tools`: names that are not built-in tools or `mcp__*` tools
|
|
10
|
+
* (a likely typo). Reported at low confidence — the tool set evolves.
|
|
11
|
+
* - Duplicated system prompts: two agents whose bodies are near-identical,
|
|
12
|
+
* which usually means a copy-paste that should be one agent.
|
|
13
|
+
*
|
|
14
|
+
* Deterministic and offline; findings are cautiously worded.
|
|
15
|
+
*/
|
|
16
|
+
import type { RepoContext } from './repo-context.js';
|
|
17
|
+
import type { PromptCiIssue } from './types.js';
|
|
18
|
+
export declare function detectSubagents(context: RepoContext): PromptCiIssue[];
|
|
19
|
+
//# sourceMappingURL=subagents-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagents-detector.d.ts","sourceRoot":"","sources":["../src/subagents-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8DhD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA0GrE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagents Detector (issue #23)
|
|
3
|
+
*
|
|
4
|
+
* Audits subagent definitions (`.claude/agents/*.md`) against known Claude Code
|
|
5
|
+
* conventions and against each other:
|
|
6
|
+
*
|
|
7
|
+
* - Frontmatter validity: present, closed, required `name`/`description`.
|
|
8
|
+
* - Unknown `model`: not a recognized Claude alias or `claude-*` id.
|
|
9
|
+
* - Unknown `tools`: names that are not built-in tools or `mcp__*` tools
|
|
10
|
+
* (a likely typo). Reported at low confidence — the tool set evolves.
|
|
11
|
+
* - Duplicated system prompts: two agents whose bodies are near-identical,
|
|
12
|
+
* which usually means a copy-paste that should be one agent.
|
|
13
|
+
*
|
|
14
|
+
* Deterministic and offline; findings are cautiously worded.
|
|
15
|
+
*/
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import { parseFrontmatter, readTextWithinRoot, shortHash, asStringList, toPosix, withScannerPaths, aiConfigIssue as base, frontmatterStructureIssues, } from './ai-config.js';
|
|
18
|
+
const SURFACE = {
|
|
19
|
+
idPrefix: 'agent',
|
|
20
|
+
noun: 'Subagent',
|
|
21
|
+
why: 'A subagent needs `name` and `description` frontmatter to be registered.',
|
|
22
|
+
recommendation: 'Add frontmatter with `name` and `description` at the top of the agent file.',
|
|
23
|
+
};
|
|
24
|
+
/** Recognized model aliases accepted in agent frontmatter. Full `claude-*` ids also pass. */
|
|
25
|
+
const KNOWN_MODEL_ALIASES = new Set(['sonnet', 'opus', 'haiku', 'inherit', 'default', 'opusplan']);
|
|
26
|
+
/** Built-in Claude Code tool names an agent may grant. `mcp__*` tools also pass. */
|
|
27
|
+
const KNOWN_TOOLS = new Set([
|
|
28
|
+
'Task', 'Bash', 'BashOutput', 'KillBash', 'KillShell', 'Glob', 'Grep', 'LS',
|
|
29
|
+
'Read', 'Edit', 'MultiEdit', 'Write', 'NotebookRead', 'NotebookEdit',
|
|
30
|
+
'WebFetch', 'WebSearch', 'TodoWrite', 'SlashCommand', 'ExitPlanMode', 'Agent',
|
|
31
|
+
]);
|
|
32
|
+
/** Jaccard similarity at or above this over normalized body lines flags a near-duplicate. */
|
|
33
|
+
const DUP_SIMILARITY = 0.8;
|
|
34
|
+
/** Ignore trivially-short agent bodies when comparing for duplication. */
|
|
35
|
+
const MIN_BODY_LINES = 5;
|
|
36
|
+
function id(kind, key) {
|
|
37
|
+
return `ai-config-agent-${kind}-${shortHash(key)}`;
|
|
38
|
+
}
|
|
39
|
+
function normalizeBodyLines(body) {
|
|
40
|
+
const set = new Set();
|
|
41
|
+
for (const raw of body.split(/\r?\n/)) {
|
|
42
|
+
const norm = raw.trim().toLowerCase().replace(/\s+/g, ' ');
|
|
43
|
+
if (norm.length >= 8)
|
|
44
|
+
set.add(norm);
|
|
45
|
+
}
|
|
46
|
+
return set;
|
|
47
|
+
}
|
|
48
|
+
function jaccard(a, b) {
|
|
49
|
+
if (a.size === 0 || b.size === 0)
|
|
50
|
+
return 0;
|
|
51
|
+
let intersection = 0;
|
|
52
|
+
const [small, large] = a.size <= b.size ? [a, b] : [b, a];
|
|
53
|
+
for (const item of small)
|
|
54
|
+
if (large.has(item))
|
|
55
|
+
intersection++;
|
|
56
|
+
const union = a.size + b.size - intersection;
|
|
57
|
+
return union === 0 ? 0 : intersection / union;
|
|
58
|
+
}
|
|
59
|
+
export function detectSubagents(context) {
|
|
60
|
+
const issues = [];
|
|
61
|
+
const parsed = [];
|
|
62
|
+
for (const filePath of context.aiConfig.agents) {
|
|
63
|
+
const content = readTextWithinRoot(context.repoRoot, filePath);
|
|
64
|
+
if (content === undefined)
|
|
65
|
+
continue;
|
|
66
|
+
const fm = parseFrontmatter(content);
|
|
67
|
+
issues.push(...frontmatterStructureIssues(filePath, content, fm, SURFACE));
|
|
68
|
+
if (!fm.present)
|
|
69
|
+
continue;
|
|
70
|
+
const name = typeof fm.data.name === 'string' ? fm.data.name.trim() : undefined;
|
|
71
|
+
const description = typeof fm.data.description === 'string' ? fm.data.description.trim() : undefined;
|
|
72
|
+
if (!name) {
|
|
73
|
+
issues.push(base({
|
|
74
|
+
id: id('missing-name', filePath),
|
|
75
|
+
title: 'Subagent frontmatter is missing `name`',
|
|
76
|
+
summary: `${filePath} has no \`name\` field, so it cannot be invoked by name.`,
|
|
77
|
+
filePaths: [filePath],
|
|
78
|
+
locations: [{ filePath, startLine: 1, endLine: fm.fenceEndLine > 0 ? fm.fenceEndLine : 1 }],
|
|
79
|
+
evidence: [`Keys present: ${Object.keys(fm.data).join(', ') || '(none)'}`],
|
|
80
|
+
recommendation: 'Add a `name` field to the frontmatter.',
|
|
81
|
+
confidence: 0.85,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
if (!description) {
|
|
85
|
+
issues.push(base({
|
|
86
|
+
id: id('missing-description', filePath),
|
|
87
|
+
title: 'Subagent frontmatter is missing `description`',
|
|
88
|
+
summary: `${filePath} has no \`description\`. The description tells the orchestrator when to delegate to this agent.`,
|
|
89
|
+
filePaths: [filePath],
|
|
90
|
+
locations: [{ filePath, startLine: 1, endLine: fm.fenceEndLine > 0 ? fm.fenceEndLine : 1 }],
|
|
91
|
+
evidence: [`Keys present: ${Object.keys(fm.data).join(', ') || '(none)'}`],
|
|
92
|
+
recommendation: 'Add a `description` explaining what the agent is for and when to use it.',
|
|
93
|
+
confidence: 0.85,
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
// Unknown model alias.
|
|
97
|
+
const model = typeof fm.data.model === 'string' ? fm.data.model.trim() : undefined;
|
|
98
|
+
if (model && !KNOWN_MODEL_ALIASES.has(model.toLowerCase()) && !/^claude-/i.test(model)) {
|
|
99
|
+
issues.push(base({
|
|
100
|
+
id: id('unknown-model', `${filePath}|${model}`),
|
|
101
|
+
title: 'Subagent references an unrecognized model',
|
|
102
|
+
summary: `${filePath}: \`model: ${model}\` is not a known alias (sonnet, opus, haiku, inherit) or a \`claude-*\` id.`,
|
|
103
|
+
filePaths: [filePath],
|
|
104
|
+
locations: [{ filePath, startLine: fm.keyLines.model ?? 1, endLine: fm.keyLines.model ?? 1 }],
|
|
105
|
+
evidence: [`model: ${model}`],
|
|
106
|
+
recommendation: 'Use a supported model alias or a full model id, or remove `model` to inherit the session model.',
|
|
107
|
+
confidence: 0.5,
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
// Unknown tools (likely typos).
|
|
111
|
+
const tools = asStringList(fm.data.tools);
|
|
112
|
+
const unknownTools = tools.filter((t) => t !== '*' && !t.startsWith('mcp__') && !KNOWN_TOOLS.has(t));
|
|
113
|
+
if (unknownTools.length > 0) {
|
|
114
|
+
issues.push(base({
|
|
115
|
+
id: id('unknown-tools', `${filePath}|${unknownTools.join(',')}`),
|
|
116
|
+
severity: 'info',
|
|
117
|
+
title: 'Subagent grants tools that may not exist',
|
|
118
|
+
summary: `${filePath} lists ${unknownTools.length} tool name(s) that are not built-in tools or \`mcp__*\` tools: ${unknownTools.join(', ')}.`,
|
|
119
|
+
filePaths: [filePath],
|
|
120
|
+
locations: [{ filePath, startLine: fm.keyLines.tools ?? 1, endLine: fm.keyLines.tools ?? 1 }],
|
|
121
|
+
evidence: [`Unrecognized: ${unknownTools.join(', ')}`, `Declared tools: ${tools.join(', ')}`],
|
|
122
|
+
recommendation: 'Check the tool names against the built-in tool set (or your MCP server tool names) for typos.',
|
|
123
|
+
confidence: 0.4,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
const body = content.split(/\r?\n/).slice(Math.max(0, fm.bodyStartLine - 1)).join('\n');
|
|
127
|
+
const bodyLines = normalizeBodyLines(body);
|
|
128
|
+
parsed.push({ filePath, bodyLines });
|
|
129
|
+
}
|
|
130
|
+
// Duplicated system-prompt content across agents.
|
|
131
|
+
const comparable = parsed.filter((a) => a.bodyLines.size >= MIN_BODY_LINES);
|
|
132
|
+
for (let i = 0; i < comparable.length; i++) {
|
|
133
|
+
for (let j = i + 1; j < comparable.length; j++) {
|
|
134
|
+
const a = comparable[i];
|
|
135
|
+
const b = comparable[j];
|
|
136
|
+
const sim = jaccard(a.bodyLines, b.bodyLines);
|
|
137
|
+
if (sim >= DUP_SIMILARITY) {
|
|
138
|
+
const pair = [a.filePath, b.filePath].sort();
|
|
139
|
+
issues.push(base({
|
|
140
|
+
id: id('dup-prompt', pair.join('|')),
|
|
141
|
+
title: 'Two subagents share near-identical system prompts',
|
|
142
|
+
summary: `${toPosix(path.basename(pair[0]))} and ${toPosix(path.basename(pair[1]))} have ${Math.round(sim * 100)}% identical prompt bodies, which usually means a copy-paste that should be consolidated.`,
|
|
143
|
+
filePaths: pair,
|
|
144
|
+
locations: pair.map((p) => ({ filePath: p, startLine: 1, endLine: 1 })),
|
|
145
|
+
evidence: [`Body similarity: ${Math.round(sim * 100)}%`, `Agents: ${pair.join(', ')}`],
|
|
146
|
+
recommendation: 'Differentiate the agents\' instructions, or merge them into one agent if they do the same job.',
|
|
147
|
+
confidence: sim === 1 ? 0.8 : 0.55,
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Scanner-form paths so inline suppressions can match (see withScannerPaths).
|
|
153
|
+
return withScannerPaths(context.repoRoot, issues);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=subagents-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagents-detector.js","sourceRoot":"","sources":["../src/subagents-detector.ts"],"names":[],"mappings":"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"}
|
package/dist/suppression.d.ts
CHANGED
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
import type { IssueCategory, InstructionFile, PromptCiIssue } from './types.js';
|
|
23
23
|
export type SuppressionAnnotation = {
|
|
24
24
|
filePath: string;
|
|
25
|
+
/** Repo-relative `filePath` (forward slashes), when the file came from the scanner. */
|
|
26
|
+
relativePath?: string;
|
|
25
27
|
category: IssueCategory | 'all';
|
|
26
28
|
reason: string;
|
|
27
29
|
startLine: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suppression.d.ts","sourceRoot":"","sources":["../src/suppression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAsB,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"suppression.d.ts","sourceRoot":"","sources":["../src/suppression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAsB,aAAa,EAAE,MAAM,YAAY,CAAC;AA6BpG,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,aAAa,GAAG,KAAK,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAoOF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,qBAAqB,EAAE,CAEnF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,qBAAqB,EAAE,GACnC,aAAa,EAAE,CAiBjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EAAE,EACvB,WAAW,EAAE,qBAAqB,EAAE,GACnC;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,CA4C1D"}
|
package/dist/suppression.js
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
* - An unpaired `promptci-ignore-start` (no matching end) → warning issue.
|
|
21
21
|
*/
|
|
22
22
|
import * as crypto from 'node:crypto';
|
|
23
|
+
import { blankCodeBlockLines } from './markdown-fences.js';
|
|
23
24
|
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
24
25
|
/** All valid IssueCategory values plus the catch-all 'all' token. */
|
|
25
26
|
const VALID_ISSUE_CATEGORIES = [
|
|
@@ -32,7 +33,9 @@ const VALID_ISSUE_CATEGORIES = [
|
|
|
32
33
|
'structure',
|
|
33
34
|
'command_validity',
|
|
34
35
|
'agent_practices',
|
|
36
|
+
'ai_config',
|
|
35
37
|
'security',
|
|
38
|
+
'custom',
|
|
36
39
|
];
|
|
37
40
|
const VALID_SUPPRESSION_CATEGORIES = new Set([
|
|
38
41
|
...VALID_ISSUE_CATEGORIES,
|
|
@@ -90,7 +93,13 @@ function getSectionEndLine(annotationLine, annotationEndLine, sections, fileLine
|
|
|
90
93
|
}
|
|
91
94
|
/** Extract the `reason:` value from the comment body, or null if absent. */
|
|
92
95
|
function extractReason(body) {
|
|
93
|
-
|
|
96
|
+
// The terminator must accept a CRLF (`\r\n`) line ending, not just `\n`.
|
|
97
|
+
// `.` never matches a line terminator (including `\r`), so on a CRLF
|
|
98
|
+
// checkout `/reason:\s*(.+?)(?:\n|$)/` finds no `\n` immediately after the
|
|
99
|
+
// captured reason (a `\r` sits between) and returns null — invalidating
|
|
100
|
+
// every otherwise-correct annotation. `\r?\n` closes on both endings; the
|
|
101
|
+
// trailing `.trim()` also strips any stray `\r` from the capture.
|
|
102
|
+
const m = /reason:\s*(.+?)(?:\r?\n|$)/i.exec(body);
|
|
94
103
|
return m ? m[1].trim() : null;
|
|
95
104
|
}
|
|
96
105
|
function validate(rawCategory, reason) {
|
|
@@ -115,49 +124,6 @@ function annotationIssueId(filePath, startLine, tag) {
|
|
|
115
124
|
const hash = crypto.createHash('sha1').update(key).digest('hex').slice(0, 12);
|
|
116
125
|
return `suppression-invalid-${hash}`;
|
|
117
126
|
}
|
|
118
|
-
/**
|
|
119
|
-
* SU3: blank out fenced code block lines (``` or ~~~, matching fence
|
|
120
|
-
* char/length per CommonMark — the same tracking used in scanner.ts,
|
|
121
|
-
* vague-guidance.ts, stale-instructions.ts, conflicts.ts, and
|
|
122
|
-
* command-validity.ts) so a documented EXAMPLE of the annotation syntax
|
|
123
|
-
* doesn't get parsed as a real suppression. The old approach only stripped
|
|
124
|
-
* ` ``` ` fences via a single regex — a ~~~ fence containing an annotation
|
|
125
|
-
* example was scanned as prose and treated as a REAL suppression.
|
|
126
|
-
*
|
|
127
|
-
* Replaces each fenced line with an empty string (not removing it) so the
|
|
128
|
-
* total line count is unchanged — `charToLine` offsets computed against this
|
|
129
|
-
* output still map to the correct line numbers in the ORIGINAL file.
|
|
130
|
-
*/
|
|
131
|
-
function stripFencedBlocksPreservingLines(content) {
|
|
132
|
-
const lines = content.split('\n');
|
|
133
|
-
const kept = [];
|
|
134
|
-
let inBlock = false;
|
|
135
|
-
let fenceChar = null;
|
|
136
|
-
let fenceLen = 0;
|
|
137
|
-
for (const line of lines) {
|
|
138
|
-
if (!inBlock) {
|
|
139
|
-
const openMatch = /^ {0,3}([`~]{3,})/.exec(line);
|
|
140
|
-
if (openMatch) {
|
|
141
|
-
inBlock = true;
|
|
142
|
-
fenceChar = openMatch[1][0] ?? null;
|
|
143
|
-
fenceLen = openMatch[1].length;
|
|
144
|
-
kept.push('');
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
kept.push(line);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
const closeMatch = /^ {0,3}([`~]{3,})\s*$/.exec(line);
|
|
151
|
-
if (closeMatch && closeMatch[1][0] === fenceChar && closeMatch[1].length >= fenceLen) {
|
|
152
|
-
inBlock = false;
|
|
153
|
-
fenceChar = null;
|
|
154
|
-
fenceLen = 0;
|
|
155
|
-
}
|
|
156
|
-
kept.push('');
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return kept.join('\n');
|
|
160
|
-
}
|
|
161
127
|
// ── Main parser ───────────────────────────────────────────────────────────────
|
|
162
128
|
function parseFileSuppressions(file) {
|
|
163
129
|
const { content, path: filePath, sections, lineCount } = file;
|
|
@@ -165,7 +131,7 @@ function parseFileSuppressions(file) {
|
|
|
165
131
|
// Strip fenced code blocks before parsing so examples of the annotation
|
|
166
132
|
// syntax (e.g. in README.md) don't get interpreted as real suppressions.
|
|
167
133
|
// Preserve line count so offsets still map to the original file's lines.
|
|
168
|
-
const contentForParsing =
|
|
134
|
+
const contentForParsing = blankCodeBlockLines(content);
|
|
169
135
|
// ── Single annotations ────────────────────────────────────────────────────
|
|
170
136
|
const singleRe = new RegExp(SINGLE_RE.source, SINGLE_RE.flags);
|
|
171
137
|
let m;
|
|
@@ -243,7 +209,10 @@ function parseFileSuppressions(file) {
|
|
|
243
209
|
}
|
|
244
210
|
if (openStart)
|
|
245
211
|
pushUnpairedStart(openStart);
|
|
246
|
-
|
|
212
|
+
// Carried only for the invalid-annotation finding id (pcic-whm): matching
|
|
213
|
+
// against issues still uses the absolute `filePath`.
|
|
214
|
+
const { relativePath } = file;
|
|
215
|
+
return relativePath === undefined ? annotations : annotations.map((a) => ({ ...a, relativePath }));
|
|
247
216
|
}
|
|
248
217
|
// ── Public API ────────────────────────────────────────────────────────────────
|
|
249
218
|
/**
|
|
@@ -263,7 +232,7 @@ export function buildValidationIssues(annotations) {
|
|
|
263
232
|
return annotations
|
|
264
233
|
.filter((ann) => !ann.valid)
|
|
265
234
|
.map((ann) => ({
|
|
266
|
-
id: annotationIssueId(ann.filePath, ann.startLine, ann.validationMessage ?? ''),
|
|
235
|
+
id: annotationIssueId(ann.relativePath ?? ann.filePath, ann.startLine, ann.validationMessage ?? ''),
|
|
267
236
|
severity: 'warning',
|
|
268
237
|
category: 'structure',
|
|
269
238
|
title: 'Invalid promptci-ignore annotation',
|
package/dist/suppression.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suppression.js","sourceRoot":"","sources":["../src/suppression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"suppression.js","sourceRoot":"","sources":["../src/suppression.ts"],"names":[],"mappings":"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"}
|