@yemi33/minions 0.1.352 → 0.1.354
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 +3 -1
- package/engine/pipeline.js +32 -3
- package/package.json +1 -1
- package/playbooks/meeting-conclude.md +12 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.354 (2026-04-06)
|
|
4
4
|
|
|
5
5
|
### Fixes
|
|
6
|
+
- pipeline plans include full meeting content, conclusion playbook requires concrete details
|
|
7
|
+
- pipeline template regex now matches hyphenated stage IDs
|
|
6
8
|
- pipeline Continue button shows immediate feedback
|
|
7
9
|
- skip meeting modal re-render when data unchanged
|
|
8
10
|
|
package/engine/pipeline.js
CHANGED
|
@@ -101,7 +101,7 @@ function completeRun(pipelineId, runId, status) {
|
|
|
101
101
|
|
|
102
102
|
function resolveTemplate(str, run) {
|
|
103
103
|
if (!str || typeof str !== 'string') return str;
|
|
104
|
-
return str.replace(/\{\{stages\.(\w+)\.(\w+)\}\}/g, (_, stageId, field) => {
|
|
104
|
+
return str.replace(/\{\{stages\.([\w-]+)\.([\w-]+)\}\}/g, (_, stageId, field) => {
|
|
105
105
|
const stage = run?.stages?.[stageId];
|
|
106
106
|
if (!stage) return '';
|
|
107
107
|
if (field === 'output') return stage.output || '';
|
|
@@ -221,11 +221,40 @@ function executePlanStage(stage, stageState, run, config) {
|
|
|
221
221
|
content += `**Created by:** Pipeline ${run.pipelineId}\n`;
|
|
222
222
|
content += `**Date:** ${dateStamp()}\n\n---\n\n`;
|
|
223
223
|
|
|
224
|
-
// Include output from dependency stages
|
|
224
|
+
// Include output from dependency stages (for meetings, include full transcript)
|
|
225
225
|
if (stage.dependsOn) {
|
|
226
226
|
for (const depId of stage.dependsOn) {
|
|
227
227
|
const depStage = run.stages[depId];
|
|
228
|
-
if (depStage
|
|
228
|
+
if (!depStage) continue;
|
|
229
|
+
|
|
230
|
+
// If dependency is a meeting, include full findings + transcript
|
|
231
|
+
const meetingId = depStage.artifacts?.meetings?.[0];
|
|
232
|
+
if (meetingId) {
|
|
233
|
+
try {
|
|
234
|
+
const mtgPath = path.join(__dirname, '..', 'meetings', meetingId + '.json');
|
|
235
|
+
const mtg = safeJson(mtgPath);
|
|
236
|
+
if (mtg) {
|
|
237
|
+
content += `## Meeting: ${mtg.title || depId}\n\n`;
|
|
238
|
+
content += `**Agenda:** ${mtg.agenda || ''}\n\n`;
|
|
239
|
+
// Include each agent's findings
|
|
240
|
+
for (const [agent, finding] of Object.entries(mtg.findings || {})) {
|
|
241
|
+
const text = typeof finding === 'string' ? finding : finding?.content || '';
|
|
242
|
+
if (text) content += `### ${agent} — Findings\n\n${text}\n\n`;
|
|
243
|
+
}
|
|
244
|
+
// Include debate if present
|
|
245
|
+
for (const [agent, debate] of Object.entries(mtg.debate || {})) {
|
|
246
|
+
const text = typeof debate === 'string' ? debate : debate?.content || '';
|
|
247
|
+
if (text) content += `### ${agent} — Debate\n\n${text}\n\n`;
|
|
248
|
+
}
|
|
249
|
+
// Include conclusion
|
|
250
|
+
const conclusion = typeof mtg.conclusion === 'string' ? mtg.conclusion : mtg.conclusion?.content || '';
|
|
251
|
+
if (conclusion) content += `### Conclusion\n\n${conclusion}\n\n`;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
} catch { /* fall through to output-only */ }
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (depStage.output) {
|
|
229
258
|
content += `## From: ${depId}\n\n${depStage.output}\n\n`;
|
|
230
259
|
}
|
|
231
260
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.354",
|
|
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"
|
|
@@ -24,14 +24,19 @@ You are {{agent_name}} ({{agent_role}}), synthesizing the team meeting results.
|
|
|
24
24
|
|
|
25
25
|
## Your Task
|
|
26
26
|
|
|
27
|
-
Write a clear meeting conclusion
|
|
27
|
+
Write a clear, **self-contained** meeting conclusion. Someone reading ONLY this conclusion (not the findings or debate) must understand exactly what was decided and what to do next.
|
|
28
28
|
|
|
29
|
-
1. **
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
5. **Open questions** — what still needs human input?
|
|
29
|
+
1. **Top priorities** — numbered list of the specific items the team agreed to work on. For each:
|
|
30
|
+
- What the problem is (concrete: file names, function names, error messages)
|
|
31
|
+
- What the fix should be (concrete: "change X to Y", "add guard in Z")
|
|
32
|
+
- Estimated complexity (small/medium/large)
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
2. **Deferred items** — what was discussed but explicitly deprioritized, and why
|
|
35
|
+
|
|
36
|
+
3. **Unresolved disagreements** — where positions still differ (if any)
|
|
37
|
+
|
|
38
|
+
4. **Open questions for human** — what needs human input before proceeding (if any)
|
|
39
|
+
|
|
40
|
+
**Be concrete, not vague.** Do NOT write "fix 3 bugs" — write which 3 bugs, in which files, with what fix. The conclusion is used as input to create an implementation plan, so it must contain enough detail to act on without re-reading the entire meeting.
|
|
36
41
|
|
|
37
42
|
Do NOT create plan files — plan creation is handled separately (by the pipeline plan stage or the dashboard "Create Plan" button).
|