@cluesmith/codev 2.0.17 → 2.1.0-rc.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.
Files changed (87) hide show
  1. package/dashboard/dist/assets/index-D7YYtcVQ.css +32 -0
  2. package/dashboard/dist/assets/index-PDBY4L6b.js +197 -0
  3. package/dashboard/dist/assets/index-PDBY4L6b.js.map +1 -0
  4. package/dashboard/dist/index.html +2 -2
  5. package/dist/agent-farm/cli.d.ts.map +1 -1
  6. package/dist/agent-farm/cli.js +52 -4
  7. package/dist/agent-farm/cli.js.map +1 -1
  8. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/cleanup.js +16 -0
  10. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  11. package/dist/agent-farm/commands/index.d.ts +1 -0
  12. package/dist/agent-farm/commands/index.d.ts.map +1 -1
  13. package/dist/agent-farm/commands/index.js +1 -0
  14. package/dist/agent-farm/commands/index.js.map +1 -1
  15. package/dist/agent-farm/commands/open.js +1 -1
  16. package/dist/agent-farm/commands/rename.d.ts +12 -0
  17. package/dist/agent-farm/commands/rename.d.ts.map +1 -0
  18. package/dist/agent-farm/commands/rename.js +42 -0
  19. package/dist/agent-farm/commands/rename.js.map +1 -0
  20. package/dist/agent-farm/commands/shell.js +1 -1
  21. package/dist/agent-farm/commands/start.js +1 -1
  22. package/dist/agent-farm/commands/start.js.map +1 -1
  23. package/dist/agent-farm/db/index.d.ts.map +1 -1
  24. package/dist/agent-farm/db/index.js +13 -1
  25. package/dist/agent-farm/db/index.js.map +1 -1
  26. package/dist/agent-farm/db/schema.d.ts +1 -1
  27. package/dist/agent-farm/db/schema.d.ts.map +1 -1
  28. package/dist/agent-farm/db/schema.js +1 -0
  29. package/dist/agent-farm/db/schema.js.map +1 -1
  30. package/dist/agent-farm/lib/tower-client.d.ts +12 -0
  31. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  32. package/dist/agent-farm/lib/tower-client.js +9 -0
  33. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  34. package/dist/agent-farm/servers/analytics.d.ts +64 -0
  35. package/dist/agent-farm/servers/analytics.d.ts.map +1 -0
  36. package/dist/agent-farm/servers/analytics.js +246 -0
  37. package/dist/agent-farm/servers/analytics.js.map +1 -0
  38. package/dist/agent-farm/servers/overview.d.ts +6 -0
  39. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  40. package/dist/agent-farm/servers/overview.js +46 -5
  41. package/dist/agent-farm/servers/overview.js.map +1 -1
  42. package/dist/agent-farm/servers/tower-cron.js +2 -2
  43. package/dist/agent-farm/servers/tower-cron.js.map +1 -1
  44. package/dist/agent-farm/servers/tower-instances.d.ts +2 -0
  45. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  46. package/dist/agent-farm/servers/tower-instances.js +19 -11
  47. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  48. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  49. package/dist/agent-farm/servers/tower-routes.js +132 -28
  50. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  51. package/dist/agent-farm/servers/tower-server.js +2 -1
  52. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  53. package/dist/agent-farm/servers/tower-terminals.d.ts +24 -1
  54. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  55. package/dist/agent-farm/servers/tower-terminals.js +116 -13
  56. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  57. package/dist/agent-farm/servers/tower-types.d.ts +1 -0
  58. package/dist/agent-farm/servers/tower-types.d.ts.map +1 -1
  59. package/dist/agent-farm/utils/file-tabs.d.ts +11 -0
  60. package/dist/agent-farm/utils/file-tabs.d.ts.map +1 -1
  61. package/dist/agent-farm/utils/file-tabs.js +18 -0
  62. package/dist/agent-farm/utils/file-tabs.js.map +1 -1
  63. package/dist/commands/consult/metrics.d.ts +4 -0
  64. package/dist/commands/consult/metrics.d.ts.map +1 -1
  65. package/dist/commands/consult/metrics.js +16 -0
  66. package/dist/commands/consult/metrics.js.map +1 -1
  67. package/dist/lib/github.d.ts +46 -0
  68. package/dist/lib/github.d.ts.map +1 -1
  69. package/dist/lib/github.js +104 -1
  70. package/dist/lib/github.js.map +1 -1
  71. package/dist/terminal/pty-session.d.ts +1 -1
  72. package/dist/terminal/pty-session.d.ts.map +1 -1
  73. package/dist/terminal/pty-session.js.map +1 -1
  74. package/package.json +1 -1
  75. package/skeleton/.claude/skills/af/SKILL.md +7 -6
  76. package/skeleton/protocols/spike/builder-prompt.md +62 -0
  77. package/skeleton/protocols/spike/protocol.json +36 -0
  78. package/skeleton/protocols/spike/protocol.md +122 -0
  79. package/skeleton/protocols/spike/templates/findings.md +67 -0
  80. package/skeleton/resources/commands/agent-farm.md +26 -24
  81. package/skeleton/resources/commands/overview.md +4 -4
  82. package/skeleton/resources/workflow-reference.md +3 -3
  83. package/skeleton/roles/architect.md +3 -1
  84. package/skeleton/templates/cheatsheet.md +3 -3
  85. package/dashboard/dist/assets/index-2EEvbgZv.css +0 -32
  86. package/dashboard/dist/assets/index-BplVQadP.js +0 -134
  87. package/dashboard/dist/assets/index-BplVQadP.js.map +0 -1
