claudedesk 3.6.0 → 3.7.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 +63 -1
- package/dist/api/idea-routes.d.ts +2 -0
- package/dist/api/idea-routes.d.ts.map +1 -0
- package/dist/api/idea-routes.js +148 -0
- package/dist/api/idea-routes.js.map +1 -0
- package/dist/client/assets/{index-C1CzKXt5.js → index-BYSG6Whj.js} +1583 -1583
- package/dist/client/assets/index-C7kVK1f-.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/core/idea-manager.d.ts +38 -0
- package/dist/core/idea-manager.d.ts.map +1 -0
- package/dist/core/idea-manager.js +638 -0
- package/dist/core/idea-manager.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/index-CsLr7pht.css +0 -1
package/README.md
CHANGED
|
@@ -61,6 +61,60 @@ It is not an IDE. It is not a replacement for Claude Code. It is a session manag
|
|
|
61
61
|
- **MCP Server Integration** - Configure and manage MCP servers for external tools (GitHub, PostgreSQL, Slack, and more). Tool invocation during sessions coming soon.
|
|
62
62
|
- **CI/CD Pipeline Monitoring** - Automatically monitor GitHub Actions and GitLab CI after shipping code, with error categorization and Fix CI prompt composition
|
|
63
63
|
- **Smart Context Management** - Automatic token budget tracking with visual context gauge, AI-powered conversation summarization using Haiku when approaching limits, and session splitting when context fills up to maintain response quality
|
|
64
|
+
- **Idea Building** - Repo-free brainstorming sessions with Claude. Start exploring ideas without committing to a project, then promote to a full session when ready. Purple accent, lightbulb iconography, zero-ceremony creation.
|
|
65
|
+
|
|
66
|
+
## Idea Building
|
|
67
|
+
|
|
68
|
+
ClaudeDesk includes a brainstorming mode for exploring concepts without a repository. Ideas are lightweight, repo-free conversations with Claude focused on creative exploration.
|
|
69
|
+
|
|
70
|
+
### Key Concepts
|
|
71
|
+
|
|
72
|
+
- **Ephemeral Ideas** — Live in memory only, lost on restart. Zero ceremony to create.
|
|
73
|
+
- **Saved Ideas** — Persisted to `config/ideas.json` for later reference.
|
|
74
|
+
- **Repo Attachment** — Link ideas to existing repos for read-only codebase context (no modifications).
|
|
75
|
+
- **Promotion** — Graduate ideas to full projects with git init, optional scaffold, and session creation.
|
|
76
|
+
|
|
77
|
+
### Workflow
|
|
78
|
+
|
|
79
|
+
1. **Create** — Press `Ctrl+Shift+I` or click "New Idea" in the RepoDock [+] menu
|
|
80
|
+
2. **Brainstorm** — Chat with Claude in a purple-themed, repo-free environment
|
|
81
|
+
3. **Save** (optional) — Pin ephemeral ideas to persist across restarts
|
|
82
|
+
4. **Attach** (optional) — Link existing repos so Claude can browse code for context
|
|
83
|
+
5. **Promote** — Graduate to a full project with a two-step modal (name, directory, scaffold options)
|
|
84
|
+
|
|
85
|
+
### Idea Keyboard Shortcuts
|
|
86
|
+
|
|
87
|
+
| Shortcut | Action |
|
|
88
|
+
|----------|--------|
|
|
89
|
+
| `Ctrl+Shift+I` | Create new idea |
|
|
90
|
+
| `Ctrl+B` | Toggle idea panel sidebar |
|
|
91
|
+
| `Ctrl+Enter` | Send message |
|
|
92
|
+
| `Esc` | Close modal / cancel title edit |
|
|
93
|
+
|
|
94
|
+
### Idea API Endpoints
|
|
95
|
+
|
|
96
|
+
| Method | Endpoint | Purpose |
|
|
97
|
+
|--------|----------|---------|
|
|
98
|
+
| `POST` | `/api/ideas` | Create idea (ephemeral) |
|
|
99
|
+
| `GET` | `/api/ideas` | List saved ideas |
|
|
100
|
+
| `GET` | `/api/ideas/:id` | Get idea with messages |
|
|
101
|
+
| `PUT` | `/api/ideas/:id` | Update title, tags, status |
|
|
102
|
+
| `DELETE` | `/api/ideas/:id` | Delete idea + cleanup |
|
|
103
|
+
| `POST` | `/api/ideas/:id/save` | Pin ephemeral → saved |
|
|
104
|
+
| `POST` | `/api/ideas/:id/cancel` | Cancel running Claude process |
|
|
105
|
+
| `POST` | `/api/ideas/:id/promote` | Graduate to project |
|
|
106
|
+
| `POST` | `/api/ideas/:id/attach` | Link to existing repo |
|
|
107
|
+
| `POST` | `/api/ideas/:id/detach` | Unlink from repo |
|
|
108
|
+
|
|
109
|
+
### WebSocket Events
|
|
110
|
+
|
|
111
|
+
| Event | Direction | Purpose |
|
|
112
|
+
|-------|-----------|---------|
|
|
113
|
+
| `subscribe-idea` | Client → Server | Subscribe to idea updates |
|
|
114
|
+
| `unsubscribe-idea` | Client → Server | Unsubscribe from idea |
|
|
115
|
+
| `idea-message` | Client → Server | Send message to Claude |
|
|
116
|
+
| `idea-cancel` | Client → Server | Cancel running operation |
|
|
117
|
+
| `idea-set-mode` | Client → Server | Switch plan/direct mode |
|
|
64
118
|
|
|
65
119
|
## File Review & Approval
|
|
66
120
|
|
|
@@ -311,6 +365,9 @@ Configure in **Settings > System > Context Management** or in `config/settings.j
|
|
|
311
365
|
| **Escape** | Stop Claude's current generation (preserves partial response) |
|
|
312
366
|
| **Enter** | Send message (in composer) |
|
|
313
367
|
| **Shift+Enter** | New line in composer |
|
|
368
|
+
| **Ctrl+Shift+I** | Create new idea |
|
|
369
|
+
| **Ctrl+B** | Toggle idea panel sidebar |
|
|
370
|
+
| **Ctrl+Enter** | Send message in idea chat |
|
|
314
371
|
|
|
315
372
|
## Installation
|
|
316
373
|
|
|
@@ -469,6 +526,7 @@ export CLAUDEDESK_DATA_DIR=/custom/path
|
|
|
469
526
|
mcp-servers.json # MCP server configurations (auto-created)
|
|
470
527
|
pipeline-monitors.json # CI/CD pipeline monitor state (auto-created)
|
|
471
528
|
terminal-sessions.json # Persisted session data
|
|
529
|
+
ideas.json # Saved ideas (brainstorming sessions)
|
|
472
530
|
skills/ # Custom Claude skills
|
|
473
531
|
usage/ # API usage tracking
|
|
474
532
|
artifacts/ # Session artifacts and exports
|
|
@@ -1426,17 +1484,21 @@ src/
|
|
|
1426
1484
|
core/ # Claude invoker, git operations, session management
|
|
1427
1485
|
# MCP: mcp-client.ts, mcp-manager.ts
|
|
1428
1486
|
# CI/CD: pipeline-monitor.ts
|
|
1487
|
+
# Ideas: idea-manager.ts
|
|
1488
|
+
api/ # Express routes (terminal, idea, settings, etc.)
|
|
1429
1489
|
config/ # Settings, workspaces, skills
|
|
1430
1490
|
# MCP: mcp-servers.ts (registry), mcp-catalog.ts (templates)
|
|
1431
1491
|
ui/app/ # React frontend
|
|
1432
1492
|
components/
|
|
1493
|
+
idea/ # Idea Building (IdeaView, IdeaPanel, IdeaCard, modals)
|
|
1433
1494
|
mission/ # MissionControl landing page and phased workflow
|
|
1434
1495
|
settings/ # MCP, CI/CD, cache, update settings panels
|
|
1435
1496
|
terminal/ # Terminal components (Composer, MessageItem, ActivityTimeline, etc.)
|
|
1436
1497
|
hooks/ # useTerminal, useMCPServers, useAgents, useRemoteAccess, etc.
|
|
1437
|
-
store/ # terminalStore, appStore, runStore, terminalUIStore, themeStore
|
|
1498
|
+
store/ # terminalStore, appStore, runStore, terminalUIStore, themeStore, ideaStore
|
|
1438
1499
|
config/
|
|
1439
1500
|
repos.json # Repository configuration (example)
|
|
1501
|
+
ideas.json # Saved ideas (auto-created)
|
|
1440
1502
|
skills/ # Custom skill definitions
|
|
1441
1503
|
deploy/
|
|
1442
1504
|
docker-compose.yml # Production Docker deployment
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idea-routes.d.ts","sourceRoot":"","sources":["../../src/api/idea-routes.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,4CAAW,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { ideaManager } from '../core/idea-manager.js';
|
|
3
|
+
export const ideaRouter = Router();
|
|
4
|
+
// POST /ideas — Create a new idea (ephemeral by default)
|
|
5
|
+
ideaRouter.post('/', (req, res) => {
|
|
6
|
+
try {
|
|
7
|
+
const idea = ideaManager.createIdea();
|
|
8
|
+
res.json({ success: true, data: idea });
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
12
|
+
res.status(500).json({ success: false, error: msg });
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
// GET /ideas — List all saved ideas
|
|
16
|
+
ideaRouter.get('/', (req, res) => {
|
|
17
|
+
try {
|
|
18
|
+
const ideas = ideaManager.getAllSavedIdeas();
|
|
19
|
+
res.json({ success: true, data: ideas });
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
23
|
+
res.status(500).json({ success: false, error: msg });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
// GET /ideas/:id — Get idea with messages
|
|
27
|
+
ideaRouter.get('/:id', (req, res) => {
|
|
28
|
+
try {
|
|
29
|
+
const idea = ideaManager.getIdea(req.params.id);
|
|
30
|
+
if (!idea) {
|
|
31
|
+
return res.status(404).json({ success: false, error: 'Idea not found' });
|
|
32
|
+
}
|
|
33
|
+
res.json({ success: true, data: idea });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
37
|
+
res.status(500).json({ success: false, error: msg });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// PUT /ideas/:id — Update title, tags, status
|
|
41
|
+
ideaRouter.put('/:id', (req, res) => {
|
|
42
|
+
try {
|
|
43
|
+
const { title, tags, status } = req.body;
|
|
44
|
+
const idea = ideaManager.updateIdea(req.params.id, { title, tags, status });
|
|
45
|
+
res.json({ success: true, data: idea });
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
49
|
+
if (msg.includes('not found')) {
|
|
50
|
+
return res.status(404).json({ success: false, error: msg });
|
|
51
|
+
}
|
|
52
|
+
res.status(500).json({ success: false, error: msg });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// DELETE /ideas/:id — Delete idea + cleanup temp dir
|
|
56
|
+
ideaRouter.delete('/:id', (req, res) => {
|
|
57
|
+
try {
|
|
58
|
+
ideaManager.deleteIdea(req.params.id);
|
|
59
|
+
res.json({ success: true });
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
63
|
+
if (msg.includes('not found')) {
|
|
64
|
+
return res.status(404).json({ success: false, error: msg });
|
|
65
|
+
}
|
|
66
|
+
res.status(500).json({ success: false, error: msg });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// POST /ideas/:id/save — Pin ephemeral → saved
|
|
70
|
+
ideaRouter.post('/:id/save', (req, res) => {
|
|
71
|
+
try {
|
|
72
|
+
const idea = ideaManager.saveIdea(req.params.id);
|
|
73
|
+
res.json({ success: true, data: idea });
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
77
|
+
if (msg.includes('not found')) {
|
|
78
|
+
return res.status(404).json({ success: false, error: msg });
|
|
79
|
+
}
|
|
80
|
+
res.status(500).json({ success: false, error: msg });
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// POST /ideas/:id/cancel — Cancel running Claude process
|
|
84
|
+
ideaRouter.post('/:id/cancel', (req, res) => {
|
|
85
|
+
try {
|
|
86
|
+
ideaManager.cancelClaude(req.params.id);
|
|
87
|
+
res.json({ success: true });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
91
|
+
res.status(500).json({ success: false, error: msg });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// POST /ideas/:id/promote — Graduate to project
|
|
95
|
+
ideaRouter.post('/:id/promote', async (req, res) => {
|
|
96
|
+
try {
|
|
97
|
+
const options = req.body;
|
|
98
|
+
if (!options.repoName || !options.directory) {
|
|
99
|
+
return res.status(400).json({ success: false, error: 'repoName and directory are required' });
|
|
100
|
+
}
|
|
101
|
+
const result = await ideaManager.promoteIdea(req.params.id, options);
|
|
102
|
+
res.json({ success: true, data: result });
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
106
|
+
if (msg.includes('not found')) {
|
|
107
|
+
return res.status(404).json({ success: false, error: msg });
|
|
108
|
+
}
|
|
109
|
+
res.status(500).json({ success: false, error: msg });
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// POST /ideas/:id/attach — Link to existing repo
|
|
113
|
+
ideaRouter.post('/:id/attach', (req, res) => {
|
|
114
|
+
try {
|
|
115
|
+
const { repoId } = req.body;
|
|
116
|
+
if (!repoId) {
|
|
117
|
+
return res.status(400).json({ success: false, error: 'repoId is required' });
|
|
118
|
+
}
|
|
119
|
+
const idea = ideaManager.attachRepo(req.params.id, repoId);
|
|
120
|
+
res.json({ success: true, data: idea });
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
124
|
+
if (msg.includes('not found')) {
|
|
125
|
+
return res.status(404).json({ success: false, error: msg });
|
|
126
|
+
}
|
|
127
|
+
res.status(500).json({ success: false, error: msg });
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
// POST /ideas/:id/detach — Unlink from repo
|
|
131
|
+
ideaRouter.post('/:id/detach', (req, res) => {
|
|
132
|
+
try {
|
|
133
|
+
const { repoId } = req.body;
|
|
134
|
+
if (!repoId) {
|
|
135
|
+
return res.status(400).json({ success: false, error: 'repoId is required' });
|
|
136
|
+
}
|
|
137
|
+
const idea = ideaManager.detachRepo(req.params.id, repoId);
|
|
138
|
+
res.json({ success: true, data: idea });
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
142
|
+
if (msg.includes('not found')) {
|
|
143
|
+
return res.status(404).json({ success: false, error: msg });
|
|
144
|
+
}
|
|
145
|
+
res.status(500).json({ success: false, error: msg });
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=idea-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idea-routes.js","sourceRoot":"","sources":["../../src/api/idea-routes.ts"],"names":[],"mappings":"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"}
|