monomind 1.11.14 → 1.13.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 (179) hide show
  1. package/.claude/agents/generated/channel-intelligence-director.md +87 -0
  2. package/.claude/agents/generated/chief-growth-officer.md +88 -0
  3. package/.claude/agents/generated/content-seo-strategist.md +90 -0
  4. package/.claude/agents/generated/developer-community-strategist.md +91 -0
  5. package/.claude/agents/generated/outreach-partnership-strategist.md +90 -0
  6. package/.claude/agents/generated/social-media-strategist.md +91 -0
  7. package/.claude/agents/generated/video-visual-strategist.md +90 -0
  8. package/.claude/commands/mastermind/master.md +1 -1
  9. package/.claude/helpers/auto-memory-hook.mjs +13 -4
  10. package/.claude/helpers/control-start.cjs +5 -0
  11. package/.claude/helpers/event-logger.cjs +114 -0
  12. package/.claude/helpers/handlers/adr-draft-handler.cjs +19 -5
  13. package/.claude/helpers/handlers/agent-start-handler.cjs +13 -4
  14. package/.claude/helpers/handlers/compact-handler.cjs +2 -0
  15. package/.claude/helpers/handlers/edit-handler.cjs +1 -1
  16. package/.claude/helpers/handlers/gates-handler.cjs +3 -0
  17. package/.claude/helpers/handlers/graph-status-handler.cjs +14 -8
  18. package/.claude/helpers/handlers/loops-status-handler.cjs +5 -2
  19. package/.claude/helpers/handlers/route-handler.cjs +24 -10
  20. package/.claude/helpers/handlers/session-handler.cjs +11 -4
  21. package/.claude/helpers/handlers/session-restore-handler.cjs +35 -19
  22. package/.claude/helpers/handlers/task-handler.cjs +13 -5
  23. package/.claude/helpers/hook-handler.cjs +40 -0
  24. package/.claude/helpers/intelligence.cjs +130 -53
  25. package/.claude/helpers/loop-tracker.cjs +15 -3
  26. package/.claude/helpers/memory-palace.cjs +461 -0
  27. package/.claude/helpers/memory.cjs +138 -14
  28. package/.claude/helpers/metrics-db.mjs +87 -0
  29. package/.claude/helpers/router.cjs +300 -42
  30. package/.claude/helpers/session.cjs +89 -30
  31. package/.claude/helpers/statusline.cjs +148 -4
  32. package/.claude/helpers/toggle-statusline.cjs +73 -0
  33. package/.claude/helpers/token-tracker.cjs +934 -0
  34. package/.claude/helpers/utils/micro-agents.cjs +20 -4
  35. package/.claude/helpers/utils/monograph.cjs +39 -4
  36. package/.claude/helpers/utils/telemetry.cjs +3 -3
  37. package/.claude/scheduled_tasks.lock +1 -1
  38. package/.claude/settings.json +92 -1
  39. package/.claude/skills/mastermind/_protocol.md +25 -15
  40. package/.claude/skills/mastermind/architect.md +3 -3
  41. package/.claude/skills/mastermind/autodev.md +4 -2
  42. package/.claude/skills/mastermind/idea.md +10 -0
  43. package/.claude/skills/mastermind/ops.md +3 -3
  44. package/.claude/skills/mastermind/runorg.md +153 -86
  45. package/package.json +20 -3
  46. package/packages/@monomind/cli/dist/src/agents/registry-builder.js +2 -0
  47. package/packages/@monomind/cli/dist/src/autopilot-state.js +10 -5
  48. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +13 -0
  49. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +20 -9
  50. package/packages/@monomind/cli/dist/src/browser/actions.js +10 -3
  51. package/packages/@monomind/cli/dist/src/browser/browser.js +12 -2
  52. package/packages/@monomind/cli/dist/src/browser/cdp.js +21 -3
  53. package/packages/@monomind/cli/dist/src/browser/har.js +27 -5
  54. package/packages/@monomind/cli/dist/src/commands/agent.js +11 -8
  55. package/packages/@monomind/cli/dist/src/commands/analyze.js +36 -21
  56. package/packages/@monomind/cli/dist/src/commands/autopilot.js +12 -4
  57. package/packages/@monomind/cli/dist/src/commands/benchmark.js +51 -8
  58. package/packages/@monomind/cli/dist/src/commands/browse.js +5 -2
  59. package/packages/@monomind/cli/dist/src/commands/claims.js +29 -11
  60. package/packages/@monomind/cli/dist/src/commands/cleanup.js +25 -5
  61. package/packages/@monomind/cli/dist/src/commands/config.js +15 -7
  62. package/packages/@monomind/cli/dist/src/commands/daemon.js +6 -0
  63. package/packages/@monomind/cli/dist/src/commands/deployment.js +34 -19
  64. package/packages/@monomind/cli/dist/src/commands/doctor.js +192 -23
  65. package/packages/@monomind/cli/dist/src/commands/guidance.js +15 -2
  66. package/packages/@monomind/cli/dist/src/commands/hive-mind.js +37 -14
  67. package/packages/@monomind/cli/dist/src/commands/hooks.js +42 -25
  68. package/packages/@monomind/cli/dist/src/commands/init.js +9 -4
  69. package/packages/@monomind/cli/dist/src/commands/issues.js +29 -26
  70. package/packages/@monomind/cli/dist/src/commands/mcp.js +11 -5
  71. package/packages/@monomind/cli/dist/src/commands/memory.js +10 -0
  72. package/packages/@monomind/cli/dist/src/commands/migrate.js +5 -5
  73. package/packages/@monomind/cli/dist/src/commands/monograph.js +18 -5
  74. package/packages/@monomind/cli/dist/src/commands/monovector/backup.js +8 -2
  75. package/packages/@monomind/cli/dist/src/commands/monovector/benchmark.js +20 -7
  76. package/packages/@monomind/cli/dist/src/commands/monovector/import.js +15 -0
  77. package/packages/@monomind/cli/dist/src/commands/monovector/migrate.js +4 -1
  78. package/packages/@monomind/cli/dist/src/commands/monovector/optimize.js +11 -0
  79. package/packages/@monomind/cli/dist/src/commands/monovector/setup.js +11 -1
  80. package/packages/@monomind/cli/dist/src/commands/neural.js +1 -1
  81. package/packages/@monomind/cli/dist/src/commands/performance.js +20 -7
  82. package/packages/@monomind/cli/dist/src/commands/platforms.js +90 -8
  83. package/packages/@monomind/cli/dist/src/commands/plugins.js +12 -5
  84. package/packages/@monomind/cli/dist/src/commands/process.js +33 -10
  85. package/packages/@monomind/cli/dist/src/commands/progress.js +5 -3
  86. package/packages/@monomind/cli/dist/src/commands/providers.js +5 -5
  87. package/packages/@monomind/cli/dist/src/commands/replay.js +8 -2
  88. package/packages/@monomind/cli/dist/src/commands/route.js +27 -7
  89. package/packages/@monomind/cli/dist/src/commands/security.js +4 -0
  90. package/packages/@monomind/cli/dist/src/commands/session.js +12 -1
  91. package/packages/@monomind/cli/dist/src/commands/start.js +11 -4
  92. package/packages/@monomind/cli/dist/src/commands/status.js +7 -4
  93. package/packages/@monomind/cli/dist/src/commands/swarm.js +27 -13
  94. package/packages/@monomind/cli/dist/src/commands/task.js +26 -11
  95. package/packages/@monomind/cli/dist/src/commands/tokens.js +7 -2
  96. package/packages/@monomind/cli/dist/src/commands/transfer-store.js +36 -22
  97. package/packages/@monomind/cli/dist/src/commands/update.js +15 -3
  98. package/packages/@monomind/cli/dist/src/commands/workflow.js +39 -6
  99. package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +18 -7
  100. package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +25 -8
  101. package/packages/@monomind/cli/dist/src/index.js +7 -3
  102. package/packages/@monomind/cli/dist/src/init/executor.js +14 -11
  103. package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +20 -4
  104. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +36 -15
  105. package/packages/@monomind/cli/dist/src/mcp-tools/a2a-tools.js +98 -13
  106. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +16 -3
  107. package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +80 -17
  108. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +84 -22
  109. package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +35 -7
  110. package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +82 -17
  111. package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +37 -4
  112. package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +49 -7
  113. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +45 -18
  114. package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +75 -25
  115. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +32 -10
  116. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +91 -20
  117. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +188 -29
  118. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +25 -7
  119. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-compat.js +11 -2
  120. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +476 -62
  121. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +44 -9
  122. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +45 -10
  123. package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +7 -4
  124. package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +15 -1
  125. package/packages/@monomind/cli/dist/src/mcp-tools/security-tools.js +61 -9
  126. package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +45 -14
  127. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +15 -3
  128. package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +14 -7
  129. package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +52 -10
  130. package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +40 -6
  131. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +37 -4
  132. package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +29 -6
  133. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +26 -10
  134. package/packages/@monomind/cli/dist/src/memory/intelligence.js +80 -19
  135. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +21 -2
  136. package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +67 -3
  137. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +14 -4
  138. package/packages/@monomind/cli/dist/src/monovector/command-outcomes.js +43 -7
  139. package/packages/@monomind/cli/dist/src/monovector/coverage-router.js +8 -4
  140. package/packages/@monomind/cli/dist/src/monovector/coverage-tools.js +6 -3
  141. package/packages/@monomind/cli/dist/src/monovector/diff-classifier.js +13 -0
  142. package/packages/@monomind/cli/dist/src/monovector/route-outcomes.d.ts +2 -1
  143. package/packages/@monomind/cli/dist/src/monovector/route-outcomes.js +46 -4
  144. package/packages/@monomind/cli/dist/src/plugins/manager.js +8 -3
  145. package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +46 -2
  146. package/packages/@monomind/cli/dist/src/plugins/store/search.js +5 -4
  147. package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +17 -3
  148. package/packages/@monomind/cli/dist/src/production/error-handler.js +3 -0
  149. package/packages/@monomind/cli/dist/src/production/monitoring.js +20 -3
  150. package/packages/@monomind/cli/dist/src/production/rate-limiter.js +13 -4
  151. package/packages/@monomind/cli/dist/src/production/retry.js +17 -9
  152. package/packages/@monomind/cli/dist/src/routing/embed-worker.js +6 -2
  153. package/packages/@monomind/cli/dist/src/routing/embedder.js +0 -0
  154. package/packages/@monomind/cli/dist/src/routing/llm-caller.js +13 -2
  155. package/packages/@monomind/cli/dist/src/routing/route-layer-factory.js +18 -3
  156. package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +1 -0
  157. package/packages/@monomind/cli/dist/src/services/claim-service.js +8 -0
  158. package/packages/@monomind/cli/dist/src/services/config-file-manager.js +14 -2
  159. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +18 -2
  160. package/packages/@monomind/cli/dist/src/services/worker-daemon.js +348 -17
  161. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.d.ts +0 -3
  162. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +16 -1
  163. package/packages/@monomind/cli/dist/src/transfer/export.js +8 -0
  164. package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +33 -3
  165. package/packages/@monomind/cli/dist/src/transfer/serialization/cfp.js +8 -2
  166. package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +37 -3
  167. package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +45 -3
  168. package/packages/@monomind/cli/dist/src/transfer/store/download.js +5 -0
  169. package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -1
  170. package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +8 -0
  171. package/packages/@monomind/cli/dist/src/transfer/store/registry.js +30 -5
  172. package/packages/@monomind/cli/dist/src/transfer/store/search.js +20 -5
  173. package/packages/@monomind/cli/dist/src/update/checker.js +59 -7
  174. package/packages/@monomind/cli/dist/src/update/executor.js +50 -3
  175. package/packages/@monomind/cli/dist/src/update/index.js +18 -1
  176. package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +6 -0
  177. package/packages/@monomind/cli/dist/src/update/rate-limiter.js +79 -7
  178. package/packages/@monomind/cli/dist/src/update/validator.js +52 -1
  179. package/packages/@monomind/cli/package.json +2 -3
