aienvmp 0.1.52 → 0.1.53

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/BUGFIXES.md CHANGED
@@ -106,6 +106,12 @@ Short record of bugs, fixes, and follow-up checks.
106
106
  - Fix: `agentFiles` now records path, existence, pointer marker state, role, and install command; recommended actions suggest installing a pointer without failing local work.
107
107
  - Verification: tests cover sync pointer scanning, recommended action output, and dashboard status labels.
108
108
 
109
+ ### AI consumers had to inspect the full manifest for pointer state
110
+
111
+ - Issue: `status`, `context`, and `doctor` did not expose a compact pointer summary even after manifest scanning detected it.
112
+ - Fix: `agentPointers` now appears in status/preflight, context JSON, doctor JSON, and summary markdown.
113
+ - Verification: regression tests cover status, context, doctor, schema, and summary outputs.
114
+
109
115
  ## Template
110
116
 
111
117
  ### Title
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.53
4
+
5
+ - Added `agentPointers` to the shared AI preflight/status contract.
6
+ - Added `agentPointers` to `context --json` at the root for quick AI access.
7
+ - Added `agentPointers` to `doctor --json` without making missing pointers a blocking warning.
8
+ - Added agent pointer status to `.aienvmp/summary.md`.
9
+ - Added `agentPointers` to the stable schema contract metadata.
10
+ - Preserved legacy boolean `agentFiles` compatibility in preflight summaries.
11
+ - Added regression tests for status, context, doctor, schema, and summary pointer outputs.
12
+
3
13
  ## 0.1.52
4
14
 
5
15
  - Expanded `manifest.agentFiles` from booleans to lightweight agent instruction metadata.
package/README.md CHANGED
@@ -73,6 +73,7 @@ npx aienvmp snippet gemini
73
73
 
74
74
  Snippets point each AI to `status`, `summary.md`, `context --json`, intent, and checkpoint without taking over the instruction file.
75
75
  `sync` records whether those pointers are installed, and `doctor` can recommend installing one without blocking local work.
76
+ `status`, `context --json`, and `doctor --json` expose the same `agentPointers` summary for AI consumers.
76
77
 
77
78
  ## Commands
78
79
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aienvmp",
3
- "version": "0.1.52",
3
+ "version": "0.1.53",
4
4
  "description": "AI-first environment maps and lightweight runtime SBOMs for shared development machines.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,6 +27,7 @@ export async function contextWorkspace(args) {
27
27
  status: warnings.length ? "review-required" : "clear",
28
28
  preflight,
29
29
  coordination: preflight.coordination,
30
+ agentPointers: preflight.agentPointers,
30
31
  sbomRisk: preflight.sbomRisk,
31
32
  followUps: preflight.followUps,
32
33
  decision,
@@ -5,6 +5,7 @@ import { intentsPath, manifestPath, timelinePath, workspaceDir } from "../paths.
5
5
  import { loadPolicy, policyWarnings } from "../policy.js";
6
6
  import { recommendedActions } from "../actions.js";
7
7
  import { enforcementAdvice, strictResult } from "../enforcement.js";
8
+ import { agentPointerSummary } from "../preflight.js";
8
9
 
9
10
  export { strictResult } from "../enforcement.js";
10
11
 