@@ -18,16 +18,18 @@ af <command> [options]
18
18
 
19
19
  ## Commands
20
20
 
21
- ### af dash
21
+ ### af workspace
22
22
 
23
- Project dashboard commands - start/stop the architect dashboard for this project.
23
+ Workspace commands - start/stop the workspace for this project.
24
24
 
25
- #### af dash start
25
+ > **Deprecation note:** `af dash` is a deprecated alias for `af workspace`. It still works but prints a deprecation warning.
26
26
 
27
- Start the architect dashboard.
27
+ #### af workspace start
28
+
29
+ Start the workspace.
28
30
 
29
31
  ```bash
30
- af dash start [options]
32
+ af workspace start [options]
31
33
  ```
32
34
 
33
35
  **Options:**
@@ -40,27 +42,27 @@ af dash start [options]
40
42
 
41
43
  **Description:**
42
44
 
43
- Starts the agent-farm dashboard with:
45
+ Starts the workspace with:
44
46
  - Architect terminal (Claude session with architect role)
45
47
  - Web-based UI for monitoring builders
46
48
  - Terminal session management (shellper processes)
47
49
 
48
- The dashboard is accessible via browser at `http://localhost:<port>`.
50
+ The workspace overview is accessible via browser at `http://localhost:<port>`.
49
51
 
50
52
  **Examples:**
51
53
 
52
54
  ```bash
53
55
  # Start with defaults
54
- af dash start
56
+ af workspace start
55
57
 
56
58
  # Start with custom port
57
- af dash start -p 4300
59
+ af workspace start -p 4300
58
60
 
59
61
  # Start with specific command
60
- af dash start -c "claude --model opus"
62
+ af workspace start -c "claude --model opus"
61
63
 
62
64
  # Start on remote machine
63
- af dash start --remote user@host
65
+ af workspace start --remote user@host
64
66
  ```
65
67
 
66
68
  #### Remote Access
@@ -69,13 +71,13 @@ Start Agent Farm on a remote machine and access it from your local workstation w
69
71
 
70
72
  ```bash
71
73
  # On your local machine - one command does everything:
72
- af dash start --remote user@remote-host
74
+ af workspace start --remote user@remote-host
73
75
 
74
76
  # Or with explicit project path:
75
- af dash start --remote user@remote-host:/path/to/project
77
+ af workspace start --remote user@remote-host:/path/to/project
76
78
 
77
79
  # With custom port:
78
- af dash start --remote user@remote-host --port 4300
80
+ af workspace start --remote user@remote-host --port 4300
79
81
  ```
80
82
 
81
83
  This single command:
@@ -84,9 +86,9 @@ This single command:
84
86
  3. SSHs into the remote machine
85
87
  4. Starts Agent Farm there with matching port
