@yemi33/minions 0.1.929 → 0.1.930

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.929 (2026-04-14)
3
+ ## 0.1.930 (2026-04-14)
4
4
 
5
5
  ### Features
6
+ - add adoPollEnabled/ghPollEnabled engine settings
6
7
  - doc-chat abort kills LLM process + queued messages auto-process
7
8
  - add /api/work-items/reopen endpoint and reopen-work-item CC action (#982)
8
9
  - CC tab unread dot + reopened badge on work items
@@ -20,6 +21,7 @@
20
21
  - add red dot notification on CC tab when response completes (#934) (#946)
21
22
 
22
23
  ### Fixes
24
+ - show doc-chat badges on Notes and KB items (#1016)
23
25
  - steering kill on no-session re-queues dispatch instead of erroring (#1015)
24
26
  - inject cached ADO token into spawned agents (#998) (#1012)
25
27
  - qaAbort race + skip kill on completed doc-chat
@@ -39,7 +41,6 @@
39
41
  - plan completion incorrectly overrides awaiting-approval status (#970) (#978)
40
42
  - CC queued messages sent to wrong tab after tab switch
41
43
  - pass sysPromptPath instead of steerPromptPath as system prompt in steering resume (#962)
42
- - PRD item display dispatched/in-progress status conflation (closes #950) (#955)
43
44
 
44
45
  ### Other
45
46
  - test(preflight): add unit tests for findClaudeBinary, runPreflight, printPreflight, checkOrExit (#953)
@@ -86,8 +86,9 @@ function renderNotes(notes) {
86
86
  }
87
87
 
88
88
  if (!content || !content.trim()) { el.innerHTML = '<p class="empty">No team notes yet.</p>'; return; }
89
- el.innerHTML = '<div class="notes-preview" onclick="openNotesModal()" title="Click to expand">' + renderMd(content) + '</div>';
89
+ el.innerHTML = '<div class="notes-preview" data-file="notes.md" onclick="openNotesModal()" title="Click to expand">' + renderMd(content) + '</div>';
90
90
  el.querySelector('.notes-preview')._rawContent = content;
91
+ restoreNotifBadges();
91
92
  }
92
93
 
93
94
  function openNotesModal() {
@@ -48,6 +48,8 @@ async function openSettings() {
48
48
  settingsToggle('Auto-decompose', 'set-autoDecompose', e.autoDecompose !== false, 'Large implement items are auto-split into sub-tasks') +
49
49
  settingsToggle('Allow Temp Agents', 'set-allowTempAgents', !!e.allowTempAgents, 'Spawn ephemeral agents when all permanent agents are busy') +
50
50
  settingsToggle('Auto-archive Plans', 'set-autoArchive', !!e.autoArchive, 'Automatically archive plans after verify completes (off = manual archive via dashboard)') +
51
+ settingsToggle('ADO Polling', 'set-adoPollEnabled', e.adoPollEnabled !== false, 'Poll ADO PR status, comments, and reconciliation on each tick cycle') +
52
+ settingsToggle('GitHub Polling', 'set-ghPollEnabled', e.ghPollEnabled !== false, 'Poll GitHub PR status, comments, and reconciliation on each tick cycle') +
51
53
  '</div>' +
52
54
  '<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px">' +
53
55
  settingsField('Eval Max Iterations', 'set-evalMaxIterations', e.evalMaxIterations || 3, '', 'Max review→fix cycles before escalating (1-10)') +
@@ -208,6 +210,8 @@ async function saveSettings() {
208
210
  autoDecompose: document.getElementById('set-autoDecompose').checked,
209
211
  allowTempAgents: document.getElementById('set-allowTempAgents').checked,
210
212
  autoArchive: document.getElementById('set-autoArchive').checked,
213
+ adoPollEnabled: document.getElementById('set-adoPollEnabled').checked,
214
+ ghPollEnabled: document.getElementById('set-ghPollEnabled').checked,
211
215
  evalMaxIterations: document.getElementById('set-evalMaxIterations').value,
212
216
  evalMaxCost: document.getElementById('set-evalMaxCost').value || null,
213
217
  maxBuildFixAttempts: document.getElementById('set-maxBuildFixAttempts').value,
@@ -150,7 +150,7 @@
150
150
  .kb-tab:hover { color: var(--text); border-color: var(--text); }
151
151
  .kb-tab.active { color: var(--blue); border-color: var(--blue); background: rgba(88,166,255,0.08); }
152
152
  .kb-tab .badge { background: var(--border); color: var(--text); font-size: var(--text-xs); padding: 0 5px; border-radius: var(--radius-lg); margin-left: var(--space-2); }
153
- .kb-list { max-height: 400px; overflow-y: auto; }
153
+ .kb-list { max-height: 400px; overflow-y: auto; padding: var(--space-3) var(--space-4) 0 0; }
154
154
  .kb-item { display: flex; align-items: flex-start; gap: var(--space-5); padding: var(--space-4) 0; border-bottom: 1px solid var(--border); cursor: pointer; transition: background var(--transition-fast); }
155
155
  .kb-item:hover { background: var(--surface2); }
156
156
  .kb-item:last-child { border-bottom: none; }
@@ -164,7 +164,7 @@
164
164
  .agent-emoji { font-size: var(--text-stat); margin-right: var(--space-2); }
165
165
  .click-hint { font-size: var(--text-sm); color: var(--border); margin-top: var(--space-3); }
166
166
 
167
- .inbox-list { display: flex; flex-direction: column; gap: var(--space-4); max-height: 320px; overflow-y: auto; }
167
+ .inbox-list { display: flex; flex-direction: column; gap: var(--space-4); max-height: 320px; overflow-y: auto; padding: var(--space-3) var(--space-4) 0 0; }
168
168
 
169
169
  /* PRD Progress */
170
170
  .prd-progress-bar { width: 100%; height: 20px; background: var(--bg); border-radius: var(--radius-xl); overflow: hidden; display: flex; margin-bottom: var(--space-6); border: 1px solid var(--border); }
@@ -226,6 +226,7 @@
226
226
 
227
227
  .notes-preview { max-height: 400px; overflow-y: auto; font-size: var(--text-md); line-height: 1.6; color: var(--muted); font-family: 'Segoe UI', system-ui, sans-serif; white-space: normal; word-wrap: break-word; background: var(--surface2); border: 1px solid var(--border); border-radius: var(--radius-md); padding: var(--space-6) var(--space-7); cursor: pointer; transition: border-color var(--transition-base); }
228
228
  .notes-preview:hover { border-color: var(--blue); }
229
+ .notes-preview > .notif-badge { top: var(--space-2); right: var(--space-4); }
229
230
  .inbox-item { background: var(--surface2); border: 1px solid var(--border); border-left: 3px solid var(--purple); border-radius: var(--radius-sm); padding: var(--space-5) var(--space-6); cursor: pointer; }
230
231
  .inbox-item:hover { border-color: var(--blue); border-left-color: var(--blue); }
231
232
  .item-pinned { border-left-color: var(--yellow); background: rgba(210, 153, 34, 0.05); }
package/engine/shared.js CHANGED
@@ -547,6 +547,8 @@ const ENGINE_DEFAULTS = {
547
547
  lockRetryBackoffMs: 500, // base backoff between lock retries (doubles each attempt: 500ms, 1s, 2s, ...)
548
548
  maxBuildFixAttempts: 3, // max consecutive auto-fix dispatch cycles per PR before escalation to human
549
549
  buildFixGracePeriod: 600000, // 10min — wait for CI to run after build fix before re-dispatching
550
+ adoPollEnabled: true, // poll ADO PR status, comments, and reconciliation on each tick cycle
551
+ ghPollEnabled: true, // poll GitHub PR status, comments, and reconciliation on each tick cycle
550
552
  autoCompletePrs: false, // auto-merge PRs when builds green + review approved (opt-in)
551
553
  prMergeMethod: 'squash', // merge method: squash, merge, rebase
552
554
  ignoredCommentAuthors: [], // comments from these authors are auto-closed and never trigger fixes
package/engine.js CHANGED
@@ -3120,12 +3120,19 @@ async function tickInner() {
3120
3120
  safe('runCleanup', () => runCleanup(config));
3121
3121
  }
3122
3122
 
3123
+ const adoPollEnabled = config.engine?.adoPollEnabled ?? DEFAULTS.adoPollEnabled;
3124
+ const ghPollEnabled = config.engine?.ghPollEnabled ?? DEFAULTS.ghPollEnabled;
3125
+
3123
3126
  // 2.6. Poll PR status: build, review, merge (every 6 ticks = ~3 minutes)
3124
3127
  // Awaited so PR state is consistent before discoverWork reads it
3125
3128
  // Also re-polls early if previous tick had ADO auth failures (stale build status recovery)
3126
3129
  if (tickCount % 6 === 0 || needsAdoPollRetry()) {
3127
- try { await pollPrStatus(config); } catch (err) { log('warn', `ADO PR status poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3128
- try { await ghPollPrStatus(config); } catch (err) { log('warn', `GitHub PR status poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3130
+ if (adoPollEnabled) {
3131
+ try { await pollPrStatus(config); } catch (err) { log('warn', `ADO PR status poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3132
+ }
3133
+ if (ghPollEnabled) {
3134
+ try { await ghPollPrStatus(config); } catch (err) { log('warn', `GitHub PR status poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3135
+ }
3129
3136
  try { await processPendingRebases(config); } catch (err) { log('warn', `Pending rebase processing error: ${err?.message || err}`); }
3130
3137
  // Sync PR status back to PRD items (missing → done when active PR exists)
3131
3138
  try { syncPrdFromPrs(config); } catch (err) { log('warn', `PRD sync error: ${err?.message || err}`); }
@@ -3147,10 +3154,14 @@ async function tickInner() {
3147
3154
 
3148
3155
  // 2.7. Poll PR threads for human comments (every 12 ticks = ~6 minutes)
3149
3156
  if (tickCount % 12 === 0) {
3150
- try { await pollPrHumanComments(config); } catch (err) { log('warn', `ADO PR comment poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3151
- try { await ghPollPrHumanComments(config); } catch (err) { log('warn', `GitHub PR comment poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3152
- try { await reconcilePrs(config); } catch (err) { log('warn', `ADO PR reconciliation error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3153
- try { await ghReconcilePrs(config); } catch (err) { log('warn', `GitHub PR reconciliation error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3157
+ if (adoPollEnabled) {
3158
+ try { await pollPrHumanComments(config); } catch (err) { log('warn', `ADO PR comment poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3159
+ try { await reconcilePrs(config); } catch (err) { log('warn', `ADO PR reconciliation error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3160
+ }
3161
+ if (ghPollEnabled) {
3162
+ try { await ghPollPrHumanComments(config); } catch (err) { log('warn', `GitHub PR comment poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3163
+ try { await ghReconcilePrs(config); } catch (err) { log('warn', `GitHub PR reconciliation error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
3164
+ }
3154
3165
  }
3155
3166
 
3156
3167
  // 2.9. Stalled dispatch detection — auto-retry failed items blocking the graph (every 20 ticks = ~10 min)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.929",
3
+ "version": "0.1.930",
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"