@yemi33/minions 0.1.362 → 0.1.363

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,9 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.362 (2026-04-06)
3
+ ## 0.1.363 (2026-04-06)
4
4
 
5
5
  ### Features
6
+ - fix 3 runtime bugs — fan-out branch, dispatch cleanup, pipelines page (#204)
6
7
  - Null-safe safeJson wrappers + dashboard crash guards (#203)
7
8
  - pipeline plan stage uses LLM to generate structured plan from meeting
8
9
  - show 'Converting to PRD' status instead of 'In Progress' during plan conversion
@@ -20,7 +20,7 @@ function buildDashboardHtml() {
20
20
  const layout = safeRead(layoutPath);
21
21
  const css = safeRead(path.join(dashDir, 'styles.css'));
22
22
 
23
- const pages = ['home', 'work', 'prs', 'plans', 'inbox', 'tools', 'schedule', 'meetings', 'engine'];
23
+ const pages = ['home', 'work', 'prs', 'plans', 'inbox', 'tools', 'schedule', 'pipelines', 'meetings', 'engine'];
24
24
  let pageHtml = '';
25
25
  for (const p of pages) {
26
26
  const content = safeRead(path.join(dashDir, 'pages', p + '.html'));
package/engine.js CHANGED
@@ -356,14 +356,13 @@ function spawnAgent(dispatchItem, config) {
356
356
  const existingWtPath = findExistingWorktree(rootDir, branchName);
357
357
  if (existingWtPath && fs.existsSync(existingWtPath)) {
358
358
  // Bug fix: read dispatch under file lock so check-and-act is atomic
359
- // Uses withFileLock directly (read-only) — no unnecessary disk write
360
359
  let activelyUsed = false;
361
- withFileLock(DISPATCH_PATH + '.lock', () => {
362
- const dp = safeJson(DISPATCH_PATH) || {};
360
+ mutateDispatch((dp) => {
363
361
  activelyUsed = (dp.active || []).some(d => {
364
362
  const dBranch = d.meta?.branch ? sanitizeBranch(d.meta.branch) : '';
365
363
  return dBranch === branchName && d.id !== id;
366
364
  });
365
+ return dp;
367
366
  });
368
367
  if (activelyUsed) {
369
368
  log('warn', `Branch ${branchName} actively used by another agent at ${existingWtPath} — cannot create worktree`);
@@ -910,7 +909,12 @@ function autoCleanPrdWorkItems(prdFile, config) {
910
909
  }
911
910
  if (deletedIds.length > 0) {
912
911
  const deletedSet = new Set(deletedIds);
913
- cleanDispatchEntries(d => deletedSet.has(d.meta?.item?.id) && d.meta?.item?.sourcePlan === prdFile);
912
+ mutateDispatch((dispatch) => {
913
+ const pred = d => deletedSet.has(d.meta?.item?.id) && d.meta?.item?.sourcePlan === prdFile;
914
+ dispatch.pending = dispatch.pending.filter(d => !pred(d));
915
+ dispatch.active = dispatch.active.filter(d => !pred(d));
916
+ return dispatch;
917
+ });
914
918
  log('info', `Plan sync: cleared ${deletedIds.length} pending/failed work items for ${prdFile}`);
915
919
  }
916
920
  }
@@ -1863,7 +1867,7 @@ function discoverCentralWorkItems(config) {
1863
1867
  prompt,
1864
1868
  meta: {
1865
1869
  dispatchKey: fanKey, source: 'central-work-item-fanout', item, parentKey: key,
1866
- branch: `fan/${item.id}/${fanAgentId}`,
1870
+ branch: `fan/${item.id}/${agent.id}`,
1867
1871
  deadline: item.timeout ? Date.now() + item.timeout : Date.now() + (config.engine?.fanOutTimeout || config.engine?.agentTimeout || DEFAULTS.agentTimeout)
1868
1872
  }
1869
1873
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.362",
3
+ "version": "0.1.363",
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"