@yemi33/minions 0.1.2424 → 0.1.2426

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.
Files changed (185) hide show
  1. package/bin/install-internal-minions.js +1209 -0
  2. package/bin/minions.js +75 -9
  3. package/dashboard/docs/typography.md +27 -12
  4. package/dashboard/js/command-center.js +13 -11
  5. package/dashboard/js/live-stream.js +1 -1
  6. package/dashboard/js/memory-search.js +388 -43
  7. package/dashboard/js/modal-qa.js +5 -5
  8. package/dashboard/js/qa.js +39 -26
  9. package/dashboard/js/refresh.js +37 -18
  10. package/dashboard/js/render-agents.js +14 -18
  11. package/dashboard/js/render-dispatch.js +14 -74
  12. package/dashboard/js/render-inbox.js +3 -3
  13. package/dashboard/js/render-meetings.js +8 -8
  14. package/dashboard/js/render-other.js +45 -20
  15. package/dashboard/js/render-pipelines.js +6 -6
  16. package/dashboard/js/render-plans.js +14 -14
  17. package/dashboard/js/render-prd.js +46 -46
  18. package/dashboard/js/render-prs.js +9 -65
  19. package/dashboard/js/render-schedules.js +5 -5
  20. package/dashboard/js/render-skills.js +6 -6
  21. package/dashboard/js/render-utils.js +4 -4
  22. package/dashboard/js/render-watches.js +4 -16
  23. package/dashboard/js/render-work-items.js +95 -107
  24. package/dashboard/js/settings.js +175 -74
  25. package/dashboard/layout.html +3 -2
  26. package/dashboard/pages/inbox.html +1 -1
  27. package/dashboard/pages/work.html +1 -1
  28. package/dashboard/shared/model-display.js +9 -0
  29. package/dashboard/shared/watches-source.js +43 -0
  30. package/dashboard/shared/welcome-popup.js +259 -0
  31. package/dashboard/slim/body.html +6 -6
  32. package/dashboard/slim/js/chat.js +4 -2
  33. package/dashboard/slim/js/history.js +10 -3
  34. package/dashboard/slim/js/modals-tiles.js +85 -16
  35. package/dashboard/slim/js/status.js +12 -16
  36. package/dashboard/slim/styles.css +24 -4
  37. package/dashboard/styles.css +62 -27
  38. package/dashboard-build.js +8 -2
  39. package/dashboard.js +3854 -2514
  40. package/docs/README.md +7 -5
  41. package/docs/api-errors.md +144 -0
  42. package/docs/auto-discovery.md +83 -61
  43. package/docs/capture-demos.js +173 -30
  44. package/docs/command-center.md +5 -1
  45. package/docs/completion-reports.md +127 -11
  46. package/docs/constants.md +15 -3
  47. package/docs/constellation-style-telemetry.md +2 -2
  48. package/docs/copilot-cli-schema.md +32 -22
  49. package/docs/cross-repo-plans.md +30 -30
  50. package/docs/demo/memory-system.html +1 -1
  51. package/docs/deprecated.json +132 -18
  52. package/docs/diagnostics-memory.md +8 -4
  53. package/docs/human-vs-automated.md +2 -2
  54. package/docs/index.html +9 -2
  55. package/docs/internal-install.md +212 -0
  56. package/docs/kb-pr3223-cascade-archiving.md +16 -0
  57. package/docs/kb-pr696-merge-conflict-docs.md +23 -0
  58. package/docs/kb-sweep.md +2 -2
  59. package/docs/keep-processes.md +8 -1
  60. package/docs/live-checkout-mode.md +1 -1
  61. package/docs/managed-spawn.md +21 -3
  62. package/docs/named-agents.md +3 -2
  63. package/docs/onboarding.md +26 -0
  64. package/docs/plan-lifecycle.md +32 -32
  65. package/docs/pr-screenshots/pr-899/worker-pool-worktrees-AFTER.png +0 -0
  66. package/docs/pr-screenshots/pr-899/worker-pool-worktrees-BEFORE.png +0 -0
  67. package/docs/pr-screenshots/pr-979/auto-fix-pane-AFTER.png +0 -0
  68. package/docs/pr-screenshots/pr-979/auto-fix-pane-BEFORE.png +0 -0
  69. package/docs/pr-screenshots/pr-985/pr-column-em-dash-AFTER.png +0 -0
  70. package/docs/pr-screenshots/pr-985/pr-column-em-dash-BEFORE.png +0 -0
  71. package/docs/qa-runbook-lifecycle.md +67 -51
  72. package/docs/qa-runbooks.md +2 -2
  73. package/docs/runtime-adapters.md +101 -50
  74. package/docs/security.md +28 -0
  75. package/docs/self-improvement.md +47 -13
  76. package/docs/skills.md +29 -0
  77. package/docs/slim-ux/concepts.md +2 -2
  78. package/docs/specs/agent-configurability.md +43 -41
  79. package/docs/specs/agent-rename.md +13 -13
  80. package/docs/team-memory.md +283 -14
  81. package/docs/tutorials/01-install-and-connect.md +23 -0
  82. package/docs/tutorials/03-plan-driven-feature.md +3 -3
  83. package/docs/tutorials/04-runtimes-and-harness.md +18 -21
  84. package/docs/tutorials/08-operations-and-recovery.md +3 -2
  85. package/docs/tutorials/README.md +4 -3
  86. package/docs/visual-evidence-ci.md +103 -0
  87. package/docs/watches.md +35 -30
  88. package/docs/worktree-lifecycle.md +151 -13
  89. package/engine/acp-transport.js +1 -0
  90. package/engine/ado.js +80 -33
  91. package/engine/agent-api-validation.js +571 -0
  92. package/engine/agent-worker-pool.js +7 -6
  93. package/engine/api-contracts/agent-content.js +761 -0
  94. package/engine/api-contracts/cc-ops.js +219 -0
  95. package/engine/api-contracts/config-runtime.js +419 -0
  96. package/engine/api-contracts/core.js +138 -0
  97. package/engine/api-contracts/index.js +506 -0
  98. package/engine/api-contracts/orchestration.js +602 -0
  99. package/engine/api-contracts/pull-requests.js +323 -0
  100. package/engine/api-contracts/qa-process.js +764 -0
  101. package/engine/api-contracts/work-plan-prd.js +494 -0
  102. package/engine/api-validation.js +543 -0
  103. package/engine/cc-api-validation.js +586 -0
  104. package/engine/cc-worker-pool.js +9 -1
  105. package/engine/cleanup.js +393 -271
  106. package/engine/cli.js +65 -7
  107. package/engine/comment-classifier.js +70 -5
  108. package/engine/consolidation.js +123 -5
  109. package/engine/content-api-validation.js +606 -0
  110. package/engine/create-pr-worktree.js +22 -1
  111. package/engine/db/migrations/027-review-learning-lifecycle.js +162 -0
  112. package/engine/dispatch.js +33 -0
  113. package/engine/distribution.js +189 -0
  114. package/engine/execution-model.js +59 -0
  115. package/engine/features.js +12 -0
  116. package/engine/github.js +67 -25
  117. package/engine/harness-context.js +313 -0
  118. package/engine/inbox-store.js +1 -1
  119. package/engine/kb-sweep.js +161 -38
  120. package/engine/keep-process-sweep.js +43 -3
  121. package/engine/lifecycle.js +1066 -165
  122. package/engine/llm.js +4 -0
  123. package/engine/managed-spawn.js +463 -48
  124. package/engine/meeting.js +197 -34
  125. package/engine/memory-retrieval.js +280 -0
  126. package/engine/memory-store.js +821 -38
  127. package/engine/model-discovery.js +17 -3
  128. package/engine/pipeline.js +802 -14
  129. package/engine/plan-prd-validation.js +745 -0
  130. package/engine/playbook.js +206 -17
  131. package/engine/pooled-agent-process.js +6 -1
  132. package/engine/pr-action.js +1 -1
  133. package/engine/pr-issue-validation.js +653 -0
  134. package/engine/pr-resolve.js +75 -13
  135. package/engine/prd-store.js +39 -6
  136. package/engine/preflight.js +7 -2
  137. package/engine/process-utils.js +79 -31
  138. package/engine/projects.js +198 -12
  139. package/engine/promotion.js +371 -0
  140. package/engine/qa-from-prd.js +3 -0
  141. package/engine/qa-process-validation.js +572 -0
  142. package/engine/qa-runbooks.js +41 -37
  143. package/engine/qa-runners/maestro.js +11 -7
  144. package/engine/qa-runners/playwright.js +37 -14
  145. package/engine/qa-runners.js +9 -10
  146. package/engine/qa-runs.js +124 -11
  147. package/engine/qa-sessions.js +139 -40
  148. package/engine/quarantine-refs.js +81 -11
  149. package/engine/queries.js +163 -9
  150. package/engine/review-learning-backfill.js +482 -0
  151. package/engine/review-learning.js +1236 -0
  152. package/engine/runtimes/claude.js +60 -2
  153. package/engine/runtimes/codex.js +57 -16
  154. package/engine/runtimes/contract.js +21 -0
  155. package/engine/runtimes/copilot.js +51 -3
  156. package/engine/runtimes/index.js +1 -0
  157. package/engine/scheduler.js +201 -32
  158. package/engine/settings-validation.js +909 -0
  159. package/engine/shared.js +705 -208
  160. package/engine/spawn-agent.js +48 -21
  161. package/engine/steering-constraints.js +31 -0
  162. package/engine/steering-store.js +10 -2
  163. package/engine/steering.js +14 -2
  164. package/engine/timeout.js +404 -111
  165. package/engine/untrusted-fence.js +24 -10
  166. package/engine/watch-actions.js +7 -2
  167. package/engine/watches.js +353 -51
  168. package/engine/work-item-validation.js +561 -0
  169. package/engine/work-items-store.js +61 -1
  170. package/engine/worktree-gc.js +656 -37
  171. package/engine/worktree-preflight.js +154 -0
  172. package/engine.js +2068 -342
  173. package/package.json +1 -1
  174. package/playbooks/_pr-description-audit.md +88 -41
  175. package/playbooks/build-fix-complex.md +3 -3
  176. package/playbooks/docs.md +2 -2
  177. package/playbooks/fix.md +18 -18
  178. package/playbooks/implement.md +18 -18
  179. package/playbooks/qa-session-draft.md +10 -12
  180. package/playbooks/qa-session-execute.md +16 -12
  181. package/playbooks/qa-validate.md +8 -7
  182. package/playbooks/shared-rules.md +45 -0
  183. package/playbooks/test.md +4 -0
  184. package/prompts/cc-system.md +1 -1
  185. package/skills/check-self-authored-review-comment/SKILL.md +2 -2
