@monoes/monomindcli 2.11.0 → 2.11.2

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 (165) hide show
  1. package/.claude/commands/coordination/agent-spawn.md +1 -1
  2. package/.claude/commands/mastermind/review.md +1 -1
  3. package/.claude/helpers/statusline.cjs +9 -4
  4. package/.claude/helpers/token-tracker.cjs +5 -2
  5. package/.claude/skills/mastermind-adapters/SKILL.md +6 -5
  6. package/.claude/skills/mastermind-agents/SKILL.md +7 -6
  7. package/.claude/skills/mastermind-createorg/SKILL.md +43 -16
  8. package/.claude/skills/mastermind-env/SKILL.md +1 -1
  9. package/.claude/skills/mastermind-invite-landing/SKILL.md +1 -1
  10. package/.claude/skills/mastermind-new-agent/SKILL.md +5 -5
  11. package/.claude/skills/mastermind-review/SKILL.md +1 -1
  12. package/.claude/skills/monomind/browse.md +1 -1
  13. package/bin/cli.js +60 -2
  14. package/dist/src/capabilities/cap-code.d.ts.map +1 -1
  15. package/dist/src/capabilities/cap-code.js +65 -3
  16. package/dist/src/capabilities/cap-code.js.map +1 -1
  17. package/dist/src/commands/analyze-diff.d.ts.map +1 -1
  18. package/dist/src/commands/analyze-diff.js +16 -6
  19. package/dist/src/commands/analyze-diff.js.map +1 -1
  20. package/dist/src/commands/autopilot.d.ts.map +1 -1
  21. package/dist/src/commands/autopilot.js +8 -1
  22. package/dist/src/commands/autopilot.js.map +1 -1
  23. package/dist/src/commands/config.d.ts.map +1 -1
  24. package/dist/src/commands/config.js +10 -4
  25. package/dist/src/commands/config.js.map +1 -1
  26. package/dist/src/commands/mcp.d.ts.map +1 -1
  27. package/dist/src/commands/mcp.js +7 -1
  28. package/dist/src/commands/mcp.js.map +1 -1
  29. package/dist/src/commands/monograph.d.ts.map +1 -1
  30. package/dist/src/commands/monograph.js +5 -3
  31. package/dist/src/commands/monograph.js.map +1 -1
  32. package/dist/src/commands/org-observe.d.ts.map +1 -1
  33. package/dist/src/commands/org-observe.js +8 -3
  34. package/dist/src/commands/org-observe.js.map +1 -1
  35. package/dist/src/commands/org.d.ts +37 -0
  36. package/dist/src/commands/org.d.ts.map +1 -1
  37. package/dist/src/commands/org.js +99 -42
  38. package/dist/src/commands/org.js.map +1 -1
  39. package/dist/src/commands/platforms.d.ts.map +1 -1
  40. package/dist/src/commands/platforms.js +83 -15
  41. package/dist/src/commands/platforms.js.map +1 -1
  42. package/dist/src/commands/security-scan.d.ts +27 -0
  43. package/dist/src/commands/security-scan.d.ts.map +1 -1
  44. package/dist/src/commands/security-scan.js +192 -127
  45. package/dist/src/commands/security-scan.js.map +1 -1
  46. package/dist/src/init/codex-generator.d.ts.map +1 -1
  47. package/dist/src/init/codex-generator.js +7 -1
  48. package/dist/src/init/codex-generator.js.map +1 -1
  49. package/dist/src/init/kimi-generator.d.ts.map +1 -1
  50. package/dist/src/init/kimi-generator.js +7 -1
  51. package/dist/src/init/kimi-generator.js.map +1 -1
  52. package/dist/src/init/managed-block.d.ts +7 -0
  53. package/dist/src/init/managed-block.d.ts.map +1 -0
  54. package/dist/src/init/managed-block.js +188 -0
  55. package/dist/src/init/managed-block.js.map +1 -0
  56. package/dist/src/init/opencode-generator.d.ts.map +1 -1
  57. package/dist/src/init/opencode-generator.js +7 -1
  58. package/dist/src/init/opencode-generator.js.map +1 -1
  59. package/dist/src/init/shared.d.ts +1 -28
  60. package/dist/src/init/shared.d.ts.map +1 -1
  61. package/dist/src/init/shared.js +4 -42
  62. package/dist/src/init/shared.js.map +1 -1
  63. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  64. package/dist/src/init/statusline-generator.js +9 -4
  65. package/dist/src/init/statusline-generator.js.map +1 -1
  66. package/dist/src/knowledge/eval/model-presence.d.ts +3 -0
  67. package/dist/src/knowledge/eval/model-presence.d.ts.map +1 -1
  68. package/dist/src/knowledge/eval/model-presence.js +25 -1
  69. package/dist/src/knowledge/eval/model-presence.js.map +1 -1
  70. package/dist/src/memory/embedding-operations.d.ts.map +1 -1
  71. package/dist/src/memory/embedding-operations.js +3 -3
  72. package/dist/src/memory/embedding-operations.js.map +1 -1
  73. package/dist/src/memory/entity-name-key.d.ts +28 -0
  74. package/dist/src/memory/entity-name-key.d.ts.map +1 -0
  75. package/dist/src/memory/entity-name-key.js +71 -0
  76. package/dist/src/memory/entity-name-key.js.map +1 -0
  77. package/dist/src/memory/memory-bridge.d.ts +7 -0
  78. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  79. package/dist/src/memory/memory-bridge.js +76 -33
  80. package/dist/src/memory/memory-bridge.js.map +1 -1
  81. package/dist/src/memory/memory-kg.d.ts.map +1 -1
  82. package/dist/src/memory/memory-kg.js +61 -0
  83. package/dist/src/memory/memory-kg.js.map +1 -1
  84. package/dist/src/memory/reranker-head.d.ts +37 -0
  85. package/dist/src/memory/reranker-head.d.ts.map +1 -0
  86. package/dist/src/memory/reranker-head.js +105 -0
  87. package/dist/src/memory/reranker-head.js.map +1 -0
  88. package/dist/src/orgrt/agent-runner.d.ts +7 -0
  89. package/dist/src/orgrt/agent-runner.d.ts.map +1 -1
  90. package/dist/src/orgrt/agent-runner.js +4 -0
  91. package/dist/src/orgrt/agent-runner.js.map +1 -1
  92. package/dist/src/orgrt/cli-sandbox.d.ts +61 -0
  93. package/dist/src/orgrt/cli-sandbox.d.ts.map +1 -0
  94. package/dist/src/orgrt/cli-sandbox.js +75 -0
  95. package/dist/src/orgrt/cli-sandbox.js.map +1 -0
  96. package/dist/src/orgrt/codex-runner.d.ts.map +1 -1
  97. package/dist/src/orgrt/codex-runner.js +7 -3
  98. package/dist/src/orgrt/codex-runner.js.map +1 -1
  99. package/dist/src/orgrt/daemon.d.ts +3 -0
  100. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  101. package/dist/src/orgrt/daemon.js +27 -0
  102. package/dist/src/orgrt/daemon.js.map +1 -1
  103. package/dist/src/orgrt/git-guard.d.ts +63 -0
  104. package/dist/src/orgrt/git-guard.d.ts.map +1 -0
  105. package/dist/src/orgrt/git-guard.js +329 -0
  106. package/dist/src/orgrt/git-guard.js.map +1 -0
  107. package/dist/src/orgrt/grok-runner.d.ts.map +1 -1
  108. package/dist/src/orgrt/grok-runner.js +7 -1
  109. package/dist/src/orgrt/grok-runner.js.map +1 -1
  110. package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
  111. package/dist/src/orgrt/opencode-runner.js +60 -11
  112. package/dist/src/orgrt/opencode-runner.js.map +1 -1
  113. package/dist/src/orgrt/policy-git.d.ts +2 -0
  114. package/dist/src/orgrt/policy-git.d.ts.map +1 -0
  115. package/dist/src/orgrt/policy-git.js +216 -0
  116. package/dist/src/orgrt/policy-git.js.map +1 -0
  117. package/dist/src/orgrt/policy.d.ts.map +1 -1
  118. package/dist/src/orgrt/policy.js +15 -176
  119. package/dist/src/orgrt/policy.js.map +1 -1
  120. package/dist/src/orgrt/questions.d.ts +13 -0
  121. package/dist/src/orgrt/questions.d.ts.map +1 -1
  122. package/dist/src/orgrt/questions.js +21 -1
  123. package/dist/src/orgrt/questions.js.map +1 -1
  124. package/dist/src/orgrt/reporting.d.ts +4 -0
  125. package/dist/src/orgrt/reporting.d.ts.map +1 -1
  126. package/dist/src/orgrt/reporting.js +11 -1
  127. package/dist/src/orgrt/reporting.js.map +1 -1
  128. package/dist/src/orgrt/role-sandbox.d.ts +87 -0
  129. package/dist/src/orgrt/role-sandbox.d.ts.map +1 -0
  130. package/dist/src/orgrt/role-sandbox.js +342 -0
  131. package/dist/src/orgrt/role-sandbox.js.map +1 -0
  132. package/dist/src/orgrt/session.d.ts +17 -6
  133. package/dist/src/orgrt/session.d.ts.map +1 -1
  134. package/dist/src/orgrt/session.js +75 -40
  135. package/dist/src/orgrt/session.js.map +1 -1
  136. package/dist/src/orgrt/shell-scan.d.ts +27 -0
  137. package/dist/src/orgrt/shell-scan.d.ts.map +1 -0
  138. package/dist/src/orgrt/shell-scan.js +453 -0
  139. package/dist/src/orgrt/shell-scan.js.map +1 -0
  140. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  141. package/dist/src/orgrt/task-dag.js +8 -0
  142. package/dist/src/orgrt/task-dag.js.map +1 -1
  143. package/dist/src/orgrt/templates.d.ts.map +1 -1
  144. package/dist/src/orgrt/templates.js +11 -5
  145. package/dist/src/orgrt/templates.js.map +1 -1
  146. package/dist/src/orgrt/types.d.ts +33 -0
  147. package/dist/src/orgrt/types.d.ts.map +1 -1
  148. package/dist/src/orgrt/types.js +17 -0
  149. package/dist/src/orgrt/types.js.map +1 -1
  150. package/dist/src/orgrt/vercel-providers.d.ts +5 -0
  151. package/dist/src/orgrt/vercel-providers.d.ts.map +1 -1
  152. package/dist/src/orgrt/vercel-providers.js +6 -1
  153. package/dist/src/orgrt/vercel-providers.js.map +1 -1
  154. package/dist/src/platform-adapters/migration.d.ts.map +1 -1
  155. package/dist/src/platform-adapters/migration.js +40 -2
  156. package/dist/src/platform-adapters/migration.js.map +1 -1
  157. package/dist/src/pricing/model-pricing.d.ts +0 -12
  158. package/dist/src/pricing/model-pricing.d.ts.map +1 -1
  159. package/dist/src/pricing/model-pricing.js +19 -4
  160. package/dist/src/pricing/model-pricing.js.map +1 -1
  161. package/dist/src/ui/collector.mjs +7 -4
  162. package/dist/src/ui/routes-org.mjs +2 -1
  163. package/dist/src/ui/server.mjs +7 -4
  164. package/dist/tsconfig.tsbuildinfo +1 -1
  165. package/package.json +3 -3
