@yemi33/minions 0.1.479 → 0.1.480

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,8 +1,9 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.479 (2026-04-07)
3
+ ## 0.1.480 (2026-04-07)
4
4
 
5
5
  ### Features
6
+ - file bugs as GitHub issues from CC or doc-chat
6
7
  - Buffer log() writes to reduce lock contention
7
8
  - Cache getStatus() JSON serialization and add mtime-based invalidation
8
9
  - Add mtime-based caching to getPrdInfo()
@@ -638,6 +638,17 @@ async function ccExecuteAction(action) {
638
638
  status.style.color = 'var(--green)';
639
639
  break;
640
640
  }
641
+ case 'file-bug': {
642
+ const res = await _ccFetch('/api/issues/create', { title: action.title, description: action.description, project: action.project, labels: action.labels });
643
+ const d = await res.json();
644
+ if (d.url) {
645
+ status.innerHTML = '&#128027; Bug filed: <a href="' + escHtml(d.url) + '" target="_blank" style="color:var(--blue)">' + escHtml(action.title) + '</a>';
646
+ } else {
647
+ status.innerHTML = '&#128027; Bug filed: <strong>' + escHtml(action.title) + '</strong>';
648
+ }
649
+ status.style.color = 'var(--green)';
650
+ break;
651
+ }
641
652
  default:
642
653
  status.innerHTML = '? Unknown action: ' + escHtml(action.type);
643
654
  status.style.color = 'var(--muted)';
package/dashboard.js CHANGED
@@ -576,6 +576,7 @@ Available action types:
576
576
  - **link-pr**: Link an external PR for tracking. Fields: url (PR URL), title (optional), project (optional), autoObserve (bool, default true)
577
577
  - **archive-meeting**: Archive a completed meeting. Fields: id (meeting ID)
578
578
  - **update-routing**: Update the routing table. Fields: content (full routing.md content)
579
+ - **file-bug**: File a bug as a GitHub issue on the project repo. Fields: title (short bug title), description (markdown body with repro steps, expected vs actual behavior), project (optional, defaults to first project), labels (optional array, defaults to ["bug"]). Use when the user says "file a bug", "create an issue", "report this", etc.
579
580
 
580
581
  ## Rules
581
582
 
@@ -3184,6 +3185,25 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3184
3185
  } catch (e) { return jsonReply(res, 500, { error: e.message }); }
3185
3186
  }
3186
3187
 
3188
+ async function handleFileBug(req, res) {
3189
+ try {
3190
+ const body = await readBody(req);
3191
+ if (!body.title) return jsonReply(res, 400, { error: 'title required' });
3192
+ const project = shared.getProjects(CONFIG).find(p => body.project ? p.name === body.project : true);
3193
+ if (!project) return jsonReply(res, 400, { error: 'no project found' });
3194
+
3195
+ const labels = (body.labels || ['bug']).join(',');
3196
+ const bugBody = (body.description || '') + '\n\n---\n_Filed via Minions dashboard_';
3197
+ const slug = project.repoHost === 'github' ? `${project.adoOrg}/${project.repoName}` : null;
3198
+ if (!slug) return jsonReply(res, 400, { error: 'Bug filing currently supports GitHub repos only' });
3199
+
3200
+ const cmd = `gh issue create --repo "${slug}" --title "${body.title.replace(/"/g, '\\"')}" --body "${bugBody.replace(/"/g, '\\"')}" --label "${labels}" 2>&1`;
3201
+ const result = shared.exec(cmd, { encoding: 'utf-8', timeout: 30000, windowsHide: true });
3202
+ const urlMatch = result.match(/https:\/\/github\.com\/\S+/);
3203
+ return jsonReply(res, 200, { ok: true, url: urlMatch ? urlMatch[0] : null, output: result.trim() });
3204
+ } catch (e) { return jsonReply(res, 500, { error: e.message }); }
3205
+ }
3206
+
3187
3207
  async function handleCommandCenterNewSession(req, res) {
3188
3208
  ccSession = { sessionId: null, createdAt: null, lastActiveAt: null, turnCount: 0 };
3189
3209
  ccInFlight = false; // Reset concurrency guard so a stuck request doesn't block new sessions
@@ -3877,6 +3897,9 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3877
3897
  { method: 'POST', path: '/api/projects/scan', desc: 'Scan a directory for git repos', params: 'path?, depth?', handler: handleProjectsScan },
3878
3898
  { method: 'POST', path: '/api/projects/add', desc: 'Auto-discover and add a project to config', params: 'path, name?', handler: handleProjectsAdd },
3879
3899
 
3900
+ // Bug Filing
3901
+ { method: 'POST', path: '/api/issues/create', desc: 'File a bug as a GitHub issue', params: 'title, description?, project?, labels?', handler: handleFileBug },
3902
+
3880
3903
  // Command Center
3881
3904
  { method: 'POST', path: '/api/command-center/new-session', desc: 'Clear active CC session', handler: handleCommandCenterNewSession },
3882
3905
  { method: 'POST', path: '/api/command-center', desc: 'Conversational command center with full minions context', params: 'message, sessionId?', handler: handleCommandCenter },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.479",
3
+ "version": "0.1.480",
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"