@yemi33/minions 0.1.832 → 0.1.833

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,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.832 (2026-04-11)
3
+ ## 0.1.833 (2026-04-11)
4
4
 
5
5
  ### Features
6
6
  - stale PRD shows Regenerate PRD + Resume as-is buttons
@@ -13,6 +13,7 @@
13
13
  - diff-aware plan-to-prd triggered by Resume, not auto-dispatch
14
14
 
15
15
  ### Other
16
+ - remove: /api/prd/regenerate endpoint (destructive delete + fresh gen)
16
17
  - refactor: migrate handlePrdRegenerate and handlePlansExecute to queuePlanToPrd
17
18
  - refactor: add PRD_ITEM_STATUS/PRD_MATERIALIZABLE constants, extract queuePlanToPrd
18
19
  - refactor: remove dead criteria variable, DRY plan resume functions
package/dashboard.js CHANGED
@@ -2362,61 +2362,7 @@ If nothing to do: { "duplicates": [], "reclassify": [], "remove": [] }`;
2362
2362
  } catch (e) { return jsonReply(res, 400, { error: e.message }); }
2363
2363
  }
2364
2364
 
2365
- async function handlePrdRegenerate(req, res) {
2366
- try {
2367
- const body = await readBody(req);
2368
- if (!body.file) return jsonReply(res, 400, { error: 'file is required' });
2369
- shared.sanitizePath(body.file, PRD_DIR);
2370
-
2371
- const prdPath = path.join(PRD_DIR, body.file);
2372
- const plan = safeJson(prdPath);
2373
- if (!plan) return jsonReply(res, 404, { error: 'PRD file not found' });
2374
- if (!plan.source_plan) return jsonReply(res, 400, { error: 'PRD has no source_plan — cannot regenerate' });
2375
-
2376
- const sourcePlanPath = path.join(PLANS_DIR, plan.source_plan);
2377
- if (!fs.existsSync(sourcePlanPath)) return jsonReply(res, 400, { error: `Source plan not found: ${plan.source_plan}` });
2378
-
2379
- // Collect completed item IDs from the old PRD to carry over
2380
- const completedStatuses = new Set(['done', 'in-pr', 'implemented']); // in-pr kept for backward compat
2381
- const completedItems = (plan.missing_features || [])
2382
- .filter(f => completedStatuses.has(f.status))
2383
- .map(f => ({ id: f.id, name: f.name, status: f.status }));
2384
-
2385
- // Clean pending/failed work items from old PRD (keep done items)
2386
- const { getProjects, projectWorkItemsPath } = shared;
2387
- const config = queries.getConfig();
2388
- for (const p of getProjects(config)) {
2389
- const projWiPath = projectWorkItemsPath(p);
2390
- try {
2391
- mutateWorkItems(projWiPath, items => {
2392
- const filtered = items.filter(w => {
2393
- if (w.sourcePlan !== body.file) return true; // different plan, keep
2394
- return completedStatuses.has(w.status); // keep completed, remove pending/failed
2395
- });
2396
- if (filtered.length < items.length) return filtered;
2397
- });
2398
- } catch { /* project may not have work items */ }
2399
- }
2400
-
2401
- // Delete old PRD — agent will write replacement at same path
2402
- try { fs.unlinkSync(prdPath); } catch { /* cleanup */ }
2403
-
2404
- // Queue plan-to-prd regeneration with instructions to preserve completed items
2405
- const completedContext = completedItems.length > 0
2406
- ? `\n\n**Previously completed items (preserve their status in the new PRD):**\n${completedItems.map(i => `- ${i.id}: ${i.name} [${i.status}]`).join('\n')}`
2407
- : '';
2408
-
2409
- const queued = shared.queuePlanToPrd({
2410
- planFile: plan.source_plan, prdFile: body.file,
2411
- title: `Regenerate PRD: ${plan.plan_summary || plan.source_plan}`,
2412
- description: `Plan file: plans/${plan.source_plan}\nTarget PRD filename: ${body.file}\nRegeneration requested by user after plan revision.${completedContext}`,
2413
- project: plan.project || '', createdBy: 'dashboard:regenerate',
2414
- extra: { _targetPrdFile: body.file },
2415
- });
2416
- if (!queued) return jsonReply(res, 200, { alreadyQueued: true });
2417
- return jsonReply(res, 200, { ok: true, file: plan.source_plan });
2418
- } catch (e) { return jsonReply(res, 500, { error: e.message }); }
2419
- }
2365
+ // handlePrdRegenerate removed — destructive delete+regen replaced by diff-aware update via /api/plans/approve
2420
2366
 
2421
2367
  async function handlePlansExecute(req, res) {
2422
2368
  if (checkRateLimit('plans-execute', 5)) return jsonReply(res, 429, { error: 'Rate limited — max 5 requests/minute' });
@@ -4154,7 +4100,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
4154
4100
  { method: 'POST', path: '/api/prd-items', desc: 'Create a PRD item as a plan file in prd/ (auto-approved)', params: 'name, description?, priority?, estimated_complexity?, project?, id?', handler: handlePrdItemsCreate },
4155
4101
  { method: 'POST', path: '/api/prd-items/update', desc: 'Edit a PRD item in its source plan JSON', params: 'source, itemId, name?, description?, priority?, estimated_complexity?, status?', handler: handlePrdItemsUpdate },
4156
4102
  { method: 'POST', path: '/api/prd-items/remove', desc: 'Remove a PRD item from plan + cancel materialized work item', params: 'source, itemId', handler: handlePrdItemsRemove },
4157
- { method: 'POST', path: '/api/prd/regenerate', desc: 'Regenerate PRD from revised source plan', params: 'file', handler: handlePrdRegenerate },
4103
+ // /api/prd/regenerate removed use /api/plans/approve which does diff-aware update
4158
4104
 
4159
4105
  // Agents
4160
4106
  { method: 'POST', path: '/api/pull-requests/link', desc: 'Manually link an external PR for tracking', params: 'url, title?, project?, autoObserve?, context?', handler: async (req, res) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.832",
3
+ "version": "0.1.833",
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"