@yemi33/minions 0.1.917 → 0.1.919
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 +4 -1
- package/dashboard/js/render-pipelines.js +12 -20
- package/dashboard/js/utils.js +21 -0
- package/dashboard/styles.css +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.919 (2026-04-13)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
6
|
- CC tab unread dot + reopened badge on work items
|
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
- add red dot notification on CC tab when response completes (#934) (#946)
|
|
19
19
|
|
|
20
20
|
### Fixes
|
|
21
|
+
- align CC tab unread dot to same position as working dot
|
|
22
|
+
- pipeline artifact links use pushModalBack instead of setTimeout race (#993)
|
|
23
|
+
- close unclosed code fences and lone backticks in renderMd (#991)
|
|
21
24
|
- PRD item status stuck at dispatched when fix completes (#989)
|
|
22
25
|
- dep merge ancestor pruning + pre-flight simulation (#958) (#979)
|
|
23
26
|
- add MAX_TURNS failure class and fix enum count test (#983)
|
|
@@ -64,43 +64,35 @@ function _renderMonitoredResources(resources, options) {
|
|
|
64
64
|
/**
|
|
65
65
|
* Render clickable artifact links for a pipeline stage.
|
|
66
66
|
* Each artifact type gets an icon and navigates to the relevant detail view.
|
|
67
|
+
* @param {Object} artifacts - artifact map from stage run
|
|
68
|
+
* @param {string} [pipelineId] - pipeline ID for modal back-navigation
|
|
67
69
|
*/
|
|
68
|
-
function _renderArtifactLinks(artifacts) {
|
|
70
|
+
function _renderArtifactLinks(artifacts, pipelineId) {
|
|
69
71
|
if (!artifacts) return '';
|
|
70
72
|
var links = [];
|
|
71
73
|
var linkStyle = 'display:inline-flex;align-items:center;gap:2px;padding:1px 6px;border-radius:10px;font-size:10px;cursor:pointer;text-decoration:none;color:var(--blue);background:color-mix(in srgb, var(--blue) 10%, transparent);border:1px solid color-mix(in srgb, var(--blue) 20%, transparent)';
|
|
72
74
|
|
|
73
|
-
//
|
|
75
|
+
// Pushes current pipeline modal onto back stack so detail modals can navigate back
|
|
76
|
+
var backFn = pipelineId ? "pushModalBack(function(){openPipelineDetail('" + escHtml(pipelineId) + "')});" : '';
|
|
77
|
+
|
|
74
78
|
(artifacts.workItems || []).forEach(function(id) {
|
|
75
|
-
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();
|
|
79
|
+
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();' + backFn + 'openWorkItemDetail(\'' + escHtml(id) + '\')" title="Open work item ' + escHtml(id) + '">⚙ ' + escHtml(id) + '</span>');
|
|
76
80
|
});
|
|
77
|
-
|
|
78
|
-
// Meetings → navigate to meetings page & open detail
|
|
79
81
|
(artifacts.meetings || []).forEach(function(id) {
|
|
80
|
-
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();
|
|
82
|
+
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();' + backFn + 'openMeetingDetail(\'' + escHtml(id) + '\')" title="Open meeting ' + escHtml(id) + '">💬 ' + escHtml(id) + '</span>');
|
|
81
83
|
});
|
|
82
|
-
|
|
83
|
-
// Plans → navigate to plans page
|
|
84
84
|
(artifacts.plans || []).forEach(function(name) {
|
|
85
|
-
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();
|
|
85
|
+
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();' + backFn + 'planView(\'' + escHtml(name) + '\')" title="Plan: ' + escHtml(name) + '">📋 ' + escHtml(name.replace(/\.md$/, '').slice(0, 30)) + '</span>');
|
|
86
86
|
});
|
|
87
|
-
|
|
88
|
-
// PRDs → navigate to PRD page
|
|
89
87
|
(artifacts.prds || []).forEach(function(name) {
|
|
90
|
-
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();
|
|
88
|
+
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();' + backFn + 'planView(\'' + escHtml(name) + '\')" title="PRD: ' + escHtml(name) + '">📄 ' + escHtml(name.replace(/\.json$/, '').slice(0, 30)) + '</span>');
|
|
91
89
|
});
|
|
92
|
-
|
|
93
|
-
// PRs → navigate to PRs page
|
|
94
90
|
(artifacts.prs || []).forEach(function(id) {
|
|
95
91
|
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();closeModal();switchPage(\'prs\')" title="Pull request ' + escHtml(id) + '">🔀 PR-' + escHtml(id) + '</span>');
|
|
96
92
|
});
|
|
97
|
-
|
|
98
|
-
// Sub-stages (parallel) — just label them, no nav needed
|
|
99
93
|
(artifacts.subStages || []).forEach(function(id) {
|
|
100
94
|
links.push('<span style="' + linkStyle + ';cursor:default;color:var(--muted);background:color-mix(in srgb, var(--muted) 8%, transparent);border-color:color-mix(in srgb, var(--muted) 15%, transparent)" title="Sub-stage ' + escHtml(id) + '">⚓ ' + escHtml(id) + '</span>');
|
|
101
95
|
});
|
|
102
|
-
|
|
103
|
-
// Notes → navigate to inbox page
|
|
104
96
|
(artifacts.notes || []).forEach(function(name) {
|
|
105
97
|
links.push('<span style="' + linkStyle + '" onclick="event.stopPropagation();closeModal();switchPage(\'inbox\')" title="Note: ' + escHtml(name) + '">📝 ' + escHtml(name.replace(/\.md$/, '').replace(/^\d{4}-\d{2}-\d{2}-/, '').slice(0, 30)) + '</span>');
|
|
106
98
|
});
|
|
@@ -367,7 +359,7 @@ function openPipelineDetail(id) {
|
|
|
367
359
|
(s.type === 'condition' ? ' | Check: ' + escHtml(typeof (s.check || s.condition) === 'string' ? (s.check || s.condition) : ((s.check || s.condition || {}).check || '?')) + (s.onMet ? ' | onMet: ' + escHtml(s.onMet) : '') + (s.onUnmet ? ' | onUnmet: ' + escHtml(s.onUnmet) : '') : '') +
|
|
368
360
|
'</div>' +
|
|
369
361
|
_renderMonitoredResources(s.monitoredResources || []) +
|
|
370
|
-
_renderArtifactLinks(stageRun.artifacts) +
|
|
362
|
+
_renderArtifactLinks(stageRun.artifacts, id) +
|
|
371
363
|
(stageRun.output ? '<div style="margin-top:6px;font-size:11px;max-height:150px;overflow-y:auto">' + renderMd(stageRun.output.slice(0, 500)) + '</div>' : '') +
|
|
372
364
|
(stageStatus === 'waiting-human' ? '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;color:var(--green);border-color:var(--green);margin-top:6px" onclick="_continuePipeline(\'' + escHtml(id) + '\',\'' + escHtml(s.id) + '\',this)">Continue</button>' : '') +
|
|
373
365
|
'</div>';
|
|
@@ -390,7 +382,7 @@ function openPipelineDetail(id) {
|
|
|
390
382
|
(r.completedAt ? '<span style="color:var(--muted)">\u2192 ' + new Date(r.completedAt).toLocaleString() + '</span>' : '') +
|
|
391
383
|
(artifactCount > 0 ? '<span style="color:var(--blue);cursor:pointer;user-select:none" onclick="var el=document.getElementById(\'' + toggleId + '\');el.style.display=el.style.display===\'none\'?\'flex\':\'none\'" title="Toggle artifacts">' + artifactCount + ' artifact' + (artifactCount !== 1 ? 's' : '') + ' ▾</span>' : '') +
|
|
392
384
|
'</div>' +
|
|
393
|
-
(artifactCount > 0 ? '<div id="' + toggleId + '" style="display:none;flex-wrap:wrap;gap:4px;margin-top:4px;margin-left:12px">' + _renderArtifactLinks(runArtifacts.merged) + '</div>' : '') +
|
|
385
|
+
(artifactCount > 0 ? '<div id="' + toggleId + '" style="display:none;flex-wrap:wrap;gap:4px;margin-top:4px;margin-left:12px">' + _renderArtifactLinks(runArtifacts.merged, id) + '</div>' : '') +
|
|
394
386
|
'</div>';
|
|
395
387
|
});
|
|
396
388
|
}
|
package/dashboard/js/utils.js
CHANGED
|
@@ -152,15 +152,33 @@ function renderMd(s) {
|
|
|
152
152
|
return _renderMdCore(s);
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
function _normalizeCodeFences(s) {
|
|
156
|
+
var fenceCount = (s.match(/```/g) || []).length;
|
|
157
|
+
if (fenceCount % 2 !== 0) s = s + '\n```';
|
|
158
|
+
return s;
|
|
159
|
+
}
|
|
160
|
+
|
|
155
161
|
function _renderMdCore(s) {
|
|
156
162
|
let html = escHtml(s);
|
|
157
163
|
|
|
164
|
+
// Close unclosed code fences before any regex processing
|
|
165
|
+
html = _normalizeCodeFences(html);
|
|
166
|
+
|
|
158
167
|
// 1. Extract code blocks and inline code into placeholders (protect from other transforms)
|
|
159
168
|
const codeSlots = [];
|
|
160
169
|
html = html.replace(/```(\w*)\n([\s\S]*?)```/g, function(_, lang, code) {
|
|
161
170
|
codeSlots.push('<pre style="background:var(--bg);padding:8px;border-radius:4px;overflow-x:auto;font-size:11px;margin:4px 0"><code>' + code + '</code></pre>');
|
|
162
171
|
return '\x00CB' + (codeSlots.length - 1) + '\x00';
|
|
163
172
|
});
|
|
173
|
+
|
|
174
|
+
// Close lone unclosed backticks per-line before inline code extraction
|
|
175
|
+
html = html.split('\n').map(function(line) {
|
|
176
|
+
// Skip code block placeholders
|
|
177
|
+
if (/^\x00CB\d+\x00$/.test(line)) return line;
|
|
178
|
+
var ticks = (line.match(/`/g) || []).length;
|
|
179
|
+
return (ticks % 2 !== 0) ? line + '`' : line;
|
|
180
|
+
}).join('\n');
|
|
181
|
+
|
|
164
182
|
html = html.replace(/`([^`\n]+)`/g, function(_, code) {
|
|
165
183
|
codeSlots.push('<code style="background:var(--bg);padding:1px 4px;border-radius:3px;font-size:0.9em">' + code + '</code>');
|
|
166
184
|
return '\x00CB' + (codeSlots.length - 1) + '\x00';
|
|
@@ -294,6 +312,9 @@ var MD_CHUNK_SIZE = 10000;
|
|
|
294
312
|
var _mdChunkUid = 0;
|
|
295
313
|
|
|
296
314
|
function _renderMdChunked(fullText) {
|
|
315
|
+
// Close unclosed code fences before chunking
|
|
316
|
+
fullText = _normalizeCodeFences(fullText);
|
|
317
|
+
|
|
297
318
|
// Split at blank-line boundaries to avoid breaking code blocks and other multi-line elements
|
|
298
319
|
var chunks = [];
|
|
299
320
|
var pos = 0;
|
package/dashboard/styles.css
CHANGED
|
@@ -630,6 +630,7 @@
|
|
|
630
630
|
.cc-tab.working { border-color: var(--blue); }
|
|
631
631
|
.cc-tab.working::before { content: ''; position: absolute; top: 3px; left: 5px; width: 4px; height: 4px; border-radius: 50%; background: var(--blue); animation: pulse 1.5s infinite; }
|
|
632
632
|
.cc-tab.working.active::before { background: var(--blue); }
|
|
633
|
+
.cc-tab .notif-badge.done { top: 3px; left: 5px; right: auto; width: 4px; height: 4px; }
|
|
633
634
|
.cc-tab-close { flex-shrink: 0; margin-left: 4px; opacity: 0; cursor: pointer; font-size: 12px; line-height: 1; }
|
|
634
635
|
.cc-tab:hover .cc-tab-close { opacity: 0.5; }
|
|
635
636
|
.cc-tab-close:hover { opacity: 1; color: var(--red); }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.919",
|
|
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"
|