@yemi33/minions 0.1.2243 → 0.1.2245

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.
@@ -147,7 +147,7 @@ const RENDER_VERSIONS = {
147
147
  dispatch: 2,
148
148
  engineLog: 2,
149
149
  metrics: 1,
150
- workItems: 4,
150
+ workItems: 5,
151
151
  skills: 1,
152
152
  commands: 1,
153
153
  mcpServers: 1,
@@ -171,6 +171,14 @@ function wiRow(item) {
171
171
  : (item.branchStrategy === 'shared-branch' && item.status === 'done')
172
172
  ? '<span style="font-size:var(--text-xs);color:var(--muted)" title="Part of shared branch — aggregate PR created at verify stage">shared branch</span>'
173
173
  : '<span style="color:var(--muted)">—</span>';
174
+ // W-mqrdn6qq — Non-retryable failures surface their red failReason snippet in
175
+ // the PR column (not the Agent column). The engine prefixes failReason with
176
+ // "Non-retryable failure:" and stamps item._failureClass on non-retryable
177
+ // demotion (engine/dispatch.js writeDispatchResult / force-demote path).
178
+ var isNonRetryableFail = !!item._failureClass || /^Non-retryable failure:/i.test(item.failReason || '');
179
+ var failSnippet = item.failReason
180
+ ? '<span style="display:block;font-size:var(--text-xs);color:var(--red)" title="' + escapeHtml(item.failReason) + '">' + escapeHtml(item.failReason.slice(0, 30)) + '</span>'
181
+ : '';
174
182
  // PR follow-up chip (W-mpej3cox00099466) — surfaced when the WI was spun
175
183
  // off from a PR comment via meta.pr_followup. Links to the parent PR.
176
184
  var prFollowup = item.meta && item.meta.pr_followup;
@@ -183,7 +191,7 @@ function wiRow(item) {
183
191
  }
184
192
  return '<tr data-wi-id="' + escapeHtml(item.id) + '" style="cursor:pointer" onclick="if(shouldIgnoreSelectionClick(event))return;openWorkItemDetail(\'' + escapeHtml(item.id) + '\')">' +
185
193
  '<td><span class="pr-id">' + escapeHtml(item.id || '') + '</span></td>' +
186
- '<td style="max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="' + escapeHtml((item.title || '').slice(0, 200)) + '">' + escapeHtml(item.title || '') + followupChip + '</td>' +
194
+ '<td style="min-width:280px;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="' + escapeHtml((item.title || '').slice(0, 200)) + '">' + escapeHtml(item.title || '') + followupChip + '</td>' +
187
195
  '<td><span style="font-size:var(--text-sm);color:var(--muted)">' + escapeHtml(item._source || '') + '</span>' +
188
196
  (item.scope === 'fan-out' ? ' <span class="pr-badge ' + (item.status === 'done' || item.status === 'failed' ? 'draft' : 'building') + '" style="font-size:var(--text-xs)">fan-out</span>' : '') + '</td>' +
189
197
  '<td>' + typeBadge(item.type) + '</td>' +
@@ -217,9 +225,9 @@ function wiRow(item) {
217
225
  (item.completedAgents && item.completedAgents.length > 0
218
226
  ? '<span class="pr-agent">' + escapeHtml(item.completedAgents.join(', ')) + '</span>'
219
227
  : '<span class="pr-agent">' + escapeHtml(item.dispatched_to || item.agent || '—') + '</span>') +
220
- (item.failReason ? '<span style="display:block;font-size:var(--text-xs);color:var(--red)" title="' + escapeHtml(item.failReason) + '">' + escapeHtml(item.failReason.slice(0, 30)) + '</span>' : '') +
228
+ (failSnippet && !isNonRetryableFail ? failSnippet : '') +
221
229
  '</td>' +
222
- '<td>' + prLink + '</td>' +
230
+ '<td>' + prLink + (failSnippet && isNonRetryableFail ? failSnippet : '') + '</td>' +
223
231
  '<td><span class="pr-date">' + escapeHtml((item.created || '').slice(0, 16).replace('T', ' ')) + '</span></td>' +
224
232
  '<td style="white-space:nowrap;font-size:var(--text-xs);color:var(--muted)">' +
225
233
  (function() {
@@ -278,7 +286,7 @@ function renderWorkItems(items, opts) {
278
286
  const start = wiPage * WI_PER_PAGE;
279
287
  const pageItems = items.slice(start, start + WI_PER_PAGE);
280
288
 
281
- let html = '<div class="pr-table-wrap"><table class="pr-table"><thead><tr><th>ID</th><th>Title</th><th>Source</th><th>Type</th><th>Priority</th><th>Status</th><th>Agent</th><th>PR</th><th>Created</th><th></th><th></th></tr></thead><tbody>';
289
+ let html = '<div class="pr-table-wrap"><table class="pr-table"><thead><tr><th>ID</th><th>Title</th><th>Project</th><th>Type</th><th>Priority</th><th>Status</th><th>Agent</th><th>PR</th><th>Created</th><th></th><th></th></tr></thead><tbody>';
282
290
  html += pageItems.map(wiRow).join('');
283
291
  html += '</tbody></table></div>';
284
292
 
@@ -479,7 +487,7 @@ async function toggleWorkItemArchive() {
479
487
  items.map(function(i) {
480
488
  return '<tr style="opacity:0.6">' +
481
489
  '<td><span class="pr-id">' + escapeHtml(i.id || '') + '</span></td>' +
482
- '<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">' + escapeHtml(i.title || '') + '</td>' +
490
+ '<td style="min-width:240px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">' + escapeHtml(i.title || '') + '</td>' +
483
491
  '<td><span class="dispatch-type ' + (i.type || '') + '">' + escapeHtml(i.type || '') + '</span></td>' +
484
492
  '<td style="color:' + (i.status === 'done' ? 'var(--green)' : 'var(--red)') + '">' + escapeHtml(i.status || '') + '</td>' +
485
493
  '<td>' + escapeHtml(i.dispatched_to || '—') + '</td>' +
@@ -746,7 +754,7 @@ function _wiRenderDetail(item) {
746
754
  }
747
755
  html += field('Description', '<div id="wi-detail-desc" style="font-size:var(--text-md);max-height:320px;overflow-y:auto;padding:8px 10px;background:var(--surface2);border:1px solid var(--border);border-radius:var(--radius-sm)">' + _descHtml + '</div>');
748
756
  html += field('Agent', escapeHtml(item.dispatched_to || item.agent || 'Auto'));
749
- html += field('Source', escapeHtml(item._source || 'central'));
757
+ html += field('Project', escapeHtml(item._source || 'central'));
750
758
  // P-714ef144 — surface meta.workdir in the detail modal so operators can
751
759
  // confirm the agent's actual cwd. Renders nothing when unset (which is
752
760
  // the back-compat default = project root). Code-tagged so the path is
@@ -1053,7 +1061,7 @@ function openWorkItemDetail(id) {
1053
1061
 
1054
1062
  function openAllWorkItems() {
1055
1063
  document.getElementById('modal-title').textContent = 'All Work Items (' + allWorkItems.length + ')';
1056
- const html = '<div class="pr-table-wrap"><table class="pr-table"><thead><tr><th>ID</th><th>Title</th><th>Source</th><th>Type</th><th>Priority</th><th>Status</th><th>Agent</th><th>PR</th><th>Created</th><th></th><th></th></tr></thead><tbody>' +
1064
+ const html = '<div class="pr-table-wrap"><table class="pr-table"><thead><tr><th>ID</th><th>Title</th><th>Project</th><th>Type</th><th>Priority</th><th>Status</th><th>Agent</th><th>PR</th><th>Created</th><th></th><th></th></tr></thead><tbody>' +
1057
1065
  allWorkItems.map(wiRow).join('') + '</tbody></table></div>';
1058
1066
  // eslint-disable-next-line no-unsanitized/property -- reason: structural HTML is a string literal; all user data wrapped in escapeHtml() by wiRow() (fields: work item id/title/source/status/agent/PR links/dates/follow-up metadata)
1059
1067
  document.getElementById('modal-body').innerHTML = html;
@@ -1125,7 +1125,7 @@
1125
1125
 
1126
1126
  /* Command Center tab bar */
1127
1127
  .cc-tab-scroll { display: flex; gap: 4px; align-items: center; overflow-x: auto; overflow-y: hidden; flex: 1 1 auto; min-width: 0; scrollbar-width: thin; }
1128
- .cc-tab { padding: 4px 10px; font-size: var(--text-sm); border: 1px solid var(--border); border-bottom: none; border-radius: 6px 6px 0 0; background: var(--surface2); color: var(--muted); cursor: grab; white-space: nowrap; max-width: 140px; display: inline-flex; align-items: center; gap: 2px; flex-shrink: 0; margin-bottom: -1px; position: relative; }
1128
+ .cc-tab { padding: 4px 10px; font-size: var(--text-sm); border: 1px solid var(--border); border-bottom: none; border-radius: 6px 6px 0 0; background: var(--surface2); color: var(--muted); cursor: pointer; white-space: nowrap; max-width: 140px; display: inline-flex; align-items: center; gap: 2px; flex-shrink: 0; margin-bottom: -1px; position: relative; }
1129
1129
  .cc-tab:active { cursor: grabbing; }
1130
1130
  .cc-tab.cc-tab-dragging { opacity: 0.5; cursor: grabbing; }
1131
1131
  .cc-tab.cc-tab-drop-target { box-shadow: inset 2px 0 0 0 var(--blue); }
@@ -68,6 +68,14 @@ const _FIREBASE_BRAND_RE = /\bFirebase\s+(?:App\s+Distribution|Hosting)\b/i;
68
68
  const _FIREBASE_URL_RE = /\bappdistribution\.firebase\b/i;
69
69
  const _APPETIZE_URL_RE = /\bappetize\.io\b/i;
70
70
 
71
+ // Firebase Hosting bot posts — "Firebase Hosting preview URL: ...",
72
+ // "Firebase Hosting deployment ...". These never start with a heading but
73
+ // reliably begin a line with "Firebase Hosting". Human feedback about
74
+ // Firebase Hosting issues starts with prose like "The Firebase Hosting ..."
75
+ // or "Our Firebase Hosting ..." so anchoring at the start of a line is a
76
+ // safe discriminator.
77
+ const _FIREBASE_HOSTING_LEAD_RE = /^Firebase\s+Hosting\b/im;
78
+
71
79
  // "deploy ready", "deployment available", "preview succeeded", etc.
72
80
  const _DEPLOY_READY_RE =
73
81
  /\b(?:deploy|deployment|preview)\s+(?:ready|available|succeeded|complete|completed)\b/i;
@@ -80,6 +88,7 @@ function isPreviewStatusBody(body) {
80
88
  if (_PREVIEW_HEADING_RE.test(text)) return true;
81
89
  if (_FIREBASE_BRAND_RE.test(text)) return true;
82
90
  if (_FIREBASE_URL_RE.test(text)) return true;
91
+ if (_FIREBASE_HOSTING_LEAD_RE.test(text)) return true;
83
92
  if (_APPETIZE_URL_RE.test(text)) return true;
84
93
  if (_DEPLOY_READY_RE.test(text)) return true;
85
94
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.2243",
3
+ "version": "0.1.2245",
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"