@yemi33/minions 0.1.230 → 0.1.232
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/CHANGELOG.md +10 -0
- package/dashboard/js/render-work-items.js +2 -2
- package/dashboard.js +2 -42
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -46,7 +46,7 @@ function wiRow(item) {
|
|
|
46
46
|
'<td>' + typeBadge(item.type) + '</td>' +
|
|
47
47
|
'<td>' + priBadge(item.priority) + '</td>' +
|
|
48
48
|
'<td>' + statusBadge(item.status || 'pending') +
|
|
49
|
-
(item._pendingReason ? ' <span style="font-size:9px;color:var(--muted);margin-left:4px" title="Pending reason: ' + escHtml(item._pendingReason) + '">' + escHtml(item._pendingReason.replace(/_/g, ' ')) + '</span>' : '') +
|
|
49
|
+
(item._pendingReason && item.status === 'pending' ? ' <span style="font-size:9px;color:var(--muted);margin-left:4px" title="Pending reason: ' + escHtml(item._pendingReason) + '">' + escHtml(item._pendingReason.replace(/_/g, ' ')) + '</span>' : '') +
|
|
50
50
|
(item.status === 'failed' ? ' ' + wiRetryBtn(item) : '') +
|
|
51
51
|
'</td>' +
|
|
52
52
|
'<td>' +
|
|
@@ -430,7 +430,7 @@ function openWorkItemDetail(id) {
|
|
|
430
430
|
if (item.dispatched_at) html += field('Dispatched', escHtml(new Date(item.dispatched_at).toLocaleString()) + ' to ' + escHtml(item.dispatched_to || '?'));
|
|
431
431
|
if (item.completedAt) html += field('Completed', escHtml(new Date(item.completedAt).toLocaleString()));
|
|
432
432
|
if (item.failReason) html += field('Failure Reason', '<span style="color:var(--red)">' + escHtml(item.failReason) + '</span>');
|
|
433
|
-
if (item._pendingReason) html += field('Pending Reason', escHtml(item._pendingReason.replace(/_/g, ' ')));
|
|
433
|
+
if (item._pendingReason && item.status === 'pending') html += field('Pending Reason', escHtml(item._pendingReason.replace(/_/g, ' ')));
|
|
434
434
|
if (item.depends_on?.length) html += field('Depends On', item.depends_on.map(d => '<code>' + escHtml(d) + '</code>').join(', '));
|
|
435
435
|
if (item.acceptanceCriteria?.length) html += field('Acceptance Criteria', '<ul style="margin:0;padding-left:20px">' + item.acceptanceCriteria.map(c => '<li>' + escHtml(c) + '</li>').join('') + '</ul>');
|
|
436
436
|
if (item.references?.length) html += field('References', item.references.map(r => '<a href="' + escHtml(r.url) + '" target="_blank" style="color:var(--blue)">' + escHtml(r.title || r.url) + '</a>' + (r.type ? ' <span style="color:var(--muted);font-size:10px">(' + escHtml(r.type) + ')</span>' : '')).join('<br>'));
|
package/dashboard.js
CHANGED
|
@@ -1672,45 +1672,6 @@ If nothing to do: { "duplicates": [], "reclassify": [], "remove": [] }`;
|
|
|
1672
1672
|
return jsonReply(res, 200, plans);
|
|
1673
1673
|
}
|
|
1674
1674
|
|
|
1675
|
-
async function handlePlansArchiveMove(req, res) {
|
|
1676
|
-
try {
|
|
1677
|
-
const body = await readBody(req);
|
|
1678
|
-
if (!body.file) return jsonReply(res, 400, { error: 'file required' });
|
|
1679
|
-
const file = body.file;
|
|
1680
|
-
if (file.includes('..') || file.includes('\0') || file.includes('/') || file.includes('\\')) return jsonReply(res, 400, { error: 'invalid' });
|
|
1681
|
-
|
|
1682
|
-
const isJson = file.endsWith('.json');
|
|
1683
|
-
const sourceDir = isJson ? PRD_DIR : PLANS_DIR;
|
|
1684
|
-
const archiveDir = path.join(sourceDir, 'archive');
|
|
1685
|
-
const sourcePath = path.join(sourceDir, file);
|
|
1686
|
-
|
|
1687
|
-
if (!fs.existsSync(sourcePath)) return jsonReply(res, 404, { error: 'File not found' });
|
|
1688
|
-
if (!fs.existsSync(archiveDir)) fs.mkdirSync(archiveDir, { recursive: true });
|
|
1689
|
-
|
|
1690
|
-
fs.renameSync(sourcePath, path.join(archiveDir, file));
|
|
1691
|
-
|
|
1692
|
-
// If archiving a PRD .json, also archive its source .md plan
|
|
1693
|
-
let archivedSource = null;
|
|
1694
|
-
if (isJson) {
|
|
1695
|
-
try {
|
|
1696
|
-
const prd = safeJson(path.join(archiveDir, file));
|
|
1697
|
-
if (prd?.source_plan) {
|
|
1698
|
-
const mdPath = path.join(PLANS_DIR, prd.source_plan);
|
|
1699
|
-
if (fs.existsSync(mdPath)) {
|
|
1700
|
-
const planArchive = path.join(PLANS_DIR, 'archive');
|
|
1701
|
-
if (!fs.existsSync(planArchive)) fs.mkdirSync(planArchive, { recursive: true });
|
|
1702
|
-
fs.renameSync(mdPath, path.join(planArchive, prd.source_plan));
|
|
1703
|
-
archivedSource = prd.source_plan;
|
|
1704
|
-
}
|
|
1705
|
-
}
|
|
1706
|
-
} catch { /* optional — source plan may not exist */ }
|
|
1707
|
-
}
|
|
1708
|
-
|
|
1709
|
-
invalidateStatusCache();
|
|
1710
|
-
return jsonReply(res, 200, { ok: true, archivedSource });
|
|
1711
|
-
} catch (e) { return jsonReply(res, 400, { error: e.message }); }
|
|
1712
|
-
}
|
|
1713
|
-
|
|
1714
1675
|
async function handlePlansUnarchive(req, res) {
|
|
1715
1676
|
try {
|
|
1716
1677
|
const body = await readBody(req);
|
|
@@ -2988,8 +2949,9 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
2988
2949
|
|
|
2989
2950
|
if (result.code !== 0 || !result.text) {
|
|
2990
2951
|
const debugInfo = result.code !== 0 ? `(exit code ${result.code})` : '(empty response)';
|
|
2991
|
-
const stderrTail = (result.stderr || '').trim().split('\n').filter(Boolean).slice(-
|
|
2952
|
+
const stderrTail = (result.stderr || '').trim().split('\n').filter(Boolean).slice(-5).join(' | ');
|
|
2992
2953
|
console.error(`[CC] LLM failed after retries ${debugInfo}: ${stderrTail}`);
|
|
2954
|
+
try { shared.log('warn', `CC failed ${debugInfo}: ${stderrTail.slice(0, 300)}`); } catch {}
|
|
2993
2955
|
const hasSession = !!ccSession.sessionId;
|
|
2994
2956
|
const retryHint = hasSession
|
|
2995
2957
|
? 'Your session is still active — just send your message again to retry.'
|
|
@@ -3354,8 +3316,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3354
3316
|
{ method: 'POST', path: '/api/plans/unarchive', desc: 'Restore a plan/PRD from archive', params: 'file', handler: handlePlansUnarchive },
|
|
3355
3317
|
{ method: 'POST', path: '/api/plans/revise', desc: 'Request revision with feedback, dispatches agent to revise', params: 'file, feedback, requestedBy?', handler: handlePlansRevise },
|
|
3356
3318
|
{ method: 'POST', path: '/api/plans/discuss', desc: 'Generate a plan discussion session script for Claude CLI', params: 'file', handler: handlePlansDiscuss },
|
|
3357
|
-
{ method: 'POST', path: '/api/plans/archive', desc: 'Archive a plan/PRD (move to archive folder)', params: 'file', handler: handlePlansArchiveMove },
|
|
3358
|
-
{ method: 'POST', path: '/api/plans/unarchive', desc: 'Unarchive a plan/PRD (restore from archive folder)', params: 'file', handler: handlePlansUnarchive },
|
|
3359
3319
|
{ method: 'GET', path: /^\/api\/plans\/archive\/([^?]+)$/, desc: 'Read an archived plan file', handler: handlePlansArchiveRead },
|
|
3360
3320
|
{ method: 'GET', path: /^\/api\/plans\/([^?]+)$/, desc: 'Read a full plan (JSON from prd/ or markdown from plans/)', handler: handlePlansRead },
|
|
3361
3321
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.232",
|
|
4
4
|
"description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
|
|
5
5
|
"bin": {
|
|
6
6
|
"minions": "bin/minions.js"
|