@yemi33/minions 0.1.2097 → 0.1.2099

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/README.md CHANGED
@@ -85,7 +85,7 @@ You can also run scripts directly: `node ~/.minions/engine.js start`, `node ~/.m
85
85
  minions update
86
86
  ```
87
87
 
88
- One command — pulls the latest npm package and applies the update automatically. Equivalent to `npm update -g @yemi33/minions && minions init --force`.
88
+ One command — pulls the latest npm package and applies the update automatically. Equivalent to `npm install -g @yemi33/minions@latest && minions init --force`.
89
89
 
90
90
  **What gets updated:** Engine code (`.js`, `.html`), new playbooks, new agent charters, new docs, `CHANGELOG.md`.
91
91
 
package/bin/minions.js CHANGED
@@ -929,7 +929,7 @@ if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
929
929
  console.log(` Version synced to ${getPkgVersion()} (dev/symlink install — pull from git to update code)`);
930
930
  } else {
931
931
  try {
932
- execSync('npm update -g @yemi33/minions', { stdio: 'inherit', timeout: 120000 });
932
+ execSync('npm install -g @yemi33/minions@latest', { stdio: 'inherit', timeout: 120000 });
933
933
  } catch (e) {
934
934
  console.error(' npm update failed:', e.message);
935
935
  process.exit(1);
@@ -474,7 +474,7 @@ function renderVersionBanner(version) {
474
474
  el.title = 'The dashboard process is running older code. Run: minions restart';
475
475
  } else if (version.updateAvailable) {
476
476
  el.style.cssText = 'font-size:9px;padding:2px 8px;background:rgba(63,185,80,0.1);border:1px solid rgba(63,185,80,0.3);border-radius:4px;color:var(--green);cursor:help';
477
- el.textContent = 'v' + v + commitLabel + ' — v' + version.latest + ' available. Run: minions update or npm update -g @yemi33/minions';
477
+ el.textContent = 'v' + v + commitLabel + ' — v' + version.latest + ' available. Run: minions update or npm install -g @yemi33/minions@latest';
478
478
  el.title = 'A newer version is available on npm. Run minions update to upgrade and restart.';
479
479
  } else {
480
480
  el.style.cssText = 'font-size:9px;color:var(--muted)';
@@ -78,7 +78,7 @@ Controlled by the `files` field in `package.json`:
78
78
 
79
79
  ### How updates work
80
80
 
81
- - Users run `npm update -g @yemi33/minions` then `minions init --force` to update engine code
81
+ - Users run `npm install -g @yemi33/minions@latest` then `minions init --force` to update engine code (avoids the `npm update -g` Windows footgun where the bin shim gets removed mid-update)
82
82
  - `npx @yemi33/minions` always fetches the latest version
83
83
 
84
84
  ## Auto-Publishing
@@ -263,31 +263,6 @@ function buildSpawnFlags(opts = {}) {
263
263
  return flags;
264
264
  }
265
265
 
266
- function getUserAssetDirs({ homeDir = os.homedir() } = {}) {
267
- return [path.join(homeDir, '.claude')];
268
- }
269
-
270
- function getSkillRoots({ homeDir = os.homedir(), project = null } = {}) {
271
- const roots = [
272
- { scope: 'claude-code', dir: path.join(homeDir, '.claude', 'skills') },
273
- ];
274
- if (project?.localPath) {
275
- roots.push({
276
- scope: 'project',
277
- projectName: project.name,
278
- dir: path.join(project.localPath, '.claude', 'skills'),
279
- });
280
- }
281
- return roots;
282
- }
283
-
284
- function getSkillWriteTargets({ homeDir = os.homedir(), project = null } = {}) {
285
- return {
286
- personal: path.join(homeDir, '.claude', 'skills'),
287
- project: project?.localPath ? path.join(project.localPath, '.claude', 'skills') : null,
288
- };
289
- }
290
-
291
266
  // Stamped into every session.json this adapter writes so the pre-spawn resume
292
267
  // path can detect "session was produced by a different runtime" — Claude
293
268
  // rejects Copilot session IDs (and vice versa) with "No conversation found",
package/engine/shared.js CHANGED
@@ -5202,6 +5202,14 @@ function getPrFixAutomationCause({ dispatchKey = '', source = '', task = '' } =
5202
5202
  return PR_FIX_CAUSE.UNKNOWN;
5203
5203
  }
5204
5204
 
5205
+ // Source-branch head SHA, normalized across hosts. GitHub PRs carry
5206
+ // `headSha`/`headRefOid` (engine/github.js:718-742 keeps both in sync); ADO PRs
5207
+ // carry `_adoSourceCommit`/`headRefOid` (engine/ado.js:1083-1129) and a legacy
5208
+ // `_adoHeadCommit`. Mirrors engine/lifecycle.js:1849 getPrFixBaselineHead.
5209
+ function _prHeadSha(pr) {
5210
+ return String(pr?.headRefOid || pr?.headSha || pr?._adoSourceCommit || pr?._adoHeadCommit || '').trim();
5211
+ }
5212
+
5205
5213
  function prFixEvidenceFingerprint(pr, cause = PR_FIX_CAUSE.UNKNOWN) {
5206
5214
  const review = pr?.minionsReview || {};
5207
5215
  const feedback = pr?.humanFeedback || {};
@@ -5214,6 +5222,13 @@ function prFixEvidenceFingerprint(pr, cause = PR_FIX_CAUSE.UNKNOWN) {
5214
5222
  evidence.buildFailReason = pr?.buildFailReason || '';
5215
5223
  evidence.buildErrorLog = pr?.buildErrorLog || '';
5216
5224
  evidence.buildStatusDetail = pr?._buildStatusDetail || '';
5225
+ // #2979 — head SHA + lastPushedAt are the only fingerprint components that
5226
+ // change across a rebase + force-push. Without them, a no-op-fix pause was
5227
+ // sticky forever because failing pipeline name / fail reason / error log
5228
+ // are unchanged across the push. Existing paused records re-fingerprint on
5229
+ // the next poll and clear naturally when the head moves.
5230
+ evidence.headRefOid = _prHeadSha(pr);
5231
+ evidence.lastPushedAt = pr?.lastPushedAt || '';
5217
5232
  } else if (cause === PR_FIX_CAUSE.MERGE_CONFLICT) {
5218
5233
  evidence.mergeConflict = !!pr?._mergeConflict;
5219
5234
  evidence.mergeStatus = pr?.mergeStatus || '';
@@ -5223,6 +5238,13 @@ function prFixEvidenceFingerprint(pr, cause = PR_FIX_CAUSE.UNKNOWN) {
5223
5238
  evidence.lastReviewedAt = pr?.lastReviewedAt || '';
5224
5239
  evidence.reviewedAt = review.reviewedAt || '';
5225
5240
  evidence.reviewNote = review.note || pr?.reviewNote || '';
5241
+ // #2979 — same rationale as BUILD_FAILURE: review feedback fingerprints
5242
+ // were sticky across force-push because reviewStatus / reviewedAt /
5243
+ // reviewNote don't change when the author rebases. Adding the head SHA
5244
+ // gives REVIEW_FEEDBACK the same natural-unsticking property HUMAN_FEEDBACK
5245
+ // already has via lastProcessedCommentDate.
5246
+ evidence.headRefOid = _prHeadSha(pr);
5247
+ evidence.lastPushedAt = pr?.lastPushedAt || '';
5226
5248
  }
5227
5249
  return crypto.createHash('sha1').update(JSON.stringify(evidence)).digest('hex').slice(0, 16);
5228
5250
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.2097",
3
+ "version": "0.1.2099",
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"