@yemi33/minions 0.1.801 → 0.1.803

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.801 (2026-04-10)
3
+ ## 0.1.803 (2026-04-10)
4
4
 
5
5
  ### Features
6
6
  - configurable ignored comment authors — auto-filtered, never trigger fixes
@@ -9,6 +9,8 @@
9
9
  - cap review→fix cycles at evalMaxIterations (default 3)
10
10
 
11
11
  ### Fixes
12
+ - handle force-pushed dep branches on retry (closes #738) (#806)
13
+ - project-scoped skill work items instruct wrong file path format (closes #790) (#804)
12
14
  - move ignoredAuthors construction outside inner comment loop (ADO)
13
15
  - approved is permanent — no path can ever downgrade it
14
16
  - allow fix dispatch on approved PRs (only guard is in updatePrAfterFix)
@@ -1081,7 +1081,7 @@ function extractSkillsFromOutput(output, agentId, dispatchItem, config) {
1081
1081
  let enrichedBlock = block;
1082
1082
  if (!m('author')) enrichedBlock = enrichedBlock.replace('---\n', `---\nauthor: ${agentName}\n`);
1083
1083
  if (!m('created')) enrichedBlock = enrichedBlock.replace('---\n', `---\ncreated: ${dateStamp()}\n`);
1084
- const filename = name.replace(/[^a-z0-9-]/g, '-') + '.md';
1084
+ const skillDirName = name.replace(/[^a-z0-9-]/g, '-');
1085
1085
  if (scope === 'project' && project) {
1086
1086
  const proj = shared.getProjects(config).find(p => p.name === project);
1087
1087
  if (proj) {
@@ -1092,7 +1092,7 @@ function extractSkillsFromOutput(output, agentId, dispatchItem, config) {
1092
1092
  if (data.some(i => i.title === `Add skill: ${name}` && i.status !== WI_STATUS.FAILED)) return data;
1093
1093
  skillId = `SK${String(data.filter(i => i.id?.startsWith('SK')).length + 1).padStart(3, '0')}`;
1094
1094
  data.push({ id: skillId, type: 'implement', title: `Add skill: ${name}`,
1095
- description: `Create project-level skill \`${filename}\` in ${project}.\n\nWrite this file to \`${proj.localPath}/.claude/skills/${filename}\` via a PR.\n\n## Skill Content\n\n\`\`\`\n${enrichedBlock}\n\`\`\``,
1095
+ description: `Create project-level skill \`${skillDirName}/SKILL.md\` in ${project}.\n\nWrite this file to \`${proj.localPath}/.claude/skills/${skillDirName}/SKILL.md\` via a PR.\n\n## Skill Content\n\n\`\`\`\n${enrichedBlock}\n\`\`\``,
1096
1096
  priority: 'low', status: WI_STATUS.QUEUED, created: ts(), createdBy: `engine:skill-extraction:${agentName}` });
1097
1097
  return data;
1098
1098
  });
package/engine.js CHANGED
@@ -493,8 +493,25 @@ async function spawnAgent(dispatchItem, config) {
493
493
  await execAsync(`git merge "origin/${depBranch}" --no-edit`, { ..._gitOpts, cwd: worktreePath });
494
494
  log('info', `Merged dependency branch ${depBranch} (${prId}) into worktree ${branchName}`);
495
495
  } catch (mergeErr) {
496
- log('warn', `Failed to merge dependency ${depBranch} into ${branchName}: ${mergeErr.message}`);
497
- depMergeFailed = true;
496
+ // Merge failed — possibly due to diverged history from a force-pushed (rebased) dep branch.
497
+ // Abort partial merge, reset worktree to clean main base, and re-merge all deps from scratch.
498
+ log('warn', `Merge of ${depBranch} into ${branchName} failed: ${mergeErr.message} — attempting reset and re-merge of all deps`);
499
+ try { await execAsync(`git merge --abort`, { ..._gitOpts, cwd: worktreePath }); } catch (_) { /* no merge in progress */ }
500
+ const mainRef = sanitizeBranch(shared.resolveMainBranch(rootDir, project.mainBranch));
501
+ try {
502
+ await execAsync(`git reset --hard "origin/${mainRef}"`, { ..._gitOpts, cwd: worktreePath });
503
+ log('info', `Reset worktree ${branchName} to origin/${mainRef} for clean dep re-merge`);
504
+ // Re-merge ALL fetched dep branches from scratch on clean base
505
+ for (const { branch: reBranch, prId: rePrId } of fetched) {
506
+ await execAsync(`git merge "origin/${reBranch}" --no-edit`, { ..._gitOpts, cwd: worktreePath });
507
+ log('info', `Re-merged dependency branch ${reBranch} (${rePrId}) into worktree ${branchName}`);
508
+ }
509
+ log('info', `Successfully re-merged all ${fetched.length} dep branches after reset for ${branchName}`);
510
+ } catch (resetErr) {
511
+ log('warn', `Failed to reset and re-merge deps for ${branchName}: ${resetErr.message}`);
512
+ try { await execAsync(`git merge --abort`, { ..._gitOpts, cwd: worktreePath }); } catch (_) { /* no merge in progress */ }
513
+ depMergeFailed = true;
514
+ }
498
515
  break;
499
516
  }
500
517
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.801",
3
+ "version": "0.1.803",
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"