86
88
  5. Sets up SSH tunnel back to your local machine
87
- 6. Opens the dashboard in your browser
89
+ 6. Opens the workspace overview in your browser
88
90
 
89
- The dashboard and all terminals work identically to local development. Press Ctrl+C to disconnect.
91
+ The workspace and all terminals work identically to local development. Press Ctrl+C to disconnect.
90
92
 
91
93
  **Port Selection:**
92
94
 
@@ -115,25 +117,25 @@ export PATH="$HOME/.local/bin:$PATH"
115
117
  **Legacy mode** (deprecated):
116
118
 
117
119
  ```bash
118
- # DEPRECATED: Exposes dashboard without authentication
119
- af dash start --allow-insecure-remote
120
+ # DEPRECATED: Exposes workspace without authentication
121
+ af workspace start --allow-insecure-remote
120
122
  ```
121
123
 
122
124
  The `--allow-insecure-remote` flag binds to `0.0.0.0` with no authentication. Use `--remote` instead for secure access via SSH.
123
125
 
124
- #### af dash stop
126
+ #### af workspace stop
125
127
 
126
128
  Stop all agent farm processes for this project.
127
129
 
128
130
  ```bash
129
- af dash stop
131
+ af workspace stop
130
132
  ```
131
133
 
132
134
  **Description:**
133
135
 
134
136
  Stops all running agent-farm processes including:
135
137
  - Terminal sessions (shellper processes)
136
- - Dashboard servers
138
+ - Workspace servers
137
139
 
138
140
  Does NOT clean up worktrees - use `af cleanup` for that.
139
141
 
@@ -162,7 +164,7 @@ af spawn [issue-number] [options]
162
164
 
163
165
  Creates a new builder in an isolated git worktree. The builder gets:
164
166
  - Its own branch (`builder/<project>-<name>`)
165
- - A dedicated terminal in the dashboard
167
+ - A dedicated terminal in the workspace overview
166
168
  - The builder role prompt loaded automatically
167
169
 
168
170
  **Examples:**
@@ -322,7 +324,7 @@ af shell [options]
322
324
 
323
325
  **Description:**
324
326
 
325
- Opens a general-purpose shell terminal in the dashboard. Useful for:
327
+ Opens a general-purpose shell terminal in the workspace overview. Useful for:
326
328
  - Running tests
327
329
  - Git operations
328
330
  - Manual debugging
@@ -529,7 +531,7 @@ Customize commands via `af-config.json` at the project root:
529
531
  Or override via CLI flags:
530
532
 
531
533
  ```bash
532
- af dash start --architect-cmd "claude --model opus"
534
+ af workspace start --architect-cmd "claude --model opus"
533
535
  af spawn 42 --builder-cmd "claude --model haiku"
534
536
  ```
535
537
 
@@ -20,8 +20,8 @@ codev adopt
20
20
  # Check your environment
21
21
  codev doctor
22
22
 
23
- # Start the architect dashboard
24
- af dash start
23
+ # Start the workspace
24
+ af workspace start
25
25
 
26
26
  # Consult an AI model about a spec
27
27
  consult -m gemini --protocol spir --type spec
@@ -53,8 +53,8 @@ See [codev.md](codev.md) for full documentation.
53
53
 
54
54
  | Command | Description |
55
55
  |---------|-------------|
56
- | `af dash start` | Start the architect dashboard |
57
- | `af dash stop` | Stop all agent farm processes |
56
+ | `af workspace start` | Start the workspace |
57
+ | `af workspace stop` | Stop all agent farm processes |
58
58
  | `af spawn` | Spawn a new builder |
59
59
  | `af status` | Show status of all agents |
60
60
  | `af cleanup` | Clean up a builder worktree |
@@ -76,8 +76,8 @@ AI agents must stop and wait for human action at these gates.
76
76
  ### Architect Commands
77
77
 
78
78
  ```bash
79
- # Start the dashboard
80
- af dash start
79
+ # Start the workspace
80
+ af workspace start
81
81
 
82
82
  # Spawn a builder for a project
83
83
  af spawn 44 --protocol spir
@@ -95,7 +95,7 @@ af open codev/specs/44-name.md
95
95
  af cleanup -p 44
96
96
 
97
97
  # Stop everything
98
- af dash stop
98
+ af workspace stop
99
99
  ```
