claude-ws 0.1.9 → 0.1.11
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 +27 -4
- package/bin/claudekanban.js +26 -0
- package/package.json +4 -3
- package/server.ts +10 -7
- package/src/app/globals.css +228 -411
- package/src/components/agent-factory/discovery-dialog.tsx +1 -1
- package/src/components/agent-factory/plugin-list.tsx +1 -0
- package/src/components/header/project-selector.tsx +4 -4
- package/src/components/header.tsx +38 -2
- package/src/components/kanban/create-task-dialog.tsx +37 -32
- package/src/components/providers/theme-provider.tsx +0 -7
- package/src/components/settings/settings-dialog.tsx +2 -51
- package/src/components/task/prompt-input.tsx +85 -92
- package/src/components/task/task-detail-panel.tsx +34 -62
- package/src/components/ui/file-extension-icon.tsx +17 -1
- package/src/components/ui/select.tsx +190 -0
- package/src/hooks/use-attempt-stream.ts +27 -8
- package/src/lib/agent-manager.ts +5 -1
- package/src/lib/update-checker.ts +35 -0
- package/src/stores/task-store.ts +37 -11
package/README.md
CHANGED
|
@@ -64,26 +64,30 @@ Local-first SQLite database. Real-time streaming. Plugin system for custom agent
|
|
|
64
64
|
|
|
65
65
|
## Quick Start
|
|
66
66
|
|
|
67
|
-
### Option 1: Run with npx
|
|
67
|
+
### Option 1: Run with npx
|
|
68
68
|
|
|
69
69
|
**Prerequisites:** Node.js 20+, pnpm 9+, [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code)
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
|
-
npx claude-ws
|
|
72
|
+
npx -y claude-ws
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
+
The `-y` flag skips the "Ok to proceed?" prompt.
|
|
76
|
+
|
|
75
77
|
The first run will:
|
|
76
78
|
- Auto-create SQLite database in `~/.claude-ws/`
|
|
77
|
-
-
|
|
79
|
+
- Install dependencies and build automatically
|
|
78
80
|
- Start the server on http://localhost:8556
|
|
79
81
|
|
|
80
|
-
### Option 2: Install globally
|
|
82
|
+
### Option 2: Install globally (Recommended)
|
|
81
83
|
|
|
82
84
|
```bash
|
|
83
85
|
npm install -g claude-ws
|
|
84
86
|
claude-ws
|
|
85
87
|
```
|
|
86
88
|
|
|
89
|
+
Global installation avoids npx prompts and rebuilding on every run.
|
|
90
|
+
|
|
87
91
|
### Option 3: Development from source
|
|
88
92
|
|
|
89
93
|
```bash
|
|
@@ -98,6 +102,25 @@ Open [http://localhost:8556](http://localhost:8556)
|
|
|
98
102
|
|
|
99
103
|
---
|
|
100
104
|
|
|
105
|
+
## Updating
|
|
106
|
+
|
|
107
|
+
### Check current version
|
|
108
|
+
```bash
|
|
109
|
+
claude-ws --version
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Update to latest version
|
|
113
|
+
```bash
|
|
114
|
+
npm update -g claude-ws
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Force reinstall
|
|
118
|
+
```bash
|
|
119
|
+
npm install -g claude-ws@latest
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
101
124
|
## Tech Stack
|
|
102
125
|
|
|
103
126
|
- **Framework**: Next.js 16 + React 19
|
package/bin/claudekanban.js
CHANGED
|
@@ -17,6 +17,32 @@ const os = require('os');
|
|
|
17
17
|
// Get package root directory
|
|
18
18
|
const packageRoot = path.resolve(__dirname, '..');
|
|
19
19
|
|
|
20
|
+
// Handle CLI flags
|
|
21
|
+
if (process.argv.includes('--version') || process.argv.includes('-v')) {
|
|
22
|
+
const pkg = require(path.join(packageRoot, 'package.json'));
|
|
23
|
+
console.log(`v${pkg.version}`);
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
28
|
+
console.log(`
|
|
29
|
+
Claude Workspace - Visual workspace for Claude Code
|
|
30
|
+
|
|
31
|
+
Usage:
|
|
32
|
+
claude-ws [options]
|
|
33
|
+
|
|
34
|
+
Options:
|
|
35
|
+
-v, --version Show version number
|
|
36
|
+
-h, --help Show this help message
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
claude-ws Start Claude Workspace server
|
|
40
|
+
|
|
41
|
+
For more info: https://github.com/Claude-Workspace/claude-ws
|
|
42
|
+
`);
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
|
|
20
46
|
// Database path (in user's home directory for persistence)
|
|
21
47
|
const DB_DIR = path.join(os.homedir(), '.claude-ws');
|
|
22
48
|
const DB_PATH = path.join(DB_DIR, 'claude-ws.db');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-ws",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A beautifully crafted workspace interface for Claude Code with real-time streaming and local SQLite database",
|
|
6
6
|
"keywords": [
|
|
@@ -96,6 +96,7 @@
|
|
|
96
96
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
97
97
|
"@radix-ui/react-label": "^2.1.8",
|
|
98
98
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
99
|
+
"@radix-ui/react-select": "^2.2.6",
|
|
99
100
|
"@radix-ui/react-separator": "^1.1.8",
|
|
100
101
|
"@radix-ui/react-slot": "^1.2.4",
|
|
101
102
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
@@ -127,6 +128,7 @@
|
|
|
127
128
|
"tailwind-merge": "^3.4.0",
|
|
128
129
|
"tar": "^7.5.2",
|
|
129
130
|
"tsx": "^4.21.0",
|
|
131
|
+
"typescript": "^5",
|
|
130
132
|
"vscode-icons-js": "^11.6.1",
|
|
131
133
|
"zustand": "^5.0.9"
|
|
132
134
|
},
|
|
@@ -141,8 +143,7 @@
|
|
|
141
143
|
"eslint": "^9",
|
|
142
144
|
"eslint-config-next": "^16.1.3",
|
|
143
145
|
"tailwindcss": "^4",
|
|
144
|
-
"tw-animate-css": "^1.4.0"
|
|
145
|
-
"typescript": "^5"
|
|
146
|
+
"tw-animate-css": "^1.4.0"
|
|
146
147
|
},
|
|
147
148
|
"packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48"
|
|
148
149
|
}
|
package/server.ts
CHANGED
|
@@ -154,14 +154,17 @@ app.prepare().then(async () => {
|
|
|
154
154
|
// Cancel/kill attempt
|
|
155
155
|
socket.on('attempt:cancel', async (data: { attemptId: string }) => {
|
|
156
156
|
const { attemptId } = data;
|
|
157
|
-
const cancelled = agentManager.cancel(attemptId);
|
|
158
157
|
|
|
159
|
-
if
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
// Try to cancel in-memory agent (may not exist if server restarted)
|
|
159
|
+
agentManager.cancel(attemptId);
|
|
160
|
+
|
|
161
|
+
// Always update DB status - handles both in-memory and stale attempts
|
|
162
|
+
// Get attempt to retrieve taskId for global event
|
|
163
|
+
const attempt = await db.query.attempts.findFirst({
|
|
164
|
+
where: eq(schema.attempts.id, attemptId),
|
|
165
|
+
});
|
|
164
166
|
|
|
167
|
+
if (attempt && attempt.status === 'running') {
|
|
165
168
|
await db
|
|
166
169
|
.update(schema.attempts)
|
|
167
170
|
.set({ status: 'cancelled', completedAt: Date.now() })
|
|
@@ -177,7 +180,7 @@ app.prepare().then(async () => {
|
|
|
177
180
|
});
|
|
178
181
|
|
|
179
182
|
// Global event for all clients to track cancelled tasks
|
|
180
|
-
if (attempt
|
|
183
|
+
if (attempt.taskId) {
|
|
181
184
|
io.emit('task:finished', { taskId: attempt.taskId, status: 'cancelled' });
|
|
182
185
|
}
|
|
183
186
|
}
|