@yemi33/minions 0.1.1138 → 0.1.1140

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.1140 (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,108 @@
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.1139 (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
+ - pinned context optimistic save (closes #1295) (#1316)
64
+ - re-check throttle state per-PR iteration to avoid stale fixThrottled
65
+ - preserve buildErrorLog through transient states, persist poll time (#1273)
66
+ - auto-fetch PR title on link-pr (closes #1283) (#1299)
67
+ - scheduler double-fire within same cron minute (#1277)
68
+ - gate auto-fix dispatch on throttle state to prevent stale-data spurious fixes
69
+ - preserve buildErrorLog through transient build states (#1232) (#1274)
70
+ - annotate fast-exit empty-output failures with diagnostic hint (#1276)
71
+ - invalidate PRD cache on pr-links.json change + guard aggregate PRs (#1220) (#1272)
72
+ - pass --add-dir for minions + ~/.claude to agents (#1271)
73
+ - preserve VERDICT marker by tail-slicing agent output (#1234) (#1270)
74
+ - PRD info cache staleness and aggregate PR bleed-through (#1222)
75
+ - avoid no-op work item writes
76
+ - resilient claude binary resolution + surface spawn errors
77
+ - resolve native claude.exe from npm wrapper on Windows
78
+ - cap temp-agent creation at maxConcurrent per tick (#1219)
79
+ - reassign pending items from unspawned temp agents to idle named agents (#1204) (#1212)
80
+ - guard undefined agent in pending dispatch loop (closes #1206) (#1210)
81
+ - improve fallback meeting conclusion
82
+ - remove command center chevron
83
+
84
+ ### Other
85
+ - refactor: hoist fixThrottled before PR loop and drop underscore prefix
86
+ - docs(skill): add substitute-scheduler-template-vars (#1278)
87
+ - Clarify PR poll labels
88
+ - Prevent modal opens on text selection
89
+ - refactor: clarify settings page section structure and PR polling dependencies
90
+ - refactor: extract _probeClaudePackage helper, use shared.log for spawn errors
91
+ - Make work item descriptions scrollable
92
+ - Use PAT for publish merges
93
+ - test(queries): add unit tests for invalidateDispatchCache/getInbox/getAgentCharter (#1214)
94
+ - test(shared): add unit tests for truncateTextBytes/tailTextBytes/execSilent/trackReviewMetric/parseCanonicalPrId (#1215)
95
+ - Fix publish workflow merge
96
+ - chore: raise default meeting round timeout
97
+ - Harden prompt context handling
98
+ - Harden loop watch conversion
99
+ - Add watches sidebar activity badge
100
+ - test(cli): add unit tests for handleCommand, start, stop, kill, spawn (#1191)
101
+ - chore: untrack pipeline files — local config only
102
+ - restore: recover daily-arch-improvement and weekly-dead-code-cleanup pipelines
103
+ - Harden CC stream resilience
104
+
105
+ ## 0.1.1137 (2026-04-18)
106
+
107
+ ### Features
108
+ - redact ADO tokens and JWTs from engine/log.json writes (#1297)
109
+ - SEC-02 — replace curl shell-out in ado.js with adoFetch (#1296)
110
+ - validate project name and path on POST /api/projects/add (SEC-04, SEC-05) (#1298)
111
+ - seed realActivityMap at spawn time, stamp pid in live-output (#1200)
112
+
113
+ ### Fixes
114
+ - preserve buildErrorLog through transient states, persist poll time (#1273)
115
+ - auto-fetch PR title on link-pr (closes #1283) (#1299)
116
+ - scheduler double-fire within same cron minute (#1277)
117
+ - gate auto-fix dispatch on throttle state to prevent stale-data spurious fixes
118
+ - preserve buildErrorLog through transient build states (#1232) (#1274)
119
+ - annotate fast-exit empty-output failures with diagnostic hint (#1276)
120
+ - invalidate PRD cache on pr-links.json change + guard aggregate PRs (#1220) (#1272)
121
+ - pass --add-dir for minions + ~/.claude to agents (#1271)
122
+ - preserve VERDICT marker by tail-slicing agent output (#1234) (#1270)
123
+ - PRD info cache staleness and aggregate PR bleed-through (#1222)
124
+ - avoid no-op work item writes
125
+ - resilient claude binary resolution + surface spawn errors
126
+ - resolve native claude.exe from npm wrapper on Windows
127
+ - cap temp-agent creation at maxConcurrent per tick (#1219)
128
+ - reassign pending items from unspawned temp agents to idle named agents (#1204) (#1212)
129
+ - guard undefined agent in pending dispatch loop (closes #1206) (#1210)
130
+ - improve fallback meeting conclusion
131
+ - remove command center chevron
31
132
  - stamp live-output.log stub before spawn (#1198)
133
+ - harden settings save and migrate pr poll config
32
134
 
33
135
  ### Other
34
136
  - 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.1140",
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"