@@ -32,6 +33,7 @@ export async function doctorWorkspace(args) {
32
33
  exitBehavior,
33
34
  trust: manifest.trust || {},
34
35
  policy,
36
+ agentPointers: agentPointerSummary(manifest.agentFiles),
35
37
  openIntentCount: intents.length,
36
38
  warnings,
37
39
  recommendedActions: actions,
@@ -51,6 +51,7 @@ export function renderSummary(status = {}, manifest = {}) {
51
51
  const dependencyProtocol = status.dependencyChangeProtocol || {};
52
52
  const dependencyCommands = dependencyProtocol.commands || {};
53
53
  const dependencyFiles = dependencyFilesFor(status.dependencyReadSet);
54
+ const agentPointers = status.agentPointers || {};
54
55
 
55
56
  return [
56
57
  "# aienvmp summary",
@@ -86,6 +87,12 @@ export function renderSummary(status = {}, manifest = {}) {
86
87
  `- after: ${dependencyCommands.checkpointAfterChange || "aienvmp checkpoint --actor agent:id --summary dependency-change --target dependency"}`,
87
88
  `- package manager policy: ${dependencyProtocol.packageManagerPolicy || "not-detected"}`,
88
89
  "",
90
+ "## Agent pointers",
91
+ "",
92
+ `- installed: ${toList(agentPointers.installed).join(", ") || "none"}`,
93
+ `- missing: ${toList(agentPointers.missing).join(", ") || "none"}`,
94
+ `- next: ${agentPointers.next || "Run aienvmp snippet codex --write if AI agents need instruction-file discovery."}`,
95
+ "",
89
96
  "## Artifacts",
90
97
  "",
91
98
  "- AIENV.md",
package/src/contract.js CHANGED
@@ -4,7 +4,7 @@ export function preflightContract() {
4
4
  version: 1,
5
5
  stability: "additive",
6
6
  requiredFields: ["schemaVersion", "state", "decision", "quickstart", "commands", "artifacts"],
7
- aiEntryFields: ["state", "summary", "nextAgent", "coordination", "agentActivity", "sbomRisk", "followUps", "dependencyReadSet", "dependencyChangeProtocol"],
7
+ aiEntryFields: ["state", "summary", "nextAgent", "coordination", "agentActivity", "agentPointers", "sbomRisk", "followUps", "dependencyReadSet", "dependencyChangeProtocol"],
8
8
  rule: "Consumers should ignore unknown fields and treat missing optional fields as unavailable."
9
9
  };
10
10
  }
@@ -28,7 +28,7 @@ export function schemaContract() {
28
28
  },
29
29
  context: {
30
30
  command: "aienvmp context --json",
31
- rootFields: ["status", "preflight", "coordination", "decision", "recommendedActions", "workspace", "dependencySnapshot", "lightSbom", "warnings"]
31
+ rootFields: ["status", "preflight", "coordination", "agentPointers", "decision", "recommendedActions", "workspace", "dependencySnapshot", "lightSbom", "warnings"]
32
32
  },
33
33
  handoff: {
34
34
  command: "aienvmp handoff --json",
package/src/preflight.js CHANGED
@@ -17,6 +17,7 @@ export function buildPreflight(manifest = {}, warnings = [], intents = [], timel
17
17
  const followUps = pendingFollowUps(timeline);
18
18
  const agentActivity = agentActivitySummary(timeline);
19
19
  const sbomRisk = manifest.lightSbom?.riskSummary || {};
20
+ const agentPointers = agentPointerSummary(manifest.agentFiles);
20
21
  return {
21
22
  schemaVersion: 1,
22
23
  contract: preflightContract(),
@@ -58,6 +59,7 @@ export function buildPreflight(manifest = {}, warnings = [], intents = [], timel
58
59
  nextAgent: nextAgentHint(state, dependencyReadSet, dependencyChangeProtocol),
59
60
  coordination,
60
61
  agentActivity,
62
+ agentPointers,
61
63
  sbomRisk,
62
64
  followUps,
63
65
  intentTargets,
@@ -123,6 +125,59 @@ function agentActivitySummary(timeline = []) {
123
125
  };
124
126
  }
125
127
 
128
+ export function agentPointerSummary(agentFiles = {}) {
129
+ const entries = Object.entries(agentFiles || {}).filter(([name]) => ["agents", "claude", "gemini"].includes(name));
130
+ const targets = entries.map(([name, item]) => {
131
+ const normalized = normalizeAgentFile(item);
132
+ return {
133
+ name,
134
+ role: normalized.role || (name === "agents" ? "codex" : name),
135
+ file: normalized.path || defaultAgentFile(name),
136
+ exists: normalized.exists,
137
+ hasPointer: normalized.hasAienvmpPointer,
138
+ installCommand: normalized.installCommand || defaultInstallCommand(name)
139
+ };
140
+ });
141
+ const installed = targets.filter((item) => item.hasPointer);
142
+ const missing = targets.filter((item) => !item.hasPointer);
143
+ return {
144
+ installedCount: installed.length,
145
+ missingCount: missing.length,
146
+ installed: installed.map((item) => item.role),
147
+ missing: missing.map((item) => item.role),
148
+ targets,
149
+ next: missing.length
150
+ ? `Install a pointer with ${missing[0].installCommand} if this workspace uses that AI.`
151
+ : "Agent instruction pointers are installed for detected AI instruction files.",
152
+ mode: "advisory"
153
+ };
154
+ }
155
+
156
+ function normalizeAgentFile(item) {
157
+ if (typeof item === "boolean") {
158
+ return { exists: item, hasAienvmpPointer: item };
159
+ }
160
+ return {
161
+ path: item?.path || "",
162
+ exists: item?.exists === true,
163
+ hasAienvmpPointer: item?.hasAienvmpPointer === true,
164
+ installCommand: item?.installCommand || "",
165
+ role: item?.role || ""
166
+ };
167
+ }
168
+
169
+ function defaultAgentFile(name) {
170
+ if (name === "claude") return "CLAUDE.md";
171
+ if (name === "gemini") return "GEMINI.md";
172
+ return "AGENTS.md";
173
+ }
174
+
175
+ function defaultInstallCommand(name) {
176
+ if (name === "claude") return "aienvmp snippet claude --write";
177
+ if (name === "gemini") return "aienvmp snippet gemini --write";
178
+ return "aienvmp snippet codex --write";
179
+ }
180
+
126
181
  function coordinationSummary(intents = []) {
127
182
  const byTarget = new Map();
128
183
  for (const intent of intents) {