@cluesmith/codev 2.0.0-rc.57 → 2.0.0-rc.59

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 (104) hide show
  1. package/dashboard/dist/assets/index-CXloFYpB.css +32 -0
  2. package/dashboard/dist/assets/index-Ca2fjOJf.js +131 -0
  3. package/dashboard/dist/assets/index-Ca2fjOJf.js.map +1 -0
  4. package/dashboard/dist/index.html +2 -2
  5. package/dist/agent-farm/commands/attach.d.ts.map +1 -1
  6. package/dist/agent-farm/commands/attach.js +31 -8
  7. package/dist/agent-farm/commands/attach.js.map +1 -1
  8. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/spawn.js +38 -28
  10. package/dist/agent-farm/commands/spawn.js.map +1 -1
  11. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  12. package/dist/agent-farm/commands/start.js +3 -226
  13. package/dist/agent-farm/commands/start.js.map +1 -1
  14. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  15. package/dist/agent-farm/commands/status.js +5 -2
  16. package/dist/agent-farm/commands/status.js.map +1 -1
  17. package/dist/agent-farm/db/index.d.ts.map +1 -1
  18. package/dist/agent-farm/db/index.js +45 -0
  19. package/dist/agent-farm/db/index.js.map +1 -1
  20. package/dist/agent-farm/db/schema.d.ts +1 -1
  21. package/dist/agent-farm/db/schema.d.ts.map +1 -1
  22. package/dist/agent-farm/db/schema.js +2 -2
  23. package/dist/agent-farm/hq-connector.d.ts +0 -4
  24. package/dist/agent-farm/hq-connector.d.ts.map +1 -1
  25. package/dist/agent-farm/hq-connector.js +0 -15
  26. package/dist/agent-farm/hq-connector.js.map +1 -1
  27. package/dist/agent-farm/servers/tower-server.js +82 -22
  28. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +2 -0
  31. package/dist/cli.js.map +1 -1
  32. package/dist/commands/consult/index.d.ts +1 -0
  33. package/dist/commands/consult/index.d.ts.map +1 -1
  34. package/dist/commands/consult/index.js +23 -4
  35. package/dist/commands/consult/index.js.map +1 -1
  36. package/dist/commands/porch/checks.d.ts +3 -2
  37. package/dist/commands/porch/checks.d.ts.map +1 -1
  38. package/dist/commands/porch/checks.js +8 -2
  39. package/dist/commands/porch/checks.js.map +1 -1
  40. package/dist/commands/porch/index.d.ts.map +1 -1
  41. package/dist/commands/porch/index.js +21 -23
  42. package/dist/commands/porch/index.js.map +1 -1
  43. package/dist/commands/porch/next.d.ts +22 -0
  44. package/dist/commands/porch/next.d.ts.map +1 -0
  45. package/dist/commands/porch/next.js +475 -0
  46. package/dist/commands/porch/next.js.map +1 -0
  47. package/dist/commands/porch/protocol.d.ts +3 -3
  48. package/dist/commands/porch/protocol.d.ts.map +1 -1
  49. package/dist/commands/porch/protocol.js +40 -6
  50. package/dist/commands/porch/protocol.js.map +1 -1
  51. package/dist/commands/porch/types.d.ts +36 -1
  52. package/dist/commands/porch/types.d.ts.map +1 -1
  53. package/dist/commands/porch/verdict.d.ts +31 -0
  54. package/dist/commands/porch/verdict.d.ts.map +1 -0
  55. package/dist/commands/porch/verdict.js +59 -0
  56. package/dist/commands/porch/verdict.js.map +1 -0
  57. package/package.json +5 -7
  58. package/skeleton/porch/prompts/defend.md +1 -1
  59. package/skeleton/porch/prompts/evaluate.md +2 -2
  60. package/skeleton/porch/prompts/implement.md +1 -1
  61. package/skeleton/porch/prompts/plan.md +1 -1
  62. package/skeleton/porch/prompts/review.md +4 -4
  63. package/skeleton/porch/prompts/specify.md +1 -1
  64. package/skeleton/porch/prompts/understand.md +2 -2
  65. package/skeleton/protocol-schema.json +3 -3
  66. package/skeleton/protocols/bugfix/builder-prompt.md +1 -1
  67. package/skeleton/protocols/experiment/protocol.md +3 -3
  68. package/skeleton/protocols/experiment/templates/notes.md +1 -1
  69. package/skeleton/protocols/maintain/protocol.md +1 -1
  70. package/skeleton/protocols/protocol-schema.json +1 -1
  71. package/skeleton/protocols/{spider → spir}/builder-prompt.md +1 -1
  72. package/skeleton/protocols/{spider → spir}/prompts/implement.md +1 -1
  73. package/skeleton/protocols/{spider → spir}/prompts/plan.md +2 -2
  74. package/skeleton/protocols/{spider → spir}/prompts/review.md +2 -2
  75. package/skeleton/protocols/{spider → spir}/prompts/specify.md +1 -1
  76. package/skeleton/protocols/{spider → spir}/protocol.json +2 -2
  77. package/skeleton/protocols/{spider → spir}/protocol.md +6 -8
  78. package/skeleton/protocols/{spider → spir}/templates/review.md +1 -1
  79. package/skeleton/protocols/tick/builder-prompt.md +1 -1
  80. package/skeleton/protocols/tick/protocol.md +18 -18
  81. package/skeleton/protocols/tick/templates/review.md +1 -1
  82. package/skeleton/resources/commands/overview.md +1 -1
  83. package/skeleton/resources/workflow-reference.md +2 -2
  84. package/skeleton/roles/architect.md +2 -2
  85. package/skeleton/roles/builder.md +2 -2
  86. package/skeleton/templates/AGENTS.md +1 -1
  87. package/skeleton/templates/CLAUDE.md +1 -1
  88. package/skeleton/templates/cheatsheet.md +3 -3
  89. package/skeleton/templates/projectlist.md +1 -1
  90. package/templates/dashboard/js/main.js +1 -1
  91. package/templates/open.html +26 -0
  92. package/dashboard/dist/assets/index-BV7KQvFU.css +0 -32
  93. package/dashboard/dist/assets/index-bhDjF0Oa.js +0 -131
  94. package/dashboard/dist/assets/index-bhDjF0Oa.js.map +0 -1
  95. package/dist/commands/porch/claude.d.ts +0 -27
  96. package/dist/commands/porch/claude.d.ts.map +0 -1
  97. package/dist/commands/porch/claude.js +0 -107
  98. package/dist/commands/porch/claude.js.map +0 -1
  99. package/dist/commands/porch/run.d.ts +0 -40
  100. package/dist/commands/porch/run.d.ts.map +0 -1
  101. package/dist/commands/porch/run.js +0 -893
  102. package/dist/commands/porch/run.js.map +0 -1
  103. /package/skeleton/protocols/{spider → spir}/templates/plan.md +0 -0
  104. /package/skeleton/protocols/{spider → spir}/templates/spec.md +0 -0
