codymaster 4.3.0 → 4.4.2

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.
@@ -0,0 +1,440 @@
1
+ /* CodyMaster Mission Control v4 — Light/Dark Theme */
2
+ *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
3
+
4
+ /* ── Light Mode (default) ─────────── */
5
+ :root, [data-theme="light"] {
6
+ color-scheme: light;
7
+ --bg-body:#f6f8fa;--bg-sidebar:#ffffff;--bg-card:#ffffff;--bg-card-hover:#f3f4f6;
8
+ --bg-column:#f0f2f5;--bg-input:#ffffff;--bg-modal:#ffffff;
9
+ --text-primary:#1f2328;--text-secondary:#656d76;--text-muted:#8b949e;
10
+ --border:#d0d7de;--border-light:#e8ebef;
11
+ --accent:#0969da;--accent-hover:#0550ae;
12
+ --col-backlog:#8b949e;--col-in-progress:#0969da;--col-review:#bf8700;--col-done:#1a7f37;
13
+ --danger:#cf222e;--danger-hover:#a40e26;
14
+ --radius:8px;--radius-sm:6px;
15
+ --shadow:0 1px 3px rgba(31,35,40,.12),0 1px 2px rgba(31,35,40,.06);
16
+ --font:'Inter',system-ui,-apple-system,sans-serif;
17
+ --deploy-success:#1a7f37;--deploy-failed:#cf222e;--deploy-pending:#bf8700;
18
+ --deploy-running:#0969da;--deploy-rollback:#8250df;
19
+ --btn-icon-hover-bg:rgba(31,35,40,.06);
20
+ --card-agent-bg:rgba(31,35,40,.04);
21
+ --modal-backdrop:rgba(31,35,40,.5);
22
+ }
23
+
24
+ /* ── Dark Mode (Mockup theme) ──────── */
25
+ [data-theme="dark"]{
26
+ color-scheme: dark;
27
+ --bg-body:#000000;--bg-sidebar:#09090b;--bg-card:#18181b;--bg-card-hover:#27272a;
28
+ --bg-column:#141417;--bg-input:#09090b;--bg-modal:#18181b;
29
+ --text-primary:#f4f4f5;--text-secondary:#a1a1aa;--text-muted:#71717a;
30
+ --border:#27272a;--border-light:#27272a;
31
+ --accent:#3b82f6;--accent-hover:#60a5fa;
32
+ --col-backlog:#71717a;--col-in-progress:#3b82f6;--col-review:#eab308;--col-done:#22c55e;
33
+ --danger:#ef4444;--danger-hover:#f87171;
34
+ --shadow:0 10px 30px rgba(0,0,0,.5);
35
+ --deploy-success:#22c55e;--deploy-failed:#ef4444;--deploy-pending:#eab308;
36
+ --deploy-running:#3b82f6;--deploy-rollback:#8b5cf6;
37
+ --btn-icon-hover-bg:rgba(255,255,255,.06);
38
+ --card-agent-bg:rgba(255,255,255,.04);
39
+ --modal-backdrop:rgba(0,0,0,.6);
40
+ }
41
+
42
+ html,body{height:100%;font-family:var(--font);background:var(--bg-body);color:var(--text-primary);transition:background-color .2s ease,color .2s ease}
43
+ body{display:flex;overflow:hidden}
44
+
45
+ /* ── Sidebar ──────────────────────── */
46
+ .sidebar{width:240px;min-width:240px;background:var(--bg-sidebar);border-right:1px solid var(--border);display:flex;flex-direction:column;transition:width .2s,min-width .2s;overflow:hidden}
47
+ .sidebar.collapsed{width:0!important;min-width:0!important;border:none!important;visibility:hidden;pointer-events:none}
48
+ .sidebar-header{display:flex;align-items:center;gap:8px;padding:16px 16px 12px;position:relative}
49
+ .sidebar-title{font-size:16px;font-weight:700;white-space:nowrap;display:flex;align-items:center;gap:6px}
50
+ .sidebar-subtitle{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;color:var(--accent);opacity:.8;padding-top:2px}
51
+ .sidebar-close{display:none;background:none;border:none;color:var(--text-muted);font-size:24px;line-height:1;padding:0 4px;margin-left:auto;cursor:pointer}
52
+ .sidebar-close:hover{color:var(--text-primary)}
53
+ .logo{font-size:22px}
54
+ .sidebar-section{padding:0 12px 16px}
55
+ .sidebar-section-header{display:flex;align-items:center;justify-content:space-between;padding:0 4px 8px}
56
+ .sidebar-section-title{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.8px;color:var(--text-secondary)}
57
+ .sidebar-action-btn{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:4px;border-radius:4px}
58
+ .sidebar-action-btn:hover{color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent)}
59
+ .project-list{display:flex;flex-direction:column;gap:2px}
60
+ .project-item{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:var(--radius-sm);cursor:pointer;transition:background .15s;position:relative;white-space:nowrap}
61
+ .project-item:hover{background:var(--bg-card)}
62
+ .project-item.active{background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent)}
63
+ .project-icon{font-size:14px}
64
+ .project-name{flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis}
65
+ .project-task-count{font-size:11px;background:var(--bg-card);padding:1px 6px;border-radius:10px;color:var(--text-secondary);min-width:20px;text-align:center}
66
+ .project-delete-btn{display:none;background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:12px;padding:2px 4px}
67
+ .project-item:hover .project-delete-btn{display:block}
68
+ .project-item:hover .project-task-count{display:none}
69
+ .agent-list{display:flex;flex-direction:column;gap:6px;padding-top:8px}
70
+ .agent-badge{display:flex;align-items:center;gap:8px;font-size:13px;padding:4px 10px}
71
+ .agent-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
72
+ .agent-task-count{margin-left:auto;font-size:11px;color:var(--text-secondary)}
73
+ .agent-empty{font-size:12px;color:var(--text-muted);padding:8px 10px;font-style:italic}
74
+ .sidebar-footer{margin-top:auto;padding:12px 16px;border-top:1px solid var(--border)}
75
+ .sidebar-version{font-size:11px;color:var(--text-muted)}
76
+
77
+ /* ── Main Wrapper ─────────────────── */
78
+ .main-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden}
79
+
80
+ /* ── Header ───────────────────────── */
81
+ .header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;border-bottom:1px solid var(--border);background:var(--bg-sidebar);gap:12px;flex-shrink:0}
82
+ .header-left{display:flex;align-items:center;gap:8px}
83
+ .header-project-name{font-size:16px;font-weight:600}
84
+ .header-right{display:flex;align-items:center;gap:10px}
85
+ .task-stats{display:flex;gap:12px;font-size:12px;color:var(--text-secondary)}
86
+ .stat{display:flex;align-items:center;gap:4px}
87
+ .stat-dot{width:6px;height:6px;border-radius:50%}
88
+
89
+ /* ── Header Actions & Mobile Menu ─── */
90
+ .hide-xs, .hide-sm { display: flex; align-items: center; }
91
+ .header-actions-dropdown { position: relative; }
92
+ button.btn-more-menu { display: none; }
93
+ .header-actions { display: flex; align-items: center; gap: 8px; }
94
+
95
+ /* Horizontal Tab rules removed since views are now in the sidebar */
96
+ /* ── Agent Dispatch Modal ──────────────────────────── */
97
+ .modal-lg { max-width: 800px; width: 95%; }
98
+ .dispatch-content { display: flex; flex-direction: column; gap: 20px; padding: 10px 0; }
99
+ .dispatch-intro { color: var(--text-muted); font-size: 14px; margin-bottom: 5px; }
100
+ .dispatch-section { display: flex; flex-direction: column; gap: 8px; }
101
+ .dispatch-section-header { display: flex; justify-content: space-between; align-items: center; }
102
+ .dispatch-section-header label { font-size: 11px; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; }
103
+ .dispatch-code-block {
104
+ background: rgba(0,0,0,0.2) !important;
105
+ border: 1px solid var(--border);
106
+ border-radius: var(--radius);
107
+ padding: 16px;
108
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
109
+ font-size: 13px;
110
+ line-height: 1.5;
111
+ max-height: 300px;
112
+ overflow-y: auto;
113
+ white-space: pre-wrap;
114
+ word-break: break-all;
115
+ color: var(--text-main);
116
+ }
117
+ .dispatch-cli-block {
118
+ background: var(--bg-input);
119
+ color: var(--col-in-progress);
120
+ padding: 12px 16px;
121
+ border-radius: var(--radius);
122
+ font-family: 'JetBrains Mono', monospace;
123
+ font-size: 13px;
124
+ display: block;
125
+ border-left: 4px solid var(--accent);
126
+ overflow-x: auto;
127
+ }
128
+
129
+ /* ── Tab Panels ───────────────────── */
130
+ .tab-panel{display:none;flex:1;overflow-y:auto}
131
+ .tab-panel.active{display:flex;flex-direction:column}
132
+
133
+ /* ── Kanban Board ─────────────────── */
134
+ .board{display:flex;gap:16px;padding:20px;flex:1;overflow-x:auto;overflow-y:hidden;align-content:start}
135
+ .column{background:var(--bg-column);border-radius:var(--radius);border:1px solid var(--border);display:flex;flex-direction:column;max-height:calc(100vh - 160px);min-width:300px;width:300px;flex-shrink:0;}
136
+ .column.drag-over{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
137
+ .column.drag-blocked{border-color:var(--danger);box-shadow:0 0 0 1px var(--danger);opacity:.6}
138
+ .column-header{display:flex;align-items:center;gap:8px;padding:14px 16px 10px;flex-shrink:0}
139
+ .column-indicator{width:8px;height:8px;border-radius:50%}
140
+ .column-indicator.backlog{background:var(--col-backlog)}
141
+ .column-indicator.in-progress{background:var(--col-in-progress)}
142
+ .column-indicator.review{background:var(--col-review)}
143
+ .column-indicator.done{background:var(--col-done)}
144
+ .column-title{font-size:13px;font-weight:600}
145
+ .column-count{margin-left:auto;font-size:11px;background:var(--bg-card);border-radius:10px;padding:1px 7px;color:var(--text-secondary)}
146
+ .card-list{flex:1;overflow-y:auto;padding:6px 10px 10px;display:flex;flex-direction:column;gap:8px;min-height:60px}
147
+
148
+ /* ── Task Card ────────────────────── */
149
+ .task-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:12px;cursor:grab;transition:all .15s}
150
+ .task-card:hover{background:var(--bg-card-hover);border-color:var(--text-muted)}
151
+ .task-card.dragging{opacity:.4;cursor:grabbing}
152
+ .card-top{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
153
+ .card-title{font-size:13px;font-weight:600;line-height:1.4;flex:1}
154
+ .card-actions{display:none;gap:4px;flex-shrink:0}
155
+ .task-card:hover .card-actions{display:flex}
156
+ .card-action-btn{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:3px;border-radius:4px}
157
+ .card-action-btn:hover{color:var(--text-primary);background:var(--btn-icon-hover-bg)}
158
+ .card-description{font-size:12px;color:var(--text-secondary);margin-top:6px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
159
+ .card-meta{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
160
+ .card-agent-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-secondary);background:var(--card-agent-bg);padding:2px 8px;border-radius:10px}
161
+ .card-agent-dot{width:6px;height:6px;border-radius:50%}
162
+ .card-skill-badge{font-size:10px;color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent);padding:2px 8px;border-radius:10px}
163
+ .card-footer{display:flex;justify-content:space-between;align-items:center;margin-top:8px}
164
+ .card-time{font-size:11px;color:var(--text-muted)}
165
+ .priority-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;padding:2px 8px;border-radius:4px}
166
+ .priority-low{background:rgba(63,185,80,.15);color:#3fb950}
167
+ .priority-medium{background:rgba(210,153,34,.15);color:#d29922}
168
+ .priority-high{background:rgba(248,81,73,.15);color:#f85149}
169
+ .priority-urgent{background:rgba(188,140,255,.2);color:#bc8cff}
170
+ .drop-placeholder{height:40px;border:2px dashed var(--accent);border-radius:var(--radius);background:rgba(88,166,255,.06);margin:4px 0}
171
+ .empty-state{display:flex;flex-direction:column;align-items:center;padding:24px 16px;color:var(--text-muted);font-style:italic;gap:6px}
172
+ .empty-state-icon{font-size:24px;opacity:.5}
173
+ .empty-state-text{font-size:12px}
174
+
175
+ /* ── Dispatch Badge & Button ─────── */
176
+ .dispatch-badge{font-size:10px;font-weight:600;padding:2px 8px;border-radius:10px;display:inline-flex;align-items:center;gap:3px}
177
+ .dispatch-badge.dispatched{background:rgba(63,185,80,.15);color:#3fb950}
178
+ .dispatch-badge.failed{background:rgba(248,81,73,.15);color:#f85149;cursor:help}
179
+ .card-action-btn.dispatch{color:var(--col-done)}
180
+ .card-action-btn.dispatch:hover{color:#3fb950;background:rgba(63,185,80,.12)}
181
+
182
+ /* ── History Timeline ─────────────── */
183
+ .timeline-container{padding:20px;max-width:800px;width:100%}
184
+ .timeline-header,.deploys-header,.changelog-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
185
+ .timeline-header h3,.deploys-header h3,.changelog-header h3{font-size:16px;font-weight:600}
186
+ .timeline-count{font-size:12px;color:var(--text-secondary)}
187
+ .timeline{display:flex;flex-direction:column;gap:0}
188
+ .timeline-item{display:flex;gap:12px;padding:12px 0;border-left:2px solid var(--border);margin-left:12px;padding-left:16px;position:relative}
189
+ .timeline-item::before{content:'';position:absolute;left:-5px;top:16px;width:8px;height:8px;border-radius:50%;background:var(--border)}
190
+ .timeline-item.type-task_created::before{background:var(--col-done)}
191
+ .timeline-item.type-task_moved::before{background:var(--col-in-progress)}
192
+ .timeline-item.type-task_done::before{background:var(--col-done)}
193
+ .timeline-item.type-task_deleted::before{background:var(--danger)}
194
+ .timeline-item.type-deploy_staging::before{background:var(--deploy-pending)}
195
+ .timeline-item.type-deploy_production::before{background:var(--deploy-success)}
196
+ .timeline-item.type-rollback::before{background:var(--deploy-rollback)}
197
+ .timeline-item.type-project_created::before{background:var(--accent)}
198
+ .timeline-item.type-task_dispatched::before{background:var(--col-done)}
199
+ .timeline-item.type-changelog_added::before{background:var(--col-review)}
200
+ .timeline-icon{font-size:16px;flex-shrink:0;width:24px;text-align:center}
201
+ .timeline-content{flex:1}
202
+ .timeline-message{font-size:13px;line-height:1.5}
203
+ .timeline-meta{font-size:11px;color:var(--text-muted);margin-top:4px;display:flex;gap:10px;align-items:center}
204
+ .timeline-agent{display:inline-flex;align-items:center;gap:4px}
205
+ .timeline-agent-dot{width:6px;height:6px;border-radius:50%;display:inline-block}
206
+ .timeline-empty{text-align:center;padding:40px;color:var(--text-muted);font-size:13px}
207
+
208
+ /* ── Deploy Cards ─────────────────── */
209
+ .deploys-container{padding:20px;max-width:900px;width:100%}
210
+ .deploy-list{display:flex;flex-direction:column;gap:10px}
211
+ .deploy-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px;display:flex;align-items:center;gap:16px;transition:border-color .15s}
212
+ .deploy-card:hover{border-color:var(--text-muted)}
213
+ .deploy-status-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
214
+ .deploy-status-dot.success{background:var(--deploy-success)}
215
+ .deploy-status-dot.failed{background:var(--deploy-failed)}
216
+ .deploy-status-dot.pending{background:var(--deploy-pending)}
217
+ .deploy-status-dot.running{background:var(--deploy-running)}
218
+ .deploy-status-dot.rolled_back{background:var(--deploy-rollback)}
219
+ .deploy-info{flex:1;min-width:0}
220
+ .deploy-message{font-size:13px;font-weight:600}
221
+ .deploy-detail{font-size:12px;color:var(--text-secondary);margin-top:4px;display:flex;gap:12px;flex-wrap:wrap}
222
+ .deploy-env-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;padding:2px 8px;border-radius:4px}
223
+ .deploy-env-badge.staging{background:rgba(210,153,34,.15);color:#d29922}
224
+ .deploy-env-badge.production{background:rgba(63,185,80,.15);color:#3fb950}
225
+ .deploy-status-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;padding:2px 8px;border-radius:4px}
226
+ .deploy-status-badge.success{background:rgba(63,185,80,.15);color:#3fb950}
227
+ .deploy-status-badge.failed{background:rgba(248,81,73,.15);color:#f85149}
228
+ .deploy-status-badge.pending{background:rgba(210,153,34,.15);color:#d29922}
229
+ .deploy-status-badge.running{background:rgba(88,166,255,.15);color:#58a6ff}
230
+ .deploy-status-badge.rolled_back{background:rgba(188,140,255,.15);color:#bc8cff}
231
+ .deploy-actions{display:flex;gap:6px;flex-shrink:0}
232
+ .deploy-empty{text-align:center;padding:40px;color:var(--text-muted);font-size:13px}
233
+ .deploy-card.is-rollback{border-left:3px solid var(--deploy-rollback)}
234
+
235
+ /* ── Changelog ────────────────────── */
236
+ .changelog-container{padding:20px;max-width:800px;width:100%}
237
+ .changelog-list{display:flex;flex-direction:column;gap:16px}
238
+ .changelog-entry{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px}
239
+ .changelog-version{display:flex;align-items:center;gap:10px;margin-bottom:8px}
240
+ .changelog-version-badge{font-size:12px;font-weight:700;color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent);padding:3px 10px;border-radius:var(--radius-sm)}
241
+ .changelog-title{font-size:14px;font-weight:600}
242
+ .changelog-date{font-size:11px;color:var(--text-muted);margin-left:auto}
243
+ .changelog-changes{list-style:none;padding:0;margin:0}
244
+ .changelog-changes li{font-size:13px;color:var(--text-secondary);padding:4px 0 4px 16px;position:relative;line-height:1.5}
245
+ .changelog-changes li::before{content:'•';position:absolute;left:0;color:var(--accent)}
246
+ .changelog-empty{text-align:center;padding:40px;color:var(--text-muted);font-size:13px}
247
+
248
+ /* ── Buttons ──────────────────────── */
249
+ .btn{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border:none;border-radius:var(--radius-sm);font-family:var(--font);font-size:13px;font-weight:500;cursor:pointer;transition:all .15s}
250
+ .btn-primary{background:var(--accent);color:#fff}
251
+ .btn-primary:hover{background:var(--accent-hover)}
252
+ .btn-ghost{background:transparent;color:var(--text-secondary);border:1px solid var(--border)}
253
+ .btn-ghost:hover{color:var(--text-primary);border-color:var(--text-muted)}
254
+ .btn-danger{background:var(--danger);color:#fff}
255
+ .btn-danger:hover{background:var(--danger-hover)}
256
+ .btn-sm{padding:6px 12px;font-size:12px}
257
+ .btn-icon{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:6px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center}
258
+ .btn-icon:hover{color:var(--text-primary);background:var(--btn-icon-hover-bg)}
259
+ .btn-rollback{padding:4px 10px;font-size:11px;border-radius:4px;font-family:var(--font);cursor:pointer;background:rgba(188,140,255,.1);color:#bc8cff;border:1px solid rgba(188,140,255,.3);font-weight:500}
260
+ .btn-rollback:hover{background:rgba(188,140,255,.2)}
261
+
262
+ /* ── Refresh spin ─────────────────── */
263
+ @keyframes spin{to{transform:rotate(360deg)}}
264
+ .refreshing svg{animation:spin .6s linear}
265
+
266
+ /* ── Sync Status Indicator ────────── */
267
+ .sync-status{display:flex;align-items:center;gap:6px;padding:4px 10px;border-radius:20px;background:color-mix(in srgb,var(--col-done) 8%,transparent);border:1px solid color-mix(in srgb,var(--col-done) 15%,transparent);transition:all .3s ease}
268
+ .sync-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .3s ease}
269
+ .sync-dot.synced{background:var(--col-done);box-shadow:0 0 4px color-mix(in srgb,var(--col-done) 40%,transparent)}
270
+ .sync-dot.syncing{background:var(--col-in-progress);animation:syncPulse 1s ease-in-out infinite}
271
+ .sync-dot.error{background:var(--danger);box-shadow:0 0 4px color-mix(in srgb,var(--danger) 40%,transparent)}
272
+ .sync-label{font-size:11px;font-weight:500;color:var(--text-secondary);white-space:nowrap}
273
+ @keyframes syncPulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.8)}}
274
+
275
+ /* ── Auto-Refresh Toggle ──────────── */
276
+ .auto-refresh-toggle{position:relative;transition:all .2s ease}
277
+ .auto-refresh-toggle.active{color:var(--col-done)!important;background:color-mix(in srgb,var(--col-done) 12%,transparent)}
278
+ .auto-refresh-toggle.active:hover{background:color-mix(in srgb,var(--col-done) 20%,transparent)}
279
+ .auto-refresh-toggle:not(.active){opacity:.5}
280
+
281
+ /* ── Modal ────────────────────────── */
282
+ .modal-overlay{display:none;position:fixed;inset:0;background:var(--modal-backdrop);backdrop-filter:blur(4px);z-index:100;align-items:center;justify-content:center}
283
+ .modal-overlay.active{display:flex}
284
+ .modal{background:var(--bg-modal);border:1px solid var(--border);border-radius:12px;width:480px;max-width:90vw;padding:24px;box-shadow:var(--shadow)}
285
+ .modal-sm{width:400px}
286
+ .modal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}
287
+ .modal-title{font-size:16px;font-weight:600}
288
+ .modal-close{background:none;border:none;color:var(--text-muted);font-size:22px;cursor:pointer;padding:4px 8px}
289
+ .modal-close:hover{color:var(--text-primary)}
290
+ .form-group{margin-bottom:14px}
291
+ .form-group label{display:block;font-size:12px;font-weight:500;color:var(--text-secondary);margin-bottom:6px}
292
+ .form-group input,.form-group textarea,.form-group select{width:100%;padding:9px 12px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font);font-size:13px;outline:none;transition:border .15s}
293
+ .form-group input:focus,.form-group textarea:focus,.form-group select:focus{border-color:var(--accent)}
294
+ .form-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
295
+ .form-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px}
296
+ .delete-message{font-size:14px;color:var(--text-secondary);padding:8px 0 4px}
297
+
298
+ /* ── Toast ────────────────────────── */
299
+ .toast-container{position:fixed;bottom:20px;right:20px;z-index:200;display:flex;flex-direction:column-reverse;gap:8px}
300
+ .toast{display:flex;align-items:center;gap:8px;padding:10px 16px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);font-size:13px;box-shadow:var(--shadow);animation:toastIn .3s}
301
+ @keyframes toastIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
302
+ .toast-out{animation:toastOut .3s forwards}
303
+ @keyframes toastOut{to{opacity:0;transform:translateY(10px)}}
304
+ .toast-icon{font-size:14px}
305
+ .toast-success{border-color:var(--col-done)}
306
+ .toast-error{border-color:var(--danger)}
307
+ .toast-info{border-color:var(--accent)}
308
+
309
+ /* ── Responsive ───────────────────── */
310
+ @media(max-width:900px){
311
+ .board{scroll-snap-type:x mandatory;padding-bottom:24px}
312
+ .column{min-width:85vw;width:85vw;max-width:320px;scroll-snap-align:center}
313
+ .sidebar{width:0;min-width:0;position:fixed;height:100%;z-index:50}
314
+ .sidebar:not(.collapsed){width:240px;min-width:240px;box-shadow:var(--shadow)}
315
+ .sidebar-close{display:block}
316
+ .btn-more-menu { display: flex; }
317
+ .header-actions {
318
+ display: none; position: absolute; top: 100%; right: 0; margin-top: 8px;
319
+ background: var(--bg-card); border: 1px solid var(--border);
320
+ border-radius: var(--radius); padding: 8px; flex-direction: column;
321
+ box-shadow: var(--shadow); z-index: 100; align-items: stretch;
322
+ }
323
+ .header-actions.active { display: flex; }
324
+ }
325
+
326
+ @media(max-width:600px){
327
+ .hide-xs { display: none !important; }
328
+ }
329
+ @media(max-width:400px){
330
+ .hide-sm { display: none !important; }
331
+ }
332
+
333
+ /* ── Theme Toggle ─────────────────── */
334
+ .theme-toggle{position:relative;background:none;border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;padding:5px 8px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;gap:4px;font-size:12px;font-family:var(--font);font-weight:500;transition:all .15s}
335
+ .theme-toggle:hover{color:var(--text-primary);border-color:var(--text-muted);background:var(--btn-icon-hover-bg)}
336
+ .theme-toggle svg{transition:transform .3s ease}
337
+ .theme-toggle:active svg{transform:rotate(30deg)}
338
+
339
+ /* Theme transitions for containers */
340
+ .sidebar,.header,.tab-nav,.column,.task-card,.modal,.toast,.deploy-card,.changelog-entry,.timeline-item{transition:background-color .2s ease,border-color .2s ease,color .2s ease}
341
+
342
+ /* ── Quick Transition Buttons ───── */
343
+ .card-transitions{display:none;gap:4px;margin-top:8px;flex-wrap:wrap}
344
+ .task-card:hover .card-transitions{display:flex}
345
+ .transition-btn{font-size:10px;font-weight:600;padding:3px 8px;border-radius:4px;border:none;cursor:pointer;font-family:var(--font);transition:all .15s;display:inline-flex;align-items:center;gap:3px;white-space:nowrap}
346
+ .transition-btn.transition-forward{background:color-mix(in srgb,var(--col-in-progress) 12%,transparent);color:var(--col-in-progress);border:1px solid color-mix(in srgb,var(--col-in-progress) 25%,transparent)}
347
+ .transition-btn.transition-forward:hover{background:color-mix(in srgb,var(--col-in-progress) 22%,transparent)}
348
+ .transition-btn.transition-done{background:color-mix(in srgb,var(--col-done) 12%,transparent);color:var(--col-done);border:1px solid color-mix(in srgb,var(--col-done) 25%,transparent)}
349
+ .transition-btn.transition-done:hover{background:color-mix(in srgb,var(--col-done) 22%,transparent)}
350
+ .transition-btn.transition-back{background:color-mix(in srgb,var(--col-backlog) 12%,transparent);color:var(--text-secondary);border:1px solid color-mix(in srgb,var(--col-backlog) 25%,transparent)}
351
+ .transition-btn.transition-back:hover{background:color-mix(in srgb,var(--col-backlog) 22%,transparent)}
352
+
353
+ /* ── Stuck Task Indicator ────────── */
354
+ @keyframes stuckPulse{0%,100%{border-color:rgba(210,153,34,.4)}50%{border-color:rgba(210,153,34,.8)}}
355
+ .task-card.stuck{border-color:rgba(210,153,34,.5);animation:stuckPulse 2s ease-in-out infinite;background:color-mix(in srgb,var(--col-review) 5%,var(--bg-card))}
356
+
357
+ /* ── Stuck Banner ────────────────── */
358
+ #stuck-banner{margin:12px 20px 0;padding:12px 16px;background:color-mix(in srgb,var(--col-review) 10%,var(--bg-card));border:1px solid color-mix(in srgb,var(--col-review) 30%,var(--border));border-radius:var(--radius);border-left:4px solid var(--col-review)}
359
+ .stuck-banner-content{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
360
+ .stuck-banner-icon{font-size:16px;flex-shrink:0}
361
+ .stuck-banner-text{font-size:12px;color:var(--text-secondary);flex:1;min-width:200px}
362
+ .stuck-banner-text strong{color:var(--col-review)}
363
+ .stuck-banner-actions{display:flex;gap:6px}
364
+ .stuck-btn{font-size:11px;font-weight:600;padding:4px 10px;border-radius:4px;border:none;cursor:pointer;font-family:var(--font);transition:all .15s}
365
+ .stuck-btn.review{background:color-mix(in srgb,var(--col-review) 15%,transparent);color:var(--col-review);border:1px solid color-mix(in srgb,var(--col-review) 30%,transparent)}
366
+ .stuck-btn.review:hover{background:color-mix(in srgb,var(--col-review) 25%,transparent)}
367
+ .stuck-btn.done{background:color-mix(in srgb,var(--col-done) 15%,transparent);color:var(--col-done);border:1px solid color-mix(in srgb,var(--col-done) 30%,transparent)}
368
+ .stuck-btn.done:hover{background:color-mix(in srgb,var(--col-done) 25%,transparent)}
369
+ .stuck-btn.backlog{background:color-mix(in srgb,var(--col-backlog) 15%,transparent);color:var(--text-secondary);border:1px solid color-mix(in srgb,var(--col-backlog) 30%,transparent)}
370
+ .stuck-btn.backlog:hover{background:color-mix(in srgb,var(--col-backlog) 25%,transparent)}
371
+
372
+ /* ── Timeline extension ──────────── */
373
+ .timeline-item.type-task_transitioned::before{background:var(--col-review)}
374
+
375
+ /* ── Brain Tab ───────────────────── */
376
+ .brain-container{padding:20px;max-width:960px;width:100%;display:flex;flex-direction:column;gap:20px}
377
+ .brain-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
378
+ .brain-stat-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px;display:flex;flex-direction:column;gap:6px;position:relative;overflow:hidden;transition:border-color .15s,transform .15s}
379
+ .brain-stat-card:hover{border-color:var(--accent);transform:translateY(-1px)}
380
+ .brain-stat-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px}
381
+ .brain-stat-card.stat-learnings::before{background:linear-gradient(90deg,#f85149,#ff9966)}
382
+ .brain-stat-card.stat-decisions::before{background:linear-gradient(90deg,#58a6ff,#79c0ff)}
383
+ .brain-stat-card.stat-phase::before{background:linear-gradient(90deg,#3fb950,#56d364)}
384
+ .brain-stat-card.stat-updated::before{background:linear-gradient(90deg,#bc8cff,#d2a8ff)}
385
+ .brain-stat-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.6px;color:var(--text-muted)}
386
+ .brain-stat-value{font-size:28px;font-weight:700;line-height:1}
387
+ .brain-stat-detail{font-size:11px;color:var(--text-secondary)}
388
+
389
+ .brain-section{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}
390
+ .brain-section-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border);gap:12px}
391
+ .brain-section-header h3{font-size:14px;font-weight:600;white-space:nowrap}
392
+ .brain-section-actions{display:flex;align-items:center;gap:8px}
393
+ .brain-search{padding:6px 12px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font);font-size:12px;outline:none;width:220px;transition:border .15s}
394
+ .brain-search:focus{border-color:var(--accent)}
395
+
396
+ /* Learning cards */
397
+ .brain-learnings-list,.brain-decisions-list{display:flex;flex-direction:column}
398
+ .brain-learning-card,.brain-decision-card{padding:14px 16px;border-bottom:1px solid var(--border-light);display:flex;flex-direction:column;gap:6px;transition:background .15s;cursor:pointer}
399
+ .brain-learning-card:last-child,.brain-decision-card:last-child{border-bottom:none}
400
+ .brain-learning-card:hover,.brain-decision-card:hover{background:var(--bg-card-hover)}
401
+ .brain-learning-header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
402
+ .brain-learning-what{font-size:13px;font-weight:600;color:var(--danger);flex:1;line-height:1.4;display:flex;align-items:flex-start;gap:6px}
403
+ .brain-learning-what::before{content:'❌';flex-shrink:0}
404
+ .brain-learning-body{display:none;flex-direction:column;gap:6px;padding-left:22px;margin-top:4px}
405
+ .brain-learning-card.expanded .brain-learning-body{display:flex}
406
+ .brain-learning-why,.brain-learning-fix{font-size:12px;line-height:1.5;color:var(--text-secondary)}
407
+ .brain-learning-why::before{content:'Why: ';font-weight:600;color:var(--text-muted)}
408
+ .brain-learning-fix{color:var(--col-done)}
409
+ .brain-learning-fix::before{content:'Fix: ';font-weight:600}
410
+ .brain-learning-meta{font-size:11px;color:var(--text-muted);display:flex;gap:10px;align-items:center}
411
+ .brain-delete-btn{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:11px;padding:4px 8px;border-radius:4px;opacity:0;transition:all .15s;flex-shrink:0}
412
+ .brain-learning-card:hover .brain-delete-btn,.brain-decision-card:hover .brain-delete-btn{opacity:1}
413
+ .brain-delete-btn:hover{color:var(--danger);background:rgba(248,81,73,.1)}
414
+
415
+ /* Decision cards */
416
+ .brain-decision-header{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
417
+ .brain-decision-what{font-size:13px;font-weight:600;color:var(--text-primary);flex:1;line-height:1.4;display:flex;align-items:flex-start;gap:6px}
418
+ .brain-decision-what::before{content:'📌';flex-shrink:0}
419
+ .brain-decision-rationale{font-size:12px;color:var(--text-secondary);line-height:1.5;padding-left:22px}
420
+ .brain-decision-meta{font-size:11px;color:var(--text-muted);display:flex;gap:10px;align-items:center;padding-left:22px}
421
+
422
+ /* Continuity status */
423
+ .brain-continuity-content{padding:16px}
424
+ .brain-continuity-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
425
+ .brain-continuity-item{display:flex;flex-direction:column;gap:2px}
426
+ .brain-continuity-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted)}
427
+ .brain-continuity-value{font-size:13px;color:var(--text-primary);line-height:1.4}
428
+
429
+ /* Empty states */
430
+ .brain-empty{text-align:center;padding:32px 16px;color:var(--text-muted);font-size:13px}
431
+ .brain-empty-icon{font-size:32px;margin-bottom:8px;opacity:.5}
432
+ .brain-init-btn{margin-top:12px;display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:var(--accent);color:#fff;border:none;border-radius:var(--radius-sm);font-family:var(--font);font-size:13px;font-weight:500;cursor:pointer;transition:background .15s}
433
+ .brain-init-btn:hover{background:var(--accent-hover)}
434
+
435
+ /* Phase colors */
436
+ .phase-planning{color:#58a6ff}.phase-executing{color:#d29922}.phase-testing{color:#bc8cff}
437
+ .phase-deploying{color:#3fb950}.phase-reviewing{color:#79c0ff}.phase-idle{color:var(--text-muted)}
438
+
439
+ @media(max-width:900px){.brain-stats{grid-template-columns:repeat(2,1fr)}.brain-continuity-grid{grid-template-columns:1fr}}
440
+
@@ -338,25 +338,27 @@ User says "No" (Skip preview):
338
338
 
339
339
  > **Goal:** Create a clean handoff document that `cm-planning` can use immediately.
340
340
 
341
- #### Handoff Output: `brainstorm-output.md`
341
+ #### Handoff Output: OpenSpec Proposal
342
342
 
343
- Save to `docs/brainstorm/` or project root:
343
+ Save to `openspec/changes/[initiative-name]/proposal.md` (Fission-AI OpenSpec format):
344
344
 
345
345
  ```markdown
346
- # Brainstorm Output: [Initiative Name]
346
+ # Proposal: [Initiative Name]
347
347
  Generated by: cm-brainstorm-idea
348
348
  Date: [date]
349
349
 
350
- ## Qualified Problem
350
+ ## Why we're doing this
351
+ ### Qualified Problem
351
352
  [From Phase 2]
352
353
 
353
- ## 9 Windows Analysis
354
+ ### 9 Windows Analysis
354
355
  [Summary table from Phase 2]
355
356
 
356
- ## Options Evaluated
357
+ ## What's changing
358
+ ### Options Evaluated
357
359
  [Summary from Phase 3-4]
358
360
 
359
- ## Recommendation
361
+ ### Recommendation
360
362
  [From Phase 4]
361
363
 
362
364
  ## Next Steps for cm-planning:
@@ -318,7 +318,7 @@ RE-GENERATE when:
318
318
 
319
319
  STORE at:
320
320
  → .cm/architecture.mmd (Mermaid source)
321
- → Include in brainstorm-output.md when relevant
321
+ → Include in proposal.md when relevant
322
322
  ```
323
323
 
324
324
  ### Integration with Pencil MCP
@@ -436,7 +436,7 @@ NEW addition to Phase A:
436
436
  2. If total impact > 20 files:
437
437
  → Flag as HIGH RISK in plan
438
438
  → Recommend cm-tdd coverage for all impacted callers
439
- 3. Include impact summary in implementation_plan.md
439
+ 3. Include impact summary in OpenSpec `design.md`
440
440
  ```
441
441
 
442
442
  ### cm-debugging (Trace Analysis — enhanced)
@@ -7,7 +7,7 @@ description: Open visual Dashboard to track work status (Simulated Kanban board)
7
7
 
8
8
  When this command is called, the AI Assistant should:
9
9
 
10
- 1. **Check status:** Find and read the `task.md` (or `cm-tasks.json`) file in the current project directory (or artifacts directory).
10
+ 1. **Check status:** Find and read the OpenSpec `openspec/changes/[init]/tasks.md` (and synced `cm-tasks.json`) file in the current project directory (or artifacts directory).
11
11
  2. **Visual display:** Aggregate tasks and render them as a Kanban board (Markdown table) with 3 columns:
12
12
  - **🔴 TO DO** (Not started)
13
13
  - **🟡 IN PROGRESS** (In progress)
@@ -61,12 +61,13 @@ Have a plan with independent tasks?
61
61
  ## Mode A: Batch Execution
62
62
 
63
63
  ### Process
64
- 1. **Load plan** → review critically → raise concerns
64
+ 1. **Load plan** from Fission-AI OpenSpec (`openspec/changes/[initiative-name]/tasks.md` and `design.md`) → review critically → raise concerns
65
65
  2. **Execute batch** (default: 3 tasks)
66
66
  - Mark in_progress → follow steps → verify → mark complete
67
67
  3. **Report** → show what was done + verification output
68
68
  4. **Continue** → apply feedback → next batch
69
69
  5. **Complete** → use `cm-code-review` to finish
70
+ 6. **Archive** → After all tasks complete, manually move the OpenSpec folder to `openspec/changes/archive/[date]-[name]/`
70
71
 
71
72
  ### Rules
72
73
  - Follow plan steps exactly
@@ -79,7 +80,7 @@ Have a plan with independent tasks?
79
80
  ## Mode B: Subagent-Driven Development
80
81
 
81
82
  ### Process
82
- 1. **Read plan** → extract ALL tasks with full text
83
+ 1. **Read plan** from `openspec/changes/[initiative-name]/tasks.md` → extract ALL tasks with full text
83
84
  2. **Per task:**
84
85
  - Dispatch implementer subagent with full task text
85
86
  - Answer subagent questions if any
@@ -179,6 +180,7 @@ LOOP until backlog empty or user interrupts:
179
180
 
180
181
  After EVERY phase, you MUST:
181
182
  1. Read current `cm-tasks.json`
183
+ 2. Sync state from `openspec/changes/[initiative-name]/tasks.md` (Keep both human-readable MD and AI-executable JSON in parallel sync)
182
184
  2. Find the active task by `id`
183
185
  3. Update `status`, `logs[]`, timestamps
184
186
  4. Recalculate `stats` object:
@@ -49,7 +49,7 @@ The **CodyMaster (CM)** kit transforms ideas into production code through 13 spe
49
49
  1. Scan codebase with **code intelligence** (AST graph + architecture diagram via `cm-codeintell`).
50
50
  2. Interview user and analyze with 9 Windows (TRIZ).
51
51
  3. Propose 2-3 options, evaluate multi-dimensionally, recommend the best option.
52
- - **Output:** `brainstorm-output.md` — qualified problem + recommended option → passes to `cm-planning`.
52
+ - **Output:** OpenSpec `openspec/changes/[initiative]/proposal.md` — qualified problem + recommended option → passes to `cm-planning`.
53
53
 
54
54
  ---
55
55
 
@@ -60,8 +60,8 @@ The **CodyMaster (CM)** kit transforms ideas into production code through 13 spe
60
60
  - **Action:**
61
61
  1. Brainstorm requirements and analyze i18n.
62
62
  2. Propose architecture and tech stack.
63
- 3. Write detailed `implementation_plan.md`.
64
- - **Output:** Design documentation and execution plan approved by user.
63
+ 3. Write detailed OpenSpec docs (`openspec/changes/[init]/design.md` and `tasks.md`).
64
+ - **Output:** Design docs and execution plan (OpenSpec tasks) approved by user.
65
65
 
66
66
  ---
67
67
 
@@ -161,7 +161,7 @@ The **CodyMaster (CM)** kit transforms ideas into production code through 13 spe
161
161
  The kit supports autonomous mode by applying the **Reason → Act → Reflect → Verify (RARV)** loop.
162
162
 
163
163
  ### How to Use the Workflow:
164
- 1. **`/cm-start [objective]`**: Start work. The system will automatically create `cm-tasks.json`, break down tasks, launch the tracking interface, and autonomously use CM skills to complete them.
164
+ 1. **`/cm-start [objective]`**: Start work. The system will automatically initialize the OpenSpec structure (`openspec/changes/[objective]/`), break down tasks into `tasks.md` and sync with `cm-tasks.json`, launch the tracking interface, and autonomously use CM skills to complete them.
165
165
  2. **`/cm-dashboard`**: Open the visual tracking Dashboard in browser (shows Kanban board, reasoning log, and progress).
166
166
  3. **`/cm-status`**: View quick progress summary in Terminal.
167
167
 
@@ -33,6 +33,7 @@ description: "You MUST use this before any creative work or multi-step task. Exp
33
33
  - Must-haves vs nice-to-haves
34
34
  - Edge cases to handle
35
35
  - Edge cases to explicitly NOT handle
36
+ - **Output to:** `openspec/changes/[initiative-name]/specs/`
36
37
 
37
38
  4. **Design** — How should it work?
38
39
  - Data flow
@@ -47,7 +48,10 @@ description: "You MUST use this before any creative work or multi-step task. Exp
47
48
  - Skipping scope definition
48
49
  - "It's simple, no need to plan"
49
50
 
50
- ## Phase B: Write Implementation Plan
51
+ ## Phase B: Write Implementation Plan (OpenSpec Format)
52
+
53
+ > **Standard:** Fission-AI OpenSpec (`https://github.com/Fission-AI/OpenSpec/`)
54
+ > Output artifacts exactly to `openspec/changes/[initiative-name]/` to ensure human/AI alignment.
51
55
 
52
56
  ### When to Write a Plan
53
57
 
@@ -56,16 +60,16 @@ description: "You MUST use this before any creative work or multi-step task. Exp
56
60
  - Changes affect other components
57
61
  - User explicitly asks for a plan
58
62
 
59
- ### Plan Structure
63
+ ### OpenSpec Artifacts to Generate
60
64
 
65
+ **1. `openspec/changes/[initiative-name]/design.md`**
61
66
  ```markdown
62
- # [Goal]
67
+ # Design: [Goal]
63
68
 
64
- ## Context
65
- What and why.
69
+ ## Context & Technical Approach
70
+ Why this approach and how it works.
66
71
 
67
72
  ## Proposed Changes
68
-
69
73
  ### [Component/File]
70
74
  - What changes
71
75
  - Why this approach
@@ -74,6 +78,15 @@ What and why.
74
78
  How to verify it works.
75
79
  ```
76
80
 
81
+ **2. `openspec/changes/[initiative-name]/tasks.md`**
82
+ ```markdown
83
+ # Implementation Checklist
84
+ - [ ] 1.1 First component setup
85
+ - [ ] 1.2 First component logic
86
+ - [ ] 2.1 Next component integration
87
+ - [ ] Verification testing
88
+ ```
89
+
77
90
  ### Plan Rules
78
91
 
79
92
  ```
@@ -833,6 +833,7 @@ docs/plans/ — Implementation plans
833
833
  3. i18n extraction: MAX 30 strings per batch
834
834
  4. Run test:gate before every deploy
835
835
  5. Check `.project-identity.json` for deploy targets
836
+ 6. Use `qmd` (cm-deep-search) for semantic codebase search. Ensure `.qmd` index is fresh.
836
837
  ```
837
838
 
838
839
  ### Step 2: Git Safety Protocol
@@ -196,7 +196,7 @@ For each migration step:
196
196
  5. If tests fail → STOP, diagnose, fix before next step
197
197
 
198
198
  Progress tracking:
199
- → Update cm-tasks.json with each completed migration step
199
+ → Update OpenSpec `tasks.md` and `cm-tasks.json` with each completed migration step
200
200
  → Update CONTINUITY.md with migration status
201
201
  ```
202
202