@yemi33/minions 0.1.711 → 0.1.713

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,8 +1,10 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.711 (2026-04-09)
3
+ ## 0.1.713 (2026-04-09)
4
4
 
5
5
  ### Fixes
6
+ - trigger-verify handles already-completed PRDs and existing verify WIs
7
+ - move re-execute action card out of doc-chat thread
6
8
  - modal derivePlanStatus was called with wrong args, plans not cached
7
9
 
8
10
  ## 0.1.710 (2026-04-09)
@@ -99,11 +99,17 @@ function _initQaSession() {
99
99
  }
100
100
  if (prior.filePath) _modalFilePath = prior.filePath;
101
101
  _showThreadWrap();
102
+ requestAnimationFrame(function() {
103
+ var thread = document.getElementById('modal-qa-thread');
104
+ if (thread) thread.scrollTop = thread.scrollHeight;
105
+ });
102
106
  } else {
103
107
  _qaHistory = [];
104
108
  document.getElementById('modal-qa-thread').innerHTML = '';
105
109
  _hideThreadWrap();
106
110
  }
111
+ var actionSlot = document.getElementById('qa-action-slot');
112
+ if (actionSlot) actionSlot.innerHTML = '';
107
113
  }
108
114
 
109
115
  function clearQaConversation() {
@@ -112,6 +118,8 @@ function clearQaConversation() {
112
118
  _qaProcessing = false;
113
119
  document.getElementById('modal-qa-thread').innerHTML = '';
114
120
  _hideThreadWrap();
121
+ var actionSlot = document.getElementById('qa-action-slot');
122
+ if (actionSlot) actionSlot.innerHTML = '';
115
123
  if (_qaSessionKey) _qaSessions.delete(_qaSessionKey);
116
124
  }
117
125
 
@@ -266,7 +274,8 @@ async function _processQaMessage(message, selection) {
266
274
  '<button onclick="planExecute(\'' + esc + '\', \'\', null)" style="background:var(--green);color:#fff;border:none;border-radius:4px;padding:4px 12px;font-size:11px;font-weight:600;cursor:pointer">Re-execute plan</button>' +
267
275
  '<button onclick="this.closest(\'div\').innerHTML=\'<span style=color:var(--muted);font-size:11px>Paused. No work dispatched.</span>\'" style="background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:4px 12px;font-size:11px;cursor:pointer">Keep paused</button>' +
268
276
  '<span style="color:var(--muted);font-size:10px;width:100%">Re-execute creates a new PRD from the updated plan.</span>';
269
- thread.appendChild(actionDiv);
277
+ var slot = document.getElementById('qa-action-slot');
278
+ if (slot) { slot.innerHTML = ''; slot.appendChild(actionDiv); }
270
279
  }
271
280
  } else {
272
281
  const qaElapsedErr = Math.round((Date.now() - qaStartTime) / 1000);
@@ -119,6 +119,7 @@
119
119
  <div id="qa-expand-bar" style="display:none;margin-bottom:4px">
120
120
  <button style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="toggleDocChat()">&#x25B2; Show thread</button>
121
121
  </div>
122
+ <div id="qa-action-slot"></div>
122
123
  <div class="modal-qa-selection-pill" id="modal-qa-pill" style="display:none">
123
124
  <span class="pill-label">Selection:</span>
124
125
  <span class="pill-text" id="modal-qa-pill-text"></span>
package/dashboard.js CHANGED
@@ -969,21 +969,51 @@ const server = http.createServer(async (req, res) => {
969
969
  safeWrite(activePath, plan);
970
970
  }
971
971
 
972
- // Trigger completion check
973
- const lifecycle = require('./engine/lifecycle');
974
972
  const config = queries.getConfig();
975
- lifecycle.checkPlanCompletion({ item: { sourcePlan: body.file, id: 'manual' } }, config);
976
-
977
- // Check if verify was created
978
973
  const project = PROJECTS.find(p => {
979
974
  const plan = safeJson(activePath) || safeJson(prdPath);
980
975
  return plan && p.name?.toLowerCase() === (plan.project || '').toLowerCase();
981
976
  }) || PROJECTS[0] || null;
977
+
978
+ // Check for existing verify WI — reset to pending if already done (re-verify)
979
+ if (project) {
980
+ const wiPath = shared.projectWorkItemsPath(project);
981
+ let existingVerify = null;
982
+ mutateWorkItems(wiPath, items => {
983
+ const v = items.find(w => w.sourcePlan === body.file && w.itemType === 'verify');
984
+ if (v && (v.status === 'done' || v.status === 'failed')) {
985
+ v.status = 'pending';
986
+ delete v.completedAt;
987
+ delete v.dispatched_to;
988
+ delete v.dispatched_at;
989
+ v._retryCount = 0;
990
+ existingVerify = v;
991
+ } else if (v) {
992
+ existingVerify = v;
993
+ }
994
+ });
995
+ if (existingVerify) {
996
+ invalidateStatusCache();
997
+ return jsonReply(res, 200, { ok: true, verifyId: existingVerify.id });
998
+ }
999
+ }
1000
+
1001
+ // No existing verify — clear completion flag and trigger fresh creation
1002
+ const planData = safeJson(activePath);
1003
+ if (planData?._completionNotified) {
1004
+ planData._completionNotified = false;
1005
+ safeWrite(activePath, planData);
1006
+ }
1007
+
1008
+ const lifecycle = require('./engine/lifecycle');
1009
+ lifecycle.checkPlanCompletion({ item: { sourcePlan: body.file, id: 'manual' } }, config);
1010
+
982
1011
  if (project) {
983
1012
  const wiPath = shared.projectWorkItemsPath(project);
984
1013
  const items = safeJsonArr(wiPath);
985
1014
  const verify = items.find(w => w.sourcePlan === body.file && w.itemType === 'verify');
986
1015
  if (verify) {
1016
+ invalidateStatusCache();
987
1017
  return jsonReply(res, 200, { ok: true, verifyId: verify.id });
988
1018
  }
989
1019
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.711",
3
+ "version": "0.1.713",
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"