cmdr-agent 1.2.2 → 2.0.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 (121) hide show
  1. package/README.md +19 -0
  2. package/dist/bin/cmdr.js +3 -1
  3. package/dist/bin/cmdr.js.map +1 -1
  4. package/dist/src/agents/executor.d.ts +32 -0
  5. package/dist/src/agents/executor.d.ts.map +1 -0
  6. package/dist/src/agents/executor.js +50 -0
  7. package/dist/src/agents/executor.js.map +1 -0
  8. package/dist/src/agents/index.d.ts +7 -0
  9. package/dist/src/agents/index.d.ts.map +1 -0
  10. package/dist/src/agents/index.js +7 -0
  11. package/dist/src/agents/index.js.map +1 -0
  12. package/dist/src/agents/registry.d.ts +36 -0
  13. package/dist/src/agents/registry.d.ts.map +1 -0
  14. package/dist/src/agents/registry.js +168 -0
  15. package/dist/src/agents/registry.js.map +1 -0
  16. package/dist/src/agents/subagent-tool.d.ts +27 -0
  17. package/dist/src/agents/subagent-tool.d.ts.map +1 -0
  18. package/dist/src/agents/subagent-tool.js +36 -0
  19. package/dist/src/agents/subagent-tool.js.map +1 -0
  20. package/dist/src/cli/args.d.ts +2 -0
  21. package/dist/src/cli/args.d.ts.map +1 -1
  22. package/dist/src/cli/args.js +8 -0
  23. package/dist/src/cli/args.js.map +1 -1
  24. package/dist/src/cli/commands.d.ts.map +1 -1
  25. package/dist/src/cli/commands.js +92 -4
  26. package/dist/src/cli/commands.js.map +1 -1
  27. package/dist/src/cli/ink/App.d.ts +4 -0
  28. package/dist/src/cli/ink/App.d.ts.map +1 -1
  29. package/dist/src/cli/ink/App.js +164 -20
  30. package/dist/src/cli/ink/App.js.map +1 -1
  31. package/dist/src/cli/ink/StatusBar.d.ts +17 -0
  32. package/dist/src/cli/ink/StatusBar.d.ts.map +1 -0
  33. package/dist/src/cli/ink/StatusBar.js +32 -0
  34. package/dist/src/cli/ink/StatusBar.js.map +1 -0
  35. package/dist/src/cli/repl.d.ts +2 -0
  36. package/dist/src/cli/repl.d.ts.map +1 -1
  37. package/dist/src/cli/repl.js +117 -4
  38. package/dist/src/cli/repl.js.map +1 -1
  39. package/dist/src/cli/theme.d.ts +42 -22
  40. package/dist/src/cli/theme.d.ts.map +1 -1
  41. package/dist/src/cli/theme.js +25 -1
  42. package/dist/src/cli/theme.js.map +1 -1
  43. package/dist/src/cli/themes.d.ts +57 -0
  44. package/dist/src/cli/themes.d.ts.map +1 -0
  45. package/dist/src/cli/themes.js +98 -0
  46. package/dist/src/cli/themes.js.map +1 -0
  47. package/dist/src/commands/index.d.ts +3 -0
  48. package/dist/src/commands/index.d.ts.map +1 -0
  49. package/dist/src/commands/index.js +2 -0
  50. package/dist/src/commands/index.js.map +1 -0
  51. package/dist/src/commands/loader.d.ts +35 -0
  52. package/dist/src/commands/loader.d.ts.map +1 -0
  53. package/dist/src/commands/loader.js +134 -0
  54. package/dist/src/commands/loader.js.map +1 -0
  55. package/dist/src/config/config-loader.d.ts.map +1 -1
  56. package/dist/src/config/config-loader.js +2 -0
  57. package/dist/src/config/config-loader.js.map +1 -1
  58. package/dist/src/config/defaults.d.ts.map +1 -1
  59. package/dist/src/config/defaults.js +1 -0
  60. package/dist/src/config/defaults.js.map +1 -1
  61. package/dist/src/config/schema.d.ts +3 -0
  62. package/dist/src/config/schema.d.ts.map +1 -1
  63. package/dist/src/config/schema.js +1 -0
  64. package/dist/src/config/schema.js.map +1 -1
  65. package/dist/src/core/agent-runner.d.ts.map +1 -1
  66. package/dist/src/core/agent-runner.js +39 -5
  67. package/dist/src/core/agent-runner.js.map +1 -1
  68. package/dist/src/core/agent.d.ts +1 -1
  69. package/dist/src/core/agent.d.ts.map +1 -1
  70. package/dist/src/core/agent.js +4 -3
  71. package/dist/src/core/agent.js.map +1 -1
  72. package/dist/src/core/intent.d.ts +2 -0
  73. package/dist/src/core/intent.d.ts.map +1 -1
  74. package/dist/src/core/intent.js +12 -0
  75. package/dist/src/core/intent.js.map +1 -1
  76. package/dist/src/core/presets.d.ts.map +1 -1
  77. package/dist/src/core/presets.js +49 -15
  78. package/dist/src/core/presets.js.map +1 -1
  79. package/dist/src/core/types.d.ts +5 -0
  80. package/dist/src/core/types.d.ts.map +1 -1
  81. package/dist/src/index.d.ts +3 -2
  82. package/dist/src/index.d.ts.map +1 -1
  83. package/dist/src/index.js +2 -2
  84. package/dist/src/index.js.map +1 -1
  85. package/dist/src/llm/model-registry.d.ts +25 -0
  86. package/dist/src/llm/model-registry.d.ts.map +1 -1
  87. package/dist/src/llm/model-registry.js +223 -22
  88. package/dist/src/llm/model-registry.js.map +1 -1
  89. package/dist/src/llm/model-watcher.d.ts +26 -0
  90. package/dist/src/llm/model-watcher.d.ts.map +1 -0
  91. package/dist/src/llm/model-watcher.js +130 -0
  92. package/dist/src/llm/model-watcher.js.map +1 -0
  93. package/dist/src/llm/ollama.d.ts +13 -1
  94. package/dist/src/llm/ollama.d.ts.map +1 -1
  95. package/dist/src/llm/ollama.js +309 -93
  96. package/dist/src/llm/ollama.js.map +1 -1
  97. package/dist/src/session/compaction.js +4 -0
  98. package/dist/src/session/compaction.js.map +1 -1
  99. package/dist/src/session/project-context.d.ts.map +1 -1
  100. package/dist/src/session/project-context.js +54 -4
  101. package/dist/src/session/project-context.js.map +1 -1
  102. package/dist/src/session/prompt-builder.d.ts +28 -1
  103. package/dist/src/session/prompt-builder.d.ts.map +1 -1
  104. package/dist/src/session/prompt-builder.js +97 -23
  105. package/dist/src/session/prompt-builder.js.map +1 -1
  106. package/dist/src/session/session-manager.d.ts +10 -3
  107. package/dist/src/session/session-manager.d.ts.map +1 -1
  108. package/dist/src/session/session-manager.js +53 -16
  109. package/dist/src/session/session-manager.js.map +1 -1
  110. package/dist/src/session/session-persistence.d.ts +12 -0
  111. package/dist/src/session/session-persistence.d.ts.map +1 -1
  112. package/dist/src/session/session-persistence.js +94 -4
  113. package/dist/src/session/session-persistence.js.map +1 -1
  114. package/dist/src/tools/built-in/bash-security.d.ts +13 -0
  115. package/dist/src/tools/built-in/bash-security.d.ts.map +1 -0
  116. package/dist/src/tools/built-in/bash-security.js +53 -0
  117. package/dist/src/tools/built-in/bash-security.js.map +1 -0
  118. package/dist/src/tools/built-in/bash.d.ts.map +1 -1
  119. package/dist/src/tools/built-in/bash.js +7 -1
  120. package/dist/src/tools/built-in/bash.js.map +1 -1
  121. package/package.json +2 -1
