@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 CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.188 (2026-04-02)
4
+
5
+ ### Dashboard
6
+ - dashboard/js/refresh.js
7
+
8
+ ## 0.1.187 (2026-04-02)
9
+
10
+ ### Engine
11
+ - engine/playbook.js
12
+
3
13
  ## 0.1.186 (2026-04-02)
4
14
 
5
15
  ### Dashboard
@@ -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
- renderAgents(data.agents);
104
- renderPrdProgress(data.prdProgress);
105
- _cachePrdItems(data.prdProgress);
106
- renderInbox(data.inbox);
107
- cmdUpdateAgentList(data.agents);
108
- cmdUpdateProjectList(data.projects || []);
109
- renderNotes(data.notes);
110
- renderPrd(data.prd, data.prdProgress);
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
- renderEngineStatus(data.engine);
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 || '';
@@ -296,9 +296,12 @@ function renderPlaybook(type, vars) {
296
296
  };
297
297
  const allVars = { ...projectVars, ...vars };
298
298
 
299
- // Substitute variables
300
- for (const [key, val] of Object.entries(allVars)) {
301
- content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), String(val));
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.186",
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"