Flatten the repo: move everything out of app/ to the root
Now that the CLI and the Next.js app are one package, nesting it inside app/ served no purpose - the repo root itself becomes the published npm package. Merges app/.gitignore and app/README.md into the root versions, drops the now-duplicate app/LICENSE, and updates path references (README, docs/ARCHITECTURE.md, docs/CONFIG_REFERENCE.md, package.json's repository.directory) that assumed the app/ nesting. Also fixes a real bug this surfaced: the in-app docs viewer resolved docs/ relative to process.cwd(), which only worked by accident when the CLI happened to be invoked from app/'s parent directory. A first attempt at fixing it with import.meta.dirname broke instead, for the same cross-module-graph reason config-path resolution already documented - Next compiles Route Handlers through a separate module graph that doesn't preserve source-relative import.meta paths. Fixed by exposing the app root via TRIGGERSHELL_APP_ROOT (set once in server.ts, where import.meta *does* resolve correctly), the same pattern already used for TRIGGERSHELL_CONFIG_PATH. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
|
||||
export const SERVICE_NAME = "triggershell";
|
||||
|
||||
export interface UnitOptions {
|
||||
execPath: string;
|
||||
binPath: string;
|
||||
configPath: string;
|
||||
configDir: string;
|
||||
port?: number;
|
||||
host?: string;
|
||||
scope: "user" | "system";
|
||||
}
|
||||
|
||||
export function renderUnit(opts: UnitOptions): string {
|
||||
const args = ["start", "--config", opts.configPath, "--no-browser"];
|
||||
if (opts.port !== undefined) args.push("--port", String(opts.port));
|
||||
if (opts.host !== undefined) args.push("--host", opts.host);
|
||||
|
||||
const execStart = [opts.execPath, opts.binPath, ...args]
|
||||
.map((part) => (part.includes(" ") ? `"${part}"` : part))
|
||||
.join(" ");
|
||||
|
||||
const wantedBy = opts.scope === "user" ? "default.target" : "multi-user.target";
|
||||
|
||||
return `[Unit]
|
||||
Description=TriggerShell - self-hosted script runner
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=${execStart}
|
||||
WorkingDirectory=${opts.configDir}
|
||||
Restart=on-failure
|
||||
RestartSec=2
|
||||
Environment=NODE_ENV=production
|
||||
|
||||
[Install]
|
||||
WantedBy=${wantedBy}
|
||||
`;
|
||||
}
|
||||
|
||||
export function userUnitPath(): string {
|
||||
return path.join(os.homedir(), ".config", "systemd", "user", `${SERVICE_NAME}.service`);
|
||||
}
|
||||
|
||||
export function systemUnitPath(): string {
|
||||
return path.join("/etc", "systemd", "system", `${SERVICE_NAME}.service`);
|
||||
}
|
||||
|
||||
export function isRoot(): boolean {
|
||||
return process.getuid?.() === 0;
|
||||
}
|
||||
Reference in New Issue
Block a user