@@ -33,7 +33,7 @@
33
33
 
34
34
  const fs = require('fs');
35
35
  const path = require('path');
36
- const { runFile, cleanChildEnv, killGracefully, killImmediate, killByPidsImmediate, listProcessDescendants, ts, readFileNoFollow } = require('./shared');
36
+ const { runFile, cleanChildEnv, killImmediate, killByPidsImmediate, listProcessDescendants, ts, readFileNoFollow } = require('./shared');
37
37
  const {
38
38
  resolveRuntime,
39
39
  RUNTIME_OPTIONS_FLAG,
@@ -80,9 +80,15 @@ function parseSpawnArgs(argv) {
80
80
  case '--no-verbose': opts.verbose = false; break;
81
81
  case '--stream': opts.stream = peek(); break;
82
82
  case '--disable-builtin-mcps': opts.disableBuiltinMcps = true; break;
83
- case '--no-custom-instructions': opts.suppressAgentsMd = true; break;
84
83
  case '--enable-reasoning-summaries': opts.reasoningSummaries = true; break;
85
84
  case RUNTIME_OPTIONS_FLAG: Object.assign(opts, decodeRuntimeOptions(peek())); break;
85
+ // P-mcp-storm — repeatable; accumulate user MCP server names to disable.
86
+ // copilot.buildArgs re-emits these as --disable-mcp-server <name> on the CLI.
87
+ case '--disable-mcp-server': {
88
+ const v = peek();
89
+ if (typeof v === 'string' && v) (opts.disabledMcpServers ||= []).push(v);
90
+ break;
91
+ }
86
92
  // LEGACY: dropped — the runtime adapter emits its own permission flag.
87
93
  // Pre-P-2a6d9c4f engine.js still passes `--permission-mode bypassPermissions`;
88
94
  // letting it through would duplicate the permission flag for Claude.
@@ -129,6 +135,24 @@ function buildSpawnInvocation({ runtime, resolved, promptText, sysPromptText, op
129
135
  };
130
136
  }
131
137
 
138
+ function deliverPromptToStdin(stdin, prompt, onError) {
139
+ let settled = false;
140
+ const fail = (err) => {
141
+ if (settled) return;
142
+ settled = true;
143
+ onError(err);
144
+ };
145
+ stdin.on('error', fail); // Keep consuming late EPIPE/EOF events after end() settles.
146
+ try {
147
+ stdin.end(prompt, (err) => {
148
+ if (err) fail(err);
149
+ else settled = true;
150
+ });
151
+ } catch (err) {
152
+ fail(err);
153
+ }
154
+ }
155
+
132
156
  function normalizeRuntimeExit(code, signal) {
133
157
  if (Number.isInteger(code)) return code;
134
158
  if (signal) return 128;
@@ -605,15 +629,12 @@ function main() {
605
629
 
606
630
  // Deliver the prompt — stdin (Claude default) vs argv (handled by adapter).
607
631
  if (invocation.deliveryMode === 'stdin') {
608
- try {
609
- proc.stdin.write(invocation.finalPrompt);
610
- proc.stdin.end();
611
- } catch (err) {
612
- console.error(`FATAL: stdin write failed (broken pipe): ${err.message}`);
613
- fs.appendFileSync(debugPath, `STDIN ERROR: ${err.message}\n`);
632
+ deliverPromptToStdin(proc.stdin, invocation.finalPrompt, (err) => {
633
+ console.error(`FATAL: child startup stdin delivery failed (${err.code || 'error'}): ${err.message}`);
634
+ fs.appendFileSync(debugPath, `STDIN ERROR (${err.code || 'error'}): ${err.message}\n`);
614
635
  killImmediate(proc);
615
636
  process.exit(1);
616
- }
637
+ });
617
638
  } else {
618
639
  // Adapter has already spliced the prompt into argv (--prompt <text>).
619
640
  // Close stdin so the runtime doesn't wait on it.
@@ -651,18 +672,24 @@ function main() {
651
672
  // Forward output without depending on the parent engine pipe staying alive.
652
673
  proc.stdout.on('data', forwardStdout);
653
674
 
654
- // MCP startup timeout: kill if no stdout within 3 minutes
655
- const MCP_STARTUP_TIMEOUT = 180000; // 3 minutes
675
+ // NO stdout-only startup timer. A productive runtime (Copilot in particular)
676
+ // can legitimately emit zero stdout until it writes its terminal result, so a
677
+ // "no output after Ns → kill" timer produces false TIMEOUT failures on agents
678
+ // that are actively working (incident: ralph-fix-mrz8ka5g0015124a pushed merge
679
+ // commit 8b0e6ff1 and wrote a nonce-valid success report, yet the 180s timer's
680
+ // killGracefully forced result:error). Startup-stall detection is owned by the
681
+ // engine-side spawn-phase watchdog (engine/spawn-phase-watchdog.js), which
682
+ // distinguishes a genuinely wedged pre-task process (idle, no live-output task
683
+ // activity, CPU below threshold past the grace window) from a productive-but-
684
+ // silent one (burning CPU) — preserving the invariant that a live tracked agent
685
+ // is never killed merely for output silence.
686
+ //
687
+ // We still note the first stdout chunk: the close handler uses `gotFirstOutput`
688
+ // as a heuristic to force a final descendant snapshot for agents that produced
689
+ // output (and thus likely spawned MCP children) even when the 3s initial
690
+ // snapshot missed them. This is a bookkeeping flag, not a timer.
656
691
  let gotFirstOutput = false;
657
- const startupTimer = setTimeout(() => {
658
- if (!gotFirstOutput) {
659
- const msg = `TIMEOUT: ${runtimeName} CLI produced no output after ${MCP_STARTUP_TIMEOUT / 1000}s (likely MCP server startup stall)`;
660
- console.error(msg);
661
- fs.appendFileSync(debugPath, msg + '\n');
662
- killGracefully(proc);
663
- }
664
- }, MCP_STARTUP_TIMEOUT);
665
- proc.stdout.once('data', () => { gotFirstOutput = true; clearTimeout(startupTimer); });
692
+ proc.stdout.once('data', () => { gotFirstOutput = true; });
666
693
 
667
694
  // Descendant snapshot loop (orphan-MCP fix). The runtime CLI (claude/copilot)
668
695
  // spawns one node child per configured MCP server (Azure, Playwright, Loop,
@@ -705,7 +732,6 @@ function main() {
705
732
  if (signal) realSignalFromEvent = signal;
706
733
  });
707
734
  proc.on('close', (code, signal) => {
708
- clearTimeout(startupTimer);
709
735
  clearTimeout(initialSnapshotTimer);
710
736
  clearInterval(descTimer);
711
737
 
@@ -823,6 +849,7 @@ module.exports = {
823
849
  writeProcessExitSentinel,
824
850
  preApproveWorkspaceMcps,
825
851
  createParentPipeForwarder,
852
+ deliverPromptToStdin, // exported for testing
826
853
  assertStaleHeadOk,
827
854
  hydrateRuntimeOptionFiles, // exported for testing
828
855
  };
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ const SCOPE = Object.freeze({
4
+ AGENT: 'agent',
5
+ CURRENT_DISPATCH: 'current-dispatch',
6
+ });
7
+
8
+ const SUPERSEDE_MODE = Object.freeze({
9
+ ALL: 'all',
10
+ UNACKED: 'unacked',
11
+ });
12
+
13
+ const STEER_ID_PATTERN = /^steer-[a-f0-9]{10}$/;
14
+
15
+ function isSteerId(value) {
16
+ return typeof value === 'string' && STEER_ID_PATTERN.test(value);
17
+ }
18
+
19
+ function isSupersedeValue(value) {
20
+ return value === SUPERSEDE_MODE.ALL
21
+ || value === SUPERSEDE_MODE.UNACKED
22
+ || isSteerId(value);
23
+ }
24
+
25
+ module.exports = {
26
+ SCOPE,
27
+ SUPERSEDE_MODE,
28
+ STEER_ID_PATTERN,
29
+ isSteerId,
30
+ isSupersedeValue,
31
+ };
@@ -154,15 +154,23 @@ function updateStatus(id, status, opts = {}) {
154
154
  function listForAgent(agentId, opts = {}) {
155
155
  if (!agentId) return [];
156
156
  const limit = Math.max(1, Math.min(500, Number(opts.limit) || 50));
157
+ const status = opts.status == null ? null : String(opts.status);
158
+ if (status !== null && !VALID_STATUSES.has(status)) {
159
+ throw new Error(`steering-store.listForAgent: invalid status '${status}'`);
160
+ }
157
161
  let db;
158
162
  try { const { getDb } = require('./db'); db = getDb(); }
159
163
  catch { return []; }
164
+ const statusClause = status === null ? '' : ' AND status = ?';
165
+ const params = status === null
166
+ ? [String(agentId), limit]
167
+ : [String(agentId), status, limit];
160
168
  const rows = db.prepare(`
161
169
  SELECT * FROM steering_deliveries
162
- WHERE agent_id = ?
170
+ WHERE agent_id = ?${statusClause}
163
171
  ORDER BY created_at DESC, rowid DESC
164
172
  LIMIT ?
165
- `).all(String(agentId), limit);
173
+ `).all(...params);
166
174
  return rows.map(_rowToRecord);
167
175
  }
168
176
 
@@ -7,6 +7,13 @@ const fs = require('fs');
7
7
  const path = require('path');
8
8
  const shared = require('./shared');
9
9
  const { wrapUntrusted, buildSource } = require('./untrusted-fence');
10
+ const {
11
+ SCOPE,
12
+ SUPERSEDE_MODE,
13
+ STEER_ID_PATTERN,
14
+ isSteerId,
15
+ isSupersedeValue,
16
+ } = require('./steering-constraints');
10
17
 
11
18
  const AGENTS_DIR = path.join(shared.MINIONS_DIR, 'agents');
12
19
 
@@ -349,9 +356,9 @@ function supersedeMessages(agentId, mode, opts = {}) {
349
356
  for (const entry of entries) {
350
357
  const status = entry.status || STATUS.QUEUED;
351
358
  let target = false;
352
- if (mode === 'all') {
359
+ if (mode === SUPERSEDE_MODE.ALL) {
353
360
  if (status !== STATUS.ACKNOWLEDGED && status !== STATUS.DROPPED) target = true;
354
- } else if (mode === 'unacked') {
361
+ } else if (mode === SUPERSEDE_MODE.UNACKED) {
355
362
  if (UNACKED_STATUSES.has(status)) target = true;
356
363
  } else {
357
364
  // Specific steerId
@@ -514,6 +521,11 @@ module.exports = {
514
521
  ackProcessedSteeringMessages,
515
522
  ackSteeringFromAckDir,
516
523
  STATUS,
524
+ SCOPE,
525
+ SUPERSEDE_MODE,
526
+ STEER_ID_PATTERN,
527
+ isSteerId,
528
+ isSupersedeValue,
517
529
  DEDUPE_WINDOW_MS,
518
530
  // Exposed for unit tests only.
519
531
  _updateEntryStatus,