@promptci/core 0.1.0 → 0.2.1
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/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 +1 -1
- package/dist/agent-practices.d.ts.map +1 -1
- package/dist/agent-practices.js +107 -43
- package/dist/agent-practices.js.map +1 -1
- package/dist/ai-config.d.ts +42 -3
- package/dist/ai-config.d.ts.map +1 -1
- package/dist/ai-config.js +210 -12
- package/dist/ai-config.js.map +1 -1
- 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/buried-critical.d.ts.map +1 -1
- package/dist/buried-critical.js +4 -9
- package/dist/buried-critical.js.map +1 -1
- package/dist/canonical-owner.d.ts.map +1 -1
- package/dist/canonical-owner.js +45 -25
- 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 +337 -63
- package/dist/command-validity.js.map +1 -1
- package/dist/conflicts.d.ts.map +1 -1
- package/dist/conflicts.js +3 -2
- package/dist/conflicts.js.map +1 -1
- package/dist/context-bloat.d.ts +1 -1
- package/dist/context-bloat.d.ts.map +1 -1
- package/dist/context-bloat.js +18 -7
- package/dist/context-bloat.js.map +1 -1
- package/dist/context-optimizer.d.ts.map +1 -1
- package/dist/context-optimizer.js +5 -2
- package/dist/context-optimizer.js.map +1 -1
- package/dist/custom-rules.d.ts.map +1 -1
- package/dist/custom-rules.js +6 -1
- package/dist/custom-rules.js.map +1 -1
- package/dist/dead-references.d.ts +16 -2
- package/dist/dead-references.d.ts.map +1 -1
- package/dist/dead-references.js +635 -77
- 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.map +1 -1
- package/dist/detectors.js +31 -6
- package/dist/detectors.js.map +1 -1
- package/dist/duplicates.d.ts.map +1 -1
- package/dist/duplicates.js +5 -4
- package/dist/duplicates.js.map +1 -1
- package/dist/evidence.d.ts +11 -0
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +40 -0
- package/dist/evidence.js.map +1 -1
- 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/frameworks/dotnet.js +2 -2
- package/dist/frameworks/dotnet.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 +34 -5
- package/dist/health-score.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- 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.map +1 -1
- package/dist/manifest-consistency.js +52 -8
- package/dist/manifest-consistency.js.map +1 -1
- package/dist/negative-instructions.d.ts.map +1 -1
- package/dist/negative-instructions.js +4 -9
- package/dist/negative-instructions.js.map +1 -1
- package/dist/path-containment.d.ts +29 -0
- package/dist/path-containment.d.ts.map +1 -1
- package/dist/path-containment.js +70 -0
- package/dist/path-containment.js.map +1 -1
- package/dist/prompt-cache.d.ts.map +1 -1
- package/dist/prompt-cache.js +8 -6
- package/dist/prompt-cache.js.map +1 -1
- package/dist/repo-context.d.ts +53 -0
- package/dist/repo-context.d.ts.map +1 -1
- package/dist/repo-context.js +134 -11
- package/dist/repo-context.js.map +1 -1
- package/dist/report.d.ts +7 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +36 -7
- package/dist/report.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +41 -2
- package/dist/scan.js.map +1 -1
- package/dist/scanner.d.ts +49 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +323 -38
- package/dist/scanner.js.map +1 -1
- package/dist/security-pack.d.ts.map +1 -1
- package/dist/security-pack.js +6 -4
- 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 +7 -3
- package/dist/skills-detector.d.ts.map +1 -1
- package/dist/skills-detector.js +98 -22
- package/dist/skills-detector.js.map +1 -1
- package/dist/stale-instructions.d.ts.map +1 -1
- package/dist/stale-instructions.js +2 -1
- package/dist/stale-instructions.js.map +1 -1
- package/dist/suppression.d.ts +2 -0
- package/dist/suppression.d.ts.map +1 -1
- package/dist/suppression.js +5 -2
- package/dist/suppression.js.map +1 -1
- package/dist/types.d.ts +35 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -1
- package/dist/vague-guidance.d.ts.map +1 -1
- package/dist/vague-guidance.js +2 -1
- package/dist/vague-guidance.js.map +1 -1
- package/dist/windsurf-detector.d.ts.map +1 -1
- package/dist/windsurf-detector.js +15 -6
- package/dist/windsurf-detector.js.map +1 -1
- package/dist/within-section-dedup.d.ts.map +1 -1
- package/dist/within-section-dedup.js +4 -9
- package/dist/within-section-dedup.js.map +1 -1
- 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 +1 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does git say a path is a symlink?
|
|
3
|
+
*
|
|
4
|
+
* A checkout without symlink support (Windows without `core.symlinks`) writes a
|
|
5
|
+
* committed link as a small regular file holding the target path. The scanner
|
|
6
|
+
* only treats such a file as a link when the repository itself says it is one,
|
|
7
|
+
* so a hand-written one-line pointer file stays a real file:
|
|
8
|
+
*
|
|
9
|
+
* 1. the index (`.git/index`, versions 2 and 3) records the path with mode
|
|
10
|
+
* 120000 — authoritative when it can be read: the path is a link exactly
|
|
11
|
+
* when its entry has that mode;
|
|
12
|
+
* 2. otherwise the repository's own config has `core.symlinks = false` (the
|
|
13
|
+
* setting git writes at clone time on a filesystem that cannot link). The
|
|
14
|
+
* global and system config are deliberately not consulted: they say what a
|
|
15
|
+
* clone would do, not what this checkout is.
|
|
16
|
+
*
|
|
17
|
+
* Read-only, no git binary, no network. Anything unreadable or unrecognised
|
|
18
|
+
* answers "no".
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
const MAX_CONFIG_BYTES = 1024 * 1024;
|
|
23
|
+
const MAX_INDEX_BYTES = 128 * 1024 * 1024;
|
|
24
|
+
const MAX_INDEX_ENTRIES = 2_000_000;
|
|
25
|
+
const MAX_PARENT_LEVELS = 24;
|
|
26
|
+
/** The repository (work tree, git dir, common dir) containing `start`, or undefined. */
|
|
27
|
+
function findGit(start) {
|
|
28
|
+
let dir = path.resolve(start);
|
|
29
|
+
for (let level = 0; level < MAX_PARENT_LEVELS; level++) {
|
|
30
|
+
const dotGit = path.join(dir, '.git');
|
|
31
|
+
try {
|
|
32
|
+
const stat = fs.statSync(dotGit);
|
|
33
|
+
if (stat.isDirectory())
|
|
34
|
+
return { workTree: dir, gitDir: dotGit, commonDir: dotGit };
|
|
35
|
+
if (stat.isFile() && stat.size < 4096) {
|
|
36
|
+
// A linked worktree or submodule: `.git` is a file `gitdir: <path>`.
|
|
37
|
+
const pointer = /^gitdir:\s*(.+?)\s*$/m.exec(fs.readFileSync(dotGit, 'utf8'))?.[1];
|
|
38
|
+
if (pointer) {
|
|
39
|
+
const gitDir = path.resolve(dir, pointer);
|
|
40
|
+
let commonDir = gitDir;
|
|
41
|
+
try {
|
|
42
|
+
const common = fs.readFileSync(path.join(gitDir, 'commondir'), 'utf8').trim();
|
|
43
|
+
if (common)
|
|
44
|
+
commonDir = path.resolve(gitDir, common);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// not a linked worktree
|
|
48
|
+
}
|
|
49
|
+
return { workTree: dir, gitDir, commonDir };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// no `.git` here: keep climbing
|
|
55
|
+
}
|
|
56
|
+
const parent = path.dirname(dir);
|
|
57
|
+
if (parent === dir)
|
|
58
|
+
break;
|
|
59
|
+
dir = parent;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
/** `core.symlinks` from a git config file's text: false only when the last value says so. */
|
|
64
|
+
export function configDisablesSymlinks(config) {
|
|
65
|
+
let inCore = false;
|
|
66
|
+
let value;
|
|
67
|
+
for (const raw of config.split(/\r?\n/)) {
|
|
68
|
+
const line = raw.trim();
|
|
69
|
+
const section = /^\[\s*([A-Za-z0-9.-]+)(?:\s+"[^"]*")?\s*\]/.exec(line);
|
|
70
|
+
if (section) {
|
|
71
|
+
inCore = section[1].toLowerCase() === 'core' && !line.includes('"');
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!inCore)
|
|
75
|
+
continue;
|
|
76
|
+
const key = /^symlinks\s*(?:=\s*(.*?))?\s*(?:[;#].*)?$/i.exec(line);
|
|
77
|
+
if (key)
|
|
78
|
+
value = key[1] === undefined ? 'true' : key[1].replace(/^"|"$/g, '').trim();
|
|
79
|
+
}
|
|
80
|
+
return value !== undefined && /^(?:false|no|off|0)$/i.test(value);
|
|
81
|
+
}
|
|
82
|
+
/** The paths of a git index (versions 2 and 3) whose entry mode is a symlink; undefined when unreadable or another version. */
|
|
83
|
+
export function symlinkPathsInIndex(index) {
|
|
84
|
+
if (index.length < 12 || index.toString('latin1', 0, 4) !== 'DIRC')
|
|
85
|
+
return undefined;
|
|
86
|
+
const version = index.readUInt32BE(4);
|
|
87
|
+
if (version !== 2 && version !== 3)
|
|
88
|
+
return undefined;
|
|
89
|
+
const count = index.readUInt32BE(8);
|
|
90
|
+
if (count > MAX_INDEX_ENTRIES)
|
|
91
|
+
return undefined;
|
|
92
|
+
const links = new Set();
|
|
93
|
+
let offset = 12;
|
|
94
|
+
for (let n = 0; n < count; n++) {
|
|
95
|
+
if (offset + 62 > index.length)
|
|
96
|
+
return undefined;
|
|
97
|
+
const mode = index.readUInt32BE(offset + 24);
|
|
98
|
+
const flags = index.readUInt16BE(offset + 60);
|
|
99
|
+
const extended = version === 3 && (flags & 0x4000) !== 0;
|
|
100
|
+
const fixed = extended ? 64 : 62;
|
|
101
|
+
let nameLength = flags & 0x0fff;
|
|
102
|
+
if (nameLength === 0x0fff) {
|
|
103
|
+
const nul = index.indexOf(0, offset + fixed);
|
|
104
|
+
if (nul < 0)
|
|
105
|
+
return undefined;
|
|
106
|
+
nameLength = nul - (offset + fixed);
|
|
107
|
+
}
|
|
108
|
+
if (offset + fixed + nameLength > index.length)
|
|
109
|
+
return undefined;
|
|
110
|
+
if ((mode & 0o170000) === 0o120000)
|
|
111
|
+
links.add(index.toString('utf8', offset + fixed, offset + fixed + nameLength));
|
|
112
|
+
offset += Math.ceil((fixed + nameLength + 1) / 8) * 8;
|
|
113
|
+
}
|
|
114
|
+
return links;
|
|
115
|
+
}
|
|
116
|
+
/** Built lazily by the caller: nothing is read until the first question. */
|
|
117
|
+
export function createGitSymlinkOracle(scanRoot) {
|
|
118
|
+
let loaded;
|
|
119
|
+
const load = () => {
|
|
120
|
+
if (loaded !== undefined)
|
|
121
|
+
return loaded;
|
|
122
|
+
loaded = null;
|
|
123
|
+
const git = findGit(scanRoot);
|
|
124
|
+
if (!git)
|
|
125
|
+
return loaded;
|
|
126
|
+
let configFalse = false;
|
|
127
|
+
try {
|
|
128
|
+
const configPath = path.join(git.commonDir, 'config');
|
|
129
|
+
if (fs.statSync(configPath).size <= MAX_CONFIG_BYTES)
|
|
130
|
+
configFalse = configDisablesSymlinks(fs.readFileSync(configPath, 'utf8'));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// no readable config
|
|
134
|
+
}
|
|
135
|
+
let links;
|
|
136
|
+
try {
|
|
137
|
+
const indexPath = path.join(git.gitDir, 'index');
|
|
138
|
+
if (fs.statSync(indexPath).size <= MAX_INDEX_BYTES)
|
|
139
|
+
links = symlinkPathsInIndex(fs.readFileSync(indexPath));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// no readable index
|
|
143
|
+
}
|
|
144
|
+
loaded = { git, links, configFalse };
|
|
145
|
+
return loaded;
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
isSymlink(scanRelativePath) {
|
|
149
|
+
const state = load();
|
|
150
|
+
if (!state)
|
|
151
|
+
return false;
|
|
152
|
+
// The index is authoritative when it parsed: the path is a link exactly when its entry says so.
|
|
153
|
+
if (state.links) {
|
|
154
|
+
const gitRelative = path.relative(state.git.workTree, path.resolve(scanRoot, scanRelativePath)).split(path.sep).join('/');
|
|
155
|
+
return state.links.has(gitRelative);
|
|
156
|
+
}
|
|
157
|
+
return state.configFalse;
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=git-symlinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-symlinks.js","sourceRoot":"","sources":["../src/git-symlinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `.gitignore` matching for "is this referenced file expected to be
|
|
3
|
+
* absent from a checkout?" questions.
|
|
4
|
+
*
|
|
5
|
+
* A reference to `.beads/issues.jsonl` or `/data/app.db` is not broken when the
|
|
6
|
+
* repository's own ignore rules say the file is local, generated state. This
|
|
7
|
+
* reads the `.gitignore` files on the path from the repo root down to the file
|
|
8
|
+
* (nested ignore files apply to their own directory) and evaluates them the way
|
|
9
|
+
* git does: within one file the last matching rule wins, a deeper file overrides
|
|
10
|
+
* a shallower one, and a file under an ignored directory is ignored. It does not
|
|
11
|
+
* read `.git/info/exclude` or the user's global excludes file — only what the
|
|
12
|
+
* repository itself commits.
|
|
13
|
+
*
|
|
14
|
+
* Patterns are translated to regular expressions with gitignore's own glob
|
|
15
|
+
* dialect (`*`, `?`, `[...]`, `**`, backslash escapes). They are deliberately
|
|
16
|
+
* NOT handed to a general-purpose glob library: braces, extglobs (`+(a|b)`),
|
|
17
|
+
* a leading `!` after an escape, and `#` mean something different there than
|
|
18
|
+
* they do to git, which treats them literally.
|
|
19
|
+
*/
|
|
20
|
+
/** Build a checker over one repository; ignore files are read lazily and once each. */
|
|
21
|
+
export declare function createGitIgnoreChecker(repoRoot: string): (repoRelativePath: string) => boolean;
|
|
22
|
+
//# sourceMappingURL=gitignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA2GH,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CA4B9F"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `.gitignore` matching for "is this referenced file expected to be
|
|
3
|
+
* absent from a checkout?" questions.
|
|
4
|
+
*
|
|
5
|
+
* A reference to `.beads/issues.jsonl` or `/data/app.db` is not broken when the
|
|
6
|
+
* repository's own ignore rules say the file is local, generated state. This
|
|
7
|
+
* reads the `.gitignore` files on the path from the repo root down to the file
|
|
8
|
+
* (nested ignore files apply to their own directory) and evaluates them the way
|
|
9
|
+
* git does: within one file the last matching rule wins, a deeper file overrides
|
|
10
|
+
* a shallower one, and a file under an ignored directory is ignored. It does not
|
|
11
|
+
* read `.git/info/exclude` or the user's global excludes file — only what the
|
|
12
|
+
* repository itself commits.
|
|
13
|
+
*
|
|
14
|
+
* Patterns are translated to regular expressions with gitignore's own glob
|
|
15
|
+
* dialect (`*`, `?`, `[...]`, `**`, backslash escapes). They are deliberately
|
|
16
|
+
* NOT handed to a general-purpose glob library: braces, extglobs (`+(a|b)`),
|
|
17
|
+
* a leading `!` after an escape, and `#` mean something different there than
|
|
18
|
+
* they do to git, which treats them literally.
|
|
19
|
+
*/
|
|
20
|
+
import { readTextWithinRoot } from './ai-config.js';
|
|
21
|
+
function escapeRegex(ch) {
|
|
22
|
+
return /[\\^$.*+?()[\]{}|/]/.test(ch) ? `\\${ch}` : ch;
|
|
23
|
+
}
|
|
24
|
+
/** Translate a gitignore glob (no leading `/`, no trailing `/`) to an anchored RegExp source. */
|
|
25
|
+
function globToRegexSource(glob) {
|
|
26
|
+
let out = '';
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < glob.length) {
|
|
29
|
+
const ch = glob[i];
|
|
30
|
+
if (ch === '\\') {
|
|
31
|
+
// A backslash makes the next character literal.
|
|
32
|
+
if (i + 1 < glob.length)
|
|
33
|
+
out += escapeRegex(glob[i + 1]);
|
|
34
|
+
i += 2;
|
|
35
|
+
}
|
|
36
|
+
else if (ch === '*') {
|
|
37
|
+
if (glob[i + 1] === '*') {
|
|
38
|
+
const atStart = i === 0 || glob[i - 1] === '/';
|
|
39
|
+
let end = i + 2;
|
|
40
|
+
while (glob[end] === '*')
|
|
41
|
+
end++;
|
|
42
|
+
if (atStart && glob[end] === '/') {
|
|
43
|
+
out += '(?:.*/)?'; // `**/` — zero or more directories
|
|
44
|
+
i = end + 1;
|
|
45
|
+
}
|
|
46
|
+
else if (atStart && end === glob.length) {
|
|
47
|
+
out += '.*'; // trailing `/**` (the slash is already emitted) — everything below
|
|
48
|
+
i = end;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
out += '[^/]*'; // `**` not bounded by slashes behaves like `*`
|
|
52
|
+
i = end;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
out += '[^/]*';
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (ch === '?') {
|
|
61
|
+
out += '[^/]';
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
else if (ch === '[') {
|
|
65
|
+
const close = glob.indexOf(']', i + 2); // `[]x]` / `[!]x]` make the first `]` a member
|
|
66
|
+
if (close === -1) {
|
|
67
|
+
out += '\\[';
|
|
68
|
+
i++;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
let body = glob.slice(i + 1, close);
|
|
72
|
+
let negated = false;
|
|
73
|
+
if (body.startsWith('!') || body.startsWith('^')) {
|
|
74
|
+
negated = true;
|
|
75
|
+
body = body.slice(1);
|
|
76
|
+
}
|
|
77
|
+
body = body.replace(/[\\^\]]/g, (c) => `\\${c}`);
|
|
78
|
+
out += `[${negated ? '^' : ''}${body}]`;
|
|
79
|
+
i = close + 1;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
out += escapeRegex(ch);
|
|
84
|
+
i++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
function parseRules(content) {
|
|
90
|
+
const rules = [];
|
|
91
|
+
for (const raw of content.split(/\r?\n/)) {
|
|
92
|
+
// Unescaped trailing spaces are dropped; `foo\ ` keeps its space.
|
|
93
|
+
let line = raw.replace(/(?<!\\)[ \t]+$/, '');
|
|
94
|
+
if (line === '' || line.startsWith('#'))
|
|
95
|
+
continue; // `\#file` starts with a backslash, not `#`
|
|
96
|
+
let negate = false;
|
|
97
|
+
if (line.startsWith('!')) {
|
|
98
|
+
negate = true;
|
|
99
|
+
line = line.slice(1);
|
|
100
|
+
}
|
|
101
|
+
// `\!file` and `\#file`: the backslash stays in the glob, where it reads as an escape.
|
|
102
|
+
let dirOnly = false;
|
|
103
|
+
if (line.endsWith('/')) {
|
|
104
|
+
dirOnly = true;
|
|
105
|
+
line = line.slice(0, -1);
|
|
106
|
+
}
|
|
107
|
+
const anchored = line.includes('/');
|
|
108
|
+
line = line.replace(/^\//, '');
|
|
109
|
+
if (line === '')
|
|
110
|
+
continue;
|
|
111
|
+
try {
|
|
112
|
+
rules.push({ negate, dirOnly, anchored, regex: new RegExp(`^${globToRegexSource(line)}$`) });
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// An unparseable pattern is skipped, as git would warn about and ignore it.
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return rules;
|
|
119
|
+
}
|
|
120
|
+
function ruleMatches(rule, pathBelowIgnoreFile, isDir) {
|
|
121
|
+
if (rule.dirOnly && !isDir)
|
|
122
|
+
return false;
|
|
123
|
+
const target = rule.anchored ? pathBelowIgnoreFile : pathBelowIgnoreFile.split('/').pop();
|
|
124
|
+
return rule.regex.test(target);
|
|
125
|
+
}
|
|
126
|
+
/** Build a checker over one repository; ignore files are read lazily and once each. */
|
|
127
|
+
export function createGitIgnoreChecker(repoRoot) {
|
|
128
|
+
const cache = new Map();
|
|
129
|
+
const rulesFor = (dir) => {
|
|
130
|
+
let rules = cache.get(dir);
|
|
131
|
+
if (!rules) {
|
|
132
|
+
const content = readTextWithinRoot(repoRoot, dir === '' ? '.gitignore' : `${dir}/.gitignore`);
|
|
133
|
+
rules = content === undefined ? [] : parseRules(content);
|
|
134
|
+
cache.set(dir, rules);
|
|
135
|
+
}
|
|
136
|
+
return rules;
|
|
137
|
+
};
|
|
138
|
+
return (repoRelativePath) => {
|
|
139
|
+
const segments = repoRelativePath.replace(/\\/g, '/').replace(/^\.\//, '').split('/').filter(Boolean);
|
|
140
|
+
for (let end = 1; end <= segments.length; end++) {
|
|
141
|
+
const isDir = end < segments.length; // every prefix but the last is a directory
|
|
142
|
+
let ignored;
|
|
143
|
+
for (let start = 0; start < end; start++) {
|
|
144
|
+
const below = segments.slice(start, end).join('/');
|
|
145
|
+
for (const rule of rulesFor(segments.slice(0, start).join('/'))) {
|
|
146
|
+
if (ruleMatches(rule, below, isDir))
|
|
147
|
+
ignored = !rule.negate;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// An ignored directory cannot be re-included, so everything below it is ignored too.
|
|
151
|
+
if (ignored === true)
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAUpD,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,iGAAiG;AACjG,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,gDAAgD;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;YAC1D,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gBAC/C,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG;oBAAE,GAAG,EAAE,CAAC;gBAChC,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;oBACjC,GAAG,IAAI,UAAU,CAAC,CAAC,mCAAmC;oBACtD,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC1C,GAAG,IAAI,IAAI,CAAC,CAAC,mEAAmE;oBAChF,CAAC,GAAG,GAAG,CAAC;gBACV,CAAC;qBAAM,CAAC;oBACN,GAAG,IAAI,OAAO,CAAC,CAAC,+CAA+C;oBAC/D,CAAC,GAAG,GAAG,CAAC;gBACV,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,OAAO,CAAC;gBACf,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,GAAG,IAAI,MAAM,CAAC;YACd,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,+CAA+C;YACvF,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,GAAG,IAAI,KAAK,CAAC;gBACb,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBACpC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjD,OAAO,GAAG,IAAI,CAAC;oBACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvB,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjD,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC;gBACxC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,kEAAkE;QAClE,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,4CAA4C;QAC/F,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,uFAAuF;QACvF,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACP,4EAA4E;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,IAAU,EAAE,mBAA2B,EAAE,KAAc;IAC1E,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;IAC3F,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE;QACvC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;YAC9F,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,CAAC,gBAAwB,EAAW,EAAE;QAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtG,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,2CAA2C;YAChF,IAAI,OAA4B,CAAC;YACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAChE,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;wBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,qFAAqF;YACrF,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-score.d.ts","sourceRoot":"","sources":["../src/health-score.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAgC,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"health-score.d.ts","sourceRoot":"","sources":["../src/health-score.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAgC,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAuDtF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAoBlE;AAQD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAiE9E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAuChE"}
|
package/dist/health-score.js
CHANGED
|
@@ -25,6 +25,35 @@ const CATEGORY_DEDUCTION_CAP = {
|
|
|
25
25
|
vague_guidance: 10,
|
|
26
26
|
ai_config: 25, // skills/subagents/hooks/mcp/cursor config checks
|
|
27
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Deduction caps for groups that cut across a category. Each tagged group
|
|
30
|
+
* gets its own bucket; the rest of the `security` category stays uncapped.
|
|
31
|
+
*
|
|
32
|
+
* - `supply-chain` (8): unpinned GitHub Actions are `security` findings, but
|
|
33
|
+
* they describe CI configuration, not instruction health: uncapped, one
|
|
34
|
+
* finding per unpinned action took ~25 points off an otherwise healthy repo
|
|
35
|
+
* that simply uses tag-pinned third-party actions.
|
|
36
|
+
* - `skill-supply-chain` (15): findings about installed third-party skills,
|
|
37
|
+
* not the repo's own instruction health: uncapped, one noisy skill could
|
|
38
|
+
* zero an otherwise healthy score.
|
|
39
|
+
*
|
|
40
|
+
* Capped, they stay visible (and still sort into top fixes by severity, and
|
|
41
|
+
* `--fail-on high` still gates CI on them) without dominating the score.
|
|
42
|
+
*/
|
|
43
|
+
const TAG_DEDUCTION_CAP = {
|
|
44
|
+
'supply-chain': 8,
|
|
45
|
+
'skill-supply-chain': 15,
|
|
46
|
+
};
|
|
47
|
+
/** The cap bucket an issue's deduction counts against, if any. */
|
|
48
|
+
function deductionBucket(issue) {
|
|
49
|
+
for (const tag of issue.tags ?? []) {
|
|
50
|
+
const cap = TAG_DEDUCTION_CAP[tag];
|
|
51
|
+
if (cap !== undefined)
|
|
52
|
+
return { key: `tag:${tag}`, cap };
|
|
53
|
+
}
|
|
54
|
+
const cap = CATEGORY_DEDUCTION_CAP[issue.category];
|
|
55
|
+
return cap !== undefined ? { key: issue.category, cap } : undefined;
|
|
56
|
+
}
|
|
28
57
|
/**
|
|
29
58
|
* Compute a health score from 0–100 based on issue severity and confidence.
|
|
30
59
|
*
|
|
@@ -39,12 +68,12 @@ export function computeHealthScore(issues) {
|
|
|
39
68
|
const categoryDeductions = new Map();
|
|
40
69
|
for (const issue of issues) {
|
|
41
70
|
const deduction = (SEVERITY_WEIGHT[issue.severity] ?? 0) * issue.confidence;
|
|
42
|
-
const
|
|
43
|
-
if (
|
|
44
|
-
const soFar = categoryDeductions.get(
|
|
45
|
-
const allowed = Math.max(0, cap - soFar);
|
|
71
|
+
const bucket = deductionBucket(issue);
|
|
72
|
+
if (bucket !== undefined) {
|
|
73
|
+
const soFar = categoryDeductions.get(bucket.key) ?? 0;
|
|
74
|
+
const allowed = Math.max(0, bucket.cap - soFar);
|
|
46
75
|
const actual = Math.min(deduction, allowed);
|
|
47
|
-
categoryDeductions.set(
|
|
76
|
+
categoryDeductions.set(bucket.key, soFar + actual);
|
|
48
77
|
score -= actual;
|
|
49
78
|
}
|
|
50
79
|
else {
|
package/dist/health-score.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-score.js","sourceRoot":"","sources":["../src/health-score.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,eAAe,GAAkC;IACrD,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;CACR,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,sBAAsB,GAA2C;IACrE,SAAS,EAAE,EAAE,EAAW,kBAAkB;IAC1C,iBAAiB,EAAE,EAAE;IACrB,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,EAAE;IAClB,SAAS,EAAE,EAAE,EAAW,kDAAkD;CAC3E,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAuB;IACxD,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;QAC5E,MAAM,
|
|
1
|
+
{"version":3,"file":"health-score.js","sourceRoot":"","sources":["../src/health-score.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Root export for @promptci/core */
|
|
2
2
|
export * from './types.js';
|
|
3
|
-
export { scanFiles, parseSections } from './scanner.js';
|
|
3
|
+
export { scanFiles, scanFilesWithAliases, parseSections } from './scanner.js';
|
|
4
|
+
export type { ScanFilesResult } from './scanner.js';
|
|
4
5
|
export { detectProjectType, detectProjectTypeFromContent } from './project-type.js';
|
|
5
6
|
export { detectDuplicates, detectDuplicateHeadings, normalizeSection } from './duplicates.js';
|
|
6
7
|
export { detectConflicts, detectVersionConflicts, detectCompetingTechConflicts } from './conflicts.js';
|
|
@@ -12,12 +13,17 @@ export { computeHealthScore, selectTopFixes } from './health-score.js';
|
|
|
12
13
|
export { generateMarkdownReport, generateJsonReport, writeReport, readHistoryIndex, archiveExistingReport, historyIndexPath, scoreLabel } from './report.js';
|
|
13
14
|
export type { WriteReportOptions, HistoryEntry } from './report.js';
|
|
14
15
|
export { detectManifestConsistency } from './manifest-consistency.js';
|
|
16
|
+
export { detectDependencyStaleness } from './dependency-staleness.js';
|
|
15
17
|
export type { ManifestData } from './manifest-consistency.js';
|
|
16
18
|
export { buildRepoContext, parsePackageJsonFacts } from './repo-context.js';
|
|
17
|
-
export type { RepoContext, PackageJsonFacts, WorkflowFacts, WorkflowCommand } from './repo-context.js';
|
|
19
|
+
export type { RepoContext, PackageJsonFacts, WorkflowFacts, WorkflowCommand, WorkflowSource } from './repo-context.js';
|
|
20
|
+
export type { MakefileFacts } from './makefile.js';
|
|
21
|
+
export { detectActionPinning, extractActionUses } from './action-pinning.js';
|
|
18
22
|
export { runDetectors } from './detectors.js';
|
|
19
23
|
export type { DetectorDefinition } from './detectors.js';
|
|
20
24
|
export { detectSkills } from './skills-detector.js';
|
|
25
|
+
export { detectSkillSupplyChain } from './skill-supply-chain.js';
|
|
26
|
+
export type { SkillSupplyChainRule } from './skill-supply-chain.js';
|
|
21
27
|
export { detectSubagents } from './subagents-detector.js';
|
|
22
28
|
export { detectHooksSettings } from './hooks-settings-detector.js';
|
|
23
29
|
export { detectMcpConfig } from './mcp-config-detector.js';
|
|
@@ -35,7 +41,7 @@ export { scan } from './scan.js';
|
|
|
35
41
|
export { computeFingerprint, createBaseline, filterNewIssues, assertValidBaseline } from './baseline.js';
|
|
36
42
|
export { applyFixRecipe, resolveSafePath, isRepairable } from './fix-engine.js';
|
|
37
43
|
export type { FileChange } from './fix-engine.js';
|
|
38
|
-
export { isWithinRoot, resolveWithinRoot } from './path-containment.js';
|
|
44
|
+
export { isWithinRoot, resolveWithinRoot, realPathWithinRoot, resolveReadableWithinRoot, writeTargetWithinRoot } from './path-containment.js';
|
|
39
45
|
export { optimizeContext } from './context-optimizer.js';
|
|
40
46
|
export type { OptimizeOptions, OptimizeResult } from './context-optimizer.js';
|
|
41
47
|
export { TARGET_MODELS, MODEL_BUDGETS_REVIEW_BY, resolveTargetModel, modelBudget, budgetForTargetModel, } from './model-budgets.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Root export for @promptci/core */
|
|
2
2
|
export * from './types.js';
|
|
3
|
-
export { scanFiles, parseSections } from './scanner.js';
|
|
3
|
+
export { scanFiles, scanFilesWithAliases, parseSections } from './scanner.js';
|
|
4
4
|
export { detectProjectType, detectProjectTypeFromContent } from './project-type.js';
|
|
5
5
|
export { detectDuplicates, detectDuplicateHeadings, normalizeSection } from './duplicates.js';
|
|
6
6
|
export { detectConflicts, detectVersionConflicts, detectCompetingTechConflicts } from './conflicts.js';
|
|
@@ -10,9 +10,12 @@ export { parseSuppressions, buildValidationIssues, applySuppressions } from './s
|
|
|
10
10
|
export { computeHealthScore, selectTopFixes } from './health-score.js';
|
|
11
11
|
export { generateMarkdownReport, generateJsonReport, writeReport, readHistoryIndex, archiveExistingReport, historyIndexPath, scoreLabel } from './report.js';
|
|
12
12
|
export { detectManifestConsistency } from './manifest-consistency.js';
|
|
13
|
+
export { detectDependencyStaleness } from './dependency-staleness.js';
|
|
13
14
|
export { buildRepoContext, parsePackageJsonFacts } from './repo-context.js';
|
|
15
|
+
export { detectActionPinning, extractActionUses } from './action-pinning.js';
|
|
14
16
|
export { runDetectors } from './detectors.js';
|
|
15
17
|
export { detectSkills } from './skills-detector.js';
|
|
18
|
+
export { detectSkillSupplyChain } from './skill-supply-chain.js';
|
|
16
19
|
export { detectSubagents } from './subagents-detector.js';
|
|
17
20
|
export { detectHooksSettings } from './hooks-settings-detector.js';
|
|
18
21
|
export { detectMcpConfig } from './mcp-config-detector.js';
|
|
@@ -27,7 +30,7 @@ export { analyzeContext } from './context-analysis.js';
|
|
|
27
30
|
export { scan } from './scan.js';
|
|
28
31
|
export { computeFingerprint, createBaseline, filterNewIssues, assertValidBaseline } from './baseline.js';
|
|
29
32
|
export { applyFixRecipe, resolveSafePath, isRepairable } from './fix-engine.js';
|
|
30
|
-
export { isWithinRoot, resolveWithinRoot } from './path-containment.js';
|
|
33
|
+
export { isWithinRoot, resolveWithinRoot, realPathWithinRoot, resolveReadableWithinRoot, writeTargetWithinRoot } from './path-containment.js';
|
|
31
34
|
export { optimizeContext } from './context-optimizer.js';
|
|
32
35
|
export { TARGET_MODELS, MODEL_BUDGETS_REVIEW_BY, resolveTargetModel, modelBudget, budgetForTargetModel, } from './model-budgets.js';
|
|
33
36
|
export { loadCustomRules, parseCustomRules, runCustomRules, CustomRulesError, CUSTOM_RULE_TYPES, CUSTOM_RULES_FILE, } from './custom-rules.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Makefile target discovery for the command-validity check (`make <target>`).
|
|
3
|
+
*
|
|
4
|
+
* This is a deliberately small reader, not a make implementation. It collects
|
|
5
|
+
* the explicit targets a Makefile defines (`build:`, `lint test: deps`,
|
|
6
|
+
* `check::`), the names listed on `.PHONY`, and pattern rules (`%.o: %.c`).
|
|
7
|
+
* Whenever the file can define targets this reader cannot see — an `include`
|
|
8
|
+
* / `-include` / `sinclude` directive, or a target name computed from a
|
|
9
|
+
* variable or function (`$(BIN):`, `$(eval ...)`) — the result is marked
|
|
10
|
+
* unverifiable and callers must not report anything against it.
|
|
11
|
+
*
|
|
12
|
+
* Deterministic and offline: it only reads the Makefile text.
|
|
13
|
+
*/
|
|
14
|
+
export type MakefileFacts = {
|
|
15
|
+
/** Repo-relative POSIX path of the Makefile read. */
|
|
16
|
+
file: string;
|
|
17
|
+
/** Explicit targets and `.PHONY` names. */
|
|
18
|
+
targets: string[];
|
|
19
|
+
/** Pattern-rule targets containing `%` (e.g. `%.o`, `build-%`). */
|
|
20
|
+
patterns: string[];
|
|
21
|
+
/**
|
|
22
|
+
* The file can define targets this reader cannot enumerate (`include`,
|
|
23
|
+
* computed target names, `$(eval)`): never report a target as missing.
|
|
24
|
+
*/
|
|
25
|
+
unverifiable: boolean;
|
|
26
|
+
};
|
|
27
|
+
/** Parse Makefile text into its targets. Exported for tests. */
|
|
28
|
+
export declare function parseMakefileTargets(content: string, file?: string): MakefileFacts;
|
|
29
|
+
/** True when `target` is defined explicitly or matched by a pattern rule. */
|
|
30
|
+
export declare function makefileDefines(facts: MakefileFacts, target: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Read the Makefile make would use in a repo-relative directory ('.' = root).
|
|
33
|
+
* `undefined` when there is none (or it is oversized, unreadable, or a symlink
|
|
34
|
+
* leaving the repo).
|
|
35
|
+
*/
|
|
36
|
+
export declare function readMakefile(repoRoot: string, dir: string): MakefileFacts | undefined;
|
|
37
|
+
//# sourceMappingURL=makefile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makefile.d.ts","sourceRoot":"","sources":["../src/makefile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,MAAM,aAAa,GAAG;IAC1B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAuBF,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,aAAa,CAwEtF;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAY7E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAkBrF"}
|