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.
- package/.claude/agents/generated/channel-intelligence-director.md +87 -0
- package/.claude/agents/generated/chief-growth-officer.md +88 -0
- package/.claude/agents/generated/content-seo-strategist.md +90 -0
- package/.claude/agents/generated/developer-community-strategist.md +91 -0
- package/.claude/agents/generated/outreach-partnership-strategist.md +90 -0
- package/.claude/agents/generated/social-media-strategist.md +91 -0
- package/.claude/agents/generated/video-visual-strategist.md +90 -0
- package/.claude/commands/mastermind/master.md +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +13 -4
- package/.claude/helpers/control-start.cjs +5 -0
- package/.claude/helpers/event-logger.cjs +114 -0
- package/.claude/helpers/handlers/adr-draft-handler.cjs +19 -5
- package/.claude/helpers/handlers/agent-start-handler.cjs +13 -4
- package/.claude/helpers/handlers/compact-handler.cjs +2 -0
- package/.claude/helpers/handlers/edit-handler.cjs +1 -1
- package/.claude/helpers/handlers/gates-handler.cjs +3 -0
- package/.claude/helpers/handlers/graph-status-handler.cjs +14 -8
- package/.claude/helpers/handlers/loops-status-handler.cjs +5 -2
- package/.claude/helpers/handlers/route-handler.cjs +24 -10
- package/.claude/helpers/handlers/session-handler.cjs +11 -4
- package/.claude/helpers/handlers/session-restore-handler.cjs +35 -19
- package/.claude/helpers/handlers/task-handler.cjs +13 -5
- package/.claude/helpers/hook-handler.cjs +40 -0
- package/.claude/helpers/intelligence.cjs +130 -53
- package/.claude/helpers/loop-tracker.cjs +15 -3
- package/.claude/helpers/memory-palace.cjs +461 -0
- package/.claude/helpers/memory.cjs +138 -14
- package/.claude/helpers/metrics-db.mjs +87 -0
- package/.claude/helpers/router.cjs +300 -42
- package/.claude/helpers/session.cjs +89 -30
- package/.claude/helpers/statusline.cjs +148 -4
- package/.claude/helpers/toggle-statusline.cjs +73 -0
- package/.claude/helpers/token-tracker.cjs +934 -0
- package/.claude/helpers/utils/micro-agents.cjs +20 -4
- package/.claude/helpers/utils/monograph.cjs +39 -4
- package/.claude/helpers/utils/telemetry.cjs +3 -3
- package/.claude/scheduled_tasks.lock +1 -1
- package/.claude/settings.json +92 -1
- package/.claude/skills/mastermind/_protocol.md +25 -15
- package/.claude/skills/mastermind/architect.md +3 -3
- package/.claude/skills/mastermind/autodev.md +4 -2
- package/.claude/skills/mastermind/idea.md +10 -0
- package/.claude/skills/mastermind/ops.md +3 -3
- package/.claude/skills/mastermind/runorg.md +153 -86
- package/package.json +20 -3
- package/packages/@monomind/cli/dist/src/agents/registry-builder.js +2 -0
- package/packages/@monomind/cli/dist/src/autopilot-state.js +10 -5
- package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +13 -0
- package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +20 -9
- package/packages/@monomind/cli/dist/src/browser/actions.js +10 -3
- package/packages/@monomind/cli/dist/src/browser/browser.js +12 -2
- package/packages/@monomind/cli/dist/src/browser/cdp.js +21 -3
- package/packages/@monomind/cli/dist/src/browser/har.js +27 -5
- package/packages/@monomind/cli/dist/src/commands/agent.js +11 -8
- package/packages/@monomind/cli/dist/src/commands/analyze.js +36 -21
- package/packages/@monomind/cli/dist/src/commands/autopilot.js +12 -4
- package/packages/@monomind/cli/dist/src/commands/benchmark.js +51 -8
- package/packages/@monomind/cli/dist/src/commands/browse.js +5 -2
- package/packages/@monomind/cli/dist/src/commands/claims.js +29 -11
- package/packages/@monomind/cli/dist/src/commands/cleanup.js +25 -5
- package/packages/@monomind/cli/dist/src/commands/config.js +15 -7
- package/packages/@monomind/cli/dist/src/commands/daemon.js +6 -0
- package/packages/@monomind/cli/dist/src/commands/deployment.js +34 -19
- package/packages/@monomind/cli/dist/src/commands/doctor.js +192 -23
- package/packages/@monomind/cli/dist/src/commands/guidance.js +15 -2
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +37 -14
- package/packages/@monomind/cli/dist/src/commands/hooks.js +42 -25
- package/packages/@monomind/cli/dist/src/commands/init.js +9 -4
- package/packages/@monomind/cli/dist/src/commands/issues.js +29 -26
- package/packages/@monomind/cli/dist/src/commands/mcp.js +11 -5
- package/packages/@monomind/cli/dist/src/commands/memory.js +10 -0
- package/packages/@monomind/cli/dist/src/commands/migrate.js +5 -5
- package/packages/@monomind/cli/dist/src/commands/monograph.js +18 -5
- package/packages/@monomind/cli/dist/src/commands/monovector/backup.js +8 -2
- package/packages/@monomind/cli/dist/src/commands/monovector/benchmark.js +20 -7
- package/packages/@monomind/cli/dist/src/commands/monovector/import.js +15 -0
- package/packages/@monomind/cli/dist/src/commands/monovector/migrate.js +4 -1
- package/packages/@monomind/cli/dist/src/commands/monovector/optimize.js +11 -0
- package/packages/@monomind/cli/dist/src/commands/monovector/setup.js +11 -1
- package/packages/@monomind/cli/dist/src/commands/neural.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/performance.js +20 -7
- package/packages/@monomind/cli/dist/src/commands/platforms.js +90 -8
- package/packages/@monomind/cli/dist/src/commands/plugins.js +12 -5
- package/packages/@monomind/cli/dist/src/commands/process.js +33 -10
- package/packages/@monomind/cli/dist/src/commands/progress.js +5 -3
- package/packages/@monomind/cli/dist/src/commands/providers.js +5 -5
- package/packages/@monomind/cli/dist/src/commands/replay.js +8 -2
- package/packages/@monomind/cli/dist/src/commands/route.js +27 -7
- package/packages/@monomind/cli/dist/src/commands/security.js +4 -0
- package/packages/@monomind/cli/dist/src/commands/session.js +12 -1
- package/packages/@monomind/cli/dist/src/commands/start.js +11 -4
- package/packages/@monomind/cli/dist/src/commands/status.js +7 -4
- package/packages/@monomind/cli/dist/src/commands/swarm.js +27 -13
- package/packages/@monomind/cli/dist/src/commands/task.js +26 -11
- package/packages/@monomind/cli/dist/src/commands/tokens.js +7 -2
- package/packages/@monomind/cli/dist/src/commands/transfer-store.js +36 -22
- package/packages/@monomind/cli/dist/src/commands/update.js +15 -3
- package/packages/@monomind/cli/dist/src/commands/workflow.js +39 -6
- package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +18 -7
- package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +25 -8
- package/packages/@monomind/cli/dist/src/index.js +7 -3
- package/packages/@monomind/cli/dist/src/init/executor.js +14 -11
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +20 -4
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +36 -15
- package/packages/@monomind/cli/dist/src/mcp-tools/a2a-tools.js +98 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +16 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +80 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +84 -22
- package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +35 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +82 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +37 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +49 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +45 -18
- package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +75 -25
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +32 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +91 -20
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +188 -29
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +25 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-compat.js +11 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +476 -62
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +44 -9
- package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +45 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +7 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +15 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/security-tools.js +61 -9
- package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +45 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +15 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +14 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +52 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +40 -6
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +37 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +29 -6
- package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +26 -10
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +80 -19
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +21 -2
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +67 -3
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +14 -4
- package/packages/@monomind/cli/dist/src/monovector/command-outcomes.js +43 -7
- package/packages/@monomind/cli/dist/src/monovector/coverage-router.js +8 -4
- package/packages/@monomind/cli/dist/src/monovector/coverage-tools.js +6 -3
- package/packages/@monomind/cli/dist/src/monovector/diff-classifier.js +13 -0
- package/packages/@monomind/cli/dist/src/monovector/route-outcomes.d.ts +2 -1
- package/packages/@monomind/cli/dist/src/monovector/route-outcomes.js +46 -4
- package/packages/@monomind/cli/dist/src/plugins/manager.js +8 -3
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +46 -2
- package/packages/@monomind/cli/dist/src/plugins/store/search.js +5 -4
- package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +17 -3
- package/packages/@monomind/cli/dist/src/production/error-handler.js +3 -0
- package/packages/@monomind/cli/dist/src/production/monitoring.js +20 -3
- package/packages/@monomind/cli/dist/src/production/rate-limiter.js +13 -4
- package/packages/@monomind/cli/dist/src/production/retry.js +17 -9
- package/packages/@monomind/cli/dist/src/routing/embed-worker.js +6 -2
- package/packages/@monomind/cli/dist/src/routing/embedder.js +0 -0
- package/packages/@monomind/cli/dist/src/routing/llm-caller.js +13 -2
- package/packages/@monomind/cli/dist/src/routing/route-layer-factory.js +18 -3
- package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/services/claim-service.js +8 -0
- package/packages/@monomind/cli/dist/src/services/config-file-manager.js +14 -2
- package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +18 -2
- package/packages/@monomind/cli/dist/src/services/worker-daemon.js +348 -17
- package/packages/@monomind/cli/dist/src/transfer/anonymization/index.d.ts +0 -3
- package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +16 -1
- package/packages/@monomind/cli/dist/src/transfer/export.js +8 -0
- package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +33 -3
- package/packages/@monomind/cli/dist/src/transfer/serialization/cfp.js +8 -2
- package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +37 -3
- package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +45 -3
- package/packages/@monomind/cli/dist/src/transfer/store/download.js +5 -0
- package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -1
- package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/transfer/store/registry.js +30 -5
- package/packages/@monomind/cli/dist/src/transfer/store/search.js +20 -5
- package/packages/@monomind/cli/dist/src/update/checker.js +59 -7
- package/packages/@monomind/cli/dist/src/update/executor.js +50 -3
- package/packages/@monomind/cli/dist/src/update/index.js +18 -1
- package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +6 -0
- package/packages/@monomind/cli/dist/src/update/rate-limiter.js +79 -7
- package/packages/@monomind/cli/dist/src/update/validator.js +52 -1
- 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
|
-
|
|
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
|
-
|
|
92
|
-
if (
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|