@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 CHANGED
@@ -1,8 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.251 (2026-04-03)
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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 = '&#10003; 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 promptPath = path.join(tmpDir, `prompt-${id}.md`);
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-${id}.md`);
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-${id}.md`);
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.251",
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"