@@ -77,7 +77,7 @@
77
77
 
78
78
  ## TICK Protocol Feedback
79
79
  - **Autonomous execution**: [Worked well / Issues encountered]
80
- - **Single-phase approach**: [Appropriate / Should have used SPIDER]
80
+ - **Single-phase approach**: [Appropriate / Should have used SPIR]
81
81
  - **Speed vs quality trade-off**: [Balanced / Too fast / Too slow]
82
82
  - **End-only consultation**: [Caught issues / Missed opportunities]
83
83
 
@@ -91,7 +91,7 @@ Agent Farm is configured via `af-config.json` at the project root. Created durin
91
91
 
92
92
  ## Related Documentation
93
93
 
94
- - [SPIDER Protocol](../protocols/spider/protocol.md) - Multi-phase development workflow
94
+ - [SPIR Protocol](../protocols/spir/protocol.md) - Multi-phase development workflow
95
95
  - [TICK Protocol](../protocols/tick/protocol.md) - Fast amendment workflow
96
96
  - [Architect Role](../roles/architect.md) - Architect responsibilities
97
97
  - [Builder Role](../roles/builder.md) - Builder responsibilities
@@ -1,6 +1,6 @@
1
1
  # Architect-Builder Workflow Reference
2
2
 
3
- Quick reference for the 7-stage project workflow. For protocol details, see `codev/protocols/spider/protocol.md`.
3
+ Quick reference for the 7-stage project workflow. For protocol details, see `codev/protocols/spir/protocol.md`.
4
4
 
