miii-cli 0.2.0 → 0.2.1

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 CHANGED
@@ -107,13 +107,36 @@ The model can call these tools automatically — no setup needed.
107
107
  | `edit_file` | Create or overwrite a file (auto-creates parent dirs) |
108
108
  | `create_folder` | Create a directory and any missing parents |
109
109
  | `move_file` | Move or rename a file or directory |
110
- | `delete_file` | Delete a file |
110
+ | `delete_file` | Delete a file (requires confirmation) |
111
111
  | `run_command` | Run a shell command in the current directory |
112
112
 
113
113
  Tool calls chain up to 6 hops deep — the model reads, edits, runs, and verifies on its own.
114
114
 
115
115
  ---
116
116
 
117
+ ## Thinking indicator
118
+
119
+ While miii processes your request, a rotating sparkle icon and sarcastic phrase appear so you always know something's happening:
120
+
121
+ ```
122
+ miii
123
+ ✦ staring into the abyss (it blinked)…
124
+ ```
125
+
126
+ The phrase rotates every 5 seconds. When a tool call is in flight, the display updates to show exactly which tool is running:
127
+
128
+ ```
129
+ miii
130
+ ⚙ running read_file…
131
+
132
+ miii
133
+ ⚙ running run_command…
134
+ ```
135
+
136
+ Each tool in a chain updates live as execution moves through them.
137
+
138
+ ---
139
+
117
140
  ## Sessions
118
141
 
119
142
  Every conversation is saved and resumed automatically.
@@ -170,8 +193,9 @@ Config is loaded from (in order):
170
193
  ```json
171
194
  {
172
195
  "model": "gpt-4o",
173
- "provider": "openai",
174
- "baseUrl": "https://api.openai.com/v1"
196
+ "provider": "openai-compat",
197
+ "baseUrl": "https://api.openai.com/v1",
198
+ "apiKey": "sk-..."
175
199
  }
176
200
  ```
177
201
 
@@ -184,27 +208,38 @@ Works with LM Studio, vLLM, Groq, Together, and any other OpenAI-compatible serv
184
208
  | Key | Action |
185
209
  |---|---|
186
210
  | `enter` | Send message |
187
- | `ctrl+c` | Abort streaming response |
211
+ | `ctrl+c` | Abort current request |
188
212
  | `ctrl+c` x2 | Exit miii |
189
- | `esc` | Close overlay or abort |
213
+ | `esc` | Close overlay or cancel |
190
214
  | `↑ / ↓` | Navigate command palette or file picker |
191
215
 
192
216
  ---
193
217
 
194
218
  ## Security
195
219
 
196
- miii **0.1.5** addresses the following OWASP issues:
220
+ miii **0.1.5+** addresses the following OWASP issues:
197
221
 
198
222
  | Issue | Fix |
199
223
  |---|---|
200
- | Path traversal (A01) | All file tool operations are now restricted to the current working directory via `guardPath()` |
224
+ | Path traversal (A01) | All file tool operations restricted to cwd via `guardPath()` |
201
225
  | Path traversal (A01) | `@filename` references validated against `cwd` before reading |
202
226
  | Path traversal (A01) | `/mv`, `/mkdir`, `/touch` commands restricted to `cwd` |
203
227
  | Path traversal (A01) | Session names sanitized to alphanumeric + hyphens only |
204
228
  | Injection (A03) | `run_command` tool enforces a 30-second execution timeout |
205
229
  | Insecure deserialization (A08) | Config loading whitelists allowed keys; session data validated as array |
206
230
  | XML injection | File paths in context XML attributes are properly escaped |
207
- | Configurable API key | OpenAI-compatible provider token now configurable via `apiKey` in config (no longer hardcoded) |
231
+ | Configurable API key | OpenAI-compatible provider token configurable via `apiKey` in config |
232
+
233
+ `delete_file` requires explicit user confirmation (`y/n`) before executing.
234
+
235
+ ---
236
+
237
+ ## What's new in 0.2.0
238
+
239
+ - **No streaming** — responses delivered in full, no partial renders or flickering
240
+ - **Thinking indicator** — rotating sarcastic phrases + sparkle icon while model processes
241
+ - **Tool status** — live indicator when a tool call is in flight
242
+ - **Status renamed** — internal status `streaming` → `thinking` throughout
208
243
 
209
244
  ---
210
245
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "miii-cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "Claude Code-level terminal workflows powered by your local models.",
6
6
  "license": "MIT",
@@ -58,6 +58,7 @@ export function InputBar({ config, skills, cwd, session }: Props) {
58
58
  const [tick, setTick] = useState(0)
59
59
  const [currentModel, setCurrentModel] = useState(config.model)
60
60
  const [sessionName, setSessionName] = useState(session)
61
+ const [currentTool, setCurrentTool] = useState<string | undefined>()
61
62
  const [planningMode, setPlanningMode] = useState(false)
62
63
 
63
64
  // picker opens on mount — force model selection every launch
@@ -134,6 +135,7 @@ export function InputBar({ config, skills, cwd, session }: Props) {
134
135
 
135
136
  for (const tc of pendingTools) {
136
137
  const tool = tools.find(t => t.name === tc.name)
138
+ setCurrentTool(tc.name)
137
139
  if (tool) {
138
140
  try {
139
141
  const result = await tool.execute(tc.args)
@@ -149,6 +151,7 @@ export function InputBar({ config, skills, cwd, session }: Props) {
149
151
  next.push({ role: 'user', content: `unknown tool: ${tc.name}` })
150
152
  }
151
153
  }
154
+ setCurrentTool(undefined)
152
155
 
153
156
  await runLoop(next, depth + 1)
154
157
  },
@@ -357,7 +360,7 @@ export function InputBar({ config, skills, cwd, session }: Props) {
357
360
  <Box paddingLeft={2}>
358
361
  {status === 'thinking'
359
362
  ? <><Text color="yellow">{SPARKLE[tick % SPARKLE.length]} </Text><Text color="gray" dimColor italic>{THINKING_PHRASES[Math.floor(tick / 62) % THINKING_PHRASES.length]}</Text></>
360
- : <Text color="yellow" dimColor>running tool…</Text>
363
+ : <Text color="yellow" dimColor>⚙ running {currentTool ?? 'tool'}…</Text>
361
364
  }
362
365
  </Box>
363
366
  </Box>