@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 +3 -1
- package/engine/lifecycle.js +2 -2
- package/engine.js +19 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
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)
|
package/engine/lifecycle.js
CHANGED
|
@@ -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
|
|
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 \`${
|
|
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
|
-
|
|
497
|
-
|
|
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.
|
|
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"
|