5
5
  ## Workflow Overview
6
6
 
@@ -236,7 +236,7 @@ af cleanup -p XXXX --force
236
236
 
237
237
  ## Related Documentation
238
238
 
239
- - Full SPIDER protocol: `codev/protocols/spider/protocol.md`
239
+ - Full SPIR protocol: `codev/protocols/spir/protocol.md`
240
240
  - Builder role: `codev/roles/builder.md`
241
241
  - Architect role: `codev/roles/architect.md`
242
242
  - Consultant role: `codev/roles/consultant.md`
@@ -95,7 +95,7 @@ The builder stops at gates requiring approval:
95
95
  **spec-approval** - After builder writes the spec
96
96
  ```bash
97
97
  # Review the spec in the builder's worktree
98
- cat worktrees/spider_0042_user-authentication/codev/specs/0042-user-authentication.md
98
+ cat worktrees/spir_0042_user-authentication/codev/specs/0042-user-authentication.md
99
99
 
100
100
  # Approve if satisfactory
101
101
  porch approve 0042 spec-approval
@@ -104,7 +104,7 @@ porch approve 0042 spec-approval
104
104
  **plan-approval** - After builder writes the plan
105
105
  ```bash
106
106
  # Review the plan
107
- cat worktrees/spider_0042_user-authentication/codev/plans/0042-user-authentication.md
107
+ cat worktrees/spir_0042_user-authentication/codev/plans/0042-user-authentication.md
108
108
 
109
109
  # Approve if satisfactory
110
110
  porch approve 0042 plan-approval
@@ -60,7 +60,7 @@ You must:
60
60
 
61
61
  ### What You DON'T Do in Strict Mode
62
62
 
63
- - **Don't manually follow SPIDER steps** - Porch handles this
63
+ - **Don't manually follow SPIR steps** - Porch handles this
64
64
  - **Don't run consult directly** - Porch runs 3-way reviews
65
65
  - **Don't edit status.yaml phase/iteration** - Only porch modifies state
66
66
  - **Don't call porch approve** - Only humans approve gates
@@ -80,7 +80,7 @@ cat codev/specs/XXXX-*.md
80
80
  cat codev/plans/XXXX-*.md
81
81
 
82
82
  # Read the protocol
83
- cat codev/protocols/spider/protocol.md
83
+ cat codev/protocols/spir/protocol.md
84
84
 
85
85
  # Start implementing
