toolip 1.0.7 → 2.0.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 (174) hide show
  1. package/README.md +189 -448
  2. package/dist/src/analyzers/ast/ast-security-analyzer.d.ts +6 -0
  3. package/dist/src/analyzers/ast/ast-security-analyzer.js +64 -0
  4. package/dist/src/analyzers/ast/ast-security-analyzer.js.map +1 -0
  5. package/dist/src/analyzers/ast/rules.d.ts +48 -0
  6. package/dist/src/analyzers/ast/rules.js +39 -0
  7. package/dist/src/analyzers/ast/rules.js.map +1 -0
  8. package/dist/src/analyzers/ast/source-analysis.d.ts +2 -0
  9. package/dist/src/analyzers/ast/source-analysis.js +225 -0
  10. package/dist/src/analyzers/ast/source-analysis.js.map +1 -0
  11. package/dist/src/analyzers/dependency-confusion/analyzer.d.ts +9 -0
  12. package/dist/src/analyzers/dependency-confusion/analyzer.js +98 -0
  13. package/dist/src/analyzers/dependency-confusion/analyzer.js.map +1 -0
  14. package/dist/src/analyzers/docker/analyzer.d.ts +6 -0
  15. package/dist/src/analyzers/docker/analyzer.js +103 -0
  16. package/dist/src/analyzers/docker/analyzer.js.map +1 -0
  17. package/dist/src/analyzers/git-history/analyzer.d.ts +8 -0
  18. package/dist/src/analyzers/git-history/analyzer.js +157 -0
  19. package/dist/src/analyzers/git-history/analyzer.js.map +1 -0
  20. package/dist/src/analyzers/git-history/secret-patterns.d.ts +7 -0
  21. package/dist/src/analyzers/git-history/secret-patterns.js +33 -0
  22. package/dist/src/analyzers/git-history/secret-patterns.js.map +1 -0
  23. package/dist/src/analyzers/install-scripts/install-script-analyzer.d.ts +6 -0
  24. package/dist/src/analyzers/install-scripts/install-script-analyzer.js +135 -0
  25. package/dist/src/analyzers/install-scripts/install-script-analyzer.js.map +1 -0
  26. package/dist/src/analyzers/reachability/import-graph.d.ts +9 -0
  27. package/dist/src/analyzers/reachability/import-graph.js +110 -0
  28. package/dist/src/analyzers/reachability/import-graph.js.map +1 -0
  29. package/dist/src/analyzers/reachability/reachability-analyzer.d.ts +16 -0
  30. package/dist/src/analyzers/reachability/reachability-analyzer.js +95 -0
  31. package/dist/src/analyzers/reachability/reachability-analyzer.js.map +1 -0
  32. package/dist/src/analyzers/vulnerability/osv-analyzer.d.ts +9 -0
  33. package/dist/src/analyzers/vulnerability/osv-analyzer.js +94 -0
  34. package/dist/src/analyzers/vulnerability/osv-analyzer.js.map +1 -0
  35. package/dist/src/analyzers/vulnerability/severity.d.ts +3 -0
  36. package/dist/src/analyzers/vulnerability/severity.js +13 -0
  37. package/dist/src/analyzers/vulnerability/severity.js.map +1 -0
  38. package/dist/src/application/analyzer-runner.d.ts +12 -0
  39. package/dist/src/application/analyzer-runner.js +45 -0
  40. package/dist/src/application/analyzer-runner.js.map +1 -0
  41. package/dist/src/commands/announce.d.ts +2 -0
  42. package/dist/src/commands/announce.js +27 -0
  43. package/dist/src/commands/announce.js.map +1 -0
  44. package/dist/src/commands/ast-scan.d.ts +2 -0
  45. package/dist/src/commands/ast-scan.js +86 -0
  46. package/dist/src/commands/ast-scan.js.map +1 -0
  47. package/dist/src/commands/audit-repo.d.ts +2 -0
  48. package/dist/src/commands/audit-repo.js +20 -0
  49. package/dist/src/commands/audit-repo.js.map +1 -0
  50. package/dist/src/commands/config.d.ts +2 -0
  51. package/dist/src/commands/config.js +69 -0
  52. package/dist/src/commands/config.js.map +1 -0
  53. package/dist/src/commands/dependency-confusion.d.ts +2 -0
  54. package/dist/src/commands/dependency-confusion.js +37 -0
  55. package/dist/src/commands/dependency-confusion.js.map +1 -0
  56. package/dist/src/commands/diff.d.ts +2 -0
  57. package/dist/src/commands/diff.js +24 -0
  58. package/dist/src/commands/diff.js.map +1 -0
  59. package/dist/src/commands/docker-scan.d.ts +2 -0
  60. package/dist/src/commands/docker-scan.js +34 -0
  61. package/dist/src/commands/docker-scan.js.map +1 -0
  62. package/dist/src/commands/git-history.d.ts +2 -0
  63. package/dist/src/commands/git-history.js +40 -0
  64. package/dist/src/commands/git-history.js.map +1 -0
  65. package/dist/src/commands/history.d.ts +2 -0
  66. package/dist/src/commands/history.js +69 -0
  67. package/dist/src/commands/history.js.map +1 -0
  68. package/dist/src/commands/install-scripts.d.ts +2 -0
  69. package/dist/src/commands/install-scripts.js +52 -0
  70. package/dist/src/commands/install-scripts.js.map +1 -0
  71. package/dist/src/commands/mcp.d.ts +2 -0
  72. package/dist/src/commands/mcp.js +10 -0
  73. package/dist/src/commands/mcp.js.map +1 -0
  74. package/dist/src/commands/monorepo.d.ts +2 -0
  75. package/dist/src/commands/monorepo.js +21 -0
  76. package/dist/src/commands/monorepo.js.map +1 -0
  77. package/dist/src/commands/package-health.d.ts +2 -0
  78. package/dist/src/commands/package-health.js +50 -0
  79. package/dist/src/commands/package-health.js.map +1 -0
  80. package/dist/src/commands/publish.d.ts +2 -0
  81. package/dist/src/commands/publish.js +25 -0
  82. package/dist/src/commands/publish.js.map +1 -0
  83. package/dist/src/commands/reachability.d.ts +2 -0
  84. package/dist/src/commands/reachability.js +47 -0
  85. package/dist/src/commands/reachability.js.map +1 -0
  86. package/dist/src/commands/sbom.d.ts +2 -0
  87. package/dist/src/commands/sbom.js +33 -0
  88. package/dist/src/commands/sbom.js.map +1 -0
  89. package/dist/src/commands/upgrade-pr.d.ts +2 -0
  90. package/dist/src/commands/upgrade-pr.js +15 -0
  91. package/dist/src/commands/upgrade-pr.js.map +1 -0
  92. package/dist/src/commands/vulnerabilities.d.ts +2 -0
  93. package/dist/src/commands/vulnerabilities.js +42 -0
  94. package/dist/src/commands/vulnerabilities.js.map +1 -0
  95. package/dist/src/commands/watch.d.ts +2 -0
  96. package/dist/src/commands/watch.js +34 -0
  97. package/dist/src/commands/watch.js.map +1 -0
  98. package/dist/src/contracts/analyzer.d.ts +23 -0
  99. package/dist/src/contracts/analyzer.js +2 -0
  100. package/dist/src/contracts/analyzer.js.map +1 -0
  101. package/dist/src/contracts/finding.d.ts +35 -0
  102. package/dist/src/contracts/finding.js +13 -0
  103. package/dist/src/contracts/finding.js.map +1 -0
  104. package/dist/src/contracts/report.d.ts +30 -0
  105. package/dist/src/contracts/report.js +2 -0
  106. package/dist/src/contracts/report.js.map +1 -0
  107. package/dist/src/contracts/rule.d.ts +12 -0
  108. package/dist/src/contracts/rule.js +7 -0
  109. package/dist/src/contracts/rule.js.map +1 -0
  110. package/dist/src/core/announce/generate.d.ts +9 -0
  111. package/dist/src/core/announce/generate.js +19 -0
  112. package/dist/src/core/announce/generate.js.map +1 -0
  113. package/dist/src/core/config/load.d.ts +3 -0
  114. package/dist/src/core/config/load.js +21 -0
  115. package/dist/src/core/config/load.js.map +1 -0
  116. package/dist/src/core/config/policy.d.ts +3 -0
  117. package/dist/src/core/config/policy.js +48 -0
  118. package/dist/src/core/config/policy.js.map +1 -0
  119. package/dist/src/core/config/schema.d.ts +172 -0
  120. package/dist/src/core/config/schema.js +84 -0
  121. package/dist/src/core/config/schema.js.map +1 -0
  122. package/dist/src/core/dependencies/inventory.d.ts +9 -0
  123. package/dist/src/core/dependencies/inventory.js +43 -0
  124. package/dist/src/core/dependencies/inventory.js.map +1 -0
  125. package/dist/src/core/diff/security-diff.d.ts +10 -0
  126. package/dist/src/core/diff/security-diff.js +20 -0
  127. package/dist/src/core/diff/security-diff.js.map +1 -0
  128. package/dist/src/core/github/remote-audit.d.ts +5 -0
  129. package/dist/src/core/github/remote-audit.js +28 -0
  130. package/dist/src/core/github/remote-audit.js.map +1 -0
  131. package/dist/src/core/github/upgrade-pr.d.ts +4 -0
  132. package/dist/src/core/github/upgrade-pr.js +41 -0
  133. package/dist/src/core/github/upgrade-pr.js.map +1 -0
  134. package/dist/src/core/history/git-metadata.d.ts +5 -0
  135. package/dist/src/core/history/git-metadata.js +37 -0
  136. package/dist/src/core/history/git-metadata.js.map +1 -0
  137. package/dist/src/core/history/store.d.ts +5 -0
  138. package/dist/src/core/history/store.js +65 -0
  139. package/dist/src/core/history/store.js.map +1 -0
  140. package/dist/src/core/history/types.d.ts +27 -0
  141. package/dist/src/core/history/types.js +2 -0
  142. package/dist/src/core/history/types.js.map +1 -0
  143. package/dist/src/core/monorepo/discover.d.ts +7 -0
  144. package/dist/src/core/monorepo/discover.js +49 -0
  145. package/dist/src/core/monorepo/discover.js.map +1 -0
  146. package/dist/src/core/publish/html.d.ts +6 -0
  147. package/dist/src/core/publish/html.js +44 -0
  148. package/dist/src/core/publish/html.js.map +1 -0
  149. package/dist/src/core/sbom/generate.d.ts +2 -0
  150. package/dist/src/core/sbom/generate.js +120 -0
  151. package/dist/src/core/sbom/generate.js.map +1 -0
  152. package/dist/src/core/security-doctor.js +19 -5
  153. package/dist/src/core/security-doctor.js.map +1 -1
  154. package/dist/src/core/watch/watch.d.ts +5 -0
  155. package/dist/src/core/watch/watch.js +49 -0
  156. package/dist/src/core/watch/watch.js.map +1 -0
  157. package/dist/src/index.js +38 -0
  158. package/dist/src/index.js.map +1 -1
  159. package/dist/src/mcp/server.d.ts +1 -0
  160. package/dist/src/mcp/server.js +64 -0
  161. package/dist/src/mcp/server.js.map +1 -0
  162. package/dist/src/providers/depsdev/client.d.ts +71 -0
  163. package/dist/src/providers/depsdev/client.js +44 -0
  164. package/dist/src/providers/depsdev/client.js.map +1 -0
  165. package/dist/src/providers/osv/client.d.ts +15 -0
  166. package/dist/src/providers/osv/client.js +51 -0
  167. package/dist/src/providers/osv/client.js.map +1 -0
  168. package/dist/src/providers/osv/types.d.ts +38 -0
  169. package/dist/src/providers/osv/types.js +2 -0
  170. package/dist/src/providers/osv/types.js.map +1 -0
  171. package/dist/src/storage/memory-cache.d.ts +7 -0
  172. package/dist/src/storage/memory-cache.js +25 -0
  173. package/dist/src/storage/memory-cache.js.map +1 -0
  174. package/package.json +5 -3
