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 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,2 @@
1
+ export declare const ideaRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=idea-routes.d.ts.map
@@ -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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"}