@@ -3,6 +3,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from
3
3
  import { basename, join, resolve } from 'node:path';
4
4
  import { output } from '../output.js';
5
5
  import { renderCompatibilityMatrix } from '../platform-adapters/docs.js';
6
+ import { LEGACY_SURFACE_INVENTORY } from '../platform-adapters/migration.js';
6
7
  import { installPlatform, migrateLegacyInstall, planInstall, runPlatformsDoctor, uninstallPlatform, upgradePlatforms, } from '../platform-adapters/operations.js';
7
8
  import { PLATFORM_IDS, PLATFORM_REGISTRY, resolvePlatformId, } from '../platform-adapters/registry.js';
8
9
  export const SUPPORTED_PLATFORMS = PLATFORM_IDS;
@@ -59,14 +60,14 @@ function mutationRequest(ctx, platform) {
59
60
  };
60
61
  }
61
62
  function resultError(reason) {
62
- output.error(reason instanceof Error ? reason.message : String(reason));
63
+ output.printError(reason instanceof Error ? reason.message : String(reason));
63
64
  return { success: false, exitCode: 1 };
64
65
  }
65
66
  function printResults(results) {
66
67
  for (const result of results) {
67
- result.changed.forEach((path) => output.success(`Updated ${path}`));
68
- result.skipped.forEach((path) => output.info(`Skipped ${path}`));
69
- result.diagnostics.forEach((diagnostic) => output.info(diagnostic));
68
+ result.changed.forEach((path) => output.printSuccess(`Updated ${path}`));
69
+ result.skipped.forEach((path) => output.printInfo(`Skipped ${path}`));
70
+ result.diagnostics.forEach((diagnostic) => output.printInfo(diagnostic));
70
71
  }
71
72
  }
