@shipsafe/cli 0.2.4 → 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/bin/shipsafe.js +2 -0
- package/dist/bin/shipsafe.js.map +1 -1
- package/dist/src/claude-md/manager.d.ts.map +1 -1
- package/dist/src/claude-md/manager.js +2 -34
- package/dist/src/claude-md/manager.js.map +1 -1
- package/dist/src/cli/baseline.d.ts +3 -0
- package/dist/src/cli/baseline.d.ts.map +1 -0
- package/dist/src/cli/baseline.js +67 -0
- package/dist/src/cli/baseline.js.map +1 -0
- package/dist/src/cli/init.d.ts.map +1 -1
- package/dist/src/cli/init.js +29 -7
- package/dist/src/cli/init.js.map +1 -1
- package/dist/src/cli/scan.d.ts.map +1 -1
- package/dist/src/cli/scan.js +16 -1
- package/dist/src/cli/scan.js.map +1 -1
- package/dist/src/engines/builtin/baseline.d.ts +41 -0
- package/dist/src/engines/builtin/baseline.d.ts.map +1 -0
- package/dist/src/engines/builtin/baseline.js +83 -0
- package/dist/src/engines/builtin/baseline.js.map +1 -0
- package/dist/src/engines/builtin/gitignore.d.ts +33 -0
- package/dist/src/engines/builtin/gitignore.d.ts.map +1 -0
- package/dist/src/engines/builtin/gitignore.js +83 -0
- package/dist/src/engines/builtin/gitignore.js.map +1 -0
- package/dist/src/engines/builtin/ignore.d.ts +14 -0
- package/dist/src/engines/builtin/ignore.d.ts.map +1 -0
- package/dist/src/engines/builtin/ignore.js +114 -0
- package/dist/src/engines/builtin/ignore.js.map +1 -0
- package/dist/src/engines/builtin/patterns.d.ts.map +1 -1
- package/dist/src/engines/builtin/patterns.js +990 -49
- package/dist/src/engines/builtin/patterns.js.map +1 -1
- package/dist/src/engines/builtin/secrets.d.ts.map +1 -1
- package/dist/src/engines/builtin/secrets.js +50 -7
- package/dist/src/engines/builtin/secrets.js.map +1 -1
- package/dist/src/engines/pattern/index.d.ts.map +1 -1
- package/dist/src/engines/pattern/index.js +26 -9
- package/dist/src/engines/pattern/index.js.map +1 -1
- package/dist/src/mcp/tools/scan.d.ts.map +1 -1
- package/dist/src/mcp/tools/scan.js +11 -0
- package/dist/src/mcp/tools/scan.js.map +1 -1
- package/dist/src/scripts/postinstall.d.ts +10 -0
- package/dist/src/scripts/postinstall.d.ts.map +1 -0
- package/dist/src/scripts/postinstall.js +109 -0
- package/dist/src/scripts/postinstall.js.map +1 -0
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .shipsafeignore support — gitignore-style file exclusion.
|
|
3
|
+
* Reads .shipsafeignore from the project root and filters file paths.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { join, relative } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Parse a .shipsafeignore file into glob patterns.
|
|
9
|
+
* Supports: file paths, directory paths, glob patterns, comments (#), negation (!).
|
|
10
|
+
*/
|
|
11
|
+
function parseIgnorePatterns(content) {
|
|
12
|
+
const rules = [];
|
|
13
|
+
for (let line of content.split('\n')) {
|
|
14
|
+
line = line.trim();
|
|
15
|
+
// Skip empty lines and comments
|
|
16
|
+
if (!line || line.startsWith('#'))
|
|
17
|
+
continue;
|
|
18
|
+
let negated = false;
|
|
19
|
+
if (line.startsWith('!')) {
|
|
20
|
+
negated = true;
|
|
21
|
+
line = line.slice(1);
|
|
22
|
+
}
|
|
23
|
+
// Convert glob pattern to regex
|
|
24
|
+
const regex = globToRegex(line);
|
|
25
|
+
rules.push({ pattern: regex, negated });
|
|
26
|
+
}
|
|
27
|
+
return rules;
|
|
28
|
+
}
|
|
29
|
+
function globToRegex(glob) {
|
|
30
|
+
let regex = '';
|
|
31
|
+
let i = 0;
|
|
32
|
+
// If pattern starts with /, anchor to root
|
|
33
|
+
const anchored = glob.startsWith('/');
|
|
34
|
+
if (anchored)
|
|
35
|
+
glob = glob.slice(1);
|
|
36
|
+
// If pattern ends with /, match directory (and everything inside)
|
|
37
|
+
const dirOnly = glob.endsWith('/');
|
|
38
|
+
if (dirOnly)
|
|
39
|
+
glob = glob.slice(0, -1);
|
|
40
|
+
while (i < glob.length) {
|
|
41
|
+
const ch = glob[i];
|
|
42
|
+
if (ch === '*') {
|
|
43
|
+
if (glob[i + 1] === '*') {
|
|
44
|
+
// ** matches any number of directories
|
|
45
|
+
if (glob[i + 2] === '/') {
|
|
46
|
+
regex += '(?:.*/)?';
|
|
47
|
+
i += 3;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
regex += '.*';
|
|
51
|
+
i += 2;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// * matches anything except /
|
|
56
|
+
regex += '[^/]*';
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (ch === '?') {
|
|
61
|
+
regex += '[^/]';
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
else if (ch === '.') {
|
|
65
|
+
regex += '\\.';
|
|
66
|
+
i++;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
regex += ch;
|
|
70
|
+
i++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (dirOnly) {
|
|
74
|
+
regex += '(?:/.*)?';
|
|
75
|
+
}
|
|
76
|
+
// If not anchored and doesn't contain /, match basename anywhere
|
|
77
|
+
if (!anchored && !glob.includes('/')) {
|
|
78
|
+
return new RegExp(`(?:^|/)${regex}(?:$|/)`, 'i');
|
|
79
|
+
}
|
|
80
|
+
return new RegExp(`^${regex}(?:$|/)`, 'i');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load .shipsafeignore from a project directory and return a filter function.
|
|
84
|
+
* Returns a no-op filter if the file doesn't exist.
|
|
85
|
+
*/
|
|
86
|
+
export async function loadIgnoreFilter(projectDir) {
|
|
87
|
+
const ignorePath = join(projectDir, '.shipsafeignore');
|
|
88
|
+
let content;
|
|
89
|
+
try {
|
|
90
|
+
content = await readFile(ignorePath, 'utf-8');
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// No .shipsafeignore — nothing is ignored
|
|
94
|
+
return { isIgnored: () => false };
|
|
95
|
+
}
|
|
96
|
+
const rules = parseIgnorePatterns(content);
|
|
97
|
+
if (rules.length === 0) {
|
|
98
|
+
return { isIgnored: () => false };
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
isIgnored(filePath) {
|
|
102
|
+
// Normalize to relative path
|
|
103
|
+
const rel = relative(projectDir, filePath) || filePath;
|
|
104
|
+
let ignored = false;
|
|
105
|
+
for (const rule of rules) {
|
|
106
|
+
if (rule.pattern.test(rel)) {
|
|
107
|
+
ignored = !rule.negated;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return ignored;
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../../../src/engines/builtin/ignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/engines/builtin/patterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/engines/builtin/patterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AA+kExD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,OAAO,EAAE,CAAC,CAyCpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|