aienvmp 0.1.35 → 0.1.36

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.36
4
+
5
+ - Added an explicit enforcement profile to the shared AI preflight contract.
6
+ - Surfaced advisory-by-default vs optional strict mode in the dashboard.
7
+ - Clarified that strict checks are intended for CI or explicit human-requested gates, not default local blocking.
8
+
3
9
  ## 0.1.35
4
10
 
5
11
  - Added a shared AI preflight contract across status, context, plan, and handoff outputs.
package/README.md CHANGED
@@ -105,6 +105,7 @@ aienvmp doctor --strict security # fail only scoped warnings
105
105
  - one advisory engine, optional enforcement with `doctor --ci`
106
106
  - scoped enforcement with `doctor --strict security|policy|coordination|all`
107
107
  - context and plan expose suggested strict scopes for CI
108
+ - dashboard and preflight explain advisory default vs optional strict mode
108
109
  - non-blocking unless strict mode is explicitly requested
109
110
  - security checks are opt-in and read-only
110
111
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aienvmp",
3
- "version": "0.1.35",
3
+ "version": "0.1.36",
4
4
  "description": "AI-first environment maps and lightweight runtime SBOMs for shared development machines.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,7 @@ import { renderDashboard } from "../render.js";
9
9
  import { loadPolicy, policyWarnings } from "../policy.js";
10
10
  import { recommendedActions } from "../actions.js";
11
11
  import { strictResult } from "../enforcement.js";
12
+ import { buildPreflight } from "../preflight.js";
12
13
 
13
14
  export async function dashWorkspace(args) {
14
15
  const dir = workspaceDir(args);
@@ -23,6 +24,7 @@ export async function dashWorkspace(args) {
23
24
  const planEnvironment = await detectedPlanEnvironment(dir);
24
25
  const html = renderDashboard({
25
26
  ...manifest,
27
+ preflight: buildPreflight(manifest, warnings, intents),
26
28
  recommendedActions: recommendedActions(manifest, { warnings, intents }),
27
29
  planArtifacts,
28
30
  planRemediation,
package/src/preflight.js CHANGED
@@ -16,6 +16,20 @@ export function buildPreflight(manifest = {}, warnings = [], intents = []) {
16
16
  : "Review warnings or open intents before environment changes.",
17
17
  decision,
18
18
  enforcement,
19
+ enforcementProfile: {
20
+ defaultMode: "advisory",
21
+ localOperation: "non-blocking",
22
+ strictMode: "optional",
23
+ strictUse: "CI or explicit human-requested checks only",
24
+ reason: "Avoid disrupting shared servers or developer machines while still making drift visible.",
25
+ recommendedStrictCommand: enforcement.recommendedCommand,
26
+ strictCommands: [
27
+ "aienvmp doctor --strict security",
28
+ "aienvmp doctor --strict policy",
29
+ "aienvmp doctor --strict coordination",
30
+ "aienvmp doctor --strict all"
31
+ ]
32
+ },
19
33
  counts: {
20
34
  warnings: warnings.length,
21
35
  openIntents: intents.length,
package/src/render.js CHANGED
@@ -313,6 +313,9 @@ const envStepsHtml=envSteps.length?'<div class="timeline">'+envSteps.map(s=>\`<d
313
313
  const ciReadiness=manifest.ciReadiness||[];
314
314
  const ciHasFailure=ciReadiness.some(s=>s.status==='fail');
315
315
  const ciReadinessHtml=ciReadiness.length?'<table>'+ciReadiness.map(s=>\`<tr><th>\${esc(s.scope)}</th><td><code>\${esc(s.status)}</code>\${s.matchedWarningCodes?.length?\` \${esc(s.matchedWarningCodes.join(', '))}\`:''}</td></tr>\`).join('')+'</table>':'<div class="okline">Run <code>aienvmp doctor --strict security|policy|coordination|all</code> to choose CI enforcement scope.</div>';
316
+ const enforcementProfile=manifest.preflight?.enforcementProfile||{};
317
+ const strictCommands=enforcementProfile.strictCommands||[];
318
+ const enforcementHtml=\`<table><tr><th>Default</th><td><code>\${esc(enforcementProfile.defaultMode||'advisory')}</code></td></tr><tr><th>Local</th><td>\${esc(enforcementProfile.localOperation||'non-blocking')}</td></tr><tr><th>Strict</th><td>\${esc(enforcementProfile.strictUse||'CI or explicit checks only')}</td></tr><tr><th>Recommended</th><td><code>\${esc(enforcementProfile.recommendedStrictCommand||'aienvmp doctor --strict all')}</code></td></tr></table><div class="timeline">\${strictCommands.slice(0,4).map(cmd=>\`<div class="event"><time>CI</time><div><code>\${esc(cmd)}</code></div></div>\`).join('')}</div><div class="path">\${esc(enforcementProfile.reason||'Warnings stay advisory unless strict mode is requested.')}</div>\`;
316
319
  const card=(title,badge,body)=>\`<section class="card"><div class="card-head"><h2>\${title}</h2>\${badge||''}</div>\${body}</section>\`;
317
320
  const reviewRequired=warnings.length>0||intents.length>0;
318
321
  const recentChanges=timeline.slice(-8).length;
@@ -361,6 +364,8 @@ document.getElementById('app').innerHTML=\`
361
364
  <div style="height:14px"></div>
362
365
  \${card('Environment Steps',envSteps.length?'<span class="pill warn">'+envSteps.length+' items</span>':'<span class="pill off">none</span>',envStepsHtml)}
363
366
  <div style="height:14px"></div>
367
+ \${card('Enforcement Mode','<span class="pill">advisory</span>',enforcementHtml)}
368
+ <div style="height:14px"></div>
364
369
  \${card('CI Readiness',ciHasFailure?'<span class="pill warn">review</span>':'<span class="pill">ready</span>',ciReadinessHtml)}
365
370
  <div style="height:14px"></div>
366
371
  \${card('Environment Health',warnings.length?'<span class="pill warn">attention</span>':'<span class="pill">clear</span>',warnHtml)}