72
73
  function requireTargets(ctx) {
@@ -87,8 +88,8 @@ async function handlePlan(ctx) {
87
88
  output.printJson(plans);
88
89
  else
89
90
  plans.forEach((plan) => {
90
- output.info(`Plan: ${plan.intents.length} artifact(s)`);
91
- plan.diagnostics.forEach((diagnostic) => output.info(diagnostic));
91
+ output.printInfo(`Plan: ${plan.intents.length} artifact(s)`);
92
+ plan.diagnostics.forEach((diagnostic) => output.printInfo(diagnostic));
92
93
  });
93
94
  return { success: true, data: plans };
94
95
  }
@@ -139,6 +140,75 @@ async function handleUninstall(ctx) {
139
140
  return resultError(reason);
140
141
  }
141
142
  }
143
+ /** What a detected legacy surface is, in the user's terms, and how to clear it. */
144
+ const LEGACY_ACTION = {
145
+ migrate: {
146
+ meaning: 'unnamed pre-adapter block; upgrade rewrites it with the current named marker',
147
+ fix: 'upgrade',
148
+ },
149
+ 'remove-block': {
150
+ meaning: 'Monomind block in a file the adapters no longer own',
151
+ fix: 'upgrade',
152
+ },
153
+ 'remove-entry': {
154
+ meaning: 'Monomind entry in a config the adapters no longer own',
155
+ fix: 'upgrade',
156
+ },
157
+ 'remove-file': {
158
+ meaning: 'file written by a pre-adapter install',
159
+ fix: 'remove',
160
+ },
161
+ };
162
+ function adapterState(report) {
163
+ if (report.legacy.findings.length)
164
+ return 'legacy';
165
+ return report.artifacts.some((artifact) => artifact.state === 'managed')
166
+ ? 'managed'
167
+ : 'not installed';
168
+ }
169
+ function printLegacy(report, scope) {
170
+ if (!report.legacy.findings.length)
171
+ return;
172
+ output.writeln(output.dim(' legacy surfaces detected:'));
173
+ const fixes = new Set();
174
+ for (const id of report.legacy.findings) {
175
+ const surface = LEGACY_SURFACE_INVENTORY.find((entry) => entry.id === id);
176
+ const action = surface && LEGACY_ACTION[surface.action];
177
+ output.writeln(` ${id} ${surface?.path ?? ''} — ${action?.meaning ?? 'pre-adapter artifact'}`);
178
+ if (action)
179
+ fixes.add(action.fix === 'upgrade'
180
+ ? `monomind platforms upgrade --platform ${report.platform} --scope ${scope}`
181
+ : `monomind platforms uninstall --platform ${report.platform} --scope ${scope} --remove-legacy`);
182
+ }
183
+ for (const fix of fixes)
184
+ output.writeln(` migrate with: ${fix}`);
185
+ }
186
+ function printDoctorReports(reports, scope) {
187
+ output.writeln(output.bold(`Platform adapters (${scope} scope)`));
188
+ for (const report of reports) {
189
+ const adapter = PLATFORM_REGISTRY[report.platform];
190
+ output.writeln();
191
+ output.writeln(`${report.platform} (${adapter.displayName}): ${adapterState(report)}`);
192
+ if (!report.artifacts.length)
193
+ output.writeln(' artifacts: none declared');
194
+ else
195
+ output.writeln(output.dim(' artifacts:'));
196
+ for (const artifact of report.artifacts)
197
+ output.writeln(` ${artifact.state.padEnd(8)} ${artifact.path}${artifact.reason ? ` (${artifact.reason})` : ''}`);
198
+ printLegacy(report, scope);
199
+ if (report.diagnostics.length) {
200
+ output.writeln(output.dim(' notes:'));
201
+ report.diagnostics.forEach((diagnostic) => output.writeln(` ${diagnostic}`));
202
+ }
203
+ const next = adapterState(report) === 'not installed'
204
+ ? `install --platform ${report.platform}`
205
+ : `upgrade --platform ${report.platform}`;
206
+ output.writeln(` next: monomind platforms ${next} --scope ${scope}`);
207
+ }
208
+ const legacy = reports.filter((report) => report.legacy.findings.length).length;
209
+ output.writeln();
210
+ output.writeln(`${reports.length} platform(s) inspected, ${legacy} with legacy surfaces. Legacy findings are warnings, not failures.`);
211
+ }
142
212
  async function handleDoctor(ctx) {
143
213
  const raw = typeof ctx.flags.platform === 'string' ? ctx.flags.platform : undefined;
144
214
  const platform = targetFrom(ctx);
@@ -153,11 +223,9 @@ async function handleDoctor(ctx) {
153
223
  if (ctx.flags.json === true)
154
224
  output.printJson(reports);
155
225
  else
156
- reports.forEach((report) => {
157
- const state = report.artifacts.map((artifact) => artifact.state).join(', ') || 'no declared artifacts';
158
- output.info(`${report.platform}: ${state}`);
159
- report.diagnostics.forEach((diagnostic) => output.info(diagnostic));
160
- });
226
+ printDoctorReports(reports, scopeFrom(ctx));
227
+ // A legacy or missing artifact is a warning, not a command failure: doctor
228
+ // reports state, it does not gate on it.
161
229
  return { success: true, data: reports };
162
230
  }
163
231
  catch (reason) {
@@ -168,8 +236,8 @@ async function handleSetup(ctx) {
168
236
  const targets = requireTargets(ctx);
169
237
  if (!Array.isArray(targets))
170
238
  return targets;
171
- output.info('platforms setup is deprecated and no longer writes SessionStart hooks or global plugins.');
172
- output.info('Use platforms doctor, then platforms install --scope user --yes.');
239
+ output.printInfo('platforms setup is deprecated and no longer writes SessionStart hooks or global plugins.');
240
+ output.printInfo('Use platforms doctor, then platforms install --scope user --yes.');
173
241
  try {
174
242
  const result = await migrateLegacyInstall({
175
243
  ...mutationRequest(ctx, ctx.flags.all === true ? undefined : targets[0]),
@@ -190,10 +258,10 @@ async function handleDocs(ctx) {
190
258
  }
191
259
  const path = resolve(ctx.cwd, 'docs', 'platforms', 'compatibility.md');
192
260
  if (!existsSync(path) || readFileSync(path, 'utf8') !== rendered) {
193
- output.error('Platform compatibility documentation is stale; regenerate it from the platform registry.');
261
+ output.printError('Platform compatibility documentation is stale; regenerate it from the platform registry.');
194
262
  return { success: false, exitCode: 1 };
195
263
  }
196
- output.success('Platform compatibility documentation is current.');
264
+ output.printSuccess('Platform compatibility documentation is current.');
197
265
  return { success: true };
198
266
  }
199
267
  const targetOptions = [
@@ -1 +1 @@
1
- {"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../src/commands/platforms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../src/commands/platforms.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,20 @@ export declare const SECRET_PATTERNS: Array<{
6
6
  pattern: RegExp;
7
7
  type: string;
8
8
  }>;
9
+ /**
10
+ * File extensions the secret scanner reads. Previously limited to
11
+ * ts/js/json/yml/yaml(+.env*), which meant any other language — Python, Go,
12
+ * Ruby, shell, etc. — was silently invisible to `security scan`/`secrets`
13
+ * regardless of what it contained. Broadened to cover common source/config
14
+ * file types actually likely to hold hardcoded credentials.
15
+ */
16
+ export declare const SECRET_SCAN_EXTENSIONS: RegExp;
17
+ /**
18
+ * File extensions the code-pattern scanner (eval(), innerHTML, command
19
+ * injection, SQL injection, ...) reads. Previously ts/js/tsx/jsx only, so a
20
+ * dangerous `eval()` call in a Python, shell, or Ruby file was never seen.
21
+ */
22
+ export declare const CODE_PATTERN_SCAN_EXTENSIONS: RegExp;
9
23
  export type SecretFinding = {
10
24
  severity: string;
11
25
  type: string;
@@ -43,6 +57,19 @@ export declare function scanHadErrors(c: ScanCoverage): boolean;
43
57
  /** Human-readable lines describing every gap in coverage. Empty when complete. */
44
58
  export declare function describeScanGaps(c: ScanCoverage): string[];
45
59
  export declare function findSecretsInDir(dir: string, depthLimit: number, baseDir: string, findings: SecretFinding[], coverage?: ScanCoverage): void;
60
+ export declare const CODE_PATTERNS: Array<{
61
+ pattern: RegExp;
62
+ type: string;
63
+ severity: 'high' | 'medium';
64
+ desc: string;
65
+ }>;
66
+ /**
67
+ * Same coverage accounting as findSecretsInDir: gaps are recorded, never
68
+ * swallowed, so an unreadable tree cannot masquerade as a clean one. Also
69
+ * shares findSecretsInDir's fix for a `dir` that is actually a file: it is
70
+ * scanned directly instead of throwing ENOTDIR into unreadableDirs.
71
+ */
72
+ export declare function findCodePatternsInDir(dir: string, depthLimit: number, baseDir: string, findings: SecretFinding[], coverage?: ScanCoverage): void;
46
73
  export interface SarifHealthFinding {
47
74
  filePath: string;
48
75
  functionName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"security-scan.d.ts","sourceRoot":"","sources":["../../../src/commands/security-scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security-scan.d.ts","sourceRoot":"","sources":["../../../src/commands/security-scan.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,13 @@ import { output } from '../output.js';
8
8
  // ─── Shared secret scanning ─────────────────────────────────────────────────
9
9
  export const SECRET_PATTERNS = [
10
10
  {
11
- pattern: /['"](?:sk-|sk_live_|sk_test_)[a-zA-Z0-9]{20,}['"]/g,
11
+ // Covers plain `sk-<random>` as well as the hyphen-segmented variants
12
+ // vendors actually issue (`sk-live-...`, `sk-proj-...`, `sk-test-...`),
13
+ // plus Stripe's underscore-segmented `sk_live_...`/`sk_test_...`. The
14
+ // previous version required 20+ *contiguous* alphanumerics right after
15
+ // `sk-`, which never matched `sk-live-...` because the `-` after `live`
16
+ // broke the run — so real Stripe/OpenAI keys of that shape went undetected.
17
+ pattern: /['"]sk-(?:live-|proj-|test-)?[a-zA-Z0-9]{10,}['"]|['"]sk_(?:live|test)_[a-zA-Z0-9]{10,}['"]/g,
12
18
  type: 'API Key (Stripe/OpenAI)',
13
19
  },
14
20
  { pattern: /['"]AKIA[A-Z0-9]{16}['"]/g, type: 'AWS Access Key' },
@@ -16,6 +22,20 @@ export const SECRET_PATTERNS = [
16
22
  { pattern: /['"]xox[baprs]-[a-zA-Z0-9-]+['"]/g, type: 'Slack Token' },
17
23
  { pattern: /password\s*[:=]\s*['"][^'"]{8,}['"]/gi, type: 'Hardcoded Password' },
18
24
  ];
25
+ /**
26
+ * File extensions the secret scanner reads. Previously limited to
27
+ * ts/js/json/yml/yaml(+.env*), which meant any other language — Python, Go,
28
+ * Ruby, shell, etc. — was silently invisible to `security scan`/`secrets`
29
+ * regardless of what it contained. Broadened to cover common source/config
30
+ * file types actually likely to hold hardcoded credentials.
31
+ */
32
+ export const SECRET_SCAN_EXTENSIONS = /\.(ts|tsx|js|jsx|mjs|cjs|json|ya?ml|py|rb|go|java|php|c|cc|cpp|h|hpp|cs|kt|kts|swift|rs|sh|bash|zsh|pl|lua|sql|toml|ini|cfg|conf|properties|xml|html)$/;
33
+ /**
34
+ * File extensions the code-pattern scanner (eval(), innerHTML, command
35
+ * injection, SQL injection, ...) reads. Previously ts/js/tsx/jsx only, so a
36
+ * dangerous `eval()` call in a Python, shell, or Ruby file was never seen.
37
+ */
38
+ export const CODE_PATTERN_SCAN_EXTENSIONS = /\.(ts|tsx|js|jsx|mjs|cjs|py|rb|go|java|php|c|cc|cpp|h|hpp|cs|kt|kts|swift|rs|sh|bash|zsh|pl|lua)$/;
19
39
  export function createScanCoverage() {
20
40
  return {
21
41
  unreadableDirs: [],
@@ -54,7 +74,57 @@ export function describeScanGaps(c) {
54
74
  }
55
75
  return lines;
56
76
  }
77
+ /** Reads one file and records any SECRET_PATTERNS matches as findings. */
78
+ function scanFileForSecrets(fullPath, baseDir, findings, coverage) {
79
+ let content;
80
+ try {
81
+ if (statSync(fullPath).size > 1024 * 1024) {
82
+ coverage.oversizedFiles.push(relative(baseDir, fullPath) || fullPath);
83
+ return;
84
+ }
85
+ content = readFileSync(fullPath, 'utf-8');
86
+ }
87
+ catch {
88
+ coverage.unreadableFiles.push(relative(baseDir, fullPath) || fullPath);
89
+ return;
90
+ }
91
+ coverage.filesScanned++;
92
+ const lines = content.split('\n');
93
+ for (let i = 0; i < lines.length; i++) {
94
+ for (const { pattern, type } of SECRET_PATTERNS) {
95
+ pattern.lastIndex = 0;
96
+ let m;
97
+ while ((m = pattern.exec(lines[i])) !== null) {
98
+ findings.push({
99
+ severity: output.warning('HIGH'),
100
+ type: 'Hardcoded Secret',
101
+ location: `${relative(baseDir, fullPath) || fullPath}:${i + 1}`,
102
+ description: type,
103
+ rawSeverity: 'high',
104
+ });
105
+ }
106
+ }
107
+ }
108
+ }
57
109
  export function findSecretsInDir(dir, depthLimit, baseDir, findings, coverage = createScanCoverage()) {
110
+ // A caller can point --target/-p directly at a *file* rather than a
111
+ // directory. readdirSync() on a file throws ENOTDIR, which the old code
112
+ // swallowed into unreadableDirs and returned — so the file itself was
113
+ // never opened, even when it plainly contained a secret. Detect that case
114
+ // up front and scan the file directly, ignoring the extension allowlist
115
+ // since the caller explicitly named this exact file.
116
+ let dirStat;
117
+ try {
118
+ dirStat = statSync(dir);
119
+ }
120
+ catch {
121
+ coverage.unreadableDirs.push(relative(baseDir, dir) || dir);
122
+ return;
123
+ }
124
+ if (dirStat.isFile()) {
125
+ scanFileForSecrets(dir, baseDir, findings, coverage);
126
+ return;
127
+ }
58
128
  if (depthLimit <= 0) {
59
129
  coverage.depthTruncatedDirs.push(relative(baseDir, dir) || dir);
60
130
  return;
@@ -79,40 +149,123 @@ export function findSecretsInDir(dir, depthLimit, baseDir, findings, coverage =
79
149
  findSecretsInDir(fullPath, depthLimit - 1, baseDir, findings, coverage);
80
150
  }
81
151
  else if (entry.isFile() &&
82
- (/\.(ts|js|json|yml|yaml)$/.test(entry.name) || isDotEnv) &&
152
+ (SECRET_SCAN_EXTENSIONS.test(entry.name) || isDotEnv) &&
83
153
  !entry.name.endsWith('.d.ts')) {
84
- let content;
85
- try {
86
- if (statSync(fullPath).size > 1024 * 1024) {
87
- coverage.oversizedFiles.push(relative(baseDir, fullPath));
88
- continue;
89
- }
90
- content = readFileSync(fullPath, 'utf-8');
91
- }
92
- catch {
93
- coverage.unreadableFiles.push(relative(baseDir, fullPath));
94
- continue;
95
- }
96
- coverage.filesScanned++;
97
- const lines = content.split('\n');
98
- for (let i = 0; i < lines.length; i++) {
99
- for (const { pattern, type } of SECRET_PATTERNS) {
100
- pattern.lastIndex = 0;
101
- let m;
102
- while ((m = pattern.exec(lines[i])) !== null) {
103
- findings.push({
104
- severity: output.warning('HIGH'),
105
- type: 'Hardcoded Secret',
106
- location: `${relative(baseDir, fullPath)}:${i + 1}`,
107
- description: type,
108
- rawSeverity: 'high',
109
- });
110
- }
111
- }
154
+ scanFileForSecrets(fullPath, baseDir, findings, coverage);
155
+ }
156
+ }
157
+ }
158
+ // ─── Shared code-pattern scanning ───────────────────────────────────────────
159
+ export const CODE_PATTERNS = [
160
+ {
161
+ pattern: /eval\s*\(/g,
162
+ type: 'Eval Usage',
163
+ severity: 'medium',
164
+ desc: 'eval() can execute arbitrary code',
165
+ },
166
+ {
167
+ pattern: /innerHTML\s*=/g,
168
+ type: 'innerHTML',
169
+ severity: 'medium',
170
+ desc: 'XSS risk with innerHTML',
171
+ },
172
+ {
173
+ pattern: /dangerouslySetInnerHTML/g,
174
+ type: 'React XSS',
175
+ severity: 'medium',
176
+ desc: 'React XSS risk',
177
+ },
178
+ {
179
+ pattern: /child_process.*exec[^S]/g,
180
+ type: 'Command Injection',
181
+ severity: 'high',
182
+ desc: 'Possible command injection',
183
+ },
184
+ {
185
+ pattern: /\$\{.*\}.*sql|sql.*\$\{/gi,
186
+ type: 'SQL Injection',
187
+ severity: 'high',
188
+ desc: 'Possible SQL injection',
189
+ },
190
+ ];
191
+ /** Reads one file and records any CODE_PATTERNS matches as findings. */
192
+ function scanFileForCodePatterns(fullPath, baseDir, findings, coverage) {
193
+ let content;
194
+ try {
195
+ if (statSync(fullPath).size > 1024 * 1024) {
196
+ coverage.oversizedFiles.push(relative(baseDir, fullPath) || fullPath);
197
+ return;
198
+ }
199
+ content = readFileSync(fullPath, 'utf-8');
200
+ }
201
+ catch {
202
+ coverage.unreadableFiles.push(relative(baseDir, fullPath) || fullPath);
203
+ return;
204
+ }
205
+ coverage.filesScanned++;
206
+ const lines = content.split('\n');
207
+ for (let i = 0; i < lines.length; i++) {
208
+ for (const { pattern, type, severity, desc } of CODE_PATTERNS) {
209
+ pattern.lastIndex = 0;
210
+ let m;
211
+ while ((m = pattern.exec(lines[i])) !== null) {
212
+ findings.push({
213
+ severity: severity === 'high' ? output.warning('HIGH') : output.warning('MEDIUM'),
214
+ type,
215
+ location: `${relative(baseDir, fullPath) || fullPath}:${i + 1}`,
216
+ description: desc,
217
+ rawSeverity: severity,
218
+ });
112
219
  }
113
220
  }
114
221
  }
115
222
  }
223
+ /**
224
+ * Same coverage accounting as findSecretsInDir: gaps are recorded, never
225
+ * swallowed, so an unreadable tree cannot masquerade as a clean one. Also
226
+ * shares findSecretsInDir's fix for a `dir` that is actually a file: it is
227
+ * scanned directly instead of throwing ENOTDIR into unreadableDirs.
228
+ */
229
+ export function findCodePatternsInDir(dir, depthLimit, baseDir, findings, coverage = createScanCoverage()) {
230
+ let dirStat;
231
+ try {
232
+ dirStat = statSync(dir);
233
+ }
234
+ catch {
235
+ coverage.unreadableDirs.push(relative(baseDir, dir) || dir);
236
+ return;
237
+ }
238
+ if (dirStat.isFile()) {
239
+ scanFileForCodePatterns(dir, baseDir, findings, coverage);
240
+ return;
241
+ }
242
+ if (depthLimit <= 0) {
243
+ coverage.depthTruncatedDirs.push(relative(baseDir, dir) || dir);
244
+ return;
245
+ }
246
+ let entries;
247
+ try {
248
+ entries = readdirSync(dir, { withFileTypes: true });
249
+ }
250
+ catch {
251
+ coverage.unreadableDirs.push(relative(baseDir, dir) || dir);
252
+ return;
253
+ }
254
+ coverage.dirsScanned++;
255
+ for (const entry of entries) {
256
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist')
257
+ continue;
258
+ const fullPath = join(dir, entry.name);
259
+ if (entry.isDirectory()) {
260
+ findCodePatternsInDir(fullPath, depthLimit - 1, baseDir, findings, coverage);
261
+ }
262
+ else if (entry.isFile() &&
263
+ CODE_PATTERN_SCAN_EXTENSIONS.test(entry.name) &&
264
+ !entry.name.endsWith('.d.ts')) {
265
+ scanFileForCodePatterns(fullPath, baseDir, findings, coverage);
266
+ }
267
+ }
268
+ }
116
269
  const SARIF_HEALTH_RULES = [
117
270
  {
118
271
  id: 'complexity/cyclomatic',
@@ -373,103 +526,15 @@ export const scanCommand = {
373
526
  }
374
527
  if ((scanType === 'all' || scanType === 'code') && depth !== 'quick') {
375
528
  spinner.setText('Analyzing code patterns...');
376
- const codePatterns = [
377
- {
378
- pattern: /eval\s*\(/g,
379
- type: 'Eval Usage',
380
- severity: 'medium',
381
- desc: 'eval() can execute arbitrary code',
382
- },
383
- {
384
- pattern: /innerHTML\s*=/g,
385
- type: 'innerHTML',
386
- severity: 'medium',
387
- desc: 'XSS risk with innerHTML',
388
- },
389
- {
390
- pattern: /dangerouslySetInnerHTML/g,
391
- type: 'React XSS',
392
- severity: 'medium',
393
- desc: 'React XSS risk',
394
- },
395
- {
396
- pattern: /child_process.*exec[^S]/g,
397
- type: 'Command Injection',
398
- severity: 'high',
399
- desc: 'Possible command injection',
400
- },
401
- {
402
- pattern: /\$\{.*\}.*sql|sql.*\$\{/gi,
403
- type: 'SQL Injection',
404
- severity: 'high',
405
- desc: 'Possible SQL injection',
406
- },
407
- ];
408
- // Same coverage accounting as findSecretsInDir: gaps are recorded, never
409
- // swallowed, so an unreadable tree cannot masquerade as a clean one.
410
- const codeBase = path.resolve(target);
411
- const scanCodeDir = (dir, depthLimit) => {
412
- if (depthLimit <= 0) {
413
- coverage.depthTruncatedDirs.push(path.relative(codeBase, dir) || dir);
414
- return;
415
- }
416
- let entries;
417
- try {
418
- entries = fs.readdirSync(dir, { withFileTypes: true });
419
- }
420
- catch {
421
- coverage.unreadableDirs.push(path.relative(codeBase, dir) || dir);
422
- return;
423
- }
424
- for (const entry of entries) {
425
- if (entry.name.startsWith('.') ||
426
- entry.name === 'node_modules' ||
427
- entry.name === 'dist')
428
- continue;
429
- const fullPath = path.join(dir, entry.name);
430
- if (entry.isDirectory()) {
431
- scanCodeDir(fullPath, depthLimit - 1);
432
- }
433
- else if (entry.isFile() &&
434
- /\.(ts|js|tsx|jsx)$/.test(entry.name) &&
435
- !entry.name.endsWith('.d.ts')) {
436
- let content;
437
- try {
438
- if (fs.statSync(fullPath).size > 1024 * 1024) {
439
- coverage.oversizedFiles.push(path.relative(codeBase, fullPath));
440
- continue;
441
- }
442
- content = fs.readFileSync(fullPath, 'utf-8');
443
- }
444
- catch {
445
- coverage.unreadableFiles.push(path.relative(codeBase, fullPath));
446
- continue;
447
- }
448
- const lines = content.split('\n');
449
- for (let i = 0; i < lines.length; i++) {
450
- for (const { pattern, type, severity, desc } of codePatterns) {
451
- pattern.lastIndex = 0;
452
- let m;
453
- while ((m = pattern.exec(lines[i])) !== null) {
454
- if (severity === 'high')
455
- highCount++;
456
- else
457
- mediumCount++;
458
- findings.push({
459
- severity: severity === 'high' ? output.warning('HIGH') : output.warning('MEDIUM'),
460
- type,
461
- location: `${path.relative(target, fullPath)}:${i + 1}`,
462
- description: desc,
463
- rawSeverity: severity === 'high' ? 'high' : 'medium',
464
- });
465
- }
466
- }
467
- }
468
- }
469
- }
470
- };
471
- const scanDepth = depth === 'deep' ? 10 : 5;
472
- scanCodeDir(path.resolve(target), scanDepth);
529
+ const codeScanDepth = depth === 'deep' ? 10 : 5;
530
+ const prevFindingsLength = findings.length;
531
+ findCodePatternsInDir(path.resolve(target), codeScanDepth, path.resolve(target), findings, coverage);
532
+ for (const f of findings.slice(prevFindingsLength)) {
533
+ if (f.rawSeverity === 'high')
534
+ highCount++;
535
+ else if (f.rawSeverity === 'medium')
536
+ mediumCount++;
537
+ }
473
538
  }
474
539
  const gaps = describeScanGaps(coverage);
475
540
  if (gaps.length > 0) {