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.
- package/README.md +10 -10
- package/dist/index.js +12 -12
- package/dist/ui/box.js +2 -2
- package/dist/ui/onboarding.js +11 -5
- package/install.sh +315 -33
- package/package.json +8 -3
- package/public/dashboard/app.js +1270 -0
- package/public/dashboard/index.html +218 -0
- package/public/dashboard/style.css +440 -0
- package/skills/cm-brainstorm-idea/SKILL.md +9 -7
- package/skills/cm-codeintell/SKILL.md +2 -2
- package/skills/cm-dashboard/SKILL.md +1 -1
- package/skills/cm-execution/SKILL.md +4 -2
- package/skills/cm-how-it-work/SKILL.md +4 -4
- package/skills/cm-planning/SKILL.md +19 -6
- package/skills/cm-project-bootstrap/SKILL.md +1 -0
- package/skills/cm-reactor/SKILL.md +1 -1
- package/skills/cm-skill-index/SKILL.md +1 -1
- package/skills/cm-start/SKILL.md +8 -5
- package/skills/cm-ux-master/SKILL.md +115 -767
|
@@ -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:
|
|
341
|
+
#### Handoff Output: OpenSpec Proposal
|
|
342
342
|
|
|
343
|
-
Save to `
|
|
343
|
+
Save to `openspec/changes/[initiative-name]/proposal.md` (Fission-AI OpenSpec format):
|
|
344
344
|
|
|
345
345
|
```markdown
|
|
346
|
-
#
|
|
346
|
+
# Proposal: [Initiative Name]
|
|
347
347
|
Generated by: cm-brainstorm-idea
|
|
348
348
|
Date: [date]
|
|
349
349
|
|
|
350
|
-
##
|
|
350
|
+
## Why we're doing this
|
|
351
|
+
### Qualified Problem
|
|
351
352
|
[From Phase 2]
|
|
352
353
|
|
|
353
|
-
|
|
354
|
+
### 9 Windows Analysis
|
|
354
355
|
[Summary table from Phase 2]
|
|
355
356
|
|
|
356
|
-
##
|
|
357
|
+
## What's changing
|
|
358
|
+
### Options Evaluated
|
|
357
359
|
[Summary from Phase 3-4]
|
|
358
360
|
|
|
359
|
-
|
|
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
|
|
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
|
|
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 `
|
|
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:** `
|
|
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 `
|
|
64
|
-
- **Output:** Design
|
|
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
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
|