@yemi33/minions 0.1.1138 → 0.1.1139

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,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.1138 (2026-04-18)
3
+ ## 0.1.1139 (2026-04-18)
4
4
 
5
5
  ### Features
6
6
  - redact ADO tokens and JWTs from engine/log.json writes (#1297)
@@ -9,6 +9,7 @@
9
9
  - seed realActivityMap at spawn time, stamp pid in live-output (#1200)
10
10
 
11
11
  ### Fixes
12
+ - pinned context optimistic save (closes #1295) (#1316)
12
13
  - re-check throttle state per-PR iteration to avoid stale fixThrottled
13
14
  - preserve buildErrorLog through transient states, persist poll time (#1273)
14
15
  - auto-fetch PR title on link-pr (closes #1283) (#1299)
@@ -28,7 +29,57 @@
28
29
  - guard undefined agent in pending dispatch loop (closes #1206) (#1210)
29
30
  - improve fallback meeting conclusion
30
31
  - remove command center chevron
32
+
33
+ ### Other
34
+ - refactor: hoist fixThrottled before PR loop and drop underscore prefix
35
+ - docs(skill): add substitute-scheduler-template-vars (#1278)
36
+ - Clarify PR poll labels
37
+ - Prevent modal opens on text selection
38
+ - refactor: clarify settings page section structure and PR polling dependencies
39
+ - refactor: extract _probeClaudePackage helper, use shared.log for spawn errors
40
+ - Make work item descriptions scrollable
41
+ - Use PAT for publish merges
42
+ - test(queries): add unit tests for invalidateDispatchCache/getInbox/getAgentCharter (#1214)
43
+ - test(shared): add unit tests for truncateTextBytes/tailTextBytes/execSilent/trackReviewMetric/parseCanonicalPrId (#1215)
44
+ - Fix publish workflow merge
45
+ - chore: raise default meeting round timeout
46
+ - Harden prompt context handling
47
+ - Harden loop watch conversion
48
+ - Add watches sidebar activity badge
49
+ - test(cli): add unit tests for handleCommand, start, stop, kill, spawn (#1191)
50
+ - chore: untrack pipeline files — local config only
51
+ - restore: recover daily-arch-improvement and weekly-dead-code-cleanup pipelines
52
+ - Harden CC stream resilience
53
+
54
+ ## 0.1.1137 (2026-04-18)
55
+
56
+ ### Features
57
+ - redact ADO tokens and JWTs from engine/log.json writes (#1297)
58
+ - SEC-02 — replace curl shell-out in ado.js with adoFetch (#1296)
59
+ - validate project name and path on POST /api/projects/add (SEC-04, SEC-05) (#1298)
60
+ - seed realActivityMap at spawn time, stamp pid in live-output (#1200)
61
+
62
+ ### Fixes
63
+ - preserve buildErrorLog through transient states, persist poll time (#1273)
64
+ - auto-fetch PR title on link-pr (closes #1283) (#1299)
65
+ - scheduler double-fire within same cron minute (#1277)
66
+ - gate auto-fix dispatch on throttle state to prevent stale-data spurious fixes
67
+ - preserve buildErrorLog through transient build states (#1232) (#1274)
68
+ - annotate fast-exit empty-output failures with diagnostic hint (#1276)
69
+ - invalidate PRD cache on pr-links.json change + guard aggregate PRs (#1220) (#1272)
70
+ - pass --add-dir for minions + ~/.claude to agents (#1271)
71
+ - preserve VERDICT marker by tail-slicing agent output (#1234) (#1270)
72
+ - PRD info cache staleness and aggregate PR bleed-through (#1222)
73
+ - avoid no-op work item writes
74
+ - resilient claude binary resolution + surface spawn errors
75
+ - resolve native claude.exe from npm wrapper on Windows
76
+ - cap temp-agent creation at maxConcurrent per tick (#1219)
77
+ - reassign pending items from unspawned temp agents to idle named agents (#1204) (#1212)
78
+ - guard undefined agent in pending dispatch loop (closes #1206) (#1210)
79
+ - improve fallback meeting conclusion
80
+ - remove command center chevron
31
81
  - stamp live-output.log stub before spawn (#1198)
82
+ - harden settings save and migrate pr poll config
32
83
 
33
84
  ### Other
34
85
  - refactor: hoist fixThrottled before PR loop and drop underscore prefix
@@ -42,11 +42,37 @@ async function submitPinnedNote(e) {
42
42
  const level = document.getElementById('pin-level').value;
43
43
  if (!title || !content) { if (btn) { btn.disabled = false; btn.textContent = 'Pin Note'; } alert('Title and content required'); return; }
44
44
  try { closeModal(); } catch { /* may not be open */ }
45
+
46
+ // Optimistic render: append the new entry to the pinned list and re-render immediately
47
+ // so it appears without waiting for the POST round-trip or the next status refresh (closes #1295).
48
+ // Snapshot prevEntries so we can revert on failure.
49
+ const prevEntries = Array.isArray(window._pinnedEntries) ? window._pinnedEntries.slice() : [];
50
+ const newEntry = { title, content, level: level || 'info' };
51
+ const nextEntries = prevEntries.concat([newEntry]);
52
+ window._pinnedEntries = nextEntries;
53
+ try { renderPinned(nextEntries); } catch { /* DOM may be missing — non-fatal */ }
45
54
  showToast('cmd-toast', 'Note pinned', true);
55
+
46
56
  try {
47
57
  const res = await fetch('/api/pinned', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title, content, level }) });
48
- if (res.ok) { refresh(); } else { const d = await res.json().catch(() => ({})); showToast('cmd-toast', 'Pin failed: ' + (d.error || 'unknown'), false); openPinNoteModal(); }
49
- } catch (e) { showToast('cmd-toast', 'Error: ' + e.message, false); openPinNoteModal(); }
58
+ if (res.ok) {
59
+ // Reconcile with server state (captures the normalised entry shape from parsePinnedEntries).
60
+ refresh();
61
+ } else {
62
+ // Revert optimistic update and surface the error.
63
+ window._pinnedEntries = prevEntries;
64
+ try { renderPinned(prevEntries); } catch { /* ignore */ }
65
+ const d = await res.json().catch(() => ({}));
66
+ showToast('cmd-toast', 'Pin failed: ' + (d.error || 'unknown'), false);
67
+ openPinNoteModal();
68
+ }
69
+ } catch (err) {
70
+ // Network failure — revert optimistic update.
71
+ window._pinnedEntries = prevEntries;
72
+ try { renderPinned(prevEntries); } catch { /* ignore */ }
73
+ showToast('cmd-toast', 'Error: ' + err.message, false);
74
+ openPinNoteModal();
75
+ }
50
76
  }
51
77
 
52
78
  async function removePinnedNote(title) {
package/dashboard.js CHANGED
@@ -381,10 +381,15 @@ function _mtimesChanged(prev, curr) {
381
381
  return false;
382
382
  }
383
383
 
384
- function invalidateStatusCache() {
384
+ function invalidateStatusCache(opts) {
385
385
  _fastState = null;
386
386
  _fastStateTs = 0;
387
- // Slow state continues on its own TTL — not invalidated by mutations
387
+ // Slow state continues on its own TTL by default mutations of slow-state data
388
+ // (pinned.md, schedules, etc.) must opt in via { includeSlow: true } for immediate visibility.
389
+ if (opts && opts.includeSlow) {
390
+ _slowState = null;
391
+ _slowStateTs = 0;
392
+ }
388
393
  _statusCache = null;
389
394
  _statusCacheJson = null;
390
395
  _statusCacheGzip = null;
@@ -4785,7 +4790,8 @@ What would you like to discuss or change? When you're happy, say "approve" and I
4785
4790
  const levelTag = level === 'critical' ? '🔴 ' : level === 'warning' ? '🟡 ' : '';
4786
4791
  const entry = '\n\n### ' + levelTag + title + '\n\n' + content + '\n\n*Pinned by human on ' + new Date().toISOString().slice(0, 10) + '*';
4787
4792
  safeWrite(pinnedPath, (existing || '# Pinned Context\n\nCritical notes visible to all agents.') + entry);
4788
- invalidateStatusCache();
4793
+ // pinned.md is in slow-state cache — opt-in invalidation so the new entry is visible immediately (closes #1295)
4794
+ invalidateStatusCache({ includeSlow: true });
4789
4795
  return jsonReply(res, 200, { ok: true });
4790
4796
  }},
4791
4797
  { method: 'POST', path: '/api/pinned/remove', desc: 'Remove a pinned note by title', params: 'title', handler: async (req, res) => {
@@ -4798,7 +4804,8 @@ What would you like to discuss or change? When you're happy, say "approve" and I
4798
4804
  const regex = new RegExp('\\n\\n###\\s*(?:🔴\\s*|🟡\\s*)?' + title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\n[\\s\\S]*?(?=\\n\\n###|$)', 'i');
4799
4805
  content = content.replace(regex, '');
4800
4806
  safeWrite(pinnedPath, content);
4801
- invalidateStatusCache();
4807
+ // pinned.md is in slow-state cache — opt-in invalidation so the unpin is visible immediately
4808
+ invalidateStatusCache({ includeSlow: true });
4802
4809
  return jsonReply(res, 200, { ok: true });
4803
4810
  }},
4804
4811
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1138",
3
+ "version": "0.1.1139",
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"