@yemi33/minions 0.1.251 → 0.1.253
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 +7 -1
- package/dashboard/js/command-center.js +87 -0
- package/dashboard.js +9 -0
- package/engine.js +4 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.253 (2026-04-03)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- sanitize dispatch ID in temp filenames for Windows compatibility
|
|
7
|
+
|
|
8
|
+
## 0.1.252 (2026-04-03)
|
|
4
9
|
|
|
5
10
|
### Features
|
|
11
|
+
- add 10 missing CC action types for full dashboard parity
|
|
6
12
|
- add 'pin' action to CC — pin critical context to all agents
|
|
7
13
|
- mandatory test validation before PR creation in implement and fix playbooks
|
|
8
14
|
|
|
@@ -483,6 +483,93 @@ async function ccExecuteAction(action) {
|
|
|
483
483
|
status.style.color = 'var(--green)';
|
|
484
484
|
break;
|
|
485
485
|
}
|
|
486
|
+
case 'unpin': {
|
|
487
|
+
await fetch('/api/pinned/remove', {
|
|
488
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
489
|
+
body: JSON.stringify({ title: action.title })
|
|
490
|
+
});
|
|
491
|
+
status.innerHTML = '✓ Unpinned: <strong>' + escHtml(action.title) + '</strong>';
|
|
492
|
+
status.style.color = 'var(--green)';
|
|
493
|
+
refresh();
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
case 'archive-plan': {
|
|
497
|
+
await fetch('/api/plans/archive', {
|
|
498
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
499
|
+
body: JSON.stringify({ file: action.file })
|
|
500
|
+
});
|
|
501
|
+
status.innerHTML = '✓ Archived plan: <strong>' + escHtml(action.file) + '</strong>';
|
|
502
|
+
status.style.color = 'var(--green)';
|
|
503
|
+
refresh();
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
case 'reject-plan': {
|
|
507
|
+
await fetch('/api/plans/reject', {
|
|
508
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
509
|
+
body: JSON.stringify({ file: action.file, reason: action.reason || '' })
|
|
510
|
+
});
|
|
511
|
+
status.innerHTML = '✓ Rejected plan: <strong>' + escHtml(action.file) + '</strong>';
|
|
512
|
+
status.style.color = 'var(--orange)';
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
case 'steer-agent': {
|
|
516
|
+
await fetch('/api/agents/steer', {
|
|
517
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
518
|
+
body: JSON.stringify({ agent: action.agent, message: action.message || action.content })
|
|
519
|
+
});
|
|
520
|
+
status.innerHTML = '✓ Steering message sent to <strong>' + escHtml(action.agent) + '</strong>';
|
|
521
|
+
status.style.color = 'var(--green)';
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
case 'add-meeting-note': {
|
|
525
|
+
await fetch('/api/meetings/note', {
|
|
526
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
527
|
+
body: JSON.stringify({ id: action.id, note: action.note || action.content })
|
|
528
|
+
});
|
|
529
|
+
status.innerHTML = '✓ Note added to meeting <strong>' + escHtml(action.id) + '</strong>';
|
|
530
|
+
status.style.color = 'var(--green)';
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
case 'trigger-pipeline': {
|
|
534
|
+
var res = await fetch('/api/pipelines/trigger', {
|
|
535
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
536
|
+
body: JSON.stringify({ id: action.id })
|
|
537
|
+
});
|
|
538
|
+
if (!res.ok) { var d = await res.json().catch(function() { return {}; }); throw new Error(d.error || 'Pipeline trigger failed'); }
|
|
539
|
+
status.innerHTML = '✓ Pipeline triggered: <strong>' + escHtml(action.id) + '</strong>';
|
|
540
|
+
status.style.color = 'var(--green)';
|
|
541
|
+
wakeEngine();
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
case 'link-pr': {
|
|
545
|
+
await fetch('/api/pull-requests/link', {
|
|
546
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
547
|
+
body: JSON.stringify({ url: action.url, title: action.title || '', project: action.project || '', autoObserve: action.autoObserve !== false })
|
|
548
|
+
});
|
|
549
|
+
status.innerHTML = '✓ PR linked: <strong>' + escHtml(action.url) + '</strong>';
|
|
550
|
+
status.style.color = 'var(--green)';
|
|
551
|
+
refresh();
|
|
552
|
+
break;
|
|
553
|
+
}
|
|
554
|
+
case 'archive-meeting': {
|
|
555
|
+
await fetch('/api/meetings/archive', {
|
|
556
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
557
|
+
body: JSON.stringify({ id: action.id })
|
|
558
|
+
});
|
|
559
|
+
status.innerHTML = '✓ Meeting archived: <strong>' + escHtml(action.id) + '</strong>';
|
|
560
|
+
status.style.color = 'var(--green)';
|
|
561
|
+
refresh();
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
case 'update-routing': {
|
|
565
|
+
await fetch('/api/settings/routing', {
|
|
566
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
567
|
+
body: JSON.stringify({ content: action.content })
|
|
568
|
+
});
|
|
569
|
+
status.innerHTML = '✓ Routing updated';
|
|
570
|
+
status.style.color = 'var(--green)';
|
|
571
|
+
break;
|
|
572
|
+
}
|
|
486
573
|
default:
|
|
487
574
|
status.innerHTML = '? Unknown action: ' + escHtml(action.type);
|
|
488
575
|
status.style.color = 'var(--muted)';
|
package/dashboard.js
CHANGED
|
@@ -396,6 +396,15 @@ Available action types:
|
|
|
396
396
|
- **create-meeting**: Start a team meeting. Fields: title (short meeting name), agenda (detailed text — what agents should investigate/debate, numbered items work best), agents (array of agent IDs), rounds (optional, default 3), project (optional).
|
|
397
397
|
- **set-config**: Update engine settings. Fields: setting (setting name), value (new value). Valid settings: autoApprovePlans (bool), autoDecompose (bool), allowTempAgents (bool), maxConcurrent (number), maxTurns (number). Example: { "type": "set-config", "setting": "autoApprovePlans", "value": true }
|
|
398
398
|
- **edit-pipeline**: Update an existing pipeline. Fields: id (pipeline ID), title (optional), stages (optional, JSON array), trigger (optional, { cron: "minute hour dow" } or null for manual).
|
|
399
|
+
- **unpin**: Remove a pinned note. Fields: title (exact title of the pinned note to remove)
|
|
400
|
+
- **archive-plan**: Archive a completed/paused plan. Fields: file (PRD .json or plan .md filename)
|
|
401
|
+
- **reject-plan**: Reject a plan. Fields: file (PRD .json filename), reason (optional)
|
|
402
|
+
- **steer-agent**: Send a steering message to a running agent. Fields: agent (agent ID), message (text to inject)
|
|
403
|
+
- **add-meeting-note**: Add a human note to an active meeting. Fields: id (meeting ID like MTG-xxx), note (text)
|
|
404
|
+
- **trigger-pipeline**: Manually trigger a pipeline run. Fields: id (pipeline ID)
|
|
405
|
+
- **link-pr**: Link an external PR for tracking. Fields: url (PR URL), title (optional), project (optional), autoObserve (bool, default true)
|
|
406
|
+
- **archive-meeting**: Archive a completed meeting. Fields: id (meeting ID)
|
|
407
|
+
- **update-routing**: Update the routing table. Fields: content (full routing.md content)
|
|
399
408
|
|
|
400
409
|
## Rules
|
|
401
410
|
|
package/engine.js
CHANGED
|
@@ -431,10 +431,11 @@ function spawnAgent(dispatchItem, config) {
|
|
|
431
431
|
// Write prompt and system prompt to temp files (avoids shell escaping issues)
|
|
432
432
|
const tmpDir = path.join(ENGINE_DIR, 'tmp');
|
|
433
433
|
if (!fs.existsSync(tmpDir)) fs.mkdirSync(tmpDir, { recursive: true });
|
|
434
|
-
const
|
|
434
|
+
const safeId = id.replace(/[:\\/*?"<>|]/g, '-');
|
|
435
|
+
const promptPath = path.join(tmpDir, `prompt-${safeId}.md`);
|
|
435
436
|
safeWrite(promptPath, fullTaskPrompt);
|
|
436
437
|
|
|
437
|
-
const sysPromptPath = path.join(tmpDir, `sysprompt-${
|
|
438
|
+
const sysPromptPath = path.join(tmpDir, `sysprompt-${safeId}.md`);
|
|
438
439
|
safeWrite(sysPromptPath, systemPrompt);
|
|
439
440
|
|
|
440
441
|
// Build claude CLI args
|
|
@@ -555,7 +556,7 @@ function spawnAgent(dispatchItem, config) {
|
|
|
555
556
|
|
|
556
557
|
// Write new prompt with steering message
|
|
557
558
|
const steerPrompt = `Message from your human teammate:\n\n${steerMsg}\n\nRespond to this, then continue working on your current task.`;
|
|
558
|
-
const steerPromptPath = path.join(ENGINE_DIR, 'tmp', `prompt-steer-${
|
|
559
|
+
const steerPromptPath = path.join(ENGINE_DIR, 'tmp', `prompt-steer-${safeId}.md`);
|
|
559
560
|
safeWrite(steerPromptPath, steerPrompt);
|
|
560
561
|
|
|
561
562
|
// Build resume args
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.253",
|
|
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"
|