@promptci/core 0.2.2 → 0.3.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/dist/ai-config.d.ts +13 -6
- package/dist/ai-config.d.ts.map +1 -1
- package/dist/ai-config.js +25 -78
- package/dist/ai-config.js.map +1 -1
- package/dist/close-match.d.ts +97 -0
- package/dist/close-match.d.ts.map +1 -0
- package/dist/close-match.js +215 -0
- package/dist/close-match.js.map +1 -0
- package/dist/command-validity.d.ts.map +1 -1
- package/dist/command-validity.js +126 -20
- package/dist/command-validity.js.map +1 -1
- package/dist/context-optimizer.d.ts.map +1 -1
- package/dist/context-optimizer.js +9 -2
- package/dist/context-optimizer.js.map +1 -1
- package/dist/dead-references.d.ts +8 -1
- package/dist/dead-references.d.ts.map +1 -1
- package/dist/dead-references.js +149 -15
- package/dist/dead-references.js.map +1 -1
- package/dist/dependency-staleness.d.ts.map +1 -1
- package/dist/dependency-staleness.js +24 -38
- package/dist/dependency-staleness.js.map +1 -1
- package/dist/detectors.js +1 -1
- package/dist/detectors.js.map +1 -1
- package/dist/discovery.d.ts +138 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +569 -0
- package/dist/discovery.js.map +1 -0
- package/dist/fix-engine.d.ts.map +1 -1
- package/dist/fix-engine.js +75 -1
- package/dist/fix-engine.js.map +1 -1
- package/dist/frameworks/dotnet.d.ts.map +1 -1
- package/dist/frameworks/dotnet.js +10 -11
- package/dist/frameworks/dotnet.js.map +1 -1
- package/dist/frameworks/go.d.ts.map +1 -1
- package/dist/frameworks/go.js +8 -4
- package/dist/frameworks/go.js.map +1 -1
- package/dist/frameworks/nextjs.d.ts.map +1 -1
- package/dist/frameworks/nextjs.js +8 -17
- package/dist/frameworks/nextjs.js.map +1 -1
- package/dist/frameworks/python.d.ts.map +1 -1
- package/dist/frameworks/python.js +5 -3
- package/dist/frameworks/python.js.map +1 -1
- package/dist/frameworks/rust.d.ts.map +1 -1
- package/dist/frameworks/rust.js +3 -3
- package/dist/frameworks/rust.js.map +1 -1
- package/dist/frameworks/unity.d.ts.map +1 -1
- package/dist/frameworks/unity.js +6 -5
- package/dist/frameworks/unity.js.map +1 -1
- package/dist/gitignore.d.ts +31 -2
- package/dist/gitignore.d.ts.map +1 -1
- package/dist/gitignore.js +33 -8
- package/dist/gitignore.js.map +1 -1
- package/dist/hooks-settings-detector.d.ts.map +1 -1
- package/dist/hooks-settings-detector.js +5 -1
- package/dist/hooks-settings-detector.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/known-paths.d.ts +82 -0
- package/dist/known-paths.d.ts.map +1 -0
- package/dist/known-paths.js +152 -0
- package/dist/known-paths.js.map +1 -0
- package/dist/makefile.d.ts.map +1 -1
- package/dist/makefile.js +17 -13
- package/dist/makefile.js.map +1 -1
- package/dist/manifest-consistency.d.ts +1 -1
- package/dist/manifest-consistency.d.ts.map +1 -1
- package/dist/manifest-consistency.js +12 -8
- package/dist/manifest-consistency.js.map +1 -1
- package/dist/mcp-config-detector.d.ts.map +1 -1
- package/dist/mcp-config-detector.js +5 -1
- package/dist/mcp-config-detector.js.map +1 -1
- package/dist/project-type.d.ts +2 -1
- package/dist/project-type.d.ts.map +1 -1
- package/dist/project-type.js +36 -48
- package/dist/project-type.js.map +1 -1
- package/dist/prompt-cache.d.ts.map +1 -1
- package/dist/prompt-cache.js +13 -2
- package/dist/prompt-cache.js.map +1 -1
- package/dist/repo-context.d.ts +9 -0
- package/dist/repo-context.d.ts.map +1 -1
- package/dist/repo-context.js +32 -35
- package/dist/repo-context.js.map +1 -1
- package/dist/repo-tree.d.ts +163 -9
- package/dist/repo-tree.d.ts.map +1 -1
- package/dist/repo-tree.js +226 -34
- package/dist/repo-tree.js.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +3 -0
- package/dist/report.js.map +1 -1
- package/dist/sarif.d.ts +27 -0
- package/dist/sarif.d.ts.map +1 -0
- package/dist/sarif.js +357 -0
- package/dist/sarif.js.map +1 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +8 -2
- package/dist/scan.js.map +1 -1
- package/dist/scanner.d.ts +4 -3
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +36 -77
- package/dist/scanner.js.map +1 -1
- package/dist/security-pack.d.ts.map +1 -1
- package/dist/security-pack.js +34 -35
- package/dist/security-pack.js.map +1 -1
- package/dist/skill-supply-chain.d.ts.map +1 -1
- package/dist/skill-supply-chain.js +29 -19
- package/dist/skill-supply-chain.js.map +1 -1
- package/dist/skills-detector.d.ts.map +1 -1
- package/dist/skills-detector.js +11 -3
- package/dist/skills-detector.js.map +1 -1
- package/dist/token-estimates.d.ts +42 -0
- package/dist/token-estimates.d.ts.map +1 -0
- package/dist/token-estimates.js +200 -0
- package/dist/token-estimates.js.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -2
package/dist/fix-engine.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as path from 'node:path';
|
|
2
2
|
import * as fs from 'node:fs/promises';
|
|
3
3
|
import { renderPromptCiGitignore } from './promptci-gitignore.js';
|
|
4
|
-
import { isWithinRoot } from './path-containment.js';
|
|
4
|
+
import { isWithinRoot, realPathWithinRoot } from './path-containment.js';
|
|
5
5
|
import { gitignoreLineMatchesTarget } from './security-pack.js';
|
|
6
6
|
/**
|
|
7
7
|
* True when an active (non-comment) line of the given .gitignore content
|
|
@@ -30,12 +30,86 @@ export function resolveSafePath(repoRoot, relativeOrAbsolutePath) {
|
|
|
30
30
|
}
|
|
31
31
|
return resolvedPath;
|
|
32
32
|
}
|
|
33
|
+
/** Occurrences of `needle` (a plain string, never a pattern) in `haystack`. */
|
|
34
|
+
function countOccurrences(haystack, needle) {
|
|
35
|
+
let count = 0;
|
|
36
|
+
for (let at = haystack.indexOf(needle); at !== -1; at = haystack.indexOf(needle, at + needle.length)) {
|
|
37
|
+
count++;
|
|
38
|
+
}
|
|
39
|
+
return count;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* pcic-oonz: applies the line-anchored substitutions a detector computed (see
|
|
43
|
+
* {@link FixEdit}).
|
|
44
|
+
*
|
|
45
|
+
* All-or-nothing on purpose. Every edit must land on an existing line whose
|
|
46
|
+
* text contains its `find` exactly once; the first one that does not abandons
|
|
47
|
+
* the whole issue and returns no changes. A finding whose recipe is stale
|
|
48
|
+
* (someone edited the file between the scan and the fix) is then re-detected
|
|
49
|
+
* on the next scan against the current text, rather than half-rewritten here.
|
|
50
|
+
*
|
|
51
|
+
* Lines are split with their terminators attached and rejoined verbatim, so a
|
|
52
|
+
* one-token substitution leaves every other byte of the file — including mixed
|
|
53
|
+
* or CRLF line endings and a missing trailing newline — exactly as it was.
|
|
54
|
+
*/
|
|
55
|
+
async function applyLineEdits(edits, repoRoot) {
|
|
56
|
+
const byFile = new Map();
|
|
57
|
+
for (const edit of edits) {
|
|
58
|
+
const filePath = resolveSafePath(repoRoot, edit.filePath);
|
|
59
|
+
const list = byFile.get(filePath) ?? [];
|
|
60
|
+
list.push(edit);
|
|
61
|
+
byFile.set(filePath, list);
|
|
62
|
+
}
|
|
63
|
+
const changes = [];
|
|
64
|
+
for (const [filePath, fileEdits] of byFile) {
|
|
65
|
+
// The lexical check in resolveSafePath cannot see a symlink: an in-root
|
|
66
|
+
// `AGENTS.md` committed as a link to a file outside the root would be
|
|
67
|
+
// written THROUGH. Refuse that, the same policy reads already follow.
|
|
68
|
+
if (!realPathWithinRoot(path.resolve(repoRoot), filePath))
|
|
69
|
+
return [];
|
|
70
|
+
let content;
|
|
71
|
+
try {
|
|
72
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return []; // a file the recipe needs is gone: apply nothing
|
|
76
|
+
}
|
|
77
|
+
// Terminators stay attached to their line, so join('') restores the file.
|
|
78
|
+
const lines = content.split(/(?<=\n)/);
|
|
79
|
+
for (const { line, find, replace } of fileEdits) {
|
|
80
|
+
const idx = line - 1;
|
|
81
|
+
const text = lines[idx];
|
|
82
|
+
if (text === undefined || !find || find.includes('\n'))
|
|
83
|
+
return [];
|
|
84
|
+
if (countOccurrences(text, find) !== 1)
|
|
85
|
+
return [];
|
|
86
|
+
// Spliced by index, not via String.replace: a `$&`, `$1` or `$$` in the
|
|
87
|
+
// replacement is replacement-pattern syntax there, and a path or script
|
|
88
|
+
// name containing `$` would be silently corrupted.
|
|
89
|
+
const at = text.indexOf(find);
|
|
90
|
+
lines[idx] = text.slice(0, at) + replace + text.slice(at + find.length);
|
|
91
|
+
}
|
|
92
|
+
const newContent = lines.join('');
|
|
93
|
+
if (newContent === content)
|
|
94
|
+
continue;
|
|
95
|
+
changes.push({ filePath, originalContent: content, newContent });
|
|
96
|
+
}
|
|
97
|
+
return changes;
|
|
98
|
+
}
|
|
33
99
|
/**
|
|
34
100
|
* Computes the proposed file changes to fix a given PromptCiIssue.
|
|
35
101
|
* Returns an array of FileChanges that would be applied.
|
|
36
102
|
*/
|
|
37
103
|
export async function applyFixRecipe(issue, repoRoot) {
|
|
38
104
|
const changes = [];
|
|
105
|
+
// 0. Detector-computed substitutions (pcic-oonz): a mistyped package-manager
|
|
106
|
+
// script name with exactly one close match in the manifest, and a broken
|
|
107
|
+
// relative link whose basename exists exactly once in the tree. The detector
|
|
108
|
+
// knew the parsed command / link target and the candidate set, so it carries
|
|
109
|
+
// the edit rather than making the fix engine re-derive any of it.
|
|
110
|
+
if (issue.fixEdits && issue.fixEdits.length > 0) {
|
|
111
|
+
return applyLineEdits(issue.fixEdits, repoRoot);
|
|
112
|
+
}
|
|
39
113
|
// 1. Missing .promptci/ in .gitignore
|
|
40
114
|
if (issue.id === 'security-pack-no-promptci-gitignore') {
|
|
41
115
|
const gitignorePath = resolveSafePath(repoRoot, '.gitignore');
|
package/dist/fix-engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix-engine.js","sourceRoot":"","sources":["../src/fix-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"fix-engine.js","sourceRoot":"","sources":["../src/fix-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dotnet.d.ts","sourceRoot":"","sources":["../../src/frameworks/dotnet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"dotnet.d.ts","sourceRoot":"","sources":["../../src/frameworks/dotnet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAgFlE"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
1
|
import { readTextWithinRoot } from '../ai-config.js';
|
|
2
|
+
import { treeFor } from '../repo-tree.js';
|
|
3
3
|
export function detectDotnet(context) {
|
|
4
4
|
const issues = [];
|
|
5
5
|
const { repoRoot, files } = context;
|
|
6
|
+
// pcic-e6xa: the root listing comes from the scan's tree — see the note in
|
|
7
|
+
// frameworks/go.ts.
|
|
8
|
+
const tree = treeFor(context);
|
|
9
|
+
const rootEntries = tree.entries(tree.root);
|
|
10
|
+
const rootFiles = typeof rootEntries === 'string'
|
|
11
|
+
? []
|
|
12
|
+
: [...rootEntries.values()].filter((e) => !e.isDirectory()).map((e) => e.name).sort();
|
|
6
13
|
// Detect if dotnet project
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
try {
|
|
10
|
-
hasDotnet = fs.readdirSync(repoRoot).some(f => f.endsWith('.sln') || f.endsWith('.csproj'));
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
// ignore
|
|
14
|
-
}
|
|
15
|
-
}
|
|
14
|
+
const hasDotnet = context.projectType === 'dotnet' ||
|
|
15
|
+
rootFiles.some((f) => f.endsWith('.sln') || f.endsWith('.csproj'));
|
|
16
16
|
const combinedContent = files.map(f => f.content).join('\n');
|
|
17
17
|
const hasDotnetMentions = /\bdotnet\b|\.sln\b|\.csproj\b|\bxunit\b|\bnunit\b|\bmstest\b/i.test(combinedContent);
|
|
18
18
|
if (!hasDotnet && !hasDotnetMentions) {
|
|
@@ -40,7 +40,6 @@ export function detectDotnet(context) {
|
|
|
40
40
|
// Let's find any csproj at the root to check target framework
|
|
41
41
|
let targetFramework;
|
|
42
42
|
try {
|
|
43
|
-
const rootFiles = fs.readdirSync(repoRoot);
|
|
44
43
|
const csprojFile = rootFiles.find(f => f.endsWith('.csproj'));
|
|
45
44
|
if (csprojFile) {
|
|
46
45
|
const csprojContent = readTextWithinRoot(repoRoot, csprojFile) ?? '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dotnet.js","sourceRoot":"","sources":["../../src/frameworks/dotnet.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"dotnet.js","sourceRoot":"","sources":["../../src/frameworks/dotnet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/frameworks/go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/frameworks/go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAyC9D"}
|
package/dist/frameworks/go.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import { treeFor } from '../repo-tree.js';
|
|
2
|
+
// pcic-e6xa: the framework probes read fixed root names, so they go through
|
|
3
|
+
// the scan's tree: a marker file committed as a link out of the repository can
|
|
4
|
+
// no longer decide which framework pack runs, names match with exact case on
|
|
5
|
+
// every platform, and a caller's file inventory answers when the repository is
|
|
6
|
+
// not on disk (pcic-csf).
|
|
3
7
|
export function detectGo(context) {
|
|
4
8
|
const issues = [];
|
|
5
|
-
const {
|
|
6
|
-
const hasGoMod =
|
|
9
|
+
const { files } = context;
|
|
10
|
+
const hasGoMod = treeFor(context).isFile('go.mod');
|
|
7
11
|
const combinedContent = files.map(f => f.content).join('\n');
|
|
8
12
|
// FW1: "go" is an ordinary English verb ("let's go build something"), so a
|
|
9
13
|
// bare `\bgo\s+(build|test|run|get|mod)\b` match enabled the whole Go pack
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/frameworks/go.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/frameworks/go.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,0BAA0B;AAC1B,MAAM,UAAU,QAAQ,CAAC,OAAoB;IAC3C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,iEAAiE;IACjE,MAAM,aAAa,GACjB,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;QACpC,sDAAsD,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE/E,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE5C,wDAAwD;IACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,6BAA6B;YACjC,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,6BAA6B;YACpC,OAAO,EAAE,gGAAgG;YACzG,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,8DAA8D,CAAC;YAC1E,cAAc,EAAE,8EAA8E;YAC9F,SAAS,EAAE,6EAA6E;YACxF,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/frameworks/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/frameworks/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAoElE"}
|
|
@@ -1,26 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as fs from 'node:fs';
|
|
1
|
+
import { treeFor } from '../repo-tree.js';
|
|
3
2
|
export function detectNextJs(context) {
|
|
4
3
|
const issues = [];
|
|
5
|
-
const { packageJson,
|
|
4
|
+
const { packageJson, files } = context;
|
|
6
5
|
const hasNextDep = !!(packageJson.dependencies['next'] || packageJson.devDependencies['next']);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'next.config.js')) ||
|
|
11
|
-
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'next.config.mjs')) ||
|
|
12
|
-
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'next.config.ts'));
|
|
6
|
+
// pcic-e6xa: see the note in frameworks/go.ts.
|
|
7
|
+
const tree = treeFor(context);
|
|
8
|
+
const hasNextConfig = ['', 'apps/web/'].some((prefix) => ['js', 'mjs', 'ts'].some((ext) => tree.isFile(`${prefix}next.config.${ext}`)));
|
|
13
9
|
if (!hasNextDep && !hasNextConfig) {
|
|
14
10
|
return [];
|
|
15
11
|
}
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'src', 'app'));
|
|
20
|
-
const hasPagesDir = fs.existsSync(path.join(repoRoot, 'pages')) ||
|
|
21
|
-
fs.existsSync(path.join(repoRoot, 'src', 'pages')) ||
|
|
22
|
-
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'pages')) ||
|
|
23
|
-
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'src', 'pages'));
|
|
12
|
+
const routerDir = (name) => ['', 'src/', 'apps/web/', 'apps/web/src/'].some((prefix) => tree.isDir(`${prefix}${name}`));
|
|
13
|
+
const hasAppDir = routerDir('app');
|
|
14
|
+
const hasPagesDir = routerDir('pages');
|
|
24
15
|
// Check for missing App Router guidance
|
|
25
16
|
if (hasAppDir) {
|
|
26
17
|
const hasAppRouterGuidance = files.some(file => file.content.toLowerCase().includes('app router') ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/frameworks/nextjs.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/frameworks/nextjs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/frameworks/python.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/frameworks/python.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAuElE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as path from 'node:path';
|
|
2
|
-
import
|
|
2
|
+
import { treeFor } from '../repo-tree.js';
|
|
3
3
|
export function detectPython(context) {
|
|
4
4
|
const issues = [];
|
|
5
5
|
const { manifests, repoRoot, files } = context;
|
|
@@ -8,8 +8,10 @@ export function detectPython(context) {
|
|
|
8
8
|
// RepoContext is built — the detector must not do synchronous disk I/O inside
|
|
9
9
|
// the scan pipeline. Presence is derived from that captured content.
|
|
10
10
|
const hasRequirements = manifests.requirements !== undefined;
|
|
11
|
-
|
|
12
|
-
const
|
|
11
|
+
// pcic-e6xa: see the note in frameworks/go.ts.
|
|
12
|
+
const tree = treeFor(context);
|
|
13
|
+
const hasPipfile = tree.isFile('Pipfile');
|
|
14
|
+
const hasCondaYaml = tree.isFile('environment.yml');
|
|
13
15
|
if (!hasPyProject && !hasRequirements && !hasPipfile && !hasCondaYaml) {
|
|
14
16
|
return [];
|
|
15
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/frameworks/python.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/frameworks/python.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../src/frameworks/rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../src/frameworks/rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA2EhE"}
|
package/dist/frameworks/rust.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
1
|
import { readTextWithinRoot } from '../ai-config.js';
|
|
2
|
+
import { treeFor } from '../repo-tree.js';
|
|
4
3
|
export function detectRust(context) {
|
|
5
4
|
const issues = [];
|
|
6
5
|
const { repoRoot, files } = context;
|
|
7
|
-
|
|
6
|
+
// pcic-e6xa: see the note in frameworks/go.ts.
|
|
7
|
+
const hasCargoToml = treeFor(context).isFile('Cargo.toml');
|
|
8
8
|
const combinedContent = files.map(f => f.content).join('\n');
|
|
9
9
|
const hasRustMentions = /\bcargo\.toml\b|\bcargo\s+(build|test|run|clippy|fmt)\b/i.test(combinedContent);
|
|
10
10
|
if (!hasCargoToml && !hasRustMentions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rust.js","sourceRoot":"","sources":["../../src/frameworks/rust.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"rust.js","sourceRoot":"","sources":["../../src/frameworks/rust.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unity.d.ts","sourceRoot":"","sources":["../../src/frameworks/unity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"unity.d.ts","sourceRoot":"","sources":["../../src/frameworks/unity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAiFjE"}
|
package/dist/frameworks/unity.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as fs from 'node:fs';
|
|
1
|
+
import { treeFor } from '../repo-tree.js';
|
|
3
2
|
export function detectUnity(context) {
|
|
4
3
|
const issues = [];
|
|
5
|
-
const {
|
|
6
|
-
|
|
7
|
-
const
|
|
4
|
+
const { files } = context;
|
|
5
|
+
// pcic-e6xa: see the note in frameworks/go.ts.
|
|
6
|
+
const tree = treeFor(context);
|
|
7
|
+
const hasAssets = tree.isDir('Assets');
|
|
8
|
+
const hasProjectVersion = tree.isFile('ProjectSettings/ProjectVersion.txt');
|
|
8
9
|
const combinedContent = files.map(f => f.content).join('\n');
|
|
9
10
|
const hasUnityMentions = /\bunity\b.*\b(lts|editor|hub|engine)\b|\bmonobehaviour\b|\bunityengine\b|\bgameobject\b|\bprefab\b|\bscriptableobject\b/i.test(combinedContent);
|
|
10
11
|
if (!(hasAssets && hasProjectVersion) && !hasUnityMentions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unity.js","sourceRoot":"","sources":["../../src/frameworks/unity.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"unity.js","sourceRoot":"","sources":["../../src/frameworks/unity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,+CAA+C;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;IAE5E,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,0HAA0H,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE1K,IAAI,CAAC,CAAC,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE5C,sCAAsC;IACtC,MAAM,wBAAwB,GAC5B,iMAAiM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1N,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,sCAAsC;YAC1C,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,gDAAgD;YACvD,OAAO,EAAE,gKAAgK;YACzK,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,6EAA6E,CAAC;YACzF,cAAc,EAAE,sIAAsI;YACtJ,SAAS,EAAE,mOAAmO;YAC9O,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,0EAA0E;IAC1E,2EAA2E;IAC3E,qEAAqE;IACrE,+DAA+D;IAC/D,0EAA0E;IAC1E,wEAAwE;IACxE,+DAA+D;IAC/D,MAAM,wBAAwB,GAAG,+FAA+F,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvJ,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,sCAAsC;YAC1C,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,wDAAwD;YAC/D,OAAO,EAAE,yGAAyG;YAClH,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,8EAA8E,CAAC;YAC1F,cAAc,EAAE,wIAAwI;YACxJ,SAAS,EAAE,qNAAqN;YAChO,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAED,mDAAmD;IACnD,MAAM,qBAAqB,GAAG,yCAAyC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9F,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,6BAA6B;YACjC,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,kDAAkD;YACzD,OAAO,EAAE,iHAAiH;YAC1H,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,kFAAkF,CAAC;YAC9F,cAAc,EAAE,oGAAoG;YACpH,SAAS,EAAE,wIAAwI;YACnJ,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/gitignore.d.ts
CHANGED
|
@@ -17,6 +17,35 @@
|
|
|
17
17
|
* a leading `!` after an escape, and `#` mean something different there than
|
|
18
18
|
* they do to git, which treats them literally.
|
|
19
19
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
import type { RepoTree } from './repo-tree.js';
|
|
21
|
+
/**
|
|
22
|
+
* What the repository's ignore rules say about a path.
|
|
23
|
+
*
|
|
24
|
+
* `true`/`false` are answers. The other two say the answer is not available,
|
|
25
|
+
* because an ignore file that applies to the path exists and its text was not
|
|
26
|
+
* read — callers must not take either for "not ignored". They are kept apart
|
|
27
|
+
* for the same reason {@link RepoTree.readText} keeps them apart:
|
|
28
|
+
* - `'unreadable'` — the scan tried and failed. It is recorded, so a caller
|
|
29
|
+
* can raise the "check incomplete" warning that names what it could not read.
|
|
30
|
+
* - `'unfetched'` — a caller's inventory listed the file without fetching it
|
|
31
|
+
* (pcic-csf). Nothing failed and there is nothing to name, so callers stay
|
|
32
|
+
* silent.
|
|
33
|
+
*/
|
|
34
|
+
export type IgnoreVerdict = boolean | 'unreadable' | 'unfetched';
|
|
35
|
+
/**
|
|
36
|
+
* Build a checker over one repository; ignore files are read lazily and once
|
|
37
|
+
* each.
|
|
38
|
+
*
|
|
39
|
+
* pcic-e6xa: the `.gitignore` files are read through the scan's
|
|
40
|
+
* {@link RepoTree}, so a `.gitignore` committed as a link out of the
|
|
41
|
+
* repository is not read and a caller's file inventory is consulted first
|
|
42
|
+
* (pcic-csf) — the same source every other existence check in the scan uses.
|
|
43
|
+
*
|
|
44
|
+
* pcic-csf: a `.gitignore` the scan knows is there but has not got the bytes
|
|
45
|
+
* of (a hosted scan fetches only the instruction files) yields `'unknown'`, not
|
|
46
|
+
* an empty rule set. Treating it as "no rules" is what made such a scan report
|
|
47
|
+
* every reference to a gitignored generated file — `.beads/issues.jsonl`,
|
|
48
|
+
* `data/app.db` — as a broken reference.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createGitIgnoreChecker(tree: RepoTree): (repoRelativePath: string) => IgnoreVerdict;
|
|
22
51
|
//# sourceMappingURL=gitignore.d.ts.map
|
package/dist/gitignore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAyG/C;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,CAAC;AAKjE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,gBAAgB,EAAE,MAAM,KAAK,aAAa,CAuClG"}
|
package/dist/gitignore.js
CHANGED
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
* a leading `!` after an escape, and `#` mean something different there than
|
|
18
18
|
* they do to git, which treats them literally.
|
|
19
19
|
*/
|
|
20
|
-
import { readTextWithinRoot } from './ai-config.js';
|
|
21
20
|
function escapeRegex(ch) {
|
|
22
21
|
return /[\\^$.*+?()[\]{}|/]/.test(ch) ? `\\${ch}` : ch;
|
|
23
22
|
}
|
|
@@ -123,26 +122,51 @@ function ruleMatches(rule, pathBelowIgnoreFile, isDir) {
|
|
|
123
122
|
const target = rule.anchored ? pathBelowIgnoreFile : pathBelowIgnoreFile.split('/').pop();
|
|
124
123
|
return rule.regex.test(target);
|
|
125
124
|
}
|
|
126
|
-
/**
|
|
127
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Build a checker over one repository; ignore files are read lazily and once
|
|
127
|
+
* each.
|
|
128
|
+
*
|
|
129
|
+
* pcic-e6xa: the `.gitignore` files are read through the scan's
|
|
130
|
+
* {@link RepoTree}, so a `.gitignore` committed as a link out of the
|
|
131
|
+
* repository is not read and a caller's file inventory is consulted first
|
|
132
|
+
* (pcic-csf) — the same source every other existence check in the scan uses.
|
|
133
|
+
*
|
|
134
|
+
* pcic-csf: a `.gitignore` the scan knows is there but has not got the bytes
|
|
135
|
+
* of (a hosted scan fetches only the instruction files) yields `'unknown'`, not
|
|
136
|
+
* an empty rule set. Treating it as "no rules" is what made such a scan report
|
|
137
|
+
* every reference to a gitignored generated file — `.beads/issues.jsonl`,
|
|
138
|
+
* `data/app.db` — as a broken reference.
|
|
139
|
+
*/
|
|
140
|
+
export function createGitIgnoreChecker(tree) {
|
|
128
141
|
const cache = new Map();
|
|
129
142
|
const rulesFor = (dir) => {
|
|
130
143
|
let rules = cache.get(dir);
|
|
131
|
-
if (
|
|
132
|
-
const
|
|
133
|
-
rules =
|
|
144
|
+
if (rules === undefined) {
|
|
145
|
+
const read = tree.readText(dir === '' ? '.gitignore' : `${dir}/.gitignore`);
|
|
146
|
+
rules = read.state === 'found' ? parseRules(read.content)
|
|
147
|
+
: read.state === 'unfetched' ? 'unfetched'
|
|
148
|
+
: read.state === 'unreadable' || read.state === 'too-large' ? 'unreadable'
|
|
149
|
+
: [];
|
|
134
150
|
cache.set(dir, rules);
|
|
135
151
|
}
|
|
136
152
|
return rules;
|
|
137
153
|
};
|
|
138
154
|
return (repoRelativePath) => {
|
|
139
155
|
const segments = repoRelativePath.replace(/\\/g, '/').replace(/^\.\//, '').split('/').filter(Boolean);
|
|
156
|
+
let unavailable;
|
|
140
157
|
for (let end = 1; end <= segments.length; end++) {
|
|
141
158
|
const isDir = end < segments.length; // every prefix but the last is a directory
|
|
142
159
|
let ignored;
|
|
143
160
|
for (let start = 0; start < end; start++) {
|
|
144
161
|
const below = segments.slice(start, end).join('/');
|
|
145
|
-
|
|
162
|
+
const rules = rulesFor(segments.slice(0, start).join('/'));
|
|
163
|
+
if (typeof rules === 'string') {
|
|
164
|
+
// A real read failure is the one worth naming, so it wins.
|
|
165
|
+
if (rules === 'unreadable' || unavailable === undefined)
|
|
166
|
+
unavailable = rules;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
for (const rule of rules) {
|
|
146
170
|
if (ruleMatches(rule, below, isDir))
|
|
147
171
|
ignored = !rule.negate;
|
|
148
172
|
}
|
|
@@ -151,7 +175,8 @@ export function createGitIgnoreChecker(repoRoot) {
|
|
|
151
175
|
if (ignored === true)
|
|
152
176
|
return true;
|
|
153
177
|
}
|
|
154
|
-
|
|
178
|
+
// Nothing matched, but an ignore file that could have matched went unread.
|
|
179
|
+
return unavailable ?? false;
|
|
155
180
|
};
|
|
156
181
|
}
|
|
157
182
|
//# sourceMappingURL=gitignore.js.map
|
package/dist/gitignore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-settings-detector.d.ts","sourceRoot":"","sources":["../src/hooks-settings-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks-settings-detector.d.ts","sourceRoot":"","sources":["../src/hooks-settings-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2IhD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA4FzE"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* is higher-stakes than a stale doc line. Deterministic and offline.
|
|
13
13
|
*/
|
|
14
14
|
import { readTextWithinRoot, isFileWithinRoot, shortHash, lineOf, withScannerPaths, SCRIPT_EXT_RE, aiConfigIssue as base, } from './ai-config.js';
|
|
15
|
+
import { treeFor } from './repo-tree.js';
|
|
15
16
|
/** curl/wget piped straight into a shell — the classic remote-code-execution footgun. */
|
|
16
17
|
const CURL_PIPE_SH_RE = /\b(curl|wget)\b[^|]*\|\s*(sudo\s+)?(sh|bash|zsh|dash)\b/i;
|
|
17
18
|
function id(kind, key) {
|
|
@@ -140,6 +141,9 @@ function hasUnquotedProjectDir(command) {
|
|
|
140
141
|
}
|
|
141
142
|
export function detectHooksSettings(context) {
|
|
142
143
|
const issues = [];
|
|
144
|
+
// pcic-e6xa: one tree for the whole run, so its directory listings are read
|
|
145
|
+
// once and every reference below is looked up inside the scan root only.
|
|
146
|
+
const tree = treeFor(context);
|
|
143
147
|
for (const filePath of context.aiConfig.settings) {
|
|
144
148
|
const raw = readTextWithinRoot(context.repoRoot, filePath);
|
|
145
149
|
if (raw === undefined)
|
|
@@ -203,7 +207,7 @@ export function detectHooksSettings(context) {
|
|
|
203
207
|
}
|
|
204
208
|
// Missing local script references.
|
|
205
209
|
for (const ref of extractScriptRefs(command)) {
|
|
206
|
-
if (isFileWithinRoot(
|
|
210
|
+
if (isFileWithinRoot(tree, ref))
|
|
207
211
|
continue;
|
|
208
212
|
const key = `${filePath}|${ref}`;
|
|
209
213
|
if (reportedMissing.has(key))
|