@@ -1,7 +1,14 @@
1
1
  /**
2
2
  * Session persistence — save/load conversation sessions to ~/.cmdr/sessions/.
3
+ *
4
+ * Uses append-only JSONL (one JSON object per line) for crash-safe writes.
5
+ * Each line is one of:
6
+ * {"type":"meta","sessionId":"...","model":"...","projectRoot":"...","createdAt":"..."}
7
+ * {"type":"message","role":"user","content":[...],"timestamp":"..."}
8
+ * {"type":"compact","boundaryIndex":42,"summary":"...","timestamp":"..."}
3
9
  */
4
- import { readFile, writeFile, mkdir, readdir } from 'fs/promises';
10
+ import { readFile, writeFile, mkdir, readdir, appendFile } from 'fs/promises';
11
+ import { existsSync } from 'fs';
5
12
  import { join } from 'path';
6
13
  import { homedir } from 'os';
7
14
  const CMDR_DIR = join(homedir(), '.cmdr');
@@ -37,6 +44,49 @@ function extractSummary(messages) {
37
44
  }
38
45
  return '';
39
46
  }
47
+ function journalPath(sessionId) {
48
+ return join(SESSIONS_DIR, `${sessionId}.jsonl`);
49
+ }
50
+ /** Append a single message to the JSONL session file. */
51
+ export async function appendSessionMessage(sessionId, msg) {
52
+ await ensureDir(SESSIONS_DIR);
53
+ const line = {
54
+ type: 'message',
55
+ role: msg.role,
56
+ content: msg.content,
57
+ timestamp: new Date().toISOString(),
58
+ ...(msg.isCompactSummary ? { isCompactSummary: true } : {}),
59
+ ...(msg.isCompactBoundary ? { isCompactBoundary: true } : {}),
60
+ ...(msg.isVisibleInTranscriptOnly ? { isVisibleInTranscriptOnly: true } : {}),
61
+ ...(msg.isMeta ? { isMeta: true } : {}),
62
+ };
63
+ await appendFile(journalPath(sessionId), JSON.stringify(line) + '\n', 'utf-8');
64
+ }
65
+ /** Write session meta header (called once at session start). */
66
+ export async function writeSessionMeta(sessionId, model, projectRoot) {
67
+ await ensureDir(SESSIONS_DIR);
68
+ const line = {
69
+ type: 'meta',
70
+ sessionId,
71
+ model,
72
+ projectRoot,
73
+ createdAt: new Date().toISOString(),
74
+ };
75
+ await appendFile(journalPath(sessionId), JSON.stringify(line) + '\n', 'utf-8');
76
+ }
77
+ /** Append a compaction marker to the journal. */
78
+ export async function appendCompactMarker(sessionId, boundaryIndex, summary) {
79
+ const line = {
80
+ type: 'compact',
81
+ boundaryIndex,
82
+ summary,
83
+ timestamp: new Date().toISOString(),
84
+ };
85
+ await appendFile(journalPath(sessionId), JSON.stringify(line) + '\n', 'utf-8');
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Save / Load
89
+ // ---------------------------------------------------------------------------
40
90
  export async function saveSession(sessionState, model) {
41
91
  await ensureDir(SESSIONS_DIR);
42
92
  const saved = {
@@ -49,15 +99,55 @@ export async function saveSession(sessionState, model) {
49
99
  toolsUsed: extractToolsUsed(sessionState.messages),
50
100
  summary: extractSummary(sessionState.messages),
51
101
  };
102
+ // Write atomic JSON snapshot (for listSessions/quick load)
52
103
  const filePath = join(SESSIONS_DIR, `${sessionState.id}.json`);
53
104
  await writeFile(filePath, JSON.stringify(saved, null, 2), 'utf-8');
54
105
  return sessionState.id;
55
106
  }
56
107
  export async function loadSession(sessionId) {
57
108
  try {
58
- const filePath = join(SESSIONS_DIR, `${sessionId}.json`);
59
- const data = await readFile(filePath, 'utf-8');
60
- return JSON.parse(data);
109
+ // Try JSON snapshot first (faster)
110
+ const jsonPath = join(SESSIONS_DIR, `${sessionId}.json`);
111
+ if (existsSync(jsonPath)) {
112
+ const data = await readFile(jsonPath, 'utf-8');
113
+ return JSON.parse(data);
114
+ }
115
+ // Fallback: reconstruct from JSONL journal
116
+ const jPath = journalPath(sessionId);
117
+ if (!existsSync(jPath))
118
+ return null;
119
+ const content = await readFile(jPath, 'utf-8');
120
+ const lines = content.trim().split('\n').filter(Boolean);
121
+ let meta = null;
122
+ const messages = [];
123
+ for (const line of lines) {
124
+ const entry = JSON.parse(line);
125
+ if (entry.type === 'meta') {
126
+ meta = entry;
127
+ }
128
+ else if (entry.type === 'message') {
129
+ messages.push({
130
+ role: entry.role,
131
+ content: entry.content,
132
+ ...(entry.isCompactSummary ? { isCompactSummary: true } : {}),
133
+ ...(entry.isCompactBoundary ? { isCompactBoundary: true } : {}),
134
+ ...(entry.isVisibleInTranscriptOnly ? { isVisibleInTranscriptOnly: true } : {}),
135
+ ...(entry.isMeta ? { isMeta: true } : {}),
136
+ });
137
+ }
138
+ }
139
+ if (!meta)
140
+ return null;
141
+ return {
142
+ id: meta.sessionId,
143
+ messages,
144
+ projectRoot: meta.projectRoot,
145
+ model: meta.model,
146
+ createdAt: meta.createdAt,
147
+ lastActivity: new Date().toISOString(),
148
+ toolsUsed: extractToolsUsed(messages),
149
+ summary: extractSummary(messages),
150
+ };
61
151
  }
62
152
  catch {
63
153
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../../../src/session/session-persistence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../../../src/session/session-persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bash command security checks.
3
+ *
4
+ * Derived from Claude Code's 23 security checks — blocks destructive ops,
5
+ * data exfiltration, and shell injection vectors.
6
+ */
7
+ export interface SecurityResult {
8
+ safe: boolean;
9
+ reason?: string;
10
+ sanitized: string;
11
+ }
12
+ export declare function sanitizeBashCommand(command: string): SecurityResult;
13
+ //# sourceMappingURL=bash-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-security.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash-security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA0BnE"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Bash command security checks.
3
+ *
4
+ * Derived from Claude Code's 23 security checks — blocks destructive ops,
5
+ * data exfiltration, and shell injection vectors.
6
+ */
7
+ // Destructive or dangerous command patterns
8
+ const BLOCKED_PATTERNS = [
9
+ // Destructive commands
10
+ { pattern: /\brm\s+(-[a-zA-Z]*f[a-zA-Z]*\s+)?\/\s*$/, label: 'rm -rf /' },
11
+ { pattern: /\bchmod\s+(-R\s+)?777\s+\//, label: 'chmod 777 /' },
12
+ { pattern: /\bmkfs\b/, label: 'filesystem format' },
13
+ { pattern: /\bdd\s+.*of=\/dev\//, label: 'dd to device' },
14
+ // Data exfiltration
15
+ { pattern: /\bcurl\s+.*-d\s+.*@/, label: 'curl posting file contents' },
16
+ { pattern: /\bwget\s+.*--post-file/, label: 'wget posting files' },
17
+ // Sensitive file access via subshell
18
+ { pattern: /\$\(.*\bcat\b.*\/etc\/(passwd|shadow)/, label: 'reading sensitive files' },
19
+ ];
20
+ // Zsh builtins that should never come from an LLM
21
+ const BLOCKED_ZSH_BUILTINS = new Set([
22
+ 'bindkey', 'compdef', 'compadd', 'zmodload', 'autoload',
23
+ 'zle', 'zstyle', 'typeset', 'setopt', 'unsetopt',
24
+ 'functions', 'aliases', 'disable', 'enable', 'emulate',
25
+ ]);
26
+ // Zero-width characters (from Claude Code HackerOne finding)
27
+ const ZERO_WIDTH_REGEX = /[\u200B\u200C\u200D\u2060\uFEFF]/g;
28
+ // Zsh equals expansion: =curl → /usr/bin/curl
29
+ const ZSH_EQUALS_REGEX = /(?:^|\s)=[a-zA-Z]/;
30
+ export function sanitizeBashCommand(command) {
31
+ // Strip zero-width characters
32
+ const cleaned = command.replace(ZERO_WIDTH_REGEX, '');
33
+ // Check zsh equals expansion
34
+ if (ZSH_EQUALS_REGEX.test(cleaned)) {
35
+ return { safe: false, reason: 'Zsh equals expansion detected', sanitized: cleaned };
36
+ }
37
+ // Check blocked patterns
38
+ for (const { pattern, label } of BLOCKED_PATTERNS) {
39
+ if (pattern.test(cleaned)) {
40
+ return { safe: false, reason: `Blocked: ${label}`, sanitized: cleaned };
41
+ }
42
+ }
43
+ // Check blocked zsh builtins at start of each segment
44
+ const segments = cleaned.split(/[;|&]/);
45
+ for (const segment of segments) {
46
+ const firstWord = segment.trim().split(/\s/)[0];
47
+ if (BLOCKED_ZSH_BUILTINS.has(firstWord)) {
48
+ return { safe: false, reason: `Blocked shell builtin: ${firstWord}`, sanitized: cleaned };
49
+ }
50
+ }
51
+ return { safe: true, sanitized: cleaned };
52
+ }
53
+ //# sourceMappingURL=bash-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-security.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash-security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4CAA4C;AAC5C,MAAM,gBAAgB,GAAyC;IAC7D,uBAAuB;IACvB,EAAE,OAAO,EAAE,yCAAyC,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,aAAa,EAAE;IAC/D,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACnD,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE;IAEzD,oBAAoB;IACpB,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,4BAA4B,EAAE;IACvE,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAElE,qCAAqC;IACrC,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,yBAAyB,EAAE;CACvF,CAAA;AAED,kDAAkD;AAClD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;IACvD,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU;IAChD,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;CACvD,CAAC,CAAA;AAEF,6DAA6D;AAC7D,MAAM,gBAAgB,GAAG,mCAAmC,CAAA;AAE5D,8CAA8C;AAC9C,MAAM,gBAAgB,GAAG,mBAAmB,CAAA;AAQ5C,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,8BAA8B;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;IAErD,6BAA6B;IAC7B,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;IACrF,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;QACzE,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,SAAS,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,eAAO,MAAM,QAAQ;;;;EA6BnB,CAAA"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,eAAO,MAAM,QAAQ;;;;EAmCnB,CAAA"}
@@ -4,6 +4,7 @@
4
4
  import { spawn } from 'child_process';
5
5
  import { z } from 'zod';
6
6
  import { defineTool } from '../registry.js';
7
+ import { sanitizeBashCommand } from './bash-security.js';
7
8
  const DEFAULT_TIMEOUT_MS = 30_000;
8
9
  export const bashTool = defineTool({
9
10
  name: 'bash',
@@ -16,9 +17,14 @@ export const bashTool = defineTool({
16
17
  cwd: z.string().optional().describe('Working directory for the command.'),
17
18
  }),
18
19
  execute: async (input, context) => {
20
+ // Security check
21
+ const check = sanitizeBashCommand(input.command);
22
+ if (!check.safe) {
23
+ return { data: `Command blocked: ${check.reason}`, isError: true };
24
+ }
19
25
  const timeoutMs = input.timeout ?? DEFAULT_TIMEOUT_MS;
20
26
  const cwd = input.cwd ?? context.cwd ?? process.cwd();
21
- const { stdout, stderr, exitCode } = await runCommand(input.command, cwd, timeoutMs, context.abortSignal);
27
+ const { stdout, stderr, exitCode } = await runCommand(check.sanitized, cwd, timeoutMs, context.abortSignal);
22
28
  const parts = [];
23
29
  if (stdout)
24
30
  parts.push(stdout);
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cmdr-agent",
3
- "version": "1.2.2",
3
+ "version": "2.0.0",
4
4
  "description": "Open-source multi-agent coding tool for your terminal. Powered by Ollama.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -46,6 +46,7 @@
46
46
  "devDependencies": {
47
47
  "@types/node": "^22.0.0",
48
48
  "@types/react": "^18.3.28",
49
+ "tsx": "^4.21.0",
49
50
  "typescript": "^5.6.0",
50
51
  "vitest": "^2.1.0"
51
52
  },