@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/deliver-defaults.d.ts +13 -0
- package/dist/cli/deliver-defaults.d.ts.map +1 -1
- package/dist/cli/deliver-defaults.js +24 -0
- package/dist/cli/deliver-defaults.js.map +1 -1
- package/dist/cli/guided-setup.d.ts.map +1 -1
- package/dist/cli/guided-setup.js +15 -0
- package/dist/cli/guided-setup.js.map +1 -1
- package/dist/cli/policy.d.ts +38 -0
- package/dist/cli/policy.d.ts.map +1 -1
- package/dist/cli/policy.js +107 -0
- package/dist/cli/policy.js.map +1 -1
- package/dist/cli/wizard-config.d.ts +3 -0
- package/dist/cli/wizard-config.d.ts.map +1 -1
- package/dist/cli/wizard-config.js +3 -2
- package/dist/cli/wizard-config.js.map +1 -1
- package/dist/dashboard/data-service.d.ts +9 -0
- package/dist/dashboard/data-service.d.ts.map +1 -1
- package/dist/dashboard/data-service.js +38 -3
- package/dist/dashboard/data-service.js.map +1 -1
- package/docs/guides/POLICY_PACK_PAY2U.md +36 -0
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/schemas/policies/adr-guard.md +1 -1
- package/src/policies/schemas/policies/merge-deploy-monitor-verify.md +1 -1
- package/src/policies/schemas/policies/pay2u-architecture-rules.md +29 -0
- package/src/policies/schemas/policies/pay2u-enforcement-hooks.md +29 -0
- package/src/policies/schemas/policies/pay2u-quick-reference.md +89 -0
- package/src/policies/schemas/policies/ship-loop-gate.md +1 -1
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/web/dashboard.html +54 -7
package/web/dashboard.html
CHANGED
|
@@ -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
|
-
|
|
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=>{
|
|
1262
|
-
|
|
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='';});}
|
|
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
|
-
|
|
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
|
|