@yemi33/minions 0.1.186 → 0.1.188
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/refresh.js +29 -23
- package/engine/playbook.js +6 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dashboard/js/refresh.js
CHANGED
|
@@ -97,17 +97,24 @@ function _processStatusUpdate(data) {
|
|
|
97
97
|
}
|
|
98
98
|
document.getElementById('ts').textContent = new Date(data.timestamp).toLocaleTimeString();
|
|
99
99
|
const engineState = (data.engine && data.engine.state) ? data.engine.state : 'stopped';
|
|
100
|
+
|
|
101
|
+
// Engine status FIRST — most critical indicator, must not be blocked by other render failures
|
|
102
|
+
renderEngineStatus(data.engine);
|
|
103
|
+
|
|
100
104
|
// Show setup banner if no projects linked (the key onboarding step)
|
|
101
105
|
const noProjects = !data.projects || data.projects.length === 0;
|
|
102
106
|
document.getElementById('setup-banner').style.display = (noProjects && engineState !== 'stopped') ? 'block' : 'none';
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
|
|
108
|
+
// Each render call wrapped so one failure doesn't block the rest
|
|
109
|
+
const _r = (fn) => { try { fn(); } catch (e) { console.error('render error:', e.message); } };
|
|
110
|
+
_r(() => renderAgents(data.agents));
|
|
111
|
+
_r(() => renderPrdProgress(data.prdProgress));
|
|
112
|
+
_r(() => _cachePrdItems(data.prdProgress));
|
|
113
|
+
_r(() => renderInbox(data.inbox));
|
|
114
|
+
_r(() => cmdUpdateAgentList(data.agents));
|
|
115
|
+
_r(() => cmdUpdateProjectList(data.projects || []));
|
|
116
|
+
_r(() => renderNotes(data.notes));
|
|
117
|
+
_r(() => renderPrd(data.prd, data.prdProgress));
|
|
111
118
|
// Auto-approve badge
|
|
112
119
|
const autoEl = document.getElementById('auto-approve-badge');
|
|
113
120
|
if (autoEl) autoEl.innerHTML = data.autoMode?.approvePlans
|
|
@@ -116,24 +123,23 @@ function _processStatusUpdate(data) {
|
|
|
116
123
|
// Inbox consolidation threshold from config
|
|
117
124
|
const threshEl = document.getElementById('inbox-threshold');
|
|
118
125
|
if (threshEl && data.autoMode?.inboxThreshold) threshEl.textContent = data.autoMode.inboxThreshold;
|
|
119
|
-
renderPrs(data.pullRequests || []);
|
|
120
|
-
renderArchiveButtons(data.archivedPrds || []);
|
|
121
|
-
|
|
122
|
-
renderDispatch(data.dispatch);
|
|
126
|
+
_r(() => renderPrs(data.pullRequests || []));
|
|
127
|
+
_r(() => renderArchiveButtons(data.archivedPrds || []));
|
|
128
|
+
_r(() => renderDispatch(data.dispatch));
|
|
123
129
|
window._lastDispatch = data.dispatch;
|
|
124
130
|
window._lastWorkItems = data.workItems || [];
|
|
125
131
|
window._lastStatus = data;
|
|
126
|
-
prunePrdRequeueState(window._lastWorkItems);
|
|
127
|
-
renderEngineLog(data.engineLog || []);
|
|
128
|
-
renderProjects(data.projects || []);
|
|
129
|
-
renderMetrics(data.metrics || {});
|
|
130
|
-
renderWorkItems(data.workItems || []);
|
|
131
|
-
renderSkills(data.skills || []);
|
|
132
|
-
renderMcpServers(data.mcpServers || []);
|
|
133
|
-
renderSchedules(data.schedules || []);
|
|
134
|
-
renderMeetings(data.meetings || []);
|
|
135
|
-
if (typeof renderPipelines === 'function') renderPipelines(data.pipelines || []);
|
|
136
|
-
renderPinned(data.pinned || []);
|
|
132
|
+
_r(() => prunePrdRequeueState(window._lastWorkItems));
|
|
133
|
+
_r(() => renderEngineLog(data.engineLog || []));
|
|
134
|
+
_r(() => renderProjects(data.projects || []));
|
|
135
|
+
_r(() => renderMetrics(data.metrics || {}));
|
|
136
|
+
_r(() => renderWorkItems(data.workItems || []));
|
|
137
|
+
_r(() => renderSkills(data.skills || []));
|
|
138
|
+
_r(() => renderMcpServers(data.mcpServers || []));
|
|
139
|
+
_r(() => renderSchedules(data.schedules || []));
|
|
140
|
+
_r(() => renderMeetings(data.meetings || []));
|
|
141
|
+
_r(() => { if (typeof renderPipelines === 'function') renderPipelines(data.pipelines || []); });
|
|
142
|
+
_r(() => renderPinned(data.pinned || []));
|
|
137
143
|
// Update sidebar counts
|
|
138
144
|
const swi = document.getElementById('sidebar-wi');
|
|
139
145
|
if (swi) swi.textContent = (data.workItems || []).length || '';
|
package/engine/playbook.js
CHANGED
|
@@ -296,9 +296,12 @@ function renderPlaybook(type, vars) {
|
|
|
296
296
|
};
|
|
297
297
|
const allVars = { ...projectVars, ...vars };
|
|
298
298
|
|
|
299
|
-
// Substitute variables
|
|
300
|
-
|
|
301
|
-
|
|
299
|
+
// Substitute variables — two passes to resolve nested templates
|
|
300
|
+
// (e.g. pr_section contains {{pr_create_instructions}}, {{branch_name}}, etc.)
|
|
301
|
+
for (let pass = 0; pass < 2; pass++) {
|
|
302
|
+
for (const [key, val] of Object.entries(allVars)) {
|
|
303
|
+
content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), String(val));
|
|
304
|
+
}
|
|
302
305
|
}
|
|
303
306
|
|
|
304
307
|
// Warn on variables that resolved to empty string
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.188",
|
|
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"
|