@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 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/commands/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6CH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BnE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal adapter add <name> — add a deployment/runtime adapter config.
|
|
3
|
+
*/
|
|
4
|
+
import { writeFile, mkdir, access } from "node:fs/promises";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { banner, success, fail, info, blank } from "../utils/print.js";
|
|
7
|
+
const ADAPTER_CONFIGS = {
|
|
8
|
+
static: `// Portal Static Adapter Config
|
|
9
|
+
// Build: portal build
|
|
10
|
+
// Output: dist/
|
|
11
|
+
// Deploy dist/ to any static host.
|
|
12
|
+
export const adapter = {
|
|
13
|
+
type: "static",
|
|
14
|
+
outDir: "dist",
|
|
15
|
+
// Add a base path if deploying to a sub-path: base: "/my-app"
|
|
16
|
+
};
|
|
17
|
+
`,
|
|
18
|
+
node: `// Portal Node.js Adapter Config
|
|
19
|
+
// Build: portal build
|
|
20
|
+
// Run: node dist/server.js
|
|
21
|
+
// PORT env var controls the port (default 3000).
|
|
22
|
+
export const adapter = {
|
|
23
|
+
type: "node",
|
|
24
|
+
outDir: "dist",
|
|
25
|
+
port: Number(process.env.PORT ?? 3000),
|
|
26
|
+
// hostname: "0.0.0.0",
|
|
27
|
+
};
|
|
28
|
+
`,
|
|
29
|
+
docker: `// Portal Docker Adapter Config
|
|
30
|
+
// Build image: docker build -t my-app .
|
|
31
|
+
// Run: docker run -p 3000:3000 my-app
|
|
32
|
+
// See Dockerfile at project root (created by portal deploy --adapter docker).
|
|
33
|
+
export const adapter = {
|
|
34
|
+
type: "docker",
|
|
35
|
+
image: "portal-app",
|
|
36
|
+
port: 3000,
|
|
37
|
+
};
|
|
38
|
+
`,
|
|
39
|
+
};
|
|
40
|
+
async function exists(p) {
|
|
41
|
+
try {
|
|
42
|
+
await access(p);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function adapterAddCommand(name) {
|
|
50
|
+
banner();
|
|
51
|
+
const root = process.cwd();
|
|
52
|
+
const known = Object.keys(ADAPTER_CONFIGS);
|
|
53
|
+
if (!known.includes(name)) {
|
|
54
|
+
fail(`Unknown adapter: "${name}"`);
|
|
55
|
+
info(`Available adapters: ${known.join(", ")}`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
const adaptersDir = join(root, "adapters");
|
|
59
|
+
await mkdir(adaptersDir, { recursive: true });
|
|
60
|
+
const outPath = join(adaptersDir, `${name}.adapter.ts`);
|
|
61
|
+
if (await exists(outPath)) {
|
|
62
|
+
info(`Adapter already exists: adapters/${name}.adapter.ts`);
|
|
63
|
+
blank();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await writeFile(outPath, ADAPTER_CONFIGS[name], "utf-8");
|
|
67
|
+
success(`Created: adapters/${name}.adapter.ts`);
|
|
68
|
+
info(`Run portal deploy --adapter ${name} to use it.`);
|
|
69
|
+
blank();
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/commands/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAE;;;;;;;;;CAST;IACC,IAAI,EAAE;;;;;;;;;;CAUP;IACC,MAAM,EAAE;;;;;;;;;CAST;CACA,CAAC;AAEF,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,MAAM,EAAE,CAAC;IAET,MAAM,IAAI,GAAM,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAK,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;IACxD,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,oCAAoC,IAAI,aAAa,CAAC,CAAC;QAC5D,KAAK,EAAE,CAAC;QACR,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAE,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,CAAC,qBAAqB,IAAI,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,+BAA+B,IAAI,aAAa,CAAC,CAAC;IACvD,KAAK,EAAE,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal agent list — list configured agents and their permissions
|
|
3
|
+
* portal agent run — run a specific agent task manually
|
|
4
|
+
*/
|
|
5
|
+
export declare function agentListCommand(): Promise<void>;
|
|
6
|
+
export declare function agentRunCommand(name: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=agent-cmd.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal agent list — list configured agents and their permissions
|
|
3
|
+
* portal agent run — run a specific agent task manually
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, readdir, access } from "node:fs/promises";
|
|
6
|
+
import { join, basename, extname } from "node:path";
|
|
7
|
+
import pc from "picocolors";
|
|
8
|
+
import ora from "ora";
|
|
9
|
+
import { Runner, Sentinel, PatchStore, createPatch } from "@interchained/portal-agent";
|
|
10
|
+
import { banner, header, success, fail, info, step, blank } from "../utils/print.js";
|
|
11
|
+
import { loadContract } from "../utils/contract.js";
|
|
12
|
+
async function exists(p) {
|
|
13
|
+
try {
|
|
14
|
+
await access(p);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// ── portal agent list ─────────────────────────────────────────────────────────
|
|
22
|
+
export async function agentListCommand() {
|
|
23
|
+
banner();
|
|
24
|
+
const root = process.cwd();
|
|
25
|
+
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.");
|
|
36
|
+
blank();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
header("Configured Agents");
|
|
40
|
+
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")}`);
|
|
54
|
+
blank();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── portal agent run ──────────────────────────────────────────────────────────
|
|
58
|
+
export async function agentRunCommand(name) {
|
|
59
|
+
banner();
|
|
60
|
+
const root = process.cwd();
|
|
61
|
+
const agentsDir = join(root, "agents");
|
|
62
|
+
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.");
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
if (!agentFile) {
|
|
78
|
+
fail(`Agent not found: "${name}"`);
|
|
79
|
+
info(`Run portal agent list to see available agents.`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
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)}`);
|
|
87
|
+
console.log(pc.dim(` Task: ${task}`));
|
|
88
|
+
console.log(pc.dim(` App: ${contract.name}`));
|
|
89
|
+
blank();
|
|
90
|
+
let runner;
|
|
91
|
+
try {
|
|
92
|
+
runner = new Runner();
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
fail("AIASSIST_API_KEY not set.");
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
const sentinel = new Sentinel();
|
|
99
|
+
const store = new PatchStore(root);
|
|
100
|
+
// Run the agent task against each route file
|
|
101
|
+
const routesDir = join(root, "routes");
|
|
102
|
+
let routeFiles = [];
|
|
103
|
+
try {
|
|
104
|
+
const entries = await readdir(routesDir, { recursive: true });
|
|
105
|
+
routeFiles = entries
|
|
106
|
+
.filter((f) => f.endsWith(".page.tsx") || f.endsWith(".page.jsx"))
|
|
107
|
+
.map((f) => join(routesDir, f));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
fail("No routes/ directory found.");
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
const contractSummary = `App: ${contract.name}\nGoals: ${contract.goals.join("; ")}`;
|
|
114
|
+
let patchCount = 0;
|
|
115
|
+
for (const filePath of routeFiles) {
|
|
116
|
+
const content = await readFile(filePath, "utf-8");
|
|
117
|
+
const rel = filePath.replace(root + "/", "");
|
|
118
|
+
const spinner = ora(` Processing ${rel}…`).start();
|
|
119
|
+
try {
|
|
120
|
+
const proposed = await runner.generatePatch({
|
|
121
|
+
filePath: rel,
|
|
122
|
+
originalContent: content,
|
|
123
|
+
finding: task,
|
|
124
|
+
contract: contractSummary,
|
|
125
|
+
});
|
|
126
|
+
spinner.stop();
|
|
127
|
+
const review = await sentinel.review({
|
|
128
|
+
contract,
|
|
129
|
+
filePath: rel,
|
|
130
|
+
original: content,
|
|
131
|
+
proposed,
|
|
132
|
+
agentTask: task,
|
|
133
|
+
});
|
|
134
|
+
const patch = createPatch({
|
|
135
|
+
agent: name,
|
|
136
|
+
file: rel,
|
|
137
|
+
original: content,
|
|
138
|
+
proposed,
|
|
139
|
+
reason: task,
|
|
140
|
+
requiresApproval: true,
|
|
141
|
+
sentinelApproved: review.approved,
|
|
142
|
+
sentinelSummary: review.summary,
|
|
143
|
+
sentinelViolations: review.violations,
|
|
144
|
+
});
|
|
145
|
+
await store.save(patch);
|
|
146
|
+
patchCount++;
|
|
147
|
+
step(`Patch saved for ${rel} — run portal patch to review`);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
spinner.stop();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
blank();
|
|
154
|
+
if (patchCount > 0) {
|
|
155
|
+
success(`${patchCount} patch${patchCount !== 1 ? "es" : ""} queued — run portal patch to review and apply`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
info("No patches generated.");
|
|
159
|
+
}
|
|
160
|
+
blank();
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=agent-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cmd.js","sourceRoot":"","sources":["../../src/commands/agent-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal audit — runs all checks against the app contract and reports findings.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* portal audit
|
|
6
|
+
* portal audit --ai (uses AiAssist for deeper analysis)
|
|
7
|
+
* portal audit --json (JSON output)
|
|
8
|
+
* portal audit --category seo
|
|
9
|
+
*/
|
|
10
|
+
import { type CheckCategory } from "@interchained/portal-agent";
|
|
11
|
+
export interface AuditOptions {
|
|
12
|
+
ai?: boolean;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
category?: CheckCategory;
|
|
15
|
+
routesDir?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function auditCommand(opts?: AuditOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AAIpC,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EzE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal audit — runs all checks against the app contract and reports findings.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* portal audit
|
|
6
|
+
* portal audit --ai (uses AiAssist for deeper analysis)
|
|
7
|
+
* portal audit --json (JSON output)
|
|
8
|
+
* portal audit --category seo
|
|
9
|
+
*/
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import ora from "ora";
|
|
12
|
+
import pc from "picocolors";
|
|
13
|
+
import { runAudit, Runner, } from "@interchained/portal-agent";
|
|
14
|
+
import { banner, header, icon, summaryLine, info, blank } from "../utils/print.js";
|
|
15
|
+
import { loadContract } from "../utils/contract.js";
|
|
16
|
+
export async function auditCommand(opts = {}) {
|
|
17
|
+
if (!opts.json)
|
|
18
|
+
banner();
|
|
19
|
+
const root = process.cwd();
|
|
20
|
+
const contract = await loadContract(root);
|
|
21
|
+
const routesDir = opts.routesDir ?? join(root, "routes");
|
|
22
|
+
if (!opts.json) {
|
|
23
|
+
info(`Auditing: ${pc.bold(contract.name)}`);
|
|
24
|
+
info(`Routes: ${routesDir}`);
|
|
25
|
+
blank();
|
|
26
|
+
}
|
|
27
|
+
let runner;
|
|
28
|
+
if (opts.ai) {
|
|
29
|
+
try {
|
|
30
|
+
runner = new Runner();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
if (!opts.json) {
|
|
34
|
+
console.log(pc.yellow("⚠ AI checks disabled — set AIASSIST_API_KEY to enable"));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const spinner = opts.json ? null : ora("Running checks…").start();
|
|
39
|
+
const report = await runAudit(contract, routesDir, {
|
|
40
|
+
ai: opts.ai && !!runner,
|
|
41
|
+
runner,
|
|
42
|
+
});
|
|
43
|
+
spinner?.stop();
|
|
44
|
+
if (opts.json) {
|
|
45
|
+
console.log(JSON.stringify(report, null, 2));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Group by category
|
|
49
|
+
const categories = ["seo", "cta", "links", "brand", "accessibility"];
|
|
50
|
+
const byCategory = new Map();
|
|
51
|
+
for (const cat of categories) {
|
|
52
|
+
const findings = report.findings.filter((f) => f.category === cat && (!opts.category || opts.category === cat));
|
|
53
|
+
if (findings.length > 0)
|
|
54
|
+
byCategory.set(cat, findings);
|
|
55
|
+
}
|
|
56
|
+
if (byCategory.size === 0) {
|
|
57
|
+
console.log(pc.green("✓ All checks passed — no issues found."));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const [cat, findings] of byCategory) {
|
|
61
|
+
header(cat.toUpperCase());
|
|
62
|
+
for (const f of findings) {
|
|
63
|
+
const statusIcon = f.status === "pass" ? icon.pass :
|
|
64
|
+
f.status === "warn" ? icon.warn :
|
|
65
|
+
icon.fail;
|
|
66
|
+
console.log(`${statusIcon} ${pc.bold(f.file)}`);
|
|
67
|
+
console.log(` ${f.message}`);
|
|
68
|
+
if (f.suggestion) {
|
|
69
|
+
console.log(` ${pc.dim("Fix: ")}${pc.dim(f.suggestion)}`);
|
|
70
|
+
}
|
|
71
|
+
blank();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
summaryLine(report.summary.pass, report.summary.warn, report.summary.fail);
|
|
75
|
+
blank();
|
|
76
|
+
if (report.summary.fail > 0) {
|
|
77
|
+
console.log(pc.dim(`Run ${pc.white("portal improve")} to auto-fix these issues.`));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal build — builds the Portal app for production.
|
|
3
|
+
*/
|
|
4
|
+
export interface BuildOptions {
|
|
5
|
+
outDir?: string;
|
|
6
|
+
mode?: string;
|
|
7
|
+
ssr?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildCommand(opts?: BuildOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal build — builds the Portal app for production.
|
|
3
|
+
*/
|
|
4
|
+
import { execa } from "execa";
|
|
5
|
+
import pc from "picocolors";
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
import { banner, success, fail } from "../utils/print.js";
|
|
8
|
+
export async function buildCommand(opts = {}) {
|
|
9
|
+
banner();
|
|
10
|
+
const root = process.cwd();
|
|
11
|
+
const spinner = ora("Building Portal app…").start();
|
|
12
|
+
const args = ["vite", "build"];
|
|
13
|
+
if (opts.outDir)
|
|
14
|
+
args.push("--outDir", opts.outDir);
|
|
15
|
+
if (opts.mode)
|
|
16
|
+
args.push("--mode", opts.mode);
|
|
17
|
+
if (opts.ssr)
|
|
18
|
+
args.push("--ssr", "src/entry-server.tsx");
|
|
19
|
+
try {
|
|
20
|
+
await execa("npx", args, {
|
|
21
|
+
cwd: root,
|
|
22
|
+
env: { ...process.env, FORCE_COLOR: "1" },
|
|
23
|
+
});
|
|
24
|
+
spinner.stop();
|
|
25
|
+
success("Build complete");
|
|
26
|
+
console.log(pc.dim(` Output: ${opts.outDir ?? "dist/"}`));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
spinner.stop();
|
|
30
|
+
fail("Build failed");
|
|
31
|
+
console.error(pc.red(err.message));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQ1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB,EAAE;IACxD,MAAM,EAAE,CAAC;IAET,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,IAAI;QAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG;QAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YACvB,GAAG,EAAE,IAAI;YACT,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;SAC1C,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,CAAC,cAAc,CAAC,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portal contract validate — validate all contract files
|
|
3
|
+
* portal contract init — scaffold default contracts for existing apps
|
|
4
|
+
*/
|
|
5
|
+
export declare function contractValidateCommand(): Promise<void>;
|
|
6
|
+
export declare function contractInitCommand(): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=contract-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/contract-cmd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4F7D;AAuDD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DzD"}
|