aienvmp 0.1.19 → 0.1.20

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.20
4
+
5
+ - Added a dashboard Environment Steps card backed by `.aienvmp/plan.json`.
6
+ - Surfaced runtime, package manager, Docker, and coordination plan summaries for humans.
7
+ - Kept detailed step lists in `plan.md` while keeping the dashboard bounded.
8
+
3
9
  ## 0.1.19
4
10
 
5
11
  - Added runtime, package manager, Docker, and coordination environment steps to `aienvmp plan`.
package/README.md CHANGED
@@ -38,7 +38,7 @@ AIENV.md
38
38
  .aienvmp/timeline.jsonl
39
39
  .aienvmp/plan.json
40
40
  .aienvmp/plan.md
41
- .aienvmp/dashboard.html # includes plan and remediation cards
41
+ .aienvmp/dashboard.html # includes plan, remediation, and environment cards
42
42
  ```
43
43
 
44
44
  Trust states are machine-readable: `observed`, `planned`, `changed`, `review`, `verified`, `stale`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aienvmp",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "AI-first environment maps and lightweight runtime SBOMs for shared development machines.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,7 +19,8 @@ export async function dashWorkspace(args) {
19
19
  const warnings = [...diagnose(manifest, { timeline, intents }), ...policyWarnings(manifest, policy)];
20
20
  const planArtifacts = await detectedPlanArtifacts(dir);
21
21
  const planRemediation = await detectedPlanRemediation(dir);
22
- const html = renderDashboard({ ...manifest, recommendedActions: recommendedActions(manifest, { warnings, intents }), planArtifacts, planRemediation }, timeline, warnings, intents, policy);
22
+ const planEnvironment = await detectedPlanEnvironment(dir);
23
+ const html = renderDashboard({ ...manifest, recommendedActions: recommendedActions(manifest, { warnings, intents }), planArtifacts, planRemediation, planEnvironment }, timeline, warnings, intents, policy);
23
24
  const out = dashboardPath(dir);
24
25
  await fs.mkdir(path.dirname(out), { recursive: true });
25
26
  await fs.writeFile(out, html, "utf8");
@@ -48,6 +49,15 @@ async function detectedPlanRemediation(dir) {
48
49
  }));
49
50
  }
50
51
 
52
+ async function detectedPlanEnvironment(dir) {
53
+ const plan = await readJson(planJsonPath(dir), {});
54
+ return (plan.environmentSteps || []).slice(0, 5).map((item) => ({
55
+ code: item.code || "unknown",
56
+ category: item.category || "environment",
57
+ summary: item.summary || ""
58
+ }));
59
+ }
60
+
51
61
  function openFile(file) {
52
62
  if (process.platform === "win32") {
53
63
  execFile("cmd", ["/c", "start", "", file], { windowsHide: true });
package/src/render.js CHANGED
@@ -292,6 +292,8 @@ const remediation=manifest.planRemediation||[];
292
292
  const remediationFix=r=>r.fixVersions?.length?\`fix \${r.fixVersions.join(', ')}\`:(r.fixAvailable?'fix available':'review required');
293
293
  const remediationRefs=r=>r.advisories?.length?\` - \${r.advisories.join(', ')}\`:'';
294
294
  const remediationHtml=remediation.length?'<div class="timeline">'+remediation.map(r=>\`<div class="event"><time>\${esc(r.severity)}</time><div><b>\${esc(r.package)}</b> \${esc(remediationFix(r))}\${esc(remediationRefs(r))}</div></div>\`).join('')+'</div>':'<div class="okline">No remediation steps in the current plan.</div>';
295
+ const envSteps=manifest.planEnvironment||[];
296
+ const envStepsHtml=envSteps.length?'<div class="timeline">'+envSteps.map(s=>\`<div class="event"><time>\${esc(s.category)}</time><div><b>\${esc(s.code)}</b> \${esc(s.summary)}</div></div>\`).join('')+'</div>':'<div class="okline">No environment steps in the current plan.</div>';
295
297
  const card=(title,badge,body)=>\`<section class="card"><div class="card-head"><h2>\${title}</h2>\${badge||''}</div>\${body}</section>\`;
296
298
  const reviewRequired=warnings.length>0||intents.length>0;
297
299
  const recentChanges=timeline.slice(-8).length;
@@ -337,6 +339,8 @@ document.getElementById('app').innerHTML=\`
337
339
  <div style="height:14px"></div>
338
340
  \${card('Remediation Steps',remediation.length?'<span class="pill warn">'+remediation.length+' items</span>':'<span class="pill off">none</span>',remediationHtml)}
339
341
  <div style="height:14px"></div>
342
+ \${card('Environment Steps',envSteps.length?'<span class="pill warn">'+envSteps.length+' items</span>':'<span class="pill off">none</span>',envStepsHtml)}
343
+ <div style="height:14px"></div>
340
344
  \${card('Environment Health',warnings.length?'<span class="pill warn">attention</span>':'<span class="pill">clear</span>',warnHtml)}
341
345
  <div style="height:14px"></div>
342
346
  \${card('Version Policy','<span class="pill">'+entries(policy).length+' rules</span>',policyHtml)}