100
100
 
101
101
  ### Builder Commands
@@ -36,7 +36,7 @@ af spawn --task "fix the bug" # Ad-hoc task builder (soft mode)
36
36
  af spawn --worktree # Worktree with no initial prompt
37
37
  af status # Check all builders
38
38
  af cleanup -p 0001 # Remove completed builder
39
- af dash start/stop # Dashboard management
39
+ af workspace start/stop # Workspace management
40
40
  af send 0001 "message" # Short message to builder
41
41
  ```
42
42
 
@@ -156,12 +156,14 @@ af cleanup -p 0042
156
156
  1. **DO NOT merge PRs yourself** - Let builders merge their own PRs
157
157
  2. **DO NOT commit directly to main** - All changes go through builder PRs
158
158
  3. **DO NOT use `af send` for long messages** - Use GitHub PR comments instead
159
+ 4. **DO NOT run `af` commands from inside a builder worktree** - All `af` commands must be run from the repository root on `main`. Spawning from a worktree nests builders inside it, breaking everything.
159
160
 
160
161
  ### ALWAYS Do These:
161
162
  1. **Create GitHub Issues first** - Track projects as issues before spawning
162
163
  2. **Review artifacts before approving gates** - (Strict mode) Read the spec/plan carefully
163
164
  3. **Use PR comments for feedback** - Not terminal send-keys
164
165
  4. **Let builders own their work** - Guide, don't take over
166
+ 5. **Stay on `main` at the repo root** - All architect operations happen from the main workspace
165
167
 
166
168
  ## Project Tracking
167
169
 
@@ -111,14 +111,14 @@ Architect-Builder orchestration. Used by both **humans and agents**—agents use
111
111
 
112
112
  | Command | Description |
113
113
  |---------|-------------|
114
- | `af dash start` | Start dashboard (port 4200, 4300, etc.) |
115
- | `af dash stop` | Stop all processes |
114
+ | `af workspace start` | Start workspace (port 4200, 4300, etc.) |
115
+ | `af workspace stop` | Stop all processes |
116
116
  | `af spawn <id> --protocol spir` | Spawn a builder for project |
117
117
  | `af status` | Check status of all builders |
118
118
  | `af send <target> <msg>` | Send message (builder↔architect) |
119
119
  | `af cleanup -p <id>` | Clean up a builder worktree |
120
120
  | `af shell` | Spawn a utility shell |
121
- | `af open <file>` | Open file in dashboard viewer |
121
+ | `af open <file>` | Open file in workspace viewer |
122
122
  | `af tower start` | Start cross-project tower |
123
123
 
124
124
  ### consult
@@ -1,32 +0,0 @@
1
- /**
2
- * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
- * https://github.com/chjj/term.js
5
- * @license MIT
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in
15
- * all copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- * THE SOFTWARE.
24
- *
25
- * Originally forked from (with the author's permission):
26
- * Fabrice Bellard's javascript vt100 for jslinux:
27
- * http://bellard.org/jslinux/
28
- * Copyright (c) 2011 Fabrice Bellard
29
- * The original design remains. The terminal itself
30
- * has been extended to include xterm CSI codes, among
31
- * other features.
32
- */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{--bg-primary: #1a1a1a;--bg-secondary: #252525;--bg-tertiary: #2a2a2a;--bg-hover: #333333;--text-primary: #e0e0e0;--text-secondary: #a0a0a0;--text-muted: #666666;--border-color: #333333;--accent: #3b82f6;--accent-hover: #2563eb;--status-active: #22c55e;--status-waiting: #eab308;--status-error: #ef4444;--status-implementing: #f97316}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{height:100%;width:100%;overflow:hidden}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,monospace;background:var(--bg-primary);color:var(--text-primary);font-size:13px}.fullscreen-terminal{height:100vh;width:100vw;overflow:hidden}.fullscreen-terminal>div{height:100%;width:100%}.app{display:flex;flex-direction:column;height:100vh}.app-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);height:40px;flex-shrink:0}.app-title{font-size:14px;font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.header-version{font-size:11px;color:var(--text-secondary);font-weight:400}.app-body{flex:1;overflow:hidden}.split-pane{display:flex;height:100%;width:100%}.split-left,.split-right{height:100%;overflow:hidden}.split-handle{width:4px;cursor:col-resize;background:var(--border-color);flex-shrink:0}.split-handle:hover{background:var(--accent)}.right-panel{display:flex;flex-direction:column;height:100%}.tab-bar{display:flex;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);overflow-x:auto;flex-shrink:0;height:34px}.tab{display:flex;align-items:center;gap:6px;padding:6px 12px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;white-space:nowrap;font-family:inherit}.tab:hover{background:var(--bg-hover);color:var(--text-primary)}.tab-active{color:var(--text-primary);border-bottom-color:var(--accent)}.tab-label{max-width:120px;overflow:hidden;text-overflow:ellipsis}.tab-close{font-size:14px;line-height:1;opacity:.5;padding:0 2px;border-radius:3px}.tab-close:hover{opacity:1;background:var(--bg-hover)}.tab-content{flex:1;overflow:hidden}.terminal-tab-pane{width:100%;height:100%}.file-path-decoration{border-bottom:1px dotted rgba(255,255,255,.3)!important;background:transparent!important;pointer-events:none}.file-path-decoration-hover{border-bottom-color:#ffffffb3!important}.terminal-iframe{display:block}.file-tree{padding:8px;overflow-y:auto;height:100%}.file-node{display:flex;align-items:center;gap:6px;padding:3px 0;cursor:pointer;font-size:12px;border-radius:4px}.file-node:hover{background:var(--bg-hover)}.file-icon{font-size:14px;flex-shrink:0}.file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-tree-error,.file-tree-loading{padding:16px;color:var(--text-muted);font-size:12px}.no-architect{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-muted);font-size:14px}.virtual-keyboard{display:flex;gap:6px;padding:6px 8px;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);flex-shrink:0}.virtual-key{padding:4px 12px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;color:var(--text-secondary);font-size:12px;font-family:inherit;cursor:pointer;touch-action:manipulation;user-select:none;-webkit-user-select:none}.virtual-key:active{background:var(--bg-hover);color:var(--text-primary)}.virtual-key-active{background:var(--accent);border-color:var(--accent);color:#fff}.virtual-key-active:active{background:var(--accent-hover)}.terminal-controls{position:absolute;top:8px;right:20px;z-index:20;display:flex;gap:4px}.terminal-control-btn{display:flex;align-items:center;justify-content:center;min-width:32px;min-height:32px;padding:0;background:transparent;border:none;border-radius:4px;color:#e0e0e0;opacity:.4;cursor:pointer;touch-action:manipulation;user-select:none;-webkit-user-select:none}.terminal-control-btn:hover{opacity:.8}.terminal-control-btn:active{opacity:1}.terminal-status-dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0;align-self:center}.terminal-status-reconnecting{background-color:#fc0;animation:terminal-pulse 1.2s ease-in-out infinite}.terminal-status-disconnected{background-color:#f44}@keyframes terminal-pulse{0%,to{opacity:1}50%{opacity:.3}}.mobile-layout{display:flex;flex-direction:column;height:100vh}.mobile-content{flex:1;overflow:hidden;display:flex;flex-direction:column}@media(max-width:768px){.app-header{padding:6px 12px}.tab{padding:4px 8px;font-size:11px}}.file-viewer{display:flex;flex-direction:column;height:100%;background:var(--bg-primary)}.file-loading,.file-error{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-secondary)}.file-error{color:var(--status-error)}.file-header{display:flex;align-items:center;gap:12px;padding:8px 12px;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);flex-shrink:0}.file-path{font-family:monospace;font-size:12px;color:var(--text-primary);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-language{font-size:11px;color:var(--text-muted);text-transform:uppercase}.file-save-btn{padding:4px 12px;font-size:11px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer}.file-save-btn:hover{background:var(--accent-hover)}.file-save-btn:disabled{opacity:.5;cursor:not-allowed}.file-content{display:flex;flex:1;overflow:auto;background:var(--bg-primary)}.line-numbers{display:flex;flex-direction:column;padding:12px 8px;background:var(--bg-secondary);color:var(--text-muted);font-family:Menlo,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;text-align:right;-webkit-user-select:none;user-select:none;flex-shrink:0;min-width:40px}.line-number{padding-right:8px}.line-number.highlighted-line{background:#3b82f64d}.file-text{flex:1;padding:12px;font-family:Menlo,Monaco,Courier New,monospace;font-size:13px;line-height:1.5;background:var(--bg-primary);color:var(--text-primary);border:none;outline:none;resize:none;white-space:pre;overflow:auto}.file-image-container,.file-video-container{flex:1;display:flex;align-items:center;justify-content:center;overflow:auto;padding:20px}.file-image{max-width:100%;max-height:100%;object-fit:contain}.file-video{max-width:100%;max-height:100%}.file-tree-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.file-search{position:relative;padding:8px;border-bottom:1px solid var(--border-color);flex-shrink:0}.file-search-input{width:100%;padding:6px 10px;font-size:12px;font-family:inherit;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:4px;color:var(--text-primary);outline:none}.file-search-input:focus{border-color:var(--accent)}.file-search-input::placeholder{color:var(--text-muted)}.file-search-suggestions{position:absolute;top:100%;left:8px;right:8px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;box-shadow:0 4px 12px #0000004d;z-index:100;max-height:240px;overflow-y:auto}.file-search-suggestion{display:flex;flex-direction:column;padding:8px 10px;cursor:pointer;border-bottom:1px solid var(--border-color)}.file-search-suggestion:last-child{border-bottom:none}.file-search-suggestion:hover{background:var(--bg-hover)}.suggestion-name{font-size:12px;color:var(--text-primary);font-weight:500}.suggestion-path{font-size:10px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-tree-section{display:flex;flex-direction:column;overflow:hidden}.file-tree-section:first-of-type{flex-shrink:0}.file-tree-section:last-of-type{flex:1;overflow:hidden}.file-tree-section-header{padding:8px 12px;font-size:11px;font-weight:600;text-transform:uppercase;color:var(--text-muted);letter-spacing:.5px;border-bottom:1px solid var(--border-color);flex-shrink:0}.recent-file{color:var(--text-secondary)}.recent-file:hover{color:var(--text-primary)}.file-path-hint{font-size:10px;color:var(--text-muted);margin-left:auto;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-indicator{font-family:monospace;font-size:10px;font-weight:700;padding:1px 4px;border-radius:3px;margin-left:auto;flex-shrink:0}.git-modified{color:var(--status-implementing);background:#f9731626}.git-staged{color:var(--status-active);background:#22c55e26}.git-untracked{color:var(--text-muted);background:#66666626}.cloud-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-secondary);margin-right:12px}.cloud-status--none{color:var(--text-muted)}.cloud-status--error{color:var(--status-error)}.cloud-dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0}.cloud-dot--green{background:var(--status-active)}.cloud-dot--yellow{background:var(--status-waiting);animation:cloud-pulse 1.2s ease-in-out infinite}@keyframes cloud-pulse{0%,to{opacity:1}50%{opacity:.3}}.cloud-dot--red{background:var(--status-error)}.cloud-dot--gray{background:var(--text-muted)}.cloud-uptime{color:var(--text-muted);font-size:11px}.cloud-hint{color:var(--text-muted);font-size:11px;font-style:italic}.cloud-link{color:var(--accent);text-decoration:none;font-size:11px}.cloud-link:hover{text-decoration:underline}.cloud-btn{background:transparent;border:1px solid var(--border-color);color:var(--text-secondary);font-size:11px;padding:1px 6px;border-radius:3px;cursor:pointer}.cloud-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.cloud-btn:disabled{opacity:.5;cursor:default}.mobile-wrapper{display:flex;flex-direction:column;height:100vh}.mobile-header{padding:4px 8px;border-bottom:1px solid var(--border-color);background:var(--bg-primary)}.mobile-wrapper .mobile-layout{flex:1;min-height:0}.work-view{display:flex;flex-direction:column;height:100%;overflow:hidden}.work-content{flex:1;overflow-y:auto;padding:12px 16px}.work-view.file-panel-open .work-content{flex:2}.work-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.work-title{font-size:16px;font-weight:600;color:var(--text-primary)}.work-actions{display:flex;gap:6px}.work-btn{background:var(--accent);color:#fff;border:none;padding:4px 10px;border-radius:4px;font-size:12px;cursor:pointer}.work-btn:hover{background:var(--accent-hover)}.work-btn-secondary{background:transparent;border:1px solid var(--border-color);color:var(--text-secondary)}.work-btn-secondary:hover{background:var(--bg-hover);color:var(--text-primary)}.tip-banner{display:flex;align-items:center;gap:8px;padding:6px 12px;margin-bottom:16px;background:var(--bg-tertiary);border-radius:4px;font-size:12px;color:var(--text-secondary)}.tip-banner-label{font-weight:600;color:var(--text-muted);white-space:nowrap}.tip-banner-text{flex:1;min-width:0}.tip-banner-text code{font-family:var(--font-mono, monospace);background:var(--bg-primary);padding:1px 4px;border-radius:2px;font-size:11px;color:var(--text-primary)}.tip-banner-nav{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px 4px;font-size:14px;line-height:1;border-radius:2px}.tip-banner-nav:hover{color:var(--text-primary);background:var(--bg-hover)}.tip-banner-dismiss{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px 4px;font-size:14px;line-height:1;border-radius:2px;margin-left:4px}.tip-banner-dismiss:hover{color:var(--text-primary);background:var(--bg-hover)}.work-section{margin-bottom:20px}.work-section-title{font-size:11px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;display:flex;align-items:center;gap:6px}.work-empty{color:var(--text-muted);font-style:italic;font-size:12px;padding:8px 0}.work-unavailable{color:var(--status-waiting);font-size:12px;padding:8px 0}.work-error{color:var(--status-error);font-size:12px;padding:8px;margin-bottom:12px;background:#ef44441a;border-radius:4px}.work-loading{color:var(--text-muted);padding:16px}.builder-table{width:100%;border-collapse:separate;border-spacing:0 4px}.builder-table thead th{font-size:11px;font-weight:500;color:var(--text-secondary);text-align:left;padding:0 10px 4px;white-space:nowrap}.builder-row td{background:var(--bg-secondary);padding:8px 10px;font-size:13px;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}.builder-row td:first-child{border-left:1px solid var(--border-color);border-radius:8px 0 0 8px}.builder-row td:last-child{border-right:1px solid var(--border-color);border-radius:0 8px 8px 0}.builder-row:hover td{border-color:var(--accent)}.builder-row--blocked td:first-child{border-left:3px solid var(--status-waiting)}.builder-col-id{font-weight:500;color:var(--accent);white-space:nowrap;width:60px}.builder-col-title{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:0;width:40%}.builder-col-state{white-space:nowrap;width:140px}.builder-state-active{font-size:12px;color:var(--accent)}.builder-state-blocked{font-size:12px;color:var(--status-waiting)}.builder-col-progress{width:120px;white-space:nowrap}.progress-bar{width:80px;height:4px;background:var(--bg-tertiary);border-radius:2px;overflow:hidden;display:inline-block;vertical-align:middle}.progress-fill{height:100%;background:var(--status-active);border-radius:2px;transition:width .3s ease}.progress-fill--blocked{background:var(--status-waiting)}.progress-pct{font-size:11px;color:var(--text-secondary);margin-left:6px;vertical-align:middle}.builder-col-elapsed{font-size:12px;color:var(--text-secondary);white-space:nowrap;width:70px}.builder-col-actions{width:60px;text-align:right}.builder-row-open{font-size:11px;color:var(--accent);background:#3b82f614;border:1px solid rgba(59,130,246,.2);padding:3px 10px;border-radius:5px;cursor:pointer;white-space:nowrap}.builder-row-open:hover{background:#3b82f62e}.pr-rows{display:flex;flex-direction:column;gap:4px}a.pr-row{text-decoration:none;color:inherit;cursor:pointer}.pr-row{display:flex;align-items:center;gap:10px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;padding:10px 14px}.pr-row:hover{border-color:var(--accent)}.pr-row-number{font-size:13px;font-weight:500;color:var(--accent);white-space:nowrap}.pr-row-title{flex:1;font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pr-row-status{font-size:11px;white-space:nowrap}.pr-status--approved{color:var(--status-active)}.pr-status--reviewing{color:var(--status-waiting)}.pr-status--changes{color:var(--status-error)}.pr-row-age{font-size:11px;color:var(--text-muted);white-space:nowrap}.attention-rows{display:flex;flex-direction:column;gap:4px}a.attention-row{text-decoration:none;color:inherit;cursor:pointer}.attention-row{display:flex;align-items:center;gap:10px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;padding:10px 14px}.attention-row:hover{border-color:var(--accent)}.attention-row-id{font-size:13px;font-weight:500;color:var(--accent);white-space:nowrap}.attention-row-title{flex:1;font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attention-row-kind{font-size:11px;white-space:nowrap}.attention-kind--pr{color:var(--status-waiting)}.attention-kind--spec,.attention-kind--plan{color:var(--status-error)}.attention-row-age{font-size:11px;color:var(--text-muted);white-space:nowrap}.backlog-rows{display:flex;flex-direction:column;gap:2px}.backlog-row{display:flex;align-items:center;gap:6px;padding:4px 14px;border-radius:6px}.backlog-row:hover{background:var(--bg-secondary)}.backlog-row-main{display:flex;align-items:center;gap:10px;flex:1;min-width:0;text-decoration:none;color:inherit}.backlog-row-main:hover .backlog-row-title{color:var(--accent)}.backlog-artifacts{display:flex;gap:4px;flex-shrink:0}.backlog-artifact-link{font-size:10px;padding:1px 5px;border-radius:3px;border:1px solid var(--border-color);background:transparent;color:var(--text-secondary);cursor:pointer;white-space:nowrap}.backlog-artifact-link:hover{background:var(--bg-hover);color:var(--accent);border-color:var(--accent)}.backlog-priority-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.priority-dot--high{background:var(--status-error)}.priority-dot--med{background:var(--status-waiting)}.priority-dot--low{background:var(--text-muted)}.backlog-row-number{font-size:13px;font-weight:500;color:var(--accent);white-space:nowrap}.backlog-type-tag{font-size:10px;padding:1px 5px;border-radius:3px;font-weight:500;white-space:nowrap}.type-tag--bug{background:#ef444426;color:var(--status-error)}.type-tag--project{background:#a855f71f;color:#a855f7}.backlog-row-title{flex:1;font-size:13px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backlog-row-age{font-size:11px;color:var(--text-muted);white-space:nowrap}.recently-closed-rows{display:flex;flex-direction:column;gap:2px}.recently-closed-row{display:flex;align-items:center;gap:10px;padding:4px 14px;border-radius:6px;text-decoration:none;color:inherit;opacity:.7}.recently-closed-row:hover{background:var(--bg-secondary);opacity:1}.recently-closed-check{font-size:11px;color:var(--status-active);flex-shrink:0}.work-file-panel{border-top:1px solid var(--border-color);background:var(--bg-secondary)}.work-file-panel.expanded{flex:1;display:flex;flex-direction:column;overflow:hidden}.work-file-panel.collapsed{flex-shrink:0}.work-file-panel-header{display:flex;align-items:center;gap:6px;padding:6px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.work-file-panel-header:hover{background:var(--bg-hover)}.work-file-panel-toggle{font-size:10px;color:var(--text-muted)}.work-file-panel-label{font-size:12px;font-weight:500;color:var(--text-secondary)}.work-file-panel-search{flex:1;margin-left:8px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:3px;color:var(--text-primary);font-size:12px;padding:3px 8px;outline:none}.work-file-panel-search::placeholder{color:var(--text-muted)}.work-file-panel-search:focus{border-color:var(--accent)}.work-file-panel-content{flex:1;overflow-y:auto;padding:0 12px 12px}@media(max-width:768px){.work-content{padding:8px 12px}.work-header{flex-wrap:wrap;gap:8px}.pr-row,.attention-row{flex-wrap:wrap}.builder-table{font-size:12px}.builder-col-elapsed,.builder-table thead th:nth-child(5){display:none}.pr-row-title,.attention-row-title,.backlog-row-title{min-width:60%}}