@miller-tech/uap 1.129.5 → 1.130.1

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.
Files changed (31) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/cli/deliver-defaults.d.ts +13 -0
  3. package/dist/cli/deliver-defaults.d.ts.map +1 -1
  4. package/dist/cli/deliver-defaults.js +24 -0
  5. package/dist/cli/deliver-defaults.js.map +1 -1
  6. package/dist/cli/guided-setup.d.ts.map +1 -1
  7. package/dist/cli/guided-setup.js +15 -0
  8. package/dist/cli/guided-setup.js.map +1 -1
  9. package/dist/cli/policy.d.ts +38 -0
  10. package/dist/cli/policy.d.ts.map +1 -1
  11. package/dist/cli/policy.js +107 -0
  12. package/dist/cli/policy.js.map +1 -1
  13. package/dist/cli/wizard-config.d.ts +3 -0
  14. package/dist/cli/wizard-config.d.ts.map +1 -1
  15. package/dist/cli/wizard-config.js +3 -2
  16. package/dist/cli/wizard-config.js.map +1 -1
  17. package/dist/dashboard/data-service.d.ts +9 -0
  18. package/dist/dashboard/data-service.d.ts.map +1 -1
  19. package/dist/dashboard/data-service.js +38 -3
  20. package/dist/dashboard/data-service.js.map +1 -1
  21. package/docs/guides/POLICY_PACK_PAY2U.md +36 -0
  22. package/package.json +1 -1
  23. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
  24. package/src/policies/schemas/policies/adr-guard.md +1 -1
  25. package/src/policies/schemas/policies/merge-deploy-monitor-verify.md +1 -1
  26. package/src/policies/schemas/policies/pay2u-architecture-rules.md +29 -0
  27. package/src/policies/schemas/policies/pay2u-enforcement-hooks.md +29 -0
  28. package/src/policies/schemas/policies/pay2u-quick-reference.md +89 -0
  29. package/src/policies/schemas/policies/ship-loop-gate.md +1 -1
  30. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
  31. package/web/dashboard.html +54 -7
@@ -342,6 +342,10 @@
342
342
  .kanban-col-header.done { border-left: 3px solid var(--green); color: var(--green); }
343
343
  .kanban-col-header.wont_do { border-left: 3px solid var(--fg3); color: var(--fg3); }
344
344
  .kanban-cards { display: flex; flex-direction: column; gap: 6px; flex: 1; min-height: 40px; }