@@ -8,6 +8,12 @@ import * as os from 'os';
8
8
  const STATE_FILE = path.join(os.homedir(), '.monomind', 'update-state.json');
9
9
  const DEFAULT_INTERVAL_HOURS = 24;
10
10
  const MAX_CHECKS_PER_DAY = 10;
11
+ // Hard cap on how many package version entries we persist. Prevents an
12
+ // attacker who can write to the state file from inflating it unboundedly,
13
+ // and protects recordCheck() from DoS via a huge incoming packageVersions map.
14
+ const MAX_PACKAGE_VERSIONS = 100;
15
+ // Hard cap on the state file size we are willing to read into memory.
16
+ const MAX_STATE_FILE_BYTES = 1 * 1024 * 1024; // 1 MB
11
17
  function ensureDir() {
12
18
  const dir = path.dirname(STATE_FILE);
13
19
  if (!fs.existsSync(dir)) {
@@ -25,8 +31,36 @@ function getDefaultState() {
25
31
  export function loadState() {
26
32
  try {
27
33
  if (fs.existsSync(STATE_FILE)) {
34
+ // Guard against oversized state files (DoS / OOM) before reading
35
+ const stat = fs.statSync(STATE_FILE);
36
+ if (stat.size > MAX_STATE_FILE_BYTES) {
37
+ // State file is unreasonably large — discard and start fresh
38
+ try {
39
+ fs.unlinkSync(STATE_FILE);
40
+ }
41
+ catch { /* ignore */ }
42
+ return getDefaultState();
43
+ }
28
44
  const content = fs.readFileSync(STATE_FILE, 'utf-8');
29
- const state = JSON.parse(content);
45
+ // Block prototype pollution via JSON.parse reviver
46
+ const state = JSON.parse(content, (key, value) => {
47
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
48
+ return undefined;
49
+ return value;
50
+ });
51
+ // Validate that packageVersions is a plain object (not an array/primitive)
52
+ if (!state.packageVersions || typeof state.packageVersions !== 'object' || Array.isArray(state.packageVersions)) {
53
+ state.packageVersions = {};
54
+ }
55
+ // Cap the number of package version entries to prevent bloat
56
+ const versionKeys = Object.keys(state.packageVersions);
57
+ if (versionKeys.length > MAX_PACKAGE_VERSIONS) {
58
+ const capped = {};
59
+ for (const k of versionKeys.slice(0, MAX_PACKAGE_VERSIONS)) {
60
+ capped[k] = state.packageVersions[k];
61
+ }
62
+ state.packageVersions = capped;
63
+ }
30
64
  // Reset counter if new day
31
65
  const today = new Date().toISOString().split('T')[0];
32
66
  if (state.date !== today) {
@@ -86,14 +120,41 @@ export function shouldCheckForUpdates(intervalHours = DEFAULT_INTERVAL_HOURS) {
86
120
  * only after a successful reserveCheck, so that limit enforcement and
87
121
  * increment happen in the same synchronous turn (no await gap between
88
122
  * them), preventing two concurrent callers both seeing "allowed".
123
+ *
124
+ * IMPORTANT: performs a single loadState() → check → increment → saveState()
125
+ * cycle to eliminate the TOCTOU window that existed when this function
126
+ * delegated to shouldCheckForUpdates() (which called loadState() itself)
127
+ * and then called loadState() a second time to increment. Two callers
128
+ * sharing that gap could both see allowed=true and both increment.
89
129
  */
90
130
  export function reserveCheck(intervalHours = DEFAULT_INTERVAL_HOURS) {
91
- const decision = shouldCheckForUpdates(intervalHours);
92
- if (!decision.allowed)
93
- return decision;
94
- // Increment immediately, before any async work, so concurrent callers
95
- // see an updated count on their next tick.
131
+ // Fast-path: environment gates that don't need file I/O
132
+ if (process.env.CI === 'true' || process.env.CONTINUOUS_INTEGRATION === 'true') {
133
+ return { allowed: false, reason: 'CI environment detected' };
134
+ }
135
+ if (process.env.MONOMIND_AUTO_UPDATE === 'false') {
136
+ return { allowed: false, reason: 'Auto-update disabled via environment' };
137
+ }
138
+ // Single load — check and increment in one synchronous cycle
96
139
  const state = loadState();
140
+ if (process.env.MONOMIND_FORCE_UPDATE !== 'true') {
141
+ // Daily limit
142
+ if (state.checksToday >= MAX_CHECKS_PER_DAY) {
143
+ return { allowed: false, reason: `Daily check limit (${MAX_CHECKS_PER_DAY}) reached` };
144
+ }
145
+ // Time interval
146
+ if (state.lastCheck) {
147
+ const hoursSinceLastCheck = (Date.now() - new Date(state.lastCheck).getTime()) / (1000 * 60 * 60);
148
+ if (hoursSinceLastCheck < intervalHours) {
149
+ const nextCheck = Math.ceil(intervalHours - hoursSinceLastCheck);
150
+ return {
151
+ allowed: false,
152
+ reason: `Last check was ${Math.floor(hoursSinceLastCheck)}h ago (next check in ~${nextCheck}h)`,
153
+ };
154
+ }
155
+ }
156
+ }
157
+ // Reserve the slot: increment and persist before any async work begins
97
158
  state.checksToday += 1;
98
159
  state.lastCheck = new Date().toISOString();
99
160
  saveState(state);
@@ -102,7 +163,18 @@ export function reserveCheck(intervalHours = DEFAULT_INTERVAL_HOURS) {
102
163
  export function recordCheck(packageVersions) {
103
164
  // Update only package versions; count/timestamp already incremented by reserveCheck
104
165
  const state = loadState();
105
- state.packageVersions = { ...state.packageVersions, ...packageVersions };
166
+ // Merge only string-valued keys to block prototype pollution and type confusion.
167
+ // Also enforce the total cap so a large incoming map cannot bloat the state file.
168
+ const FORBIDDEN = new Set(['__proto__', 'constructor', 'prototype']);
169
+ for (const [k, v] of Object.entries(packageVersions)) {
170
+ if (FORBIDDEN.has(k))
171
+ continue;
172
+ if (typeof k !== 'string' || typeof v !== 'string')
173
+ continue;
174
+ if (Object.keys(state.packageVersions).length >= MAX_PACKAGE_VERSIONS)
175
+ break;
176
+ state.packageVersions[k] = v;
177
+ }
106
178
  saveState(state);
107
179
  }
108
180
  export function getCachedVersions() {
@@ -2,9 +2,42 @@
2
2
  * Package validator for update compatibility
3
3
  * Ensures updates don't break the ecosystem
4
4
  */
5
- import * as semver from 'semver';
5
+ // Inline semver shim — avoids external dependency (semver is not listed in package.json)
6
+ const semver = {
7
+ valid: (v) => /^\d+\.\d+\.\d+/.test(v || '') ? v : null,
8
+ major: (v) => parseInt((v || '0').split('.')[0], 10),
9
+ gt: (a, b) => {
10
+ const [aMaj, aMin, aPat] = (a || '0').split('.').map(n => parseInt(n, 10) || 0);
11
+ const [bMaj, bMin, bPat] = (b || '0').split('.').map(n => parseInt(n, 10) || 0);
12
+ return aMaj !== bMaj ? aMaj > bMaj : aMin !== bMin ? aMin > bMin : aPat > bPat;
13
+ },
14
+ lt: (a, b) => {
15
+ const [aMaj, aMin, aPat] = (a || '0').split('.').map(n => parseInt(n, 10) || 0);
16
+ const [bMaj, bMin, bPat] = (b || '0').split('.').map(n => parseInt(n, 10) || 0);
17
+ return aMaj !== bMaj ? aMaj < bMaj : aMin !== bMin ? aMin < bMin : aPat < bPat;
18
+ },
19
+ };
20
+ // Maximum number of updates accepted in a single validateBulkUpdate call.
21
+ // Without this cap a caller can DoS the validator by passing thousands of
22
+ // update entries — each entry triggers validateUpdate which iterates over
23
+ // COMPATIBILITY_MATRIX and BREAKING_CHANGES.
24
+ const MAX_BULK_UPDATES = 50;
25
+ // Version strings must look like semver (major.minor.patch with optional pre-release)
26
+ // before we use them in string interpolation or comparisons.
27
+ const SEMVER_RE = /^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/;
28
+ // Package names: scoped (@scope/name) or plain, no shell-special chars.
29
+ const PKG_NAME_RE = /^(@[a-zA-Z0-9][a-zA-Z0-9_.-]*\/)?[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
30
+ function isSafeVersion(v) {
31
+ return typeof v === 'string' && v.length <= 64 && SEMVER_RE.test(v);
32
+ }
33
+ function isSafePackageName(p) {
34
+ return typeof p === 'string' && p.length <= 200 && PKG_NAME_RE.test(p);
35
+ }
6
36
  // Known compatibility matrix between monomind packages
7
37
  const COMPATIBILITY_MATRIX = {
38
+ '@monomind/cli': {
39
+ '@monomind/security': { minVersion: '3.0.0-alpha.1' },
40
+ },
8
41
  '@monoes/monomindcli': {
9
42
  'monofence-ai': { minVersion: '1.0.0' },
10
43
  },
@@ -35,6 +68,18 @@ export function validateUpdate(packageName, fromVersion, toVersion, installedPac
35
68
  warnings: [],
36
69
  requiredPeerUpdates: [],
37
70
  };
71
+ // Guard inputs: reject untrusted or malformed strings before they flow into
72
+ // error messages or semver comparisons (which assume well-formed input).
73
+ if (!isSafePackageName(packageName)) {
74
+ result.valid = false;
75
+ result.incompatibilities.push('Invalid package name');
76
+ return result;
77
+ }
78
+ if (!isSafeVersion(fromVersion) || !isSafeVersion(toVersion)) {
79
+ result.valid = false;
80
+ result.incompatibilities.push('Invalid version string(s)');
81
+ return result;
82
+ }
38
83
  // Check if this is a major version bump
39
84
  if (semver.valid(fromVersion) && semver.valid(toVersion)) {
40
85
  const fromMajor = semver.major(fromVersion);
@@ -93,6 +138,12 @@ export function validateBulkUpdate(updates, currentPackages) {
93
138
  warnings: [],
94
139
  requiredPeerUpdates: [],
95
140
  };
141
+ // Cap the number of updates to prevent DoS via large arrays
142
+ if (!Array.isArray(updates) || updates.length > MAX_BULK_UPDATES) {
143
+ combinedResult.valid = false;
144
+ combinedResult.incompatibilities.push(`Too many updates: max ${MAX_BULK_UPDATES} allowed per call`);
145
+ return combinedResult;
146
+ }
96
147
  // Create a simulated state after all updates
97
148
  const simulatedPackages = { ...currentPackages };
98
149
  for (const update of updates) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monoes/monomindcli",
3
- "version": "1.11.13",
3
+ "version": "1.13.0",
4
4
  "type": "module",
5
5
  "description": "Monomind CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
6
6
  "main": "dist/src/index.js",
@@ -87,8 +87,7 @@
87
87
  "dependencies": {
88
88
  "ws": "^8.18.0",
89
89
  "@noble/ed25519": "^2.1.0",
90
- "@monoes/monograph": "^1.2.0",
91
- "semver": "^7.6.0"
90
+ "@monoes/monograph": "^1.2.0"
92
91
  },
93
92
  "optionalDependencies": {
94
93
  "sql.js": "^1.14.1",