@@ -0,0 +1,5 @@
1
+ export declare function readGitMetadata(root: string): Promise<{
2
+ branch?: string;
3
+ commit?: string;
4
+ dirty?: boolean;
5
+ }>;
@@ -0,0 +1,37 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const execFileAsync = promisify(execFile);
4
+ async function git(root, args) {
5
+ try {
6
+ const { stdout } = await execFileAsync('git', args, {
7
+ cwd: root,
8
+ encoding: 'utf8'
9
+ });
10
+ return stdout.trim() || undefined;
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ export async function readGitMetadata(root) {
17
+ const branch = await git(root, [
18
+ 'branch',
19
+ '--show-current'
20
+ ]);
21
+ const commit = await git(root, [
22
+ 'rev-parse',
23
+ 'HEAD'
24
+ ]);
25
+ const status = await git(root, [
26
+ 'status',
27
+ '--porcelain'
28
+ ]);
29
+ return {
30
+ branch,
31
+ commit,
32
+ dirty: status === undefined
33
+ ? undefined
34
+ : status.length > 0
35
+ };
36
+ }
37
+ //# sourceMappingURL=git-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-metadata.js","sourceRoot":"","sources":["../../../../src/core/history/git-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,KAAK,UAAU,GAAG,CAChB,IAAY,EACZ,IAAc;IAEd,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,IAAI,EACJ;YACE,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,MAAM;SACjB,CACF,CAAC;QAEF,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY;IAMZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;QAC7B,QAAQ;QACR,gBAAgB;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;QAC7B,WAAW;QACX,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;QAC7B,QAAQ;QACR,aAAa;KACd,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,MAAM;QACN,KAAK,EACH,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { HistoryEntry, HistoryStore } from './types.js';
2
+ export declare function historyFilePath(root: string): string;
3
+ export declare function readHistory(root: string): Promise<HistoryStore>;
4
+ export declare function appendHistory(root: string, entry: HistoryEntry, maxEntries?: number): Promise<void>;
5
+ export declare function clearHistory(root: string): Promise<void>;
@@ -0,0 +1,65 @@
1
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ const schemaVersion = '1.0';
4
+ export function historyFilePath(root) {
5
+ return path.join(root, '.toolip', 'history.json');
6
+ }
7
+ export async function readHistory(root) {
8
+ const filePath = historyFilePath(root);
9
+ try {
10
+ const raw = await readFile(filePath, 'utf8');
11
+ const parsed = JSON.parse(raw);
12
+ if (parsed.schemaVersion !== schemaVersion ||
13
+ !Array.isArray(parsed.entries)) {
14
+ throw new Error('Unsupported Toolip history schema.');
15
+ }
16
+ return parsed;
17
+ }
18
+ catch (error) {
19
+ if (error instanceof Error &&
20
+ 'code' in error &&
21
+ error.code === 'ENOENT') {
22
+ return {
23
+ schemaVersion,
24
+ entries: []
25
+ };
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ export async function appendHistory(root, entry, maxEntries = 500) {
31
+ const filePath = historyFilePath(root);
32
+ const directory = path.dirname(filePath);
33
+ const temporary = `${filePath}.tmp`;
34
+ await mkdir(directory, {
35
+ recursive: true
36
+ });
37
+ const current = await readHistory(root);
38
+ const entries = [
39
+ ...current.entries,
40
+ entry
41
+ ].slice(-Math.max(1, maxEntries));
42
+ await writeFile(temporary, `${JSON.stringify({
43
+ schemaVersion,
44
+ entries
45
+ }, null, 2)}\n`, {
46
+ encoding: 'utf8',
47
+ mode: 0o600
48
+ });
49
+ await rename(temporary, filePath);
50
+ }
51
+ export async function clearHistory(root) {
52
+ const filePath = historyFilePath(root);
53
+ const directory = path.dirname(filePath);
54
+ await mkdir(directory, {
55
+ recursive: true
56
+ });
57
+ await writeFile(filePath, `${JSON.stringify({
58
+ schemaVersion,
59
+ entries: []
60
+ }, null, 2)}\n`, {
61
+ encoding: 'utf8',
62
+ mode: 0o600
63
+ });
64
+ }
65
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/core/history/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,aAAa,GAAG,KAAc,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY;IAEZ,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QAE/C,IACE,MAAM,CAAC,aAAa,KAAK,aAAa;YACtC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAC9B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,oCAAoC,CACrC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACf,KAAK,CAAC,IAAI,KAAK,QAAQ,EACvB,CAAC;YACD,OAAO;gBACL,aAAa;gBACb,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,KAAmB,EACnB,UAAU,GAAG,GAAG;IAEhB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,GAAG,QAAQ,MAAM,CAAC;IAEpC,MAAM,KAAK,CAAC,SAAS,EAAE;QACrB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG;QACd,GAAG,OAAO,CAAC,OAAO;QAClB,KAAK;KACN,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAElC,MAAM,SAAS,CACb,SAAS,EACT,GAAG,IAAI,CAAC,SAAS,CACf;QACE,aAAa;QACb,OAAO;KACe,EACxB,IAAI,EACJ,CAAC,CACF,IAAI,EACL;QACE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CACF,CAAC;IAEF,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY;IAEZ,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEzC,MAAM,KAAK,CAAC,SAAS,EAAE;QACrB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,SAAS,CACb,QAAQ,EACR,GAAG,IAAI,CAAC,SAAS,CACf;QACE,aAAa;QACb,OAAO,EAAE,EAAE;KACW,EACxB,IAAI,EACJ,CAAC,CACF,IAAI,EACL;QACE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ export type HistorySummary = {
2
+ critical: number;
3
+ high: number;
4
+ medium: number;
5
+ low: number;
6
+ info: number;
7
+ total: number;
8
+ };
9
+ export type HistoryEntry = {
10
+ id: string;
11
+ createdAt: string;
12
+ toolipVersion: string;
13
+ command: string;
14
+ git?: {
15
+ branch?: string;
16
+ commit?: string;
17
+ dirty?: boolean;
18
+ };
19
+ score?: number;
20
+ summary: HistorySummary;
21
+ findingIds: string[];
22
+ metadata?: Record<string, unknown>;
23
+ };
24
+ export type HistoryStore = {
25
+ schemaVersion: '1.0';
26
+ entries: HistoryEntry[];
27
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/history/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export type WorkspaceProject = {
2
+ root: string;
3
+ relativePath: string;
4
+ name?: string;
5
+ version?: string;
6
+ };
7
+ export declare function discoverWorkspaces(root: string): Promise<WorkspaceProject[]>;
@@ -0,0 +1,49 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import fg from 'fast-glob';
4
+ async function patterns(root) {
5
+ const manifest = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8'));
6
+ if (Array.isArray(manifest.workspaces)) {
7
+ return manifest.workspaces;
8
+ }
9
+ if (Array.isArray(manifest.workspaces?.packages)) {
10
+ return manifest.workspaces.packages;
11
+ }
12
+ try {
13
+ const yaml = await readFile(path.join(root, 'pnpm-workspace.yaml'), 'utf8');
14
+ return yaml
15
+ .split(/\r?\n/)
16
+ .map((line) => line.match(/^\s*-\s*['"]?([^'"]+)['"]?\s*$/)?.[1])
17
+ .filter((value) => Boolean(value));
18
+ }
19
+ catch {
20
+ return [];
21
+ }
22
+ }
23
+ export async function discoverWorkspaces(root) {
24
+ const workspacePatterns = await patterns(root);
25
+ if (workspacePatterns.length === 0) {
26
+ return [{
27
+ root,
28
+ relativePath: '.'
29
+ }];
30
+ }
31
+ const manifests = await fg(workspacePatterns.map((pattern) => `${pattern.replace(/\/$/, '')}/package.json`), {
32
+ cwd: root,
33
+ absolute: false,
34
+ onlyFiles: true,
35
+ ignore: ['**/node_modules/**', '**/dist/**']
36
+ });
37
+ return Promise.all(manifests.sort().map(async (manifestPath) => {
38
+ const absolute = path.join(root, manifestPath);
39
+ const manifest = JSON.parse(await readFile(absolute, 'utf8'));
40
+ const workspaceRoot = path.dirname(absolute);
41
+ return {
42
+ root: workspaceRoot,
43
+ relativePath: path.relative(root, workspaceRoot) || '.',
44
+ name: manifest.name,
45
+ version: manifest.version
46
+ };
47
+ }));
48
+ }
49
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../../src/core/monorepo/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,WAAW,CAAC;AAe3B,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACxC,CAAC;IAElB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5E,OAAO,IAAI;aACR,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChE,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/C,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC;gBACN,IAAI;gBACJ,YAAY,EAAE,GAAG;aAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,EAAE,CACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,EAChF;QACE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;KAC7C,CACF,CAAC;IAEF,OAAO,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAG3D,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE7C,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,GAAG;YACvD,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ToolipFinding } from '../report.js';
2
+ export declare function renderHtmlReport(input: {
3
+ project: string;
4
+ generatedAt: string;
5
+ findings: ToolipFinding[];
6
+ }): string;
@@ -0,0 +1,44 @@
1
+ function escapeHtml(value) {
2
+ return value
3
+ .replaceAll('&', '&amp;')
4
+ .replaceAll('<', '&lt;')
5
+ .replaceAll('>', '&gt;')
6
+ .replaceAll('"', '&quot;')
7
+ .replaceAll("'", '&#039;');
8
+ }
9
+ export function renderHtmlReport(input) {
10
+ const rows = input.findings.map((finding) => `
11
+ <tr>
12
+ <td>${escapeHtml(finding.severity)}</td>
13
+ <td>${escapeHtml(finding.title)}</td>
14
+ <td>${escapeHtml(finding.file ?? '')}</td>
15
+ <td>${escapeHtml(finding.recommendation)}</td>
16
+ </tr>
17
+ `).join('');
18
+ return `<!doctype html>
19
+ <html lang="en">
20
+ <head>
21
+ <meta charset="utf-8">
22
+ <meta name="viewport" content="width=device-width,initial-scale=1">
23
+ <title>Toolip Security Report</title>
24
+ <style>
25
+ body{font-family:system-ui,sans-serif;max-width:1100px;margin:40px auto;padding:0 20px;color:#111}
26
+ table{width:100%;border-collapse:collapse}
27
+ th,td{border:1px solid #ddd;padding:10px;text-align:left;vertical-align:top}
28
+ th{background:#f5f5f5}
29
+ code{font-family:ui-monospace,monospace}
30
+ </style>
31
+ </head>
32
+ <body>
33
+ <h1>Toolip Security Report</h1>
34
+ <p><strong>Project:</strong> ${escapeHtml(input.project)}</p>
35
+ <p><strong>Generated:</strong> ${escapeHtml(input.generatedAt)}</p>
36
+ <p><strong>Findings:</strong> ${input.findings.length}</p>
37
+ <table>
38
+ <thead><tr><th>Severity</th><th>Finding</th><th>File</th><th>Recommendation</th></tr></thead>
39
+ <tbody>${rows}</tbody>
40
+ </table>
41
+ </body>
42
+ </html>`;
43
+ }
44
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../../src/core/publish/html.ts"],"names":[],"mappings":"AAEA,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAIhC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;;YAEnC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5B,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;YACzB,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC;;GAE3C,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;;;;;;;;;;;+BAgBsB,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;iCACvB,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;gCAC9B,KAAK,CAAC,QAAQ,CAAC,MAAM;;;SAG5C,IAAI;;;QAGL,CAAC;AACT,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type SbomFormat = 'cyclonedx' | 'spdx';
2
+ export declare function generateSbom(root: string, format: SbomFormat): Promise<Record<string, unknown>>;
@@ -0,0 +1,120 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { readNpmDependencyInventory } from '../dependencies/inventory.js';
5
+ function purl(dependency) {
6
+ return (`pkg:npm/${encodeURIComponent(dependency.name)}@${encodeURIComponent(dependency.version)}`);
7
+ }
8
+ function bomRef(dependency) {
9
+ return purl(dependency);
10
+ }
11
+ function spdxId(value) {
12
+ return ('SPDXRef-' +
13
+ value.replaceAll(/[^A-Za-z0-9.-]/g, '-'));
14
+ }
15
+ function namespace(name, version) {
16
+ const digest = createHash('sha256')
17
+ .update(`${name}@${version}:${Date.now()}`)
18
+ .digest('hex')
19
+ .slice(0, 24);
20
+ return `https://toolip.dev/spdx/${encodeURIComponent(name)}/${version}/${digest}`;
21
+ }
22
+ export async function generateSbom(root, format) {
23
+ const manifest = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8'));
24
+ const dependencies = await readNpmDependencyInventory(root);
25
+ const rootName = manifest.name ?? 'unknown-project';
26
+ const rootVersion = manifest.version ?? '0.0.0';
27
+ if (format === 'cyclonedx') {
28
+ return {
29
+ bomFormat: 'CycloneDX',
30
+ specVersion: '1.5',
31
+ serialNumber: `urn:uuid:${crypto.randomUUID()}`,
32
+ version: 1,
33
+ metadata: {
34
+ timestamp: new Date().toISOString(),
35
+ tools: [
36
+ {
37
+ vendor: 'Toolip',
38
+ name: 'toolip'
39
+ }
40
+ ],
41
+ component: {
42
+ type: 'application',
43
+ name: rootName,
44
+ version: rootVersion,
45
+ description: manifest.description
46
+ }
47
+ },
48
+ components: dependencies.map((dependency) => ({
49
+ type: 'library',
50
+ 'bom-ref': bomRef(dependency),
51
+ name: dependency.name,
52
+ version: dependency.version,
53
+ scope: dependency.development
54
+ ? 'optional'
55
+ : 'required',
56
+ purl: purl(dependency),
57
+ properties: [
58
+ {
59
+ name: 'toolip:direct',
60
+ value: String(dependency.direct)
61
+ },
62
+ {
63
+ name: 'toolip:development',
64
+ value: String(dependency.development)
65
+ }
66
+ ]
67
+ })),
68
+ dependencies: dependencies.map((dependency) => ({
69
+ ref: bomRef(dependency),
70
+ dependsOn: []
71
+ }))
72
+ };
73
+ }
74
+ const documentId = 'SPDXRef-DOCUMENT';
75
+ const rootId = spdxId(`${rootName}-${rootVersion}`);
76
+ return {
77
+ spdxVersion: 'SPDX-2.3',
78
+ dataLicense: 'CC0-1.0',
79
+ SPDXID: documentId,
80
+ name: `${rootName}-${rootVersion}`,
81
+ documentNamespace: namespace(rootName, rootVersion),
82
+ creationInfo: {
83
+ created: new Date().toISOString(),
84
+ creators: ['Tool: Toolip']
85
+ },
86
+ packages: [
87
+ {
88
+ name: rootName,
89
+ SPDXID: rootId,
90
+ versionInfo: rootVersion,
91
+ downloadLocation: 'NOASSERTION',
92
+ filesAnalyzed: false,
93
+ licenseConcluded: manifest.license ?? 'NOASSERTION',
94
+ licenseDeclared: manifest.license ?? 'NOASSERTION'
95
+ },
96
+ ...dependencies.map((dependency) => ({
97
+ name: dependency.name,
98
+ SPDXID: spdxId(`${dependency.name}-${dependency.version}`),
99
+ versionInfo: dependency.version,
100
+ downloadLocation: 'NOASSERTION',
101
+ filesAnalyzed: false,
102
+ licenseConcluded: 'NOASSERTION',
103
+ licenseDeclared: 'NOASSERTION',
104
+ externalRefs: [
105
+ {
106
+ referenceCategory: 'PACKAGE-MANAGER',
107
+ referenceType: 'purl',
108
+ referenceLocator: purl(dependency)
109
+ }
110
+ ]
111
+ }))
112
+ ],
113
+ relationships: dependencies.map((dependency) => ({
114
+ spdxElementId: rootId,
115
+ relationshipType: 'DEPENDS_ON',
116
+ relatedSpdxElement: spdxId(`${dependency.name}-${dependency.version}`)
117
+ }))
118
+ };
119
+ }
120
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/core/sbom/generate.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { readFile } from 'node:fs/promises';
2
+ import { analyzeAstSource } from '../analyzers/ast/source-analysis.js';
2
3
  import { createScannerContext } from './scanner-context.js';
3
- import { configSecurityPatterns, dangerousCodePatterns, secretPatterns, securityHeaderNames } from './security-patterns.js';
4
+ import { configSecurityPatterns, secretPatterns, securityHeaderNames } from './security-patterns.js';
4
5
  const secretScanExtensions = new Set([
5
6
  'js',
6
7
  'jsx',
@@ -40,7 +41,17 @@ export async function runSecurityDoctor(root) {
40
41
  }
41
42
  findings.push(...scanContent(file.relativePath, content, secretPatterns));
42
43
  if (codeExtensions.has(file.extension)) {
43
- findings.push(...scanContent(file.relativePath, content, dangerousCodePatterns));
44
+ findings.push(...analyzeAstSource(file.relativePath, content).map((finding) => ({
45
+ id: finding.id,
46
+ title: finding.title,
47
+ severity: finding.severity,
48
+ category: finding.category,
49
+ message: finding.message,
50
+ recommendation: finding.remediation?.summary ??
51
+ 'Review the resolved AST finding.',
52
+ file: finding.location?.file,
53
+ evidence: finding.evidence?.[0]?.summary
54
+ })));
44
55
  findings.push(...scanContent(file.relativePath, content, configSecurityPatterns));
45
56
  }
46
57
  }
@@ -100,19 +111,22 @@ function isTestFile(relativePath) {
100
111
  /\.(test|spec)\.[cm]?[jt]sx?$/.test(relativePath));
101
112
  }
102
113
  function resolveSeverity(pattern, relativePath) {
103
- if (pattern.category === 'secrets' && isTestFile(relativePath)) {
114
+ if (pattern.category === 'secrets' &&
115
+ isTestFile(relativePath)) {
104
116
  return 'low';
105
117
  }
106
118
  return pattern.severity;
107
119
  }
108
120
  function formatTitle(pattern, relativePath) {
109
- if (pattern.category === 'secrets' && isTestFile(relativePath)) {
121
+ if (pattern.category === 'secrets' &&
122
+ isTestFile(relativePath)) {
110
123
  return `Potential test fixture: ${pattern.title}`;
111
124
  }
112
125
  return pattern.title;
113
126
  }
114
127
  function formatMessage(pattern, relativePath) {
115
- if (pattern.category === 'secrets' && isTestFile(relativePath)) {
128
+ if (pattern.category === 'secrets' &&
129
+ isTestFile(relativePath)) {
116
130
  return `${pattern.message} This match is inside a test file, so Toolip reduced its severity. Confirm that it is synthetic fixture data.`;
117
131
  }
118
132
  return pattern.message;
@@ -1 +1 @@
1
- {"version":3,"file":"security-doctor.js","sourceRoot":"","sources":["../../../src/core/security-doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAahC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY;IAEZ,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CACX,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC,CAC3D,CAAC;QAEF,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CACX,GAAG,WAAW,CACZ,IAAI,CAAC,YAAY,EACjB,OAAO,EACP,qBAAqB,CACtB,CACF,CAAC;YAEF,QAAQ,CAAC,IAAI,CACX,GAAG,WAAW,CACZ,IAAI,CAAC,YAAY,EACjB,OAAO,EACP,sBAAsB,CACvB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CACX,GAAG,4BAA4B,CAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAC/C,CACF,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,OAAO,EAAE;YACP,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YAClC,OAAO,EAAE,QAAQ,CAAC,MAAM,CACtB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAC5C,CAAC,MAAM;YACR,aAAa,EAAE,QAAQ,CAAC,MAAM,CAC5B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,gBAAgB,CACnD,CAAC,MAAM;YACR,aAAa,EAAE,QAAQ,CAAC,MAAM,CAC5B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,CAClD,CAAC,MAAM;YACR,OAAO,EAAE,QAAQ,CAAC,MAAM,CACtB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,kBAAkB,CACrD,CAAC,MAAM;SACT;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAoB,EACpB,SAAiB;IAEjB,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhD,OAAO,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,WAAW,CAClB,YAAoB,EACpB,OAAe,EACf,QAA2B;IAE3B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,YAAY;iBAC9B,WAAW,EAAE;iBACb,UAAU,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE;YAClC,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC;YACzC,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC;YAChD,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC;YAC7C,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB;IACtC,OAAO,CACL,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpC,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,OAAwB,EACxB,YAAoB;IAEpB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAClB,OAAwB,EACxB,YAAoB;IAEpB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,OAAO,2BAA2B,OAAO,CAAC,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CACpB,OAAwB,EACxB,YAAoB;IAEpB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,OAAO,CAAC,OAAO,+GAA+G,CAAC;IAC3I,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,4BAA4B,CACnC,aAAuB;IAEvB,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACzB,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9C,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1C,CAAC;IAEF,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,EAAE,wBAAwB,MAAM;aAC/B,WAAW,EAAE;aACb,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;QACzB,KAAK,EAAE,2BAA2B,MAAM,EAAE;QAC1C,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,gDAAgD,MAAM,yCAAyC;QACxG,cAAc,EACZ,oFAAoF;KACvF,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"security-doctor.js","sourceRoot":"","sources":["../../../src/core/security-doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type WatchOptions = {
2
+ debounceMs?: number;
3
+ ignored?: RegExp[];
4
+ };
5
+ export declare function watchProject(root: string, onChange: () => Promise<void>, options?: WatchOptions): () => void;
@@ -0,0 +1,49 @@
1
+ import { watch } from 'node:fs';
2
+ import path from 'node:path';
3
+ export function watchProject(root, onChange, options = {}) {
4
+ const debounceMs = options.debounceMs ?? 500;
5
+ const ignored = options.ignored ?? [
6
+ /(^|\/)node_modules(\/|$)/,
7
+ /(^|\/)\.git(\/|$)/,
8
+ /(^|\/)dist(\/|$)/,
9
+ /(^|\/)\.toolip-report(\/|$)/
10
+ ];
11
+ let timer;
12
+ let running = false;
13
+ let queued = false;
14
+ const run = async () => {
15
+ if (running) {
16
+ queued = true;
17
+ return;
18
+ }
19
+ running = true;
20
+ try {
21
+ await onChange();
22
+ }
23
+ finally {
24
+ running = false;
25
+ if (queued) {
26
+ queued = false;
27
+ await run();
28
+ }
29
+ }
30
+ };
31
+ const watcher = watch(root, { recursive: true }, (_event, filename) => {
32
+ if (!filename)
33
+ return;
34
+ const normalized = filename.toString().replaceAll(path.sep, '/');
35
+ if (ignored.some((pattern) => pattern.test(normalized)))
36
+ return;
37
+ if (timer)
38
+ clearTimeout(timer);
39
+ timer = setTimeout(() => {
40
+ void run();
41
+ }, debounceMs);
42
+ });
43
+ return () => {
44
+ if (timer)
45
+ clearTimeout(timer);
46
+ watcher.close();
47
+ };
48
+ }
49
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../../src/core/watch/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,QAA6B,EAC7B,UAAwB,EAAE;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI;QACjC,0BAA0B;QAC1B,mBAAmB;QACnB,kBAAkB;QAClB,6BAA6B;KAC9B,CAAC;IAEF,IAAI,KAAiC,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,GAAG,GAAG,KAAK,IAAmB,EAAE;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,CAAC;YACd,OAAO;QACT,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,QAAQ,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAC;YAEhB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,KAAK,CAAC;gBACf,MAAM,GAAG,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpE,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAAE,OAAO;QAEhE,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,KAAK,GAAG,EAAE,CAAC;QACb,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
package/dist/src/index.js CHANGED
@@ -18,6 +18,25 @@ import { registerTreeCommand } from './commands/tree.js';
18
18
  import { registerVaultCommand } from './commands/vault.js';
19
19
  import { TOOLIP_AUTHOR, TOOLIP_VERSION } from './config/version.js';
20
20
  import { handleError } from './utils/error-handler.js';
21
+ import { registerVulnerabilitiesCommand } from './commands/vulnerabilities.js';
22
+ import { registerAstScanCommand } from './commands/ast-scan.js';
23
+ import { registerReachabilityCommand } from './commands/reachability.js';
24
+ import { registerInstallScriptsCommand } from './commands/install-scripts.js';
25
+ import { registerSbomCommand } from './commands/sbom.js';
26
+ import { registerHistoryCommand } from './commands/history.js';
27
+ import { registerConfigCommand } from './commands/config.js';
28
+ import { registerPackageHealthCommand } from './commands/package-health.js';
29
+ import { registerDependencyConfusionCommand } from './commands/dependency-confusion.js';
30
+ import { registerGitHistoryCommand } from './commands/git-history.js';
31
+ import { registerDockerScanCommand } from './commands/docker-scan.js';
32
+ import { registerMonorepoCommand } from './commands/monorepo.js';
33
+ import { registerAuditRepoCommand } from './commands/audit-repo.js';
34
+ import { registerUpgradePrCommand } from './commands/upgrade-pr.js';
35
+ import { registerDiffCommand } from './commands/diff.js';
36
+ import { registerPublishCommand } from './commands/publish.js';
37
+ import { registerWatchCommand } from './commands/watch.js';
38
+ import { registerAnnounceCommand } from './commands/announce.js';
39
+ import { registerMcpCommand } from './commands/mcp.js';
21
40
  const program = new Command();
22
41
  program
23
42
  .name('toolip')
@@ -43,6 +62,25 @@ program.addHelpText('after', `
43
62
  ${chalk.dim(`Built by ${TOOLIP_AUTHOR.name} (${TOOLIP_AUTHOR.handle}) — ${TOOLIP_AUTHOR.github}`)}`);
44
63
  program.exitOverride();
45
64
  try {
65
+ registerVulnerabilitiesCommand(program);
66
+ registerAstScanCommand(program);
67
+ registerReachabilityCommand(program);
68
+ registerInstallScriptsCommand(program);
69
+ registerSbomCommand(program);
70
+ registerHistoryCommand(program);
71
+ registerConfigCommand(program);
72
+ registerPackageHealthCommand(program);
73
+ registerDependencyConfusionCommand(program);
74
+ registerGitHistoryCommand(program);
75
+ registerDockerScanCommand(program);
76
+ registerMonorepoCommand(program);
77
+ registerAuditRepoCommand(program);
78
+ registerUpgradePrCommand(program);
79
+ registerDiffCommand(program);
80
+ registerPublishCommand(program);
81
+ registerWatchCommand(program);
82
+ registerAnnounceCommand(program);
83
+ registerMcpCommand(program);
46
84
  await program.parseAsync(process.argv);
47
85
  }
48
86
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACV,sFAAsF,CACvF;KACA,OAAO,CAAC,cAAc,CAAC,CAAC;AAE3B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,2BAA2B,CAAC,OAAO,CAAC,CAAC;AACrC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,OAAO,CAAC,WAAW,CACjB,OAAO,EACP;;EAEA,KAAK,CAAC,GAAG,CACT,YAAY,aAAa,CAAC,IAAI,KAAK,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,MAAM,EAAE,CACrF,EAAE,CACF,CAAC;AAEF,OAAO,CAAC,YAAY,EAAE,CAAC;AAEvB,IAAI,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,WAAW,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startMcpServer(): Promise<void>;