@yemi33/minions 0.1.229 → 0.1.231
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 +10 -0
- package/dashboard.js +2 -42
- package/package.json +1 -1
- package/playbooks/evaluate.md +0 -149
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.231 (2026-04-03)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- log CC failures to engine log for debugging
|
|
7
|
+
|
|
8
|
+
## 0.1.230 (2026-04-03)
|
|
9
|
+
|
|
10
|
+
### Fixes
|
|
11
|
+
- remove all 'evaluate' work type — eval loop uses 'review' exclusively
|
|
12
|
+
|
|
3
13
|
## 0.1.229 (2026-04-03)
|
|
4
14
|
|
|
5
15
|
### Fixes
|
package/dashboard.js
CHANGED
|
@@ -1672,45 +1672,6 @@ If nothing to do: { "duplicates": [], "reclassify": [], "remove": [] }`;
|
|
|
1672
1672
|
return jsonReply(res, 200, plans);
|
|
1673
1673
|
}
|
|
1674
1674
|
|
|
1675
|
-
async function handlePlansArchiveMove(req, res) {
|
|
1676
|
-
try {
|
|
1677
|
-
const body = await readBody(req);
|
|
1678
|
-
if (!body.file) return jsonReply(res, 400, { error: 'file required' });
|
|
1679
|
-
const file = body.file;
|
|
1680
|
-
if (file.includes('..') || file.includes('\0') || file.includes('/') || file.includes('\\')) return jsonReply(res, 400, { error: 'invalid' });
|
|
1681
|
-
|
|
1682
|
-
const isJson = file.endsWith('.json');
|
|
1683
|
-
const sourceDir = isJson ? PRD_DIR : PLANS_DIR;
|
|
1684
|
-
const archiveDir = path.join(sourceDir, 'archive');
|
|
1685
|
-
const sourcePath = path.join(sourceDir, file);
|
|
1686
|
-
|
|
1687
|
-
if (!fs.existsSync(sourcePath)) return jsonReply(res, 404, { error: 'File not found' });
|
|
1688
|
-
if (!fs.existsSync(archiveDir)) fs.mkdirSync(archiveDir, { recursive: true });
|
|
1689
|
-
|
|
1690
|
-
fs.renameSync(sourcePath, path.join(archiveDir, file));
|
|
1691
|
-
|
|
1692
|
-
// If archiving a PRD .json, also archive its source .md plan
|
|
1693
|
-
let archivedSource = null;
|
|
1694
|
-
if (isJson) {
|
|
1695
|
-
try {
|
|
1696
|
-
const prd = safeJson(path.join(archiveDir, file));
|
|
1697
|
-
if (prd?.source_plan) {
|
|
1698
|
-
const mdPath = path.join(PLANS_DIR, prd.source_plan);
|
|
1699
|
-
if (fs.existsSync(mdPath)) {
|
|
1700
|
-
const planArchive = path.join(PLANS_DIR, 'archive');
|
|
1701
|
-
if (!fs.existsSync(planArchive)) fs.mkdirSync(planArchive, { recursive: true });
|
|
1702
|
-
fs.renameSync(mdPath, path.join(planArchive, prd.source_plan));
|
|
1703
|
-
archivedSource = prd.source_plan;
|
|
1704
|
-
}
|
|
1705
|
-
}
|
|
1706
|
-
} catch { /* optional — source plan may not exist */ }
|
|
1707
|
-
}
|
|
1708
|
-
|
|
1709
|
-
invalidateStatusCache();
|
|
1710
|
-
return jsonReply(res, 200, { ok: true, archivedSource });
|
|
1711
|
-
} catch (e) { return jsonReply(res, 400, { error: e.message }); }
|
|
1712
|
-
}
|
|
1713
|
-
|
|
1714
1675
|
async function handlePlansUnarchive(req, res) {
|
|
1715
1676
|
try {
|
|
1716
1677
|
const body = await readBody(req);
|
|
@@ -2988,8 +2949,9 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
2988
2949
|
|
|
2989
2950
|
if (result.code !== 0 || !result.text) {
|
|
2990
2951
|
const debugInfo = result.code !== 0 ? `(exit code ${result.code})` : '(empty response)';
|
|
2991
|
-
const stderrTail = (result.stderr || '').trim().split('\n').filter(Boolean).slice(-
|
|
2952
|
+
const stderrTail = (result.stderr || '').trim().split('\n').filter(Boolean).slice(-5).join(' | ');
|
|
2992
2953
|
console.error(`[CC] LLM failed after retries ${debugInfo}: ${stderrTail}`);
|
|
2954
|
+
try { shared.log('warn', `CC failed ${debugInfo}: ${stderrTail.slice(0, 300)}`); } catch {}
|
|
2993
2955
|
const hasSession = !!ccSession.sessionId;
|
|
2994
2956
|
const retryHint = hasSession
|
|
2995
2957
|
? 'Your session is still active — just send your message again to retry.'
|
|
@@ -3354,8 +3316,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3354
3316
|
{ method: 'POST', path: '/api/plans/unarchive', desc: 'Restore a plan/PRD from archive', params: 'file', handler: handlePlansUnarchive },
|
|
3355
3317
|
{ method: 'POST', path: '/api/plans/revise', desc: 'Request revision with feedback, dispatches agent to revise', params: 'file, feedback, requestedBy?', handler: handlePlansRevise },
|
|
3356
3318
|
{ method: 'POST', path: '/api/plans/discuss', desc: 'Generate a plan discussion session script for Claude CLI', params: 'file', handler: handlePlansDiscuss },
|
|
3357
|
-
{ method: 'POST', path: '/api/plans/archive', desc: 'Archive a plan/PRD (move to archive folder)', params: 'file', handler: handlePlansArchiveMove },
|
|
3358
|
-
{ method: 'POST', path: '/api/plans/unarchive', desc: 'Unarchive a plan/PRD (restore from archive folder)', params: 'file', handler: handlePlansUnarchive },
|
|
3359
3319
|
{ method: 'GET', path: /^\/api\/plans\/archive\/([^?]+)$/, desc: 'Read an archived plan file', handler: handlePlansArchiveRead },
|
|
3360
3320
|
{ method: 'GET', path: /^\/api\/plans\/([^?]+)$/, desc: 'Read a full plan (JSON from prd/ or markdown from plans/)', handler: handlePlansRead },
|
|
3361
3321
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.231",
|
|
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"
|
package/playbooks/evaluate.md
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
# Playbook: Evaluate
|
|
2
|
-
|
|
3
|
-
You are {{agent_name}}, the {{agent_role}} on the {{project_name}} project.
|
|
4
|
-
TEAM ROOT: {{team_root}}
|
|
5
|
-
|
|
6
|
-
## Your Task
|
|
7
|
-
|
|
8
|
-
Evaluate the implementation quality of a completed work item against its acceptance criteria and code quality standards.
|
|
9
|
-
|
|
10
|
-
## Work Item Under Evaluation
|
|
11
|
-
|
|
12
|
-
- **ID:** {{item_id}}
|
|
13
|
-
- **Title:** {{item_title}}
|
|
14
|
-
- **Description:** {{item_description}}
|
|
15
|
-
- **Branch:** `{{branch_name}}`
|
|
16
|
-
- **Project:** {{project_name}} (`{{project_path}}`)
|
|
17
|
-
|
|
18
|
-
{{#acceptance_criteria}}
|
|
19
|
-
## Acceptance Criteria
|
|
20
|
-
|
|
21
|
-
{{acceptance_criteria}}
|
|
22
|
-
{{/acceptance_criteria}}
|
|
23
|
-
|
|
24
|
-
{{#references}}
|
|
25
|
-
## References
|
|
26
|
-
|
|
27
|
-
{{references}}
|
|
28
|
-
{{/references}}
|
|
29
|
-
|
|
30
|
-
## Evaluation Rubric
|
|
31
|
-
|
|
32
|
-
Score each category on a 1-5 scale. A category **passes** at 3 or above.
|
|
33
|
-
|
|
34
|
-
### 1. Correctness (weight: 30%)
|
|
35
|
-
|
|
36
|
-
Does the implementation do what the task description and acceptance criteria require?
|
|
37
|
-
|
|
38
|
-
- **5 — Excellent:** All acceptance criteria met, edge cases handled, no functional gaps
|
|
39
|
-
- **4 — Good:** All core criteria met, minor edge cases not handled
|
|
40
|
-
- **3 — Adequate:** Most criteria met, one minor gap that doesn't block usage
|
|
41
|
-
- **2 — Deficient:** One or more acceptance criteria not met
|
|
42
|
-
- **1 — Failing:** Core functionality missing or broken
|
|
43
|
-
|
|
44
|
-
**Pass threshold:** 3
|
|
45
|
-
|
|
46
|
-
### 2. Completeness (weight: 25%)
|
|
47
|
-
|
|
48
|
-
Is the implementation finished end-to-end? No TODO stubs, no half-wired features, no missing integration points.
|
|
49
|
-
|
|
50
|
-
- **5 — Excellent:** Fully integrated, no loose ends, documentation updated if applicable
|
|
51
|
-
- **4 — Good:** Feature complete, minor polish items remain (comments, naming)
|
|
52
|
-
- **3 — Adequate:** Core feature works, one non-critical integration point incomplete
|
|
53
|
-
- **2 — Deficient:** Significant pieces missing or stubbed out
|
|
54
|
-
- **1 — Failing:** Skeleton or partial implementation only
|
|
55
|
-
|
|
56
|
-
**Pass threshold:** 3
|
|
57
|
-
|
|
58
|
-
### 3. Code Quality (weight: 25%)
|
|
59
|
-
|
|
60
|
-
Does the code follow existing project patterns, naming conventions, and architectural decisions?
|
|
61
|
-
|
|
62
|
-
- **5 — Excellent:** Clean, idiomatic, follows all project conventions, well-structured
|
|
63
|
-
- **4 — Good:** Follows conventions, minor style inconsistencies
|
|
64
|
-
- **3 — Adequate:** Generally follows patterns, one area deviates without justification
|
|
65
|
-
- **2 — Deficient:** Multiple convention violations, poor structure
|
|
66
|
-
- **1 — Failing:** Ignores project patterns, introduces anti-patterns
|
|
67
|
-
|
|
68
|
-
**Pass threshold:** 3
|
|
69
|
-
|
|
70
|
-
### 4. Test Coverage (weight: 20%)
|
|
71
|
-
|
|
72
|
-
Are there tests for the new functionality? Do existing tests still pass?
|
|
73
|
-
|
|
74
|
-
- **5 — Excellent:** Comprehensive tests for happy path and edge cases, all passing
|
|
75
|
-
- **4 — Good:** Tests cover core functionality, existing tests pass
|
|
76
|
-
- **3 — Adequate:** At least one test for the main feature, no regressions
|
|
77
|
-
- **2 — Deficient:** No new tests, but existing tests pass
|
|
78
|
-
- **1 — Failing:** No tests, or existing tests broken
|
|
79
|
-
|
|
80
|
-
**Pass threshold:** 3
|
|
81
|
-
|
|
82
|
-
## Evaluation Steps
|
|
83
|
-
|
|
84
|
-
1. **Fetch and review the diff:**
|
|
85
|
-
```bash
|
|
86
|
-
git fetch origin
|
|
87
|
-
git diff {{main_branch}}...origin/{{branch_name}}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
2. **Check acceptance criteria** one by one — mark each as MET or NOT MET with evidence
|
|
91
|
-
|
|
92
|
-
3. **Review code quality** — check for pattern adherence, naming, structure
|
|
93
|
-
|
|
94
|
-
4. **Verify tests:**
|
|
95
|
-
```bash
|
|
96
|
-
cd {{project_path}}
|
|
97
|
-
npm test
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
5. **Calculate scores** using the rubric above
|
|
101
|
-
|
|
102
|
-
6. **Determine verdict:**
|
|
103
|
-
- **PASS** — all four categories score 3 or above
|
|
104
|
-
- **FAIL** — any category scores below 3
|
|
105
|
-
|
|
106
|
-
## Output Format
|
|
107
|
-
|
|
108
|
-
Structure your evaluation result as follows:
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
## Evaluation Result
|
|
112
|
-
|
|
113
|
-
**Item:** {{item_id}} — {{item_title}}
|
|
114
|
-
**Verdict:** PASS | FAIL
|
|
115
|
-
**Weighted Score:** X.X / 5.0
|
|
116
|
-
|
|
117
|
-
### Scores
|
|
118
|
-
|
|
119
|
-
| Category | Score | Pass | Notes |
|
|
120
|
-
|----------|-------|------|-------|
|
|
121
|
-
| Correctness | X/5 | YES/NO | ... |
|
|
122
|
-
| Completeness | X/5 | YES/NO | ... |
|
|
123
|
-
| Code Quality | X/5 | YES/NO | ... |
|
|
124
|
-
| Test Coverage | X/5 | YES/NO | ... |
|
|
125
|
-
|
|
126
|
-
### Acceptance Criteria Checklist
|
|
127
|
-
|
|
128
|
-
- [x] Criterion 1 — evidence
|
|
129
|
-
- [ ] Criterion 2 — what's missing
|
|
130
|
-
|
|
131
|
-
### Issues Found
|
|
132
|
-
|
|
133
|
-
1. **[severity]** Description (file:line)
|
|
134
|
-
|
|
135
|
-
### Recommendations
|
|
136
|
-
|
|
137
|
-
- What to fix before merging (if FAIL)
|
|
138
|
-
- Suggestions for improvement (if PASS)
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Rules
|
|
142
|
-
|
|
143
|
-
- Base your evaluation on **evidence from the diff and test output** — not assumptions
|
|
144
|
-
- If acceptance criteria are missing, evaluate against the task description
|
|
145
|
-
- A FAIL verdict should include actionable feedback — what specifically needs to change
|
|
146
|
-
- Do NOT modify any code — this is a read-only evaluation
|
|
147
|
-
- NEVER checkout branches in the main working tree — use `git diff` and `git show` only
|
|
148
|
-
|
|
149
|
-
**Note:** Do NOT write to `agents/*/status.json` — the engine manages your status automatically.
|