pi-studio-opencode 0.1.0
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/ARCHITECTURE.md +122 -0
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/dist/demo-host-pi.d.ts +1 -0
- package/dist/demo-host-pi.js +71 -0
- package/dist/demo-host-pi.js.map +1 -0
- package/dist/demo-host.d.ts +1 -0
- package/dist/demo-host.js +154 -0
- package/dist/demo-host.js.map +1 -0
- package/dist/host-opencode-plugin.d.ts +52 -0
- package/dist/host-opencode-plugin.js +396 -0
- package/dist/host-opencode-plugin.js.map +1 -0
- package/dist/host-opencode.d.ts +154 -0
- package/dist/host-opencode.js +627 -0
- package/dist/host-opencode.js.map +1 -0
- package/dist/host-pi.d.ts +45 -0
- package/dist/host-pi.js +258 -0
- package/dist/host-pi.js.map +1 -0
- package/dist/install-config.d.ts +36 -0
- package/dist/install-config.js +136 -0
- package/dist/install-config.js.map +1 -0
- package/dist/install.d.ts +16 -0
- package/dist/install.js +168 -0
- package/dist/install.js.map +1 -0
- package/dist/launcher.d.ts +2 -0
- package/dist/launcher.js +124 -0
- package/dist/launcher.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +732 -0
- package/dist/main.js.map +1 -0
- package/dist/mock-pi-session.d.ts +27 -0
- package/dist/mock-pi-session.js +138 -0
- package/dist/mock-pi-session.js.map +1 -0
- package/dist/open-browser.d.ts +1 -0
- package/dist/open-browser.js +29 -0
- package/dist/open-browser.js.map +1 -0
- package/dist/opencode-plugin.d.ts +3 -0
- package/dist/opencode-plugin.js +326 -0
- package/dist/opencode-plugin.js.map +1 -0
- package/dist/prototype-pdf.d.ts +12 -0
- package/dist/prototype-pdf.js +991 -0
- package/dist/prototype-pdf.js.map +1 -0
- package/dist/prototype-server.d.ts +88 -0
- package/dist/prototype-server.js +1002 -0
- package/dist/prototype-server.js.map +1 -0
- package/dist/prototype-theme.d.ts +36 -0
- package/dist/prototype-theme.js +1471 -0
- package/dist/prototype-theme.js.map +1 -0
- package/dist/studio-core.d.ts +63 -0
- package/dist/studio-core.js +251 -0
- package/dist/studio-core.js.map +1 -0
- package/dist/studio-host-types.d.ts +50 -0
- package/dist/studio-host-types.js +14 -0
- package/dist/studio-host-types.js.map +1 -0
- package/examples/opencode/INSTALL.md +67 -0
- package/examples/opencode/opencode.local-path.jsonc +16 -0
- package/package.json +68 -0
- package/static/prototype.css +1277 -0
- package/static/prototype.html +173 -0
- package/static/prototype.js +3198 -0
package/dist/install.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { DEFAULT_STUDIO_COMMAND_NAME, formatOpencodeConfig, mergePiStudioOpencodeIntoConfig, parseOpencodeConfigText, } from "./install-config.js";
|
|
5
|
+
const DEFAULT_PUBLISHED_PLUGIN_SPEC = "pi-studio-opencode@latest";
|
|
6
|
+
const DEFAULT_PACKAGE_NAME = "pi-studio-opencode";
|
|
7
|
+
function expandHome(input) {
|
|
8
|
+
if (!input)
|
|
9
|
+
return input;
|
|
10
|
+
if (input === "~")
|
|
11
|
+
return homedir();
|
|
12
|
+
if (input.startsWith("~/"))
|
|
13
|
+
return join(homedir(), input.slice(2));
|
|
14
|
+
return input;
|
|
15
|
+
}
|
|
16
|
+
function getXdgConfigDirectory() {
|
|
17
|
+
const configured = String(process.env.XDG_CONFIG_HOME ?? "").trim();
|
|
18
|
+
return configured || join(homedir(), ".config");
|
|
19
|
+
}
|
|
20
|
+
async function pathExists(path) {
|
|
21
|
+
try {
|
|
22
|
+
await stat(path);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function pickExistingConfigPath(candidates) {
|
|
30
|
+
for (const candidate of candidates) {
|
|
31
|
+
if (await pathExists(candidate)) {
|
|
32
|
+
return candidate;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return candidates[0];
|
|
36
|
+
}
|
|
37
|
+
async function resolveInstallConfigPath(options) {
|
|
38
|
+
if (options.configPath) {
|
|
39
|
+
return { path: resolve(expandHome(options.configPath)), scope: "explicit" };
|
|
40
|
+
}
|
|
41
|
+
if (options.projectDir) {
|
|
42
|
+
const directory = resolve(expandHome(options.projectDir));
|
|
43
|
+
return {
|
|
44
|
+
path: await pickExistingConfigPath([
|
|
45
|
+
join(directory, ".opencode", "opencode.jsonc"),
|
|
46
|
+
join(directory, ".opencode", "opencode.json"),
|
|
47
|
+
]),
|
|
48
|
+
scope: "project",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const configDir = getXdgConfigDirectory();
|
|
52
|
+
return {
|
|
53
|
+
path: await pickExistingConfigPath([
|
|
54
|
+
join(configDir, "opencode", "opencode.jsonc"),
|
|
55
|
+
join(configDir, "opencode", "opencode.json"),
|
|
56
|
+
]),
|
|
57
|
+
scope: "user",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function readExistingConfig(path) {
|
|
61
|
+
try {
|
|
62
|
+
return parseOpencodeConfigText(await readFile(path, "utf8"));
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
66
|
+
if (message.includes("ENOENT")) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`Failed to read OpenCode config at ${path}: ${message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function installPiStudioOpencode(options) {
|
|
73
|
+
const target = await resolveInstallConfigPath(options);
|
|
74
|
+
const config = await readExistingConfig(target.path);
|
|
75
|
+
const result = mergePiStudioOpencodeIntoConfig(config, {
|
|
76
|
+
pluginSpec: options.pluginSpec,
|
|
77
|
+
packageName: options.packageName,
|
|
78
|
+
commandName: options.commandName,
|
|
79
|
+
});
|
|
80
|
+
if (result.changed || !(await pathExists(target.path))) {
|
|
81
|
+
await mkdir(dirname(target.path), { recursive: true });
|
|
82
|
+
await writeFile(target.path, formatOpencodeConfig(result.config), "utf8");
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
...result,
|
|
86
|
+
configPath: target.path,
|
|
87
|
+
scope: target.scope,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function printInstallUsageAndExit() {
|
|
91
|
+
console.log(`Usage: pi-studio-opencode install [options]
|
|
92
|
+
|
|
93
|
+
Options:
|
|
94
|
+
--project [path] Install into .opencode/opencode.jsonc for the current directory or the given path
|
|
95
|
+
--config <path> Install into an explicit OpenCode config file
|
|
96
|
+
--plugin <spec> Plugin spec to write (default: ${DEFAULT_PUBLISHED_PLUGIN_SPEC})
|
|
97
|
+
--help, -h Show this help
|
|
98
|
+
`);
|
|
99
|
+
process.exit(0);
|
|
100
|
+
}
|
|
101
|
+
export function parseInstallArgs(argv) {
|
|
102
|
+
const options = {
|
|
103
|
+
pluginSpec: DEFAULT_PUBLISHED_PLUGIN_SPEC,
|
|
104
|
+
packageName: DEFAULT_PACKAGE_NAME,
|
|
105
|
+
commandName: DEFAULT_STUDIO_COMMAND_NAME,
|
|
106
|
+
};
|
|
107
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
108
|
+
const arg = argv[i];
|
|
109
|
+
const next = argv[i + 1];
|
|
110
|
+
if (arg === "--project") {
|
|
111
|
+
if (options.configPath) {
|
|
112
|
+
throw new Error("Use either --project or --config, not both.");
|
|
113
|
+
}
|
|
114
|
+
if (next && !next.startsWith("-")) {
|
|
115
|
+
options.projectDir = next;
|
|
116
|
+
i += 1;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
options.projectDir = process.cwd();
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (arg === "--config" && next) {
|
|
124
|
+
if (options.projectDir) {
|
|
125
|
+
throw new Error("Use either --project or --config, not both.");
|
|
126
|
+
}
|
|
127
|
+
options.configPath = next;
|
|
128
|
+
i += 1;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (arg === "--plugin" && next) {
|
|
132
|
+
options.pluginSpec = next;
|
|
133
|
+
i += 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (arg === "--help" || arg === "-h") {
|
|
137
|
+
printInstallUsageAndExit();
|
|
138
|
+
}
|
|
139
|
+
throw new Error(`Unknown install argument: ${arg}`);
|
|
140
|
+
}
|
|
141
|
+
return options;
|
|
142
|
+
}
|
|
143
|
+
export async function runInstallCli(argv) {
|
|
144
|
+
const options = parseInstallArgs(argv);
|
|
145
|
+
const result = await installPiStudioOpencode(options);
|
|
146
|
+
console.log(`Updated OpenCode config: ${result.configPath}`);
|
|
147
|
+
console.log(`Scope: ${result.scope}`);
|
|
148
|
+
if (result.addedPlugin) {
|
|
149
|
+
console.log(`Added plugin: ${options.pluginSpec}`);
|
|
150
|
+
}
|
|
151
|
+
else if (result.existingPluginSpec) {
|
|
152
|
+
console.log(`Plugin already configured: ${result.existingPluginSpec}`);
|
|
153
|
+
}
|
|
154
|
+
if (result.addedCommand) {
|
|
155
|
+
console.log(`Added /${options.commandName} command.`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(`/${options.commandName} command already present.`);
|
|
159
|
+
}
|
|
160
|
+
if (result.setSchema) {
|
|
161
|
+
console.log("Set OpenCode config schema.");
|
|
162
|
+
}
|
|
163
|
+
if (!result.changed) {
|
|
164
|
+
console.log("No changes were needed.");
|
|
165
|
+
}
|
|
166
|
+
console.log("Restart OpenCode, then run /studio from an active session.");
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,GAGxB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,6BAA6B,GAAG,2BAA2B,CAAC;AAClE,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAelD,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,OAAO,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,UAAoB;IACxD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,CAAE,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,OAAuB;IAC7D,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1D,OAAO;YACL,IAAI,EAAE,MAAM,sBAAsB,CAAC;gBACjC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC;gBAC9C,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,eAAe,CAAC;aAC9C,CAAC;YACF,KAAK,EAAE,SAAS;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,MAAM,sBAAsB,CAAC;YACjC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,gBAAgB,CAAC;YAC7C,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC;SAC7C,CAAC;QACF,KAAK,EAAE,MAAM;KACd,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAuB;IACnE,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,+BAA+B,CAAC,MAAM,EAAE;QACrD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB;IAC/B,OAAO,CAAC,GAAG,CAAC;;;;;yDAK2C,6BAA6B;;CAErF,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,OAAO,GAAmB;QAC9B,UAAU,EAAE,6BAA6B;QACzC,WAAW,EAAE,oBAAoB;QACjC,WAAW,EAAE,2BAA2B;KACzC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC1B,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACrC,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,EAAE,CAAC;YAC/B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,wBAAwB,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAEtC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,WAAW,WAAW,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,2BAA2B,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;AAC5E,CAAC"}
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { runInstallCli } from "./install.js";
|
|
4
|
+
import { openBrowserUrl } from "./open-browser.js";
|
|
5
|
+
import { startPrototypeServer } from "./prototype-server.js";
|
|
6
|
+
function parseArgs(argv) {
|
|
7
|
+
const options = {
|
|
8
|
+
directory: process.cwd(),
|
|
9
|
+
host: "127.0.0.1",
|
|
10
|
+
port: 0,
|
|
11
|
+
openBrowser: true,
|
|
12
|
+
};
|
|
13
|
+
for (let i = 0; i < argv.length; i++) {
|
|
14
|
+
const arg = argv[i];
|
|
15
|
+
const next = argv[i + 1];
|
|
16
|
+
if (arg === "--directory" && next) {
|
|
17
|
+
options.directory = resolve(next);
|
|
18
|
+
i += 1;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (arg === "--base-url" && next) {
|
|
22
|
+
options.baseUrl = next;
|
|
23
|
+
i += 1;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (arg === "--session" && next) {
|
|
27
|
+
options.sessionId = next;
|
|
28
|
+
i += 1;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (arg === "--title" && next) {
|
|
32
|
+
options.title = next;
|
|
33
|
+
i += 1;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (arg === "--host" && next) {
|
|
37
|
+
options.host = next;
|
|
38
|
+
i += 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (arg === "--port" && next) {
|
|
42
|
+
options.port = Number.parseInt(next, 10);
|
|
43
|
+
if (!Number.isFinite(options.port) || options.port < 0) {
|
|
44
|
+
throw new Error(`Invalid --port value: ${next}`);
|
|
45
|
+
}
|
|
46
|
+
i += 1;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (arg === "--no-open") {
|
|
50
|
+
options.openBrowser = false;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (arg === "--help" || arg === "-h") {
|
|
54
|
+
printUsageAndExit();
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
57
|
+
}
|
|
58
|
+
return options;
|
|
59
|
+
}
|
|
60
|
+
function printUsageAndExit() {
|
|
61
|
+
console.log(`Usage:
|
|
62
|
+
pi-studio-opencode install [options]
|
|
63
|
+
pi-studio-opencode [launcher options]
|
|
64
|
+
|
|
65
|
+
Install options:
|
|
66
|
+
--project [path] Install into .opencode/opencode.jsonc for the current directory or the given path
|
|
67
|
+
--config <path> Install into an explicit OpenCode config file
|
|
68
|
+
--plugin <spec> Plugin spec to write (default: pi-studio-opencode@latest)
|
|
69
|
+
|
|
70
|
+
Launcher options:
|
|
71
|
+
--directory <path> Project directory / working directory
|
|
72
|
+
--base-url <url> Use an existing opencode server
|
|
73
|
+
--session <id> Reuse an existing opencode session
|
|
74
|
+
--title <title> Title for a newly created session
|
|
75
|
+
--host <host> HTTP bind host for Studio (default: 127.0.0.1)
|
|
76
|
+
--port <port> HTTP bind port for Studio (default: 0 = auto-select)
|
|
77
|
+
--no-open Start Studio without opening a browser automatically
|
|
78
|
+
--help, -h Show this help
|
|
79
|
+
`);
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
async function main() {
|
|
83
|
+
const argv = process.argv.slice(2);
|
|
84
|
+
const [subcommand, ...rest] = argv;
|
|
85
|
+
if (subcommand === "install") {
|
|
86
|
+
await runInstallCli(rest);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (subcommand === "--help" || subcommand === "-h") {
|
|
90
|
+
printUsageAndExit();
|
|
91
|
+
}
|
|
92
|
+
const options = parseArgs(argv);
|
|
93
|
+
const instance = await startPrototypeServer(options);
|
|
94
|
+
const shutdown = async () => {
|
|
95
|
+
process.off("SIGINT", onSignal);
|
|
96
|
+
process.off("SIGTERM", onSignal);
|
|
97
|
+
await instance.stop();
|
|
98
|
+
};
|
|
99
|
+
const onSignal = () => {
|
|
100
|
+
void shutdown().finally(() => process.exit(0));
|
|
101
|
+
};
|
|
102
|
+
process.on("SIGINT", onSignal);
|
|
103
|
+
process.on("SIGTERM", onSignal);
|
|
104
|
+
console.log(`π Studio (opencode) ready at ${instance.url}`);
|
|
105
|
+
console.log(`Session: ${instance.getState().sessionId ?? "(pending)"}`);
|
|
106
|
+
console.log(`Working directory: ${options.directory}`);
|
|
107
|
+
if (!options.openBrowser) {
|
|
108
|
+
console.log("Browser launch skipped (--no-open).");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
await openBrowserUrl(instance.url);
|
|
113
|
+
console.log("Browser opened.");
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.warn(`Browser auto-open failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
117
|
+
console.warn(`Open manually: ${instance.url}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
void main().catch((error) => {
|
|
121
|
+
console.error(error instanceof Error ? error.stack ?? error.message : error);
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|