@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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load app.contract.ts from a Portal project.
|
|
3
|
+
* Uses a simple regex-based extraction since we can't dynamically import TS at runtime.
|
|
4
|
+
* For full evaluation, we'd use jiti/tsx — but for MVP we parse the exported object.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, access } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { validateContract } from "@interchained/portal-contract";
|
|
9
|
+
const CANDIDATE_PATHS = [
|
|
10
|
+
"app.contract.ts",
|
|
11
|
+
"app.contract.js",
|
|
12
|
+
"portal.contract.ts",
|
|
13
|
+
"portal.contract.js",
|
|
14
|
+
];
|
|
15
|
+
export async function findContractPath(root) {
|
|
16
|
+
for (const candidate of CANDIDATE_PATHS) {
|
|
17
|
+
const full = join(root, candidate);
|
|
18
|
+
try {
|
|
19
|
+
await access(full);
|
|
20
|
+
return full;
|
|
21
|
+
}
|
|
22
|
+
catch { /* continue */ }
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load a contract from a Portal project.
|
|
28
|
+
* Attempts to read and evaluate the contract file.
|
|
29
|
+
* Falls back to a safe empty contract if not found.
|
|
30
|
+
*/
|
|
31
|
+
export async function loadContract(root = process.cwd()) {
|
|
32
|
+
const contractPath = await findContractPath(root);
|
|
33
|
+
if (!contractPath) {
|
|
34
|
+
return { name: "Portal App", goals: [] };
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const src = await readFile(contractPath, "utf-8");
|
|
38
|
+
// Extract the object passed to defineApp() using a simple heuristic.
|
|
39
|
+
// This is intentionally dumb — the contract file should be static data, not logic.
|
|
40
|
+
const match = src.match(/defineApp\(\s*(\{[\s\S]*?\})\s*\)/);
|
|
41
|
+
if (!match) {
|
|
42
|
+
return { name: "Portal App", goals: [] };
|
|
43
|
+
}
|
|
44
|
+
// Safe eval via Function constructor (no side effects in contract files)
|
|
45
|
+
const fn = new Function(`return (${match[1]})`);
|
|
46
|
+
const raw = fn();
|
|
47
|
+
return validateContract(raw);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { name: "Portal App", goals: [] };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/utils/contract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAoB,MAAM,+BAA+B,CAAC;AAEnF,MAAM,eAAe,GAAG;IACtB,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;IACrD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAElD,qEAAqE;QACrE,mFAAmF;QACnF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC3C,CAAC;QAED,yEAAyE;QACzE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,EAAE,EAAa,CAAC;QAC5B,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal output helpers — consistent Portal CLI style.
|
|
3
|
+
*/
|
|
4
|
+
export declare const icon: {
|
|
5
|
+
pass: string;
|
|
6
|
+
warn: string;
|
|
7
|
+
fail: string;
|
|
8
|
+
info: string;
|
|
9
|
+
arrow: string;
|
|
10
|
+
dot: string;
|
|
11
|
+
spark: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function header(text: string): void;
|
|
14
|
+
export declare function success(text: string): void;
|
|
15
|
+
export declare function warn(text: string): void;
|
|
16
|
+
export declare function fail(text: string): void;
|
|
17
|
+
export declare function info(text: string): void;
|
|
18
|
+
export declare function step(text: string): void;
|
|
19
|
+
export declare function blank(): void;
|
|
20
|
+
export declare function banner(): void;
|
|
21
|
+
export declare function summaryLine(pass: number, warn: number, fail: number): void;
|
|
22
|
+
//# sourceMappingURL=print.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../../src/utils/print.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,IAAI;;;;;;;;CAQhB,CAAC;AAEF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGzC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,KAAK,IAAI,IAAI,CAE5B;AAED,wBAAgB,MAAM,IAAI,IAAI,CAM7B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAO1E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal output helpers — consistent Portal CLI style.
|
|
3
|
+
*/
|
|
4
|
+
import pc from "picocolors";
|
|
5
|
+
export const icon = {
|
|
6
|
+
pass: pc.green("✓"),
|
|
7
|
+
warn: pc.yellow("⚠"),
|
|
8
|
+
fail: pc.red("✗"),
|
|
9
|
+
info: pc.cyan("ℹ"),
|
|
10
|
+
arrow: pc.dim("→"),
|
|
11
|
+
dot: pc.dim("·"),
|
|
12
|
+
spark: pc.yellow("⚡"),
|
|
13
|
+
};
|
|
14
|
+
export function header(text) {
|
|
15
|
+
console.log("\n" + pc.bold(pc.cyan(text)));
|
|
16
|
+
console.log(pc.dim("─".repeat(Math.min(text.length + 2, 60))));
|
|
17
|
+
}
|
|
18
|
+
export function success(text) {
|
|
19
|
+
console.log(`${icon.pass} ${text}`);
|
|
20
|
+
}
|
|
21
|
+
export function warn(text) {
|
|
22
|
+
console.log(`${icon.warn} ${pc.yellow(text)}`);
|
|
23
|
+
}
|
|
24
|
+
export function fail(text) {
|
|
25
|
+
console.log(`${icon.fail} ${pc.red(text)}`);
|
|
26
|
+
}
|
|
27
|
+
export function info(text) {
|
|
28
|
+
console.log(`${icon.info} ${pc.dim(text)}`);
|
|
29
|
+
}
|
|
30
|
+
export function step(text) {
|
|
31
|
+
console.log(`${icon.arrow} ${text}`);
|
|
32
|
+
}
|
|
33
|
+
export function blank() {
|
|
34
|
+
console.log();
|
|
35
|
+
}
|
|
36
|
+
export function banner() {
|
|
37
|
+
console.log(pc.bold(`\n ${pc.cyan("⬡")} ${pc.white("Portal")} ${pc.dim("by Interchained")} ${pc.dim("─")} ${pc.dim("agent-native web framework")}\n`));
|
|
38
|
+
}
|
|
39
|
+
export function summaryLine(pass, warn, fail) {
|
|
40
|
+
const parts = [
|
|
41
|
+
pass > 0 ? pc.green(`${pass} passed`) : null,
|
|
42
|
+
warn > 0 ? pc.yellow(`${warn} warnings`) : null,
|
|
43
|
+
fail > 0 ? pc.red(`${fail} failed`) : null,
|
|
44
|
+
].filter(Boolean);
|
|
45
|
+
console.log("\n" + pc.bold("Summary: ") + parts.join(pc.dim(" · ")));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=print.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.js","sourceRoot":"","sources":["../../src/utils/print.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@interchained/portal-cli",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Portal CLI — dev, build, audit, improve, generate, guard",
|
|
5
|
+
"license": "GPL-3.0-or-later",
|
|
6
|
+
"author": "Interchained <dev@interchained.org>",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"portal": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"commander": "^12.0.0",
|
|
18
|
+
"picocolors": "^1.0.1",
|
|
19
|
+
"ora": "^8.0.1",
|
|
20
|
+
"prompts": "^2.4.2",
|
|
21
|
+
"execa": "^8.0.1",
|
|
22
|
+
"vite": "^5.2.0",
|
|
23
|
+
"@interchained/portal-core": "0.1.1",
|
|
24
|
+
"@interchained/portal-agent": "0.1.1",
|
|
25
|
+
"@interchained/portal-contract": "0.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^20.12.7",
|
|
29
|
+
"@types/prompts": "^2.4.9",
|
|
30
|
+
"typescript": "^5.4.5"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"dev": "tsc --watch",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"clean": "rm -rf dist"
|
|
43
|
+
}
|
|
44
|
+
}
|