agileflow 2.76.0 → 2.78.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 +3 -3
- package/package.json +6 -1
- package/scripts/agileflow-configure.js +185 -13
- package/scripts/agileflow-statusline.sh +266 -27
- package/scripts/agileflow-welcome.js +160 -52
- package/scripts/auto-self-improve.js +63 -20
- package/scripts/check-update.js +1 -4
- package/scripts/damage-control-bash.js +232 -0
- package/scripts/damage-control-edit.js +243 -0
- package/scripts/damage-control-write.js +243 -0
- package/scripts/get-env.js +15 -7
- package/scripts/lib/frontmatter-parser.js +4 -1
- package/scripts/obtain-context.js +59 -48
- package/scripts/ralph-loop.js +25 -13
- package/scripts/validate-expertise.sh +19 -15
- package/src/core/agents/accessibility.md +124 -53
- package/src/core/agents/adr-writer.md +192 -52
- package/src/core/agents/analytics.md +139 -60
- package/src/core/agents/api.md +173 -63
- package/src/core/agents/ci.md +139 -57
- package/src/core/agents/compliance.md +159 -68
- package/src/core/agents/configuration/damage-control.md +356 -0
- package/src/core/agents/database.md +162 -61
- package/src/core/agents/datamigration.md +179 -66
- package/src/core/agents/design.md +179 -57
- package/src/core/agents/devops.md +160 -3
- package/src/core/agents/documentation.md +204 -60
- package/src/core/agents/epic-planner.md +147 -55
- package/src/core/agents/integrations.md +197 -69
- package/src/core/agents/mentor.md +158 -57
- package/src/core/agents/mobile.md +159 -67
- package/src/core/agents/monitoring.md +154 -65
- package/src/core/agents/multi-expert.md +115 -43
- package/src/core/agents/orchestrator.md +77 -24
- package/src/core/agents/performance.md +130 -75
- package/src/core/agents/product.md +151 -55
- package/src/core/agents/qa.md +162 -74
- package/src/core/agents/readme-updater.md +178 -76
- package/src/core/agents/refactor.md +148 -95
- package/src/core/agents/research.md +143 -72
- package/src/core/agents/security.md +154 -65
- package/src/core/agents/testing.md +176 -97
- package/src/core/agents/ui.md +170 -79
- package/src/core/commands/adr/list.md +171 -0
- package/src/core/commands/adr/update.md +235 -0
- package/src/core/commands/adr/view.md +252 -0
- package/src/core/commands/adr.md +207 -50
- package/src/core/commands/agent.md +16 -0
- package/src/core/commands/assign.md +148 -44
- package/src/core/commands/auto.md +18 -1
- package/src/core/commands/babysit.md +361 -36
- package/src/core/commands/baseline.md +14 -0
- package/src/core/commands/blockers.md +170 -51
- package/src/core/commands/board.md +144 -66
- package/src/core/commands/changelog.md +15 -0
- package/src/core/commands/ci.md +179 -69
- package/src/core/commands/compress.md +18 -0
- package/src/core/commands/configure.md +16 -0
- package/src/core/commands/context/export.md +193 -4
- package/src/core/commands/context/full.md +191 -18
- package/src/core/commands/context/note.md +248 -4
- package/src/core/commands/debt.md +17 -0
- package/src/core/commands/deploy.md +208 -65
- package/src/core/commands/deps.md +15 -0
- package/src/core/commands/diagnose.md +16 -0
- package/src/core/commands/docs.md +196 -64
- package/src/core/commands/epic/list.md +170 -0
- package/src/core/commands/epic/view.md +242 -0
- package/src/core/commands/epic.md +192 -69
- package/src/core/commands/feedback.md +191 -71
- package/src/core/commands/handoff.md +162 -48
- package/src/core/commands/help.md +9 -0
- package/src/core/commands/ideate.md +446 -0
- package/src/core/commands/impact.md +16 -0
- package/src/core/commands/metrics.md +141 -37
- package/src/core/commands/multi-expert.md +77 -0
- package/src/core/commands/packages.md +16 -0
- package/src/core/commands/pr.md +161 -67
- package/src/core/commands/readme-sync.md +16 -0
- package/src/core/commands/research/analyze.md +568 -0
- package/src/core/commands/research/ask.md +345 -20
- package/src/core/commands/research/import.md +562 -19
- package/src/core/commands/research/list.md +173 -5
- package/src/core/commands/research/view.md +181 -8
- package/src/core/commands/retro.md +135 -48
- package/src/core/commands/review.md +219 -47
- package/src/core/commands/session/end.md +209 -0
- package/src/core/commands/session/history.md +210 -0
- package/src/core/commands/session/init.md +116 -0
- package/src/core/commands/session/new.md +296 -0
- package/src/core/commands/session/resume.md +166 -0
- package/src/core/commands/session/status.md +166 -0
- package/src/core/commands/skill/create.md +115 -17
- package/src/core/commands/skill/delete.md +117 -0
- package/src/core/commands/skill/edit.md +104 -0
- package/src/core/commands/skill/list.md +128 -0
- package/src/core/commands/skill/test.md +135 -0
- package/src/core/commands/skill/upgrade.md +542 -0
- package/src/core/commands/sprint.md +17 -1
- package/src/core/commands/status.md +133 -21
- package/src/core/commands/story/list.md +176 -0
- package/src/core/commands/story/view.md +265 -0
- package/src/core/commands/story-validate.md +101 -1
- package/src/core/commands/story.md +204 -51
- package/src/core/commands/template.md +16 -1
- package/src/core/commands/tests.md +226 -64
- package/src/core/commands/update.md +17 -1
- package/src/core/commands/validate-expertise.md +16 -0
- package/src/core/commands/velocity.md +140 -36
- package/src/core/commands/verify.md +14 -0
- package/src/core/commands/whats-new.md +30 -0
- package/src/core/skills/_learnings/README.md +91 -0
- package/src/core/skills/_learnings/_template.yaml +106 -0
- package/src/core/skills/_learnings/commit.yaml +69 -0
- package/src/core/templates/damage-control-patterns.yaml +234 -0
- package/src/core/templates/skill-template.md +53 -11
- package/tools/cli/commands/list.js +3 -1
- package/tools/cli/commands/start.js +180 -0
- package/tools/cli/commands/uninstall.js +4 -5
- package/tools/cli/commands/update.js +11 -3
- package/tools/cli/lib/content-injector.js +6 -1
- package/tools/cli/tui/Dashboard.js +66 -0
- package/tools/cli/tui/StoryList.js +69 -0
- package/tools/cli/tui/index.js +16 -0
package/scripts/get-env.js
CHANGED
|
@@ -154,32 +154,40 @@ function formatOutput(info, asJson = false, compact = false) {
|
|
|
154
154
|
cyan: '\x1b[36m',
|
|
155
155
|
red: '\x1b[31m',
|
|
156
156
|
brand: '\x1b[38;2;232;104;58m', // #e8683a - AgileFlow brand orange
|
|
157
|
+
|
|
158
|
+
// Vibrant 256-color palette (modern, sleek look)
|
|
159
|
+
mintGreen: '\x1b[38;5;158m', // Healthy/success states
|
|
160
|
+
peach: '\x1b[38;5;215m', // Warning states
|
|
161
|
+
coral: '\x1b[38;5;203m', // Critical/error states
|
|
162
|
+
lightGreen: '\x1b[38;5;194m', // Session healthy
|
|
163
|
+
skyBlue: '\x1b[38;5;117m', // Directories/paths
|
|
164
|
+
lavender: '\x1b[38;5;147m', // Model info
|
|
157
165
|
};
|
|
158
166
|
|
|
159
|
-
// Beautiful compact colorful format
|
|
167
|
+
// Beautiful compact colorful format (using vibrant 256-color palette)
|
|
160
168
|
const lines = [];
|
|
161
169
|
|
|
162
170
|
// Header line with project info (brand color name, dim version, colored branch)
|
|
163
|
-
const branchColor = info.git.branch === 'main' ? c.
|
|
171
|
+
const branchColor = info.git.branch === 'main' ? c.mintGreen : c.skyBlue;
|
|
164
172
|
lines.push(
|
|
165
173
|
`${c.brand}${c.bold}${info.project.name}${c.reset} ${c.dim}v${info.project.version}${c.reset} | ${branchColor}${info.git.branch}${c.reset} ${c.dim}(${info.git.commit})${c.reset}`
|
|
166
174
|
);
|
|
167
175
|
|
|
168
|
-
// Status line (
|
|
169
|
-
const wipColor = info.agileflow.wipCount > 0 ? c.
|
|
176
|
+
// Status line (peach WIP, coral blocked)
|
|
177
|
+
const wipColor = info.agileflow.wipCount > 0 ? c.peach : c.dim;
|
|
170
178
|
let statusLine =
|
|
171
179
|
info.agileflow.wipCount > 0
|
|
172
180
|
? `${wipColor}WIP: ${info.agileflow.wipCount}${c.reset}`
|
|
173
181
|
: `${c.dim}No active work${c.reset}`;
|
|
174
182
|
if (info.agileflow.blockedCount > 0) {
|
|
175
|
-
statusLine += ` | ${c.
|
|
183
|
+
statusLine += ` | ${c.coral}Blocked: ${info.agileflow.blockedCount}${c.reset}`;
|
|
176
184
|
}
|
|
177
185
|
lines.push(statusLine);
|
|
178
186
|
|
|
179
|
-
// Active story (if any) - just the first one (blue label)
|
|
187
|
+
// Active story (if any) - just the first one (sky blue label)
|
|
180
188
|
if (info.agileflow.activeStories.length > 0) {
|
|
181
189
|
const story = info.agileflow.activeStories[0];
|
|
182
|
-
lines.push(`${c.
|
|
190
|
+
lines.push(`${c.skyBlue}Current:${c.reset} ${story.id} - ${story.title}`);
|
|
183
191
|
}
|
|
184
192
|
|
|
185
193
|
// Last commit (just one, dim)
|
|
@@ -69,7 +69,10 @@ function normalizeTools(tools) {
|
|
|
69
69
|
if (!tools) return [];
|
|
70
70
|
if (Array.isArray(tools)) return tools;
|
|
71
71
|
if (typeof tools === 'string') {
|
|
72
|
-
return tools
|
|
72
|
+
return tools
|
|
73
|
+
.split(',')
|
|
74
|
+
.map(t => t.trim())
|
|
75
|
+
.filter(Boolean);
|
|
73
76
|
}
|
|
74
77
|
return [];
|
|
75
78
|
}
|
|
@@ -55,6 +55,16 @@ const C = {
|
|
|
55
55
|
brightYellow: '\x1b[93m',
|
|
56
56
|
brightGreen: '\x1b[92m',
|
|
57
57
|
brand: '\x1b[38;2;232;104;58m', // AgileFlow brand orange
|
|
58
|
+
|
|
59
|
+
// Vibrant 256-color palette (modern, sleek look)
|
|
60
|
+
mintGreen: '\x1b[38;5;158m', // Healthy/success states
|
|
61
|
+
peach: '\x1b[38;5;215m', // Warning states
|
|
62
|
+
coral: '\x1b[38;5;203m', // Critical/error states
|
|
63
|
+
lightGreen: '\x1b[38;5;194m', // Session healthy
|
|
64
|
+
lightYellow: '\x1b[38;5;228m', // Session warning
|
|
65
|
+
skyBlue: '\x1b[38;5;117m', // Directories/paths
|
|
66
|
+
lavender: '\x1b[38;5;147m', // Model info
|
|
67
|
+
softGold: '\x1b[38;5;222m', // Cost/money
|
|
58
68
|
};
|
|
59
69
|
|
|
60
70
|
function safeRead(filePath) {
|
|
@@ -111,7 +121,7 @@ function generateSummary() {
|
|
|
111
121
|
|
|
112
122
|
const W = 58; // Total inner width (matches welcome script)
|
|
113
123
|
const L = 20; // Left column width
|
|
114
|
-
const R = W -
|
|
124
|
+
const R = W - 24; // Right column width (34 chars) - matches welcome
|
|
115
125
|
|
|
116
126
|
// Pad string to length, accounting for ANSI codes
|
|
117
127
|
function pad(str, len) {
|
|
@@ -155,11 +165,12 @@ function generateSummary() {
|
|
|
155
165
|
return `${C.dim}${box.v}${C.reset} ${pad(leftStr, L)} ${C.dim}${box.v}${C.reset} ${pad(rightStr, R)} ${C.dim}${box.v}${C.reset}\n`;
|
|
156
166
|
}
|
|
157
167
|
|
|
168
|
+
// All borders use same width formula: 22 dashes + separator + 36 dashes = 61 total chars
|
|
158
169
|
const divider = () =>
|
|
159
|
-
`${C.dim}${box.lT}${box.h.repeat(L + 2)}${box.cross}${box.h.repeat(
|
|
160
|
-
const headerTopBorder = `${C.dim}${box.tl}${box.h.repeat(
|
|
161
|
-
const headerDivider = `${C.dim}${box.lT}${box.h.repeat(L + 2)}${box.tT}${box.h.repeat(
|
|
162
|
-
const bottomBorder = `${C.dim}${box.bl}${box.h.repeat(L + 2)}${box.bT}${box.h.repeat(
|
|
170
|
+
`${C.dim}${box.lT}${box.h.repeat(L + 2)}${box.cross}${box.h.repeat(W - L - 2)}${box.rT}${C.reset}\n`;
|
|
171
|
+
const headerTopBorder = `${C.dim}${box.tl}${box.h.repeat(L + 2)}${box.tT}${box.h.repeat(W - L - 2)}${box.tr}${C.reset}\n`;
|
|
172
|
+
const headerDivider = `${C.dim}${box.lT}${box.h.repeat(L + 2)}${box.tT}${box.h.repeat(W - L - 2)}${box.rT}${C.reset}\n`;
|
|
173
|
+
const bottomBorder = `${C.dim}${box.bl}${box.h.repeat(L + 2)}${box.bT}${box.h.repeat(W - L - 2)}${box.br}${C.reset}\n`;
|
|
163
174
|
|
|
164
175
|
// Gather data
|
|
165
176
|
const branch = safeExec('git branch --show-current') || 'unknown';
|
|
@@ -200,35 +211,35 @@ function generateSummary() {
|
|
|
200
211
|
|
|
201
212
|
// Header row (full width, no column divider)
|
|
202
213
|
const title = commandName ? `Context [${commandName}]` : 'Context Summary';
|
|
203
|
-
const branchColor = branch === 'main' ? C.
|
|
214
|
+
const branchColor = branch === 'main' ? C.mintGreen : branch.startsWith('fix') ? C.coral : C.skyBlue;
|
|
204
215
|
const maxBranchLen = 20;
|
|
205
216
|
const branchDisplay =
|
|
206
217
|
branch.length > maxBranchLen ? branch.substring(0, maxBranchLen - 2) + '..' : branch;
|
|
207
218
|
const header = `${C.brand}${C.bold}${title}${C.reset} ${branchColor}${branchDisplay}${C.reset} ${C.dim}(${lastCommitShort})${C.reset}`;
|
|
208
|
-
summary += `${C.dim}${box.v}${C.reset} ${pad(header, W)} ${C.dim}${box.v}${C.reset}\n`;
|
|
219
|
+
summary += `${C.dim}${box.v}${C.reset} ${pad(header, W - 1)} ${C.dim}${box.v}${C.reset}\n`;
|
|
209
220
|
|
|
210
221
|
summary += headerDivider;
|
|
211
222
|
|
|
212
|
-
// Story counts with
|
|
223
|
+
// Story counts with vibrant 256-color palette
|
|
213
224
|
summary += row(
|
|
214
225
|
'In Progress',
|
|
215
226
|
byStatus['in-progress'] ? `${byStatus['in-progress']}` : '0',
|
|
216
|
-
C.
|
|
217
|
-
byStatus['in-progress'] ? C.
|
|
227
|
+
C.peach,
|
|
228
|
+
byStatus['in-progress'] ? C.peach : C.dim
|
|
218
229
|
);
|
|
219
230
|
summary += row(
|
|
220
231
|
'Blocked',
|
|
221
232
|
byStatus['blocked'] ? `${byStatus['blocked']}` : '0',
|
|
222
|
-
C.
|
|
223
|
-
byStatus['blocked'] ? C.
|
|
233
|
+
C.coral,
|
|
234
|
+
byStatus['blocked'] ? C.coral : C.dim
|
|
224
235
|
);
|
|
225
236
|
summary += row(
|
|
226
237
|
'Ready',
|
|
227
238
|
byStatus['ready'] ? `${byStatus['ready']}` : '0',
|
|
228
|
-
C.
|
|
229
|
-
byStatus['ready'] ? C.
|
|
239
|
+
C.skyBlue,
|
|
240
|
+
byStatus['ready'] ? C.skyBlue : C.dim
|
|
230
241
|
);
|
|
231
|
-
const completedColor = `${C.bold}${C.
|
|
242
|
+
const completedColor = `${C.bold}${C.mintGreen}`;
|
|
232
243
|
summary += row(
|
|
233
244
|
'Completed',
|
|
234
245
|
byStatus['done'] ? `${byStatus['done']}` : '0',
|
|
@@ -238,27 +249,27 @@ function generateSummary() {
|
|
|
238
249
|
|
|
239
250
|
summary += divider();
|
|
240
251
|
|
|
241
|
-
// Git status
|
|
252
|
+
// Git status (using vibrant 256-color palette)
|
|
242
253
|
const uncommittedStatus =
|
|
243
254
|
statusLines.length > 0 ? `${statusLines.length} uncommitted` : '✓ clean';
|
|
244
|
-
summary += row('Git', uncommittedStatus, C.blue, statusLines.length > 0 ? C.
|
|
255
|
+
summary += row('Git', uncommittedStatus, C.blue, statusLines.length > 0 ? C.peach : C.mintGreen);
|
|
245
256
|
|
|
246
257
|
// Session
|
|
247
258
|
const sessionText = sessionDuration !== null ? `${sessionDuration} min active` : 'no session';
|
|
248
|
-
summary += row('Session', sessionText, C.blue, sessionDuration !== null ? C.
|
|
259
|
+
summary += row('Session', sessionText, C.blue, sessionDuration !== null ? C.lightGreen : C.dim);
|
|
249
260
|
|
|
250
261
|
// Current story
|
|
251
262
|
const storyText = currentStory ? currentStory : 'none';
|
|
252
|
-
summary += row('Working on', storyText, C.blue, currentStory ? C.
|
|
263
|
+
summary += row('Working on', storyText, C.blue, currentStory ? C.lightYellow : C.dim);
|
|
253
264
|
|
|
254
265
|
// Ready stories (if any)
|
|
255
266
|
if (readyStories.length > 0) {
|
|
256
|
-
summary += row('⭐ Up Next', readyStories.slice(0, 3).join(', '), C.
|
|
267
|
+
summary += row('⭐ Up Next', readyStories.slice(0, 3).join(', '), C.skyBlue, C.skyBlue);
|
|
257
268
|
}
|
|
258
269
|
|
|
259
270
|
summary += divider();
|
|
260
271
|
|
|
261
|
-
// Key files
|
|
272
|
+
// Key files (using vibrant 256-color palette)
|
|
262
273
|
const keyFileChecks = [
|
|
263
274
|
{ path: 'CLAUDE.md', label: 'CLAUDE' },
|
|
264
275
|
{ path: 'README.md', label: 'README' },
|
|
@@ -268,31 +279,31 @@ function generateSummary() {
|
|
|
268
279
|
const keyFileStatus = keyFileChecks
|
|
269
280
|
.map(f => {
|
|
270
281
|
const exists = fs.existsSync(f.path);
|
|
271
|
-
return exists ? `${C.
|
|
282
|
+
return exists ? `${C.mintGreen}✓${C.reset}${f.label}` : `${C.dim}○${f.label}${C.reset}`;
|
|
272
283
|
})
|
|
273
284
|
.join(' ');
|
|
274
|
-
summary += row('Key files', keyFileStatus, C.
|
|
285
|
+
summary += row('Key files', keyFileStatus, C.lavender, '');
|
|
275
286
|
|
|
276
287
|
// Research
|
|
277
288
|
const researchText = researchFiles.length > 0 ? `${researchFiles.length} notes` : 'none';
|
|
278
|
-
summary += row('Research', researchText, C.
|
|
289
|
+
summary += row('Research', researchText, C.lavender, researchFiles.length > 0 ? C.skyBlue : C.dim);
|
|
279
290
|
|
|
280
291
|
// Epics
|
|
281
292
|
const epicText = epicFiles.length > 0 ? `${epicFiles.length} epics` : 'none';
|
|
282
|
-
summary += row('Epics', epicText, C.
|
|
293
|
+
summary += row('Epics', epicText, C.lavender, epicFiles.length > 0 ? C.skyBlue : C.dim);
|
|
283
294
|
|
|
284
295
|
summary += divider();
|
|
285
296
|
|
|
286
|
-
// Last commit
|
|
297
|
+
// Last commit (using vibrant 256-color palette)
|
|
287
298
|
summary += row(
|
|
288
299
|
'Last commit',
|
|
289
|
-
`${C.
|
|
300
|
+
`${C.peach}${lastCommitShort}${C.reset} ${lastCommitMsg}`,
|
|
290
301
|
C.dim,
|
|
291
302
|
''
|
|
292
303
|
);
|
|
293
304
|
|
|
294
305
|
summary += bottomBorder;
|
|
295
|
-
|
|
306
|
+
summary += '\n';
|
|
296
307
|
summary += `${C.dim}Full context continues below (Claude sees all)...${C.reset}\n\n`;
|
|
297
308
|
|
|
298
309
|
return summary;
|
|
@@ -306,29 +317,29 @@ function generateFullContent() {
|
|
|
306
317
|
let content = '';
|
|
307
318
|
|
|
308
319
|
const title = commandName ? `AgileFlow Context [${commandName}]` : 'AgileFlow Context';
|
|
309
|
-
content += `${C.
|
|
320
|
+
content += `${C.lavender}${C.bold}${title}${C.reset}\n`;
|
|
310
321
|
content += `${C.dim}Generated: ${new Date().toISOString()}${C.reset}\n`;
|
|
311
322
|
|
|
312
|
-
// 1. GIT STATUS
|
|
313
|
-
content += `\n${C.
|
|
323
|
+
// 1. GIT STATUS (using vibrant 256-color palette)
|
|
324
|
+
content += `\n${C.skyBlue}${C.bold}═══ Git Status ═══${C.reset}\n`;
|
|
314
325
|
const branch = safeExec('git branch --show-current') || 'unknown';
|
|
315
326
|
const status = safeExec('git status --short') || '';
|
|
316
327
|
const statusLines = status.split('\n').filter(Boolean);
|
|
317
328
|
const lastCommit = safeExec('git log -1 --format="%h %s"') || 'no commits';
|
|
318
329
|
|
|
319
|
-
content += `Branch: ${C.
|
|
330
|
+
content += `Branch: ${C.mintGreen}${branch}${C.reset}\n`;
|
|
320
331
|
content += `Last commit: ${C.dim}${lastCommit}${C.reset}\n`;
|
|
321
332
|
if (statusLines.length > 0) {
|
|
322
|
-
content += `Uncommitted: ${C.
|
|
333
|
+
content += `Uncommitted: ${C.peach}${statusLines.length} file(s)${C.reset}\n`;
|
|
323
334
|
statusLines.slice(0, 10).forEach(line => (content += ` ${C.dim}${line}${C.reset}\n`));
|
|
324
335
|
if (statusLines.length > 10)
|
|
325
336
|
content += ` ${C.dim}... and ${statusLines.length - 10} more${C.reset}\n`;
|
|
326
337
|
} else {
|
|
327
|
-
content += `Uncommitted: ${C.
|
|
338
|
+
content += `Uncommitted: ${C.mintGreen}clean${C.reset}\n`;
|
|
328
339
|
}
|
|
329
340
|
|
|
330
|
-
// 2. STATUS.JSON - Full Content
|
|
331
|
-
content += `\n${C.
|
|
341
|
+
// 2. STATUS.JSON - Full Content (using vibrant 256-color palette)
|
|
342
|
+
content += `\n${C.skyBlue}${C.bold}═══ Status.json (Full Content) ═══${C.reset}\n`;
|
|
332
343
|
const statusJsonPath = 'docs/09-agents/status.json';
|
|
333
344
|
const statusJson = safeReadJSON(statusJsonPath);
|
|
334
345
|
|
|
@@ -344,30 +355,30 @@ function generateFullContent() {
|
|
|
344
355
|
content += `${C.dim}No status.json found${C.reset}\n`;
|
|
345
356
|
}
|
|
346
357
|
|
|
347
|
-
// 3. SESSION STATE
|
|
348
|
-
content += `\n${C.
|
|
358
|
+
// 3. SESSION STATE (using vibrant 256-color palette)
|
|
359
|
+
content += `\n${C.skyBlue}${C.bold}═══ Session State ═══${C.reset}\n`;
|
|
349
360
|
const sessionState = safeReadJSON('docs/09-agents/session-state.json');
|
|
350
361
|
if (sessionState) {
|
|
351
362
|
const current = sessionState.current_session;
|
|
352
363
|
if (current && current.started_at) {
|
|
353
364
|
const started = new Date(current.started_at);
|
|
354
365
|
const duration = Math.round((Date.now() - started.getTime()) / 60000);
|
|
355
|
-
content += `Active session: ${C.
|
|
366
|
+
content += `Active session: ${C.lightGreen}${duration} min${C.reset}\n`;
|
|
356
367
|
if (current.current_story) {
|
|
357
|
-
content += `Working on: ${C.
|
|
368
|
+
content += `Working on: ${C.lightYellow}${current.current_story}${C.reset}\n`;
|
|
358
369
|
}
|
|
359
370
|
} else {
|
|
360
371
|
content += `${C.dim}No active session${C.reset}\n`;
|
|
361
372
|
}
|
|
362
373
|
if (sessionState.active_command) {
|
|
363
|
-
content += `Active command: ${C.
|
|
374
|
+
content += `Active command: ${C.skyBlue}${sessionState.active_command.name}${C.reset}\n`;
|
|
364
375
|
}
|
|
365
376
|
} else {
|
|
366
377
|
content += `${C.dim}No session-state.json found${C.reset}\n`;
|
|
367
378
|
}
|
|
368
379
|
|
|
369
|
-
// 4. DOCS STRUCTURE
|
|
370
|
-
content += `\n${C.
|
|
380
|
+
// 4. DOCS STRUCTURE (using vibrant 256-color palette)
|
|
381
|
+
content += `\n${C.skyBlue}${C.bold}═══ Documentation ═══${C.reset}\n`;
|
|
371
382
|
const docsDir = 'docs';
|
|
372
383
|
const docFolders = safeLs(docsDir).filter(f => {
|
|
373
384
|
try {
|
|
@@ -390,8 +401,8 @@ function generateFullContent() {
|
|
|
390
401
|
});
|
|
391
402
|
}
|
|
392
403
|
|
|
393
|
-
// 5. RESEARCH NOTES - List + Full content of most recent
|
|
394
|
-
content += `\n${C.
|
|
404
|
+
// 5. RESEARCH NOTES - List + Full content of most recent (using vibrant 256-color palette)
|
|
405
|
+
content += `\n${C.skyBlue}${C.bold}═══ Research Notes ═══${C.reset}\n`;
|
|
395
406
|
const researchDir = 'docs/10-research';
|
|
396
407
|
const researchFiles = safeLs(researchDir).filter(f => f.endsWith('.md') && f !== 'README.md');
|
|
397
408
|
if (researchFiles.length > 0) {
|
|
@@ -404,7 +415,7 @@ function generateFullContent() {
|
|
|
404
415
|
const mostRecentContent = safeRead(mostRecentPath);
|
|
405
416
|
|
|
406
417
|
if (mostRecentContent) {
|
|
407
|
-
content += `\n${C.
|
|
418
|
+
content += `\n${C.mintGreen}📄 Most Recent: ${mostRecentFile}${C.reset}\n`;
|
|
408
419
|
content += `${C.dim}${'─'.repeat(60)}${C.reset}\n`;
|
|
409
420
|
content += mostRecentContent + '\n';
|
|
410
421
|
content += `${C.dim}${'─'.repeat(60)}${C.reset}\n`;
|
|
@@ -413,8 +424,8 @@ function generateFullContent() {
|
|
|
413
424
|
content += `${C.dim}No research notes${C.reset}\n`;
|
|
414
425
|
}
|
|
415
426
|
|
|
416
|
-
// 6. BUS MESSAGES
|
|
417
|
-
content += `\n${C.
|
|
427
|
+
// 6. BUS MESSAGES (using vibrant 256-color palette)
|
|
428
|
+
content += `\n${C.skyBlue}${C.bold}═══ Recent Agent Messages ═══${C.reset}\n`;
|
|
418
429
|
const busPath = 'docs/09-agents/bus/log.jsonl';
|
|
419
430
|
const busContent = safeRead(busPath);
|
|
420
431
|
if (busContent) {
|
package/scripts/ralph-loop.js
CHANGED
|
@@ -136,9 +136,7 @@ function getNextStory(status, epicId, currentStoryId) {
|
|
|
136
136
|
// Get all stories in this epic that are ready
|
|
137
137
|
const readyStories = Object.entries(stories)
|
|
138
138
|
.filter(([id, story]) => {
|
|
139
|
-
return story.epic === epicId &&
|
|
140
|
-
story.status === 'ready' &&
|
|
141
|
-
id !== currentStoryId;
|
|
139
|
+
return story.epic === epicId && story.status === 'ready' && id !== currentStoryId;
|
|
142
140
|
})
|
|
143
141
|
.sort((a, b) => {
|
|
144
142
|
// Sort by story number if possible
|
|
@@ -215,9 +213,15 @@ function handleLoop(rootDir) {
|
|
|
215
213
|
const maxIterations = loop.max_iterations || 20;
|
|
216
214
|
|
|
217
215
|
console.log('');
|
|
218
|
-
console.log(
|
|
219
|
-
|
|
220
|
-
|
|
216
|
+
console.log(
|
|
217
|
+
`${c.brand}${c.bold}══════════════════════════════════════════════════════════${c.reset}`
|
|
218
|
+
);
|
|
219
|
+
console.log(
|
|
220
|
+
`${c.brand}${c.bold} RALPH LOOP - Iteration ${iteration}/${maxIterations}${c.reset}`
|
|
221
|
+
);
|
|
222
|
+
console.log(
|
|
223
|
+
`${c.brand}${c.bold}══════════════════════════════════════════════════════════${c.reset}`
|
|
224
|
+
);
|
|
221
225
|
console.log('');
|
|
222
226
|
|
|
223
227
|
// Check iteration limit
|
|
@@ -243,7 +247,9 @@ function handleLoop(rootDir) {
|
|
|
243
247
|
return;
|
|
244
248
|
}
|
|
245
249
|
|
|
246
|
-
console.log(
|
|
250
|
+
console.log(
|
|
251
|
+
`${c.cyan}Current Story:${c.reset} ${currentStoryId} - ${currentStory.title || 'Untitled'}`
|
|
252
|
+
);
|
|
247
253
|
console.log('');
|
|
248
254
|
|
|
249
255
|
// Run tests
|
|
@@ -283,11 +289,12 @@ function handleLoop(rootDir) {
|
|
|
283
289
|
criteria.slice(0, 3).forEach(ac => console.log(` • ${ac}`));
|
|
284
290
|
}
|
|
285
291
|
console.log('');
|
|
286
|
-
console.log(
|
|
292
|
+
console.log(
|
|
293
|
+
`${c.dim}Epic Progress: ${progress.completed}/${progress.total} stories complete${c.reset}`
|
|
294
|
+
);
|
|
287
295
|
console.log('');
|
|
288
296
|
console.log(`${c.brand}▶ Continue implementing ${nextStory.id}${c.reset}`);
|
|
289
297
|
console.log(`${c.dim} Run tests when ready. Loop will validate and continue.${c.reset}`);
|
|
290
|
-
|
|
291
298
|
} else {
|
|
292
299
|
// No more stories - epic complete!
|
|
293
300
|
const progress = getEpicProgress(getStatus(rootDir), epicId);
|
|
@@ -297,15 +304,18 @@ function handleLoop(rootDir) {
|
|
|
297
304
|
saveSessionState(rootDir, state);
|
|
298
305
|
|
|
299
306
|
console.log('');
|
|
300
|
-
console.log(
|
|
307
|
+
console.log(
|
|
308
|
+
`${c.green}${c.bold}════════════════════════════════════════════════════════${c.reset}`
|
|
309
|
+
);
|
|
301
310
|
console.log(`${c.green}${c.bold} 🎉 EPIC COMPLETE!${c.reset}`);
|
|
302
|
-
console.log(
|
|
311
|
+
console.log(
|
|
312
|
+
`${c.green}${c.bold}════════════════════════════════════════════════════════${c.reset}`
|
|
313
|
+
);
|
|
303
314
|
console.log('');
|
|
304
315
|
console.log(`${c.green}Epic ${epicId} finished in ${iteration} iterations${c.reset}`);
|
|
305
316
|
console.log(`${c.dim}${progress.completed} stories completed${c.reset}`);
|
|
306
317
|
console.log('');
|
|
307
318
|
}
|
|
308
|
-
|
|
309
319
|
} else {
|
|
310
320
|
// Tests failed - feed back to Claude
|
|
311
321
|
console.log(`${c.red}✗ Tests failed${c.reset} (${(testResult.duration / 1000).toFixed(1)}s)`);
|
|
@@ -440,7 +450,9 @@ function handleCLI() {
|
|
|
440
450
|
criteria.slice(0, 3).forEach(ac => console.log(` • ${ac}`));
|
|
441
451
|
}
|
|
442
452
|
console.log('');
|
|
443
|
-
console.log(
|
|
453
|
+
console.log(
|
|
454
|
+
`${c.dim}Work on this story. When you stop, tests will run automatically.${c.reset}`
|
|
455
|
+
);
|
|
444
456
|
console.log(`${c.dim}If tests pass, the next story will be loaded.${c.reset}`);
|
|
445
457
|
console.log('');
|
|
446
458
|
|
|
@@ -22,12 +22,16 @@
|
|
|
22
22
|
|
|
23
23
|
set -e
|
|
24
24
|
|
|
25
|
-
# Colors
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
GREEN='\033[0;32m'
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
# Colors (using vibrant 256-color palette)
|
|
26
|
+
NC='\033[0m' # No Color / Reset
|
|
27
|
+
RED='\033[0;31m' # Standard red (fallback)
|
|
28
|
+
GREEN='\033[0;32m' # Standard green (fallback)
|
|
29
|
+
|
|
30
|
+
# Vibrant 256-color palette
|
|
31
|
+
MINT_GREEN='\033[38;5;158m' # Healthy/success states
|
|
32
|
+
PEACH='\033[38;5;215m' # Warning states
|
|
33
|
+
CORAL='\033[38;5;203m' # Critical/error states
|
|
34
|
+
SKY_BLUE='\033[38;5;117m' # Headers/titles
|
|
31
35
|
|
|
32
36
|
# Configuration
|
|
33
37
|
EXPERTS_DIR="packages/cli/src/core/experts"
|
|
@@ -180,18 +184,18 @@ validate_expertise() {
|
|
|
180
184
|
fi
|
|
181
185
|
fi
|
|
182
186
|
|
|
183
|
-
# Output result
|
|
187
|
+
# Output result (using vibrant 256-color palette)
|
|
184
188
|
case "$status" in
|
|
185
189
|
PASS)
|
|
186
|
-
echo -e "${
|
|
190
|
+
echo -e "${MINT_GREEN}PASS${NC} $domain"
|
|
187
191
|
PASSED=$((PASSED + 1))
|
|
188
192
|
;;
|
|
189
193
|
WARN)
|
|
190
|
-
echo -e "${
|
|
194
|
+
echo -e "${PEACH}WARN${NC} $domain - ${issues[*]}"
|
|
191
195
|
WARNINGS=$((WARNINGS + 1))
|
|
192
196
|
;;
|
|
193
197
|
FAIL)
|
|
194
|
-
echo -e "${
|
|
198
|
+
echo -e "${CORAL}FAIL${NC} $domain - ${issues[*]}"
|
|
195
199
|
FAILED=$((FAILED + 1))
|
|
196
200
|
;;
|
|
197
201
|
esac
|
|
@@ -212,12 +216,12 @@ main() {
|
|
|
212
216
|
|
|
213
217
|
# Check experts directory exists
|
|
214
218
|
if [ ! -d "$EXPERTS_DIR" ]; then
|
|
215
|
-
echo -e "${
|
|
219
|
+
echo -e "${CORAL}Error:${NC} Experts directory not found: $EXPERTS_DIR"
|
|
216
220
|
echo "Are you running this from the repository root?"
|
|
217
221
|
exit 1
|
|
218
222
|
fi
|
|
219
223
|
|
|
220
|
-
echo -e "${
|
|
224
|
+
echo -e "${SKY_BLUE}Validating Agent Expert Files${NC}"
|
|
221
225
|
echo "================================"
|
|
222
226
|
echo ""
|
|
223
227
|
|
|
@@ -225,7 +229,7 @@ main() {
|
|
|
225
229
|
if [ -n "$1" ]; then
|
|
226
230
|
# Single domain
|
|
227
231
|
if [ ! -d "$EXPERTS_DIR/$1" ]; then
|
|
228
|
-
echo -e "${
|
|
232
|
+
echo -e "${CORAL}Error:${NC} Domain not found: $1"
|
|
229
233
|
echo "Available domains:"
|
|
230
234
|
ls -1 "$EXPERTS_DIR" | grep -v templates | grep -v README
|
|
231
235
|
exit 1
|
|
@@ -244,10 +248,10 @@ main() {
|
|
|
244
248
|
done
|
|
245
249
|
fi
|
|
246
250
|
|
|
247
|
-
# Summary
|
|
251
|
+
# Summary (using vibrant 256-color palette)
|
|
248
252
|
echo ""
|
|
249
253
|
echo "================================"
|
|
250
|
-
echo -e "Total: $TOTAL | ${
|
|
254
|
+
echo -e "Total: $TOTAL | ${MINT_GREEN}Passed: $PASSED${NC} | ${PEACH}Warnings: $WARNINGS${NC} | ${CORAL}Failed: $FAILED${NC}"
|
|
251
255
|
|
|
252
256
|
# Exit code
|
|
253
257
|
if [ "$FAILED" -gt 0 ]; then
|