@yemi33/minions 0.1.187 → 0.1.189

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,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.189 (2026-04-02)
4
+
5
+ ### Dashboard
6
+ - dashboard/js/render-plans.js
7
+
8
+ ### Playbooks
9
+ - meeting-conclude.md
10
+
11
+ ## 0.1.188 (2026-04-02)
12
+
13
+ ### Dashboard
14
+ - dashboard/js/refresh.js
15
+
3
16
  ## 0.1.187 (2026-04-02)
4
17
 
5
18
  ### Engine
@@ -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 || '';
@@ -70,7 +70,7 @@ function derivePlanStatus(prdFile, mdFile, prdJsonStatus, workItems) {
70
70
  w.sourcePlan === prdFile || w.sourcePlan === mdFile ||
71
71
  (w.type === 'plan-to-prd' && (w.planFile === prdFile || w.planFile === mdFile))
72
72
  );
73
- const implementWi = wi.filter(w => w.type !== 'plan-to-prd' && w.type !== 'verify');
73
+ const implementWi = wi.filter(w => w.type !== 'plan-to-prd' && w.type !== 'verify' && w.type !== 'evaluate');
74
74
  const hasPendingPrd = wi.some(w => w.type === 'plan-to-prd' && (w.status === 'pending' || w.status === 'dispatched'));
75
75
  const hasActiveWork = implementWi.some(w => w.status === 'pending' || w.status === 'dispatched');
76
76
  const allDone = implementWi.length > 0 && implementWi.every(w => w.status === 'done');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.187",
3
+ "version": "0.1.189",
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"
@@ -34,42 +34,4 @@ Write a clear meeting conclusion covering:
34
34
 
35
35
  Be decisive. If there's a clear best option, say so.
36
36
 
37
- ## Plan Creation (conditional)
38
-
39
- After writing the conclusion, decide: **are there concrete action items that require implementation work?**
40
-
41
- - **If YES** — write a plan file to `plans/<slugified-meeting-title>-<YYYY-MM-DD>.md` using the Minions plan format below. Only create this file if there are real, actionable implementation tasks — not just discussion points or observations.
42
-
43
- - **If NO** — do not create a plan file. A conclusion with only open questions, observations, or decisions that require no code/implementation changes does not need a plan.
44
-
45
- ### Plan format (only if action items exist)
46
-
47
- ```markdown
48
- # <Plan Title>
49
-
50
- > Source: Meeting {{meeting_title}} — <date>
51
-
52
- ## Background
53
-
54
- <1-2 sentence summary of why this plan exists, from the meeting conclusion>
55
-
56
- ## Tasks
57
-
58
- ### 1. <Task title>
59
- - **What**: <what needs to be done>
60
- - **Why**: <from the meeting — what problem does this fix>
61
- - **Owner**: <agent role best suited: Engineer / Architect / Analyst>
62
- - **Files**: <relevant files if known>
63
-
64
- ### 2. <Task title>
65
- ...
66
-
67
- ## Open Questions
68
-
69
- <Any unresolved items that need human input before work begins>
70
- ```
71
-
72
- Do NOT create a plan for:
73
- - Informational findings with no follow-up work
74
- - Decisions that have already been made and require no changes
75
- - Items that are purely "monitor and observe"
37
+ Do NOT create plan files — plan creation is handled separately (by the pipeline plan stage or the dashboard "Create Plan" button).