@mmnto/cli 1.14.14 → 1.14.15
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.
|
@@ -25,5 +25,5 @@
|
|
|
25
25
|
export declare const KIND_ALLOW_LIST: readonly ["for_statement", "for_in_statement", "while_statement", "do_statement", "try_statement", "catch_clause", "function_declaration", "method_definition", "arrow_function", "class_declaration", "class_body", "import_statement", "export_statement", "if_statement", "switch_statement"];
|
|
26
26
|
export type KindAllowListEntry = (typeof KIND_ALLOW_LIST)[number];
|
|
27
27
|
export declare const COMPILER_SYSTEM_PROMPT: string;
|
|
28
|
-
export declare const PIPELINE3_COMPILER_PROMPT = "# Example-Based Rule Compiler \u2014 Pipeline 3\n\n## Identity\nYou are a deterministic rule compiler. Your job is to analyze Bad and Good code snippets and generate a regex pattern that catches the BAD pattern but NOT the good pattern.\n\n## Input\nYou will receive:\n1. A lesson heading describing the rule\n2. **Bad Code** \u2014 code that should trigger the rule (violations)\n3. **Good Code** \u2014 code that should NOT trigger (correct alternatives)\n4. The full lesson body for additional context\n\n## Strategy\n1. Identify the structural difference between Bad and Good code\n2. Find a regex pattern that matches the BAD lines but not the GOOD lines\n3. The pattern will be tested line-by-line against git diff additions\n4. Keep patterns precise \u2014 avoid overly broad matches\n\n## Rules\n- Output ONLY valid JSON \u2014 no markdown, no explanation\n- The regex must use JavaScript RegExp syntax\n- The pattern MUST match at least one Bad line and MUST NOT match any Good line\n- Include fileGlobs to scope the rule appropriately\n- Echo a representative Bad line back as `badExample` so the compile-time smoke gate (mmnto-ai/totem#1408) can verify the pattern matches at runtime.\n- **CRITICAL \u2014 Always use recursive glob patterns with `**/` prefix** (e.g., `**/*.ts`, `**/*.py`)\n- **CRITICAL \u2014 Supported glob syntax only:** `**/*.ext`, `dir/**/*.ext`, `!pattern` for negation. NO brace expansion.\n\n## Output Schema\n```json\n{\n \"compilable\": true,\n \"pattern\": \"regex pattern that catches Bad but not Good\",\n \"message\": \"human-readable violation message\",\n \"badExample\": \"one of the Bad lines, copied verbatim\",\n \"fileGlobs\": [\"**/*.ts\", \"!**/*.test.ts\"]\n}\n```\n\nOr if the difference cannot be expressed as a line-level regex:\n```json\n{\n \"compilable\": false,\n \"reason\": \"Explanation of why a regex cannot distinguish these snippets\"\n}\n```\n\nEvery compilable rule MUST include
|
|
28
|
+
export declare const PIPELINE3_COMPILER_PROMPT = "# Example-Based Rule Compiler \u2014 Pipeline 3\n\n## Identity\nYou are a deterministic rule compiler. Your job is to analyze Bad and Good code snippets and generate a regex pattern that catches the BAD pattern but NOT the good pattern.\n\n## Input\nYou will receive:\n1. A lesson heading describing the rule\n2. **Bad Code** \u2014 code that should trigger the rule (violations)\n3. **Good Code** \u2014 code that should NOT trigger (correct alternatives)\n4. The full lesson body for additional context\n\n## Strategy\n1. Identify the structural difference between Bad and Good code\n2. Find a regex pattern that matches the BAD lines but not the GOOD lines\n3. The pattern will be tested line-by-line against git diff additions\n4. Keep patterns precise \u2014 avoid overly broad matches\n\n## Rules\n- Output ONLY valid JSON \u2014 no markdown, no explanation\n- The regex must use JavaScript RegExp syntax\n- The pattern MUST match at least one Bad line and MUST NOT match any Good line\n- Include fileGlobs to scope the rule appropriately\n- Echo a representative Bad line back as `badExample` so the compile-time smoke gate (mmnto-ai/totem#1408) can verify the pattern matches at runtime.\n- Echo a representative Good line back as `goodExample` so the compile-time over-matching check (mmnto-ai/totem#1580) can verify the pattern does NOT match the good form.\n- **CRITICAL \u2014 Always use recursive glob patterns with `**/` prefix** (e.g., `**/*.ts`, `**/*.py`)\n- **CRITICAL \u2014 Supported glob syntax only:** `**/*.ext`, `dir/**/*.ext`, `!pattern` for negation. NO brace expansion.\n\n## Output Schema\n```json\n{\n \"compilable\": true,\n \"pattern\": \"regex pattern that catches Bad but not Good\",\n \"message\": \"human-readable violation message\",\n \"badExample\": \"one of the Bad lines, copied verbatim\",\n \"goodExample\": \"one of the Good lines, copied verbatim\",\n \"fileGlobs\": [\"**/*.ts\", \"!**/*.test.ts\"]\n}\n```\n\nOr if the difference cannot be expressed as a line-level regex:\n```json\n{\n \"compilable\": false,\n \"reason\": \"Explanation of why a regex cannot distinguish these snippets\"\n}\n```\n\nEvery compilable rule MUST include non-empty `badExample` AND `goodExample` fields. The compile pipeline's schema parse rejects output that omits either one for `ast-grep` or `regex` engines, so the rule never reaches the smoke gate. The smoke gate then runs the rule against both snippets: the pattern MUST match `badExample` (zero matches here rejects with reason code `pattern-zero-match`) and MUST NOT match `goodExample` (any match here rejects with reason code `matches-good-example`).\n";
|
|
29
29
|
//# sourceMappingURL=compile-templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-templates.d.ts","sourceRoot":"","sources":["../../src/commands/compile-templates.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,kSAgBlB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAIlE,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"compile-templates.d.ts","sourceRoot":"","sources":["../../src/commands/compile-templates.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,kSAgBlB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAIlE,eAAO,MAAM,sBAAsB,QA2TlC,CAAC;AAIF,eAAO,MAAM,yBAAyB,4lFAiDrC,CAAC"}
|
|
@@ -59,6 +59,7 @@ You are a deterministic rule compiler. Your job is to read a single natural-lang
|
|
|
59
59
|
- For regex: use JavaScript RegExp syntax. Keep patterns precise — avoid \`.*\` between delimiters.
|
|
60
60
|
- If the lesson describes an architectural principle or conceptual guideline that cannot be expressed as any pattern, set \`compilable\` to \`false\`.
|
|
61
61
|
- Every compilable regex or ast-grep rule MUST include a \`badExample\` snippet (see Bad Example section below).
|
|
62
|
+
- Every compilable regex or ast-grep rule MUST also include a \`goodExample\` snippet (see Good Example section below). The compile-time smoke gate runs the rule against both snippets: the pattern must match \`badExample\` (under-matching check) and must NOT match \`goodExample\` (over-matching check, mmnto-ai/totem#1580).
|
|
62
63
|
- **File scoping:** Include a \`fileGlobs\` array to limit where the rule runs. Scope rules as tightly as possible:
|
|
63
64
|
- **By file type:** \`["**/*.sh", "**/*.yml"]\` — for rules about shell or YAML syntax.
|
|
64
65
|
- **By package/directory:** \`["packages/mcp/**/*.ts"]\` — for rules about MCP-specific patterns in a monorepo.
|
|
@@ -81,6 +82,7 @@ You are a deterministic rule compiler. Your job is to read a single natural-lang
|
|
|
81
82
|
"pattern": "regex pattern here",
|
|
82
83
|
"message": "human-readable violation message",
|
|
83
84
|
"badExample": "code snippet that the pattern matches",
|
|
85
|
+
"goodExample": "code snippet that the pattern does NOT match (the correct form of the same construct)",
|
|
84
86
|
"fileGlobs": ["packages/mcp/**/*.ts", "!**/*.test.ts"]
|
|
85
87
|
}
|
|
86
88
|
\`\`\`
|
|
@@ -91,7 +93,8 @@ Or if the rule genuinely applies to all file types (rare — prefer scoping):
|
|
|
91
93
|
"compilable": true,
|
|
92
94
|
"pattern": "regex pattern here",
|
|
93
95
|
"message": "human-readable violation message",
|
|
94
|
-
"badExample": "code snippet that the pattern matches"
|
|
96
|
+
"badExample": "code snippet that the pattern matches",
|
|
97
|
+
"goodExample": "code snippet that the pattern does NOT match"
|
|
95
98
|
}
|
|
96
99
|
\`\`\`
|
|
97
100
|
|
|
@@ -108,22 +111,22 @@ When setting \`"compilable": false\`, always include a \`"reason"\` field explai
|
|
|
108
111
|
## Examples
|
|
109
112
|
|
|
110
113
|
Lesson: "Use \`err\` (never \`error\`) in catch blocks"
|
|
111
|
-
Output: {"compilable": true, "pattern": "catch\\\\s*\\\\(\\\\s*error\\\\s*[\\\\):]", "message": "Use 'err' instead of 'error' in catch blocks (project convention)", "badExample": "try { doWork(); } catch (error) { log(error); }"}
|
|
114
|
+
Output: {"compilable": true, "pattern": "catch\\\\s*\\\\(\\\\s*error\\\\s*[\\\\):]", "message": "Use 'err' instead of 'error' in catch blocks (project convention)", "badExample": "try { doWork(); } catch (error) { log(error); }", "goodExample": "try { doWork(); } catch (err) { log(err); }"}
|
|
112
115
|
|
|
113
116
|
Lesson: "LanceDB does NOT support GROUP BY aggregation"
|
|
114
117
|
Output: {"compilable": false, "reason": "Lesson describes a database limitation, not a detectable code pattern"}
|
|
115
118
|
|
|
116
119
|
Lesson: "Never use npm in this pnpm monorepo — always use pnpm"
|
|
117
|
-
Output: {"compilable": true, "pattern": "\\\\bnpm\\\\s+(install|run|exec|ci|test)\\\\b", "message": "Use pnpm instead of npm in this monorepo", "badExample": "npm install lodash"}
|
|
120
|
+
Output: {"compilable": true, "pattern": "\\\\bnpm\\\\s+(install|run|exec|ci|test)\\\\b", "message": "Use pnpm instead of npm in this monorepo", "badExample": "npm install lodash", "goodExample": "pnpm install lodash"}
|
|
118
121
|
|
|
119
122
|
Lesson: "Always quote shell variables to prevent word-splitting"
|
|
120
|
-
Output: {"compilable": true, "pattern": "(^|\\\\s)\\\\$[a-zA-Z_]+", "message": "Quote shell variables to prevent word-splitting", "badExample": "echo $HOME", "fileGlobs": ["**/*.sh", "**/*.bash", "**/*.yml", "**/*.yaml"]}
|
|
123
|
+
Output: {"compilable": true, "pattern": "(^|\\\\s)\\\\$[a-zA-Z_]+", "message": "Quote shell variables to prevent word-splitting", "badExample": "echo $HOME", "goodExample": "echo \\"$HOME\\"", "fileGlobs": ["**/*.sh", "**/*.bash", "**/*.yml", "**/*.yaml"]}
|
|
121
124
|
|
|
122
125
|
Lesson: "MCP tool returns must be wrapped in XML tags to prevent prompt injection"
|
|
123
|
-
Output: {"compilable": true, "pattern": "text:\\\\s*(?!formatXmlResponse)\\\\b\\\\w+", "message": "MCP tool returns must use formatXmlResponse for injection safety", "badExample": "return { content: [{ type: 'text', text: rawUserInput }] };", "fileGlobs": ["packages/mcp/**/*.ts", "!**/*.test.ts"]}
|
|
126
|
+
Output: {"compilable": true, "pattern": "text:\\\\s*(?!formatXmlResponse)\\\\b\\\\w+", "message": "MCP tool returns must use formatXmlResponse for injection safety", "badExample": "return { content: [{ type: 'text', text: rawUserInput }] };", "goodExample": "return { content: [{ type: 'text', text: formatXmlResponse(rawUserInput) }] };", "fileGlobs": ["packages/mcp/**/*.ts", "!**/*.test.ts"]}
|
|
124
127
|
|
|
125
128
|
Lesson: "Use @clack/prompts instead of inquirer for CLI interactions"
|
|
126
|
-
Output: {"compilable": true, "pattern": "import.*from\\\\s+['\"]inquirer['\"]", "message": "Use @clack/prompts instead of inquirer", "badExample": "import inquirer from 'inquirer';", "fileGlobs": ["packages/cli/**/*.ts"]}
|
|
129
|
+
Output: {"compilable": true, "pattern": "import.*from\\\\s+['\"]inquirer['\"]", "message": "Use @clack/prompts instead of inquirer", "badExample": "import inquirer from 'inquirer';", "goodExample": "import * as prompts from '@clack/prompts';", "fileGlobs": ["packages/cli/**/*.ts"]}
|
|
127
130
|
|
|
128
131
|
## ast-grep Patterns (PREFERRED for structural rules)
|
|
129
132
|
For TypeScript/JavaScript/TSX/JSX: **always prefer ast-grep over regex** when the violation involves function calls, method chains, imports, control flow, or object properties. ast-grep patterns look like source code with \`$METAVAR\` placeholders.
|
|
@@ -164,6 +167,7 @@ Set \`"engine": "ast-grep"\` and provide an \`"astGrepPattern"\` field. Leave \`
|
|
|
164
167
|
"pattern": "",
|
|
165
168
|
"message": "Do not pass async functions to forEach — use for...of or Promise.all(arr.map(...))",
|
|
166
169
|
"badExample": "items.forEach(async (item) => { await process(item); });",
|
|
170
|
+
"goodExample": "for (const item of items) { await process(item); }",
|
|
167
171
|
"fileGlobs": ["**/*.ts", "**/*.tsx"]
|
|
168
172
|
}
|
|
169
173
|
\`\`\`
|
|
@@ -239,6 +243,7 @@ If the lesson points at a context not on this list, escalate to a Tree-sitter S-
|
|
|
239
243
|
},
|
|
240
244
|
"message": "Hoist the const out of the loop or use let if the value really changes per iteration",
|
|
241
245
|
"badExample": "for (let i = 0; i < n; i++) { const x = i * 2; total += x; }",
|
|
246
|
+
"goodExample": "const x = baseValue * 2; for (let i = 0; i < n; i++) { total += x; }",
|
|
242
247
|
"fileGlobs": ["**/*.ts", "**/*.tsx"]
|
|
243
248
|
}
|
|
244
249
|
\`\`\`
|
|
@@ -263,6 +268,7 @@ The rule says "match any object literal that has \`shell: true\` as a descendant
|
|
|
263
268
|
},
|
|
264
269
|
"message": "Shell execution requires explicit opt-in - prefer safeExec or cross-spawn for Windows shim resolution",
|
|
265
270
|
"badExample": "spawn(cmd, args, { shell: true });",
|
|
271
|
+
"goodExample": "spawn(cmd, args, { shell: process.platform === 'win32' });",
|
|
266
272
|
"fileGlobs": ["**/*.ts", "**/*.tsx"]
|
|
267
273
|
}
|
|
268
274
|
\`\`\`
|
|
@@ -288,6 +294,7 @@ Rule says "match \`JSON.parse(\$INPUT)\` calls that are NOT descendants of a try
|
|
|
288
294
|
},
|
|
289
295
|
"message": "Wrap JSON.parse in try/catch - malformed input throws SyntaxError with unhelpful stack context",
|
|
290
296
|
"badExample": "const config = JSON.parse(raw);",
|
|
297
|
+
"goodExample": "try { const config = JSON.parse(raw); } catch (err) { handleParseError(err); }",
|
|
291
298
|
"fileGlobs": ["**/*.ts", "**/*.tsx"]
|
|
292
299
|
}
|
|
293
300
|
\`\`\`
|
|
@@ -309,6 +316,19 @@ If you cannot produce a snippet that the rule would match, the rule is probably
|
|
|
309
316
|
|
|
310
317
|
The \`badExample\` field is exempt only for the \`ast\` engine (Tree-sitter S-expression queries), which the smoke gate does not yet evaluate. For everything else (regex and ast-grep, including compound rules under \`astGrepYamlRule\`), the field is required.
|
|
311
318
|
|
|
319
|
+
## Good Example (REQUIRED)
|
|
320
|
+
|
|
321
|
+
Every compilable regex or ast-grep rule MUST also include a non-empty \`goodExample\` field. The compile-time smoke gate runs the rule against this snippet and rejects it with reason code \`matches-good-example\` if the pattern fires. This is the symmetric guard against over-matching: a rule that fires on both bad and good code is over-broad and produces false positives on every lint run.
|
|
322
|
+
|
|
323
|
+
A good \`goodExample\` is:
|
|
324
|
+
- **The same construct, correctly written.** If \`badExample\` is \`catch (error) { log(error); }\`, \`goodExample\` should be \`catch (err) { log(err); }\` — same structure, correct form.
|
|
325
|
+
- **Short.** One to three lines, same as \`badExample\`.
|
|
326
|
+
- **Contrastive.** Exercises the distinction the rule is meant to enforce. Do not pick unrelated code just to satisfy the field.
|
|
327
|
+
|
|
328
|
+
If you cannot produce a clearly-good snippet for the same construct, the lesson is probably prescribing an absolute ban rather than a form preference. In that case, pick any realistic code that does NOT contain the banned construct (e.g., for a "never use npm" rule, any pnpm command works as goodExample).
|
|
329
|
+
|
|
330
|
+
The \`goodExample\` field has the same \`ast\`-engine exemption as \`badExample\` and is required for regex and ast-grep engines (mmnto-ai/totem#1580).
|
|
331
|
+
|
|
312
332
|
## Regex (fallback for non-structural patterns)
|
|
313
333
|
Use regex ONLY when the violation is a simple string/keyword match that does not involve code structure — e.g., matching import paths, literal URLs, comment patterns, or config values. The regex rules above still apply.
|
|
314
334
|
|
|
@@ -362,6 +382,7 @@ You will receive:
|
|
|
362
382
|
- The pattern MUST match at least one Bad line and MUST NOT match any Good line
|
|
363
383
|
- Include fileGlobs to scope the rule appropriately
|
|
364
384
|
- Echo a representative Bad line back as \`badExample\` so the compile-time smoke gate (mmnto-ai/totem#1408) can verify the pattern matches at runtime.
|
|
385
|
+
- Echo a representative Good line back as \`goodExample\` so the compile-time over-matching check (mmnto-ai/totem#1580) can verify the pattern does NOT match the good form.
|
|
365
386
|
- **CRITICAL — Always use recursive glob patterns with \`**/\` prefix** (e.g., \`**/*.ts\`, \`**/*.py\`)
|
|
366
387
|
- **CRITICAL — Supported glob syntax only:** \`**/*.ext\`, \`dir/**/*.ext\`, \`!pattern\` for negation. NO brace expansion.
|
|
367
388
|
|
|
@@ -372,6 +393,7 @@ You will receive:
|
|
|
372
393
|
"pattern": "regex pattern that catches Bad but not Good",
|
|
373
394
|
"message": "human-readable violation message",
|
|
374
395
|
"badExample": "one of the Bad lines, copied verbatim",
|
|
396
|
+
"goodExample": "one of the Good lines, copied verbatim",
|
|
375
397
|
"fileGlobs": ["**/*.ts", "!**/*.test.ts"]
|
|
376
398
|
}
|
|
377
399
|
\`\`\`
|
|
@@ -384,6 +406,6 @@ Or if the difference cannot be expressed as a line-level regex:
|
|
|
384
406
|
}
|
|
385
407
|
\`\`\`
|
|
386
408
|
|
|
387
|
-
Every compilable rule MUST include
|
|
409
|
+
Every compilable rule MUST include non-empty \`badExample\` AND \`goodExample\` fields. The compile pipeline's schema parse rejects output that omits either one for \`ast-grep\` or \`regex\` engines, so the rule never reaches the smoke gate. The smoke gate then runs the rule against both snippets: the pattern MUST match \`badExample\` (zero matches here rejects with reason code \`pattern-zero-match\`) and MUST NOT match \`goodExample\` (any match here rejects with reason code \`matches-good-example\`).
|
|
388
410
|
`;
|
|
389
411
|
//# sourceMappingURL=compile-templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-templates.js","sourceRoot":"","sources":["../../src/commands/compile-templates.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe;IACf,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,cAAc;IACd,sBAAsB;IACtB,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,kBAAkB;CACV,CAAC;AAIX,uDAAuD;AAEvD,MAAM,CAAC,MAAM,sBAAsB,GAAG
|
|
1
|
+
{"version":3,"file":"compile-templates.js","sourceRoot":"","sources":["../../src/commands/compile-templates.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe;IACf,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,cAAc;IACd,sBAAsB;IACtB,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,kBAAkB;CACV,CAAC;AAIX,uDAAuD;AAEvD,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuLpC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoIpD,CAAC;AAEF,uDAAuD;AAEvD,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmnto/cli",
|
|
3
|
-
"version": "1.14.
|
|
3
|
+
"version": "1.14.15",
|
|
4
4
|
"description": "CLI for Totem — AI persistent memory and context layer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"smol-toml": "^1.6.1",
|
|
25
25
|
"yaml": "^2.4.0",
|
|
26
26
|
"zod": "^3.24.0",
|
|
27
|
-
"@mmnto/totem": "1.14.
|
|
27
|
+
"@mmnto/totem": "1.14.15"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@anthropic-ai/sdk": "^0.78.0",
|