345
+ .kanban-group { font-size: 10px; color: var(--fg2); text-transform: uppercase; letter-spacing: 0.5px; padding: 4px 4px 0; border-top: 1px dashed var(--border); margin-top: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
346
+ .kanban-group:first-child { border-top: none; margin-top: 0; }
347
+ .kanban-card.card-child { margin-left: 8px; border-left: 2px solid var(--border); }
348
+ .kanban-card .card-crumb { color: var(--fg3); font-size: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
345
349
  .kanban-card {
346
350
  background: var(--bg); border: 1px solid var(--border); border-radius: 6px;
347
351
  padding: 8px 10px; cursor: default;
@@ -1247,23 +1251,66 @@
1247
1251
 
1248
1252
  function renderKanban(tasks) {
1249
1253
  const items=tasks.items||[], cols={open:[],in_progress:[],blocked:[],done:[],wont_do:[]}, ncm=new Map();
1250
- for (const i of items) { if(cols[i.status]) cols[i.status].push(i); ncm.set(i.id,i.status); }
1254
+ // A "family" is a group with real hierarchy anywhere on the board \u2014
1255
+ // those get headers + indenting; standalone tasks keep the flat look.
1256
+ const groupCounts=new Map(), families=new Set();
1257
+ for (const i of items) {
1258
+ if(cols[i.status]) cols[i.status].push(i); ncm.set(i.id,i.status);
1259
+ const g=i.groupId||i.id; groupCounts.set(g,(groupCounts.get(g)||0)+1);
1260
+ if((i.depth||0)>0) families.add(g);
1261
+ }
1262
+ for (const [g,n] of groupCounts) if(n>1) families.add(g);
1251
1263
  setText('kb-open-count',cols.open.length); setText('kb-progress-count',cols.in_progress.length);
1252
1264
  setText('kb-blocked-count',cols.blocked.length); setText('kb-done-count',cols.done.length); setText('kb-wontdo-count',cols.wont_do.length);
1253
- renderCol('kb-open',cols.open,ncm); renderCol('kb-progress',cols.in_progress,ncm); renderCol('kb-blocked',cols.blocked,ncm); renderCol('kb-done',cols.done,ncm); renderCol('kb-wontdo',cols.wont_do,ncm);
1265
+ renderCol('kb-open',cols.open,ncm,families); renderCol('kb-progress',cols.in_progress,ncm,families); renderCol('kb-blocked',cols.blocked,ncm,families); renderCol('kb-done',cols.done,ncm,families); renderCol('kb-wontdo',cols.wont_do,ncm,families);
1254
1266
  const p=document.getElementById('kanban-panel'); if(p) p.style.display=items.length>0?'':'none';
1255
1267
  prevCardMap=ncm;
1256
1268
  }
1257
- function renderCol(cid,items,ncm) {
1269
+ function renderCol(cid,items,ncm,families) {
1258
1270
  const c=document.getElementById(cid); if(!c) return;
1259
1271
  if(!items.length) { c.innerHTML='<div class="kanban-empty">No tasks</div>'; return; }
1272
+ // Families first (clustered per group: root, then children by depth),
1273
+ // then ungrouped singles \u2014 priority breaks ties everywhere.
1274
+ const fam=families||new Set();
1275
+ const sorted=[...items].sort((a,b)=>{
1276
+ const ga=fam.has(a.groupId||a.id)?0:1, gb=fam.has(b.groupId||b.id)?0:1;
1277
+ if(ga!==gb) return ga-gb;
1278
+ if((a.groupId||a.id)!==(b.groupId||b.id))
1279
+ // Tiebreak on groupId: distinct groups with identical titles
1280
+ // (auto-created deliver missions) must not interleave.
1281
+ return String(a.groupTitle||a.title||'').localeCompare(String(b.groupTitle||b.title||''))
1282
+ || String(a.groupId||a.id).localeCompare(String(b.groupId||b.id));
1283
+ if((a.depth||0)!==(b.depth||0)) return (a.depth||0)-(b.depth||0);
1284
+ return (a.priority!=null?a.priority:2)-(b.priority!=null?b.priority:2);
1285
+ });
1260
1286
  const ids=new Set(items.map(i=>i.id));
1261
- c.querySelectorAll('.kanban-card').forEach(el=>{ if(!ids.has(el.dataset.id)){el.classList.add('card-exit');el.addEventListener('animationend',()=>el.remove(),{once:true});} });
1262
- for (const item of items) {
1287
+ c.querySelectorAll('.kanban-card').forEach(el=>{
1288
+ if(ids.has(el.dataset.id)||el.classList.contains('card-exit')) return;
1289
+ // Clear the inline animation:none that reconciliation sets on live
1290
+ // cards — it outranks the .card-exit rule, and a never-starting
1291
+ // animation means animationend never fires and the card never leaves.
1292
+ el.style.animation='';
1293
+ el.classList.add('card-exit');
1294
+ el.addEventListener('animationend',()=>el.remove(),{once:true});
1295
+ setTimeout(()=>el.remove(),600); // fallback if the animation is skipped
1296
+ });
1297
+ c.querySelectorAll('.kanban-group,.kanban-empty').forEach(el=>el.remove());
1298
+ let lastGroup=null;
1299
+ for (const item of sorted) {
1300
+ const g=item.groupId||item.id;
1301
+ if(fam.has(g)&&g!==lastGroup){
1302
+ const h=document.createElement('div');h.className='kanban-group';h.textContent='\u25B8 '+(item.groupTitle||g);h.title=item.groupTitle||g;c.appendChild(h);
1303
+ }
1304
+ lastGroup=g;
1263
1305
  let card=c.querySelector('.kanban-card[data-id="'+item.id+'"]');
1264
- if(!card){card=document.createElement('div');card.className='kanban-card';card.dataset.id=item.id;if(prevCardMap.has(item.id)&&prevCardMap.get(item.id)!==item.status){card.style.animation='none';requestAnimationFrame(()=>{card.style.animation='';});}c.appendChild(card);}else{card.style.animation='none';}
1306
+ if(!card){card=document.createElement('div');card.className='kanban-card';card.dataset.id=item.id;if(prevCardMap.has(item.id)&&prevCardMap.get(item.id)!==item.status){card.style.animation='none';requestAnimationFrame(()=>{card.style.animation='';});}}else{card.style.animation='none';}
1307
+ c.appendChild(card); // appendChild moves existing nodes into group order
1308
+ card.classList.toggle('card-child',(item.depth||0)>0);
1265
1309
  const ti=TYPE_ICONS[item.type]||'\u25C6',pl=PRIO_LABELS[item.priority]||'P2',pc='p'+(item.priority!=null?item.priority:2),as=item.assignee?' \u00B7 '+esc(item.assignee):'';
1266
- card.innerHTML='<div style="display:flex;justify-content:space-between;align-items:center"><span class="card-id">'+esc(item.id)+'</span><span>'+ti+'</span></div><div class="card-title">'+esc(item.title||'Untitled')+'</div><div class="card-meta"><span class="card-priority '+pc+'">'+pl+'</span><span>'+esc(item.type)+as+'</span></div>';
1310
+ // Grandchildren carry a breadcrumb to their direct parent \u2014 the group
1311
+ // header only names the root.
1312
+ const crumb=(item.depth||0)>1&&item.parentId?'<div class="card-crumb">\u21B3 '+esc(item.parentTitle||item.parentId)+'</div>':'';
1313
+ card.innerHTML='<div style="display:flex;justify-content:space-between;align-items:center"><span class="card-id">'+esc(item.id)+'</span><span>'+ti+'</span></div>'+crumb+'<div class="card-title">'+esc(item.title||'Untitled')+'</div><div class="card-meta"><span class="card-priority '+pc+'">'+pl+'</span><span>'+esc(item.type)+as+'</span></div>';
1267
1314
  }
1268
1315
  }
1269
1316