codemini-cli 0.1.18 → 0.2.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/README.md +6 -6
- package/package.json +1 -1
- package/skills/superpowers-lite/SKILL.md +10 -9
- package/src/core/agent-loop.js +63 -31
- package/src/core/chat-runtime.js +89 -16
- package/src/core/command-policy.js +4 -4
- package/src/core/config-store.js +16 -29
- package/src/core/provider/openai-compatible.js +9 -0
- package/src/core/shell-profile.js +1 -1
- package/src/core/shell.js +122 -2
- package/src/core/tools.js +527 -214
- package/src/tui/chat-app.js +849 -143
package/src/core/shell.js
CHANGED
|
@@ -26,9 +26,129 @@ const READY_OUTPUT_PATTERNS = [
|
|
|
26
26
|
const AUTO_STOP_GRACE_MS = 150;
|
|
27
27
|
const LONG_RUNNING_STARTUP_WINDOW_MS = 1500;
|
|
28
28
|
|
|
29
|
+
function normalizeCommand(command) {
|
|
30
|
+
return String(command || '').trim();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function matchesAny(value, patterns) {
|
|
34
|
+
return patterns.some((pattern) => pattern.test(value));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function classifyCommandIntent(command) {
|
|
38
|
+
const value = normalizeCommand(command);
|
|
39
|
+
|
|
40
|
+
if (!value) {
|
|
41
|
+
return { kind: 'generic', longRunning: false };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (
|
|
45
|
+
/\b(?:npm|pnpm|yarn|bun)\s+install\b/i.test(value) ||
|
|
46
|
+
/\b(?:npm|pnpm|yarn|bun)\s+(?:ci|i|add)\b/i.test(value) ||
|
|
47
|
+
/\buv\s+pip\s+install\b/i.test(value) ||
|
|
48
|
+
/\bpip\s+install\b/i.test(value) ||
|
|
49
|
+
/\bcargo\s+install\b/i.test(value) ||
|
|
50
|
+
/\bbundle\s+install\b/i.test(value) ||
|
|
51
|
+
/\bcomposer\s+install\b/i.test(value)
|
|
52
|
+
) {
|
|
53
|
+
return { kind: 'install', longRunning: false };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (/\b(?:build|compile|bundle|pack|transpile)\b/i.test(value)) {
|
|
57
|
+
return { kind: 'build', longRunning: false };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (
|
|
61
|
+
/\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:test|lint|check|typecheck)\b/i.test(value) ||
|
|
62
|
+
/\b(?:jest|vitest|mocha|ava|pytest|go\s+test|cargo\s+test|dotnet\s+test)\b/i.test(value)
|
|
63
|
+
) {
|
|
64
|
+
return { kind: 'test', longRunning: false };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const frontendServicePatterns = [
|
|
68
|
+
/\bvite\b/i,
|
|
69
|
+
/\bnext\s+dev\b/i,
|
|
70
|
+
/\bnuxt\s+dev\b/i,
|
|
71
|
+
/\bastro\s+dev\b/i,
|
|
72
|
+
/\bremix\s+dev\b/i,
|
|
73
|
+
/\bsvelte-kit\s+dev\b/i,
|
|
74
|
+
/\bwebpack\s+serve\b/i,
|
|
75
|
+
/\bvue-cli-service\s+serve\b/i,
|
|
76
|
+
/\breact-scripts\s+start\b/i,
|
|
77
|
+
/\bstorybook\b/i,
|
|
78
|
+
/\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:dev|start|serve|preview)\b.*\b(?:client|frontend|front-end|web|ui)\b/i,
|
|
79
|
+
/\b(?:client|frontend|front-end|web|ui)\b.*\b(?:dev|start|serve|preview)\b/i
|
|
80
|
+
];
|
|
81
|
+
if (matchesAny(value, frontendServicePatterns)) {
|
|
82
|
+
return { kind: 'frontend-service', longRunning: true };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const backendServicePatterns = [
|
|
86
|
+
/\bpython\s+-m\s+http\.server\b/i,
|
|
87
|
+
/\buvicorn\b/i,
|
|
88
|
+
/\bgunicorn\b/i,
|
|
89
|
+
/\bflask\s+run\b/i,
|
|
90
|
+
/\bdjango\s+runserver\b/i,
|
|
91
|
+
/\brails\s+(?:s|server)\b/i,
|
|
92
|
+
/\bmvn(?:w)?\s+spring-boot:run\b/i,
|
|
93
|
+
/\bgradle(?:w)?\s+bootRun\b/i,
|
|
94
|
+
/\bgradle(?:w)?\s+run\b/i,
|
|
95
|
+
/\bjava\b.*\bserver\b/i,
|
|
96
|
+
/\bdotnet\s+run\b/i,
|
|
97
|
+
/\bgo\s+run\b.*\b(server|cmd\/server|main\.go)\b/i,
|
|
98
|
+
/\bnest\s+start\b/i,
|
|
99
|
+
/\bnodemon\b/i,
|
|
100
|
+
/\bts-node-dev\b/i,
|
|
101
|
+
/\bair\b/i,
|
|
102
|
+
/\bphp\s+artisan\s+serve\b/i,
|
|
103
|
+
/\bsymfony\s+server:start\b/i,
|
|
104
|
+
/\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:dev|start|serve|preview)\b.*\b(?:server|api|backend)\b/i,
|
|
105
|
+
/\b(?:server|api|backend)\b.*\b(?:dev|start|serve|preview)\b/i
|
|
106
|
+
];
|
|
107
|
+
if (matchesAny(value, backendServicePatterns)) {
|
|
108
|
+
return { kind: 'backend-service', longRunning: true };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const databaseServicePatterns = [
|
|
112
|
+
/\bpostgres(?:ql)?\b/i,
|
|
113
|
+
/\bmysql\b/i,
|
|
114
|
+
/\bmariadb\b/i,
|
|
115
|
+
/\bmongod\b/i,
|
|
116
|
+
/\bredis-server\b/i,
|
|
117
|
+
/\b(?:docker|docker-compose|docker compose)\s+.*\b(?:db|database|postgres|mysql|mongo|redis)\b/i,
|
|
118
|
+
/\b(?:db|database|postgres|mysql|mongo|redis)\b.*\b(?:start|up|serve|run)\b/i
|
|
119
|
+
];
|
|
120
|
+
if (matchesAny(value, databaseServicePatterns)) {
|
|
121
|
+
return { kind: 'database-service', longRunning: true };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const dockerServicePatterns = [
|
|
125
|
+
/\bdocker\s+compose\s+up\b/i,
|
|
126
|
+
/\bdocker-compose\s+up\b/i,
|
|
127
|
+
/\bdocker\s+run\b/i,
|
|
128
|
+
/\bdocker\s+start\b/i
|
|
129
|
+
];
|
|
130
|
+
if (matchesAny(value, dockerServicePatterns)) {
|
|
131
|
+
return { kind: 'docker-service', longRunning: true };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (
|
|
135
|
+
/\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:dev|start|serve|preview|watch)\b/i.test(value) ||
|
|
136
|
+
/\b(?:vite|serve)\b/i.test(value) ||
|
|
137
|
+
/\b(?:watch|serve|server|dev|preview)\b/i.test(value)
|
|
138
|
+
) {
|
|
139
|
+
return { kind: 'service', longRunning: true };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (/\b(?:watch|serve|server|dev|preview)\b/i.test(value)) {
|
|
143
|
+
return { kind: 'service', longRunning: true };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return { kind: 'generic', longRunning: false };
|
|
147
|
+
}
|
|
148
|
+
|
|
29
149
|
export function isLikelyLongRunningCommand(command) {
|
|
30
|
-
const
|
|
31
|
-
return LONG_RUNNING_COMMAND_RE.test(
|
|
150
|
+
const { longRunning } = classifyCommandIntent(command);
|
|
151
|
+
return longRunning || LONG_RUNNING_COMMAND_RE.test(normalizeCommand(command)) || GENERIC_LONG_RUNNING_HINT_RE.test(normalizeCommand(command));
|
|
32
152
|
}
|
|
33
153
|
|
|
34
154
|
export function hasReadyOutput(text) {
|