@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.
@@ -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
- body += '<div class="qa-session-flows"><strong>Flows:</strong> ' + escHtml(flowsShort) + '</div>';
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>';
@@ -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 keys are validated against `shared.PR_FIX_CAUSE` (e.g. `BUILD_FAILURE`, `REVIEW_FEEDBACK`, `HUMAN_FEEDBACK`, `MERGE_CONFLICT`, `PR_FIX`). Full mechanics in [`docs/pr-review-fix-loop.md`](pr-review-fix-loop.md) §4E.
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.2392",
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"
@@ -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. The verify task at plan completion picks the project with the most completed items and runs cross-repo verification from there. See the **Cross-repo plans** section below for the full output contract when `{{target_projects}}` is set.
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
- The verify task at plan completion picks the project with the most completed items and runs cross-repo verification from there; items with no PRs (e.g. docs-only changes that landed via direct commit) are still counted via their `done` status.
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