aienvmp 0.1.62 → 0.1.64
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 +4 -1
- package/package.json +1 -1
- package/src/cli.js +2 -2
- package/src/commands/status.js +35 -10
- package/src/render.js +22 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.64
|
|
4
|
+
|
|
5
|
+
- Added a dashboard `AI control strip` above the existing audit area.
|
|
6
|
+
- Made readiness, collaboration, and SBOM risk the first three dashboard decisions.
|
|
7
|
+
- Added compact status, next command, and review guidance to each top control card.
|
|
8
|
+
- Added responsive control-strip layout for narrow screens.
|
|
9
|
+
- Kept the detailed dashboard cards below the first-read control strip.
|
|
10
|
+
- Documented the dashboard 3-card first-read surface in the README.
|
|
11
|
+
- Added dashboard regression coverage for the control strip, top cards, and SBOM-risk binding.
|
|
12
|
+
|
|
13
|
+
## 0.1.63
|
|
14
|
+
|
|
15
|
+
- Compressed plain `aienvmp status` output into a 5-line AI/human decision view.
|
|
16
|
+
- Added `aienvmp status --verbose` for detailed command hints without cluttering the default path.
|
|
17
|
+
- Added a reusable `renderStatusText` helper for stable status text formatting.
|
|
18
|
+
- Kept JSON/status artifacts unchanged so AI consumers retain the full preflight contract.
|
|
19
|
+
- Updated CLI help to explain the compact default and verbose detail mode.
|
|
20
|
+
- Updated README command guidance for default, artifact, and verbose status usage.
|
|
21
|
+
- Added regression tests for compact default output, verbose output, and exact status text shape.
|
|
22
|
+
|
|
3
23
|
## 0.1.62
|
|
4
24
|
|
|
5
25
|
- Added a compact `collaboration` block to the shared preflight/status contract for multi-agent environment coordination.
|
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: readiness, collaboration, SBOM risk.
|
|
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.
|
|
@@ -82,7 +83,9 @@ Snippets point each AI to `status`, `summary.md`, `context --json`, intent, and
|
|
|
82
83
|
|
|
83
84
|
```bash
|
|
84
85
|
aienvmp sync # update env map, status, summary, SBOM, dashboard
|
|
85
|
-
aienvmp status
|
|
86
|
+
aienvmp status # 5-line env decision
|
|
87
|
+
aienvmp status --write # refresh compact AI status artifact
|
|
88
|
+
aienvmp status --verbose # show command details
|
|
86
89
|
aienvmp summary --write # refresh compact Markdown summary
|
|
87
90
|
aienvmp context --json # AI decision contract
|
|
88
91
|
aienvmp sbom --json # standalone light SBOM
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -112,7 +112,7 @@ function printUsage() {
|
|
|
112
112
|
Usage:
|
|
113
113
|
aienvmp sync [--dir .] [--json] [--quiet] [--deep] [--security]
|
|
114
114
|
aienvmp context [--dir .] [--json]
|
|
115
|
-
aienvmp status [--dir .] [--json] [--write] [--quiet]
|
|
115
|
+
aienvmp status [--dir .] [--json] [--write] [--quiet] [--verbose]
|
|
116
116
|
aienvmp handoff [--dir .] [--json] [--record --actor agent:id]
|
|
117
117
|
aienvmp checkpoint [--dir .] --actor agent:id --summary "what changed" [--target dependency] [--json]
|
|
118
118
|
aienvmp plan [--dir .] [--json] [--write]
|
|
@@ -122,7 +122,7 @@ Usage:
|
|
|
122
122
|
|
|
123
123
|
Common:
|
|
124
124
|
aienvmp sync update AIENV.md, manifest, status, summary, SBOM, ledger, intents, and dashboard
|
|
125
|
-
aienvmp status print
|
|
125
|
+
aienvmp status print a 5-line AI/human environment decision; --verbose shows command details
|
|
126
126
|
aienvmp context print the AI preflight brief
|
|
127
127
|
aienvmp handoff print the next-agent handoff summary
|
|
128
128
|
aienvmp checkpoint record, sync, status, and handoff after an env change
|
package/src/commands/status.js
CHANGED
|
@@ -21,16 +21,7 @@ export async function statusWorkspace(args) {
|
|
|
21
21
|
if (args.json) {
|
|
22
22
|
console.log(JSON.stringify(output, null, 2));
|
|
23
23
|
} else if (!args.quiet) {
|
|
24
|
-
console.log(
|
|
25
|
-
console.log(`ai-readiness: ${output.aiReadiness?.level || "unknown"} - ${output.aiReadiness?.next || "Run aienvmp context --json for details."}`);
|
|
26
|
-
console.log(`collaboration: ${output.collaboration?.status || "unknown"} - ${output.collaboration?.nextCommand || "aienvmp status --json"}`);
|
|
27
|
-
console.log(`next: ${output.nextCommand}`);
|
|
28
|
-
console.log(`ai: ${output.quickstart.readFirst} -> ${output.quickstart.detailCommand}`);
|
|
29
|
-
console.log(`intent: ${output.intentTargets[0]?.command || output.commands.recordIntent}`);
|
|
30
|
-
console.log(`checkpoint: ${output.commands.checkpoint}`);
|
|
31
|
-
console.log(`handoff: ${output.nextAgent.handoffCommand}`);
|
|
32
|
-
console.log(`strict: ${output.enforcement.recommendedCommand}`);
|
|
33
|
-
if (artifact) console.log(`status: ${artifact}`);
|
|
24
|
+
console.log(renderStatusText(output, { verbose: args.verbose === true, artifact }));
|
|
34
25
|
}
|
|
35
26
|
return output;
|
|
36
27
|
}
|
|
@@ -45,3 +36,37 @@ export async function writeStatusArtifact(dir, status) {
|
|
|
45
36
|
export function buildStatus(manifest = {}, warnings = [], intents = [], timeline = []) {
|
|
46
37
|
return buildPreflight(manifest, warnings, intents, timeline);
|
|
47
38
|
}
|
|
39
|
+
|
|
40
|
+
export function renderStatusText(output = {}, options = {}) {
|
|
41
|
+
const counts = output.counts || {};
|
|
42
|
+
const readiness = output.aiReadiness?.level || "unknown";
|
|
43
|
+
const collaboration = output.collaboration?.status || "unknown";
|
|
44
|
+
const sbomRisk = output.sbomRisk?.level || "unknown";
|
|
45
|
+
const sbomScore = valueOrZero(output.sbomRisk?.score);
|
|
46
|
+
const detail = output.quickstart?.detailCommand || "aienvmp context --json";
|
|
47
|
+
const summary = output.artifacts?.summary || ".aienvmp/summary.md";
|
|
48
|
+
const lines = [
|
|
49
|
+
`${output.state || "unknown"}: ${output.summary || "Run aienvmp context --json for details."}`,
|
|
50
|
+
`ready: ${readiness} | collaboration: ${collaboration}`,
|
|
51
|
+
`sbom: ${sbomRisk} (${sbomScore}) | warnings: ${valueOrZero(counts.warnings)} | intents: ${valueOrZero(counts.openIntents)}`,
|
|
52
|
+
`next: ${output.nextCommand || "aienvmp status --json"}`,
|
|
53
|
+
`details: ${detail} | summary: ${summary}`
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
if (options.verbose) {
|
|
57
|
+
lines.push(
|
|
58
|
+
`ai: ${output.quickstart?.readFirst || "aienvmp status --write"} -> ${detail}`,
|
|
59
|
+
`intent: ${output.intentTargets?.[0]?.command || output.commands?.recordIntent || "aienvmp intent --actor agent:id --action planned-change"}`,
|
|
60
|
+
`checkpoint: ${output.commands?.checkpoint || "aienvmp checkpoint --actor agent:id --summary what-changed --target environment"}`,
|
|
61
|
+
`handoff: ${output.nextAgent?.handoffCommand || "aienvmp handoff --record --actor agent:id"}`,
|
|
62
|
+
`strict: ${output.enforcement?.recommendedCommand || "aienvmp doctor --strict all"}`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (options.artifact || output.artifact) lines.push(`status: ${options.artifact || output.artifact}`);
|
|
67
|
+
return lines.join("\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function valueOrZero(value) {
|
|
71
|
+
return Number.isFinite(Number(value)) ? Number(value) : 0;
|
|
72
|
+
}
|
package/src/render.js
CHANGED
|
@@ -381,6 +381,13 @@ 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}
|
|
384
391
|
.audit{display:grid;grid-template-columns:1.2fr repeat(3,minmax(0,.8fr));gap:12px;margin:14px 0}
|
|
385
392
|
.audit-item{border:1px solid var(--line);background:rgba(13,24,21,.92);border-radius:8px;padding:14px;min-width:0}
|
|
386
393
|
.audit-item.primary{background:linear-gradient(135deg,rgba(19,61,42,.88),rgba(9,19,16,.95))}
|
|
@@ -404,6 +411,7 @@ code{color:var(--code);background:#0a2017;border:1px solid #17462f;padding:2px 6
|
|
|
404
411
|
.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
412
|
.path{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--muted);font-size:12px;overflow-wrap:anywhere}
|
|
406
413
|
@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}}
|
|
414
|
+
@media (max-width:860px){.control{grid-template-columns:1fr}}
|
|
407
415
|
@media (max-width:860px){.audit{grid-template-columns:1fr 1fr}}
|
|
408
416
|
@media (max-width:520px){.shell{padding:14px}.metrics{grid-template-columns:1fr}.event{grid-template-columns:1fr}h1{font-size:32px}}
|
|
409
417
|
@media (max-width:520px){.audit{grid-template-columns:1fr}}
|
|
@@ -496,11 +504,20 @@ const recentChanges=timeline.slice(-8).length;
|
|
|
496
504
|
const trustState=manifest.trust?.state||'observed';
|
|
497
505
|
const nextAction=reviewRequired?'Review before environment changes':'Proceed with project-local work';
|
|
498
506
|
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>\`;
|
|
507
|
+
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
508
|
const driftLabel=warnings.length?'detected':'none';
|
|
500
509
|
const nextAgent=manifest.preflight?.nextAgent||{};
|
|
501
510
|
const aiReadiness=manifest.preflight?.aiReadiness||{};
|
|
502
511
|
const aiReadinessSignals=(aiReadiness.signals||[]).slice(0,3);
|
|
503
512
|
const aiReadinessHint=(aiReadiness.next||'Run aienvmp context --json for details.')+(aiReadinessSignals.length?' Signals: '+aiReadinessSignals.join('; '):'');
|
|
513
|
+
const aiReadyValue=aiReadiness.level||'unknown';
|
|
514
|
+
const aiReadyClass=aiReadyValue==='ready'?'ready':'review';
|
|
515
|
+
const collaborationValue=collaboration.status||'unknown';
|
|
516
|
+
const collaborationClass=collaborationValue==='clear'?'ready':'review';
|
|
517
|
+
const sbomRiskValue=riskSummary.level||'unknown';
|
|
518
|
+
const sbomRiskClass=['urgent','high','medium'].includes(sbomRiskValue)?'review':'ready';
|
|
519
|
+
const sbomRiskScore=riskSummary.score!==undefined?' ('+riskSummary.score+')':'';
|
|
520
|
+
const sbomRiskNext=riskSummary.next||aiDependencyReview.beforeDependencyChange?.[0]||'Run aienvmp sbom --json for dependency context.';
|
|
504
521
|
const coordination=manifest.preflight?.coordination||{};
|
|
505
522
|
const conflictTargets=coordination.conflictTargets||[];
|
|
506
523
|
const handoffFiles=nextAgent.dependencyFiles?.length?nextAgent.dependencyFiles:(dependencyReadSet[0]?[dependencyReadSet[0].manifest,...(dependencyReadSet[0].lockfiles||[])].filter(Boolean):[]);
|
|
@@ -515,6 +532,11 @@ document.getElementById('app').innerHTML=\`
|
|
|
515
532
|
</div>
|
|
516
533
|
<div class="stamp"><b>\${warnings.length?'review':'clear'}</b><span>\${esc(manifest.workspace.name)}</span><span>\${esc(manifest.generatedAt)}</span></div>
|
|
517
534
|
</header>
|
|
535
|
+
<section class="control" aria-label="AI control strip">
|
|
536
|
+
\${controlCard('AI readiness',aiReadyValue,aiReadiness.next||'Run aienvmp context --json for details.',aiReadyClass)}
|
|
537
|
+
\${controlCard('Collaboration',collaborationValue,collaboration.nextCommand||'aienvmp status --json',collaborationClass)}
|
|
538
|
+
\${controlCard('SBOM risk',sbomRiskValue+sbomRiskScore,sbomRiskNext,sbomRiskClass)}
|
|
539
|
+
</section>
|
|
518
540
|
<section class="audit" aria-label="Audit summary">
|
|
519
541
|
\${auditItem('AI decision',reviewRequired?'review required':'can proceed',nextAction,reviewRequired?'review':'primary')}
|
|
520
542
|
\${auditItem('AI readiness',aiReadiness.level||'unknown',aiReadinessHint,aiReadiness.level==='ready'?'primary':'review')}
|