@interchained/portal-cli 0.1.10 → 0.1.11

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.
@@ -1,6 +1,15 @@
1
1
  /**
2
2
  * portal agent list — list configured agents and their permissions
3
3
  * portal agent run — run a specific agent task manually
4
+ *
5
+ * Agents are real defineAgent({ ... }) definitions loaded from agents/*.agent.ts.
6
+ * Their declared permissions are enforced:
7
+ * - canPatch: false → read-only; the agent analyzes and reports, never writes
8
+ * - canPatch: true → may produce patches
9
+ * - requiresApproval: true → patches stay pending for `portal patch`
10
+ * - requiresApproval: false→ clean patches are applied automatically
11
+ * When requiresApproval is unset it falls back to the contract's publishing policy,
12
+ * defaulting to "requires approval" unless publishing is explicitly "immediate".
4
13
  */
5
14
  export declare function agentListCommand(): Promise<void>;
6
15
  export declare function agentRunCommand(name: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/agent-cmd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+CtD;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHjE"}
1
+ {"version":3,"file":"agent-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/agent-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiEH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BtD;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyKjE"}
@@ -1,21 +1,58 @@
1
1
  /**
2
2
  * portal agent list — list configured agents and their permissions
3
3
  * portal agent run — run a specific agent task manually
4
+ *
5
+ * Agents are real defineAgent({ ... }) definitions loaded from agents/*.agent.ts.
6
+ * Their declared permissions are enforced:
7
+ * - canPatch: false → read-only; the agent analyzes and reports, never writes
8
+ * - canPatch: true → may produce patches
9
+ * - requiresApproval: true → patches stay pending for `portal patch`
10
+ * - requiresApproval: false→ clean patches are applied automatically
11
+ * When requiresApproval is unset it falls back to the contract's publishing policy,
12
+ * defaulting to "requires approval" unless publishing is explicitly "immediate".
4
13
  */
5
- import { readFile, readdir, access } from "node:fs/promises";
6
- import { join, basename, extname } from "node:path";
14
+ import { readFile, readdir } from "node:fs/promises";
15
+ import { join } from "node:path";
7
16
  import pc from "picocolors";
8
17
  import ora from "ora";
9
- import { Runner, Sentinel, PatchStore, createPatch } from "@interchained/portal-agent";
18
+ import { Runner, Sentinel, PatchStore, createPatch, applyPatch, } from "@interchained/portal-agent";
10
19
  import { banner, header, success, fail, info, step, blank } from "../utils/print.js";
11
20
  import { loadContract } from "../utils/contract.js";
12
- async function exists(p) {
21
+ import { findAgentFiles, matchAgentFile, loadAgent } from "../utils/agents.js";
22
+ // ── helpers ─────────────────────────────────────────────────────────────────
23
+ /**
24
+ * Resolve whether an agent's patches require approval.
25
+ * Fail-safe: defaults to true unless the contract explicitly publishes immediately.
26
+ */
27
+ function resolveRequiresApproval(def, contract) {
28
+ return def.requiresApproval ?? contract.policies?.publishing !== "immediate";
29
+ }
30
+ function permsLabel(def, contract) {
31
+ const canPatch = def.canPatch === true;
32
+ const parts = [
33
+ canPatch ? pc.yellow("can patch") : pc.dim("read-only"),
34
+ canPatch
35
+ ? resolveRequiresApproval(def, contract)
36
+ ? pc.cyan("requires approval")
37
+ : pc.dim("auto-apply")
38
+ : null,
39
+ def.model ? pc.dim(`model: ${def.model}`) : null,
40
+ ].filter(Boolean);
41
+ return parts.join(" ");
42
+ }
43
+ /** Extract a JSON findings array from a model response that may include prose/fences. */
44
+ function parseFindings(raw) {
45
+ const match = raw.match(/\[[\s\S]*\]/);
46
+ if (!match)
47
+ return [];
13
48
  try {
14
- await access(p);
15
- return true;
49
+ const arr = JSON.parse(match[0]);
50
+ if (!Array.isArray(arr))
51
+ return [];
52
+ return arr.filter((f) => typeof f === "object" && f !== null);
16
53
  }
17
54
  catch {
18
- return false;
55
+ return [];
19
56
  }
20
57
  }
21
58
  // ── portal agent list ─────────────────────────────────────────────────────────
@@ -23,34 +60,21 @@ export async function agentListCommand() {
23
60
  banner();
24
61
  const root = process.cwd();
25
62
  const agentsDir = join(root, "agents");
26
- if (!(await exists(agentsDir))) {
27
- info("No agents/ directory found.");
28
- info("Create agents/seo.agent.ts to get started.");
29
- blank();
30
- return;
31
- }
32
- const entries = await readdir(agentsDir);
33
- const agentFiles = entries.filter((f) => f.endsWith(".agent.ts") || f.endsWith(".agent.js"));
34
- if (agentFiles.length === 0) {
35
- info("agents/ directory is empty — no agents configured.");
63
+ const files = await findAgentFiles(agentsDir);
64
+ if (files.length === 0) {
65
+ info("No agents configured.");
66
+ info("Create agents/seo.agent.ts with defineAgent({ ... }) to get started.");
36
67
  blank();
37
68
  return;
38
69
  }
70
+ const contract = await loadContract(root);
39
71
  header("Configured Agents");
40
72
  blank();
41
- for (const file of agentFiles) {
42
- const src = await readFile(join(agentsDir, file), "utf-8");
43
- // Extract name and task from defineAgent({ ... }) call
44
- const nameMatch = src.match(/name\s*:\s*["']([^"']+)["']/);
45
- const taskMatch = src.match(/task\s*:\s*["']([^"']+)["']/);
46
- const canPatch = src.includes("canPatch: true");
47
- const needsApproval = src.includes("requiresApproval: true");
48
- const name = nameMatch?.[1] ?? basename(file, extname(file));
49
- const task = taskMatch?.[1] ?? "No task description";
50
- console.log(`${pc.bold(pc.cyan(name))} ${pc.dim("·")} ${pc.dim(file)}`);
51
- console.log(` ${task}`);
52
- console.log(` ${canPatch ? pc.yellow("can patch") : pc.dim("read-only")} ` +
53
- `${needsApproval ? pc.cyan("requires approval") : pc.dim("auto-apply")}`);
73
+ for (const file of files) {
74
+ const def = await loadAgent(join(agentsDir, file));
75
+ console.log(`${pc.bold(pc.cyan(def.name))} ${pc.dim("·")} ${pc.dim(file)}`);
76
+ console.log(` ${def.task || pc.dim("No task description")}`);
77
+ console.log(` ${permsLabel(def, contract)}`);
54
78
  blank();
55
79
  }
56
80
  }
@@ -60,48 +84,44 @@ export async function agentRunCommand(name) {
60
84
  const root = process.cwd();
61
85
  const agentsDir = join(root, "agents");
62
86
  const contract = await loadContract(root);
63
- // Find the agent file
64
- let agentFile = null;
65
- try {
66
- const entries = await readdir(agentsDir);
67
- agentFile =
68
- entries.find((f) => f === `${name}.agent.ts` || f === `${name}.agent.js`) ?? null;
69
- if (!agentFile) {
70
- agentFile = entries.find((f) => f.includes(name)) ?? null;
71
- }
72
- }
73
- catch {
74
- fail("agents/ directory not found. Create an agent first.");
87
+ const files = await findAgentFiles(agentsDir);
88
+ if (files.length === 0) {
89
+ fail("No agents configured. Create agents/<name>.agent.ts first.");
75
90
  process.exit(1);
76
91
  }
92
+ const agentFile = matchAgentFile(files, name);
77
93
  if (!agentFile) {
78
94
  fail(`Agent not found: "${name}"`);
79
- info(`Run portal agent list to see available agents.`);
95
+ info("Run portal agent list to see available agents.");
80
96
  process.exit(1);
81
97
  }
82
- const src = await readFile(join(agentsDir, agentFile), "utf-8");
83
- const taskMatch = src.match(/task\s*:\s*["']([^"']+)["']/);
84
- const canPatch = src.includes("canPatch: true");
85
- const task = taskMatch?.[1] ?? name;
86
- header(`Running agent: ${pc.bold(name)}`);
98
+ const def = await loadAgent(join(agentsDir, agentFile));
99
+ const canPatch = def.canPatch === true;
100
+ const requiresApproval = resolveRequiresApproval(def, contract);
101
+ const task = def.task || def.name;
102
+ const mode = !canPatch
103
+ ? "read-only (analyze & report)"
104
+ : requiresApproval
105
+ ? "propose patches (requires approval)"
106
+ : "auto-apply clean patches";
107
+ header(`Running agent: ${pc.bold(def.name)}`);
87
108
  console.log(pc.dim(` Task: ${task}`));
88
109
  console.log(pc.dim(` App: ${contract.name}`));
110
+ console.log(pc.dim(` Mode: ${mode}`));
89
111
  blank();
90
- let runner;
91
- try {
92
- runner = new Runner();
93
- }
94
- catch {
95
- fail("AIASSIST_API_KEY not set.");
112
+ // Agents need a model key to do any work — fail early and clearly.
113
+ if (!process.env["AIASSIST_API_KEY"] && !process.env["VITE_AIAS_API_KEY"]) {
114
+ fail("AIASSIST_API_KEY not set — agents need it to run.");
96
115
  process.exit(1);
97
116
  }
98
- const sentinel = new Sentinel();
117
+ const runner = new Runner(def.model ? { model: def.model } : {});
118
+ const sentinel = new Sentinel(def.sentinel ? { model: def.sentinel } : {});
99
119
  const store = new PatchStore(root);
100
- // Run the agent task against each route file
120
+ // Gather route files to run the task against.
101
121
  const routesDir = join(root, "routes");
102
122
  let routeFiles = [];
103
123
  try {
104
- const entries = await readdir(routesDir, { recursive: true });
124
+ const entries = (await readdir(routesDir, { recursive: true }));
105
125
  routeFiles = entries
106
126
  .filter((f) => f.endsWith(".page.tsx") || f.endsWith(".page.jsx"))
107
127
  .map((f) => join(routesDir, f));
@@ -110,52 +130,113 @@ export async function agentRunCommand(name) {
110
130
  fail("No routes/ directory found.");
111
131
  process.exit(1);
112
132
  }
133
+ if (routeFiles.length === 0) {
134
+ info("No route files found under routes/.");
135
+ blank();
136
+ return;
137
+ }
113
138
  const contractSummary = `App: ${contract.name}\nGoals: ${contract.goals.join("; ")}`;
114
- let patchCount = 0;
139
+ let proposed = 0;
140
+ let applied = 0;
141
+ let reviewed = 0;
142
+ let findings = 0;
143
+ let firstError = null;
115
144
  for (const filePath of routeFiles) {
116
145
  const content = await readFile(filePath, "utf-8");
117
146
  const rel = filePath.replace(root + "/", "");
118
147
  const spinner = ora(` Processing ${rel}…`).start();
119
148
  try {
120
- const proposed = await runner.generatePatch({
149
+ // ── Read-only agent: analyze and report, never write. ───────────────────
150
+ if (!canPatch) {
151
+ const raw = await runner.analyzeFile({
152
+ filePath: rel,
153
+ content,
154
+ checks: [task],
155
+ contract: contractSummary,
156
+ });
157
+ spinner.stop();
158
+ reviewed++;
159
+ const notable = parseFindings(raw).filter((f) => f.status !== "pass");
160
+ if (notable.length === 0) {
161
+ step(`${rel} ${pc.dim("·")} ${pc.green("ok")}`);
162
+ }
163
+ else {
164
+ for (const f of notable) {
165
+ findings++;
166
+ const tag = f.status === "fail" ? pc.red("fail") : pc.yellow("warn");
167
+ step(`${rel} ${pc.dim("·")} ${tag} ${f.message ?? "issue found"}`);
168
+ if (f.suggestion)
169
+ console.log(pc.dim(` → ${f.suggestion}`));
170
+ }
171
+ }
172
+ continue;
173
+ }
174
+ // ── Patch-capable agent: generate, review, save / apply. ─────────────────
175
+ const next = await runner.generatePatch({
121
176
  filePath: rel,
122
177
  originalContent: content,
123
178
  finding: task,
124
179
  contract: contractSummary,
125
180
  });
126
181
  spinner.stop();
182
+ if (next.trim() === content.trim())
183
+ continue; // no meaningful change
127
184
  const review = await sentinel.review({
128
185
  contract,
129
186
  filePath: rel,
130
187
  original: content,
131
- proposed,
188
+ proposed: next,
132
189
  agentTask: task,
133
190
  });
134
191
  const patch = createPatch({
135
- agent: name,
192
+ agent: def.name,
136
193
  file: rel,
137
194
  original: content,
138
- proposed,
195
+ proposed: next,
139
196
  reason: task,
140
- requiresApproval: true,
197
+ requiresApproval,
141
198
  sentinelApproved: review.approved,
142
199
  sentinelSummary: review.summary,
143
200
  sentinelViolations: review.violations,
144
201
  });
145
202
  await store.save(patch);
146
- patchCount++;
147
- step(`Patch saved for ${rel} run portal patch to review`);
203
+ proposed++;
204
+ // Auto-apply only when the agent permits it and the review is clean.
205
+ if (!requiresApproval && review.approved) {
206
+ await store.update(patch.id, { status: "approved" });
207
+ await applyPatch({ ...patch, status: "approved" }, root, store);
208
+ applied++;
209
+ step(`${rel} ${pc.dim("·")} ${pc.green("applied")} ${review.summary}`);
210
+ }
211
+ else {
212
+ step(`${rel} ${pc.dim("·")} ${pc.cyan("patch saved")} run portal patch to review`);
213
+ }
148
214
  }
149
- catch {
215
+ catch (err) {
150
216
  spinner.stop();
217
+ if (!firstError)
218
+ firstError = err instanceof Error ? err.message : String(err);
151
219
  }
152
220
  }
153
221
  blank();
154
- if (patchCount > 0) {
155
- success(`${patchCount} patch${patchCount !== 1 ? "es" : ""} queued — run portal patch to review and apply`);
222
+ if (firstError)
223
+ fail(`Some files could not be processed: ${firstError}`);
224
+ if (!canPatch) {
225
+ if (findings > 0) {
226
+ info(`Read-only run complete — ${reviewed} file${reviewed !== 1 ? "s" : ""} reviewed, ${findings} finding${findings !== 1 ? "s" : ""} reported.`);
227
+ }
228
+ else {
229
+ success(`Read-only run complete — ${reviewed} file${reviewed !== 1 ? "s" : ""} reviewed, no issues found.`);
230
+ }
231
+ }
232
+ else if (proposed === 0) {
233
+ info("No changes proposed.");
234
+ }
235
+ else if (applied > 0) {
236
+ success(`${applied} applied, ${proposed - applied} pending — run portal patch to review the rest.`);
156
237
  }
157
238
  else {
158
- info("No patches generated.");
239
+ success(`${proposed} patch${proposed !== 1 ? "es" : ""} queued — run portal patch to review and apply.`);
159
240
  }
160
241
  blank();
161
242
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-cmd.js","sourceRoot":"","sources":["../../src/commands/agent-cmd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-cmd.js","sourceRoot":"","sources":["../../src/commands/agent-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Load agent definitions from a Portal project's agents/ directory.
3
+ *
4
+ * Mirrors the contract loader's philosophy (see utils/contract.ts): we extract
5
+ * the `defineAgent({ ... })` object literal and evaluate just that object rather
6
+ * than executing the whole module. AgentDefinition is a flat object, so this is
7
+ * safe and predictable.
8
+ */
9
+ import type { AgentDefinition } from "@interchained/portal-contract";
10
+ export declare function agentsDirExists(agentsDir: string): Promise<boolean>;
11
+ /** List the *.agent.ts / *.agent.js files in agents/. */
12
+ export declare function findAgentFiles(agentsDir: string): Promise<string[]>;
13
+ /**
14
+ * Resolve a user-supplied name to an agent file.
15
+ * Prefers an exact `<name>.agent.{ts,js}` match, then a substring match.
16
+ */
17
+ export declare function matchAgentFile(files: string[], name: string): string | null;
18
+ /** Load and parse a single agent definition file. */
19
+ export declare function loadAgent(filePath: string): Promise<AgentDefinition>;
20
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASzE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3E;AAED,qDAAqD;AACrD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2B1E"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Load agent definitions from a Portal project's agents/ directory.
3
+ *
4
+ * Mirrors the contract loader's philosophy (see utils/contract.ts): we extract
5
+ * the `defineAgent({ ... })` object literal and evaluate just that object rather
6
+ * than executing the whole module. AgentDefinition is a flat object, so this is
7
+ * safe and predictable.
8
+ */
9
+ import { readFile, readdir, access } from "node:fs/promises";
10
+ import { basename, extname } from "node:path";
11
+ export async function agentsDirExists(agentsDir) {
12
+ try {
13
+ await access(agentsDir);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ /** List the *.agent.ts / *.agent.js files in agents/. */
21
+ export async function findAgentFiles(agentsDir) {
22
+ try {
23
+ const entries = await readdir(agentsDir);
24
+ return entries
25
+ .filter((f) => f.endsWith(".agent.ts") || f.endsWith(".agent.js"))
26
+ .sort();
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ /**
33
+ * Resolve a user-supplied name to an agent file.
34
+ * Prefers an exact `<name>.agent.{ts,js}` match, then a substring match.
35
+ */
36
+ export function matchAgentFile(files, name) {
37
+ return (files.find((f) => f === `${name}.agent.ts` || f === `${name}.agent.js`) ??
38
+ files.find((f) => f.includes(name)) ??
39
+ null);
40
+ }
41
+ /** Load and parse a single agent definition file. */
42
+ export async function loadAgent(filePath) {
43
+ const fallbackName = basename(filePath, extname(filePath)).replace(/\.agent$/, "");
44
+ let src;
45
+ try {
46
+ src = await readFile(filePath, "utf-8");
47
+ }
48
+ catch {
49
+ return { name: fallbackName, task: "" };
50
+ }
51
+ // Extraction patterns, most specific first.
52
+ const objSrc = src.match(/defineAgent\s*\(\s*(\{[\s\S]*?\})\s*\)/)?.[1] ??
53
+ src.match(/export\s+default\s+(\{[\s\S]*\})\s*;?\s*$/)?.[1] ??
54
+ src.match(/const\s+\w+\s*(?::\s*AgentDefinition)?\s*=\s*(\{[\s\S]*?\})\s*;?\s*$/m)?.[1];
55
+ if (!objSrc)
56
+ return { name: fallbackName, task: "" };
57
+ try {
58
+ const def = evalAgentObject(objSrc);
59
+ return {
60
+ ...def,
61
+ name: typeof def.name === "string" && def.name.trim() ? def.name : fallbackName,
62
+ task: typeof def.task === "string" ? def.task : "",
63
+ };
64
+ }
65
+ catch {
66
+ return { name: fallbackName, task: "" };
67
+ }
68
+ }
69
+ function evalAgentObject(src) {
70
+ const cleaned = src
71
+ .replace(/\s+as\s+\w[\w.]*(\[\])?/g, "")
72
+ .replace(/\s+satisfies\s+\w[\w.]*/g, "");
73
+ const fn = new Function(`return (${cleaned})`);
74
+ const raw = fn();
75
+ if (typeof raw !== "object" || raw === null) {
76
+ throw new Error("agent file must export a defineAgent({ ... }) object");
77
+ }
78
+ return raw;
79
+ }
80
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interchained/portal-cli",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "Portal CLI — dev, build, serve, compress, audit, improve, generate, guard",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "author": "Interchained <dev@interchained.org>",