@yemi33/minions 0.1.2391 → 0.1.2393
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/dashboard/js/qa.js +26 -1
- package/dashboard/js/refresh.js +1 -1
- package/dashboard/js/render-work-items.js +4 -9
- package/dashboard/styles.css +25 -0
- package/docs/deprecated.json +6 -6
- package/docs/pr-auto-fix-dispatch.md +1 -1
- package/docs/slim-ux/concepts.md +739 -586
- package/package.json +1 -1
- package/playbooks/plan-to-prd.md +2 -2
package/dashboard/js/qa.js
CHANGED
|
@@ -554,6 +554,8 @@ const QA_SESSION_TERMINAL_STATES = new Set(['done', 'failed', 'killed']);
|
|
|
554
554
|
let _qaSessionsPollInterval = null;
|
|
555
555
|
let _qaSessionsCache = [];
|
|
556
556
|
let _qaRunnersCache = [];
|
|
557
|
+
// Polling replaces the cards every three seconds, so disclosure state lives outside the DOM.
|
|
558
|
+
const _qaExpandedFlows = new Set();
|
|
557
559
|
|
|
558
560
|
function _stopQaSessionsPoll() {
|
|
559
561
|
if (_qaSessionsPollInterval) {
|
|
@@ -706,6 +708,17 @@ function _qaAfterSessionsRender() {
|
|
|
706
708
|
if (allTerminal) _stopQaSessionsPoll();
|
|
707
709
|
}
|
|
708
710
|
|
|
711
|
+
function qaSessionFlowsToggle(details) {
|
|
712
|
+
if (!details) return;
|
|
713
|
+
const isOpen = details.open;
|
|
714
|
+
const summary = details.querySelector('.qa-session-flows-summary');
|
|
715
|
+
if (summary) summary.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
|
|
716
|
+
const id = details.getAttribute('data-session-id');
|
|
717
|
+
if (!id) return;
|
|
718
|
+
if (isOpen) _qaExpandedFlows.add(id);
|
|
719
|
+
else _qaExpandedFlows.delete(id);
|
|
720
|
+
}
|
|
721
|
+
|
|
709
722
|
function _qaRenderSessionCard(s) {
|
|
710
723
|
const id = s && s.id || '';
|
|
711
724
|
const state = (s && s.state) || 'unknown';
|
|
@@ -749,7 +762,19 @@ function _qaRenderSessionCard(s) {
|
|
|
749
762
|
|
|
750
763
|
let body = '';
|
|
751
764
|
if (flowsShort) {
|
|
752
|
-
|
|
765
|
+
const flowsOpen = _qaExpandedFlows.has(id);
|
|
766
|
+
body += '<details class="qa-session-flows"' + (flowsOpen ? ' open' : '') +
|
|
767
|
+
' data-session-id="' + escHtml(id) + '" ontoggle="qaSessionFlowsToggle(this)">' +
|
|
768
|
+
'<summary class="qa-session-flows-summary" aria-expanded="' + (flowsOpen ? 'true' : 'false') + '">' +
|
|
769
|
+
'<strong class="qa-session-flows-label">Flows:</strong>' +
|
|
770
|
+
'<span class="qa-session-flows-preview">' + escHtml(flowsShort) + '</span>' +
|
|
771
|
+
'<span class="qa-session-flows-affordance">' +
|
|
772
|
+
'<span class="qa-session-flows-expand-label">Show full prompt</span>' +
|
|
773
|
+
'<span class="qa-session-flows-collapse-label">Hide full prompt</span>' +
|
|
774
|
+
'</span>' +
|
|
775
|
+
'</summary>' +
|
|
776
|
+
'<div class="qa-session-flows-full">' + escHtml(flowsRaw) + '</div>' +
|
|
777
|
+
'</details>';
|
|
753
778
|
}
|
|
754
779
|
if (state === 'failed' && (failureClass || error)) {
|
|
755
780
|
body += '<div class="qa-session-error"><strong>' + escHtml(failureClass || 'failed') + ':</strong> ' + escHtml(error || summary || 'no details') + '</div>';
|
package/dashboard/js/refresh.js
CHANGED
|
@@ -155,7 +155,7 @@ const RENDER_VERSIONS = {
|
|
|
155
155
|
// chip row into its own non-interactive "Branch" field (W-mr2qjr3b0002522f).
|
|
156
156
|
// Bumped 8→9 for paused pre-dispatch evaluation guidance.
|
|
157
157
|
// Bumped 9→10: row actions now preserve work-item source scope when IDs collide.
|
|
158
|
-
workItems:
|
|
158
|
+
workItems: 11,
|
|
159
159
|
skills: 1,
|
|
160
160
|
commands: 1,
|
|
161
161
|
mcpServers: 1,
|
|
@@ -179,13 +179,9 @@ function wiRow(item) {
|
|
|
179
179
|
: (item.branchStrategy === 'shared-branch' && item.status === 'done')
|
|
180
180
|
? '<span style="font-size:var(--text-xs);color:var(--muted)" title="Part of shared branch — aggregate PR created at verify stage">shared branch</span>'
|
|
181
181
|
: '<span style="color:var(--muted)">—</span>';
|
|
182
|
-
// W-mqrdn6qq
|
|
183
|
-
//
|
|
184
|
-
//
|
|
185
|
-
// demotion (engine/dispatch.js writeDispatchResult / force-demote path).
|
|
186
|
-
var isNonRetryableFail = !!item._failureClass
|
|
187
|
-
|| /^Non-retryable failure:/i.test(item.failReason || '')
|
|
188
|
-
|| /^Project "[^"]+" not found\./i.test(item.failReason || '');
|
|
182
|
+
// W-mqrdn6qq / W-mrkqc0pl — ALL failure/error snippets (retryable AND
|
|
183
|
+
// non-retryable) surface their red failReason snippet in the PR column,
|
|
184
|
+
// never the Agent column.
|
|
189
185
|
var failSnippet = item.failReason
|
|
190
186
|
? '<span style="display:block;font-size:var(--text-xs);color:var(--red)" title="' + escapeHtml(item.failReason) + '">' + escapeHtml(item.failReason.slice(0, 30)) + '</span>'
|
|
191
187
|
: '';
|
|
@@ -234,9 +230,8 @@ function wiRow(item) {
|
|
|
234
230
|
(item.completedAgents && item.completedAgents.length > 0
|
|
235
231
|
? '<span class="pr-agent">' + escapeHtml(item.completedAgents.join(', ')) + '</span>'
|
|
236
232
|
: '<span class="pr-agent">' + escapeHtml(item.dispatched_to || item.agent || '—') + '</span>') +
|
|
237
|
-
(failSnippet && !isNonRetryableFail ? failSnippet : '') +
|
|
238
233
|
'</td>' +
|
|
239
|
-
'<td>' + prLink + (failSnippet
|
|
234
|
+
'<td>' + prLink + (failSnippet ? failSnippet : '') + '</td>' +
|
|
240
235
|
'<td><span class="pr-date">' + escapeHtml((item.created || '').slice(0, 16).replace('T', ' ')) + '</span></td>' +
|
|
241
236
|
'<td style="white-space:nowrap;font-size:var(--text-xs);color:var(--muted)">' +
|
|
242
237
|
(function() {
|
package/dashboard/styles.css
CHANGED
|
@@ -1597,6 +1597,31 @@
|
|
|
1597
1597
|
background: var(--surface); padding: var(--space-3);
|
|
1598
1598
|
border-radius: var(--radius-sm); border: 1px solid var(--border);
|
|
1599
1599
|
}
|
|
1600
|
+
.qa-session-flows-summary {
|
|
1601
|
+
display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
|
|
1602
|
+
align-items: start; gap: var(--space-2); cursor: pointer; list-style: none;
|
|
1603
|
+
}
|
|
1604
|
+
.qa-session-flows-summary::-webkit-details-marker { display: none; }
|
|
1605
|
+
.qa-session-flows-summary::marker { content: ''; }
|
|
1606
|
+
.qa-session-flows-summary:focus-visible {
|
|
1607
|
+
outline: 2px solid var(--blue); outline-offset: 3px;
|
|
1608
|
+
border-radius: var(--radius-sm);
|
|
1609
|
+
}
|
|
1610
|
+
.qa-session-flows-preview,
|
|
1611
|
+
.qa-session-flows-full { overflow-wrap: anywhere; }
|
|
1612
|
+
.qa-session-flows-affordance {
|
|
1613
|
+
color: var(--blue); font-size: var(--text-xs); white-space: nowrap;
|
|
1614
|
+
}
|
|
1615
|
+
.qa-session-flows-affordance::before { content: '+ '; }
|
|
1616
|
+
.qa-session-flows-collapse-label { display: none; }
|
|
1617
|
+
.qa-session-flows[open] .qa-session-flows-preview { display: none; }
|
|
1618
|
+
.qa-session-flows[open] .qa-session-flows-affordance::before { content: '- '; }
|
|
1619
|
+
.qa-session-flows[open] .qa-session-flows-expand-label { display: none; }
|
|
1620
|
+
.qa-session-flows[open] .qa-session-flows-collapse-label { display: inline; }
|
|
1621
|
+
.qa-session-flows-full {
|
|
1622
|
+
margin-top: var(--space-3); padding-top: var(--space-3);
|
|
1623
|
+
border-top: 1px solid var(--border); white-space: pre-wrap;
|
|
1624
|
+
}
|
|
1600
1625
|
.qa-session-error {
|
|
1601
1626
|
font-size: var(--text-base); color: var(--red);
|
|
1602
1627
|
background: rgba(248, 81, 73, 0.08); padding: var(--space-3);
|
package/docs/deprecated.json
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"id": "agent-config-skills-field",
|
|
4
|
-
"description": "Legacy per-agent descriptive-metadata array `agents.<id>.skills` in config.json, renamed to `agents.<id>.expertise` to remove the name collision with executable runtime/harness skills (SKILL.md). The
|
|
4
|
+
"description": "Legacy per-agent descriptive-metadata array `agents.<id>.skills` in config.json, renamed to `agents.<id>.expertise` to remove the name collision with executable runtime/harness skills (SKILL.md). The tags appear in the agent identity prompt and provide a soft preference to `pickReReviewAgentHints` when selecting a re-reviewer; they are not hard routing constraints. A read-compat shim honors the old key so operator configs still carrying `skills` (and no `expertise`) keep working.",
|
|
5
5
|
"code": [
|
|
6
6
|
{
|
|
7
7
|
"file": "engine/playbook.js",
|
|
8
|
-
"lines": "
|
|
8
|
+
"lines": "1094",
|
|
9
9
|
"note": "buildSystemPrompt reads `agent.expertise ?? agent.skills ?? []` for the `Expertise:` identity line"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"file": "engine/lifecycle.js",
|
|
13
|
-
"lines": "
|
|
13
|
+
"lines": "5317-5321",
|
|
14
14
|
"note": "pickReReviewAgentHints reads `agent.expertise` with an `agent.skills` array fallback"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"file": "engine/queries.js",
|
|
18
|
-
"lines": "
|
|
18
|
+
"lines": "830-832",
|
|
19
19
|
"note": "getAgents normalizes `expertise: a.expertise ?? a.skills ?? []` so the dashboard/settings UI always receives `expertise`"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"file": "dashboard.js",
|
|
23
|
-
"lines": "
|
|
23
|
+
"lines": "11245-11252",
|
|
24
24
|
"note": "settings POST accepts a legacy `updates.skills` key, persists as `config.agents[id].expertise`, and deletes the old `skills` key"
|
|
25
25
|
}
|
|
26
26
|
],
|
|
27
27
|
"removalGate": "Telemetry / a config sweep across all known engines must show no persisted `config.agents.<id>.skills` key (only `expertise`) for >=30 consecutive days, confirming every operator config has been re-saved through the dashboard (which drops the legacy key) or hand-migrated.",
|
|
28
28
|
"targetRemovalDate": "2026-09-17",
|
|
29
|
-
"notes": "Safe to remove on or after 2026-09-17 (~3 release windows) once the removal gate clears. Removal scope: drop the `?? agent.skills` / `?? a.skills` fallbacks in engine/playbook.js:
|
|
29
|
+
"notes": "Safe to remove on or after 2026-09-17 (~3 release windows) once the removal gate clears. Removal scope: drop the `?? agent.skills` / `?? a.skills` fallbacks in engine/playbook.js:1094, engine/lifecycle.js:5317-5319, and engine/queries.js:832; drop the `updates.skills` legacy branch + `delete config.agents[id].skills` in dashboard.js:11245-11252; and update docs/named-agents.md to stop mentioning the legacy key. Does NOT touch the unrelated executable-skills system (queries.js harnesses, runtime adapters, dashboard renderSkills, SKILL.md tooling)."
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"id": "config-poll-key-migration",
|
|
@@ -51,7 +51,7 @@ Independent of the master kill-switches, each PR tracks repeated no-op fix outco
|
|
|
51
51
|
2. Click the red chip → `POST /api/pull-requests/clear-paused-cause` with `{ prId, cause }`.
|
|
52
52
|
3. Direct API call to the same endpoint.
|
|
53
53
|
|
|
54
|
-
This per-PR per-cause pause is unrelated to `autoFixPaused`. Cause
|
|
54
|
+
This per-PR per-cause pause is unrelated to `autoFixPaused`. Cause values are validated against `Object.values(shared.PR_FIX_CAUSE)` (`human-feedback`, `review-feedback`, `build-failure`, `merge-conflict`, or `pr-fix`). Full mechanics in [`docs/pr-review-fix-loop.md`](pr-review-fix-loop.md) §4E.
|
|
55
55
|
|
|
56
56
|
## Key files
|
|
57
57
|
|