@yemi33/minions 0.1.507 → 0.1.509

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,14 +1,18 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.507 (2026-04-07)
3
+ ## 0.1.509 (2026-04-07)
4
4
 
5
5
  ### Features
6
6
  - abort and retrigger buttons for active pipeline runs
7
7
 
8
8
  ### Fixes
9
+ - PRD filenames are unique — engine generates collision-free name
9
10
  - PRD view shows all projects, not just the first one
10
11
  - bug report shows feedback inside modal, not hidden toast
11
12
 
13
+ ### Other
14
+ - simplify: remove dead g.project field, fix archived PRD view too
15
+
12
16
  ## 0.1.504 (2026-04-07)
13
17
 
14
18
  ### Features
@@ -132,7 +132,7 @@ function renderPrdProgress(prog) {
132
132
  const grouped = {};
133
133
  for (const i of (prog.items || [])) {
134
134
  const key = i.source || '_ungrouped';
135
- if (!grouped[key]) grouped[key] = { summary: i.planSummary || i.source || 'Items', project: i.planProject || '', _projects: [], file: i.source || '', items: [], archived: !!i._archived, planStatus: i.planStatus || 'active', sourcePlan: i.sourcePlan || '', planStale: i.planStale || false, lastSyncedFromPlan: i.lastSyncedFromPlan || null, prdUpdatedAt: i.prdUpdatedAt || null, completedAt: i.prdCompletedAt || '' };
135
+ if (!grouped[key]) grouped[key] = { summary: i.planSummary || i.source || 'Items', _projects: [], file: i.source || '', items: [], archived: !!i._archived, planStatus: i.planStatus || 'active', sourcePlan: i.sourcePlan || '', planStale: i.planStale || false, lastSyncedFromPlan: i.lastSyncedFromPlan || null, prdUpdatedAt: i.prdUpdatedAt || null, completedAt: i.prdCompletedAt || '' };
136
136
  grouped[key].items.push(i);
137
137
  // Collect all unique projects across items in this group
138
138
  for (const p of (i.projects || [])) { if (p && !grouped[key]._projects.includes(p)) grouped[key]._projects.push(p); }
@@ -497,7 +497,7 @@ function openArchivedPrdModal() {
497
497
  return '<div class="plan-card" style="cursor:pointer;margin-bottom:8px" onclick="showArchivedPrdDetail(\'' + escHtml(g.file) + '\')">' +
498
498
  '<div class="plan-card-title" style="font-size:13px">' + escHtml(g.summary || g.file) + '</div>' +
499
499
  '<div class="plan-card-meta">' +
500
- (g.project ? '<span>' + escHtml(g.project) + '</span>' : '') +
500
+ (g._projects.length > 0 ? g._projects.map(function(p) { return '<span>' + escHtml(p) + '</span>'; }).join(' ') : '') +
501
501
  '<span>' + g.items.length + ' items</span>' +
502
502
  '<span style="color:var(--green)">' + done + ' done</span>' +
503
503
  (failed ? '<span style="color:var(--red)">' + failed + ' failed</span>' : '') +
package/engine.js CHANGED
@@ -2083,6 +2083,16 @@ function discoverCentralWorkItems(config) {
2083
2083
  vars.plan_summary = (item.title || item.planFile).substring(0, 80);
2084
2084
  vars.plan_file = item.planFile || '';
2085
2085
  vars.project_name_lower = (firstProject?.name || 'project').toLowerCase();
2086
+ // Generate unique PRD filename — check prd/ and prd/archive/ for collisions
2087
+ const prdBase = vars.project_name_lower + '-' + dateStamp();
2088
+ let prdFilename = prdBase + '.json';
2089
+ const prdExisting = new Set([
2090
+ ...safeReadDir(PRD_DIR).filter(f => f.endsWith('.json')),
2091
+ ...safeReadDir(path.join(PRD_DIR, 'archive')).filter(f => f.endsWith('.json')),
2092
+ ]);
2093
+ let prdCounter = 2;
2094
+ while (prdExisting.has(prdFilename)) { prdFilename = prdBase + '-' + prdCounter + '.json'; prdCounter++; }
2095
+ vars.prd_filename = prdFilename;
2086
2096
  vars.branch_strategy_hint = item.branchStrategy
2087
2097
  ? `The user requested **${item.branchStrategy}** strategy. Use this unless the analysis strongly suggests otherwise.`
2088
2098
  : 'Choose the best strategy based on your analysis of item dependencies.';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.507",
3
+ "version": "0.1.509",
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"
@@ -23,9 +23,9 @@ A user has provided a plan. Analyze it against the codebase and produce a struct
23
23
 
24
24
  ## Output
25
25
 
26
- Write the PRD to: `{{team_root}}/prd/{{project_name_lower}}-{{date}}.json`
26
+ Write the PRD to: `{{team_root}}/prd/{{prd_filename}}`
27
27
 
28
- **If that file already exists** (check BOTH `prd/` AND `prd/archive/`), append a counter: `{{project_name_lower}}-{{date}}-2.json`, `-3.json`, etc. Do NOT overwrite or reuse a filename from an archived PRD the engine tracks work items by filename and will collide with old items.
28
+ **CRITICAL: Use the exact filename above.** The engine pre-generates a unique filename to avoid collisions with existing or archived PRDs. Do NOT change or rename it.
29
29
 
30
30
  This file is NOT checked into the repo. The engine reads it on every tick and dispatches implementation work automatically.
31
31