@yemi33/minions 0.1.2409 → 0.1.2410

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.
@@ -1251,6 +1251,43 @@ async function killKeepPid(agentId, pid) {
1251
1251
 
1252
1252
  window.MinionsKeepProcesses = { renderKeepProcesses, killKeepPid, mountKeepProcessesPanel, unmountKeepProcessesPanel };
1253
1253
 
1254
+ function _renderWorktreeQuarantineRefsContent(items) {
1255
+ if (!items.length) {
1256
+ return '<p class="empty quarantine-ref-empty">No local backup refs are currently preserved.</p>';
1257
+ }
1258
+ return '<div class="pr-table-wrap quarantine-ref-table-wrap">' +
1259
+ '<table class="pr-table quarantine-ref-table" aria-label="Quarantined work backup refs">' +
1260
+ '<colgroup><col><col><col><col></colgroup><thead><tr>' +
1261
+ '<th>Project</th><th>Backup ref</th><th>SHA</th><th>Created</th>' +
1262
+ '</tr></thead><tbody>' +
1263
+ items.map(function (item) {
1264
+ const project = escHtml(item.project || '');
1265
+ if (item.error) {
1266
+ return '<tr class="quarantine-ref-row quarantine-ref-row-error">' +
1267
+ '<td class="quarantine-ref-project" data-label="Project">' + project + '</td>' +
1268
+ '<td class="quarantine-ref-error" data-label="Status" colspan="3">' + escHtml(item.error) + '</td>' +
1269
+ '</tr>';
1270
+ }
1271
+ const ref = String(item.ref || '');
1272
+ const sha = String(item.sha || '');
1273
+ const createdAt = String(item.createdAt || '');
1274
+ const kind = item.kind === 'wip' ? 'WIP snapshot' : 'Commit backup';
1275
+ const kindClass = item.kind === 'wip' ? 'quarantine-ref-kind-wip' : 'quarantine-ref-kind-commits';
1276
+ return '<tr class="quarantine-ref-row">' +
1277
+ '<td class="quarantine-ref-project" data-label="Project">' + project + '</td>' +
1278
+ '<td data-label="Backup ref">' +
1279
+ '<span class="quarantine-ref-kind ' + kindClass + '">' + kind + '</span>' +
1280
+ '<code class="quarantine-ref-value">' + escHtml(ref) + '</code>' +
1281
+ '</td>' +
1282
+ '<td data-label="SHA"><code class="quarantine-ref-sha" title="' + escHtml(sha) + '">' + escHtml(sha.slice(0, 12)) + '</code></td>' +
1283
+ '<td data-label="Created"><time class="quarantine-ref-created" datetime="' + escHtml(createdAt) + '" title="' + escHtml(createdAt) + '">' +
1284
+ escHtml(formatLocalDateTime(createdAt)) +
1285
+ '</time></td>' +
1286
+ '</tr>';
1287
+ }).join('') +
1288
+ '</tbody></table></div>';
1289
+ }
1290
+
1254
1291
  async function renderWorktreeQuarantineRefs() {
1255
1292
  const root = document.getElementById('worktree-quarantine-refs-content');
1256
1293
  const count = document.getElementById('worktree-quarantine-refs-count');
@@ -1262,26 +1299,10 @@ async function renderWorktreeQuarantineRefs() {
1262
1299
  if (!res.ok) throw new Error(data.error || String(res.status));
1263
1300
  const items = Array.isArray(data.items) ? data.items : [];
1264
1301
  if (count) count.textContent = String(items.length);
1265
- if (!items.length) {
1266
- html = '<p class="empty">No quarantined work refs found.</p>';
1267
- } else {
1268
- html = '<table style="width:100%;border-collapse:collapse"><thead><tr>' +
1269
- '<th style="text-align:left">Project</th><th style="text-align:left">Backup ref</th>' +
1270
- '<th style="text-align:left">SHA</th><th style="text-align:left">Created</th></tr></thead><tbody>' +
1271
- items.map(function (item) {
1272
- if (item.error) {
1273
- return '<tr><td>' + escHtml(item.project || '') + '</td><td colspan="3" style="color:var(--red)">' + escHtml(item.error) + '</td></tr>';
1274
- }
1275
- return '<tr><td>' + escHtml(item.project || '') + '</td>' +
1276
- '<td><code>' + escHtml(item.ref || '') + '</code></td>' +
1277
- '<td><code>' + escHtml(String(item.sha || '').slice(0, 12)) + '</code></td>' +
1278
- '<td>' + escHtml(item.createdAt || '') + '</td></tr>';
1279
- }).join('') +
1280
- '</tbody></table>';
1281
- }
1302
+ html = _renderWorktreeQuarantineRefsContent(items);
1282
1303
  } catch (e) {
1283
1304
  if (count) count.textContent = '?';
1284
- html = '<span style="color:var(--red)">Failed to load: ' + escHtml(e.message) + '</span>';
1305
+ html = '<p class="quarantine-ref-error" role="alert">Failed to load: ' + escHtml(e.message) + '</p>';
1285
1306
  }
1286
1307
  // eslint-disable-next-line no-unsanitized/method -- structural HTML only; API fields are escaped above
1287
1308
  root.replaceChildren(document.createRange().createContextualFragment(html));
@@ -28,9 +28,10 @@
28
28
  </section>
29
29
  <section id="worktree-quarantine-refs-section">
30
30
  <h2>Quarantined Work <span class="count" id="worktree-quarantine-refs-count">0</span>
31
- <span class="qa-section-subtitle">local backup refs available for manual recovery</span>
31
+ <span class="qa-section-subtitle">local Git recovery backups</span>
32
32
  </h2>
33
- <div id="worktree-quarantine-refs-content"><p class="empty">No quarantined work refs found.</p></div>
33
+ <p class="quarantine-ref-intro">These local backup Git refs are preserved when Minions quarantines dirty or stuck worktrees. They are for manual recovery only and are not active or queued work.</p>
34
+ <div id="worktree-quarantine-refs-content"><p class="empty quarantine-ref-empty">No local backup refs are currently preserved.</p></div>
34
35
  </section>
35
36
  <section id="managed-processes-section">
36
37
  <h2>Managed Processes <span class="count" id="managed-processes-count">0</span>
@@ -382,6 +382,41 @@
382
382
  .pr-table td { padding: var(--space-5); border-bottom: 1px solid var(--border); vertical-align: middle; white-space: nowrap; }
383
383
  .pr-table tr:last-child td { border-bottom: none; }
384
384
  .pr-table tr:hover { background: var(--surface2); }
385
+ .quarantine-ref-intro {
386
+ max-width: 920px; margin: calc(-1 * var(--space-3)) 0 var(--space-6);
387
+ color: var(--muted); font-size: var(--text-meta); line-height: 1.5;
388
+ }
389
+ .quarantine-ref-table-wrap {
390
+ max-height: min(420px, 55vh); overflow: auto;
391
+ border: 1px solid var(--border); border-radius: var(--radius-md);
392
+ background: var(--surface);
393
+ }
394
+ .quarantine-ref-table { table-layout: fixed; font-size: var(--text-caption); }
395
+ .quarantine-ref-table col:nth-child(1) { width: 15%; }
396
+ .quarantine-ref-table col:nth-child(2) { width: 51%; }
397
+ .quarantine-ref-table col:nth-child(3) { width: 14%; }
398
+ .quarantine-ref-table col:nth-child(4) { width: 20%; }
399
+ .quarantine-ref-table thead th { position: sticky; top: 0; z-index: 1; background: var(--surface); }
400
+ .quarantine-ref-table th:last-child, .quarantine-ref-table td:last-child {
401
+ width: auto; min-width: 0; text-align: left;
402
+ }
403
+ .quarantine-ref-table td { white-space: normal; vertical-align: top; line-height: 1.4; }
404
+ .quarantine-ref-project { font-weight: 600; overflow-wrap: anywhere; }
405
+ .quarantine-ref-kind {
406
+ display: inline-block; margin-bottom: var(--space-2);
407
+ padding: var(--space-1) var(--space-3); border: 1px solid var(--border);
408
+ border-radius: var(--radius-xl); font-size: var(--text-micro);
409
+ font-weight: 600; text-transform: uppercase; letter-spacing: 0.4px;
410
+ }
411
+ .quarantine-ref-kind-wip { color: var(--yellow); background: rgba(210,153,34,0.1); }
412
+ .quarantine-ref-kind-commits { color: var(--blue); background: rgba(88,166,255,0.1); }
413
+ .quarantine-ref-value {
414
+ display: block; color: var(--text); overflow-wrap: anywhere; word-break: break-word;
415
+ }
416
+ .quarantine-ref-sha { color: var(--muted); overflow-wrap: anywhere; }
417
+ .quarantine-ref-created { color: var(--muted); font-size: var(--text-caption); }
418
+ .quarantine-ref-error { color: var(--red); overflow-wrap: anywhere; }
419
+ .quarantine-ref-empty { padding: var(--space-2) 0; font-size: var(--text-caption); }
385
420
  .pr-title { color: var(--blue); text-decoration: none; font-weight: 500; }
386
421
  .pr-title:hover { text-decoration: underline; }
387
422
  .pr-desc { color: var(--muted); font-size: var(--text-sm); font-weight: 400; margin-top: 2px; line-height: 1.4; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 400px; }
@@ -1292,6 +1327,31 @@
1292
1327
  .pr-table { font-size: var(--text-base); }
1293
1328
  .pr-table td { padding: 8px 6px; }
1294
1329
  .pr-table th { padding: 6px; font-size: var(--text-sm); }
1330
+ .quarantine-ref-table-wrap { border: none; background: transparent; }
1331
+ .quarantine-ref-table,
1332
+ .quarantine-ref-table tbody,
1333
+ .quarantine-ref-table tr,
1334
+ .quarantine-ref-table td { display: block; width: 100%; }
1335
+ .quarantine-ref-table colgroup, .quarantine-ref-table thead { display: none; }
1336
+ .quarantine-ref-table tr {
1337
+ margin-bottom: var(--space-4); overflow: hidden;
1338
+ border: 1px solid var(--border); border-radius: var(--radius-md);
1339
+ background: var(--surface);
1340
+ }
1341
+ .quarantine-ref-table tr:last-child { margin-bottom: 0; }
1342
+ .quarantine-ref-table td, .quarantine-ref-table td:last-child {
1343
+ display: grid; grid-template-columns: minmax(76px, 26%) minmax(0, 1fr);
1344
+ gap: var(--space-4); width: 100%; min-width: 0;
1345
+ padding: var(--space-3) var(--space-4); text-align: left;
1346
+ }
1347
+ .quarantine-ref-table tr td:not(:last-child) { border-bottom: 1px solid var(--border); }
1348
+ .quarantine-ref-table td::before {
1349
+ content: attr(data-label); grid-column: 1; color: var(--muted);
1350
+ font-size: var(--text-micro); font-weight: 600;
1351
+ text-transform: uppercase; letter-spacing: 0.4px;
1352
+ }
1353
+ .quarantine-ref-table td > * { grid-column: 2; min-width: 0; }
1354
+ .quarantine-ref-table .quarantine-ref-kind { justify-self: start; }
1295
1355
  .cmd-input-wrap { flex-direction: column; }
1296
1356
  .cmd-send-btn { width: 100%; }
1297
1357
  .cmd-hints { gap: 8px; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.2409",
3
+ "version": "0.1.2410",
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"