@jakkrichm/create-nexus-devflow 2.0.27 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -7
- package/dist/bin/create-nexus-devflow.d.ts +5 -1
- package/dist/bin/create-nexus-devflow.js +219 -0
- package/dist/bin/create-nexus-devflow.js.map +1 -1
- package/dist/lib/branch-context.d.ts +39 -0
- package/dist/lib/branch-context.js +196 -0
- package/dist/lib/branch-context.js.map +1 -0
- package/dist/lib/code-graph.d.ts +30 -0
- package/dist/lib/code-graph.js +209 -0
- package/dist/lib/code-graph.js.map +1 -0
- package/dist/lib/context-slicer.d.ts +31 -0
- package/dist/lib/context-slicer.js +234 -0
- package/dist/lib/context-slicer.js.map +1 -0
- package/dist/lib/current-work.js +4 -2
- package/dist/lib/current-work.js.map +1 -1
- package/dist/lib/dashboard-page.d.ts +1 -1
- package/dist/lib/dashboard-page.js +140 -56
- package/dist/lib/dashboard-page.js.map +1 -1
- package/dist/lib/dashboard-snapshot.d.ts +13 -0
- package/dist/lib/dashboard-snapshot.js +24 -6
- package/dist/lib/dashboard-snapshot.js.map +1 -1
- package/dist/lib/dashboard.js +38 -0
- package/dist/lib/dashboard.js.map +1 -1
- package/dist/lib/drift-reconciler.d.ts +38 -0
- package/dist/lib/drift-reconciler.js +155 -0
- package/dist/lib/drift-reconciler.js.map +1 -0
- package/dist/lib/gatekeeper.d.ts +1 -0
- package/dist/lib/gatekeeper.js +30 -1
- package/dist/lib/gatekeeper.js.map +1 -1
- package/dist/lib/git-hooks.js +41 -16
- package/dist/lib/git-hooks.js.map +1 -1
- package/dist/lib/ide-extension.d.ts +38 -0
- package/dist/lib/ide-extension.js +61 -0
- package/dist/lib/ide-extension.js.map +1 -0
- package/dist/lib/mcp.d.ts +36 -0
- package/dist/lib/mcp.js +653 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/status.d.ts +1 -1
- package/dist/lib/status.js +4 -4
- package/dist/lib/status.js.map +1 -1
- package/dist/lib/swarm-orchestrator.d.ts +31 -0
- package/dist/lib/swarm-orchestrator.js +134 -0
- package/dist/lib/swarm-orchestrator.js.map +1 -0
- package/dist/lib/webview-studio.d.ts +8 -0
- package/dist/lib/webview-studio.js +463 -0
- package/dist/lib/webview-studio.js.map +1 -0
- package/dist/lib/workflow-state.js +24 -8
- package/dist/lib/workflow-state.js.map +1 -1
- package/package.json +1 -1
- package/template/devflow/build-plan.md +42 -20
- package/template/devflow/project-plan.md +70 -18
- package/template/devflow/reference/studio.html +504 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { readDashboardSnapshot } from "./dashboard-snapshot.js";
|
|
2
|
+
import { evaluateGate } from "./gatekeeper.js";
|
|
3
|
+
import { detectGitDrift } from "./drift-reconciler.js";
|
|
4
|
+
import { readIdeas } from "./ideas.js";
|
|
5
|
+
/**
|
|
6
|
+
* Escapes HTML characters safely.
|
|
7
|
+
*/
|
|
8
|
+
function escapeHtml(str) {
|
|
9
|
+
if (!str)
|
|
10
|
+
return "";
|
|
11
|
+
return String(str)
|
|
12
|
+
.replace(/&/g, "&")
|
|
13
|
+
.replace(/</g, "<")
|
|
14
|
+
.replace(/>/g, ">")
|
|
15
|
+
.replace(/"/g, """)
|
|
16
|
+
.replace(/'/g, "'");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Renders a self-contained, interactive Webview Studio HTML page.
|
|
20
|
+
*/
|
|
21
|
+
export async function renderStudioHtml(projectRoot, options = {}) {
|
|
22
|
+
const snapshot = await readDashboardSnapshot(projectRoot);
|
|
23
|
+
const gateReport = await evaluateGate(projectRoot, { strict: false });
|
|
24
|
+
const driftReport = await detectGitDrift(projectRoot);
|
|
25
|
+
const ideas = await readIdeas(projectRoot);
|
|
26
|
+
const status = snapshot.status;
|
|
27
|
+
const currentWork = status.currentWork;
|
|
28
|
+
const projectName = status.project.name || "Nexus-DevFlow Project";
|
|
29
|
+
const branch = status.git.branch || "main";
|
|
30
|
+
const nextActionCmd = typeof status.nextAction === "string" ? status.nextAction : status.nextAction?.command || "/feature";
|
|
31
|
+
const track = snapshot.workflow.track || (currentWork.state === "active" ? "fast" : "idle");
|
|
32
|
+
const isGatePassed = gateReport.passed;
|
|
33
|
+
const gatePillClass = isGatePassed ? "badge-pass" : "badge-blocked";
|
|
34
|
+
const gatePillText = isGatePassed ? "✔ Gate Passed" : "✖ Gate Blocked";
|
|
35
|
+
const ideasHtml = ideas.pending.length > 0
|
|
36
|
+
? ideas.pending.map((idea) => `
|
|
37
|
+
<div class="card-item idea-item">
|
|
38
|
+
<div class="item-header">
|
|
39
|
+
<span class="badge-id">${escapeHtml(idea.id)}</span>
|
|
40
|
+
<span class="item-title">${escapeHtml(idea.title || idea.rawInput.slice(0, 40))}</span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="item-tags">
|
|
43
|
+
<span class="tag tag-feasibility">${escapeHtml(idea.feasibility || "Feasible")}</span>
|
|
44
|
+
<span class="tag tag-value">${escapeHtml(idea.value || "Value: High")}</span>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
`).join("")
|
|
48
|
+
: `<div class="empty-state">No pending ideas in inbox. Use <code>nexus-devflow idea add</code></div>`;
|
|
49
|
+
const historyHtml = snapshot.history.items.length > 0
|
|
50
|
+
? snapshot.history.items.slice(0, 8).map((item) => {
|
|
51
|
+
const runId = item.buildPlanItem || item.file.replace(/\.md$/, "");
|
|
52
|
+
return `
|
|
53
|
+
<div class="card-item history-item">
|
|
54
|
+
<div class="item-header">
|
|
55
|
+
<span class="badge-id badge-history">${escapeHtml(runId)}</span>
|
|
56
|
+
<span class="item-title">${escapeHtml(item.title)}</span>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="item-meta">
|
|
59
|
+
<span class="tag tag-cat">${escapeHtml(item.type)}</span>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
`;
|
|
63
|
+
}).join("")
|
|
64
|
+
: `<div class="empty-state">No archived history records yet.</div>`;
|
|
65
|
+
const completedCount = currentWork.completed;
|
|
66
|
+
const totalTasks = currentWork.total;
|
|
67
|
+
const progressPercent = totalTasks > 0 ? Math.round((completedCount / totalTasks) * 100) : 0;
|
|
68
|
+
return `<!DOCTYPE html>
|
|
69
|
+
<html lang="th" data-theme="${options.theme || "auto"}">
|
|
70
|
+
<head>
|
|
71
|
+
<meta charset="UTF-8">
|
|
72
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
73
|
+
<title>Nexus-DevFlow Studio: ${escapeHtml(projectName)}</title>
|
|
74
|
+
<style>
|
|
75
|
+
:root {
|
|
76
|
+
--bg: var(--vscode-editor-background, #090d16);
|
|
77
|
+
--bg-panel: var(--vscode-sideBar-background, rgba(17, 24, 39, 0.75));
|
|
78
|
+
--bg-card: rgba(30, 41, 59, 0.6);
|
|
79
|
+
--border: var(--vscode-panel-border, rgba(255, 255, 255, 0.08));
|
|
80
|
+
--border-accent: rgba(56, 189, 248, 0.3);
|
|
81
|
+
--fg: var(--vscode-editor-foreground, #f8fafc);
|
|
82
|
+
--fg-muted: var(--vscode-descriptionForeground, #94a3b8);
|
|
83
|
+
--accent: #38bdf8;
|
|
84
|
+
--accent-gradient: linear-gradient(135deg, #38bdf8 0%, #818cf8 100%);
|
|
85
|
+
--green: #4ade80;
|
|
86
|
+
--yellow: #facc15;
|
|
87
|
+
--red: #f87171;
|
|
88
|
+
--font-mono: var(--vscode-editor-font-family, 'Fira Code', Consolas, monospace);
|
|
89
|
+
--font-sans: var(--vscode-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
93
|
+
body {
|
|
94
|
+
font-family: var(--font-sans);
|
|
95
|
+
background-color: var(--bg);
|
|
96
|
+
color: var(--fg);
|
|
97
|
+
padding: 16px;
|
|
98
|
+
line-height: 1.5;
|
|
99
|
+
font-size: 13px;
|
|
100
|
+
overflow-x: hidden;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.studio-container {
|
|
104
|
+
max-width: 1200px;
|
|
105
|
+
margin: 0 auto;
|
|
106
|
+
display: flex;
|
|
107
|
+
flex-direction: column;
|
|
108
|
+
gap: 16px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Top Studio Header */
|
|
112
|
+
.studio-header {
|
|
113
|
+
background: var(--bg-panel);
|
|
114
|
+
backdrop-filter: blur(12px);
|
|
115
|
+
border: 1px solid var(--border);
|
|
116
|
+
border-radius: 12px;
|
|
117
|
+
padding: 16px 20px;
|
|
118
|
+
display: flex;
|
|
119
|
+
align-items: center;
|
|
120
|
+
justify-content: space-between;
|
|
121
|
+
flex-wrap: wrap;
|
|
122
|
+
gap: 12px;
|
|
123
|
+
}
|
|
124
|
+
.header-left {
|
|
125
|
+
display: flex;
|
|
126
|
+
align-items: center;
|
|
127
|
+
gap: 12px;
|
|
128
|
+
}
|
|
129
|
+
.project-badge {
|
|
130
|
+
font-weight: 700;
|
|
131
|
+
font-size: 16px;
|
|
132
|
+
background: var(--accent-gradient);
|
|
133
|
+
-webkit-background-clip: text;
|
|
134
|
+
-webkit-text-fill-color: transparent;
|
|
135
|
+
letter-spacing: -0.5px;
|
|
136
|
+
}
|
|
137
|
+
.branch-pill {
|
|
138
|
+
font-family: var(--font-mono);
|
|
139
|
+
font-size: 12px;
|
|
140
|
+
background: rgba(56, 189, 248, 0.12);
|
|
141
|
+
color: var(--accent);
|
|
142
|
+
padding: 3px 10px;
|
|
143
|
+
border-radius: 20px;
|
|
144
|
+
border: 1px solid var(--border-accent);
|
|
145
|
+
}
|
|
146
|
+
.header-right {
|
|
147
|
+
display: flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
gap: 10px;
|
|
150
|
+
}
|
|
151
|
+
.badge-pass {
|
|
152
|
+
background: rgba(74, 222, 128, 0.15);
|
|
153
|
+
color: var(--green);
|
|
154
|
+
border: 1px solid rgba(74, 222, 128, 0.3);
|
|
155
|
+
padding: 4px 12px;
|
|
156
|
+
border-radius: 20px;
|
|
157
|
+
font-weight: 600;
|
|
158
|
+
}
|
|
159
|
+
.badge-blocked {
|
|
160
|
+
background: rgba(248, 113, 113, 0.15);
|
|
161
|
+
color: var(--red);
|
|
162
|
+
border: 1px solid rgba(248, 113, 113, 0.3);
|
|
163
|
+
padding: 4px 12px;
|
|
164
|
+
border-radius: 20px;
|
|
165
|
+
font-weight: 600;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Quick Action Dispatcher */
|
|
169
|
+
.action-bar {
|
|
170
|
+
background: var(--bg-panel);
|
|
171
|
+
border: 1px solid var(--border);
|
|
172
|
+
border-radius: 10px;
|
|
173
|
+
padding: 12px 16px;
|
|
174
|
+
display: flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
gap: 8px;
|
|
177
|
+
overflow-x: auto;
|
|
178
|
+
}
|
|
179
|
+
.action-label {
|
|
180
|
+
font-weight: 600;
|
|
181
|
+
color: var(--fg-muted);
|
|
182
|
+
font-size: 11px;
|
|
183
|
+
text-transform: uppercase;
|
|
184
|
+
margin-right: 4px;
|
|
185
|
+
white-space: nowrap;
|
|
186
|
+
}
|
|
187
|
+
.btn-action {
|
|
188
|
+
background: var(--bg-card);
|
|
189
|
+
border: 1px solid var(--border);
|
|
190
|
+
color: var(--fg);
|
|
191
|
+
padding: 5px 12px;
|
|
192
|
+
border-radius: 6px;
|
|
193
|
+
cursor: pointer;
|
|
194
|
+
font-family: var(--font-mono);
|
|
195
|
+
font-size: 12px;
|
|
196
|
+
transition: all 0.2s ease;
|
|
197
|
+
white-space: nowrap;
|
|
198
|
+
}
|
|
199
|
+
.btn-action:hover {
|
|
200
|
+
background: rgba(56, 189, 248, 0.15);
|
|
201
|
+
border-color: var(--accent);
|
|
202
|
+
color: var(--accent);
|
|
203
|
+
}
|
|
204
|
+
.btn-action.btn-primary {
|
|
205
|
+
background: var(--accent-gradient);
|
|
206
|
+
color: #040812;
|
|
207
|
+
font-weight: 700;
|
|
208
|
+
border: none;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* 3-Pillars Kanban Grid */
|
|
212
|
+
.kanban-grid {
|
|
213
|
+
display: grid;
|
|
214
|
+
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
|
215
|
+
gap: 16px;
|
|
216
|
+
}
|
|
217
|
+
.kanban-col {
|
|
218
|
+
background: var(--bg-panel);
|
|
219
|
+
border: 1px solid var(--border);
|
|
220
|
+
border-radius: 12px;
|
|
221
|
+
padding: 16px;
|
|
222
|
+
display: flex;
|
|
223
|
+
flex-direction: column;
|
|
224
|
+
gap: 12px;
|
|
225
|
+
}
|
|
226
|
+
.col-header {
|
|
227
|
+
display: flex;
|
|
228
|
+
align-items: center;
|
|
229
|
+
justify-content: space-between;
|
|
230
|
+
border-bottom: 1px solid var(--border);
|
|
231
|
+
padding-bottom: 10px;
|
|
232
|
+
}
|
|
233
|
+
.col-title {
|
|
234
|
+
font-size: 13px;
|
|
235
|
+
font-weight: 700;
|
|
236
|
+
display: flex;
|
|
237
|
+
align-items: center;
|
|
238
|
+
gap: 6px;
|
|
239
|
+
}
|
|
240
|
+
.col-count {
|
|
241
|
+
font-size: 11px;
|
|
242
|
+
background: var(--bg-card);
|
|
243
|
+
padding: 2px 8px;
|
|
244
|
+
border-radius: 10px;
|
|
245
|
+
color: var(--fg-muted);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.col-content {
|
|
249
|
+
display: flex;
|
|
250
|
+
flex-direction: column;
|
|
251
|
+
gap: 10px;
|
|
252
|
+
max-height: 480px;
|
|
253
|
+
overflow-y: auto;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* Card Items */
|
|
257
|
+
.card-item {
|
|
258
|
+
background: var(--bg-card);
|
|
259
|
+
border: 1px solid var(--border);
|
|
260
|
+
border-radius: 8px;
|
|
261
|
+
padding: 12px;
|
|
262
|
+
display: flex;
|
|
263
|
+
flex-direction: column;
|
|
264
|
+
gap: 6px;
|
|
265
|
+
transition: transform 0.15s ease, border-color 0.15s ease;
|
|
266
|
+
}
|
|
267
|
+
.card-item:hover {
|
|
268
|
+
border-color: var(--border-accent);
|
|
269
|
+
transform: translateY(-1px);
|
|
270
|
+
}
|
|
271
|
+
.card-item.active-item {
|
|
272
|
+
border-color: var(--accent);
|
|
273
|
+
box-shadow: 0 0 12px rgba(56, 189, 248, 0.15);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.item-header {
|
|
277
|
+
display: flex;
|
|
278
|
+
align-items: flex-start;
|
|
279
|
+
gap: 8px;
|
|
280
|
+
}
|
|
281
|
+
.badge-id {
|
|
282
|
+
font-family: var(--font-mono);
|
|
283
|
+
font-size: 10px;
|
|
284
|
+
font-weight: 700;
|
|
285
|
+
background: rgba(56, 189, 248, 0.2);
|
|
286
|
+
color: var(--accent);
|
|
287
|
+
padding: 2px 6px;
|
|
288
|
+
border-radius: 4px;
|
|
289
|
+
white-space: nowrap;
|
|
290
|
+
}
|
|
291
|
+
.badge-history {
|
|
292
|
+
background: rgba(129, 140, 248, 0.2);
|
|
293
|
+
color: #818cf8;
|
|
294
|
+
}
|
|
295
|
+
.item-title {
|
|
296
|
+
font-weight: 600;
|
|
297
|
+
font-size: 12px;
|
|
298
|
+
flex: 1;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/* Progress bar */
|
|
302
|
+
.progress-bar-container {
|
|
303
|
+
background: rgba(0, 0, 0, 0.3);
|
|
304
|
+
height: 6px;
|
|
305
|
+
border-radius: 3px;
|
|
306
|
+
overflow: hidden;
|
|
307
|
+
margin-top: 4px;
|
|
308
|
+
}
|
|
309
|
+
.progress-bar-fill {
|
|
310
|
+
background: var(--accent-gradient);
|
|
311
|
+
height: 100%;
|
|
312
|
+
transition: width 0.3s ease;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.item-tags, .item-meta {
|
|
316
|
+
display: flex;
|
|
317
|
+
align-items: center;
|
|
318
|
+
gap: 6px;
|
|
319
|
+
font-size: 11px;
|
|
320
|
+
color: var(--fg-muted);
|
|
321
|
+
}
|
|
322
|
+
.tag {
|
|
323
|
+
font-size: 10px;
|
|
324
|
+
padding: 1px 6px;
|
|
325
|
+
border-radius: 4px;
|
|
326
|
+
background: rgba(255, 255, 255, 0.05);
|
|
327
|
+
}
|
|
328
|
+
.tag-feasibility { color: var(--green); }
|
|
329
|
+
.tag-value { color: var(--accent); }
|
|
330
|
+
.tag-cat { color: var(--yellow); }
|
|
331
|
+
|
|
332
|
+
.empty-state {
|
|
333
|
+
text-align: center;
|
|
334
|
+
padding: 24px;
|
|
335
|
+
color: var(--fg-muted);
|
|
336
|
+
font-size: 12px;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/* Pulse Notification */
|
|
340
|
+
.pulse-panel {
|
|
341
|
+
background: var(--bg-panel);
|
|
342
|
+
border: 1px solid var(--border);
|
|
343
|
+
border-radius: 10px;
|
|
344
|
+
padding: 12px 16px;
|
|
345
|
+
display: flex;
|
|
346
|
+
align-items: center;
|
|
347
|
+
justify-content: space-between;
|
|
348
|
+
font-size: 12px;
|
|
349
|
+
}
|
|
350
|
+
</style>
|
|
351
|
+
</head>
|
|
352
|
+
<body>
|
|
353
|
+
<div class="studio-container">
|
|
354
|
+
|
|
355
|
+
<!-- Top Header -->
|
|
356
|
+
<header class="studio-header">
|
|
357
|
+
<div class="header-left">
|
|
358
|
+
<span class="project-badge">⚡ ${escapeHtml(projectName)}</span>
|
|
359
|
+
<span class="branch-pill">🌿 ${escapeHtml(branch)}</span>
|
|
360
|
+
<span class="badge-track">Track: ${escapeHtml(track)}</span>
|
|
361
|
+
</div>
|
|
362
|
+
<div class="header-right">
|
|
363
|
+
<span class="${gatePillClass}">${gatePillText}</span>
|
|
364
|
+
<button class="btn-action btn-primary" onclick="dispatchCommand('${escapeHtml(nextActionCmd)}')">
|
|
365
|
+
Next: ${escapeHtml(nextActionCmd)}
|
|
366
|
+
</button>
|
|
367
|
+
</div>
|
|
368
|
+
</header>
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
<!-- Quick Action Bar -->
|
|
372
|
+
<div class="action-bar">
|
|
373
|
+
<span class="action-label">Quick Actions:</span>
|
|
374
|
+
<button class="btn-action" onclick="dispatchCommand('/feature')">/feature</button>
|
|
375
|
+
<button class="btn-action" onclick="dispatchCommand('/implement')">/implement</button>
|
|
376
|
+
<button class="btn-action" onclick="dispatchCommand('/check')">/check</button>
|
|
377
|
+
<button class="btn-action" onclick="dispatchCommand('/complete')">/complete</button>
|
|
378
|
+
<button class="btn-action" onclick="dispatchCommand('nexus-devflow slice --stage implement')">slice</button>
|
|
379
|
+
<button class="btn-action" onclick="dispatchCommand('nexus-devflow drift')">drift</button>
|
|
380
|
+
<button class="btn-action" onclick="dispatchCommand('nexus-devflow reconcile --fix')">reconcile</button>
|
|
381
|
+
<button class="btn-action" onclick="dispatchCommand('nexus-devflow doctor')">doctor</button>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<!-- 3-Pillars Kanban View -->
|
|
385
|
+
<main class="kanban-grid">
|
|
386
|
+
|
|
387
|
+
<!-- 🔮 1. Future (Ideas Inbox) -->
|
|
388
|
+
<section class="kanban-col">
|
|
389
|
+
<div class="col-header">
|
|
390
|
+
<span class="col-title">🔮 Future (Ideas Inbox)</span>
|
|
391
|
+
<span class="col-count">${ideas.pending.length}</span>
|
|
392
|
+
</div>
|
|
393
|
+
<div class="col-content">
|
|
394
|
+
${ideasHtml}
|
|
395
|
+
</div>
|
|
396
|
+
</section>
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
<!-- ⚡ 2. Present (Active Living Context) -->
|
|
400
|
+
<section class="kanban-col">
|
|
401
|
+
<div class="col-header">
|
|
402
|
+
<span class="col-title">⚡ Present (Active Living Spec)</span>
|
|
403
|
+
<span class="col-count">${completedCount}/${totalTasks} Tasks</span>
|
|
404
|
+
</div>
|
|
405
|
+
<div class="col-content">
|
|
406
|
+
${currentWork.state === "active" ? `
|
|
407
|
+
<div class="card-item active-item">
|
|
408
|
+
<div class="item-header">
|
|
409
|
+
<span class="badge-id">${escapeHtml(currentWork.runId || "ACTIVE")}</span>
|
|
410
|
+
<span class="item-title">${escapeHtml(currentWork.title || "Active Spec")}</span>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="progress-bar-container">
|
|
413
|
+
<div class="progress-bar-fill" style="width: ${progressPercent}%;"></div>
|
|
414
|
+
</div>
|
|
415
|
+
<div class="item-meta">
|
|
416
|
+
<span>Progress: ${progressPercent}%</span>
|
|
417
|
+
<span>Remaining: ${currentWork.remaining} task(s)</span>
|
|
418
|
+
</div>
|
|
419
|
+
</div>
|
|
420
|
+
` : `
|
|
421
|
+
<div class="empty-state">
|
|
422
|
+
Idle workspace.<br>Run <code>/feature</code> or <code>/fix</code> to start a run.
|
|
423
|
+
</div>
|
|
424
|
+
`}
|
|
425
|
+
</div>
|
|
426
|
+
</section>
|
|
427
|
+
|
|
428
|
+
<!-- 📦 3. Past (Release History Archive) -->
|
|
429
|
+
<section class="kanban-col">
|
|
430
|
+
<div class="col-header">
|
|
431
|
+
<span class="col-title">📦 Past (History Archives)</span>
|
|
432
|
+
<span class="col-count">${snapshot.history.total} Releases</span>
|
|
433
|
+
</div>
|
|
434
|
+
<div class="col-content">
|
|
435
|
+
${historyHtml}
|
|
436
|
+
</div>
|
|
437
|
+
</section>
|
|
438
|
+
|
|
439
|
+
</main>
|
|
440
|
+
|
|
441
|
+
<!-- Bottom Pulse -->
|
|
442
|
+
<footer class="pulse-panel">
|
|
443
|
+
<div>Findings Blockers: <strong>${gateReport.findingsBlockers}</strong> | Total Findings: <strong>${status.findings.total}</strong></div>
|
|
444
|
+
<div>Git Drift: <strong>${driftReport.hasDrift ? "⚠ Drift Detected" : "✔ In Sync"}</strong></div>
|
|
445
|
+
</footer>
|
|
446
|
+
|
|
447
|
+
</div>
|
|
448
|
+
|
|
449
|
+
<script>
|
|
450
|
+
function dispatchCommand(cmd) {
|
|
451
|
+
if (window.acquireVsCodeApi) {
|
|
452
|
+
const vscode = window.acquireVsCodeApi();
|
|
453
|
+
vscode.postMessage({ command: 'exec', text: cmd });
|
|
454
|
+
} else if (navigator.clipboard) {
|
|
455
|
+
navigator.clipboard.writeText(cmd);
|
|
456
|
+
alert('Copied command to clipboard: ' + cmd);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
</script>
|
|
460
|
+
</body>
|
|
461
|
+
</html>`;
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=webview-studio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webview-studio.js","sourceRoot":"","sources":["../../lib/webview-studio.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,19 +31,22 @@ function parseWorkflowState(markdown, currentWork) {
|
|
|
31
31
|
const lastCompletedRun = nullableField(markdown, "Last Completed Run");
|
|
32
32
|
const lastUpdated = nullableField(markdown, "Last Updated");
|
|
33
33
|
const deepStage = normalizeDeepStage(rawStage);
|
|
34
|
+
const fastStageFromMarkdown = normalizeFastStage(rawStage);
|
|
34
35
|
let track = "idle";
|
|
35
36
|
let currentStage = null;
|
|
36
|
-
|
|
37
|
+
const isIdle = explicitTrack === "idle" ||
|
|
38
|
+
(rawStage === null && currentWork.state === "idle" && !activeRunId && !activeDiscoveryId);
|
|
39
|
+
if (isIdle) {
|
|
40
|
+
track = "idle";
|
|
41
|
+
currentStage = null;
|
|
42
|
+
}
|
|
43
|
+
else if (explicitTrack === "deep") {
|
|
37
44
|
track = "deep";
|
|
38
45
|
currentStage = deepStage || (activeDiscoveryId ? "00-explore" : "10-define");
|
|
39
46
|
}
|
|
40
47
|
else if (explicitTrack === "fast") {
|
|
41
48
|
track = "fast";
|
|
42
|
-
currentStage = fastStage(currentWork);
|
|
43
|
-
}
|
|
44
|
-
else if (explicitTrack === "idle") {
|
|
45
|
-
track = "idle";
|
|
46
|
-
currentStage = null;
|
|
49
|
+
currentStage = fastStageFromMarkdown || fastStage(currentWork);
|
|
47
50
|
}
|
|
48
51
|
else if (activeRunId && deepStage) {
|
|
49
52
|
track = "deep";
|
|
@@ -55,7 +58,7 @@ function parseWorkflowState(markdown, currentWork) {
|
|
|
55
58
|
}
|
|
56
59
|
else if (currentWork.state === "active") {
|
|
57
60
|
track = currentWork.type === "stage" ? "deep" : "fast";
|
|
58
|
-
currentStage = track === "deep" ? deepStage || "40-execute" : fastStage(currentWork);
|
|
61
|
+
currentStage = track === "deep" ? deepStage || "40-execute" : fastStageFromMarkdown || fastStage(currentWork);
|
|
59
62
|
}
|
|
60
63
|
return {
|
|
61
64
|
track,
|
|
@@ -83,8 +86,21 @@ function normalizeDeepStage(value) {
|
|
|
83
86
|
const direct = value.match(/\b(00-explore|10-define|20-spec|30-plan|40-execute|50-verify|60-report|70-deliver)\b/i)?.[1];
|
|
84
87
|
return (handoff || direct || "").toLowerCase() || null;
|
|
85
88
|
}
|
|
89
|
+
function normalizeFastStage(value) {
|
|
90
|
+
if (!value)
|
|
91
|
+
return null;
|
|
92
|
+
const match = value.match(/\b(feature|fix|feature-fix|implement|check|complete)\b/i)?.[1];
|
|
93
|
+
if (!match)
|
|
94
|
+
return null;
|
|
95
|
+
const normalized = match.toLowerCase();
|
|
96
|
+
if (normalized === "feature" || normalized === "fix")
|
|
97
|
+
return "feature-fix";
|
|
98
|
+
return normalized;
|
|
99
|
+
}
|
|
86
100
|
function fastStage(work) {
|
|
87
|
-
if (work.
|
|
101
|
+
if (work.state === "idle")
|
|
102
|
+
return "feature-fix";
|
|
103
|
+
if (work.completed === 0 && work.total > 0)
|
|
88
104
|
return "implement";
|
|
89
105
|
return work.remaining > 0 ? "implement" : "check";
|
|
90
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../lib/workflow-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAyB7B,MAAM,WAAW,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AAC/E,MAAM,WAAW,GAAG;IAClB,YAAY;IACZ,WAAW;IACX,SAAS;IACT,SAAS;IACT,YAAY;IACZ,WAAW;IACX,WAAW;IACX,YAAY;CACJ,CAAC;AAEX,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,WAA8B;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACnF,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACpD,CAAC;IAED,OAAO,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAgB,EAChB,WAA8B;IAE9B,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACtE,MAAM,iBAAiB,GAAG,aAAa,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,aAAa,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../lib/workflow-state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,40 +1,62 @@
|
|
|
1
1
|
# 📋 Build Plan (User-Owned Feature Queue)
|
|
2
2
|
|
|
3
3
|
> **Document Type**: Build Plan (User-Owned)
|
|
4
|
-
> **Purpose**:
|
|
4
|
+
> **Purpose**: รายการคิวฟีเจอร์การพัฒนาปรับปรุงระบบตามลำดับ พร้อมการประเมินขนาด (Sizing) และความสัมพันธ์ (Dependencies) สำหรับ `/brief` และ `/feature`
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
## 🚀 Phase 1:
|
|
8
|
+
## 🚀 Phase 1: Hard Quality Gates & Pre-commit Enforcement
|
|
9
9
|
|
|
10
|
-
- [
|
|
10
|
+
- [x] **1. Automated Quality Gatekeeper & Pre-commit Hook Integration** `[Size: S]`
|
|
11
11
|
- *Dependencies*: None
|
|
12
|
-
- *Scope*:
|
|
13
|
-
|
|
12
|
+
- *Scope*: ผสาน `nexus-devflow check-gate` เข้าสู่ Git Pre-commit Hooks และ CI เพื่อบล็อกการ Commit/Merge เมื่อมี Unchecked Tasks, Test ล้มเหลว หรือมี P0/P1 Finding ค้างอยู่
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## ⚡ Phase 2: DevFlow Model Context Protocol (MCP) Server Hub
|
|
17
|
+
|
|
18
|
+
- [x] **2. DevFlow MCP Server Hub & Type-Safe Schema Engine (`IDEA-004`)** `[Size: M]`
|
|
14
19
|
- *Dependencies*: Feature 1
|
|
15
|
-
- *Scope*:
|
|
16
|
-
|
|
20
|
+
- *Scope*: สร้าง Subcommand `nexus-devflow mcp` เปิด JSON-RPC Server พร้อมเครื่องมือ Typed Tools (`update_task`, `record_finding`, `get_stage_context`) ด้วย Zod Schema Validation
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 🌿 Phase 3: Branch-Scoped Context Isolation
|
|
25
|
+
|
|
26
|
+
- [x] **3. Branch-Scoped Context Isolation & Dynamic Router** `[Size: M]`
|
|
17
27
|
- *Dependencies*: Feature 2
|
|
18
|
-
- *Scope*:
|
|
28
|
+
- *Scope*: แยกจัดเก็บ State ตาม Git Branch ใน `.nexus/branches/<branch-name>/`, ระบบ Canonical Dynamic Router สำหรับ AI Agent และระบบ Auto-Cleanup หลัง `/complete`
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ✂️ Phase 4: JIT Context Slicing & Token Optimizer
|
|
33
|
+
|
|
34
|
+
- [x] **4. Just-In-Time (JIT) Dynamic Context Slicing Engine** `[Size: M]`
|
|
35
|
+
- *Dependencies*: Feature 3
|
|
36
|
+
- *Scope*: สร้างตัวตัดตอนบริบท (Context Slicer) สำหรับสคิล `/implement`, `/check`, `/00-explore` เพื่อส่งเฉพาะข้อมูลที่จำเป็นและควบคุม Token Budget ลดการใช้ Token 60–70%
|
|
19
37
|
|
|
20
38
|
---
|
|
21
39
|
|
|
22
|
-
##
|
|
40
|
+
## 🔄 Phase 5: State Drift Detection & Self-Healing
|
|
23
41
|
|
|
24
|
-
- [
|
|
25
|
-
- *Dependencies*: Phase 1
|
|
26
|
-
- *Scope*: Wire up `nexus-devflow check-gate`, GitHub Actions workflows, and pre-commit hooks.
|
|
27
|
-
- [ ] **5. External Services & Tooling** `[Size: L]`
|
|
42
|
+
- [x] **5. Git Diff Drift Reconciler & Self-Healing State Engine** `[Size: M]`
|
|
28
43
|
- *Dependencies*: Feature 4
|
|
29
|
-
- *Scope*:
|
|
44
|
+
- *Scope*: ตรวจจับความไม่สอดคล้องระหว่าง `git diff` กับรายการไฟล์ใน Living Spec พร้อมระบบแจ้งเตือนและ Auto-Reconcile ซิงค์สถานะอัตโนมัติ
|
|
30
45
|
|
|
31
46
|
---
|
|
32
47
|
|
|
33
|
-
##
|
|
48
|
+
## 🖥️ Phase 6: IDE Native Extension & Visual Studio
|
|
49
|
+
|
|
50
|
+
- [x] **6. IDE Native Extension & Interactive Webview Studio** `[Size: L]`
|
|
51
|
+
- *Dependencies*: Feature 5
|
|
52
|
+
- *Scope*: พัฒนา Extension สำหรับ VS Code / Antigravity Webview เพื่อแสดง Live Kanban Board, ปุ่มกดรันคำสั่ง DevFlow และ Diff Inspector ในตัว IDE
|
|
53
|
+
|
|
34
54
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🤖 Phase 7: Multi-Agent Swarm Orchestration & Code Graph RAG
|
|
58
|
+
|
|
59
|
+
- [x] **7. Multi-Agent Swarm Orchestrator & Semantic Code Graph RAG** `[Size: L]`
|
|
39
60
|
- *Dependencies*: Feature 6
|
|
40
|
-
- *Scope*:
|
|
61
|
+
- *Scope*: พัฒนาระบบกระจายงานแบบคู่ขนานให้ Subagents (Coder, QA Verifier, Security Auditor) และระบบ Indexing Local Codebase Graph เพื่อดึงบริบทที่แม่นยำสูงสุด
|
|
62
|
+
|