@yemi33/minions 0.1.2448 → 0.1.2449
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/cli-api-client.js +1 -1
- package/bin/install-internal-minions.js +1382 -44
- package/bin/install-layout.js +150 -0
- package/bin/minions.js +460 -167
- package/dashboard/docs/typography.md +65 -12
- package/dashboard/js/command-center.js +58 -4
- package/dashboard/js/detail-panel.js +36 -0
- package/dashboard/js/memory-panel.js +59 -12
- package/dashboard/js/qa.js +179 -20
- package/dashboard/js/refresh.js +148 -12
- package/dashboard/js/render-dispatch.js +3 -4
- package/dashboard/js/render-inbox.js +2 -2
- package/dashboard/js/render-other.js +3 -3
- package/dashboard/js/render-pipelines.js +14 -0
- package/dashboard/js/render-plans.js +57 -9
- package/dashboard/js/render-prd.js +132 -23
- package/dashboard/js/render-prs.js +195 -166
- package/dashboard/js/render-schedules.js +63 -3
- package/dashboard/js/render-utils.js +3 -3
- package/dashboard/js/render-watches.js +19 -3
- package/dashboard/js/render-work-items.js +238 -30
- package/dashboard/js/settings.js +205 -54
- package/dashboard/js/utils.js +51 -1
- package/dashboard/pages/home.html +1 -1
- package/dashboard/pages/qa.html +1 -16
- package/dashboard/pages/work.html +40 -0
- package/dashboard/shared/cc-limits.js +79 -0
- package/dashboard/shared/pr-filters.js +21 -38
- package/dashboard/shared/project-git-summary.js +1 -1
- package/dashboard/shared/record-filters.js +169 -0
- package/dashboard/shared/watches-source.js +1 -1
- package/dashboard/shared/welcome-popup.js +1 -1
- package/dashboard/shared/wi-filters.js +302 -0
- package/dashboard/slim/body.html +1 -0
- package/dashboard/slim/js/command-send.js +26 -0
- package/dashboard/slim/js/modals-tiles.js +380 -39
- package/dashboard/slim/js/status.js +13 -21
- package/dashboard/slim/layout.html +1 -0
- package/dashboard/slim/panel-bootstrap.js +6 -2
- package/dashboard/slim/styles.css +38 -0
- package/dashboard/styles.css +159 -55
- package/dashboard-build.js +13 -2
- package/dashboard.js +956 -423
- package/docs/README.md +11 -6
- package/docs/api-errors.md +2 -2
- package/docs/architecture-review-2026-07-09.md +1 -1
- package/docs/architecture.excalidraw +2 -2
- package/docs/auto-discovery.md +18 -9
- package/docs/branch-derivation.md +4 -4
- package/docs/capture-demos.js +39 -2
- package/docs/ci-runner-canary.md +123 -0
- package/docs/claude-md-propagation.md +2 -2
- package/docs/cloud-agent-dispatch.md +204 -0
- package/docs/command-center.md +7 -7
- package/docs/completion-reports.md +43 -20
- package/docs/constants.md +10 -3
- package/docs/constellation-bridge.md +134 -6
- package/docs/constellation-style-telemetry.md +4 -4
- package/docs/contracts/capability-protocol.v1.json +165 -0
- package/docs/cooldown-merge-semantics.md +12 -12
- package/docs/copilot-cli-schema.md +7 -7
- package/docs/cross-repo-plans.md +10 -10
- package/docs/dead-code-audit-retractions.md +5 -5
- package/docs/default-branch-ci.md +173 -0
- package/docs/deprecated.json +31 -31
- package/docs/design-inbox-entries-schema.md +3 -3
- package/docs/design-language.md +1051 -0
- package/docs/design-state-storage.md +11 -11
- package/docs/diagnostics-crash-reports.md +9 -9
- package/docs/diagnostics-memory.md +5 -5
- package/docs/documentation-audit-2026-07-09.md +7 -7
- package/docs/engine-restart.md +90 -5
- package/docs/harness-mode.md +1 -1
- package/docs/internal-install.md +338 -39
- package/docs/kb-dedup-duplicate-pair-investigation.md +5 -5
- package/docs/kb-pr3223-cascade-archiving.md +1 -1
- package/docs/kb-pr696-merge-conflict-docs.md +6 -6
- package/docs/kb-sweep.md +35 -35
- package/docs/keep-processes.md +1 -1
- package/docs/live-checkout-mode.md +30 -30
- package/docs/managed-spawn.md +18 -14
- package/docs/named-agents.md +7 -7
- package/docs/plan-lifecycle.md +69 -2
- package/docs/pr-author-identity.md +114 -0
- package/docs/pr-auto-fix-dispatch.md +19 -4
- package/docs/pr-comment-followup.md +6 -6
- package/docs/pr-review-fix-loop.md +59 -10
- package/docs/process-termination.md +40 -0
- package/docs/proposals/repo-pool-for-live-checkout.md +13 -13
- package/docs/qa-runbook-lifecycle.md +367 -17
- package/docs/qa-runbooks.md +3 -3
- package/docs/rfc-completion-json.md +18 -18
- package/docs/runtime-adapters.md +26 -21
- package/docs/security.md +6 -6
- package/docs/self-improvement.md +4 -4
- package/docs/shared-lifecycle-module-map.md +473 -472
- package/docs/skills.md +52 -3
- package/docs/slim-ux/concepts.md +121 -116
- package/docs/specs/agent-configurability.md +18 -18
- package/docs/specs/agent-rename.md +18 -18
- package/docs/team-memory.md +38 -21
- package/docs/timeouts-and-liveness.md +118 -10
- package/docs/tutorials/01-install-and-connect.md +1 -1
- package/docs/watches.md +40 -39
- package/docs/workspace-manifests.md +4 -4
- package/docs/worktree-lifecycle.md +293 -14
- package/engine/README.md +46 -0
- package/engine/{ado-comment.js → ado/comment.js} +8 -8
- package/engine/{ado-git-auth.js → ado/git-auth.js} +4 -4
- package/engine/{ado.js → ado/index.js} +417 -63
- package/engine/{ado-status.js → ado/status.js} +6 -8
- package/engine/{ado-token.js → ado/token.js} +1 -1
- package/engine/{acp-transport.js → agents/acp-transport.js} +62 -22
- package/engine/{agent-worker-pool.js → agents/agent-worker-pool.js} +17 -8
- package/engine/{cc-worker-pool.js → agents/cc-worker-pool.js} +16 -6
- package/engine/{claude-md-context.js → agents/claude-md-context.js} +5 -5
- package/engine/{harness-context.js → agents/harness-context.js} +5 -5
- package/engine/{harness.js → agents/harness.js} +3 -3
- package/engine/{llm.js → agents/llm.js} +18 -14
- package/engine/{model-discovery.js → agents/model-discovery.js} +2 -2
- package/engine/{playbook.js → agents/playbook.js} +155 -22
- package/engine/{pooled-agent-process.js → agents/pooled-agent-process.js} +14 -12
- package/engine/{preflight.js → agents/preflight.js} +29 -10
- package/engine/{spawn-agent.js → agents/spawn-agent.js} +25 -14
- package/engine/{spawn-phase-watchdog.js → agents/spawn-phase-watchdog.js} +16 -7
- package/engine/{steering.js → agents/steering.js} +5 -5
- package/engine/{tools-inventory.js → agents/tools-inventory.js} +2 -2
- package/engine/{agent-api-validation.js → api/agent-api-validation.js} +2 -2
- package/engine/{api-validation.js → api/api-validation.js} +1 -1
- package/engine/api/bridge.js +787 -0
- package/engine/{cc-api-validation.js → api/cc-api-validation.js} +1 -1
- package/engine/api/companion.js +560 -0
- package/engine/{content-api-validation.js → api/content-api-validation.js} +2 -2
- package/engine/{pr-issue-validation.js → api/pr-issue-validation.js} +33 -6
- package/engine/{settings-validation.js → api/settings-validation.js} +32 -4
- package/engine/api-contracts/agent-content.js +4 -4
- package/engine/api-contracts/capability-manifest.js +236 -0
- package/engine/api-contracts/capability-protocol.js +333 -0
- package/engine/api-contracts/cc-ops.js +1 -1
- package/engine/api-contracts/config-runtime.js +5 -0
- package/engine/api-contracts/core.js +28 -1
- package/engine/api-contracts/index.js +100 -0
- package/engine/api-contracts/orchestration.js +18 -5
- package/engine/api-contracts/pull-requests.js +37 -6
- package/engine/api-contracts/qa-process.js +29 -6
- package/engine/api-contracts/work-plan-prd.js +21 -1
- package/engine/cloud/contract.js +212 -0
- package/engine/cloud/index.js +159 -0
- package/engine/{execution-model.js → core/execution-model.js} +1 -1
- package/engine/{features.js → core/features.js} +4 -4
- package/engine/{operator-identity.js → core/operator-identity.js} +1 -1
- package/engine/{queries.js → core/queries.js} +201 -36
- package/engine/{safe-expr.js → core/safe-expr.js} +1 -1
- package/engine/{shared.js → core/shared.js} +1637 -175
- package/engine/{stdio-timestamps.js → core/stdio-timestamps.js} +1 -1
- package/engine/{untrusted-fence.js → core/untrusted-fence.js} +3 -3
- package/engine/db/index.js +11 -2
- package/engine/db/migrations/002-dispatches.js +3 -3
- package/engine/db/migrations/003-work-items.js +1 -1
- package/engine/db/migrations/004-pull-requests.js +1 -1
- package/engine/db/migrations/006-metrics.js +1 -1
- package/engine/db/migrations/007-watches.js +2 -2
- package/engine/db/migrations/008-small-state.js +1 -1
- package/engine/db/migrations/009-qa.js +1 -1
- package/engine/db/migrations/010-pr-links.js +1 -1
- package/engine/db/migrations/011-remaining-state.js +1 -1
- package/engine/db/migrations/012-steering-deliveries.js +2 -2
- package/engine/db/migrations/013-backfill-broken-note-links.js +1 -1
- package/engine/db/migrations/014-pr-fix-target-prefs.js +2 -2
- package/engine/db/migrations/015-plans-prds.js +0 -0
- package/engine/db/migrations/018-sql-only-cutover.js +2 -2
- package/engine/db/migrations/021-archived-work-items.js +1 -1
- package/engine/db/migrations/022-global-cc-session.js +1 -1
- package/engine/db/migrations/023-engine-state.js +1 -1
- package/engine/db/migrations/025-malformed-work-item-phantoms.js +1 -1
- package/engine/db/migrations/027-review-learning-lifecycle.js +1 -1
- package/engine/db/migrations/029-repair-reused-versions.js +20 -0
- package/engine/db/migrations/031-pr-author-identity.js +137 -0
- package/engine/{consolidation.js → memory/consolidation.js} +6 -6
- package/engine/{kb-sweep-runner.js → memory/kb-sweep-runner.js} +2 -2
- package/engine/{kb-sweep.js → memory/kb-sweep.js} +9 -7
- package/engine/{memory-retrieval.js → memory/memory-retrieval.js} +46 -4
- package/engine/{memory-store.js → memory/memory-store.js} +3 -3
- package/engine/{promotion.js → memory/promotion.js} +3 -3
- package/engine/{review-learning-backfill.js → memory/review-learning-backfill.js} +6 -6
- package/engine/{review-learning.js → memory/review-learning.js} +10 -5
- package/engine/{diagnostics-memory.js → observability/diagnostics-memory.js} +1 -1
- package/engine/{logs-store.js → observability/logs-store.js} +5 -5
- package/engine/{metrics-store.js → observability/metrics-store.js} +4 -4
- package/engine/{check-status.js → operations/check-status.js} +3 -3
- package/engine/{cli.js → operations/cli.js} +271 -113
- package/engine/{distribution.js → operations/distribution.js} +5 -6
- package/engine/{cleanup.js → orchestration/cleanup.js} +72 -45
- package/engine/{cooldown.js → orchestration/cooldown.js} +5 -5
- package/engine/{dispatch-events.js → orchestration/dispatch-events.js} +2 -2
- package/engine/{dispatch.js → orchestration/dispatch.js} +129 -36
- package/engine/orchestration/failed-scheduled-cleanup.js +274 -0
- package/engine/{lifecycle.js → orchestration/lifecycle.js} +198 -90
- package/engine/{meeting.js → orchestration/meeting.js} +6 -16
- package/engine/{pipeline.js → orchestration/pipeline.js} +12 -12
- package/engine/{pre-dispatch-eval.js → orchestration/pre-dispatch-eval.js} +10 -9
- package/engine/{routing.js → orchestration/routing.js} +3 -3
- package/engine/{schedule-bootstrap.js → orchestration/schedule-bootstrap.js} +4 -4
- package/engine/{scheduler.js → orchestration/scheduler.js} +38 -8
- package/engine/{timeout.js → orchestration/timeout.js} +158 -109
- package/engine/{db-events.js → persistence/db-events.js} +2 -2
- package/engine/{dispatch-store.js → persistence/dispatch-store.js} +7 -7
- package/engine/{inbox-store.js → persistence/inbox-store.js} +2 -2
- package/engine/{note-link-backfill.js → persistence/note-link-backfill.js} +4 -4
- package/engine/{pr-fix-target-store.js → persistence/pr-fix-target-store.js} +8 -8
- package/engine/{pull-requests-store.js → persistence/pull-requests-store.js} +21 -7
- package/engine/{small-state-store.js → persistence/small-state-store.js} +31 -31
- package/engine/persistence/state-operations.js +350 -0
- package/engine/{steering-store.js → persistence/steering-store.js} +6 -6
- package/engine/{issues.js → planning/issues.js} +2 -2
- package/engine/{plan-prd-validation.js → planning/plan-prd-validation.js} +8 -2
- package/engine/planning/prd-result-sidecar.js +190 -0
- package/engine/{prd-store.js → planning/prd-store.js} +17 -17
- package/engine/{project-discovery.js → planning/project-discovery.js} +5 -5
- package/engine/{projects.js → planning/projects.js} +10 -10
- package/engine/{resolve-area.js → planning/resolve-area.js} +1 -1
- package/engine/{work-item-validation.js → planning/work-item-validation.js} +39 -3
- package/engine/{work-items-store.js → planning/work-items-store.js} +29 -21
- package/engine/{keep-process-sweep.js → processes/keep-process-sweep.js} +57 -17
- package/engine/{managed-spawn-launcher.js → processes/managed-spawn-launcher.js} +3 -3
- package/engine/{managed-spawn.js → processes/managed-spawn.js} +97 -46
- package/engine/{process-utils.js → processes/process-utils.js} +599 -55
- package/engine/{abandoned-pr-reconciliation.js → providers/abandoned-pr-reconciliation.js} +17 -7
- package/engine/{comment-classifier.js → providers/comment-classifier.js} +85 -17
- package/engine/{comment-format.js → providers/comment-format.js} +5 -5
- package/engine/{gh-comment.js → providers/gh-comment.js} +15 -15
- package/engine/{gh-token.js → providers/gh-token.js} +4 -4
- package/engine/{github.js → providers/github.js} +131 -54
- package/engine/{pr-action.js → providers/pr-action.js} +13 -12
- package/engine/{pr-clone-keep.js → providers/pr-clone-keep.js} +7 -7
- package/engine/{pr-devbox.js → providers/pr-devbox.js} +6 -6
- package/engine/{pr-fix-target.js → providers/pr-fix-target.js} +13 -13
- package/engine/{pr-remote-patch.js → providers/pr-remote-patch.js} +4 -4
- package/engine/{pr-resolve.js → providers/pr-resolve.js} +7 -7
- package/engine/{pr-temp-clone.js → providers/pr-temp-clone.js} +5 -5
- package/engine/{pr-track.js → providers/pr-track.js} +11 -13
- package/engine/{shared-branch-pr-reconcile.js → providers/shared-branch-pr-reconcile.js} +4 -4
- package/engine/qa/auto-prd-qa.js +313 -0
- package/engine/{qa-from-prd.js → qa/from-prd.js} +42 -12
- package/engine/qa/prd-session.js +240 -0
- package/engine/{qa-process-validation.js → qa/process-validation.js} +14 -9
- package/engine/{qa-runbooks.js → qa/runbooks.js} +1 -1
- package/engine/{qa-runs.js → qa/runs.js} +286 -15
- package/engine/{qa-sessions.js → qa/sessions.js} +595 -49
- package/engine/qa/visual-journey.js +654 -0
- package/engine/{qa-runners.js → qa-runners/index.js} +7 -7
- package/engine/qa-runners/maestro.js +3 -3
- package/engine/qa-runners/playwright.js +2 -2
- package/engine/{restart-health.js → recovery/restart-health.js} +48 -4
- package/engine/recovery/stop-stack.js +607 -0
- package/engine/{supervisor.js → recovery/supervisor.js} +105 -175
- package/engine/{watchdog.js → recovery/watchdog.js} +136 -13
- package/engine/runtimes/claude.js +14 -12
- package/engine/runtimes/codex.js +8 -6
- package/engine/runtimes/copilot.js +17 -16
- package/engine/{watch-actions.js → watches/actions.js} +13 -13
- package/engine/{watches.js → watches/index.js} +43 -32
- package/engine/{watches-store.js → watches/store.js} +4 -4
- package/engine/{create-pr-worktree.js → worktrees/create-pr.js} +1 -1
- package/engine/{worktree-gc.js → worktrees/gc.js} +70 -22
- package/engine/worktrees/inventory.js +671 -0
- package/engine/{live-checkout.js → worktrees/live-checkout.js} +4 -4
- package/engine/{worktree-pool.js → worktrees/pool.js} +2 -2
- package/engine/{worktree-preflight.js → worktrees/preflight.js} +1 -0
- package/engine/worktrees/quarantine-refs.js +173 -0
- package/engine.js +1137 -208
- package/minions.js +147 -77
- package/package.json +10 -6
- package/playbooks/_pr-description-audit.md +110 -78
- package/playbooks/build-fix-complex.md +2 -0
- package/playbooks/fix.md +16 -12
- package/playbooks/implement-shared.md +2 -0
- package/playbooks/implement.md +19 -20
- package/playbooks/plan-to-prd.md +18 -3
- package/playbooks/qa-session-draft.md +136 -1
- package/playbooks/qa-session-execute.md +80 -2
- package/playbooks/qa-session-setup.md +17 -1
- package/playbooks/qa-validate.md +1 -1
- package/playbooks/setup.md +2 -0
- package/playbooks/shared-rules.md +25 -32
- package/playbooks/templates/followup-dispatch.md +4 -3
- package/playbooks/verify.md +1 -1
- package/prompts/cc-system.md +19 -27
- package/watch-plugins/README.md +92 -0
- package/watch-plugins/ado-author-prs.js +336 -0
- package/watch-plugins/gh-author-prs.js +375 -0
- package/watch-plugins/http.js +474 -0
- package/watch-plugins/teams-channel.js +869 -0
- package/docs/dev-composite-workflow.md +0 -101
- package/docs/pr-screenshots/pr-886/after-single-header.png +0 -0
- package/docs/pr-screenshots/pr-886/before-duplicate-header.png +0 -0
- package/docs/pr-screenshots/pr-895/01-cancellation-reason-detail.png +0 -0
- 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-901/projects-tab-default.png +0 -0
- package/docs/pr-screenshots/pr-901/projects-tab-fmf-selected.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-AFTER-crop.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-BEFORE-crop.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-dropdown-AFTER.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/visual-evidence-ci.md +0 -103
- package/engine/bridge.js +0 -379
- package/engine/quarantine-refs.js +0 -103
- package/engine/state-operations.js +0 -178
- /package/engine/{steering-constraints.js → agents/steering-constraints.js} +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* engine/meeting.js — Team meeting orchestration.
|
|
2
|
+
* engine/orchestration/meeting.js — Team meeting orchestration.
|
|
3
3
|
* Manages multi-round meetings: investigate → debate → conclude.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const fs = require('fs');
|
|
7
7
|
const path = require('path');
|
|
8
|
-
const shared = require('
|
|
8
|
+
const shared = require('../core/shared');
|
|
9
9
|
const { safeJson, uid, log, ts, ENGINE_DEFAULTS, WORK_TYPE, DISPATCH_RESULT, MEETING_STATUS } = shared;
|
|
10
|
-
const apiValidation = require('
|
|
11
|
-
const queries = require('
|
|
10
|
+
const apiValidation = require('../api/api-validation');
|
|
11
|
+
const queries = require('../core/queries');
|
|
12
12
|
const { getDispatch, getConfig } = queries;
|
|
13
|
-
const { renderPlaybook } = require('
|
|
13
|
+
const { renderPlaybook } = require('../agents/playbook');
|
|
14
14
|
const dispatchModule = require('./dispatch');
|
|
15
15
|
|
|
16
16
|
/** Patterns that indicate an agent returned no meaningful output */
|
|
@@ -971,17 +971,7 @@ function _killMeetingDispatches(meetingId) {
|
|
|
971
971
|
return dp;
|
|
972
972
|
}, { defaultValue: { pending: [], active: [], completed: [] } });
|
|
973
973
|
|
|
974
|
-
|
|
975
|
-
for (const d of entriesToStop) {
|
|
976
|
-
try {
|
|
977
|
-
const pidFile = shared.findDispatchPidFile(d) || path.join(tmpDir, `pid-${d.id}.pid`);
|
|
978
|
-
const pid = shared.validatePid(fs.readFileSync(pidFile, 'utf8').trim());
|
|
979
|
-
pidsToKill.push(pid);
|
|
980
|
-
} catch { /* pending entries and already-finished agents may not have PID files */ }
|
|
981
|
-
}
|
|
982
|
-
for (const pid of pidsToKill) {
|
|
983
|
-
try { shared.killGracefully({ pid }); } catch { /* process may already be dead */ }
|
|
984
|
-
}
|
|
974
|
+
dispatchModule.stopDispatchProcesses(entriesToStop);
|
|
985
975
|
for (const fp of filesToDelete) {
|
|
986
976
|
try { fs.unlinkSync(fp); } catch { /* sidecar may not exist */ }
|
|
987
977
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* engine/pipeline.js — Multi-stage pipeline orchestration.
|
|
2
|
+
* engine/orchestration/pipeline.js — Multi-stage pipeline orchestration.
|
|
3
3
|
* Pipelines chain stages (task, meeting, plan, merge-prs, api, wait, parallel, condition)
|
|
4
4
|
* with dependency tracking, artifact discovery, and conditional stop/termination.
|
|
5
5
|
*/
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
const fs = require('fs');
|
|
8
8
|
const path = require('path');
|
|
9
9
|
const crypto = require('crypto');
|
|
10
|
-
const shared = require('
|
|
11
|
-
const queries = require('
|
|
10
|
+
const shared = require('../core/shared');
|
|
11
|
+
const queries = require('../core/queries');
|
|
12
12
|
const { safeJson, safeJsonArr, safeJsonNoRestore, safeWrite, safeRead, safeReadDir, uid, log, ts, dateStamp, mutateJsonFileLocked, mutateWorkItems, mutateScheduleRuns, mutatePipelineRuns, slugify, formatTranscriptEntry, WI_STATUS, WORK_TYPE, WORK_ITEM_PRIORITY, PLAN_STATUS, PR_STATUS, PIPELINE_STATUS, STAGE_TYPE, MEETING_STATUS, READ_ONLY_ROOT_TASK_TYPES, ENGINE_DEFAULTS, MINIONS_DIR, isPrdArchived } = shared;
|
|
13
13
|
const routing = require('./routing');
|
|
14
14
|
const http = require('http');
|
|
@@ -18,9 +18,9 @@ const {
|
|
|
18
18
|
buildSource,
|
|
19
19
|
FENCE_OPEN_PREFIX,
|
|
20
20
|
FENCE_CLOSE,
|
|
21
|
-
} = require('
|
|
22
|
-
const smallStateStore = require('
|
|
23
|
-
const apiValidation = require('
|
|
21
|
+
} = require('../core/untrusted-fence');
|
|
22
|
+
const smallStateStore = require('../persistence/small-state-store');
|
|
23
|
+
const apiValidation = require('../api/api-validation');
|
|
24
24
|
const scheduler = require('./scheduler');
|
|
25
25
|
|
|
26
26
|
// All module-relative paths flow through MINIONS_DIR so MINIONS_TEST_DIR
|
|
@@ -737,7 +737,7 @@ function deletePipeline(id) {
|
|
|
737
737
|
} catch (e) {
|
|
738
738
|
// TOCTOU: a concurrent delete of the same id may win the race between
|
|
739
739
|
// existsSync and unlinkSync. Treat ENOENT as "already deleted" instead
|
|
740
|
-
// of throwing, mirroring deleteMeeting's unlink guard (engine/meeting.js).
|
|
740
|
+
// of throwing, mirroring deleteMeeting's unlink guard (engine/orchestration/meeting.js).
|
|
741
741
|
if (e.code !== 'ENOENT') throw e;
|
|
742
742
|
return false;
|
|
743
743
|
}
|
|
@@ -753,7 +753,7 @@ function getPipelineRuns() {
|
|
|
753
753
|
// Always read work items from the authoritative SQL store so stage-output
|
|
754
754
|
// template substitution sees the latest completion metadata.
|
|
755
755
|
function _allWorkItems() {
|
|
756
|
-
return require('
|
|
756
|
+
return require('../planning/work-items-store').readAllWorkItems();
|
|
757
757
|
}
|
|
758
758
|
|
|
759
759
|
function getActiveRun(pipelineId) {
|
|
@@ -1333,7 +1333,7 @@ function _isUsablePipelinePrd(prd) {
|
|
|
1333
1333
|
// a usable PRD. Require both a recognized top-level status AND an array
|
|
1334
1334
|
// `missing_features` field before counting the PRD as an existing conversion.
|
|
1335
1335
|
function _findExistingPrdForPlan(planFile) {
|
|
1336
|
-
const prdFiles = require('
|
|
1336
|
+
const prdFiles = require('../planning/prd-store').listPrdRows().filter(row => !row.archived);
|
|
1337
1337
|
const planKey = _canonicalPlanName(planFile);
|
|
1338
1338
|
for (const { filename: pf, plan: prd } of prdFiles) {
|
|
1339
1339
|
if (!prd?.source_plan || _canonicalPlanName(path.basename(String(prd.source_plan))) !== planKey) continue;
|
|
@@ -1455,7 +1455,7 @@ async function executePlanStage(stage, stageState, run, config, pipeline = {}) {
|
|
|
1455
1455
|
// Use LLM to generate a structured plan (same approach as dashboard "Create Plan from Meeting" button)
|
|
1456
1456
|
let content = '';
|
|
1457
1457
|
try {
|
|
1458
|
-
const llm = require('
|
|
1458
|
+
const llm = require('../agents/llm');
|
|
1459
1459
|
const planPrompt = 'Create an actionable implementation plan from this meeting. ' +
|
|
1460
1460
|
'Extract concrete action items from the conclusion and debates. ' +
|
|
1461
1461
|
'For each item include: what to do, which files/areas to change, priority (high/medium/low), and estimated complexity (small/medium/large). ' +
|
|
@@ -1821,7 +1821,7 @@ function isStageComplete(stage, stageState, run, config) {
|
|
|
1821
1821
|
const plans = artifacts.plans || [];
|
|
1822
1822
|
const discoveredPrds = [];
|
|
1823
1823
|
const discoveredWiIds = [];
|
|
1824
|
-
const prdRows = require('
|
|
1824
|
+
const prdRows = require('../planning/prd-store').listPrdRows().filter(row => !row.archived);
|
|
1825
1825
|
for (const planFile of plans) {
|
|
1826
1826
|
const planKey = _canonicalPlanName(planFile);
|
|
1827
1827
|
for (const { filename: pf, plan: prd } of prdRows) {
|
|
@@ -1860,7 +1860,7 @@ function isStageComplete(stage, stageState, run, config) {
|
|
|
1860
1860
|
if (stage.autoApprove) {
|
|
1861
1861
|
for (const prdFile of allPrds) {
|
|
1862
1862
|
let approved = false;
|
|
1863
|
-
require('
|
|
1863
|
+
require('../planning/prd-store').mutatePrd(prdFile, (prd) => {
|
|
1864
1864
|
if (prd && prd.status === PLAN_STATUS.AWAITING_APPROVAL) {
|
|
1865
1865
|
prd.status = PLAN_STATUS.APPROVED;
|
|
1866
1866
|
prd.approvedAt = ts();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* engine/pre-dispatch-eval.js — Cheap LLM gate that screens work items for
|
|
2
|
+
* engine/orchestration/pre-dispatch-eval.js — Cheap LLM gate that screens work items for
|
|
3
3
|
* clear/actionable/testable acceptance criteria *before* they are queued for
|
|
4
4
|
* dispatch. Catches impossible or ambiguous items so a slow/expensive agent
|
|
5
5
|
* run isn't burned on something that can't succeed.
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* - Fail-open: any LLM error / runtime-unavailable / parse failure resolves
|
|
19
19
|
* `{ valid: true }` so the gate cannot wedge dispatch.
|
|
20
20
|
*
|
|
21
|
-
* Wired from engine/dispatch.js → addToDispatchWithValidation().
|
|
21
|
+
* Wired from engine/orchestration/dispatch.js → addToDispatchWithValidation().
|
|
22
22
|
*
|
|
23
23
|
* Source: Ripley §3 recommendation in
|
|
24
24
|
* knowledge/architecture/2026-05-11-ripley-daily-architecture-bug-review-ripley-s-investigati.md
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
* broaden validator to read description when criteria are missing.
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
const shared = require('
|
|
31
|
+
const shared = require('../core/shared');
|
|
32
32
|
const { log } = shared;
|
|
33
|
-
const { callLLM } = require('
|
|
33
|
+
const { callLLM } = require('../agents/llm');
|
|
34
34
|
|
|
35
35
|
const SYSTEM_PROMPT = 'Output only JSON.';
|
|
36
36
|
const DEFAULT_TIMEOUT_MS = 60000;
|
|
@@ -46,7 +46,7 @@ const DEFAULT_TIMEOUT_MS = 60000;
|
|
|
46
46
|
const DESCRIPTION_MIN_CHARS = 80;
|
|
47
47
|
|
|
48
48
|
// Guardrail appended to every prompt. The validator runs a pure text-reasoning
|
|
49
|
-
// LLM call (direct: true, cwd hardcoded to MINIONS_DIR per engine/llm.js
|
|
49
|
+
// LLM call (direct: true, cwd hardcoded to MINIONS_DIR per engine/agents/llm.js
|
|
50
50
|
// _spawnProcess) with NO filesystem tools, so the model cannot see the target
|
|
51
51
|
// project's code. P-b5e2a481 removed the read tools that were making the model
|
|
52
52
|
// search MINIONS_DIR, but the model kept *asserting* unverified file-existence
|
|
@@ -145,7 +145,7 @@ function _parseResponse(text) {
|
|
|
145
145
|
* 2. `shared.resolveCcModel(<engine sub-config>)` — defer to whatever the
|
|
146
146
|
* engine has configured for its CC/direct LLM path. Tolerates both the
|
|
147
147
|
* flat shape (`{ ccModel, defaultCli, ... }`, which is what
|
|
148
|
-
* `engine/dispatch.js addToDispatchWithValidation` actually passes today)
|
|
148
|
+
* `engine/orchestration/dispatch.js addToDispatchWithValidation` actually passes today)
|
|
149
149
|
* and a nested shape (`{ engine: { ccModel, ... } }`) for callers that
|
|
150
150
|
* hand in the whole config blob.
|
|
151
151
|
* 3. `undefined` — let the runtime adapter pick its own default. The Claude
|
|
@@ -181,7 +181,7 @@ function _resolveModel(opts) {
|
|
|
181
181
|
* @param {object} [opts]
|
|
182
182
|
* @param {object} [opts.engineConfig] - engine sub-config (flat
|
|
183
183
|
* `{ ccModel, defaultCli, ... }` as passed by
|
|
184
|
-
* `engine/dispatch.js addToDispatchWithValidation`, or the nested
|
|
184
|
+
* `engine/orchestration/dispatch.js addToDispatchWithValidation`, or the nested
|
|
185
185
|
* `{ engine: { ... } }` whole-config shape). Used both for
|
|
186
186
|
* runtime/model resolution in `callLLM` and for resolving the validator's
|
|
187
187
|
* own model via `shared.resolveCcModel`.
|
|
@@ -190,7 +190,7 @@ function _resolveModel(opts) {
|
|
|
190
190
|
* (adapter default) when nothing is configured.
|
|
191
191
|
* @param {object} [opts.project] - target-project identity for prompt context
|
|
192
192
|
* (`{ name, slug, localPath }`). Threaded by
|
|
193
|
-
* `engine/dispatch.js addToDispatchWithValidation` so the model knows which
|
|
193
|
+
* `engine/orchestration/dispatch.js addToDispatchWithValidation` so the model knows which
|
|
194
194
|
* repo the work item targets (it CANNOT see any repo) and does not default to
|
|
195
195
|
* describing the Minions engine checkout it runs inside
|
|
196
196
|
* (W-mr25eg2400078d4b).
|
|
@@ -215,9 +215,10 @@ async function validateAcceptanceCriteria(workItem, opts = {}) {
|
|
|
215
215
|
label: 'pre-dispatch-eval',
|
|
216
216
|
model: _resolveModel(opts),
|
|
217
217
|
maxTurns: 1,
|
|
218
|
+
disableTools: true,
|
|
218
219
|
direct: true,
|
|
219
220
|
// No tools at all. Direct callLLM spawns the runtime CLI with
|
|
220
|
-
// cwd=MINIONS_DIR (engine/llm.js _spawnProcess). P-b5e2a481 (2026-06-01
|
|
221
|
+
// cwd=MINIONS_DIR (engine/agents/llm.js _spawnProcess). P-b5e2a481 (2026-06-01
|
|
221
222
|
// 23:44 UTC) removed write access (Edit/Write/Bash) after the validator
|
|
222
223
|
// "previewed" work by editing dashboard/js/refresh.js in MINIONS_DIR, but
|
|
223
224
|
// left Read/Grep/Glob in place. Those read tools made the model search the
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* engine/routing.js — Agent routing, budget checks, and routing table parsing.
|
|
2
|
+
* engine/orchestration/routing.js — Agent routing, budget checks, and routing table parsing.
|
|
3
3
|
* Extracted from engine.js.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const fs = require('fs');
|
|
7
7
|
const path = require('path');
|
|
8
|
-
const shared = require('
|
|
9
|
-
const queries = require('
|
|
8
|
+
const shared = require('../core/shared');
|
|
9
|
+
const queries = require('../core/queries');
|
|
10
10
|
|
|
11
11
|
const { safeJson, safeRead, log, ts, WORK_TYPE } = shared;
|
|
12
12
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* engine/schedule-bootstrap.js — Batteries-included default schedules.
|
|
2
|
+
* engine/orchestration/schedule-bootstrap.js — Batteries-included default schedules.
|
|
3
3
|
*
|
|
4
4
|
* Historically the git-fetch-freshness schedule (git fetch origin, 12h cadence)
|
|
5
5
|
* and the shared harness-sweep schedule (daily, explore type) only existed
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
* Opt-out: `config.engine.bootstrapDefaultSchedules === false` disables all
|
|
23
23
|
* bootstrap (the `ENGINE_DEFAULTS.bootstrapDefaultSchedules` default is `true`).
|
|
24
24
|
*
|
|
25
|
-
* Zero dependencies — Node built-ins + engine/shared only.
|
|
25
|
+
* Zero dependencies — Node built-ins + engine/core/shared only.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
const path = require('path');
|
|
29
|
-
const shared = require('
|
|
29
|
+
const shared = require('../core/shared');
|
|
30
30
|
|
|
31
|
-
// Simplified cron is "minute hour dayOfWeek" (see engine/scheduler.js). These
|
|
31
|
+
// Simplified cron is "minute hour dayOfWeek" (see engine/orchestration/scheduler.js). These
|
|
32
32
|
// mirror the schedules that were previously created by hand for
|
|
33
33
|
// src/constellation/fmf/minions/office-bohemia.
|
|
34
34
|
const GIT_FETCH_CRON = '0 */12 *'; // every 12 hours, on the hour
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* engine/scheduler.js -- Cron-style scheduled task discovery.
|
|
2
|
+
* engine/orchestration/scheduler.js -- Cron-style scheduled task discovery.
|
|
3
3
|
* Zero dependencies -- uses only Node.js built-ins.
|
|
4
4
|
*
|
|
5
5
|
* Config schema:
|
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
const fs = require('fs');
|
|
25
|
-
const shared = require('
|
|
25
|
+
const shared = require('../core/shared');
|
|
26
26
|
const routing = require('./routing');
|
|
27
|
-
const harness = require('
|
|
27
|
+
const harness = require('../agents/harness');
|
|
28
28
|
const { safeJson, safeWrite, mutateJsonFileLocked, mutateScheduleRuns, ts, dateStamp, log, WI_STATUS, WORK_TYPE, WORK_ITEM_PRIORITY } = shared;
|
|
29
|
-
const apiValidation = require('
|
|
29
|
+
const apiValidation = require('../api/api-validation');
|
|
30
30
|
|
|
31
31
|
const SCHEDULE_LIMITS = Object.freeze({
|
|
32
32
|
id: 64,
|
|
@@ -142,6 +142,23 @@ function validateScheduleDefinition(schedule, options = {}) {
|
|
|
142
142
|
optional: true,
|
|
143
143
|
values: SCHEDULE_WORK_TYPES,
|
|
144
144
|
});
|
|
145
|
+
// W-ms5tb6ha016fda10 — a schedule may declare `executionSurface:
|
|
146
|
+
// 'control-plane'` for maintenance jobs whose whole contract is Minions/REST
|
|
147
|
+
// API calls plus external CLIs (`gh`, `az`). Validated fail-closed against
|
|
148
|
+
// the schedule's resolved work type, so a repo-mutating schedule can never
|
|
149
|
+
// dispatch without a checkout.
|
|
150
|
+
if (schedule.executionSurface !== undefined) {
|
|
151
|
+
const surfaceType = routing.normalizeWorkType(schedule.type, WORK_TYPE.IMPLEMENT);
|
|
152
|
+
const surface = shared.validateExecutionSurface(schedule.executionSurface, surfaceType);
|
|
153
|
+
if (!surface.valid) {
|
|
154
|
+
_scheduleInputError(surface.error, {
|
|
155
|
+
code: surface.code || 'invalid-execution-surface',
|
|
156
|
+
path: 'executionSurface',
|
|
157
|
+
rejectedValue: schedule.executionSurface,
|
|
158
|
+
allowedValues: shared.EXECUTION_SURFACE_VALUES,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
145
162
|
_validateSchedulePriority(schedule.priority);
|
|
146
163
|
_validateConfiguredProject(schedule.project, options.config, 'project');
|
|
147
164
|
_validateConfiguredAgent(schedule.agent, options.config, 'agent');
|
|
@@ -239,9 +256,9 @@ function buildScheduleTemplateVars(extraVars) {
|
|
|
239
256
|
*
|
|
240
257
|
* Plus any caller-supplied `extraVars` (string-coerced). Callers should only
|
|
241
258
|
* pass vars known at schedule time — pipeline-time vars like {{project_name}}
|
|
242
|
-
* stay in engine/playbook.js where the dispatch context is available.
|
|
259
|
+
* stay in engine/agents/playbook.js where the dispatch context is available.
|
|
243
260
|
*
|
|
244
|
-
* Downstream playbook rendering (engine/playbook.js) is a single-pass replace,
|
|
261
|
+
* Downstream playbook rendering (engine/agents/playbook.js) is a single-pass replace,
|
|
245
262
|
* so any {{var}} embedded in a schedule's title/description would survive
|
|
246
263
|
* substitution of {{task_description}} and surface as an "unresolved template
|
|
247
264
|
* variables: var" warning plus a literal "{{var}}" in agent filenames.
|
|
@@ -486,10 +503,18 @@ function createScheduledWorkItem(sched, extraVars) {
|
|
|
486
503
|
throw new Error('schedule id and title are required');
|
|
487
504
|
}
|
|
488
505
|
const workItemId = `sched-${sched.id}-${Date.now()}`;
|
|
506
|
+
const workType = routing.normalizeWorkType(sched.type, WORK_TYPE.IMPLEMENT);
|
|
507
|
+
// W-ms5tb6ha016fda10 — carry a validly-declared control-plane surface onto
|
|
508
|
+
// the materialized work item so the dispatcher skips checkout allocation.
|
|
509
|
+
// Resolved fail-closed: an ineligible type silently materializes as a normal
|
|
510
|
+
// repo dispatch here (validateScheduleDefinition already 400s the operator
|
|
511
|
+
// at write time, and spawnAgent re-validates as the terminal gate).
|
|
512
|
+
const surface = shared.validateExecutionSurface(sched.executionSurface, workType);
|
|
513
|
+
const executionSurface = surface.valid ? surface.value : shared.EXECUTION_SURFACE.REPO;
|
|
489
514
|
const workItem = {
|
|
490
515
|
id: workItemId,
|
|
491
516
|
title: sched.title,
|
|
492
|
-
type:
|
|
517
|
+
type: workType,
|
|
493
518
|
priority: sched.priority || WORK_ITEM_PRIORITY.MEDIUM,
|
|
494
519
|
description: sched.description || sched.title,
|
|
495
520
|
status: WI_STATUS.PENDING,
|
|
@@ -504,7 +529,12 @@ function createScheduledWorkItem(sched, extraVars) {
|
|
|
504
529
|
// so the operator can navigate back to the dispatcher. Kept alongside
|
|
505
530
|
// _scheduleId (used by queries / lifecycle / consolidation) so we don't
|
|
506
531
|
// disturb the existing readers — meta.spawnedBy is purely additive.
|
|
507
|
-
meta: {
|
|
532
|
+
meta: {
|
|
533
|
+
spawnedBy: 'schedule:' + sched.id,
|
|
534
|
+
...(executionSurface === shared.EXECUTION_SURFACE.CONTROL_PLANE
|
|
535
|
+
? { executionSurface }
|
|
536
|
+
: {}),
|
|
537
|
+
},
|
|
508
538
|
};
|
|
509
539
|
// Walk every string-valued field on the work item so vars embedded in
|
|
510
540
|
// nested fields (e.g. _harness.rubric added by callers, references[].url,
|