@jakkrichm/create-nexus-devflow 2.0.27 → 2.2.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 +247 -4
- 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/project-metadata.d.ts +1 -1
- package/dist/lib/project-metadata.js +3 -2
- package/dist/lib/project-metadata.js.map +1 -1
- 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/update.js +7 -3
- package/dist/lib/update.js.map +1 -1
- 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/.agents/skills/adopt/SKILL.md +58 -5
- package/template/.agents/skills/doctor/SKILL.md +23 -16
- package/template/.agents/skills/implement/SKILL.md +2 -2
- package/template/.agents/skills/onboard/SKILL.md +18 -17
- package/template/.agents/skills/rollback/SKILL.md +1 -1
- package/template/.claude/skills/00-explore/SKILL.md +2 -2
- package/template/.claude/skills/10-define/SKILL.md +2 -2
- package/template/.claude/skills/20-spec/SKILL.md +1 -2
- package/template/.claude/skills/30-plan/SKILL.md +1 -2
- package/template/.claude/skills/40-execute/SKILL.md +2 -2
- package/template/.claude/skills/50-verify/SKILL.md +2 -2
- package/template/.claude/skills/60-report/SKILL.md +2 -2
- package/template/.claude/skills/70-deliver/SKILL.md +2 -2
- package/template/.claude/skills/adopt/SKILL.md +191 -75
- package/template/.claude/skills/audit/SKILL.md +267 -133
- package/template/.claude/skills/autopilot/SKILL.md +226 -167
- package/template/.claude/skills/brainstorm/SKILL.md +62 -0
- package/template/.claude/skills/brief/SKILL.md +93 -92
- package/template/.claude/skills/check/SKILL.md +96 -76
- package/template/.claude/skills/ci/SKILL.md +140 -61
- package/template/.claude/skills/complete/SKILL.md +156 -101
- package/template/.claude/skills/convert-any-to-md/SKILL.md +2 -2
- package/template/.claude/skills/convert-any-to-md/references/setup.md +29 -0
- package/template/.claude/skills/convert-any-to-md/scripts/convert_any_to_md.py +487 -0
- package/template/.claude/skills/convert-any-to-md/scripts/requirements.txt +3 -0
- package/template/.claude/skills/debug/SKILL.md +124 -49
- package/template/.claude/skills/devflow/SKILL.md +9 -3
- package/template/.claude/skills/discovery/SKILL.md +150 -129
- package/template/.claude/skills/doctor/SKILL.md +195 -72
- package/template/.claude/skills/feature/SKILL.md +195 -151
- package/template/.claude/skills/fix/SKILL.md +41 -90
- package/template/.claude/skills/idea/SKILL.md +2 -2
- package/template/.claude/skills/implement/SKILL.md +189 -46
- package/template/.claude/skills/onboard/SKILL.md +216 -85
- package/template/.claude/skills/overview/SKILL.md +44 -29
- package/template/.claude/skills/prototype/SKILL.md +82 -27
- package/template/.claude/skills/release/SKILL.md +119 -130
- package/template/.claude/skills/report-html/SKILL.md +2 -2
- package/template/.claude/skills/rollback/SKILL.md +123 -77
- package/template/.claude/skills/status/SKILL.md +109 -0
- package/template/.claude/skills/test/SKILL.md +2 -2
- package/template/.claude/skills/tests/SKILL.md +126 -0
- package/template/.claude/skills/try/SKILL.md +77 -65
- package/template/AGENTS.md +2 -1
- package/template/devflow/build-plan.md +50 -20
- package/template/devflow/history/features/README.md +5 -0
- package/template/devflow/history/fixes/README.md +5 -0
- package/template/devflow/history/rollbacks/README.md +5 -0
- 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,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: adopt
|
|
3
|
-
description: "[devflow][B] Bring the blueprint into an existing (brownfield) codebase. Surveys the real repo, interviews for intent, generates the owned plans and coding standards, documents existing verification and CI, and points to the optional standalone CI setup. Use when the user runs /adopt, is overlaying the blueprint onto an app that already has meaningful code, or asks to adopt or bootstrap the workflow into an existing project. For freshly scaffolded or early projects, use onboard instead."
|
|
3
|
+
description: "[devflow][B] Bring the blueprint into an existing (brownfield) codebase. Surveys the real repo, interviews for intent, generates the owned plans and coding standards, documents existing verification and CI, asks whether DevFlow workflow files should be committed or kept local-only, and points to the optional standalone CI setup. Use when the user runs /adopt, is overlaying the blueprint onto an app that already has meaningful code, or asks to adopt or bootstrap the workflow into an existing project. For freshly scaffolded or early projects, use onboard instead."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# adopt - bootstrap the blueprint from an existing codebase
|
|
@@ -42,9 +42,9 @@ Protect the project README:
|
|
|
42
42
|
|
|
43
43
|
- If the root `README.md` already looks like a real project README, leave it
|
|
44
44
|
alone.
|
|
45
|
-
- If the root `README.md` is the copied
|
|
45
|
+
- If the root `README.md` is the copied DevFlow workflow doc (for example it
|
|
46
46
|
starts with `# AI Coding Blueprint`), report it as obsolete overlay content
|
|
47
|
-
and ask before replacing or removing it. Do not move it into `
|
|
47
|
+
and ask before replacing or removing it. Do not move it into `devflow/`.
|
|
48
48
|
- Do not create or overwrite a root project README for a brownfield app unless
|
|
49
49
|
the user explicitly asks. The existing project face belongs to the app, not the
|
|
50
50
|
workflow.
|
|
@@ -124,7 +124,54 @@ Run /ci or $ci when you want automatic GitHub checks.
|
|
|
124
124
|
Explain that CI is not required to finish adoption. The `/ci` skill owns
|
|
125
125
|
project-specific Verify and GitHub workflow setup.
|
|
126
126
|
|
|
127
|
-
## Step 5 -
|
|
127
|
+
## Step 5 - ask about DevFlow visibility
|
|
128
|
+
|
|
129
|
+
Ask how the DevFlow workflow files should be handled in git, unless the user
|
|
130
|
+
already gave a preference:
|
|
131
|
+
|
|
132
|
+
```text
|
|
133
|
+
DevFlow visibility?
|
|
134
|
+
|
|
135
|
+
1. Commit DevFlow workflow files
|
|
136
|
+
Portable. Best for teams and working across machines.
|
|
137
|
+
|
|
138
|
+
2. Keep DevFlow workflow files local
|
|
139
|
+
Adds .agents/, .claude/, devflow/, and CLAUDE.md to .gitignore.
|
|
140
|
+
Keeps AGENTS.md public as the lightweight project agent guide.
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Recommend option 1 by default. If the user chooses option 2:
|
|
144
|
+
|
|
145
|
+
- Add this block to `.gitignore`, preserving existing entries:
|
|
146
|
+
|
|
147
|
+
```gitignore
|
|
148
|
+
# DevFlow local workflow files
|
|
149
|
+
.agents/
|
|
150
|
+
.claude/
|
|
151
|
+
devflow/
|
|
152
|
+
CLAUDE.md
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- Keep `AGENTS.md` tracked. It remains the lightweight public project guide for
|
|
156
|
+
commands and conventions.
|
|
157
|
+
- Make `AGENTS.md` public-safe: keep project description, commands, testing gate,
|
|
158
|
+
and coding conventions, but remove or avoid DevFlow workflow explanations,
|
|
159
|
+
hidden adapter paths, workflow-document pointers, and core skill lists that
|
|
160
|
+
would expose the local-only workflow.
|
|
161
|
+
- Explain that local-only mode hides the workflow contents from the repo, but the
|
|
162
|
+
`.gitignore` names still reveal the ignored paths.
|
|
163
|
+
- Explain that DevFlow state, specs, findings, and history will not travel
|
|
164
|
+
with the repo; another machine needs DevFlow reinstalled or restored
|
|
165
|
+
locally.
|
|
166
|
+
- Because adoption runs right after the DevFlow files were added to an
|
|
167
|
+
existing repository, they are more likely to already be staged or committed
|
|
168
|
+
than in a fresh install. If any of `.agents/`, `.claude/`, `devflow/`, or
|
|
169
|
+
`CLAUDE.md` are already tracked, say `.gitignore` will not hide tracked files.
|
|
170
|
+
Ask before running
|
|
171
|
+
`git rm --cached -r .agents .claude devflow CLAUDE.md`, and
|
|
172
|
+
only run it if the user explicitly approves. Never delete the local files.
|
|
173
|
+
|
|
174
|
+
## Step 6 - review gate, then hand off
|
|
128
175
|
|
|
129
176
|
Stop and show the user what you generated, calling out:
|
|
130
177
|
|
|
@@ -132,7 +179,9 @@ Stop and show the user what you generated, calling out:
|
|
|
132
179
|
judgment most worth their eyes,
|
|
133
180
|
- every `> TODO (confirm)` you left,
|
|
134
181
|
- anything the survey and the interview disagreed on,
|
|
135
|
-
- verification command and GitHub checks status
|
|
182
|
+
- verification command and GitHub checks status,
|
|
183
|
+
- DevFlow visibility choice, and a tracked-file warning if local-only mode was
|
|
184
|
+
chosen after files were already tracked.
|
|
136
185
|
|
|
137
186
|
These files are the ones the user *owns*. Have them review and adjust, then tell
|
|
138
187
|
them to run `/overview` to distill the plans into `project-overview.md` and start
|
|
@@ -150,6 +199,10 @@ the normal loop.
|
|
|
150
199
|
before touching them. Never run a scaffolder.
|
|
151
200
|
- **Be honest about testing.** If there's no runner, say testing is opt-in and not
|
|
152
201
|
yet set up; don't describe a gate the project hasn't adopted.
|
|
202
|
+
- Keep `AGENTS.md` public in local-only mode unless the user explicitly asks for
|
|
203
|
+
a more advanced setup.
|
|
204
|
+
- Do not untrack DevFlow files with `git rm --cached` without a separate
|
|
205
|
+
explicit approval.
|
|
153
206
|
|
|
154
207
|
## Formatting
|
|
155
208
|
|