aienvmp 0.1.65 → 0.1.66

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.66
4
+
5
+ - Added `aienvmp resolve --target <target>` to resolve all open intents for one environment target.
6
+ - Added `aienvmp resolve --all` to close all open intents after coordination.
7
+ - Added `resolve --json` output so AI agents can read resolved refs and counts directly.
8
+ - Kept single-intent `resolve --id` behavior for precise manual cleanup.
9
+ - Updated coordination recommended actions to point at target-based resolve.
10
+ - Updated CLI help and README command guidance for the simplified resolve flow.
11
+ - Added regression tests for target resolve, all resolve, JSON output, and coordination action commands.
12
+
3
13
  ## 0.1.65
4
14
 
5
15
  - Added a dashboard `Next command` bar directly below the AI control strip.
package/README.md CHANGED
@@ -94,6 +94,7 @@ aienvmp schema --json # stable output contract for AI/CI consumers
94
94
  aienvmp plan --write # read-only action plan
95
95
  aienvmp handoff --record # next-agent summary
96
96
  aienvmp intent # record planned env change
97
+ aienvmp resolve --target dependency --actor agent:id
97
98
  aienvmp record # record what changed
98
99
  aienvmp checkpoint # record + sync + status + handoff after env change
99
100
  aienvmp doctor --strict security|policy|coordination|all
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aienvmp",
3
- "version": "0.1.65",
3
+ "version": "0.1.66",
4
4
  "description": "AI-first environment maps and lightweight runtime SBOMs for shared development machines.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/actions.js CHANGED
@@ -12,7 +12,7 @@ export function recommendedActions(manifest = {}, context = {}) {
12
12
  }
13
13
 
14
14
  if (warnings.some((warning) => warning.code === "conflicting-open-intents")) {
15
- actions.push(action("coordinate-agents", "high", "coordination", "Multiple agents are planning changes to the same environment target. Coordinate with the user before proceeding."));
15
+ actions.push(action("coordinate-agents", "high", "coordination", "Multiple agents are planning changes to the same environment target. Coordinate with the user before proceeding.", "aienvmp resolve --actor agent:id --target <target> --status resolved"));
16
16
  }
17
17
 
18
18
  if (warnings.some((warning) => warning.code === "multi-agent-records")) {
package/src/cli.js CHANGED
@@ -137,7 +137,7 @@ Advanced:
137
137
  aienvmp init [--dir .]
138
138
  aienvmp scan [--dir .] [--deep] [--security]
139
139
  aienvmp intent [--dir .] --actor agent:codex --action "install pnpm"
140
- aienvmp resolve [--dir .] --actor human:you --id <intent-id> [--status resolved|cancelled]
140
+ aienvmp resolve [--dir .] --actor human:you (--id <intent-id>|--target dependency|--all) [--status resolved|cancelled] [--json]
141
141
  aienvmp record [--dir .] --actor agent:codex --summary "updated .nvmrc" [--target node] [--before 20] [--after 24]
142
142
  aienvmp checkpoint [--dir .] --actor agent:codex --summary "updated dependency" [--target dependency]
143
143
  aienvmp snippet [agents|codex|claude|gemini] [--write AGENTS.md]
@@ -5,18 +5,32 @@ import { intentsPath, workspaceDir } from "../paths.js";
5
5
  export async function resolveWorkspace(args) {
6
6
  const dir = workspaceDir(args);
7
7
  const actor = required(args.actor, "actor");
8
- const requested = required(args.id || args.ref, "id");
9
- const ref = await resolveIntentRef(dir, requested);
10
- const entry = {
11
- at: new Date().toISOString(),
8
+ const refs = await resolveIntentRefs(dir, args);
9
+ const now = new Date().toISOString();
10
+ const entries = refs.map((ref) => ({
11
+ at: now,
12
12
  type: "intent-resolved",
13
13
  actor,
14
14
  ref,
15
15
  status: args.status || "resolved",
16
16
  reason: args.reason || ""
17
+ }));
18
+ for (const entry of entries) {
19
+ await appendJsonLine(intentsPath(dir), entry);
20
+ }
21
+ const output = {
22
+ status: args.status || "resolved",
23
+ count: entries.length,
24
+ refs,
25
+ actor,
26
+ reason: args.reason || ""
17
27
  };
18
- await appendJsonLine(intentsPath(dir), entry);
19
- console.log(`intent ${entry.status}: ${ref}`);
28
+ if (args.json) {
29
+ console.log(JSON.stringify(output, null, 2));
30
+ } else if (!args.quiet) {
31
+ console.log(`intents ${output.status}: ${output.count}${refs.length ? ` (${refs.join(", ")})` : ""}`);
32
+ }
33
+ return output;
20
34
  }
21
35
 
22
36
  function required(value, name) {
@@ -24,8 +38,22 @@ function required(value, name) {
24
38
  return String(value);
25
39
  }
26
40
 
27
- async function resolveIntentRef(dir, requested) {
41
+ async function resolveIntentRefs(dir, args) {
28
42
  const open = openIntents(await readJsonl(intentsPath(dir)));
43
+ if (args.all) return open.map((intent) => intent.id);
44
+ if (args.target) {
45
+ const target = String(args.target).trim().toLowerCase();
46
+ const refs = open
47
+ .filter((intent) => String(intent.target || "").trim().toLowerCase() === target)
48
+ .map((intent) => intent.id);
49
+ if (!refs.length) throw new Error(`resolve: no open intents for target "${target}"`);
50
+ return refs;
51
+ }
52
+ const requested = required(args.id || args.ref, "id");
53
+ return [await resolveIntentRef(open, requested)];
54
+ }
55
+
56
+ async function resolveIntentRef(open, requested) {
29
57
  const matches = open.filter((intent) => intent.id === requested || intent.id.startsWith(requested));
30
58
  if (matches.length === 1) return matches[0].id;
31
59
  if (matches.length > 1) {