@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.
Files changed (46) hide show
  1. package/dist/bin/shipsafe.js +2 -0
  2. package/dist/bin/shipsafe.js.map +1 -1
  3. package/dist/src/claude-md/manager.d.ts.map +1 -1
  4. package/dist/src/claude-md/manager.js +2 -34
  5. package/dist/src/claude-md/manager.js.map +1 -1
  6. package/dist/src/cli/baseline.d.ts +3 -0
  7. package/dist/src/cli/baseline.d.ts.map +1 -0
  8. package/dist/src/cli/baseline.js +67 -0
  9. package/dist/src/cli/baseline.js.map +1 -0
  10. package/dist/src/cli/init.d.ts.map +1 -1
  11. package/dist/src/cli/init.js +29 -7
  12. package/dist/src/cli/init.js.map +1 -1
  13. package/dist/src/cli/scan.d.ts.map +1 -1
  14. package/dist/src/cli/scan.js +16 -1
  15. package/dist/src/cli/scan.js.map +1 -1
  16. package/dist/src/engines/builtin/baseline.d.ts +41 -0
  17. package/dist/src/engines/builtin/baseline.d.ts.map +1 -0
  18. package/dist/src/engines/builtin/baseline.js +83 -0
  19. package/dist/src/engines/builtin/baseline.js.map +1 -0
  20. package/dist/src/engines/builtin/gitignore.d.ts +33 -0
  21. package/dist/src/engines/builtin/gitignore.d.ts.map +1 -0
  22. package/dist/src/engines/builtin/gitignore.js +83 -0
  23. package/dist/src/engines/builtin/gitignore.js.map +1 -0
  24. package/dist/src/engines/builtin/ignore.d.ts +14 -0
  25. package/dist/src/engines/builtin/ignore.d.ts.map +1 -0
  26. package/dist/src/engines/builtin/ignore.js +114 -0
  27. package/dist/src/engines/builtin/ignore.js.map +1 -0
  28. package/dist/src/engines/builtin/patterns.d.ts.map +1 -1
  29. package/dist/src/engines/builtin/patterns.js +990 -49
  30. package/dist/src/engines/builtin/patterns.js.map +1 -1
  31. package/dist/src/engines/builtin/secrets.d.ts.map +1 -1
  32. package/dist/src/engines/builtin/secrets.js +50 -7
  33. package/dist/src/engines/builtin/secrets.js.map +1 -1
  34. package/dist/src/engines/pattern/index.d.ts.map +1 -1
  35. package/dist/src/engines/pattern/index.js +26 -9
  36. package/dist/src/engines/pattern/index.js.map +1 -1
  37. package/dist/src/mcp/tools/scan.d.ts.map +1 -1
  38. package/dist/src/mcp/tools/scan.js +11 -0
  39. package/dist/src/mcp/tools/scan.js.map +1 -1
  40. package/dist/src/scripts/postinstall.d.ts +10 -0
  41. package/dist/src/scripts/postinstall.d.ts.map +1 -0
  42. package/dist/src/scripts/postinstall.js +109 -0
  43. package/dist/src/scripts/postinstall.js.map +1 -0
  44. package/dist/src/types.d.ts +6 -0
  45. package/dist/src/types.d.ts.map +1 -1
  46. 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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAO3C;;;GAGG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAiD,EAAE,CAAC;IAE/D,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,gCAAgC;QAChC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,gCAAgC;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,QAAQ;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,kEAAkE;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAO;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,uCAAuC;gBACvC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,KAAK,IAAI,UAAU,CAAC;oBACpB,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,KAAK,IAAI,IAAI,CAAC;oBACd,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,8BAA8B;gBAC9B,KAAK,IAAI,OAAO,CAAC;gBACjB,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,IAAI,MAAM,CAAC;YAChB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,IAAI,KAAK,CAAC;YACf,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,EAAE,CAAC;YACZ,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,IAAI,UAAU,CAAC;IACtB,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAEvD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,OAAO;QACL,SAAS,CAAC,QAAgB;YACxB,6BAA6B;YAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC;YAEvD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -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;AA6lCxD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,OAAO,EAAE,CAAC,CA8BpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
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"}