@yemi33/minions 0.1.2424 → 0.1.2425
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/bin/install-internal-minions.js +1209 -0
- package/bin/minions.js +75 -9
- package/dashboard/docs/typography.md +27 -12
- package/dashboard/js/command-center.js +13 -11
- package/dashboard/js/live-stream.js +1 -1
- package/dashboard/js/memory-search.js +388 -43
- package/dashboard/js/modal-qa.js +5 -5
- package/dashboard/js/qa.js +39 -26
- package/dashboard/js/refresh.js +37 -18
- package/dashboard/js/render-agents.js +14 -18
- package/dashboard/js/render-dispatch.js +14 -74
- package/dashboard/js/render-inbox.js +3 -3
- package/dashboard/js/render-meetings.js +8 -8
- package/dashboard/js/render-other.js +45 -20
- package/dashboard/js/render-pipelines.js +6 -6
- package/dashboard/js/render-plans.js +14 -14
- package/dashboard/js/render-prd.js +46 -46
- package/dashboard/js/render-prs.js +9 -65
- package/dashboard/js/render-schedules.js +5 -5
- package/dashboard/js/render-skills.js +6 -6
- package/dashboard/js/render-utils.js +4 -4
- package/dashboard/js/render-watches.js +4 -16
- package/dashboard/js/render-work-items.js +95 -107
- package/dashboard/js/settings.js +175 -74
- package/dashboard/layout.html +3 -2
- package/dashboard/pages/inbox.html +1 -1
- package/dashboard/pages/work.html +1 -1
- package/dashboard/shared/model-display.js +9 -0
- package/dashboard/shared/watches-source.js +43 -0
- package/dashboard/shared/welcome-popup.js +259 -0
- package/dashboard/slim/body.html +6 -6
- package/dashboard/slim/js/chat.js +4 -2
- package/dashboard/slim/js/history.js +10 -3
- package/dashboard/slim/js/modals-tiles.js +85 -16
- package/dashboard/slim/js/status.js +12 -16
- package/dashboard/slim/styles.css +24 -4
- package/dashboard/styles.css +62 -27
- package/dashboard-build.js +8 -2
- package/dashboard.js +3854 -2514
- package/docs/README.md +6 -4
- package/docs/api-errors.md +144 -0
- package/docs/auto-discovery.md +83 -61
- package/docs/capture-demos.js +173 -30
- package/docs/command-center.md +5 -1
- package/docs/completion-reports.md +127 -11
- package/docs/constants.md +15 -3
- package/docs/constellation-style-telemetry.md +2 -2
- package/docs/copilot-cli-schema.md +32 -22
- package/docs/cross-repo-plans.md +30 -30
- package/docs/demo/memory-system.html +1 -1
- package/docs/deprecated.json +132 -18
- package/docs/diagnostics-memory.md +8 -4
- package/docs/human-vs-automated.md +2 -2
- package/docs/internal-install.md +190 -0
- package/docs/kb-pr3223-cascade-archiving.md +16 -0
- package/docs/kb-pr696-merge-conflict-docs.md +23 -0
- package/docs/kb-sweep.md +2 -2
- package/docs/keep-processes.md +8 -1
- package/docs/live-checkout-mode.md +1 -1
- package/docs/managed-spawn.md +21 -3
- package/docs/named-agents.md +3 -2
- package/docs/plan-lifecycle.md +32 -32
- package/docs/pr-screenshots/pr-899/worker-pool-worktrees-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-899/worker-pool-worktrees-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-979/auto-fix-pane-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-979/auto-fix-pane-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-985/pr-column-em-dash-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-985/pr-column-em-dash-BEFORE.png +0 -0
- package/docs/qa-runbook-lifecycle.md +67 -51
- package/docs/qa-runbooks.md +2 -2
- package/docs/runtime-adapters.md +101 -50
- package/docs/security.md +28 -0
- package/docs/self-improvement.md +47 -13
- package/docs/skills.md +29 -0
- package/docs/slim-ux/concepts.md +2 -2
- package/docs/specs/agent-configurability.md +43 -41
- package/docs/specs/agent-rename.md +13 -13
- package/docs/team-memory.md +283 -14
- package/docs/tutorials/03-plan-driven-feature.md +3 -3
- package/docs/tutorials/04-runtimes-and-harness.md +18 -21
- package/docs/tutorials/08-operations-and-recovery.md +3 -2
- package/docs/tutorials/README.md +4 -3
- package/docs/visual-evidence-ci.md +103 -0
- package/docs/watches.md +35 -30
- package/docs/worktree-lifecycle.md +151 -13
- package/engine/acp-transport.js +1 -0
- package/engine/ado.js +80 -33
- package/engine/agent-api-validation.js +571 -0
- package/engine/agent-worker-pool.js +7 -6
- package/engine/api-contracts/agent-content.js +761 -0
- package/engine/api-contracts/cc-ops.js +219 -0
- package/engine/api-contracts/config-runtime.js +419 -0
- package/engine/api-contracts/core.js +138 -0
- package/engine/api-contracts/index.js +506 -0
- package/engine/api-contracts/orchestration.js +602 -0
- package/engine/api-contracts/pull-requests.js +323 -0
- package/engine/api-contracts/qa-process.js +764 -0
- package/engine/api-contracts/work-plan-prd.js +494 -0
- package/engine/api-validation.js +543 -0
- package/engine/cc-api-validation.js +586 -0
- package/engine/cc-worker-pool.js +9 -1
- package/engine/cleanup.js +393 -271
- package/engine/cli.js +65 -7
- package/engine/comment-classifier.js +70 -5
- package/engine/consolidation.js +123 -5
- package/engine/content-api-validation.js +606 -0
- package/engine/create-pr-worktree.js +22 -1
- package/engine/db/migrations/027-review-learning-lifecycle.js +162 -0
- package/engine/dispatch.js +33 -0
- package/engine/distribution.js +189 -0
- package/engine/execution-model.js +59 -0
- package/engine/features.js +12 -0
- package/engine/github.js +67 -25
- package/engine/harness-context.js +313 -0
- package/engine/inbox-store.js +1 -1
- package/engine/kb-sweep.js +161 -38
- package/engine/keep-process-sweep.js +43 -3
- package/engine/lifecycle.js +1066 -165
- package/engine/llm.js +4 -0
- package/engine/managed-spawn.js +463 -48
- package/engine/meeting.js +197 -34
- package/engine/memory-retrieval.js +280 -0
- package/engine/memory-store.js +821 -38
- package/engine/model-discovery.js +17 -3
- package/engine/pipeline.js +802 -14
- package/engine/plan-prd-validation.js +745 -0
- package/engine/playbook.js +206 -17
- package/engine/pooled-agent-process.js +6 -1
- package/engine/pr-action.js +1 -1
- package/engine/pr-issue-validation.js +653 -0
- package/engine/pr-resolve.js +75 -13
- package/engine/prd-store.js +39 -6
- package/engine/preflight.js +7 -2
- package/engine/process-utils.js +79 -31
- package/engine/projects.js +198 -12
- package/engine/promotion.js +371 -0
- package/engine/qa-from-prd.js +3 -0
- package/engine/qa-process-validation.js +572 -0
- package/engine/qa-runbooks.js +41 -37
- package/engine/qa-runners/maestro.js +11 -7
- package/engine/qa-runners/playwright.js +37 -14
- package/engine/qa-runners.js +9 -10
- package/engine/qa-runs.js +124 -11
- package/engine/qa-sessions.js +139 -40
- package/engine/quarantine-refs.js +81 -11
- package/engine/queries.js +163 -9
- package/engine/review-learning-backfill.js +482 -0
- package/engine/review-learning.js +1236 -0
- package/engine/runtimes/claude.js +60 -2
- package/engine/runtimes/codex.js +57 -16
- package/engine/runtimes/contract.js +21 -0
- package/engine/runtimes/copilot.js +51 -3
- package/engine/runtimes/index.js +1 -0
- package/engine/scheduler.js +201 -32
- package/engine/settings-validation.js +909 -0
- package/engine/shared.js +705 -208
- package/engine/spawn-agent.js +48 -21
- package/engine/steering-constraints.js +31 -0
- package/engine/steering-store.js +10 -2
- package/engine/steering.js +14 -2
- package/engine/timeout.js +404 -111
- package/engine/untrusted-fence.js +24 -10
- package/engine/watch-actions.js +7 -2
- package/engine/watches.js +353 -51
- package/engine/work-item-validation.js +561 -0
- package/engine/work-items-store.js +61 -1
- package/engine/worktree-gc.js +656 -37
- package/engine/worktree-preflight.js +154 -0
- package/engine.js +2068 -342
- package/package.json +1 -1
- package/playbooks/_pr-description-audit.md +88 -41
- package/playbooks/build-fix-complex.md +3 -3
- package/playbooks/docs.md +2 -2
- package/playbooks/fix.md +18 -18
- package/playbooks/implement.md +18 -18
- package/playbooks/qa-session-draft.md +10 -12
- package/playbooks/qa-session-execute.md +16 -12
- package/playbooks/qa-validate.md +8 -7
- package/playbooks/shared-rules.md +45 -0
- package/playbooks/test.md +4 -0
- package/prompts/cc-system.md +1 -1
- package/skills/check-self-authored-review-comment/SKILL.md +2 -2
package/engine/spawn-agent.js
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
|
|
34
34
|
const fs = require('fs');
|
|
35
35
|
const path = require('path');
|
|
36
|
-
const { runFile, cleanChildEnv,
|
|
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
|
-
|
|
609
|
-
|
|
610
|
-
|
|
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
|
-
//
|
|
655
|
-
|
|
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
|
-
|
|
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
|
+
};
|
package/engine/steering-store.js
CHANGED
|
@@ -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(
|
|
173
|
+
`).all(...params);
|
|
166
174
|
return rows.map(_rowToRecord);
|
|
167
175
|
}
|
|
168
176
|
|
package/engine/steering.js
CHANGED
|
@@ -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 ===
|
|
359
|
+
if (mode === SUPERSEDE_MODE.ALL) {
|
|
353
360
|
if (status !== STATUS.ACKNOWLEDGED && status !== STATUS.DROPPED) target = true;
|
|
354
|
-
} else if (mode ===
|
|
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,
|