@yemi33/minions 0.1.2392 → 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/styles.css +25 -0
- package/docs/pr-auto-fix-dispatch.md +1 -1
- 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/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);
|
|
@@ -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
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2393",
|
|
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"
|
package/playbooks/plan-to-prd.md
CHANGED
|
@@ -135,7 +135,7 @@ Rules for items:
|
|
|
135
135
|
{ "id": "P-bbb2", "name": "UI client", "project": "web-dashboard", ... }
|
|
136
136
|
]
|
|
137
137
|
```
|
|
138
|
-
The engine routes each item to that project's SQL work-item scope.
|
|
138
|
+
The engine routes each item to that project's SQL work-item scope. At plan completion, the engine creates one project-scoped verify work item per touched project (each project with an active PR linked to a completed plan item). If no linked PRs surface, it falls back to one verify work item on the primary project. See the **Cross-repo plans** section below for the full output contract when `{{target_projects}}` is set.
|
|
139
139
|
- `depends_on` lists IDs of items that must be done first
|
|
140
140
|
- Keep descriptions actionable — name the files, functions, patterns, or integration points the implementing agent should touch whenever the plan makes them clear
|
|
141
141
|
- Include `acceptance_criteria` so reviewers know when it's done
|
|
@@ -161,7 +161,7 @@ Apply these rules on top of (and where they conflict, instead of) the single-pro
|
|
|
161
161
|
- `parallel`: omit `feature_branch` entirely (the engine derives per-item branches as `user/<loginname>/<wi-id>-<slug>` in each project).
|
|
162
162
|
- `shared-branch` (only with explicit justification): use the canonical `user/<loginname>/PL-<short-kebab-slug>` form. The engine will pre-create a matching branch in every project listed in `{{target_projects}}` (P-1c0f5e84) so each item can push to the same branch name in its own repo.
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
At plan completion, the engine creates one verify work item per touched project, where a touched project has at least one active PR linked to a completed plan item. Those project-scoped verify tasks run independently in parallel. If no linked PRs surface (for example, items completed without PR records or legacy state), the fan-out collapses to one verify work item on the primary project — the project with the most completed items — as a fallback.
|
|
165
165
|
|
|
166
166
|
{{/target_projects}}
|
|
167
167
|
## Reusing an Existing PRD
|