wispy-cli 2.7.31 → 2.7.33
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/bin/wispy.mjs +26 -27
- package/lib/wispy-tui-v3.mjs +24 -24
- package/package.json +1 -1
package/bin/wispy.mjs
CHANGED
|
@@ -121,47 +121,45 @@ wispy-cli v${pkg.version}
|
|
|
121
121
|
AI workspace assistant — chat, automate, and orchestrate from the terminal.
|
|
122
122
|
|
|
123
123
|
Usage:
|
|
124
|
-
wispy
|
|
125
|
-
wispy <message> One-shot chat
|
|
124
|
+
wispy Launch TUI (interactive chat)
|
|
126
125
|
wispy exec <message> Non-interactive one-shot (CI/pipeline friendly)
|
|
127
126
|
wispy setup Run first-time setup wizard
|
|
127
|
+
wispy doctor Check system health
|
|
128
|
+
wispy status Show running processes & connections
|
|
129
|
+
wispy stop Stop all running wispy processes
|
|
130
|
+
wispy update Update wispy-cli to latest version
|
|
128
131
|
wispy config [show|get|set|delete|reset|path|edit]
|
|
129
132
|
Manage configuration
|
|
130
133
|
wispy features [list|enable|disable]
|
|
131
134
|
Manage feature flags
|
|
132
|
-
wispy model Show or change AI model
|
|
133
|
-
wispy
|
|
134
|
-
wispy
|
|
135
|
-
|
|
136
|
-
wispy auth Show auth status for all providers
|
|
137
|
-
wispy auth <provider> Re-authenticate a specific provider
|
|
138
|
-
wispy auth --reset Clear all saved credentials
|
|
135
|
+
wispy model Show or change AI model (interactive picker)
|
|
136
|
+
wispy agents [list] List available agents (built-in + custom)
|
|
137
|
+
wispy cost Show API spending report
|
|
138
|
+
wispy auth Show/manage provider auth status
|
|
139
139
|
wispy secrets [list|set|delete|get]
|
|
140
140
|
Manage encrypted secrets & API keys
|
|
141
|
+
wispy trust [level|log|approvals]
|
|
142
|
+
Security level, audit & approval allowlist
|
|
143
|
+
wispy browser [tabs|attach|navigate|screenshot|doctor]
|
|
144
|
+
Browser control via local-browser-bridge
|
|
141
145
|
wispy tts "<text>" Text-to-speech (OpenAI or macOS say)
|
|
142
|
-
wispy
|
|
143
|
-
wispy
|
|
144
|
-
|
|
145
|
-
wispy
|
|
146
|
-
wispy teach <name> Create skill from conversation
|
|
147
|
-
wispy improve <name> Improve a skill
|
|
146
|
+
wispy sessions [--all] List all sessions
|
|
147
|
+
wispy resume [session-id] Resume a previous session (--last for most recent)
|
|
148
|
+
wispy fork [session-id] Fork (branch) from a session (--last for most recent)
|
|
149
|
+
wispy review Code review (--base, --commit, --json)
|
|
148
150
|
wispy where Show current mode (local/cloud)
|
|
149
151
|
wispy handoff [cloud|local] Sync between environments
|
|
150
152
|
wispy server [start|stop|status]
|
|
151
153
|
Manage HTTP/WS server
|
|
152
|
-
wispy tui Launch
|
|
154
|
+
wispy tui Launch TUI explicitly
|
|
153
155
|
wispy overview Director view of workstreams
|
|
154
|
-
wispy
|
|
155
|
-
wispy
|
|
156
|
-
wispy
|
|
157
|
-
wispy
|
|
158
|
-
|
|
159
|
-
wispy
|
|
160
|
-
|
|
161
|
-
wispy review --commit <sha> Review a specific commit
|
|
162
|
-
wispy review --json Output review as JSON
|
|
163
|
-
wispy agents [list] List available agents (built-in + custom)
|
|
164
|
-
wispy cost Show API spending report
|
|
156
|
+
wispy skill [list|run] Manage learned skills
|
|
157
|
+
wispy teach <name> Create skill from conversation
|
|
158
|
+
wispy improve <name> Improve a skill
|
|
159
|
+
wispy ws [start-client|run-debug]
|
|
160
|
+
WebSocket operations
|
|
161
|
+
wispy completion [zsh|bash|fish]
|
|
162
|
+
Output shell completion script
|
|
165
163
|
|
|
166
164
|
Options:
|
|
167
165
|
-w, --workstream <name> Set active workstream
|
|
@@ -1386,6 +1384,7 @@ if (command === "completion") {
|
|
|
1386
1384
|
"improve", "where", "handoff", "server", "tui", "overview", "sessions",
|
|
1387
1385
|
"resume", "fork", "review", "agents", "cost", "features", "secrets",
|
|
1388
1386
|
"tts", "browser", "auth", "exec", "completion",
|
|
1387
|
+
"stop", "status", "update", "upgrade",
|
|
1389
1388
|
];
|
|
1390
1389
|
const flags = [
|
|
1391
1390
|
"--help", "--version", "-w", "--workstream", "-p", "--profile",
|
package/lib/wispy-tui-v3.mjs
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import {
|
|
11
|
-
TUI, Container, Box, Text, Editor, Markdown, Loader,
|
|
12
|
-
Spacer, ProcessTerminal, Key, matchesKey, isKeyRelease,
|
|
11
|
+
TUI, Container, Box, Text, Editor, Input, Markdown, Loader,
|
|
12
|
+
Spacer, ProcessTerminal, Key, matchesKey, isKeyRelease, visibleWidth,
|
|
13
13
|
} from "@mariozechner/pi-tui";
|
|
14
14
|
|
|
15
15
|
import chalk from "chalk";
|
|
@@ -411,7 +411,7 @@ class WispyTUI {
|
|
|
411
411
|
);
|
|
412
412
|
|
|
413
413
|
// 4. Input editor
|
|
414
|
-
this.inputEditor = new
|
|
414
|
+
this.inputEditor = new WispyInput(this);
|
|
415
415
|
|
|
416
416
|
// Initially loader is not added — we add/remove dynamically
|
|
417
417
|
root.addChild(this.inputEditor);
|
|
@@ -1101,42 +1101,42 @@ class WispyTUI {
|
|
|
1101
1101
|
|
|
1102
1102
|
// ─── WispyEditor — custom Editor that intercepts global keys ─────────────────
|
|
1103
1103
|
|
|
1104
|
-
class
|
|
1105
|
-
constructor(
|
|
1106
|
-
super(
|
|
1104
|
+
class WispyInput extends Input {
|
|
1105
|
+
constructor(wispyTUI) {
|
|
1106
|
+
super();
|
|
1107
1107
|
this._wispy = wispyTUI;
|
|
1108
1108
|
|
|
1109
|
-
// Handle submit via Editor's onSubmit
|
|
1110
1109
|
this.onSubmit = (text) => {
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1110
|
+
const trimmed = (text ?? "").trim();
|
|
1111
|
+
if (trimmed) {
|
|
1112
|
+
this._wispy.handleSubmit(trimmed).catch(err => {
|
|
1113
|
+
console.error("Submit error:", err.message);
|
|
1114
|
+
});
|
|
1115
|
+
this.setValue("");
|
|
1116
|
+
}
|
|
1114
1117
|
};
|
|
1115
1118
|
}
|
|
1116
1119
|
|
|
1117
1120
|
handleInput(data) {
|
|
1118
1121
|
if (isKeyRelease(data)) return;
|
|
1119
1122
|
|
|
1120
|
-
//
|
|
1121
|
-
|
|
1122
|
-
const currentText = this.getText();
|
|
1123
|
+
// Global keys (Tab, Ctrl+C, 1-6, ?, Ctrl+L) when input is empty
|
|
1124
|
+
const currentText = this.getValue();
|
|
1123
1125
|
if (currentText.length === 0 || matchesKey(data, Key.tab) || matchesKey(data, Key.ctrl("c")) || matchesKey(data, Key.ctrl("l"))) {
|
|
1124
1126
|
if (this._wispy.handleGlobalKey(data)) return;
|
|
1125
1127
|
}
|
|
1126
1128
|
|
|
1127
|
-
//
|
|
1128
|
-
if (matchesKey(data, Key.enter) && !matchesKey(data, Key.shift("enter"))) {
|
|
1129
|
-
const text = this.getText().trim();
|
|
1130
|
-
if (text) {
|
|
1131
|
-
this.onSubmit(text);
|
|
1132
|
-
this.setText("");
|
|
1133
|
-
}
|
|
1134
|
-
return;
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
|
-
// Default: pass to Editor (handles typing, backspace, CJK, undo, etc.)
|
|
1129
|
+
// Default: pass to Input (single-line, handles typing, backspace, CJK, cursor movement)
|
|
1138
1130
|
super.handleInput(data);
|
|
1139
1131
|
}
|
|
1132
|
+
|
|
1133
|
+
render(width) {
|
|
1134
|
+
// Render with prompt prefix
|
|
1135
|
+
const prompt = `${this._wispy.activeWorkstream} › `;
|
|
1136
|
+
const lines = super.render(width - visibleWidth(prompt));
|
|
1137
|
+
if (lines.length === 0) return [prompt];
|
|
1138
|
+
return [prompt + lines[0]];
|
|
1139
|
+
}
|
|
1140
1140
|
}
|
|
1141
1141
|
|
|
1142
1142
|
// ─── ContentArea — custom component for sidebar + main layout ─────────────────
|
package/package.json
CHANGED