fix: rename openwork-server package references (#1040)

Co-authored-by: Omar McAdam <omar@OpenWork-Studio.localdomain>
This commit is contained in:
Omar McAdam
2026-03-19 14:27:34 -07:00
committed by GitHub
parent 10ec28d6dc
commit aa313c0ac9
10 changed files with 2275 additions and 689 deletions

View File

@@ -824,7 +824,7 @@ jobs:
# npm view exits non-zero for packages that don't exist yet (404).
# Treat missing packages as "not published" so release can publish them.
orchestrator_current="$(npm view openwork-orchestrator version 2>/dev/null || true)"
server_current="$(npm view @openwork/server version 2>/dev/null || true)"
server_current="$(npm view openwork-server version 2>/dev/null || true)"
opencodeRouter_current="$(npm view opencode-router version 2>/dev/null || true)"
if [ "$orchestrator_current" = "$ORCHESTRATOR_VERSION" ]; then
@@ -876,7 +876,7 @@ jobs:
- name: Publish openwork-server
if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_server == 'true'
run: pnpm --filter @openwork/server publish --access public --no-git-checks
run: pnpm --filter openwork-server publish --access public --no-git-checks
- name: Publish opencode-router
if: steps.npm-auth.outputs.enabled == 'true' && steps.npm-versions.outputs.publish_opencodeRouter == 'true'

View File

@@ -36,7 +36,8 @@ if (mode === "--set") {
const semverPattern = /^\d+\.\d+\.\d+$/;
const readJson = async (filePath) => JSON.parse(await readFile(filePath, "utf8"));
const readJson = async (filePath) =>
JSON.parse(await readFile(filePath, "utf8"));
const bump = (value, bumpMode) => {
if (!semverPattern.test(value)) {
@@ -58,9 +59,19 @@ const targetVersion = async () => {
const updatePackageJson = async (nextVersion) => {
const uiPath = path.join(ROOT, "package.json");
const tauriPath = path.join(REPO_ROOT, "apps", "desktop", "package.json");
const orchestratorPath = path.join(REPO_ROOT, "apps", "orchestrator", "package.json");
const orchestratorPath = path.join(
REPO_ROOT,
"apps",
"orchestrator",
"package.json",
);
const serverPath = path.join(REPO_ROOT, "apps", "server", "package.json");
const opencodeRouterPath = path.join(REPO_ROOT, "apps", "opencode-router", "package.json");
const opencodeRouterPath = path.join(
REPO_ROOT,
"apps",
"opencode-router",
"package.json",
);
const uiData = await readJson(uiPath);
const tauriData = await readJson(tauriPath);
const orchestratorData = await readJson(orchestratorPath);
@@ -74,7 +85,7 @@ const updatePackageJson = async (nextVersion) => {
// Ensure openwork-orchestrator uses the same openwork-server/opencode-router versions.
orchestratorData.dependencies = orchestratorData.dependencies ?? {};
orchestratorData.dependencies["@openwork/server"] = nextVersion;
orchestratorData.dependencies["openwork-server"] = nextVersion;
orchestratorData.dependencies["opencode-router"] = nextVersion;
serverData.version = nextVersion;
@@ -82,23 +93,38 @@ const updatePackageJson = async (nextVersion) => {
if (!isDryRun) {
await writeFile(uiPath, JSON.stringify(uiData, null, 2) + "\n");
await writeFile(tauriPath, JSON.stringify(tauriData, null, 2) + "\n");
await writeFile(orchestratorPath, JSON.stringify(orchestratorData, null, 2) + "\n");
await writeFile(
orchestratorPath,
JSON.stringify(orchestratorData, null, 2) + "\n",
);
await writeFile(serverPath, JSON.stringify(serverData, null, 2) + "\n");
await writeFile(opencodeRouterPath, JSON.stringify(opencodeRouterData, null, 2) + "\n");
await writeFile(
opencodeRouterPath,
JSON.stringify(opencodeRouterData, null, 2) + "\n",
);
}
};
const updateCargoToml = async (nextVersion) => {
const filePath = path.join(REPO_ROOT, "apps", "desktop", "src-tauri", "Cargo.toml");
const filePath = path.join(
REPO_ROOT,
"apps",
"desktop",
"src-tauri",
"Cargo.toml",
);
const raw = await readFile(filePath, "utf8");
const updated = raw.replace(/\bversion\s*=\s*"[^"]+"/m, `version = "${nextVersion}"`);
const updated = raw.replace(
/\bversion\s*=\s*"[^"]+"/m,
`version = "${nextVersion}"`,
);
if (!isDryRun) {
await writeFile(filePath, updated);
// Regenerate Cargo.lock so it stays in sync with the version bump.
const { execFileSync } = await import("node:child_process");
try {
execFileSync("cargo", ["generate-lockfile"], {
cwd: path.join(REPO_ROOT, "apps", "desktop", "src-tauri"),
cwd: path.join(REPO_ROOT, "apps", "desktop", "src-tauri"),
stdio: "ignore",
});
} catch {
@@ -108,7 +134,13 @@ const updateCargoToml = async (nextVersion) => {
};
const updateTauriConfig = async (nextVersion) => {
const filePath = path.join(REPO_ROOT, "apps", "desktop", "src-tauri", "tauri.conf.json");
const filePath = path.join(
REPO_ROOT,
"apps",
"desktop",
"src-tauri",
"tauri.conf.json",
);
const data = JSON.parse(await readFile(filePath, "utf8"));
data.version = nextVersion;
if (!isDryRun) {

View File

@@ -49,7 +49,7 @@
"@opentui/core": "0.1.77",
"@opentui/solid": "0.1.77",
"opencode-router": "0.11.171",
"@openwork/server": "0.11.171",
"openwork-server": "0.11.171",
"solid-js": "1.9.9"
},
"devDependencies": {

View File

@@ -1,6 +1,13 @@
import { spawnSync } from "node:child_process";
import { createHash } from "node:crypto";
import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
import {
copyFileSync,
existsSync,
mkdirSync,
readFileSync,
statSync,
writeFileSync,
} from "node:fs";
import { basename, join, resolve } from "node:path";
import { fileURLToPath } from "node:url";
@@ -8,10 +15,14 @@ const root = resolve(fileURLToPath(new URL("..", import.meta.url)));
const repoRoot = resolve(root, "..", "..");
const outdir = resolve(root, "dist", "sidecars");
const orchestratorPkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8"));
const orchestratorPkg = JSON.parse(
readFileSync(resolve(root, "package.json"), "utf8"),
);
const orchestratorVersion = String(orchestratorPkg.version ?? "").trim();
if (!orchestratorVersion) {
throw new Error("openwork-orchestrator version missing in apps/orchestrator/package.json");
throw new Error(
"openwork-orchestrator version missing in apps/orchestrator/package.json",
);
}
const sourceDateEpoch = process.env.SOURCE_DATE_EPOCH
@@ -21,18 +32,27 @@ const generatedAt = Number.isFinite(sourceDateEpoch)
? new Date(sourceDateEpoch * 1000).toISOString()
: new Date().toISOString();
const serverPkg = JSON.parse(readFileSync(resolve(repoRoot, "apps", "server", "package.json"), "utf8"));
const serverPkg = JSON.parse(
readFileSync(resolve(repoRoot, "apps", "server", "package.json"), "utf8"),
);
const serverVersion = String(serverPkg.version ?? "").trim();
if (!serverVersion) {
throw new Error("openwork-server version missing in apps/server/package.json");
throw new Error(
"openwork-server version missing in apps/server/package.json",
);
}
const routerPkg = JSON.parse(
readFileSync(resolve(repoRoot, "apps", "opencode-router", "package.json"), "utf8"),
readFileSync(
resolve(repoRoot, "apps", "opencode-router", "package.json"),
"utf8",
),
);
const routerVersion = String(routerPkg.version ?? "").trim();
if (!routerVersion) {
throw new Error("opencode-router version missing in apps/opencode-router/package.json");
throw new Error(
"opencode-router version missing in apps/opencode-router/package.json",
);
}
const run = (command, args, cwd) => {
@@ -42,7 +62,7 @@ const run = (command, args, cwd) => {
}
};
run("pnpm", ["--filter", "@openwork/server", "build:bin:all"], repoRoot);
run("pnpm", ["--filter", "openwork-server", "build:bin:all"], repoRoot);
run("pnpm", ["--filter", "opencode-router", "build:bin:all"], repoRoot);
const targets = [

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@ Filesystem-backed API for OpenWork remote clients. This package provides the Ope
## Quick start
```bash
npm install -g @openwork/server
npm install -g openwork-server
openwork-server --workspace /path/to/workspace --approval auto
```
@@ -14,7 +14,7 @@ openwork-server --workspace /path/to/workspace --approval auto
Or from source:
```bash
pnpm --filter @openwork/server dev -- \
pnpm --filter openwork-server dev -- \
--workspace /path/to/workspace \
--approval auto
```

View File

@@ -1,5 +1,5 @@
{
"name": "@openwork/server",
"name": "openwork-server",
"version": "0.11.171",
"description": "Filesystem-backed API for OpenWork remote clients",
"type": "module",

6
pnpm-lock.yaml generated
View File

@@ -152,12 +152,12 @@ importers:
'@opentui/solid':
specifier: 0.1.77
version: 0.1.77(solid-js@1.9.9)(stage-js@1.0.0-alpha.17)(typescript@5.9.3)(web-tree-sitter@0.25.10)
'@openwork/server':
specifier: 0.11.171
version: link:../server
opencode-router:
specifier: 0.11.171
version: link:../opencode-router
openwork-server:
specifier: 0.11.171
version: link:../server
solid-js:
specifier: 1.9.9
version: 1.9.9

View File

@@ -53,14 +53,20 @@ const logLine = (message: string) => {
const readBool = (value: string | undefined) => {
const normalized = (value ?? "").trim().toLowerCase();
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
return (
normalized === "1" ||
normalized === "true" ||
normalized === "yes" ||
normalized === "on"
);
};
const silent = process.argv.includes("--silent");
const autoBuildEnabled = process.env.OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD == null
? true
: readBool(process.env.OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD);
const autoBuildEnabled =
process.env.OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD == null
? true
: readBool(process.env.OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD);
const runCommand = (command: string, args: string[]) =>
new Promise<void>((resolve, reject) => {
@@ -75,11 +81,20 @@ const runCommand = (command: string, args: string[]) =>
resolve();
return;
}
reject(new Error(`${command} ${args.join(" ")} exited with code ${code ?? "unknown"}`));
reject(
new Error(
`${command} ${args.join(" ")} exited with code ${code ?? "unknown"}`,
),
);
});
});
const spawnLogged = (command: string, args: string[], logPath: string, env: NodeJS.ProcessEnv) => {
const spawnLogged = (
command: string,
args: string[],
logPath: string,
env: NodeJS.ProcessEnv,
) => {
const logFd = openSync(logPath, "w");
return spawn(command, args, {
cwd,
@@ -88,8 +103,13 @@ const spawnLogged = (command: string, args: string[], logPath: string, env: Node
});
};
const shutdown = (label: string, code: number | null, signal: NodeJS.Signals | null) => {
const reason = code !== null ? `code ${code}` : signal ? `signal ${signal}` : "unknown";
const shutdown = (
label: string,
code: number | null,
signal: NodeJS.Signals | null,
) => {
const reason =
code !== null ? `code ${code}` : signal ? `signal ${signal}` : "unknown";
logLine(`[dev:headless-web] ${label} exited (${reason})`);
process.exit(code ?? 1);
};
@@ -105,28 +125,48 @@ const openworkPort = await resolvePort(process.env.OPENWORK_PORT, "127.0.0.1");
const webPort = await resolvePort(process.env.OPENWORK_WEB_PORT, "127.0.0.1");
const openworkToken = process.env.OPENWORK_TOKEN ?? randomUUID();
const openworkHostToken = process.env.OPENWORK_HOST_TOKEN ?? randomUUID();
const openworkServerBin = path.join(cwd, "apps/server/dist/bin/openwork-server");
const opencodeRouterBin = path.join(cwd, "apps/opencode-router/dist/bin/opencode-router");
const openworkServerBin = path.join(
cwd,
"apps/server/dist/bin/openwork-server",
);
const opencodeRouterBin = path.join(
cwd,
"apps/opencode-router/dist/bin/opencode-router",
);
const ensureOpenworkServer = async () => {
try {
await access(openworkServerBin);
} catch {
if (!autoBuildEnabled) {
logLine(`[dev:headless-web] Missing OpenWork server binary at ${openworkServerBin}`);
logLine("[dev:headless-web] Auto-build disabled (OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD=0)");
logLine("[dev:headless-web] Run: pnpm --filter @openwork/server build:bin");
logLine("[dev:headless-web] Or unset/enable OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD to auto-build.");
logLine(
`[dev:headless-web] Missing OpenWork server binary at ${openworkServerBin}`,
);
logLine(
"[dev:headless-web] Auto-build disabled (OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD=0)",
);
logLine(
"[dev:headless-web] Run: pnpm --filter openwork-server build:bin",
);
logLine(
"[dev:headless-web] Or unset/enable OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD to auto-build.",
);
process.exit(1);
}
logLine(`[dev:headless-web] Missing OpenWork server binary at ${openworkServerBin}`);
logLine("[dev:headless-web] Auto-building: pnpm --filter @openwork/server build:bin");
logLine(
`[dev:headless-web] Missing OpenWork server binary at ${openworkServerBin}`,
);
logLine(
"[dev:headless-web] Auto-building: pnpm --filter openwork-server build:bin",
);
try {
await runCommand("pnpm", ["--filter", "@openwork/server", "build:bin"]);
await runCommand("pnpm", ["--filter", "openwork-server", "build:bin"]);
await access(openworkServerBin);
} catch (error) {
logLine(`[dev:headless-web] Auto-build failed: ${error instanceof Error ? error.message : String(error)}`);
logLine(
`[dev:headless-web] Auto-build failed: ${error instanceof Error ? error.message : String(error)}`,
);
process.exit(1);
}
}
@@ -137,20 +177,34 @@ const ensureOpencodeRouter = async () => {
await access(opencodeRouterBin);
} catch {
if (!autoBuildEnabled) {
logLine(`[dev:headless-web] Missing opencode-router binary at ${opencodeRouterBin}`);
logLine("[dev:headless-web] Auto-build disabled (OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD=0)");
logLine("[dev:headless-web] Run: pnpm --filter opencode-router build:bin");
logLine("[dev:headless-web] Or unset/enable OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD to auto-build.");
logLine(
`[dev:headless-web] Missing opencode-router binary at ${opencodeRouterBin}`,
);
logLine(
"[dev:headless-web] Auto-build disabled (OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD=0)",
);
logLine(
"[dev:headless-web] Run: pnpm --filter opencode-router build:bin",
);
logLine(
"[dev:headless-web] Or unset/enable OPENWORK_DEV_HEADLESS_WEB_AUTOBUILD to auto-build.",
);
process.exit(1);
}
logLine(`[dev:headless-web] Missing opencode-router binary at ${opencodeRouterBin}`);
logLine("[dev:headless-web] Auto-building: pnpm --filter opencode-router build:bin");
logLine(
`[dev:headless-web] Missing opencode-router binary at ${opencodeRouterBin}`,
);
logLine(
"[dev:headless-web] Auto-building: pnpm --filter opencode-router build:bin",
);
try {
await runCommand("pnpm", ["--filter", "opencode-router", "build:bin"]);
await access(opencodeRouterBin);
} catch (error) {
logLine(`[dev:headless-web] Auto-build failed: ${error instanceof Error ? error.message : String(error)}`);
logLine(
`[dev:headless-web] Auto-build failed: ${error instanceof Error ? error.message : String(error)}`,
);
process.exit(1);
}
}
@@ -160,10 +214,13 @@ const openworkUrl = `http://${clientHost}:${openworkPort}`;
const webUrl = `http://${clientHost}:${webPort}`;
// In practice we want opencode-router on for end-to-end messaging tests.
// Allow opt-out via OPENWORK_DEV_OPENCODE_ROUTER=0.
const opencodeRouterEnabled = process.env.OPENWORK_DEV_OPENCODE_ROUTER == null
? true
: readBool(process.env.OPENWORK_DEV_OPENCODE_ROUTER);
const opencodeRouterRequired = readBool(process.env.OPENWORK_DEV_OPENCODE_ROUTER_REQUIRED);
const opencodeRouterEnabled =
process.env.OPENWORK_DEV_OPENCODE_ROUTER == null
? true
: readBool(process.env.OPENWORK_DEV_OPENCODE_ROUTER);
const opencodeRouterRequired = readBool(
process.env.OPENWORK_DEV_OPENCODE_ROUTER_REQUIRED,
);
const viteEnv = {
...process.env,
HOST: viteHost,
@@ -200,8 +257,12 @@ logLine(
);
logLine(`[dev:headless-web] OPENWORK_TOKEN: ${openworkToken}`);
logLine(`[dev:headless-web] OPENWORK_HOST_TOKEN: ${openworkHostToken}`);
logLine(`[dev:headless-web] Web logs: ${path.relative(cwd, path.join(tmpDir, "dev-web.log"))}`);
logLine(`[dev:headless-web] Headless logs: ${path.relative(cwd, path.join(tmpDir, "dev-headless.log"))}`);
logLine(
`[dev:headless-web] Web logs: ${path.relative(cwd, path.join(tmpDir, "dev-web.log"))}`,
);
logLine(
`[dev:headless-web] Headless logs: ${path.relative(cwd, path.join(tmpDir, "dev-headless.log"))}`,
);
const webProcess = spawnLogged(
"pnpm",
@@ -263,4 +324,6 @@ process.on("SIGTERM", () => {
});
webProcess.on("exit", (code, signal) => shutdown("web", code, signal));
headlessProcess.on("exit", (code, signal) => shutdown("orchestrator", code, signal));
headlessProcess.on("exit", (code, signal) =>
shutdown("orchestrator", code, signal),
);

View File

@@ -18,11 +18,19 @@ const readCargoVersion = (path) => {
const appPkg = readJson(resolve(root, "apps", "app", "package.json"));
const desktopPkg = readJson(resolve(root, "apps", "desktop", "package.json"));
const orchestratorPkg = readJson(resolve(root, "apps", "orchestrator", "package.json"));
const orchestratorPkg = readJson(
resolve(root, "apps", "orchestrator", "package.json"),
);
const serverPkg = readJson(resolve(root, "apps", "server", "package.json"));
const opencodeRouterPkg = readJson(resolve(root, "apps", "opencode-router", "package.json"));
const tauriConfig = readJson(resolve(root, "apps", "desktop", "src-tauri", "tauri.conf.json"));
const cargoVersion = readCargoVersion(resolve(root, "apps", "desktop", "src-tauri", "Cargo.toml"));
const opencodeRouterPkg = readJson(
resolve(root, "apps", "opencode-router", "package.json"),
);
const tauriConfig = readJson(
resolve(root, "apps", "desktop", "src-tauri", "tauri.conf.json"),
);
const cargoVersion = readCargoVersion(
resolve(root, "apps", "desktop", "src-tauri", "Cargo.toml"),
);
const versions = {
app: appPkg.version ?? null,
@@ -37,7 +45,8 @@ const versions = {
orchestrator: orchestratorPkg.opencodeVersion ?? null,
},
opencodeRouterVersionPinned: desktopPkg.opencodeRouterVersion ?? null,
orchestratorOpenworkServerRange: orchestratorPkg.dependencies?.["@openwork/server"] ?? null,
orchestratorOpenworkServerRange:
orchestratorPkg.dependencies?.["openwork-server"] ?? null,
};
const checks = [];
@@ -58,7 +67,9 @@ addCheck(
);
addCheck(
"App/openwork-orchestrator versions match",
versions.app && versions.orchestrator && versions.app === versions.orchestrator,
versions.app &&
versions.orchestrator &&
versions.app === versions.orchestrator,
`${versions.app ?? "?"} vs ${versions.orchestrator ?? "?"}`,
);
addCheck(
@@ -68,7 +79,9 @@ addCheck(
);
addCheck(
"App/opencode-router versions match",
versions.app && versions.opencodeRouter && versions.app === versions.opencodeRouter,
versions.app &&
versions.opencodeRouter &&
versions.app === versions.opencodeRouter,
`${versions.app ?? "?"} vs ${versions.opencodeRouter ?? "?"}`,
);
addCheck(
@@ -83,7 +96,9 @@ addCheck(
);
addCheck(
"OpenCodeRouter version pinned in desktop",
versions.opencodeRouter && versions.opencodeRouterVersionPinned && versions.opencodeRouter === versions.opencodeRouterVersionPinned,
versions.opencodeRouter &&
versions.opencodeRouterVersionPinned &&
versions.opencodeRouter === versions.opencodeRouterVersionPinned,
`${versions.opencodeRouterVersionPinned ?? "?"} vs ${versions.opencodeRouter ?? "?"}`,
);
if (versions.opencode.desktop || versions.opencode.orchestrator) {
@@ -105,7 +120,9 @@ const openworkServerPinned = /^\d+\.\d+\.\d+/.test(openworkServerRange);
if (!openworkServerRange) {
addWarning("openwork-orchestrator is missing an openwork-server dependency.");
} else if (!openworkServerPinned) {
addWarning(`openwork-orchestrator openwork-server dependency is not pinned (${openworkServerRange}).`);
addWarning(
`openwork-orchestrator openwork-server dependency is not pinned (${openworkServerRange}).`,
);
} else {
addCheck(
"Openwork-server dependency matches server version",
@@ -114,7 +131,14 @@ if (!openworkServerRange) {
);
}
const sidecarManifestPath = resolve(root, "apps", "orchestrator", "dist", "sidecars", "openwork-orchestrator-sidecars.json");
const sidecarManifestPath = resolve(
root,
"apps",
"orchestrator",
"dist",
"sidecars",
"openwork-orchestrator-sidecars.json",
);
if (existsSync(sidecarManifestPath)) {
const manifest = readJson(sidecarManifestPath);
addCheck(
@@ -145,7 +169,9 @@ if (existsSync(sidecarManifestPath)) {
}
if (!process.env.SOURCE_DATE_EPOCH) {
addWarning("SOURCE_DATE_EPOCH is not set (sidecar manifests will include current time).");
addWarning(
"SOURCE_DATE_EPOCH is not set (sidecar manifests will include current time).",
);
}
const report = { ok, versions, checks, warnings };