@plumpslabs/kuma 2.3.2 → 2.3.3

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getDb,
3
3
  saveDb
4
- } from "./chunk-5N6KXACT.js";
4
+ } from "./chunk-MTH4DRP7.js";
5
5
  import {
6
6
  getProjectRoot
7
7
  } from "./chunk-E2KFPEBT.js";
@@ -458,7 +458,7 @@ The two nodes may not be connected in the knowledge graph yet. Use more tools to
458
458
  }
459
459
  async function buildFromSessionMemory() {
460
460
  try {
461
- const { sessionMemory } = await import("./sessionMemory-LI4FIAMF.js");
461
+ const { sessionMemory } = await import("./sessionMemory-45V6XJRH.js");
462
462
  const toolCalls = sessionMemory.getToolCallHistory(50);
463
463
  let edgeCount = 0;
464
464
  for (const call of toolCalls) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionMemory
3
- } from "./chunk-SU7BTOND.js";
3
+ } from "./chunk-N6QMWZGQ.js";
4
4
  import {
5
5
  getProjectRoot
6
6
  } from "./chunk-E2KFPEBT.js";
@@ -239,6 +239,29 @@ function createSchema(db) {
239
239
  created_at INTEGER NOT NULL DEFAULT (strftime('%s','now')),
240
240
  updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
241
241
  )`);
242
+ db.run(`CREATE TABLE IF NOT EXISTS otel_config (
243
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
244
+ endpoint TEXT,
245
+ service_name TEXT DEFAULT 'kuma',
246
+ enabled INTEGER DEFAULT 0,
247
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
248
+ )`);
249
+ db.run(`CREATE TABLE IF NOT EXISTS cost_tracking (
250
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
251
+ session_id INTEGER REFERENCES sessions(id),
252
+ tool_name TEXT NOT NULL,
253
+ token_estimate INTEGER DEFAULT 0,
254
+ cost_estimate REAL DEFAULT 0.0,
255
+ budget_limit REAL DEFAULT 0.0,
256
+ escalated INTEGER DEFAULT 0,
257
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
258
+ )`);
259
+ db.run(`CREATE TABLE IF NOT EXISTS scratch_entries (
260
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
261
+ file_path TEXT NOT NULL,
262
+ reason TEXT,
263
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
264
+ )`);
242
265
  db.run(`CREATE TABLE IF NOT EXISTS verifications (
243
266
  id INTEGER PRIMARY KEY AUTOINCREMENT,
244
267
  scope TEXT NOT NULL,
@@ -320,7 +320,7 @@ No unresolved issues.`;
320
320
  */
321
321
  async autoTrackToDb(toolName, params, timestamp) {
322
322
  try {
323
- const { getDb, saveDb } = await import("./kumaDb-RC2EO3OB.js");
323
+ const { getDb, saveDb } = await import("./kumaDb-7VSQ4QLW.js");
324
324
  const db = await getDb();
325
325
  db.run(
326
326
  `INSERT INTO tool_calls (tool_name, params, success, duration_ms, created_at) VALUES (?, ?, 1, 0, ?)`,
@@ -597,7 +597,7 @@ No unresolved issues.`;
597
597
  this.addModifiedFile(filePath);
598
598
  }
599
599
  try {
600
- const { recordChange } = await import("./kumaDb-RC2EO3OB.js");
600
+ const { recordChange } = await import("./kumaDb-7VSQ4QLW.js");
601
601
  const gitHash = this.getGitHead();
602
602
  await recordChange({ filePath, changeType, symbol, gitCommitHash: gitHash || void 0 });
603
603
  } catch {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionMemory
3
- } from "./chunk-SU7BTOND.js";
3
+ } from "./chunk-N6QMWZGQ.js";
4
4
  import {
5
5
  getProjectRoot
6
6
  } from "./chunk-E2KFPEBT.js";
@@ -82,7 +82,7 @@ function recordDecision(decision) {
82
82
  }
