@orangepro/orangepro-mcp 0.2.19 → 0.2.21

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.
@@ -1825,7 +1825,7 @@ export async function opGenerate(root, opts = {}, deps = defaultDeps()) {
1825
1825
  // the only command that can surface them. Display-only refresh; a render
1826
1826
  // failure must never fail generate.
1827
1827
  try {
1828
- opBehaviorCoverageHtml(root, `${WORKSPACE_DIR}/behavior-coverage.html`);
1828
+ opBehaviorCoverageHtml(root, `${WORKSPACE_DIR}/behavior-coverage.html`, undefined, { persistBaseline: false });
1829
1829
  }
1830
1830
  catch {
1831
1831
  /* best-effort report refresh */
@@ -190,6 +190,8 @@ nav.tabs{display:flex;gap:2px;margin:18px 0 0;border-bottom:1px solid var(--bd)}
190
190
  .delta-chip.dc-up{border-color:var(--green);color:var(--green)}
191
191
  .delta-chip.dc-risk{border-color:var(--red);color:var(--red)}
192
192
  .delta-chip.dc-none{color:var(--muted)}
193
+ .delta-chip.dc-click{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px;transition:opacity .15s}
194
+ .delta-chip.dc-click:hover{opacity:.7}
193
195
  .delta-hero{margin:14px 0 0;border-radius:9px;padding:14px 18px;font-size:13px;line-height:1.5}
194
196
  .delta-hero.dh-alert{background:var(--rbg);border:1px solid var(--rbd);color:var(--ink)}
195
197
  .delta-hero.dh-clear{background:var(--gbg);border:1px solid var(--gbd);color:var(--ink2)}
@@ -202,6 +204,12 @@ nav.tabs{display:flex;gap:2px;margin:18px 0 0;border-bottom:1px solid var(--bd)}
202
204
  .delta-hero .dh-dropped{color:var(--green)}
203
205
  .delta-hero .dh-dropped::before{content:"\\2713 ";}
204
206
  .delta-hero .dh-stat{display:inline-flex;gap:12px;margin-top:8px;font-size:12px;font-weight:600;color:var(--muted)}
207
+ .delta-hero .dh-link{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px;transition:color .15s}
208
+ .delta-hero .dh-link:hover{color:var(--orange)}
209
+ .delta-hero .dh-stat .dh-stat-link{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px;transition:color .15s}
210
+ .delta-hero .dh-stat .dh-stat-link:hover{color:var(--orange)}
211
+ .risk-card.highlight-pulse{animation:riskPulse .6s ease 2}
212
+ @keyframes riskPulse{0%,100%{box-shadow:none}50%{box-shadow:0 0 0 3px var(--orange)}}
205
213
  .beh-empty{grid-column:1/-1;padding:22px;border:1px dashed var(--bd2);border-radius:10px;color:var(--muted);font-size:12.5px;display:flex;flex-direction:column;gap:10px;align-items:flex-start}
206
214
  .beh-empty p{margin:0}
207
215
  .risk-ep{font-family:var(--mono);font-size:13px;margin:0 0 6px}
@@ -418,18 +426,45 @@ const D=window.DATA,$=(s)=>document.querySelector(s);
418
426
  return;
419
427
  }
420
428
  var chips=[];
421
- function chip(txt,cls){chips.push('<span class="delta-chip '+(cls||'')+'">'+txt+'</span>');}
429
+ function chip(txt,cls,dataAttr){chips.push('<span class="delta-chip '+(cls||'')+(dataAttr?' dc-click':'')+'"'+(dataAttr?' '+dataAttr:'')+'>'+txt+'</span>');}
422
430
  chip('Since '+ago+':','dc-none');
423
431
  if(d.totalDelta)chip((d.totalDelta>0?'+':'')+d.totalDelta+' behaviors');
424
- if(d.provenDelta)chip((d.provenDelta>0?'+':'')+d.provenDelta+' proven',d.provenDelta>0?'dc-up':'dc-risk');
425
- if(d.associatedDelta)chip((d.associatedDelta>0?'+':'')+d.associatedDelta+' test signal');
432
+ if(d.provenDelta)chip((d.provenDelta>0?'+':'')+d.provenDelta+' proven',d.provenDelta>0?'dc-up':'dc-risk','data-action="proven"');
433
+ if(d.associatedDelta)chip((d.associatedDelta>0?'+':'')+d.associatedDelta+' test signal','','data-action="signal"');
426
434
  if(d.generatedDelta)chip((d.generatedDelta>0?'+':'')+d.generatedDelta+' generated tests',d.generatedDelta>0?'dc-up':'');
427
- d.newRisks.slice(0,3).forEach(function(p){chip('new in top-20: '+p.slice(0,40),'dc-risk');});
435
+ d.newRisks.slice(0,3).forEach(function(p){chip('new in top-20: '+p.slice(0,40),'dc-risk','data-path="'+p.replace(/"/g,'&quot;')+'"');});
428
436
  if(d.newRisks.length>3)chip('+'+(d.newRisks.length-3)+' more new risks','dc-risk');
429
437
  d.droppedRisks.slice(0,2).forEach(function(p){chip('left top-20: '+p.slice(0,40),'dc-up');});
430
438
  el2.innerHTML='<div class="delta-wrap">'+chips.join('')+'</div>';
439
+ el2.addEventListener('click',function(e){
440
+ var c=e.target.closest('[data-path]');
441
+ if(c){scrollToRisk(c.getAttribute('data-path'));return;}
442
+ var a=e.target.closest('[data-action]');
443
+ if(a){
444
+ var act=a.getAttribute('data-action');
445
+ if(act==='signal'){
446
+ var btab=document.querySelector('[data-tab="behaviors"]');
447
+ if(btab)btab.click();
448
+ return;
449
+ }
450
+ var t=D.risks.find(function(r){return r.tags&&r.tags.some(function(tg){return act==='proven'?(tg[0]==='Proven'||tg[0]==='Dynamically Proven'):(tg[0]==='Has tests'||tg[0]==='Test signal');});});
451
+ if(t)scrollToRisk(t.path);
452
+ }
453
+ });
431
454
  })();
432
- // ── Delta Hero: prominent simple-mode section ──
455
+ // ── Delta Hero: prominent simple-mode section (clickable) ──
456
+ function scrollToRisk(path){
457
+ if(!path)return;
458
+ var id='risk-'+path.replace(/[^a-zA-Z0-9]/g,'-');
459
+ var tab=document.querySelector('[data-tab="risks"]');
460
+ if(tab)tab.click();
461
+ // Reset filter to "all" so the target card is visible
462
+ if(typeof activeRiskFilter!=='undefined'){activeRiskFilter='all';renderRiskFilters();renderRisks();}
463
+ setTimeout(function(){
464
+ var el=document.getElementById(id);
465
+ if(el){el.scrollIntoView({behavior:'smooth',block:'center'});el.classList.add('highlight-pulse');setTimeout(function(){el.classList.remove('highlight-pulse')},2400);}
466
+ },150);
467
+ }
433
468
  (function(){
434
469
  var hero=document.getElementById("delta-hero");
435
470
  var d=D.delta;
@@ -447,7 +482,7 @@ const D=window.DATA,$=(s)=>document.querySelector(s);
447
482
  headline=d.newRisks.length+' new blind spot'+(d.newRisks.length>1?'s':'')+' since last scan';
448
483
  hero.className="delta-hero simple-only dh-alert";
449
484
  parts.push('<ul class="dh-list">');
450
- d.newRisks.forEach(function(r){parts.push('<li class="dh-new">'+r.slice(0,60)+'</li>');});
485
+ d.newRisks.forEach(function(r){parts.push('<li class="dh-new dh-link" data-path="'+r.replace(/"/g,'&quot;')+'">' +r.slice(0,60)+'</li>');});
451
486
  parts.push('</ul>');
452
487
  } else {
453
488
  headline="Your codebase changed since last scan";
@@ -455,15 +490,21 @@ const D=window.DATA,$=(s)=>document.querySelector(s);
455
490
  }
456
491
  if(d.droppedRisks.length>0){
457
492
  parts.push('<ul class="dh-list">');
458
- d.droppedRisks.forEach(function(r){parts.push('<li class="dh-dropped">Resolved: '+r.slice(0,60)+'</li>');});
493
+ d.droppedRisks.forEach(function(r){parts.push('<li class="dh-dropped">\\u2713 Resolved: '+r.slice(0,60)+'</li>');});
459
494
  parts.push('</ul>');
460
495
  }
461
496
  var stats=[];
462
497
  if(d.totalDelta)stats.push((d.totalDelta>0?'+':'')+d.totalDelta+' behaviors');
463
- if(d.provenDelta)stats.push((d.provenDelta>0?'+':'')+d.provenDelta+' proven');
498
+ if(d.provenDelta)stats.push('<span class="dh-stat-link" data-action="proven">'+((d.provenDelta>0?'+':'')+d.provenDelta+' proven')+'</span>');
464
499
  if(d.generatedDelta)stats.push((d.generatedDelta>0?'+':'')+d.generatedDelta+' tests generated');
465
500
  if(stats.length)parts.push('<div class="dh-stat">'+stats.join(' \\u00B7 ')+'</div>');
466
501
  hero.innerHTML='<h3>'+headline+'</h3>'+parts.join('');
502
+ hero.addEventListener('click',function(e){
503
+ var li=e.target.closest('[data-path]');
504
+ if(li){scrollToRisk(li.getAttribute('data-path'));return;}
505
+ var stat=e.target.closest('[data-action="proven"]');
506
+ if(stat){var pr=D.risks.find(function(r){return r.tags&&r.tags.some(function(t){return t[0]==='Proven'||t[0]==='Dynamically Proven'});});if(pr)scrollToRisk(pr.path);}
507
+ });
467
508
  })();
468
509
  // ── System map: deterministic hero drawn from D.mapModel ──
469
510
  (function(){
@@ -876,7 +917,7 @@ function riskCardHtml(r){
876
917
  }
877
918
  function renderRisks(){
878
919
  riskList.innerHTML="";
879
- D.risks.filter(riskMatchesFilter).forEach(r=>riskList.append(el("div","risk-card",riskCardHtml(r))));
920
+ D.risks.filter(riskMatchesFilter).forEach(r=>{const card=el("div","risk-card",riskCardHtml(r));card.setAttribute("data-path",r.path);card.id="risk-"+r.path.replace(/[^a-zA-Z0-9]/g,"-");riskList.append(card);});
880
921
  if(activeRiskFilter==="all"&&D.generatedTotal){
881
922
  const hiddenGeneratedFlows=Math.max(0,generatedRiskCount-D.risks.filter(riskMatchesFilter).length);
882
923
  const remainingRiskFlows=Math.max(0,D.risks.length-generatedRiskCount);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orangepro/orangepro-mcp",
3
- "version": "0.2.19",
3
+ "version": "0.2.21",
4
4
  "private": false,
5
5
  "description": "OrangePro (`opro`) — a local-first, BYOK CLI + MCP server that builds an evidence graph from a local checkout, ingests runtime coverage, and generates grounded tests. Metadata-only exports; no source upload; generated tests stay local.",
6
6
  "license": "MIT",