@yemi33/minions 0.1.983 → 0.1.984

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,10 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.983 (2026-04-15)
3
+ ## 0.1.984 (2026-04-15)
4
4
 
5
5
  ### Features
6
+ - fix misleading poll frequency field labels in settings modal (#1099)
7
+ - add Auto-complete PRs toggle to settings modal (#1095)
6
8
  - gate build failure auto-fix behind autoFixBuilds flag
7
9
  - free-form interval input + CC create-watch action
8
10
  - flush queued CC messages as single combined request
@@ -21,10 +23,9 @@
21
23
  - certificate-based auth for Teams integration (#1027)
22
24
  - Create render-utils.js with shared formatting helpers
23
25
  - add adoPollEnabled/ghPollEnabled engine settings
24
- - doc-chat abort kills LLM process + queued messages auto-process
25
- - add /api/work-items/reopen endpoint and reopen-work-item CC action (#982)
26
26
 
27
27
  ### Fixes
28
+ - fix syncPrsFromOutput skipping tool_result lines where PR URLs live (#1100)
28
29
  - Remove autoReview flag — consolidate into evalLoop (#1093)
29
30
  - link scheduled task notes back to originating item (#1090)
30
31
  - restore rereview and human-fix dispatch
@@ -44,7 +45,6 @@
44
45
  - skip orphaned LLM retry when client disconnected during CC stream
45
46
  - restore queue flush after abort — queued messages are user intent
46
47
  - CC stale lock auto-release + queue drain on abort
47
- - CC streaming 'tabId' TDZ error on new tab first message
48
48
 
49
49
  ### Other
50
50
  - refactor(watches): rename maxTriggers→stopAfter, add onNotMet per-poll action
@@ -51,12 +51,13 @@ async function openSettings() {
51
51
  settingsToggle('Auto-archive Plans', 'set-autoArchive', !!e.autoArchive, 'Automatically archive plans after verify completes (off = manual archive via dashboard)') +
52
52
  settingsToggle('Auto-fix Builds', 'set-autoFixBuilds', e.autoFixBuilds !== false, 'Auto-dispatch fix agents when a PR build fails') +
53
53
  settingsToggle('Auto-fix Conflicts', 'set-autoFixConflicts', e.autoFixConflicts !== false, 'Auto-dispatch fix agents when a PR has merge conflicts') +
54
+ settingsToggle('Auto-complete PRs', 'set-autoCompletePrs', !!e.autoCompletePrs, 'Auto-merge PRs when builds pass and review is approved (opt-in)') +
54
55
  settingsToggle('ADO Polling', 'set-adoPollEnabled', e.adoPollEnabled !== false, 'Poll ADO PR status and comments each tick (reconciliation always runs)') +
55
56
  settingsToggle('GitHub Polling', 'set-ghPollEnabled', e.ghPollEnabled !== false, 'Poll GitHub PR status and comments each tick (reconciliation always runs)') +
56
57
  '</div>' +
57
58
  '<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px">' +
58
- settingsField('ADO Status Poll Frequency', 'set-adoPollStatusEvery', e.adoPollStatusEvery || 6, 'ticks', 'Poll ADO PR build/review/merge status every N ticks (~6 min at default tick rate)') +
59
- settingsField('ADO Comments Poll Frequency', 'set-adoPollCommentsEvery', e.adoPollCommentsEvery || 12, 'ticks', 'Poll ADO PR human comments every N ticks (~12 min at default tick rate)') +
59
+ settingsField('PR Status Poll Frequency', 'set-adoPollStatusEvery', e.adoPollStatusEvery || 6, 'ticks', 'Poll PR build/review/merge status every N ticks for both ADO and GitHub (~6 min at default tick rate)') +
60
+ settingsField('PR Comments Poll Frequency', 'set-adoPollCommentsEvery', e.adoPollCommentsEvery || 12, 'ticks', 'Poll PR human comments every N ticks for both ADO and GitHub (~12 min at default tick rate)') +
60
61
  '</div>' +
61
62
  '<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px">' +
62
63
  settingsField('Eval Max Iterations', 'set-evalMaxIterations', e.evalMaxIterations || 3, '', 'Max review→fix cycles before escalating (1-10)') +
@@ -242,6 +243,7 @@ async function saveSettings() {
242
243
  autoArchive: document.getElementById('set-autoArchive').checked,
243
244
  autoFixBuilds: document.getElementById('set-autoFixBuilds').checked,
244
245
  autoFixConflicts: document.getElementById('set-autoFixConflicts').checked,
246
+ autoCompletePrs: document.getElementById('set-autoCompletePrs').checked,
245
247
  adoPollEnabled: document.getElementById('set-adoPollEnabled').checked,
246
248
  ghPollEnabled: document.getElementById('set-ghPollEnabled').checked,
247
249
  adoPollStatusEvery: document.getElementById('set-adoPollStatusEvery').value,
@@ -707,15 +707,14 @@ function syncPrsFromOutput(output, agentId, meta, config) {
707
707
  const lines = output.split('\n');
708
708
  for (const line of lines) {
709
709
  try {
710
- if (!line.includes('"type":"assistant"') && !line.includes('"type":"result"')) continue;
710
+ if (!line.includes('"type":"assistant"') && !line.includes('"type":"result"') && !line.includes('"type":"user"')) continue;
711
711
  const parsed = JSON.parse(line);
712
712
  const content = parsed.message?.content || [];
713
713
  for (const block of content) {
714
+ // Scan tool_result blocks in user messages for PR URLs (gh pr create output lands here)
714
715
  if (block.type === 'tool_result' && block.content) {
715
716
  const text = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
716
- if (text.includes('pullRequestId') || text.includes('create_pull_request')) {
717
- while ((match = urlPattern.exec(text)) !== null) prMatches.add(match[1] || match[2]);
718
- }
717
+ while ((match = urlPattern.exec(text)) !== null) prMatches.add(match[1] || match[2]);
719
718
  }
720
719
  // Also scan assistant text blocks for PR URLs and "PR created" patterns
721
720
  if (block.type === 'text' && block.text) {
package/engine/watches.js CHANGED
@@ -11,7 +11,7 @@
11
11
  const path = require('path');
12
12
  const shared = require('./shared');
13
13
  const { safeJson, mutateJsonFileLocked, ts, uid, log, writeToInbox,
14
- WATCH_STATUS, WATCH_TARGET_TYPE, WATCH_CONDITION, WATCH_ABSOLUTE_CONDITIONS } = shared;
14
+ WATCH_STATUS, WATCH_TARGET_TYPE, WATCH_CONDITION } = shared;
15
15
 
16
16
  // Dynamic path — respects MINIONS_TEST_DIR for test isolation
17
17
  function _watchesPath() { return path.join(shared.MINIONS_DIR, 'engine', 'watches.json'); }
@@ -237,7 +237,8 @@ function checkWatches(config, state) {
237
237
  }
238
238
  log('info', `Watch triggered: ${watch.id} — ${result.message}`);
239
239
 
240
- // Expire when stopAfter limit is reached. stopAfter=0 means run forever (no limit).
240
+ // Expire when stopAfter > 0 and trigger count reaches the limit.
241
+ // stopAfter: 0 means "run forever" for all condition types.
241
242
  if (watch.stopAfter > 0 && watch.triggerCount >= watch.stopAfter) {
242
243
  watch.status = WATCH_STATUS.EXPIRED;
243
244
  log('info', `Watch expired (stopAfter limit reached): ${watch.id}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.983",
3
+ "version": "0.1.984",
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"