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 +6 -0
- package/CHANGELOG.md +10 -0
- package/README.md +1 -0
- package/package.json +1 -1
- package/src/commands/context.js +1 -0
- package/src/commands/doctor.js +2 -0
- package/src/commands/summary.js +7 -0
- package/src/contract.js +2 -2
- package/src/preflight.js +55 -0
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
package/src/commands/context.js
CHANGED
|
@@ -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,
|
package/src/commands/doctor.js
CHANGED
|
@@ -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,
|
package/src/commands/summary.js
CHANGED
|
@@ -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) {
|