@yemi33/minions 0.1.645 → 0.1.646

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,12 +1,13 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.645 (2026-04-09)
3
+ ## 0.1.646 (2026-04-09)
4
4
 
5
5
  ### Features
6
6
  - pipeline plan stage reconciliation and UX fixes
7
7
  - track notes, plans, and PRDs as work item artifacts
8
8
 
9
9
  ### Fixes
10
+ - pipeline plan reconciliation slug match used wrong naming convention
10
11
  - use startsWith for inbox note matching to prevent false matches
11
12
 
12
13
  ## 0.1.642 (2026-04-09)
@@ -296,14 +296,21 @@ function _findMeetingsInRun(run) {
296
296
  }
297
297
 
298
298
  // Check if a plan already exists for a given meeting (created manually via dashboard)
299
- function _findExistingPlanForMeeting(meetingIds, planSlug, plansDir) {
299
+ function _findExistingPlanForMeeting(meetingIds, plansDir) {
300
300
  const files = safeReadDir(plansDir).filter(f => f.endsWith('.md'));
301
- const slugPrefix = planSlug.slice(0, 30);
301
+ // Build slug prefixes for both pipeline and dashboard naming conventions
302
+ const slugPrefixes = [];
303
+ for (const mid of meetingIds) {
304
+ const mtg = safeJson(path.join(__dirname, '..', 'meetings', mid + '.json'));
305
+ if (mtg?.title) {
306
+ // Dashboard convention: "Meeting follow-up: {title}" → slug
307
+ const dashSlug = ('meeting-follow-up-' + mtg.title).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 50);
308
+ slugPrefixes.push(dashSlug.slice(0, 30));
309
+ }
310
+ }
302
311
  let slugMatch = null;
303
312
  for (const file of files) {
304
- // Fallback: title-slug filename match (checked first to avoid unnecessary reads)
305
- if (!slugMatch && file.startsWith(slugPrefix)) slugMatch = file;
306
- // Primary: explicit Source Meeting header (written by dashboard /api/plans/create)
313
+ if (!slugMatch && slugPrefixes.some(p => file.startsWith(p))) slugMatch = file;
307
314
  const content = safeRead(path.join(plansDir, file));
308
315
  if (!content) continue;
309
316
  for (const mid of meetingIds) {
@@ -324,7 +331,7 @@ async function executePlanStage(stage, stageState, run, config) {
324
331
  // ── Reconciliation: check if a plan already exists for a meeting in this run ──
325
332
  const meetingIds = _findMeetingsInRun(run);
326
333
  if (meetingIds.length > 0) {
327
- const existingPlanFile = _findExistingPlanForMeeting(meetingIds, slug, plansDir);
334
+ const existingPlanFile = _findExistingPlanForMeeting(meetingIds, plansDir);
328
335
  if (existingPlanFile) {
329
336
  log('info', `Pipeline ${run.pipelineId}: reconciling plan stage — adopting existing plan "${existingPlanFile}"`);
330
337
  // Adopt or create plan-to-prd WI atomically under lock
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.645",
3
+ "version": "0.1.646",
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"