86
86
  ```
@@ -8,7 +8,7 @@ This project uses **Codev** for AI-assisted development.
8
8
 
9
9
  ## Available Protocols
10
10
 
11
- - **SPIDER**: Multi-phase development with consultation (`codev/protocols/spider/protocol.md`)
11
+ - **SPIR**: Multi-phase development with consultation (`codev/protocols/spir/protocol.md`)
12
12
  - **TICK**: Fast autonomous implementation (`codev/protocols/tick/protocol.md`)
13
13
  - **EXPERIMENT**: Disciplined experimentation (`codev/protocols/experiment/protocol.md`)
14
14
  - **MAINTAIN**: Codebase maintenance (`codev/protocols/maintain/protocol.md`)
@@ -6,7 +6,7 @@ This project uses **Codev** for AI-assisted development.
6
6
 
7
7
  ## Available Protocols
8
8
 
9
- - **SPIDER**: Multi-phase development with consultation (`codev/protocols/spider/protocol.md`)
9
+ - **SPIR**: Multi-phase development with consultation (`codev/protocols/spir/protocol.md`)
10
10
  - **TICK**: Fast autonomous implementation (`codev/protocols/tick/protocol.md`)
11
11
  - **EXPERIMENT**: Disciplined experimentation (`codev/protocols/experiment/protocol.md`)
12
12
  - **MAINTAIN**: Codebase maintenance (`codev/protocols/maintain/protocol.md`)
@@ -41,7 +41,7 @@ Just like structuring a human team—clear roles, defined processes, explicit ha
41
41
 
42
42
  | Component | Purpose |
43
43
  |-----------|---------|
44
- | Protocols | Define HOW work happens (SPIDER, TICK, etc.) |
44
+ | Protocols | Define HOW work happens (SPIR, TICK, etc.) |
45
45
  | Roles | Define WHO does what (Architect, Builder, Consultant) |
46
46
  | Parallelism | Scale by running multiple builders simultaneously |
47
47
 
@@ -60,7 +60,7 @@ A **protocol** is a structured workflow that defines how work progresses from id
60
60
 
61
61
  | Protocol | Use For | Phases |
62
62
  |----------|---------|--------|
63
- | **SPIDER** | New features | Specify → Plan → Implement → Defend → Evaluate → Review |
63
+ | **SPIR** | New features | Specify → Plan → Implement → Review |
64
64
  | **TICK** | Amendments to existing specs | Task Identification → Coding → Kickout |
65
65
  | **MAINTAIN** | Codebase hygiene | Dead code removal, documentation sync |
66
66
  | **EXPERIMENT** | Research & prototyping | Hypothesis → Experiment → Conclude |
@@ -145,7 +145,7 @@ Multi-agent consultation. Used by both humans and agents—**mostly agents** dur
145
145
 
146
146
  ## Quick Reference
147
147
 
148
- ### SPIDER Checklist
148
+ ### SPIR Checklist
149
149
 
150
150
  ```
151
151
  [ ] Specify - Write spec in codev/specs/XXXX-name.md
@@ -142,6 +142,6 @@ To see high-priority work, search for `priority: high`.
142
142
  Before starting a project, verify its dependencies are at least `implemented`.
143
143
 
144
144
  ### Protocol Selection
145
- - **SPIDER**: Most projects (formal spec → plan → implement → review)
145
+ - **SPIR**: Most projects (formal spec → plan → implement → review)
146
146
  - **TICK**: Small, well-defined tasks (< 300 lines) or amendments to existing specs
147
147
  - **EXPERIMENT**: Research/prototyping before committing to a project
