aienvmp 0.1.63 → 0.1.65
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/CHANGELOG.md +20 -0
- package/README.md +1 -0
- package/package.json +1 -1
- package/src/render.js +35 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.65
|
|
4
|
+
|
|
5
|
+
- Added a dashboard `Next command` bar directly below the AI control strip.
|
|
6
|
+
- Chose the dashboard next command from preflight, top recommended action, collaboration, then status fallback.
|
|
7
|
+
- Added a short reason beside the next command so humans and AI agents know why it is suggested.
|
|
8
|
+
- Made the next command bar responsive and wrap long commands safely.
|
|
9
|
+
- Kept detailed recommended actions below the first-read dashboard area.
|
|
10
|
+
- Updated README wording to mention the single next command.
|
|
11
|
+
- Added dashboard regression coverage for next-command source and reason binding.
|
|
12
|
+
|
|
13
|
+
## 0.1.64
|
|
14
|
+
|
|
15
|
+
- Added a dashboard `AI control strip` above the existing audit area.
|
|
16
|
+
- Made readiness, collaboration, and SBOM risk the first three dashboard decisions.
|
|
17
|
+
- Added compact status, next command, and review guidance to each top control card.
|
|
18
|
+
- Added responsive control-strip layout for narrow screens.
|
|
19
|
+
- Kept the detailed dashboard cards below the first-read control strip.
|
|
20
|
+
- Documented the dashboard 3-card first-read surface in the README.
|
|
21
|
+
- Added dashboard regression coverage for the control strip, top cards, and SBOM-risk binding.
|
|
22
|
+
|
|
3
23
|
## 0.1.63
|
|
4
24
|
|
|
5
25
|
- Compressed plain `aienvmp status` output into a 5-line AI/human decision view.
|
package/README.md
CHANGED
|
@@ -52,6 +52,7 @@ AIENV.md # Markdown env map for AI agents
|
|
|
52
52
|
- `status.json.nextAgent` tells the next AI what to read and whether to review first.
|
|
53
53
|
- `aiReadiness` gives a one-field ready/review signal for AI continuation.
|
|
54
54
|
- `collaboration` gives the shortest multi-agent env-change status, targets, and next command.
|
|
55
|
+
- `dashboard.html` starts with a 3-card AI control strip plus one next command.
|
|
55
56
|
- `dependencyReadSet` lists manifests and lockfiles before package or security changes.
|
|
56
57
|
- `sbomRisk` gives AI a compact light-SBOM risk level, signals, and next command.
|
|
57
58
|
- `sbom.json.aiDependencyReview` connects SBOM risk, scanner confidence, and safe dependency-change steps.
|
package/package.json
CHANGED
package/src/render.js
CHANGED
|
@@ -381,6 +381,17 @@ h1,h2,h3,p{margin:0}h1{font-size:clamp(28px,4vw,46px);line-height:1.02;margin-to
|
|
|
381
381
|
.sub{color:var(--muted);margin-top:12px;max-width:680px;line-height:1.55}
|
|
382
382
|
.stamp{min-width:220px;border:1px solid var(--line2);background:#091310;border-radius:8px;padding:14px}
|
|
383
383
|
.stamp b{display:block;color:var(--green);font-size:24px;margin-bottom:3px}.stamp span{display:block;color:var(--muted);font-size:12px;overflow-wrap:anywhere}
|
|
384
|
+
.control{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:14px 0}
|
|
385
|
+
.control-card{border:1px solid var(--line);background:rgba(13,24,21,.94);border-radius:8px;padding:16px;min-width:0}
|
|
386
|
+
.control-card.review{border-color:rgba(244,191,95,.42);background:linear-gradient(135deg,rgba(81,53,17,.82),rgba(9,19,16,.95))}
|
|
387
|
+
.control-card.ready{border-color:rgba(71,229,141,.32);background:linear-gradient(135deg,rgba(19,61,42,.76),rgba(9,19,16,.95))}
|
|
388
|
+
.control-label{color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.08em}
|
|
389
|
+
.control-value{margin-top:8px;font-size:24px;font-weight:850;color:var(--text);overflow-wrap:anywhere}
|
|
390
|
+
.control-next{margin-top:8px;color:var(--muted);font-size:12px;line-height:1.4;overflow-wrap:anywhere}
|
|
391
|
+
.nextbar{display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;border:1px solid rgba(71,229,141,.34);background:rgba(13,24,21,.96);border-radius:8px;padding:13px 15px;margin:-2px 0 14px}
|
|
392
|
+
.nextbar b{color:var(--green);font-size:12px;text-transform:uppercase;letter-spacing:.08em}
|
|
393
|
+
.nextbar code{display:inline-block;max-width:100%;white-space:normal;overflow-wrap:anywhere}
|
|
394
|
+
.nextbar span{color:var(--muted);font-size:12px;overflow-wrap:anywhere}
|
|
384
395
|
.audit{display:grid;grid-template-columns:1.2fr repeat(3,minmax(0,.8fr));gap:12px;margin:14px 0}
|
|
385
396
|
.audit-item{border:1px solid var(--line);background:rgba(13,24,21,.92);border-radius:8px;padding:14px;min-width:0}
|
|
386
397
|
.audit-item.primary{background:linear-gradient(135deg,rgba(19,61,42,.88),rgba(9,19,16,.95))}
|
|
@@ -404,6 +415,8 @@ code{color:var(--code);background:#0a2017;border:1px solid #17462f;padding:2px 6
|
|
|
404
415
|
.timeline{display:grid;gap:10px}.event{display:grid;grid-template-columns:108px 1fr;gap:12px;border-top:1px solid var(--line2);padding-top:10px}.event time{color:var(--muted);font-size:12px}.event b{color:var(--green)}
|
|
405
416
|
.path{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--muted);font-size:12px;overflow-wrap:anywhere}
|
|
406
417
|
@media (max-width:860px){header,.layout{grid-template-columns:1fr}.metrics{grid-template-columns:repeat(2,1fr)}.grid{grid-template-columns:1fr}.agents{grid-template-columns:1fr}}
|
|
418
|
+
@media (max-width:860px){.control{grid-template-columns:1fr}}
|
|
419
|
+
@media (max-width:860px){.nextbar{grid-template-columns:1fr}}
|
|
407
420
|
@media (max-width:860px){.audit{grid-template-columns:1fr 1fr}}
|
|
408
421
|
@media (max-width:520px){.shell{padding:14px}.metrics{grid-template-columns:1fr}.event{grid-template-columns:1fr}h1{font-size:32px}}
|
|
409
422
|
@media (max-width:520px){.audit{grid-template-columns:1fr}}
|
|
@@ -458,6 +471,7 @@ const intentsHtml=intents.length?'<div class="timeline">'+intents.slice(-6).reve
|
|
|
458
471
|
const policyHtml=entries(policy).length?\`<table>\${rows(policy)}</table>\`:'<div class="okline">No explicit version policy set.</div>';
|
|
459
472
|
const actions=manifest.recommendedActions||[];
|
|
460
473
|
const actionsHtml=actions.length?'<div class="timeline">'+actions.slice(0,6).map(a=>\`<div class="event"><time>\${esc(a.priority)}</time><div><b>\${esc(a.category)}</b> \${esc(a.summary)}\${a.command?\`<div class="path">\${esc(a.command)}</div>\`:''}</div></div>\`).join('')+'</div>':'<div class="okline">No recommended actions. Continue project-local work.</div>';
|
|
474
|
+
const topAction=actions[0]||{};
|
|
461
475
|
const plan=manifest.planArtifacts||{};
|
|
462
476
|
const planHtml=plan.markdown||plan.json?\`<table><tr><th>Markdown</th><td>\${plan.markdown?'<a href="plan.md">plan.md</a>':'not written'}</td></tr><tr><th>JSON</th><td>\${plan.json?'<a href="plan.json">plan.json</a>':'not written'}</td></tr></table>\`:'<div class="okline">No plan artifacts yet. Run <code>aienvmp plan --write</code>.</div>';
|
|
463
477
|
const sbomArtifactHtml='<table><tr><th>JSON</th><td><a href="sbom.json">sbom.json</a></td></tr><tr><th>CDX Lite</th><td><a href="sbom.cdx.json">sbom.cdx.json</a></td></tr><tr><th>Command</th><td><code>aienvmp sbom --write</code></td></tr></table>';
|
|
@@ -496,11 +510,22 @@ const recentChanges=timeline.slice(-8).length;
|
|
|
496
510
|
const trustState=manifest.trust?.state||'observed';
|
|
497
511
|
const nextAction=reviewRequired?'Review before environment changes':'Proceed with project-local work';
|
|
498
512
|
const auditItem=(key,value,hint,klass='')=>\`<div class="audit-item \${klass}"><div class="audit-k">\${key}</div><div class="audit-v">\${value}</div><div class="audit-hint">\${hint}</div></div>\`;
|
|
513
|
+
const controlCard=(label,value,next,klass='')=>\`<div class="control-card \${klass}"><div class="control-label">\${label}</div><div class="control-value">\${esc(value)}</div><div class="control-next">\${esc(next)}</div></div>\`;
|
|
499
514
|
const driftLabel=warnings.length?'detected':'none';
|
|
500
515
|
const nextAgent=manifest.preflight?.nextAgent||{};
|
|
501
516
|
const aiReadiness=manifest.preflight?.aiReadiness||{};
|
|
502
517
|
const aiReadinessSignals=(aiReadiness.signals||[]).slice(0,3);
|
|
503
518
|
const aiReadinessHint=(aiReadiness.next||'Run aienvmp context --json for details.')+(aiReadinessSignals.length?' Signals: '+aiReadinessSignals.join('; '):'');
|
|
519
|
+
const aiReadyValue=aiReadiness.level||'unknown';
|
|
520
|
+
const aiReadyClass=aiReadyValue==='ready'?'ready':'review';
|
|
521
|
+
const collaborationValue=collaboration.status||'unknown';
|
|
522
|
+
const collaborationClass=collaborationValue==='clear'?'ready':'review';
|
|
523
|
+
const sbomRiskValue=riskSummary.level||'unknown';
|
|
524
|
+
const sbomRiskClass=['urgent','high','medium'].includes(sbomRiskValue)?'review':'ready';
|
|
525
|
+
const sbomRiskScore=riskSummary.score!==undefined?' ('+riskSummary.score+')':'';
|
|
526
|
+
const sbomRiskNext=riskSummary.next||aiDependencyReview.beforeDependencyChange?.[0]||'Run aienvmp sbom --json for dependency context.';
|
|
527
|
+
const nextCommand=manifest.preflight?.nextCommand||topAction.command||collaboration.nextCommand||'aienvmp status --json';
|
|
528
|
+
const nextReason=topAction.summary||collaboration.rule||riskSummary.next||'Read status/context before changing shared environment state.';
|
|
504
529
|
const coordination=manifest.preflight?.coordination||{};
|
|
505
530
|
const conflictTargets=coordination.conflictTargets||[];
|
|
506
531
|
const handoffFiles=nextAgent.dependencyFiles?.length?nextAgent.dependencyFiles:(dependencyReadSet[0]?[dependencyReadSet[0].manifest,...(dependencyReadSet[0].lockfiles||[])].filter(Boolean):[]);
|
|
@@ -515,6 +540,16 @@ document.getElementById('app').innerHTML=\`
|
|
|
515
540
|
</div>
|
|
516
541
|
<div class="stamp"><b>\${warnings.length?'review':'clear'}</b><span>\${esc(manifest.workspace.name)}</span><span>\${esc(manifest.generatedAt)}</span></div>
|
|
517
542
|
</header>
|
|
543
|
+
<section class="control" aria-label="AI control strip">
|
|
544
|
+
\${controlCard('AI readiness',aiReadyValue,aiReadiness.next||'Run aienvmp context --json for details.',aiReadyClass)}
|
|
545
|
+
\${controlCard('Collaboration',collaborationValue,collaboration.nextCommand||'aienvmp status --json',collaborationClass)}
|
|
546
|
+
\${controlCard('SBOM risk',sbomRiskValue+sbomRiskScore,sbomRiskNext,sbomRiskClass)}
|
|
547
|
+
</section>
|
|
548
|
+
<section class="nextbar" aria-label="Next command">
|
|
549
|
+
<b>Next command</b>
|
|
550
|
+
<code>\${esc(nextCommand)}</code>
|
|
551
|
+
<span>\${esc(nextReason)}</span>
|
|
552
|
+
</section>
|
|
518
553
|
<section class="audit" aria-label="Audit summary">
|
|
519
554
|
\${auditItem('AI decision',reviewRequired?'review required':'can proceed',nextAction,reviewRequired?'review':'primary')}
|
|
520
555
|
\${auditItem('AI readiness',aiReadiness.level||'unknown',aiReadinessHint,aiReadiness.level==='ready'?'primary':'review')}
|