@yemi33/minions 0.1.2290 → 0.1.2292
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 +4 -4
- package/docs/README.md +1 -0
- package/docs/command-center.md +1 -1
- package/docs/plan-lifecycle.md +4 -2
- package/docs/runtime-adapters.md +1 -0
- package/engine/live-checkout.js +0 -1
- package/engine/pipeline.js +1 -1
- package/engine/shared.js +8 -4
- package/engine.js +5 -6
- package/package.json +1 -1
package/dashboard.js
CHANGED
|
@@ -6804,13 +6804,13 @@ const server = http.createServer(async (req, res) => {
|
|
|
6804
6804
|
if (originWi) item._originWi = originWi;
|
|
6805
6805
|
await copyWorkItemPrFields(item, body, null, { project: targetProject });
|
|
6806
6806
|
// W-mq5wfh1v000e0da9 — Auto-enroll the PR into pull-requests.json when
|
|
6807
|
-
// this is a `type: fix` WI carrying a structured PR pointer and
|
|
6808
|
-
// isn't tracked yet. Without this, the engine's `pr_not_found` gate
|
|
6809
|
-
// skips the
|
|
6807
|
+
// this is a `type: fix/review/test` WI carrying a structured PR pointer and
|
|
6808
|
+
// the PR isn't tracked yet. Without this, the engine's `pr_not_found` gate
|
|
6809
|
+
// skips the WI forever (engine.js dispatch loop). Idempotent — safe to
|
|
6810
6810
|
// call on every WI create. Failures are swallowed (best-effort belt;
|
|
6811
6811
|
// engine.js#dispatch loop also calls this as defense-in-depth).
|
|
6812
6812
|
try {
|
|
6813
|
-
shared.
|
|
6813
|
+
shared.autoEnrollPrFromWorkItem(item, targetProject, MINIONS_DIR);
|
|
6814
6814
|
} catch (e) {
|
|
6815
6815
|
shared.log('warn', `auto-enroll PR for ${item.id}: ${e.message}`);
|
|
6816
6816
|
}
|
package/docs/README.md
CHANGED
|
@@ -58,6 +58,7 @@ Architecture, design proposals, and lifecycle references for people working on t
|
|
|
58
58
|
|
|
59
59
|
Operational runbooks for engine operators and fleet maintainers.
|
|
60
60
|
|
|
61
|
+
- [notes.md](notes.md) — Consolidated team knowledge: patterns, conventions, bugs, and build findings accumulated from agent inbox notes. Read by the engine and injected into agent prompts as shared context.
|
|
61
62
|
- [auto-discovery.md](auto-discovery.md) — Auto-discovery and execution pipeline: the per-tick orchestration loop and the four work-discovery sources.
|
|
62
63
|
- [diagnostics-memory.md](diagnostics-memory.md) — Operator runbook for the in-process memory + perf observability surface: `/api/diagnostics/memory[/history]`, `/api/diagnostics/heap-snapshot` guard-token capture, `MEMORY_BASELINE` log emissions, `--cpu-prof`/`--heap-prof` capture, and the `test/perf/soak.test.js` heap-growth regression gate.
|
|
63
64
|
- [engine-restart.md](engine-restart.md) — How agents survive an engine restart: state persistence, the 20-minute startup grace period, and orphan reattachment via PID files and `live-output.log`.
|
package/docs/command-center.md
CHANGED
|
@@ -63,7 +63,7 @@ Any violation rejects the **whole turn** with a typed error envelope (`code: 'in
|
|
|
63
63
|
| Runtime | `imageInput` | Behavior |
|
|
64
64
|
|---------|--------------|----------|
|
|
65
65
|
| claude | `true` | Images delivered as an Anthropic Messages `content[]` envelope of base64 blocks over stream-json (`claude.buildPrompt` + `--input-format stream-json` in `claude.buildArgs`). |
|
|
66
|
-
| copilot | `
|
|
66
|
+
| copilot | `true` | Images materialized to tmp files and passed as `--attachment <path>` (W-mqv7324u0021db5d). **Exception:** when the opt-in Copilot worker pool is active (`engine.ccUseWorkerPool: true`), images are silently dropped — the pool's ACP `stream()` does not forward images; a note in `_invokeCcStream` marks this intentional. |
|
|
67
67
|
| codex | `false` | Degraded — same typed `model-unavailable` envelope. |
|
|
68
68
|
|
|
69
69
|
`_resolveImageOpts` (in `engine/llm.js`) is pure and unit-tested: it forwards the `images` list only when `runtime.capabilities.imageInput` is truthy, otherwise returns the typed error so CC/doc-chat surface the envelope instead of a silently-text-only reply. `_spawnProcess` re-applies the same gate (`if (!caps.imageInput) adapterOpts.images = undefined`) as defense in depth. Image **filenames** are run through the untrusted-input fence (`buildSource('cc-image-filename', …)`) before they reach prompt text, since they are user-supplied.
|
package/docs/plan-lifecycle.md
CHANGED
|
@@ -118,7 +118,7 @@ The verify agent does not call `archivePlan()`. After the testing guide and any
|
|
|
118
118
|
|
|
119
119
|
Manual archive behavior:
|
|
120
120
|
|
|
121
|
-
1. For PRD JSON files, the dashboard
|
|
121
|
+
1. For PRD JSON files, the dashboard archives them **in-place** in `prd/` — the file is not moved. The JSON is stamped with `archived: true`, `status: "archived"`, and `archivedAt` (Phase 10 step 4.2b). The `.backup` sidecar is left intact since the file keeps its canonical path.
|
|
122
122
|
2. If the PRD has `source_plan`, the matching `plans/<source>.md` is moved to `plans/archive/<source>.md`.
|
|
123
123
|
3. Pending or queued work items linked to the archived PRD are cancelled with `_cancelledBy: "plan-archived"`; completed work items remain as history.
|
|
124
124
|
4. Plan worktrees are cleaned up by the archive handler/lifecycle cleanup path.
|
|
@@ -148,7 +148,9 @@ After PRs are created, humans can leave comments containing `@minions` to trigge
|
|
|
148
148
|
|------|---------|
|
|
149
149
|
| `plans/*.md` | Source plans awaiting review or linked to active PRDs |
|
|
150
150
|
| `prd/*.json` | Active PRDs with materializable items |
|
|
151
|
-
| `plans/archive
|
|
151
|
+
| `plans/archive/` | Manually archived plan Markdown files |
|
|
152
|
+
| `prd/*.json` (with `archived: true`) | PRDs archived in-place (Phase 10 step 4.2b — not moved; flag + `archivedAt` stamped on the file) |
|
|
153
|
+
| `prd/archive/` | Legacy: PRDs archived before Phase 10 (still scanned for filename-collision detection) |
|
|
152
154
|
| `playbooks/verify.md` | Verification task playbook |
|
|
153
155
|
| `playbooks/implement.md` | Implementation playbook |
|
|
154
156
|
| `playbooks/plan-to-prd.md` | Plan → PRD conversion playbook |
|
package/docs/runtime-adapters.md
CHANGED
|
@@ -81,6 +81,7 @@ real behavioral split appears between adapters.
|
|
|
81
81
|
| `resumePromptCarryover` | ✗ | ✓ | ✓ | CC resume turns prepend recent visible Q&A in stdin when the runtime session store is opaque to Minions. |
|
|
82
82
|
| `resumeBookkeepingTurn` | ✓ | — | — | Claude CLI injects a synthetic "Continue from where you left off." meta turn on `--resume`; CC prompts must tell the model not to treat it as user intent. |
|
|
83
83
|
| `streamConsumer` | ✓ | ✓ | ✓ | Adapter implements `createStreamConsumer(ctx)` — required by `engine/llm.js` accumulator. |
|
|
84
|
+
| `imageInput` | ✓ | ✓ | ✗ | Runtime accepts `images: [{mimeType, dataBase64}]` and delivers them to the CLI. Claude: Anthropic Messages base64 content-block envelope via `--input-format stream-json`. Copilot: base64 payloads materialized to tmp files and passed as `--attachment <path>` (W-mqv7324u0021db5d). When false, `_resolveImageOpts` returns a typed `model-unavailable` error. |
|
|
84
85
|
|
|
85
86
|
When a behavior is genuinely uniform across all current adapters, it still gets
|
|
86
87
|
a flag if a future runtime might disagree — flags are cheap.
|
package/engine/live-checkout.js
CHANGED
|
@@ -101,7 +101,6 @@ const shared = require('./shared');
|
|
|
101
101
|
// still bounded. Threaded through `baseOpts` so every git call inherits it; the
|
|
102
102
|
// injected `_git` mock in unit tests ignores opts so the seam is unaffected.
|
|
103
103
|
const LIVE_CHECKOUT_GIT_MAX_BUFFER = 50 * 1024 * 1024;
|
|
104
|
-
|
|
105
104
|
// PL-live-checkout-reliability-hardening — partial-clone / GVFS blob-fetch
|
|
106
105
|
// signature match. On a Scalar/GVFS-managed ADO repo (blobless partial clone),
|
|
107
106
|
// switching the working tree onto a branch whose tree differs from HEAD must
|
package/engine/pipeline.js
CHANGED
|
@@ -57,7 +57,7 @@ function getPipeline(id) {
|
|
|
57
57
|
|
|
58
58
|
function savePipeline(pipeline) {
|
|
59
59
|
if (!fs.existsSync(PIPELINES_DIR)) fs.mkdirSync(PIPELINES_DIR, { recursive: true });
|
|
60
|
-
|
|
60
|
+
mutateJsonFileLocked(path.join(PIPELINES_DIR, pipeline.id + '.json'), () => pipeline, { defaultValue: {} });
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
function deletePipeline(id) {
|
package/engine/shared.js
CHANGED
|
@@ -7245,11 +7245,12 @@ function classifyPrRefForVerification(prRef, project = null) {
|
|
|
7245
7245
|
// per the "structured-vs-loose split" — enrollment must be intentional.
|
|
7246
7246
|
//
|
|
7247
7247
|
// Returns:
|
|
7248
|
-
// { skipped: true, reason } — not a
|
|
7248
|
+
// { skipped: true, reason } — not a pr-requiring type / no ref / no URL / upsert error
|
|
7249
7249
|
// { alreadyEnrolled: true, id } — PR already in pull-requests.json
|
|
7250
7250
|
// { enrolled: true, id, prPath } — newly enrolled
|
|
7251
|
-
|
|
7252
|
-
|
|
7251
|
+
const _PR_REQUIRING_TYPES = new Set([WORK_TYPE.FIX, WORK_TYPE.REVIEW, WORK_TYPE.TEST]);
|
|
7252
|
+
function autoEnrollPrFromWorkItem(item, project, minionsDir) {
|
|
7253
|
+
if (!item || !_PR_REQUIRING_TYPES.has(item.type)) return { skipped: true, reason: 'not-pr-requiring-type' };
|
|
7253
7254
|
const prRef = extractStructuredWorkItemPrRef(item);
|
|
7254
7255
|
if (!prRef) return { skipped: true, reason: 'no-structured-ref' };
|
|
7255
7256
|
const url = deriveUrlForPrRef(prRef, project);
|
|
@@ -7280,10 +7281,12 @@ function autoEnrollPrFromFixWorkItem(item, project, minionsDir) {
|
|
|
7280
7281
|
? { enrolled: true, id: result.id, prPath }
|
|
7281
7282
|
: { alreadyEnrolled: true, id: result.id };
|
|
7282
7283
|
} catch (e) {
|
|
7283
|
-
log('warn', `
|
|
7284
|
+
log('warn', `autoEnrollPrFromWorkItem ${item.id}: ${e.message}`);
|
|
7284
7285
|
return { skipped: true, reason: 'upsert-error', error: e.message };
|
|
7285
7286
|
}
|
|
7286
7287
|
}
|
|
7288
|
+
// Backward-compat alias — external callers that reference autoEnrollPrFromFixWorkItem keep working.
|
|
7289
|
+
const autoEnrollPrFromFixWorkItem = autoEnrollPrFromWorkItem;
|
|
7287
7290
|
|
|
7288
7291
|
// ─── Cross-Platform Process Kill Helpers ─────────────────────────────────────
|
|
7289
7292
|
|
|
@@ -9015,6 +9018,7 @@ module.exports = {
|
|
|
9015
9018
|
isContextOnlyPrRecord,
|
|
9016
9019
|
upsertPullRequestRecord,
|
|
9017
9020
|
isAutoManagedPrRecord, // W-mq5s5ttx000j7ab8-a — exported for engine + watch-plugin gate consolidation
|
|
9021
|
+
autoEnrollPrFromWorkItem,
|
|
9018
9022
|
autoEnrollPrFromFixWorkItem,
|
|
9019
9023
|
deriveUrlForPrRef, // exported for testing
|
|
9020
9024
|
classifyPrRefForVerification, // issue #246 — host routing for loose PR-ref verification
|
package/engine.js
CHANGED
|
@@ -8096,16 +8096,15 @@ function discoverFromWorkItems(config, project) {
|
|
|
8096
8096
|
skipped.noAgent++; continue;
|
|
8097
8097
|
}
|
|
8098
8098
|
|
|
8099
|
-
// W-mq5wfh1v000e0da9 — defense-in-depth: auto-enroll the PR for fix WIs
|
|
8099
|
+
// W-mq5wfh1v000e0da9 — defense-in-depth: auto-enroll the PR for fix/review/test WIs
|
|
8100
8100
|
// carrying a structured PR pointer. Primary enrollment runs in the
|
|
8101
8101
|
// dashboard `POST /api/work-items` handler, but WIs created via CLI / restored
|
|
8102
8102
|
// from disk / older code paths might land here without the PR record.
|
|
8103
|
-
// No-op if the PR is already tracked
|
|
8104
|
-
// still trips on missing PR records
|
|
8103
|
+
// No-op if the PR is already tracked or if the type doesn't require a PR.
|
|
8104
|
+
// Failures swallowed — the gate below still trips on missing PR records
|
|
8105
|
+
// and surfaces `pr_not_found`.
|
|
8105
8106
|
try {
|
|
8106
|
-
|
|
8107
|
-
shared.autoEnrollPrFromFixWorkItem(item, project, MINIONS_DIR);
|
|
8108
|
-
}
|
|
8107
|
+
shared.autoEnrollPrFromWorkItem(item, project, MINIONS_DIR);
|
|
8109
8108
|
} catch (e) { log('warn', `auto-enroll PR for ${item.id}: ${e.message}`); }
|
|
8110
8109
|
|
|
8111
8110
|
const linkedPr = resolveWorkItemPrRecord(item, project);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2292",
|
|
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"
|