@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 +3 -1
- package/dashboard/js/modal-qa.js +10 -1
- package/dashboard/layout.html +1 -0
- package/dashboard.js +35 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
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)
|
package/dashboard/js/modal-qa.js
CHANGED
|
@@ -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
|
-
|
|
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);
|
package/dashboard/layout.html
CHANGED
|
@@ -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()">▲ 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.
|
|
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"
|