@@ -99,7 +99,7 @@ function renderInfoHeader() {
99
99
  <div class="projects-info">
100
100
  <h1 style="font-size: 20px; margin-bottom: 12px; color: var(--text-primary);">Agent Farm Dashboard</h1>
101
101
  <p>Coordinate AI builders working on your codebase. The left panel shows the Architect terminal – tell it what you want to build. <strong>Tabs</strong> shows open terminals (Architect, Builders, utility shells). <strong>Files</strong> lets you browse and open project files. <strong>Projects</strong> tracks work as it moves from conception to integration.</p>
102
- <p>Docs: <a href="#" onclick="openProjectFile('codev/resources/cheatsheet.md'); return false;">Cheatsheet</a> · <a href="#" onclick="openProjectFile('codev/resources/lifecycle.md'); return false;">Lifecycle</a> · <a href="#" onclick="openProjectFile('codev/resources/commands/overview.md'); return false;">CLI Reference</a> · <a href="#" onclick="openProjectFile('codev/protocols/spider/protocol.md'); return false;">SPIDER Protocol</a> · <a href="https://github.com/cluesmith/codev#readme" target="_blank">README</a> · <a href="https://discord.gg/mJ92DhDa6n" target="_blank">Discord</a></p>
102
+ <p>Docs: <a href="#" onclick="openProjectFile('codev/resources/cheatsheet.md'); return false;">Cheatsheet</a> · <a href="#" onclick="openProjectFile('codev/resources/lifecycle.md'); return false;">Lifecycle</a> · <a href="#" onclick="openProjectFile('codev/resources/commands/overview.md'); return false;">CLI Reference</a> · <a href="#" onclick="openProjectFile('codev/protocols/spir/protocol.md'); return false;">SPIR Protocol</a> · <a href="https://github.com/cluesmith/codev#readme" target="_blank">README</a> · <a href="https://discord.gg/mJ92DhDa6n" target="_blank">Discord</a></p>
103
103
  </div>
104
104
  `;
105
105
  }
@@ -502,6 +502,12 @@
502
502
  </div>
503
503
  </div>
504
504
 
505
+ <!-- PDF viewer mode -->
506
+ <div id="pdf-viewer" style="display: none; height: calc(100vh - 80px);">
507
+ <embed id="pdf-display" type="application/pdf" style="width: 100%; height: 100%; border: none;">
508
+ <div id="pdf-error" style="display: none; color: #ef4444; text-align: center; padding: 40px;"></div>
509
+ </div>
510
+
505
511
  <!-- Editor mode with line numbers -->
506
512
  <div id="editor-container">
507
513
  <div id="editor-line-numbers"></div>
@@ -691,6 +697,26 @@
691
697
  video.src = 'api/video?t=' + Date.now();
692
698
  }
693
699
 
700
+ // Initialize PDF viewer
701
+ function initPdf(fileSize) {
702
+ // Hide code view elements
703
+ document.getElementById('viewMode').style.display = 'none';
704
+ document.getElementById('editBtn').style.display = 'none';
705
+ document.getElementById('togglePreviewBtn').style.display = 'none';
706
+
707
+ // Update subtitle
708
+ const sizeStr = formatFileSize(fileSize);
709
+ document.querySelector('.subtitle').textContent = 'PDF viewer · ' + sizeStr;
710
+
711
+ // Show PDF viewer
712
+ const pdfViewer = document.getElementById('pdf-viewer');
713
+ pdfViewer.style.display = 'block';
714
+
715
+ // Load PDF via raw endpoint
716
+ const embed = document.getElementById('pdf-display');
717
+ embed.src = 'api/pdf?t=' + Date.now();
718
+ }
719
+
694
720
  // Update image info display (in both header and controls)
695
721
  function updateImageInfo(fileSize) {
696
722
  const sizeStr = formatFileSize(fileSize);
@@ -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)}.header-meta{font-size:12px;color:var(--text-secondary)}.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-iframe{display:block}.dashboard-container{flex:1;overflow-y:auto;display:flex;flex-direction:column;height:100%}.projects-info{padding:16px;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);font-size:13px;line-height:1.5;color:var(--text-secondary);flex-shrink:0}.projects-info h1{color:var(--text-primary)}.projects-info a{color:var(--accent);text-decoration:none}.projects-info a:hover{text-decoration:underline}.dashboard-header{display:flex;gap:16px;padding:16px;flex:1;min-height:0}@media(max-width:900px){.dashboard-header{flex-direction:column}}.dashboard-section{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;overflow:hidden;display:flex;flex-direction:column}.dashboard-section.section-tabs,.dashboard-section.section-files{flex:1}.dashboard-section.section-projects{flex:0 0 auto;margin:0 16px 16px;max-height:50%;overflow-y:auto}.dashboard-section-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;flex-shrink:0;border-bottom:1px solid var(--border-color)}.dashboard-section-header:hover{background:var(--bg-tertiary)}.dashboard-section-header h3{font-size:12px;text-transform:uppercase;color:var(--text-muted);letter-spacing:.5px;margin:0;display:flex;align-items:center;gap:6px;font-weight:600}.collapse-icon{font-size:10px;transition:transform .2s}.dashboard-section.collapsed .collapse-icon{transform:rotate(-90deg)}.dashboard-section.collapsed .dashboard-section-header{border-bottom:none}.header-actions{display:flex;gap:4px}.header-actions button{padding:4px 8px;border-radius:4px;border:1px solid var(--border-color);background:var(--bg-tertiary);color:var(--text-secondary);cursor:pointer;font-size:11px;font-family:inherit}.header-actions button:hover{background:var(--bg-hover);color:var(--text-primary)}.dashboard-section-content{flex:1;overflow-y:auto;padding:8px 12px}.dashboard-tabs-list{flex:1;overflow-y:auto}.dashboard-tab-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;cursor:pointer;font-size:13px;color:var(--text-secondary)}.dashboard-tab-item:hover{background:var(--bg-tertiary)}.dashboard-tab-item .tab-icon{font-size:14px;flex-shrink:0}.dashboard-tab-item .tab-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-section-content .file-tree{height:auto;max-height:none}.project-table{width:100%;border-collapse:collapse;font-size:12px}.project-table th{text-align:center;padding:6px 8px;font-size:10px;text-transform:uppercase;color:var(--text-muted);letter-spacing:.5px;border-bottom:1px solid var(--border-color);font-weight:600}.project-table th:nth-child(1),.project-table th:nth-child(2){text-align:left}.project-table td{padding:6px 8px;border-bottom:1px solid var(--border-color)}.project-id{color:var(--text-muted);font-family:monospace;font-size:11px}.project-name{color:var(--text-primary)}.project-stage{text-align:center}.project-cell{display:flex;align-items:center;gap:8px}.project-id{color:var(--text-muted);font-family:monospace;font-size:11px;flex-shrink:0}.project-title{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-terminal-status{color:var(--text-muted);font-size:11px;font-style:italic}.checkmark{color:var(--status-active);font-weight:700;font-size:12px}.current-indicator{display:inline-block;width:10px;height:10px;border-radius:50%;border:2px solid var(--status-implementing);background:transparent}.celebration{font-size:14px}.project-stage a{color:var(--accent);text-decoration:none;font-size:10px}.project-stage a:hover{text-decoration:underline}.project-section{margin-bottom:8px}.project-section summary{cursor:pointer;font-size:12px;font-weight:600;color:var(--text-secondary);padding:6px 0;-webkit-user-select:none;user-select:none}.section-count{color:var(--text-muted);font-weight:400}.projects-welcome{padding:16px;color:var(--text-muted);font-size:13px}.projects-error{padding:12px;color:var(--status-error);display:flex;align-items:center;gap:8px}.projects-error button{padding:4px 8px;border-radius:4px;border:1px solid var(--border-color);background:var(--bg-tertiary);color:var(--text-secondary);cursor:pointer;font-size:11px}.builder-card{padding:8px 12px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;margin-bottom:8px}.builder-header{display:flex;align-items:center;gap:8px}.status-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;display:inline-block;margin-left:6px;background:var(--text-muted)}.status-active,.status-running{background:var(--status-active)}.status-waiting,.status-idle{background:var(--status-waiting)}.status-error,.status-failed{background:var(--status-error)}.status-implementing{background:var(--status-implementing)}.builder-name{font-size:13px;font-weight:500}.builder-meta{margin-top:4px;display:flex;gap:8px;font-size:11px;color:var(--text-secondary)}.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}.status-bar{display:flex;gap:16px;padding:4px 16px;background:var(--bg-secondary);border-top:1px solid var(--border-color);font-size:11px;color:var(--text-secondary);flex-shrink:0;height:24px;align-items:center}.no-architect{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-muted);font-size:14px}.mobile-layout{display:flex;flex-direction:column;height:100vh}.mobile-content{flex:1;overflow:hidden}@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}