@yemi33/minions 0.1.413 → 0.1.415

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,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.415 (2026-04-06)
4
+
5
+ ### Features
6
+ - Fix null crashes in lifecycle.js syncPrsFromOutput and createReviewFeedbackForAuthor
7
+
8
+ ## 0.1.414 (2026-04-06)
9
+
10
+ ### Fixes
11
+ - use shell exec for npm view — execFile can't run .cmd on Windows
12
+
3
13
  ## 0.1.413 (2026-04-06)
4
14
 
5
15
  ### Fixes
package/dashboard.js CHANGED
@@ -180,12 +180,12 @@ async function checkNpmVersion() {
180
180
  if (_npmVersionCache && (now - _npmVersionCacheTs) < NPM_CHECK_INTERVAL) return _npmVersionCache;
181
181
  try {
182
182
  // Use npm view — respects user's .npmrc proxy/registry config
183
- // Resolve npm path from Node binary location detached processes may not have PATH
184
- const { execFile } = require('child_process');
183
+ // Must use shell:true on Windows because npm is a .cmd batch script
184
+ const { exec: _exec } = require('child_process');
185
185
  const nodeDir = require('path').dirname(process.execPath);
186
186
  const npmPath = require('path').join(nodeDir, process.platform === 'win32' ? 'npm.cmd' : 'npm');
187
187
  const version = await new Promise((resolve, reject) => {
188
- execFile(npmPath, ['view', PKG_NAME, 'version'], { timeout: 15000, windowsHide: true }, (err, stdout) => {
188
+ _exec(`"${npmPath}" view ${PKG_NAME} version`, { timeout: 15000, windowsHide: true, encoding: 'utf8' }, (err, stdout) => {
189
189
  if (err) reject(err); else resolve((stdout || '').trim());
190
190
  });
191
191
  });
@@ -617,6 +617,7 @@ function syncPrsFromOutput(output, agentId, meta, config) {
617
617
  const inboxFiles = getInboxFiles().filter(f => f.includes(agentId) && f.includes(today));
618
618
  for (const f of inboxFiles) {
619
619
  const content = safeRead(path.join(INBOX_DIR, f));
620
+ if (!content) continue;
620
621
  const prHeaderPattern = /\*\*PR[:\*]*\*?\s*[#-]*\s*(?:(?:visualstudio\.com|dev\.azure\.com)[^\s"]*?pullrequest\/(\d+)|github\.com\/[^\s"]*?\/pull\/(\d+))/gi;
621
622
  while ((match = prHeaderPattern.exec(content)) !== null) prMatches.add(match[1] || match[2]);
622
623
  }
@@ -991,7 +992,7 @@ function createReviewFeedbackForAuthor(reviewerAgentId, pr, config) {
991
992
  const inboxFiles = getInboxFiles();
992
993
  const reviewFiles = inboxFiles.filter(f => f.includes(reviewerAgentId) && f.includes(today));
993
994
  if (reviewFiles.length === 0) return;
994
- const reviewContent = reviewFiles.map(f => safeRead(path.join(INBOX_DIR, f))).join('\n\n');
995
+ const reviewContent = reviewFiles.map(f => safeRead(path.join(INBOX_DIR, f))).filter(Boolean).join('\n\n');
995
996
  const feedbackFile = `feedback-${authorAgentId}-from-${reviewerAgentId}-${pr.id}-${today}.md`;
996
997
  const feedbackPath = shared.uniquePath(path.join(INBOX_DIR, feedbackFile));
997
998
  const content = `# Review Feedback for ${config.agents[authorAgentId]?.name || authorAgentId}\n\n` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.413",
3
+ "version": "0.1.415",
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"