83
83
  async function recordDecisionToGraph(decision) {
84
84
  try {
85
- const { upsertNode, addEdge } = await import("./kumaGraph-5IZ4FDZA.js");
85
+ const { upsertNode, addEdge } = await import("./kumaGraph-NHEAXC2V.js");
86
86
  const decisionId = `decision::${decision.title.replace(/[^a-zA-Z0-9_\-\s]/g, "").trim().replace(/\s+/g, "-")}`;
87
87
  await upsertNode({
88
88
  id: decisionId,
package/dist/index.js CHANGED
@@ -14,13 +14,13 @@ import {
14
14
  getGraphStats,
15
15
  searchGraph,
16
16
  traceFlow
17
- } from "./chunk-EQ2CE4UC.js";
17
+ } from "./chunk-FSDW4F3U.js";
18
18
  import {
19
19
  buildDriftMessages,
20
20
  getGitDiffStat,
21
21
  getSessionStats,
22
22
  getUnresolvedCount
23
- } from "./chunk-JIL533AM.js";
23
+ } from "./chunk-MSKQRKME.js";
24
24
  import {
25
25
  addContextNote,
26
26
  addSecurityFinding,
@@ -46,16 +46,16 @@ import {
46
46
  saveResearchCache,
47
47
  updateDecisionStatus,
48
48
  updateTodoStatus
49
- } from "./chunk-5N6KXACT.js";
49
+ } from "./chunk-MTH4DRP7.js";
50
50
  import {
51
51
  formatDecisionTemplate,
52
52
  getProactiveMemories,
53
53
  recordDecision,
54
54
  scoreMemoryRelevance
55
- } from "./chunk-EIK7T746.js";
55
+ } from "./chunk-RWPJ5RWM.js";
56
56
  import {
57
57
  sessionMemory
58
- } from "./chunk-SU7BTOND.js";
58
+ } from "./chunk-N6QMWZGQ.js";
59
59
  import {
60
60
  getProjectRoot,
61
61
  validateFilePath
@@ -74,8 +74,49 @@ import { z } from "zod";
74
74
  import fs from "fs";
75
75
  import path from "path";
76
76
  import crypto from "crypto";
77
+ var CONTEXT_ALIASES = {
78
+ // Research synonyms
79
+ "research": "research",
80
+ "search": "research",
81
+ "explore": "research",
82
+ "inspect": "research",
83
+ // Impact synonyms
84
+ "analyze": "impact",
85
+ "impact": "impact",
86
+ "whatif": "impact",
87
+ "refactor": "impact",
88
+ // Navigate synonyms
89
+ "trace": "navigate",
90
+ "flow": "navigate",
91
+ "navigate": "navigate",
92
+ // Init synonyms
93
+ "init": "init",
94
+ "start": "init",
95
+ "load": "init",
96
+ "brief": "init",
97
+ "project": "init",
98
+ "summary": "init",
99
+ // Changes synonyms
100
+ "changes": "changes",
101
+ "log": "changes",
102
+ "history": "changes",
103
+ // Health synonyms
104
+ "health": "health",
105
+ "score": "health",
106
+ "status": "health",
107
+ // Rollback synonyms
108
+ "rollback": "rollback",
109
+ "undo": "rollback",
110
+ "revert": "rollback",
111
+ // Researches synonyms
112
+ "researches": "researches",
113
+ "research-list": "researches",
114
+ "list-research": "researches"
115
+ };
77
116
  async function handleContext(params) {
78
- const { action } = params;
117
+ const rawAction = params.action || "init";
118
+ const resolvedAction = CONTEXT_ALIASES[rawAction.toLowerCase()] || rawAction;
119
+ const action = resolvedAction;
79
120
  switch (action) {
80
121
  case "init":
81
122
  return handleInit(params);
@@ -155,8 +196,8 @@ async function handleInit(_params) {
155
196
  lines.push(` \u{1F4DD} Modified: ${summary.modifiedFiles?.length || 0} file(s)`);
156
197
  lines.push(` \u{1F6E0}\uFE0F Tool calls: ${summary.toolCallCount}`);
157
198
  try {
158
- const { computeSafetyScore, formatSafetyScore } = await import("./safetyScore-QX2LBJ7H.js");
159
- const { saveHealthSnapshot: saveHealthSnapshot2 } = await import("./kumaDb-RC2EO3OB.js");
199
+ const { computeSafetyScore, formatSafetyScore } = await import("./safetyScore-GX2YMCQT.js");
200
+ const { saveHealthSnapshot: saveHealthSnapshot2 } = await import("./kumaDb-7VSQ4QLW.js");
160
201
  const score = await computeSafetyScore(_params.goal);
161
202
  const checksStr = JSON.stringify(score.checks);
162
203
  await saveHealthSnapshot2(score.score, score.risk, checksStr, score.summary);
@@ -329,8 +370,8 @@ async function handleResearches(_params) {
329
370
  async function handleHealth(_params) {
330
371
  sessionMemory.recordToolCall("kuma_context_health", {});
331
372
  try {
332
- const { computeSafetyScore, formatSafetyScore } = await import("./safetyScore-QX2LBJ7H.js");
333
- const { saveHealthSnapshot: saveHealthSnapshot2 } = await import("./kumaDb-RC2EO3OB.js");
373
+ const { computeSafetyScore, formatSafetyScore } = await import("./safetyScore-GX2YMCQT.js");
374
+ const { saveHealthSnapshot: saveHealthSnapshot2 } = await import("./kumaDb-7VSQ4QLW.js");
334
375
  const score = await computeSafetyScore();
335
376
  const checksStr = JSON.stringify(score.checks);
336
377
  await saveHealthSnapshot2(score.score, score.risk, checksStr, score.summary);
@@ -361,9 +402,72 @@ function computeProjectHash(scope) {
361
402
  // src/tools/kumaMemoryTool.ts
362
403
  import fs2 from "fs";
363
404
  import path2 from "path";
405
+ var MEMORY_ALIASES = {
406
+ // Session synonyms
407
+ "session": "session",
408
+ "summary": "session",
409
+ "status": "session",
410
+ "get": "session",
411
+ "read": "session",
412
+ "fetch": "session",
413
+ "current": "session",
414
+ // Decision synonyms
415
+ "decision": "decision",
416
+ "adr": "decision",
417
+ "record-decision": "decision",
418
+ // Research save synonyms
419
+ "research_save": "research_save",
420
+ "save": "research_save",
421
+ "store": "research_save",
422
+ "write": "research_save",
423
+ "persist": "research_save",
424
+ "cache": "research_save",
425
+ // Mine synonyms
426
+ "mine": "mine",
427
+ "mine-decisions": "mine",
428
+ "git-mine": "mine",
429
+ "dig": "mine",
430
+ // Heal synonyms
431
+ "heal": "heal",
432
+ "repair": "heal",
433
+ "fix-graph": "heal",
434
+ "clean-graph": "heal",
435
+ // Search synonyms
436
+ "search": "search",
437
+ "find": "search",
438
+ "query": "search",
439
+ "lookup": "search",
440
+ // Todo synonyms
441
+ "todo": "todo",
442
+ "task": "todo",
443
+ "todos": "todo",
444
+ "tasks": "todo",
445
+ // Context notes synonyms
446
+ "context": "context",
447
+ "notes": "context",
448
+ "note": "context",
449
+ "inject": "context",
450
+ "context-note": "context",
451
+ // Benchmark synonyms
452
+ "benchmark": "benchmark",
453
+ "perf": "benchmark",
454
+ "metrics": "benchmark",
455
+ "measure": "benchmark",
456
+ // Decision log synonyms
457
+ "decision_log": "decision_log",
458
+ "decisions": "decision_log",
459
+ "log": "decision_log",
460
+ "decision-log": "decision_log",
461
+ // Changes synonyms
462
+ "changes": "changes",
463
+ "change-log": "changes",
464
+ "history": "changes"
465
+ };
364
466
  async function handleMemory(params) {
365
- const { action } = params;
366
- sessionMemory.recordToolCall("kuma_memory", { action });
467
+ const rawAction = params.action || "session";
468
+ const key = rawAction.toLowerCase().replace(/[\s_-]+/g, "-");
469
+ const action = MEMORY_ALIASES[key] || rawAction;
470
+ sessionMemory.recordToolCall("kuma_memory", { action: rawAction });
367
471
  switch (action) {
368
472
  case "decision":
369
473
  return handleDecision(params);
@@ -397,7 +501,7 @@ async function handleDecision(params) {
397
501
  case "template":
398
502
  return formatDecisionTemplate();
399
503
  case "suggest": {
400
- const { shouldRecordDecision } = await import("./kumaMemory-ME4XWD5Z.js");
504
+ const { shouldRecordDecision } = await import("./kumaMemory-UFRSJTWL.js");
401
505
  const check = shouldRecordDecision();
402
506
  return check.worth ? `\u{1F4A1} Decision suggested: "${check.title}"
403
507
  Use kuma_memory({ action: 'decision', title: '...', context: '...', rationale: '...', outcome: '...' }) to record.` : "\u2705 No decision needed at this time.";
@@ -475,7 +579,7 @@ async function handleSearch(params) {
475
579
  if (!query) return "\u26A0\uFE0F query or scope parameter required.";
476
580
  const limit = params.limit || 20;
477
581
  const memResults = sessionMemory.searchMemory(query, limit);
478
- const { searchGraph: searchGraph2 } = await import("./kumaGraph-5IZ4FDZA.js");
582
+ const { searchGraph: searchGraph2 } = await import("./kumaGraph-NHEAXC2V.js");
479
583
  const graphResults = await searchGraph2(query, Math.min(limit, 10));
480
584
  const lines = [`\u{1F50D} **Search Results** \u2014 "${query}"
481
585
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
@@ -550,7 +654,7 @@ async function handleDecisionLog(params) {
550
654
  }
551
655
  async function handleMine(params) {
552
656
  sessionMemory.recordToolCall("kuma_memory_mine", { scope: params.scope });
553
- const { mineHistoricalDecisions } = await import("./kumaMiner-GFEGUWGH.js");
657
+ const { mineHistoricalDecisions } = await import("./kumaMiner-UFDDVBRP.js");
554
658
  return await mineHistoricalDecisions({
555
659
  scope: params.scope,
556
660
  since: typeof params.since === "string" ? params.since : void 0,
@@ -1270,7 +1374,7 @@ function findPatchScripts(projectRoot) {
1270
1374
  const ext = path5.extname(file).toLowerCase();
1271
1375
  if (!SCRIPT_EXTENSIONS.includes(ext)) continue;
1272
1376
  const relativePath = path5.relative(projectRoot, file);
1273
- if (relativePath.startsWith("src") || relativePath.startsWith("test") || relativePath.startsWith("node_modules") || relativePath.startsWith(".")) {
1377
+ if (relativePath.startsWith("src") || relativePath.startsWith("test") || relativePath.startsWith("node_modules") || relativePath.startsWith(".") || relativePath.startsWith(".kuma/scratch")) {
1274
1378
  continue;
1275
1379
  }
1276
1380
  try {
@@ -1642,6 +1746,8 @@ async function handleSafety(params) {
1642
1746
  return handlePortability(params);
1643
1747
  case "gitignore":
1644
1748
  return handleGitignore(params);
1749
+ case "clean":
1750
+ return handleClean(params);
1645
1751
  default:
1646
1752
  return `Unknown action "${action}".`;
1647
1753
  }
@@ -1685,7 +1791,7 @@ async function handleLock(params) {
1685
1791
  }
1686
1792
  async function handleHealth2(_params) {
1687
1793
  try {
1688
- const { computeSafetyScore, formatSafetyScore } = await import("./safetyScore-QX2LBJ7H.js");
1794
+ const { computeSafetyScore, formatSafetyScore } = await import("./safetyScore-GX2YMCQT.js");
1689
1795
  const score = await computeSafetyScore();
1690
1796
  await saveHealthSnapshot(score.score, score.risk, JSON.stringify(score.checks), score.summary);
1691
1797
  return formatSafetyScore(score);
@@ -1757,9 +1863,41 @@ async function handleGitignore(_params) {
1757
1863
  sessionMemory.recordToolCall("kuma_safety_gitignore", {});
1758
1864
  return await ensureGitignore();
1759
1865
  }
1866
+ async function handleClean(_params) {
1867
+ sessionMemory.recordToolCall("kuma_safety_clean", {});
1868
+ const fs7 = await import("fs");
1869
+ const path7 = await import("path");
1870
+ const root = process.cwd();
1871
+ const scratchDir = path7.resolve(root, ".kuma", "scratch");
1872
+ let removed = 0;
1873
+ if (fs7.existsSync(scratchDir)) {
1874
+ try {
1875
+ const entries = fs7.readdirSync(scratchDir);
1876
+ for (const entry of entries) {
1877
+ const fullPath = path7.join(scratchDir, entry);
1878
+ try {
1879
+ const stat = fs7.statSync(fullPath);
1880
+ if (stat.isFile()) {
1881
+ fs7.unlinkSync(fullPath);
1882
+ removed++;
1883
+ } else if (stat.isDirectory()) {
1884
+ fs7.rmSync(fullPath, { recursive: true, force: true });
1885
+ removed++;
1886
+ }
1887
+ } catch {
1888
+ }
1889
+ }
1890
+ } catch {
1891
+ }
1892
+ }
1893
+ sessionMemory.setGoal(sessionMemory.getSummary().currentGoal || "cleaned");
1894
+ const result = removed > 0 ? `\u{1F9F9} **Scratch Clean** \u2014 Removed ${removed} item(s) from .kuma/scratch/` : `\u{1F9F9} **Scratch Clean** \u2014 No scratch files to clean.`;
1895
+ return `${result}
1896
+ \u{1F4A1} Drift warnings have been reset. Any temporary debug artifacts are now cleared.`;
1897
+ }
1760
1898
  async function handleVerify(params) {
1761
1899
  sessionMemory.recordToolCall("kuma_safety_verify", { scope: params.scope || params.filePath });
1762
- const { runAutoVerification } = await import("./kumaVerifier-VYW5WH6V.js");
1900
+ const { runAutoVerification } = await import("./kumaVerifier-Y4FQ2LOD.js");
1763
1901
  return await runAutoVerification({
1764
1902
  scope: params.scope || params.filePath,
1765
1903
  force: params.force,
@@ -1864,7 +2002,7 @@ function registerAllTools(server) {
1864
2002
  "kuma_safety",
1865
2003
  "Safety checks, policy enforcement, security scanning, integrated auto-verification, and project hygiene. Actions: guard (anti-pattern detection), verify (auto-run scoped tests), check (pre-exec safety), audit (query trail), lock (multi-agent), health (score), security (scan for leaks), gc (garbage collection), doctor (health check), portability (path check), gitignore (auto-config), override (bypass).",
1866
2004
  {
1867
- action: z.enum(["guard", "verify", "check", "audit", "lock", "health", "override", "security", "gc", "doctor", "portability", "gitignore"]).describe("Safety action: guard=anti-patterns, verify=auto-run scoped tests, check=pre-exec safety, audit=query trail, lock=multi-agent, health=score, security=scan leaks, gc=garbage collect, doctor=health check, portability=paths, gitignore=config, override=bypass"),
2005
+ action: z.enum(["guard", "verify", "check", "audit", "lock", "health", "override", "security", "gc", "doctor", "portability", "gitignore", "clean"]).describe("Safety action: guard=anti-patterns, verify=auto-run scoped tests, check=pre-exec safety, audit=query trail, lock=multi-agent, health=score, security=scan leaks, gc=garbage collect, doctor=health check, portability=paths, gitignore=config, clean=purge scratch dir & drift, override=bypass"),
1868
2006
  // Verify params
1869
2007
  scope: z.string().optional().describe("Scope for verify or context (e.g. 'auth', file path)"),
1870
2008
  // Guard params
@@ -2100,7 +2238,7 @@ async function main() {
2100
2238
  console.error(`[${SERVER_NAME}] \u2705 Restored session (${sessionInfo.toolCallCount} previous tool calls)`);
2101
2239
  }
2102
2240
  try {
2103
- const { buildFromSessionMemory } = await import("./kumaGraph-5IZ4FDZA.js");
2241
+ const { buildFromSessionMemory } = await import("./kumaGraph-NHEAXC2V.js");
2104
2242
  const edgeCount = await buildFromSessionMemory();
2105
2243
  if (edgeCount > 0) {
2106
2244
  console.error(`[${SERVER_NAME}] \u2705 Graph auto-populated with ${edgeCount} entries from session memory`);
@@ -2109,7 +2247,18 @@ async function main() {
2109
2247
  console.error(`[${SERVER_NAME}] \u26A0\uFE0F Graph auto-population: ${err}`);
2110
2248
  }
2111
2249
  try {
2112
- const { getDb: getDb2, saveDb: saveDb2 } = await import("./kumaDb-RC2EO3OB.js");
2250
+ const fs7 = await import("fs");
2251
+ const path7 = await import("path");
2252
+ const scratchDir = path7.resolve(process.cwd(), ".kuma", "scratch");
2253
+ if (!fs7.existsSync(scratchDir)) {
2254
+ fs7.mkdirSync(scratchDir, { recursive: true });
2255
+ console.error(`[${SERVER_NAME}] \u2705 Created .kuma/scratch/ for temporary debug artifacts`);
2256
+ }
2257
+ } catch (err) {
2258
+ console.error(`[${SERVER_NAME}] \u26A0\uFE0F Scratch directory setup: ${err}`);
2259
+ }
2260
+ try {
2261
+ const { getDb: getDb2, saveDb: saveDb2 } = await import("./kumaDb-7VSQ4QLW.js");
2113
2262
  const db = await getDb2();
2114
2263
  db.run(
2115
2264
  `INSERT INTO sessions (started_at, goal, tool_calls) VALUES (?, ?, ?)`,
@@ -28,7 +28,7 @@ import {
28
28
  saveVerification,
29
29
  updateDecisionStatus,
30
30
  updateTodoStatus
31
- } from "./chunk-5N6KXACT.js";
31
+ } from "./chunk-MTH4DRP7.js";
32
32
  import "./chunk-E2KFPEBT.js";
33
33
  export {
34
34
  addContextNote,
@@ -14,8 +14,8 @@ import {
14
14
  searchGraph,
15
15
  traceFlow,
16
16
  upsertNode
17
- } from "./chunk-EQ2CE4UC.js";
18
- import "./chunk-5N6KXACT.js";
17
+ } from "./chunk-FSDW4F3U.js";
18
+ import "./chunk-MTH4DRP7.js";
19
19
  import "./chunk-E2KFPEBT.js";
20
20
  export {
21
21
  addEdge,
@@ -4,8 +4,8 @@ import {
4
4
  recordDecision,
5
5
  scoreMemoryRelevance,
6
6
  shouldRecordDecision
7
- } from "./chunk-EIK7T746.js";
8
- import "./chunk-SU7BTOND.js";
7
+ } from "./chunk-RWPJ5RWM.js";
8
+ import "./chunk-N6QMWZGQ.js";
9
9
  import "./chunk-E2KFPEBT.js";
10
10
  export {
11
11
  formatDecisionTemplate,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  recordDecisionLog
3
- } from "./chunk-5N6KXACT.js";
3
+ } from "./chunk-MTH4DRP7.js";
4
4
  import {
5
5
  recordDecision
6
- } from "./chunk-EIK7T746.js";
7
- import "./chunk-SU7BTOND.js";
6
+ } from "./chunk-RWPJ5RWM.js";
7
+ import "./chunk-N6QMWZGQ.js";
8
8
  import "./chunk-E2KFPEBT.js";
9
9
 
10
10
  // src/engine/kumaMiner.ts
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  saveVerification
3
- } from "./chunk-5N6KXACT.js";
3
+ } from "./chunk-MTH4DRP7.js";
4
4
  import {
5
5
  sessionMemory
6
- } from "./chunk-SU7BTOND.js";
6
+ } from "./chunk-N6QMWZGQ.js";
7
7
  import "./chunk-E2KFPEBT.js";
8
8
 
9
9
  // src/engine/kumaVerifier.ts
@@ -39,7 +39,22 @@ function detectTestRunner(root = process.cwd()) {
39
39
  if (fs.existsSync(path.join(root, "Makefile"))) {
40
40
  return { runner: "make", baseCommand: "make test" };
41
41
  }
42
- return { runner: "unknown", baseCommand: "npm test" };
42
+ if (fs.existsSync(path.join(root, "package.json"))) {
43
+ try {
44
+ const pkg = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf-8"));
45
+ if (pkg.dependencies || pkg.devDependencies) {
46
+ if (fs.existsSync(path.join(root, "tsconfig.json"))) {
47
+ return { runner: "tsc", baseCommand: "npx tsc --noEmit" };
48
+ }
49
+ const srcDir = path.join(root, "src");
50
+ if (fs.existsSync(srcDir)) {
51
+ return { runner: "node", baseCommand: `node -c "${srcDir}/**/*.js" 2>/dev/null || node --check $(find src -name '*.js' 2>/dev/null | head -5)` };
52
+ }
53
+ }
54
+ } catch {
55
+ }
56
+ }
57
+ return { runner: "unknown", baseCommand: "npm test || echo 'No test runner configured'" };
43
58
  }
44
59
  async function runAutoVerification(options = {}) {
45
60
  const startTime = Date.now();
@@ -2,10 +2,10 @@ import {
2
2
  getGitDiffStat,
3
3
  getSessionStats,
4
4
  getUnresolvedCount
5
- } from "./chunk-JIL533AM.js";
5
+ } from "./chunk-MSKQRKME.js";
6
6
  import {
7
7
  sessionMemory
8
- } from "./chunk-SU7BTOND.js";
8
+ } from "./chunk-N6QMWZGQ.js";
9
9
  import "./chunk-E2KFPEBT.js";
10
10
 
11
11
  // src/engine/safetyScore.ts
@@ -52,7 +52,7 @@ async function computeSafetyScore(inputGoal) {
52
52
  totalScore += 20;
53
53
  }
54
54
  try {
55
- const { getDb } = await import("./kumaDb-RC2EO3OB.js");
55
+ const { getDb } = await import("./kumaDb-7VSQ4QLW.js");
56
56
  const db = await getDb();
57
57
  const nodeCount = db.exec("SELECT COUNT(*) as c FROM nodes")[0]?.values[0][0] ?? 0;
58
58
  const edgeCount = db.exec("SELECT COUNT(*) as c FROM edges")[0]?.values[0][0] ?? 0;
@@ -83,7 +83,7 @@ async function computeSafetyScore(inputGoal) {
83
83
  totalScore += 5;
84
84
  }
85
85
  try {
86
- const { getDb } = await import("./kumaDb-RC2EO3OB.js");
86
+ const { getDb } = await import("./kumaDb-7VSQ4QLW.js");
87
87
  const db = await getDb();
88
88
  const researchCount = db.exec("SELECT COUNT(*) as c FROM research_cache")[0]?.values[0][0] ?? 0;
89
89
  checks.push({
@@ -108,7 +108,7 @@ async function computeSafetyScore(inputGoal) {
108
108
  const hasRunTests = stats.hasRunTests;
109
109
  let latestVerif = null;
110
110
  try {
111
- const { getLatestVerifications } = await import("./kumaDb-RC2EO3OB.js");
111
+ const { getLatestVerifications } = await import("./kumaDb-7VSQ4QLW.js");
112
112
  const verifs = await getLatestVerifications(1);
113
113
  if (verifs.length > 0) latestVerif = verifs[0];
114
114
  } catch {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionMemory
3
- } from "./chunk-SU7BTOND.js";
3
+ } from "./chunk-N6QMWZGQ.js";
4
4
  export {
5
5
  sessionMemory
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumpslabs/kuma",
3
- "version": "2.3.2",
3
+ "version": "2.3.3",
4
4
  "description": "Safety-first context & orchestration engine for AI coding agents. MCP server with mandatory research pipeline, knowledge graph, impact analysis, decision memory, and safety guard — works with any MCP client.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",