@interchained/portal-cli 0.1.1
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/dist/commands/adapter.d.ts +5 -0
- package/dist/commands/adapter.d.ts.map +1 -0
- package/dist/commands/adapter.js +71 -0
- package/dist/commands/adapter.js.map +1 -0
- package/dist/commands/agent-cmd.d.ts +7 -0
- package/dist/commands/agent-cmd.d.ts.map +1 -0
- package/dist/commands/agent-cmd.js +162 -0
- package/dist/commands/agent-cmd.js.map +1 -0
- package/dist/commands/audit.d.ts +18 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +80 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/build.d.ts +10 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +35 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/contract-cmd.d.ts +7 -0
- package/dist/commands/contract-cmd.d.ts.map +1 -0
- package/dist/commands/contract-cmd.js +222 -0
- package/dist/commands/contract-cmd.js.map +1 -0
- package/dist/commands/deploy.d.ts +13 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +135 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +10 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +37 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +139 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.d.ts +6 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +75 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/generate.d.ts +13 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +222 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/guard.d.ts +12 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +71 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/improve.d.ts +18 -0
- package/dist/commands/improve.d.ts.map +1 -0
- package/dist/commands/improve.js +157 -0
- package/dist/commands/improve.js.map +1 -0
- package/dist/commands/lint.d.ts +5 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +87 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/patch.d.ts +5 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +78 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/preview.d.ts +4 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +26 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/rollback.d.ts +8 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +88 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/test.d.ts +7 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +57 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/contract.d.ts +14 -0
- package/dist/utils/contract.d.ts.map +1 -0
- package/dist/utils/contract.js +53 -0
- package/dist/utils/contract.js.map +1 -0
- package/dist/utils/print.d.ts +22 -0
- package/dist/utils/print.d.ts.map +1 -0
- package/dist/utils/print.js +47 -0
- package/dist/utils/print.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal explain <file> — explain a route, component, contract, or project
|
|
3
|
+
* structure in plain English using AI.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { join, extname } from "node:path";
|
|
7
|
+
import pc from "picocolors";
|
|
8
|
+
import ora from "ora";
|
|
9
|
+
import { AiAssistClient } from "@interchained/portal-agent";
|
|
10
|
+
import { banner, fail, blank } from "../utils/print.js";
|
|
11
|
+
import { loadContract } from "../utils/contract.js";
|
|
12
|
+
export async function explainCommand(target) {
|
|
13
|
+
banner();
|
|
14
|
+
const root = process.cwd();
|
|
15
|
+
const filePath = join(root, target);
|
|
16
|
+
let content;
|
|
17
|
+
try {
|
|
18
|
+
content = await readFile(filePath, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
fail(`Cannot read file: ${target}`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const contract = await loadContract(root);
|
|
25
|
+
const ext = extname(target);
|
|
26
|
+
const isContract = target.includes("contract");
|
|
27
|
+
const isAgent = target.includes("agent");
|
|
28
|
+
const fileType = isContract ? "app contract" :
|
|
29
|
+
isAgent ? "agent definition" :
|
|
30
|
+
ext === ".tsx" || ext === ".jsx" ? "React component/page" :
|
|
31
|
+
ext === ".ts" ? "TypeScript module" :
|
|
32
|
+
"file";
|
|
33
|
+
let client;
|
|
34
|
+
try {
|
|
35
|
+
client = AiAssistClient.fromEnv();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
fail("AIASSIST_API_KEY not set — portal explain requires AI.");
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const spinner = ora(`Explaining ${target}…`).start();
|
|
42
|
+
const systemPrompt = `You are a senior developer explaining code to a teammate.
|
|
43
|
+
Be clear, concrete, and direct. No jargon without explanation. Use plain paragraphs.
|
|
44
|
+
Reference the app contract context where relevant.
|
|
45
|
+
App: ${contract.name}
|
|
46
|
+
Goals: ${contract.goals.slice(0, 3).join("; ")}`;
|
|
47
|
+
const prompt = `Explain this ${fileType} in plain English.
|
|
48
|
+
Cover: what it does, why it exists, how it fits the app, and any notable patterns or gotchas.
|
|
49
|
+
Keep it to 3–5 paragraphs.
|
|
50
|
+
|
|
51
|
+
File: ${target}
|
|
52
|
+
\`\`\`${ext.slice(1)}
|
|
53
|
+
${content.slice(0, 6000)}
|
|
54
|
+
\`\`\``;
|
|
55
|
+
let explanation;
|
|
56
|
+
try {
|
|
57
|
+
explanation = await client.complete(prompt, systemPrompt, {
|
|
58
|
+
temperature: 0.4,
|
|
59
|
+
maxTokens: 1_500,
|
|
60
|
+
});
|
|
61
|
+
spinner.stop();
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
spinner.stop();
|
|
65
|
+
fail(`AI request failed: ${err.message}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
console.log();
|
|
69
|
+
console.log(pc.bold(pc.cyan(`Explanation: ${target}`)));
|
|
70
|
+
console.log(pc.dim("─".repeat(60)));
|
|
71
|
+
console.log();
|
|
72
|
+
console.log(explanation);
|
|
73
|
+
blank();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc;IACjD,MAAM,EAAE,CAAC;IAET,MAAM,IAAI,GAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEpC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAQ,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,QAAQ,GACZ,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,CAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACjC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;gBAC3D,GAAG,KAAK,KAAK,CAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;oBACtC,MAAM,CAAC;IAET,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,MAAM,YAAY,GAAG;;;OAGhB,QAAQ,CAAC,IAAI;SACX,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAG,gBAAgB,QAAQ;;;;QAIjC,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;EAClB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;OACjB,CAAC;IAEN,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE;YACxD,WAAW,EAAE,GAAG;YAChB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,CAAC,sBAAuB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal generate page <description>
|
|
3
|
+
* portal generate component <name>
|
|
4
|
+
* portal generate api <name>
|
|
5
|
+
*/
|
|
6
|
+
export type GenerateSubcommand = "page" | "landing" | "component" | "api";
|
|
7
|
+
export interface GenerateOptions {
|
|
8
|
+
route?: string;
|
|
9
|
+
auto?: boolean;
|
|
10
|
+
noSentinel?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function generateCommand(sub: GenerateSubcommand, description: string, opts?: GenerateOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAoDD,wBAAsB,eAAe,CACnC,GAAG,EAAE,kBAAkB,EACvB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CAmLf"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal generate page <description>
|
|
3
|
+
* portal generate component <name>
|
|
4
|
+
* portal generate api <name>
|
|
5
|
+
*/
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
8
|
+
import prompts from "prompts";
|
|
9
|
+
import pc from "picocolors";
|
|
10
|
+
import ora from "ora";
|
|
11
|
+
import { Runner, Sentinel, generateFromPrompt, applyPatch, PatchStore, } from "@interchained/portal-agent";
|
|
12
|
+
import { banner, header, success, fail, info, blank, icon } from "../utils/print.js";
|
|
13
|
+
import { loadContract } from "../utils/contract.js";
|
|
14
|
+
// ── Component generation prompt ───────────────────────────────────────────────
|
|
15
|
+
async function generateComponentSource(runner, name, description, colors, voice) {
|
|
16
|
+
return runner["client"]
|
|
17
|
+
? runner
|
|
18
|
+
.client.complete("", "")
|
|
19
|
+
.then(() => "")
|
|
20
|
+
.catch(() => "")
|
|
21
|
+
: runner["generateComponent" in runner
|
|
22
|
+
? "generateComponent"
|
|
23
|
+
: "generateComponent"]({
|
|
24
|
+
route: `/components/${name}`,
|
|
25
|
+
purpose: description,
|
|
26
|
+
brandVoice: voice,
|
|
27
|
+
colors,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// ── API route template ────────────────────────────────────────────────────────
|
|
31
|
+
function apiRouteTemplate(name) {
|
|
32
|
+
const fnName = name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
33
|
+
return `import type { Request, Response } from "express";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* API route: /api/${name}
|
|
37
|
+
* TODO: Implement this route handler.
|
|
38
|
+
*/
|
|
39
|
+
export async function ${fnName}Handler(req: Request, res: Response): Promise<void> {
|
|
40
|
+
try {
|
|
41
|
+
// Read from req.body, req.query, req.params as needed
|
|
42
|
+
const data = {};
|
|
43
|
+
|
|
44
|
+
res.json({ ok: true, data });
|
|
45
|
+
} catch (err) {
|
|
46
|
+
res.status(500).json({ ok: false, error: (err as Error).message });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
// ── Main generate command ─────────────────────────────────────────────────────
|
|
52
|
+
export async function generateCommand(sub, description, opts = {}) {
|
|
53
|
+
banner();
|
|
54
|
+
const root = process.cwd();
|
|
55
|
+
const contract = await loadContract(root);
|
|
56
|
+
const store = new PatchStore(root);
|
|
57
|
+
info(`Generating ${sub}: ${pc.bold(pc.white(description))}`);
|
|
58
|
+
info(`App: ${pc.bold(contract.name)}`);
|
|
59
|
+
blank();
|
|
60
|
+
// ── API route (no AI needed for scaffold) ────────────────────────────────
|
|
61
|
+
if (sub === "api") {
|
|
62
|
+
const slug = description.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
|
|
63
|
+
const apiDir = join(root, "api");
|
|
64
|
+
const outPath = join(apiDir, `${slug}.ts`);
|
|
65
|
+
await mkdir(apiDir, { recursive: true });
|
|
66
|
+
const source = apiRouteTemplate(slug);
|
|
67
|
+
if (!opts.auto) {
|
|
68
|
+
console.log(pc.dim("─── preview ─────────────────────────────────────────"));
|
|
69
|
+
source.split("\n").forEach((l) => console.log(pc.dim(" ") + l));
|
|
70
|
+
console.log(pc.dim("─────────────────────────────────────────────────────"));
|
|
71
|
+
blank();
|
|
72
|
+
const { choice } = await prompts({
|
|
73
|
+
type: "select",
|
|
74
|
+
name: "choice",
|
|
75
|
+
message: `Write to api/${slug}.ts?`,
|
|
76
|
+
choices: [
|
|
77
|
+
{ title: pc.green("✓ Yes"), value: "yes" },
|
|
78
|
+
{ title: pc.red("✗ No"), value: "no" },
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
if (choice !== "yes") {
|
|
82
|
+
info("Cancelled.");
|
|
83
|
+
blank();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await writeFile(outPath, source, "utf-8");
|
|
88
|
+
success(`Created: api/${slug}.ts`);
|
|
89
|
+
blank();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// ── Component (AI generation) ────────────────────────────────────────────
|
|
93
|
+
if (sub === "component") {
|
|
94
|
+
let runner;
|
|
95
|
+
try {
|
|
96
|
+
runner = new Runner();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
fail("AIASSIST_API_KEY not set.");
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
const spinner = ora(`Generating component "${description}"…`).start();
|
|
103
|
+
let source;
|
|
104
|
+
try {
|
|
105
|
+
source = await runner.generateComponent({
|
|
106
|
+
route: `/components/${description}`,
|
|
107
|
+
purpose: description,
|
|
108
|
+
brandVoice: contract.brand?.voice,
|
|
109
|
+
colors: contract.brand?.colors,
|
|
110
|
+
});
|
|
111
|
+
spinner.stop();
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
spinner.stop();
|
|
115
|
+
fail(`Generation failed: ${err.message}`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
const slug = description.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
|
|
119
|
+
const pascal = slug.split("-").map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join("");
|
|
120
|
+
const outDir = join(root, "src", "components");
|
|
121
|
+
const outFile = join(outDir, `${pascal}.tsx`);
|
|
122
|
+
const relPath = `src/components/${pascal}.tsx`;
|
|
123
|
+
console.log(pc.dim("─── preview ─────────────────────────────────────────"));
|
|
124
|
+
source.split("\n").slice(0, 30).forEach((l) => console.log(pc.dim(" ") + l));
|
|
125
|
+
console.log(pc.dim("─────────────────────────────────────────────────────"));
|
|
126
|
+
blank();
|
|
127
|
+
if (!opts.auto) {
|
|
128
|
+
const { choice } = await prompts({
|
|
129
|
+
type: "select",
|
|
130
|
+
name: "choice",
|
|
131
|
+
message: `Write to ${relPath}?`,
|
|
132
|
+
choices: [
|
|
133
|
+
{ title: pc.green("✓ Yes, write it"), value: "yes" },
|
|
134
|
+
{ title: pc.red("✗ Discard"), value: "no" },
|
|
135
|
+
],
|
|
136
|
+
});
|
|
137
|
+
if (choice !== "yes") {
|
|
138
|
+
info("Discarded.");
|
|
139
|
+
blank();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
await mkdir(outDir, { recursive: true });
|
|
144
|
+
await writeFile(outFile, source, "utf-8");
|
|
145
|
+
success(`Created: ${relPath}`);
|
|
146
|
+
blank();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// ── Page / landing (full runner+sentinel+patch flow) ─────────────────────
|
|
150
|
+
let runner;
|
|
151
|
+
try {
|
|
152
|
+
runner = new Runner();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
fail("AIASSIST_API_KEY not set — cannot generate pages.");
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
const sentinel = opts.noSentinel ? undefined : new Sentinel();
|
|
159
|
+
const spinner = ora(`Asking agent to generate "${description}"…`).start();
|
|
160
|
+
let result;
|
|
161
|
+
try {
|
|
162
|
+
result = await generateFromPrompt(description, {
|
|
163
|
+
runner, sentinel, contract, projectRoot: root,
|
|
164
|
+
route: opts.route,
|
|
165
|
+
requiresApproval: !opts.auto,
|
|
166
|
+
});
|
|
167
|
+
spinner.stop();
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
spinner.stop();
|
|
171
|
+
fail(`Generation failed: ${err.message}`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
const { patch, sentinelReview } = result;
|
|
175
|
+
await store.save(patch);
|
|
176
|
+
header(`Generated: ${patch.file}`);
|
|
177
|
+
blank();
|
|
178
|
+
if (sentinelReview) {
|
|
179
|
+
const si = sentinelReview.approved ? icon.pass : icon.warn;
|
|
180
|
+
console.log(`${si} Sentinel: ${sentinelReview.summary}`);
|
|
181
|
+
sentinelReview.violations.forEach((v) => console.log(` ${icon.fail} ${pc.red(v)}`));
|
|
182
|
+
blank();
|
|
183
|
+
}
|
|
184
|
+
console.log(pc.dim("─── preview ─────────────────────────────────────────"));
|
|
185
|
+
patch.proposed.split("\n").slice(0, 40).forEach((l) => console.log(pc.dim(" ") + l));
|
|
186
|
+
if (patch.proposed.split("\n").length > 40)
|
|
187
|
+
console.log(pc.dim(" …"));
|
|
188
|
+
console.log(pc.dim("─────────────────────────────────────────────────────"));
|
|
189
|
+
blank();
|
|
190
|
+
if (opts.auto) {
|
|
191
|
+
await applyPatch({ ...patch, status: "approved" }, root, store);
|
|
192
|
+
success(`Created: ${pc.bold(patch.file)}`);
|
|
193
|
+
info(`Run portal dev to see the new page.`);
|
|
194
|
+
blank();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const { choice } = await prompts({
|
|
198
|
+
type: "select",
|
|
199
|
+
name: "choice",
|
|
200
|
+
message: `Write to ${pc.bold(patch.file)}?`,
|
|
201
|
+
choices: [
|
|
202
|
+
{ title: pc.green("✓ Yes, write it"), value: "apply" },
|
|
203
|
+
{ title: pc.yellow("~ Save for later"), value: "save" },
|
|
204
|
+
{ title: pc.red("✗ Discard"), value: "discard" },
|
|
205
|
+
],
|
|
206
|
+
});
|
|
207
|
+
if (choice === "apply") {
|
|
208
|
+
await store.update(patch.id, { status: "approved" });
|
|
209
|
+
await applyPatch({ ...patch, status: "approved" }, root, store);
|
|
210
|
+
success(`Created: ${pc.bold(patch.file)}`);
|
|
211
|
+
info(`Run portal dev to see it.`);
|
|
212
|
+
}
|
|
213
|
+
else if (choice === "save") {
|
|
214
|
+
info(`Patch saved — run portal patch to apply later.`);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
await store.update(patch.id, { status: "rejected" });
|
|
218
|
+
info("Discarded.");
|
|
219
|
+
}
|
|
220
|
+
blank();
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal guard — safety check on pending patches before they touch the codebase.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* portal guard (check all pending patches)
|
|
6
|
+
* portal guard --apply (apply patches that pass all guard checks)
|
|
7
|
+
*/
|
|
8
|
+
export interface GuardOptions {
|
|
9
|
+
apply?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function guardCommand(opts?: GuardOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEzE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal guard — safety check on pending patches before they touch the codebase.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* portal guard (check all pending patches)
|
|
6
|
+
* portal guard --apply (apply patches that pass all guard checks)
|
|
7
|
+
*/
|
|
8
|
+
import pc from "picocolors";
|
|
9
|
+
import { guardAllPending, PatchStore, applyPatch } from "@interchained/portal-agent";
|
|
10
|
+
import { banner, header, success, fail, warn, info, blank, icon } from "../utils/print.js";
|
|
11
|
+
import { loadContract } from "../utils/contract.js";
|
|
12
|
+
export async function guardCommand(opts = {}) {
|
|
13
|
+
banner();
|
|
14
|
+
const root = process.cwd();
|
|
15
|
+
const contract = await loadContract(root);
|
|
16
|
+
const store = new PatchStore(root);
|
|
17
|
+
const patches = await store.list();
|
|
18
|
+
const pending = patches.filter((p) => p.status === "pending");
|
|
19
|
+
if (pending.length === 0) {
|
|
20
|
+
success("No pending patches to guard.");
|
|
21
|
+
blank();
|
|
22
|
+
info("Patches are created by portal generate and portal improve.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
info(`Checking ${pending.length} pending patch${pending.length !== 1 ? "es" : ""}…`);
|
|
26
|
+
blank();
|
|
27
|
+
const results = await guardAllPending(patches, contract);
|
|
28
|
+
let blocked = 0;
|
|
29
|
+
let cleared = 0;
|
|
30
|
+
for (const result of results) {
|
|
31
|
+
const patch = patches.find((p) => p.id === result.patchId);
|
|
32
|
+
header(`Patch: ${patch.file}`);
|
|
33
|
+
console.log(pc.dim(` Agent: ${patch.agent} · Reason: ${patch.reason}`));
|
|
34
|
+
blank();
|
|
35
|
+
const blockViolations = result.violations.filter((v) => v.severity === "block");
|
|
36
|
+
const warnViolations = result.violations.filter((v) => v.severity === "warn");
|
|
37
|
+
if (result.passed) {
|
|
38
|
+
cleared++;
|
|
39
|
+
success("Guard passed — no violations");
|
|
40
|
+
for (const v of warnViolations) {
|
|
41
|
+
warn(` ${v.rule}: ${v.message}`);
|
|
42
|
+
}
|
|
43
|
+
if (opts.apply) {
|
|
44
|
+
await store.update(patch.id, { status: "approved" });
|
|
45
|
+
await applyPatch({ ...patch, status: "approved" }, root, store);
|
|
46
|
+
success(`Applied: ${patch.file}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
info(`Run ${pc.white("portal guard --apply")} to apply cleared patches.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
blocked++;
|
|
54
|
+
fail(`Guard BLOCKED — ${blockViolations.length} violation${blockViolations.length !== 1 ? "s" : ""}`);
|
|
55
|
+
for (const v of blockViolations) {
|
|
56
|
+
console.log(` ${icon.fail} ${pc.bold(v.rule)}: ${pc.red(v.message)}`);
|
|
57
|
+
if (v.evidence)
|
|
58
|
+
console.log(pc.dim(` evidence: "${v.evidence}"`));
|
|
59
|
+
}
|
|
60
|
+
await store.update(patch.id, { status: "rejected" });
|
|
61
|
+
}
|
|
62
|
+
blank();
|
|
63
|
+
}
|
|
64
|
+
header("Guard Summary");
|
|
65
|
+
if (cleared > 0)
|
|
66
|
+
success(`${cleared} patch${cleared !== 1 ? "es" : ""} cleared`);
|
|
67
|
+
if (blocked > 0)
|
|
68
|
+
fail(`${blocked} patch${blocked !== 1 ? "es" : ""} blocked and rejected`);
|
|
69
|
+
blank();
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal improve — generates AI patches for audit findings, with human approval.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* portal improve
|
|
6
|
+
* portal improve --target seo
|
|
7
|
+
* portal improve --target accessibility
|
|
8
|
+
* portal improve --auto (apply without asking — use carefully)
|
|
9
|
+
*/
|
|
10
|
+
import { type CheckCategory } from "@interchained/portal-agent";
|
|
11
|
+
export interface ImproveOptions {
|
|
12
|
+
target?: CheckCategory;
|
|
13
|
+
auto?: boolean;
|
|
14
|
+
routesDir?: string;
|
|
15
|
+
noSentinel?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function improveCommand(opts?: ImproveOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=improve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improve.d.ts","sourceRoot":"","sources":["../../src/commands/improve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAQL,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AAMpC,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,cAAc,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJ7E"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal improve — generates AI patches for audit findings, with human approval.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* portal improve
|
|
6
|
+
* portal improve --target seo
|
|
7
|
+
* portal improve --target accessibility
|
|
8
|
+
* portal improve --auto (apply without asking — use carefully)
|
|
9
|
+
*/
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import prompts from "prompts";
|
|
12
|
+
import pc from "picocolors";
|
|
13
|
+
import ora from "ora";
|
|
14
|
+
import { runAudit, Runner, Sentinel, improveFromFindings, applyPatch, inlineDiff, PatchStore, } from "@interchained/portal-agent";
|
|
15
|
+
import { banner, header, success, fail, warn, info, blank, icon, } from "../utils/print.js";
|
|
16
|
+
import { loadContract } from "../utils/contract.js";
|
|
17
|
+
export async function improveCommand(opts = {}) {
|
|
18
|
+
banner();
|
|
19
|
+
const root = process.cwd();
|
|
20
|
+
const contract = await loadContract(root);
|
|
21
|
+
const routesDir = opts.routesDir ?? join(root, "routes");
|
|
22
|
+
const store = new PatchStore(root);
|
|
23
|
+
info(`Improving: ${pc.bold(contract.name)}`);
|
|
24
|
+
blank();
|
|
25
|
+
// 1. Run audit to get findings
|
|
26
|
+
const auditSpinner = ora("Running audit…").start();
|
|
27
|
+
const report = await runAudit(contract, routesDir, { ai: false });
|
|
28
|
+
auditSpinner.stop();
|
|
29
|
+
const actionable = report.findings.filter((f) => {
|
|
30
|
+
if (f.status === "pass")
|
|
31
|
+
return false;
|
|
32
|
+
if (opts.target && f.category !== opts.target)
|
|
33
|
+
return false;
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
if (actionable.length === 0) {
|
|
37
|
+
success("Nothing to improve — all checks passed!");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
info(`Found ${pc.bold(String(actionable.length))} issues to address.`);
|
|
41
|
+
blank();
|
|
42
|
+
// 2. Create AI clients
|
|
43
|
+
let runner;
|
|
44
|
+
try {
|
|
45
|
+
runner = new Runner();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
fail("AIASSIST_API_KEY not set — cannot generate improvements.");
|
|
49
|
+
info("Set AIASSIST_API_KEY or VITE_AIAS_API_KEY to enable AI improvements.");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const sentinel = opts.noSentinel ? undefined : new Sentinel();
|
|
53
|
+
// 3. Generate patches
|
|
54
|
+
const genSpinner = ora(`Generating patches for ${actionable.length} issues…`).start();
|
|
55
|
+
const results = await improveFromFindings(actionable, {
|
|
56
|
+
runner,
|
|
57
|
+
sentinel,
|
|
58
|
+
contract,
|
|
59
|
+
projectRoot: root,
|
|
60
|
+
target: opts.target ? [opts.target] : undefined,
|
|
61
|
+
requiresApproval: !opts.auto,
|
|
62
|
+
});
|
|
63
|
+
genSpinner.stop();
|
|
64
|
+
// 4. Review and apply
|
|
65
|
+
let applied = 0;
|
|
66
|
+
let rejected = 0;
|
|
67
|
+
let skipped = 0;
|
|
68
|
+
for (const result of results) {
|
|
69
|
+
if (result.skipped || !result.patch) {
|
|
70
|
+
warn(`Skipped: ${result.finding.file} — ${result.skipped ?? "no patch"}`);
|
|
71
|
+
skipped++;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const { patch, sentinelReview } = result;
|
|
75
|
+
// Save the patch to .portal/patches/
|
|
76
|
+
await store.save(patch);
|
|
77
|
+
header(`[${result.finding.category.toUpperCase()}] ${result.finding.file}`);
|
|
78
|
+
console.log(` ${pc.dim(result.finding.message)}`);
|
|
79
|
+
blank();
|
|
80
|
+
// Show sentinel review
|
|
81
|
+
if (sentinelReview) {
|
|
82
|
+
const sentinelIcon = sentinelReview.approved ? icon.pass : icon.warn;
|
|
83
|
+
console.log(`${sentinelIcon} Sentinel: ${sentinelReview.summary}`);
|
|
84
|
+
if (sentinelReview.violations.length > 0) {
|
|
85
|
+
for (const v of sentinelReview.violations) {
|
|
86
|
+
console.log(` ${icon.fail} ${pc.red(v)}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
blank();
|
|
90
|
+
}
|
|
91
|
+
// Show diff
|
|
92
|
+
console.log(pc.dim("─── diff ───────────────────────────────────────────"));
|
|
93
|
+
const diff = inlineDiff(patch.original, patch.proposed);
|
|
94
|
+
const diffLines = diff.split("\n").slice(0, 30);
|
|
95
|
+
for (const line of diffLines) {
|
|
96
|
+
if (line.startsWith("+ "))
|
|
97
|
+
console.log(pc.green(line));
|
|
98
|
+
else if (line.startsWith("- "))
|
|
99
|
+
console.log(pc.red(line));
|
|
100
|
+
else
|
|
101
|
+
console.log(pc.dim(line));
|
|
102
|
+
}
|
|
103
|
+
if (diff.split("\n").length > 30)
|
|
104
|
+
console.log(pc.dim(" … (truncated)"));
|
|
105
|
+
console.log(pc.dim("────────────────────────────────────────────────────"));
|
|
106
|
+
blank();
|
|
107
|
+
// Block if sentinel found violations
|
|
108
|
+
if (sentinelReview && !sentinelReview.approved && !opts.auto) {
|
|
109
|
+
warn("Sentinel rejected this patch — skipping.");
|
|
110
|
+
await store.update(patch.id, { status: "rejected" });
|
|
111
|
+
rejected++;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (opts.auto) {
|
|
115
|
+
await applyPatch({ ...patch, status: "approved" }, root, store);
|
|
116
|
+
success(`Applied: ${patch.file}`);
|
|
117
|
+
applied++;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const { choice } = await prompts({
|
|
121
|
+
type: "select",
|
|
122
|
+
name: "choice",
|
|
123
|
+
message: `Apply this patch to ${pc.bold(patch.file)}?`,
|
|
124
|
+
choices: [
|
|
125
|
+
{ title: pc.green("✓ Apply"), value: "apply" },
|
|
126
|
+
{ title: pc.yellow("~ Skip"), value: "skip" },
|
|
127
|
+
{ title: pc.red("✗ Reject"), value: "reject" },
|
|
128
|
+
],
|
|
129
|
+
});
|
|
130
|
+
if (choice === "apply") {
|
|
131
|
+
await store.update(patch.id, { status: "approved" });
|
|
132
|
+
await applyPatch({ ...patch, status: "approved" }, root, store);
|
|
133
|
+
success(`Applied: ${patch.file}`);
|
|
134
|
+
applied++;
|
|
135
|
+
}
|
|
136
|
+
else if (choice === "reject") {
|
|
137
|
+
await store.update(patch.id, { status: "rejected" });
|
|
138
|
+
warn(`Rejected: ${patch.file}`);
|
|
139
|
+
rejected++;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
info(`Skipped: ${patch.file} (patch saved to .portal/patches/${patch.id}.json)`);
|
|
143
|
+
skipped++;
|
|
144
|
+
}
|
|
145
|
+
blank();
|
|
146
|
+
}
|
|
147
|
+
// Summary
|
|
148
|
+
header("Done");
|
|
149
|
+
if (applied > 0)
|
|
150
|
+
success(`${applied} patch${applied !== 1 ? "es" : ""} applied`);
|
|
151
|
+
if (rejected > 0)
|
|
152
|
+
fail(`${rejected} patch${rejected !== 1 ? "es" : ""} rejected`);
|
|
153
|
+
if (skipped > 0)
|
|
154
|
+
info(`${skipped} skipped`);
|
|
155
|
+
blank();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=improve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improve.js","sourceRoot":"","sources":["../../src/commands/improve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAsEjD"}
|