@yemi33/minions 0.1.1037 → 0.1.1039
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/CHANGELOG.md +87 -0
- package/engine/cleanup.js +54 -18
- package/package.json +1 -1
- package/playbooks/implement-shared.md +3 -3
- package/playbooks/implement.md +8 -14
- package/playbooks/plan-to-prd.md +2 -2
- package/playbooks/verify.md +14 -16
- package/playbooks/work-item.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,92 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.1039 (2026-04-16)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
- Doc-chat performance — debounced persistence, session TTL, smart disk reads (#1164)
|
|
7
|
+
- split getStatus() into fast/slow state tiers with separate TTLs (#1170)
|
|
8
|
+
- Cache _countWorktrees() with 30s TTL (#1166)
|
|
9
|
+
- Pre-cache gzipped status buffer alongside JSON cache (#1171)
|
|
10
|
+
- parallelize ADO and GitHub PR polling with Promise.allSettled (#1172)
|
|
11
|
+
- route implement items to dedicated implement playbook (#1115)
|
|
12
|
+
|
|
13
|
+
### Fixes
|
|
14
|
+
- allow test tasks to create PRs when files are modified
|
|
15
|
+
- sidecar oversized dispatch prompts to prevent dashboard OOM (closes #1167) (#1183)
|
|
16
|
+
- use locked write for failed-with-PR reconciliation in cleanup.js (#1169)
|
|
17
|
+
- prevent test from corrupting live meeting state
|
|
18
|
+
- scheduler enabled field falsy check treats undefined as disabled (#1160)
|
|
19
|
+
- update branch-dedup tests to use canonical PR IDs after merge with master (#1146)
|
|
20
|
+
- auto-review not firing for manually-linked PRs with autoObserve=true
|
|
21
|
+
- mark PR abandoned on 404 instead of silently retrying each tick
|
|
22
|
+
- replace undefined PROJECTS with config.projects in checkWatches (#1108)
|
|
23
|
+
- write permission for publish workflow
|
|
24
|
+
- run tests inline and post check runs for publish PRs
|
|
25
|
+
- add maxBuffer to all GitHub CLI spawns + paginate PR list (#1130)
|
|
26
|
+
- add required CI checks for PRs + update publish for auto-merge
|
|
27
|
+
- revert to PR merge now that stale status check is removed
|
|
28
|
+
- guard live review check against undefined vote/state values (#1132)
|
|
29
|
+
- push version bump directly to master instead of via PR
|
|
30
|
+
- add push-triggered CI for chore/publish branches
|
|
31
|
+
- publish workflow chore PRs failing to merge
|
|
32
|
+
- harden KB ordering
|
|
33
|
+
- harden audited state transitions
|
|
34
|
+
|
|
35
|
+
### Other
|
|
36
|
+
- Tighten playbook guidance
|
|
37
|
+
- Fix audit cleanup and test isolation
|
|
38
|
+
- docs(sched-weekly-docs-cleanup-1776355200664): weekly documentation cleanup (#1181)
|
|
39
|
+
- [E2E] Dashboard & engine perf: gzip cache, tiered status, lock backoff, polling parallelization (#1174)
|
|
40
|
+
- Fix doc chat session isolation
|
|
41
|
+
- test(pipeline): add unit tests for CRUD, stage execution, run lifecycle (#1162)
|
|
42
|
+
- chore: test publish after removing stale status check
|
|
43
|
+
- chore: trigger publish test
|
|
44
|
+
- chore: test publish workflow fix
|
|
45
|
+
- chore: trigger publish workflow test
|
|
46
|
+
|
|
47
|
+
## 0.1.1038 (2026-04-16)
|
|
48
|
+
|
|
49
|
+
### Features
|
|
50
|
+
- Doc-chat performance — debounced persistence, session TTL, smart disk reads (#1164)
|
|
51
|
+
- split getStatus() into fast/slow state tiers with separate TTLs (#1170)
|
|
52
|
+
- Cache _countWorktrees() with 30s TTL (#1166)
|
|
53
|
+
- Pre-cache gzipped status buffer alongside JSON cache (#1171)
|
|
54
|
+
- parallelize ADO and GitHub PR polling with Promise.allSettled (#1172)
|
|
55
|
+
- route implement items to dedicated implement playbook (#1115)
|
|
56
|
+
|
|
57
|
+
### Fixes
|
|
58
|
+
- allow test tasks to create PRs when files are modified
|
|
59
|
+
- sidecar oversized dispatch prompts to prevent dashboard OOM (closes #1167) (#1183)
|
|
60
|
+
- use locked write for failed-with-PR reconciliation in cleanup.js (#1169)
|
|
61
|
+
- prevent test from corrupting live meeting state
|
|
62
|
+
- scheduler enabled field falsy check treats undefined as disabled (#1160)
|
|
63
|
+
- update branch-dedup tests to use canonical PR IDs after merge with master (#1146)
|
|
64
|
+
- auto-review not firing for manually-linked PRs with autoObserve=true
|
|
65
|
+
- mark PR abandoned on 404 instead of silently retrying each tick
|
|
66
|
+
- replace undefined PROJECTS with config.projects in checkWatches (#1108)
|
|
67
|
+
- write permission for publish workflow
|
|
68
|
+
- run tests inline and post check runs for publish PRs
|
|
69
|
+
- add maxBuffer to all GitHub CLI spawns + paginate PR list (#1130)
|
|
70
|
+
- add required CI checks for PRs + update publish for auto-merge
|
|
71
|
+
- revert to PR merge now that stale status check is removed
|
|
72
|
+
- guard live review check against undefined vote/state values (#1132)
|
|
73
|
+
- push version bump directly to master instead of via PR
|
|
74
|
+
- add push-triggered CI for chore/publish branches
|
|
75
|
+
- publish workflow chore PRs failing to merge
|
|
76
|
+
- harden KB ordering
|
|
77
|
+
- harden audited state transitions
|
|
78
|
+
|
|
79
|
+
### Other
|
|
80
|
+
- Fix audit cleanup and test isolation
|
|
81
|
+
- docs(sched-weekly-docs-cleanup-1776355200664): weekly documentation cleanup (#1181)
|
|
82
|
+
- [E2E] Dashboard & engine perf: gzip cache, tiered status, lock backoff, polling parallelization (#1174)
|
|
83
|
+
- Fix doc chat session isolation
|
|
84
|
+
- test(pipeline): add unit tests for CRUD, stage execution, run lifecycle (#1162)
|
|
85
|
+
- chore: test publish after removing stale status check
|
|
86
|
+
- chore: trigger publish test
|
|
87
|
+
- chore: test publish workflow fix
|
|
88
|
+
- chore: trigger publish workflow test
|
|
89
|
+
|
|
3
90
|
## 0.1.1037 (2026-04-16)
|
|
4
91
|
|
|
5
92
|
### Features
|
package/engine/cleanup.js
CHANGED
|
@@ -448,17 +448,19 @@ function runCleanup(config, verbose = false) {
|
|
|
448
448
|
try {
|
|
449
449
|
const wiPath = projectWorkItemsPath(project);
|
|
450
450
|
let reconciled = 0;
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
451
|
+
mutateWorkItems(wiPath, items => {
|
|
452
|
+
for (const item of items) {
|
|
453
|
+
if (item.status === shared.WI_STATUS.FAILED && item._pr) {
|
|
454
|
+
item.status = shared.WI_STATUS.DONE;
|
|
455
|
+
if (item.failReason) delete item.failReason;
|
|
456
|
+
if (item.failedAt) delete item.failedAt;
|
|
457
|
+
delete item._retryCount;
|
|
458
|
+
delete item._pendingReason;
|
|
459
|
+
if (!item.completedAt) item.completedAt = shared.ts();
|
|
460
|
+
reconciled++;
|
|
461
|
+
}
|
|
459
462
|
}
|
|
460
|
-
}
|
|
461
|
-
});
|
|
463
|
+
});
|
|
462
464
|
if (reconciled > 0) {
|
|
463
465
|
log('info', `Reconciled ${reconciled} failed-with-PR item(s) → done in ${project.name}`);
|
|
464
466
|
}
|
|
@@ -472,15 +474,17 @@ function runCleanup(config, verbose = false) {
|
|
|
472
474
|
try {
|
|
473
475
|
const wiPath = projectWorkItemsPath(project);
|
|
474
476
|
let migrated = 0;
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
477
|
+
mutateWorkItems(wiPath, items => {
|
|
478
|
+
for (const item of items) {
|
|
479
|
+
if (LEGACY_DONE_ALIASES.has(item.status)) {
|
|
480
|
+
item.status = shared.WI_STATUS.DONE;
|
|
481
|
+
delete item._retryCount;
|
|
482
|
+
delete item._pendingReason;
|
|
483
|
+
if (!item.completedAt) item.completedAt = shared.ts();
|
|
484
|
+
migrated++;
|
|
485
|
+
}
|
|
481
486
|
}
|
|
482
|
-
}
|
|
483
|
-
});
|
|
487
|
+
});
|
|
484
488
|
if (migrated > 0) {
|
|
485
489
|
log('info', `Migrated ${migrated} legacy status(es) → done in ${project.name} work items`);
|
|
486
490
|
}
|
|
@@ -494,7 +498,9 @@ function runCleanup(config, verbose = false) {
|
|
|
494
498
|
for (const item of items) {
|
|
495
499
|
if (LEGACY_DONE_ALIASES.has(item.status)) {
|
|
496
500
|
item.status = shared.WI_STATUS.DONE;
|
|
501
|
+
delete item._retryCount;
|
|
497
502
|
delete item._pendingReason;
|
|
503
|
+
if (!item.completedAt) item.completedAt = shared.ts();
|
|
498
504
|
migrated++;
|
|
499
505
|
}
|
|
500
506
|
}
|
|
@@ -503,6 +509,36 @@ function runCleanup(config, verbose = false) {
|
|
|
503
509
|
log('info', `Migrated ${migrated} legacy status(es) → done in central work items`);
|
|
504
510
|
}
|
|
505
511
|
} catch (e) { log('warn', 'migrate central legacy statuses: ' + e.message); }
|
|
512
|
+
|
|
513
|
+
// 6c. Strip stale retry metadata from completed work items
|
|
514
|
+
cleaned.doneRetryCounts = 0;
|
|
515
|
+
for (const project of projects) {
|
|
516
|
+
try {
|
|
517
|
+
const wiPath = projectWorkItemsPath(project);
|
|
518
|
+
mutateWorkItems(wiPath, items => {
|
|
519
|
+
for (const item of items) {
|
|
520
|
+
if (item.status === shared.WI_STATUS.DONE && item._retryCount !== undefined) {
|
|
521
|
+
delete item._retryCount;
|
|
522
|
+
cleaned.doneRetryCounts++;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
} catch (e) { log('warn', 'cleanup done retry metadata: ' + e.message); }
|
|
527
|
+
}
|
|
528
|
+
try {
|
|
529
|
+
const centralPath = path.join(MINIONS_DIR, 'work-items.json');
|
|
530
|
+
mutateWorkItems(centralPath, items => {
|
|
531
|
+
for (const item of items) {
|
|
532
|
+
if (item.status === shared.WI_STATUS.DONE && item._retryCount !== undefined) {
|
|
533
|
+
delete item._retryCount;
|
|
534
|
+
cleaned.doneRetryCounts++;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
} catch (e) { log('warn', 'cleanup central done retry metadata: ' + e.message); }
|
|
539
|
+
if (cleaned.doneRetryCounts > 0) {
|
|
540
|
+
log('info', `Cleanup: cleared ${cleaned.doneRetryCounts} stale retry count(s) from done work items`);
|
|
541
|
+
}
|
|
506
542
|
// PRD items (missing_features[].status)
|
|
507
543
|
try {
|
|
508
544
|
let prdDirEntries;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1039",
|
|
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"
|
|
@@ -33,11 +33,11 @@ git log --oneline {{main_branch}}..HEAD
|
|
|
33
33
|
|
|
34
34
|
Do ALL work in the worktree.
|
|
35
35
|
|
|
36
|
-
**
|
|
36
|
+
**Shared branch workflow — do NOT:**
|
|
37
37
|
- Create a new branch — use `{{branch_name}}`
|
|
38
|
-
- Create a PR — one will be created automatically when all plan items complete
|
|
39
|
-
- Remove the worktree — the next plan item needs it
|
|
40
38
|
- Create a new worktree — one already exists at `{{worktree_path}}`
|
|
39
|
+
- Remove the worktree — the engine cleans it up after all plan items complete
|
|
40
|
+
- Create a PR — one will be created automatically when all plan items complete
|
|
41
41
|
|
|
42
42
|
## Health Check
|
|
43
43
|
|
package/playbooks/implement.md
CHANGED
|
@@ -51,19 +51,13 @@ Do NOT remove the worktree — the engine handles cleanup automatically.
|
|
|
51
51
|
|
|
52
52
|
## Build & Test (MANDATORY before pushing)
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
1. **Build** the project using its build system (check CLAUDE.md, package.json, README, Makefile).
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
- Determine if YOUR changes caused the failure
|
|
62
|
-
- Fix any regressions you introduced
|
|
63
|
-
- Re-run tests until all pass
|
|
64
|
-
4. If tests were already failing before your changes (pre-existing), note them in the PR description but do NOT block on them
|
|
65
|
-
5. **Run any other checks** the repo defines (linting, type checking, formatting) — read project docs for the full list
|
|
66
|
-
6. Do NOT push code with failing tests or a broken build that you introduced
|
|
54
|
+
Build and test before pushing:
|
|
55
|
+
|
|
56
|
+
1. **Build** the project using its build system (check CLAUDE.md, package.json, README, or Makefile). Retry up to 3 times; if it still fails, report the errors and stop.
|
|
57
|
+
2. **Run the full test suite** using the command the project defines. Fix regressions you introduced and re-run until your changes are green.
|
|
58
|
+
3. If tests were already failing before your changes, note that in the PR description but do not block on pre-existing failures.
|
|
59
|
+
4. **Run any other checks** the repo defines (linting, type checking, formatting).
|
|
60
|
+
5. Do NOT push code with a broken build or failing tests that you introduced.
|
|
67
61
|
|
|
68
62
|
## Push & Create PR
|
|
69
63
|
|
|
@@ -83,4 +77,4 @@ Include build/test status and run instructions in the PR description. If the pro
|
|
|
83
77
|
|
|
84
78
|
Your task is complete once you have: (1) confirmed build and tests pass, (2) pushed your branch, and (3) created the PR. Your final message MUST include the PR URL so the engine can track it. Stop immediately after.
|
|
85
79
|
|
|
86
|
-
|
|
80
|
+
Do NOT run `gh pr merge` or any other merge command on your own PR. The engine reviews and merges PRs through a separate review cycle. Self-merging is prohibited.
|
package/playbooks/plan-to-prd.md
CHANGED
|
@@ -16,7 +16,7 @@ A user has provided a plan. Analyze it against the codebase and produce a struct
|
|
|
16
16
|
1. **Read the plan carefully** — understand the goals, scope, and requirements
|
|
17
17
|
2. **Check for an existing PRD** — if the engine provides `existing_prd_json` below, a PRD already exists for this plan. See "Reusing an Existing PRD" section for how to preserve item IDs and done statuses. If no existing PRD is provided, this is a fresh run — all items start as `"missing"`.
|
|
18
18
|
3. **Explore the codebase** at `{{project_path}}` — understand the existing structure to write accurate descriptions and acceptance criteria. Do NOT use observations about existing PRs or partial work to set item statuses — status is determined only by existing PRD items (step 2), not codebase state
|
|
19
|
-
4. **Break the plan into discrete, implementable items** — each should be a single PR's worth of work
|
|
19
|
+
4. **Break the plan into discrete, implementable items** — each should be a single PR's worth of work, with enough detail for another agent to implement it directly
|
|
20
20
|
5. **Estimate complexity** — `small` (< 1 file), `medium` (2-5 files), `large` (6+ files or cross-cutting)
|
|
21
21
|
6. **Order by dependency** — items that others depend on come first
|
|
22
22
|
7. **Use unique item IDs** — generate a short uuid for each item (e.g. `P-a3f9b2c1`). Do not use sequential `P001`/`P002` — IDs must be globally unique across all PRDs to avoid collisions. **If reusing an existing PRD, keep all existing IDs — only generate new UUIDs for genuinely new items.**
|
|
@@ -88,7 +88,7 @@ Rules for items:
|
|
|
88
88
|
- **Do NOT include a "verify" or "test" or "integration test" item** — the engine automatically creates a verify task when all PRD items are done. Adding one manually creates a duplicate that blocks plan completion.
|
|
89
89
|
- **`project` field is REQUIRED** — set it to the project name where the code changes go (e.g., `"OfficeAgent"`, `"office-bohemia"`). Cross-repo plans must route each item to the correct project. The engine materializes items into that project's work queue.
|
|
90
90
|
- `depends_on` lists IDs of items that must be done first
|
|
91
|
-
- Keep descriptions actionable —
|
|
91
|
+
- Keep descriptions actionable — name the files, functions, patterns, or integration points the implementing agent should touch whenever the plan makes them clear
|
|
92
92
|
- Include `acceptance_criteria` so reviewers know when it's done
|
|
93
93
|
- Aim for 5-25 items depending on plan scope. If more than 25, group related work
|
|
94
94
|
|
package/playbooks/verify.md
CHANGED
|
@@ -13,7 +13,7 @@ Repo: {{repo_name}} | Org: {{ado_org}} | ADO Project: {{ado_project}}
|
|
|
13
13
|
|
|
14
14
|
## Your Task
|
|
15
15
|
|
|
16
|
-
Verify that a set of related changes work correctly together. You must **figure out** how to build, test, and run this specific project — do not assume any particular language, framework, or tooling.
|
|
16
|
+
Verify that a set of related changes work correctly together. You must **figure out** how to build, test, and run this specific project — do not assume any particular language, framework, or tooling. Follow this process:
|
|
17
17
|
|
|
18
18
|
1. **Set up worktrees** with all PR branches merged
|
|
19
19
|
2. **Understand the project** — read its docs to learn how to build, test, and run it
|
|
@@ -43,15 +43,17 @@ For each project worktree, **read its documentation** to understand:
|
|
|
43
43
|
|
|
44
44
|
Check these files: `CLAUDE.md`, `README.md`, `package.json`, `Makefile`, `Cargo.toml`, `pyproject.toml`, `build.gradle`, `CMakeLists.txt`, `docker-compose.yml`, `Podfile`, `build.gradle.kts`, `*.xcodeproj`, `*.xcworkspace`, or whatever build system the project uses.
|
|
45
45
|
|
|
46
|
+
Treat the repository's own docs, scripts, and config as the source of truth for build, test, and run commands. If the repo provides multiple options, choose the standard local verification path it recommends.
|
|
47
|
+
|
|
46
48
|
**Do not assume any specific platform.** The project could be a web app, mobile app (Android/iOS/React Native/Flutter), backend service, CLI tool, library, monorepo, or anything else. Adapt your verification approach to what the project actually is.
|
|
47
49
|
|
|
48
50
|
## Step 3: Build and Test
|
|
49
51
|
|
|
50
52
|
For each project worktree:
|
|
51
53
|
1. `cd` into the worktree path
|
|
52
|
-
2. Install dependencies using
|
|
53
|
-
3. Run the build using the
|
|
54
|
-
4. Run the test suite
|
|
54
|
+
2. Install dependencies using the command or workflow the repo specifies
|
|
55
|
+
3. Run the build using the repo's documented build command
|
|
56
|
+
4. Run the test suite the repo defines for full verification
|
|
55
57
|
5. Record: PASS or FAIL with error output, test counts (passed/failed/skipped)
|
|
56
58
|
|
|
57
59
|
If a build or test fails, **do NOT fix it** — report the exact error and continue with other projects.
|
|
@@ -61,18 +63,13 @@ If a build or test fails, **do NOT fix it** — report the exact error and conti
|
|
|
61
63
|
Determine if the project has a **runnable application** (web server, API, desktop app, mobile emulator, etc.) by reading its documentation and build config. For mobile apps, check if an emulator/simulator can be launched or if building an APK/IPA is the appropriate verification step.
|
|
62
64
|
|
|
63
65
|
If found:
|
|
64
|
-
1. Start it **detached from your process** so it survives after you exit.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
On Windows, use `spawn` with `detached: true` and `child.unref()`.
|
|
71
|
-
|
|
72
|
-
2. Wait a few seconds, then verify it's responding (e.g. `curl -s -o /dev/null -w "%{http_code}" http://localhost:<PORT>`)
|
|
73
|
-
3. Note the URL, port, and PID
|
|
66
|
+
1. Start it **detached from your process** so it survives after you exit.
|
|
67
|
+
- If the repo docs provide a local run or background-start command, use that.
|
|
68
|
+
- Otherwise, use the detached-process mechanism that fits the current environment. Do not assume Bash, PowerShell, or any specific shell unless the repo or runtime clearly provides it.
|
|
69
|
+
2. Wait a few seconds, then verify it using the repo's documented smoke test, health check, startup output, or the lightest project-appropriate manual check.
|
|
70
|
+
3. Note the URL, port, process identifier, or equivalent runtime details the repo exposes
|
|
74
71
|
4. Output the exact restart command with **absolute worktree paths**
|
|
75
|
-
5. Include the stop command
|
|
72
|
+
5. Include the stop command or shutdown procedure that matches how you started it
|
|
76
73
|
|
|
77
74
|
If the project has no runnable application, skip this step and note that in the guide.
|
|
78
75
|
|
|
@@ -144,11 +141,12 @@ For each project worktree:
|
|
|
144
141
|
|
|
145
142
|
## Working Style
|
|
146
143
|
|
|
147
|
-
Use subagents only for genuinely parallel, independent tasks
|
|
144
|
+
Use subagents only for genuinely parallel, independent build/test tasks on separate project worktrees. For sequential work (docs → build → test → report), and for starting detached servers, work directly — do not spawn subagents.
|
|
148
145
|
|
|
149
146
|
## Rules
|
|
150
147
|
|
|
151
148
|
- **Read the project docs first** — never assume a build system, language, or framework
|
|
149
|
+
- Treat repo-provided docs, scripts, and config as the source of truth for build/test/run commands
|
|
152
150
|
- Base testing steps on the **acceptance criteria** from each plan item
|
|
153
151
|
- Include **concrete steps** — URLs, buttons to click, inputs to type, expected results
|
|
154
152
|
- Be **transparent** — clearly separate what you verified vs what needs human review
|
package/playbooks/work-item.md
CHANGED
|
@@ -59,4 +59,4 @@ If you encounter merge conflicts during push or PR creation:
|
|
|
59
59
|
|
|
60
60
|
Your task is complete once you have: (1) confirmed build and tests pass, (2) pushed your branch, and (3) created the PR. Do NOT continue beyond the task description. Stop immediately.
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
Do NOT run `gh pr merge` or any other merge command on your own PR. The engine reviews and merges PRs through a separate review cycle. Self-merging is prohibited.
|