@snappedly-tools/shipyard 0.9.1 → 0.9.2-staging.36240532373
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/main.js +28 -26
- package/dist/main.js.map +1 -1
- package/dist/templates/parallel-planner/main.mts +5 -1
- package/dist/templates/parallel-planner/planner-branch.mts +40 -0
- package/dist/templates/parallel-planner/setup.sh +4 -1
- package/dist/templates/parallel-planner-with-review/main.mts +5 -1
- package/dist/templates/parallel-planner-with-review/planner-branch.mts +40 -0
- package/dist/templates/parallel-planner-with-review/setup.sh +4 -1
- package/dist/templates/sequential-reviewer/setup.sh +4 -1
- package/dist/templates/shared/setup.sh +4 -1
- package/dist/templates/simple-loop/setup.sh +4 -1
- package/package.json +1 -1
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtimeConfig.ts","../src/InitService.ts","../src/CodexAuth.ts","../src/RepositoryRunnerWake.ts","../src/RepositoryRunner.ts","../src/InitRepositoryRunner.ts","../src/InitGitSetup.ts","../src/RepositoryRunnerControl.ts","../src/runEffectPromise.ts","../src/RepositoryRunnerCommands.ts","../src/version.ts","../src/UninstallService.ts","../src/cli.ts","../src/terminalCleanup.ts","../src/main.ts"],"names":["Effect","FileSystem","join","reportProgress","resolve","execFileSync","execFileAsync","promisify","execFile","defaultAdapters","access","constants","lstat","realpath","readFile","writeFile","rm","mkdir","requireCommand","clack","configDirExists","Options","existsSync","spawn","runCommand","Command"],"mappings":"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","file":"main.js","sourcesContent":["import { FileSystem } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport { join } from \"node:path\";\n\nimport { ConfigDirError } from \"./errors.js\";\nimport { CONFIG_DIR, CLI_NAME } from \"./runtimeNames.js\";\n\nconst configDirExists = (\n repoDir: string,\n): Effect.Effect<boolean, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n return yield* fs\n .exists(join(repoDir, CONFIG_DIR))\n .pipe(Effect.catchAll(() => Effect.succeed(false)));\n });\n\nexport const requireCanonicalConfigDir = (\n repoDir: string,\n): Effect.Effect<string, ConfigDirError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n if (!(yield* configDirExists(repoDir))) {\n return yield* Effect.fail(\n new ConfigDirError({\n message: `No ${CONFIG_DIR}/ found. Run \\`${CLI_NAME} init\\` first.`,\n }),\n );\n }\n return join(repoDir, CONFIG_DIR);\n });\n\n/** Fail before initialization can overwrite an existing configuration directory. */\nexport const assertConfigDirAvailable = (\n repoDir: string,\n): Effect.Effect<void, ConfigDirError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n if (yield* configDirExists(repoDir)) {\n return yield* Effect.fail(\n new ConfigDirError({\n message: `${CONFIG_DIR}/ directory already exists. ${CLI_NAME} did not modify it. Use the existing configuration or remove it deliberately after preserving any active worktrees before re-initializing.`,\n }),\n );\n }\n });\n","import { FileSystem } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { SANDBOX_REPO_DIR } from \"./SandboxFactory.js\";\nimport type { CodexAuthMode } from \"./CodexAuth.js\";\nimport { assertConfigDirAvailable } from \"./runtimeConfig.js\";\nimport {\n ACTIVATION_LABEL,\n CONFIG_DIR,\n PRODUCT_NAME,\n CLI_NAME,\n LOCKS_DIR,\n} from \"./runtimeNames.js\";\nimport { CODEX_MODELS } from \"./modelConfig.js\";\n\nconst GITIGNORE = `.env\nlogs/\nworktrees/\n${LOCKS_DIR}/\n`;\n\nexport const DEFAULT_AGENT_NAME = \"codex\";\nconst TEMPLATE_AGENT_FACTORY = \"codex\";\n\nconst CODEX_CHATGPT_ENV_EXAMPLE = `# Codex ChatGPT subscription authentication\n# On the host, run \\`codex login\\` and make sure \\`~/.codex/auth.json\\` exists.\n# Shipyard mounts that file read-only into the sandbox.\n# Do not add OPENAI_API_KEY here: that selects API-key billing instead.`;\n\nconst CODEX_CHATGPT_AUTH_OPTIONS = `{\n mounts: [\n {\n hostPath: \"~/.codex/auth.json\",\n sandboxPath: \"~/.codex/auth.json\",\n readonly: true,\n },\n ],\n}`;\n\nconst roleModelEnvExample = (agentName: string): string =>\n agentName === \"codex\"\n ? `# Optional model choices for Shipyard workflows.\n# Choose models available to your Codex CLI account: https://learn.chatgpt.com/docs/models\n# The provider must support each value. Aliases can change their target over time.\n# SHIPYARD_ROUTINE_MODEL=gpt-6-luna\n# SHIPYARD_STRONG_MODEL=gpt-6-sol`\n : `# Optional model choices for Shipyard workflows.\n# Choose aliases or model IDs available to your Claude Code provider: https://code.claude.com/docs/en/model-config\n# The provider must support each value. Aliases can change their target over time.\n# SHIPYARD_ROUTINE_MODEL=sonnet\n# SHIPYARD_STRONG_MODEL=opus`;\n\nexport interface TemplateMetadata {\n name: string;\n description: string;\n /**\n * Host-side npm packages the template's `main` file imports directly (e.g.\n * the planner templates import `zod` for their `<plan>` output schema). Init\n * offers to install these with the detected package manager so that\n * `npx tsx ${CONFIG_DIR}/main.ts` doesn't crash with ERR_MODULE_NOT_FOUND.\n */\n dependencies?: readonly string[];\n}\n\nconst TEMPLATES: TemplateMetadata[] = [\n {\n name: \"simple-loop\",\n description: \"Implements standalone issues one by one and opens review PRs\",\n },\n {\n name: \"sequential-reviewer\",\n description:\n \"Implements issues one by one, with a code review step after each\",\n },\n {\n name: \"parallel-planner\",\n description:\n \"Plans parallelizable issues, implements them, and opens review PRs\",\n dependencies: [\"zod\"],\n },\n {\n name: \"parallel-planner-with-review\",\n description:\n \"Plans and implements parallel issues with per-branch review and PRs\",\n dependencies: [\"zod\"],\n },\n];\n\nexport const listTemplates = (): TemplateMetadata[] => TEMPLATES;\n\n/**\n * Host-side npm packages the given template imports directly. Empty when the\n * template name is unknown or the template declares no extra dependencies.\n */\nexport const getTemplateDependencies = (\n templateName: string,\n): readonly string[] =>\n TEMPLATES.find((t) => t.name === templateName)?.dependencies ?? [];\n\n// ---------------------------------------------------------------------------\n// Package manager detection (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nconst PACKAGE_MANAGERS = [\"npm\", \"pnpm\", \"yarn\", \"bun\"] as const;\n\n/** A package manager Shipyard can detect on the host and build install commands for. */\nexport type PackageManager = (typeof PACKAGE_MANAGERS)[number];\n\n// Lockfiles checked in priority order. bun.lock / bun.lockb are both valid bun\n// lockfiles (text vs binary), so both map to bun.\nconst LOCKFILES: ReadonlyArray<readonly [string, PackageManager]> = [\n [\"bun.lockb\", \"bun\"],\n [\"bun.lock\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nconst DEPENDENCY_COMMANDS: Record<\n PackageManager,\n { readonly add: string; readonly remove: string }\n> = {\n npm: { add: \"install\", remove: \"uninstall\" },\n pnpm: { add: \"add\", remove: \"remove\" },\n yarn: { add: \"add\", remove: \"remove\" },\n bun: { add: \"add\", remove: \"remove\" },\n};\n\n/**\n * Detect the host project's package manager. An explicit corepack-style\n * `packageManager` field in package.json wins; otherwise the first matching\n * lockfile decides. Defaults to npm when nothing matches.\n */\nexport const detectPackageManager = (\n repoDir: string,\n): Effect.Effect<PackageManager, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n\n const pkgPath = join(repoDir, \"package.json\");\n const pkgExists = yield* fs\n .exists(pkgPath)\n .pipe(Effect.orElseSucceed(() => false));\n if (pkgExists) {\n const content = yield* fs\n .readFileString(pkgPath)\n .pipe(Effect.orElseSucceed(() => \"\"));\n try {\n const pkg = JSON.parse(content) as Record<string, unknown>;\n const field = pkg[\"packageManager\"];\n if (typeof field === \"string\") {\n const name = field.split(\"@\")[0];\n const match = PACKAGE_MANAGERS.find((pm) => pm === name);\n if (match) return match;\n }\n } catch {\n // Malformed package.json — fall through to lockfile detection.\n }\n }\n\n for (const [file, pm] of LOCKFILES) {\n const exists = yield* fs\n .exists(join(repoDir, file))\n .pipe(Effect.orElseSucceed(() => false));\n if (exists) return pm;\n }\n\n return \"npm\";\n });\n\n/** Build the command that adds a runtime dependency for the given package manager. */\nexport const addDependencyCommand = (\n packageManager: PackageManager,\n pkg: string,\n): string =>\n `${packageManager} ${DEPENDENCY_COMMANDS[packageManager].add} ${pkg}`;\n\n/** Build the command that removes a dependency with the given package manager. */\nexport const removeDependencyCommand = (\n packageManager: PackageManager,\n pkg: string,\n): string =>\n `${packageManager} ${DEPENDENCY_COMMANDS[packageManager].remove} ${pkg}`;\n\n/**\n * Whether the host package.json already declares `pkg` in any of its dependency\n * maps. Used so init doesn't offer to install something already present.\n */\nexport const hostHasDependency = (\n repoDir: string,\n pkg: string,\n): Effect.Effect<boolean, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const pkgPath = join(repoDir, \"package.json\");\n const exists = yield* fs\n .exists(pkgPath)\n .pipe(Effect.orElseSucceed(() => false));\n if (!exists) return false;\n const content = yield* fs\n .readFileString(pkgPath)\n .pipe(Effect.orElseSucceed(() => \"\"));\n try {\n const parsed = JSON.parse(content) as Record<string, unknown>;\n const depMaps = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n ];\n return depMaps.some((key) => {\n const deps = parsed[key];\n return (\n typeof deps === \"object\" && deps !== null && pkg in (deps as object)\n );\n });\n } catch {\n return false;\n }\n });\n\n// ---------------------------------------------------------------------------\n// Agent registry (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nexport interface AgentEntry {\n readonly name: string;\n readonly label: string;\n readonly defaultModel: string;\n readonly factoryImport: string;\n readonly dockerfileTemplate: string;\n /** Lines to include in the generated `.env.example` for this agent's API key. */\n readonly envExample: string;\n}\n\nconst CLAUDE_CODE_DOCKERFILE = `FROM node:22-bookworm\n\n# Install system dependencies\nRUN apt-get update && apt-get install -y \\\\\n git \\\\\n curl \\\\\n jq \\\\\n && rm -rf /var/lib/apt/lists/*\n\n{{ISSUE_TRACKER_TOOLS}}\n\n# Build-args for UID/GID alignment: shipyard docker build-image\n# defaults these to the host user's UID/GID so image-built files\n# and explicit mounted files share an owner without runtime chown.\nARG AGENT_UID=1000\nARG AGENT_GID=1000\n\n# Rename the base image's \"node\" user to \"agent\" and align UID/GID.\nRUN groupmod -o -g $AGENT_GID node && usermod -o -u $AGENT_UID -g $AGENT_GID -d /home/agent -m -l agent node\nUSER \\${AGENT_UID}:\\${AGENT_GID}\n\n# Install Claude Code CLI\nRUN curl -fsSL https://claude.ai/install.sh | bash\n\n# Add Claude to PATH\nENV PATH=\"/home/agent/.local/bin:$PATH\"\n\nWORKDIR /home/agent\n\n# Shipyard syncs Git history into a sandbox-owned repository at ${SANDBOX_REPO_DIR}\n# and runs agent commands from ${SANDBOX_REPO_DIR}.\n# Structure your Dockerfile so that ${SANDBOX_REPO_DIR} can serve as the project root.\nENTRYPOINT [\"sleep\", \"infinity\"]\n`;\n\nconst CODEX_DOCKERFILE = `FROM node:22-bookworm\n\n# Install system dependencies\nRUN apt-get update && apt-get install -y \\\\\n git \\\\\n curl \\\\\n jq \\\\\n && rm -rf /var/lib/apt/lists/*\n\n{{ISSUE_TRACKER_TOOLS}}\n\n# Build-args for UID/GID alignment: shipyard docker build-image\n# defaults these to the host user's UID/GID so image-built files\n# and explicit mounted files share an owner without runtime chown.\nARG AGENT_UID=1000\nARG AGENT_GID=1000\n\n# Rename the base image's \"node\" user to \"agent\" and align UID/GID.\nRUN groupmod -o -g $AGENT_GID node && usermod -o -u $AGENT_UID -g $AGENT_GID -d /home/agent -m -l agent node\n\n# Install Codex CLI (run as root before USER agent)\nRUN npm install -g @openai/codex\n\nUSER \\${AGENT_UID}:\\${AGENT_GID}\n\nWORKDIR /home/agent\n\n# Shipyard syncs Git history into a sandbox-owned repository at ${SANDBOX_REPO_DIR}\n# and runs agent commands from ${SANDBOX_REPO_DIR}.\n# Structure your Dockerfile so that ${SANDBOX_REPO_DIR} can serve as the project root.\nENTRYPOINT [\"sleep\", \"infinity\"]\n`;\n\nconst AGENT_REGISTRY: AgentEntry[] = [\n {\n name: \"codex\",\n label: \"Codex\",\n defaultModel: CODEX_MODELS.routine.model,\n factoryImport: \"codex\",\n dockerfileTemplate: CODEX_DOCKERFILE,\n envExample: `# OpenAI API key\nOPENAI_API_KEY=`,\n },\n {\n name: \"claude-code\",\n label: \"Claude Code\",\n defaultModel: \"claude-opus-4-8\",\n factoryImport: \"claudeCode\",\n dockerfileTemplate: CLAUDE_CODE_DOCKERFILE,\n envExample: `# Claude Code OAuth token — get one by running \\`claude setup-token\\` on your host.\n# Lets the agent use your Claude subscription instead of an API key.\nCLAUDE_CODE_OAUTH_TOKEN=\n# Or use an Anthropic API key instead — uncomment and fill in:\n# ANTHROPIC_API_KEY=`,\n },\n];\n\nexport const listAgents = (): AgentEntry[] => AGENT_REGISTRY;\n\n// ---------------------------------------------------------------------------\n// Issue tracker registry (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nexport interface IssueTrackerEntry {\n readonly name: string;\n readonly label: string;\n readonly templateArgs: {\n readonly LIST_TASKS_COMMAND: string;\n readonly VIEW_TASK_COMMAND: string;\n readonly CLOSE_TASK_COMMAND: string;\n readonly ISSUE_TRACKER_TOOLS: string;\n };\n /** Lines to append to `.env.example` for this issue tracker, or empty string if none needed. */\n readonly envExample: string;\n}\n\nconst GITHUB_CLI_TOOLS = `# Install GitHub CLI\nRUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\\\\n | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \\\\\n && echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" \\\\\n | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \\\\\n && apt-get update && apt-get install -y gh \\\\\n && rm -rf /var/lib/apt/lists/*`;\n\nconst ISSUE_TRACKER_REGISTRY: IssueTrackerEntry[] = [\n {\n name: \"github-issues\",\n label: \"GitHub Issues\",\n templateArgs: {\n LIST_TASKS_COMMAND: `gh issue list --state open --label ${ACTIVATION_LABEL} --limit 100 --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'`,\n VIEW_TASK_COMMAND: \"gh issue view <ID>\",\n CLOSE_TASK_COMMAND: `gh issue close <ID> --comment \"Completed by ${PRODUCT_NAME}\"`,\n ISSUE_TRACKER_TOOLS: GITHUB_CLI_TOOLS,\n },\n envExample: `# GitHub personal access token — the agent uses it to read and manage GitHub Issues\n# Runner installation/start uses the host \\`gh\\` login for repository administration.\n# Create a fine-grained token: https://github.com/settings/personal-access-tokens/new\n# Required repository permissions: Contents, Issues, and Pull requests (Read and write); Metadata (Read)\n# Or leave blank and run: GH_TOKEN=\"$(gh auth token)\" npx shipyard run\nGH_TOKEN=\n`,\n },\n];\n\nexport const listIssueTrackers = (): IssueTrackerEntry[] =>\n ISSUE_TRACKER_REGISTRY;\n\nexport const getIssueTracker = (name: string): IssueTrackerEntry | undefined =>\n ISSUE_TRACKER_REGISTRY.find((b) => b.name === name);\n\nexport const getAgent = (name: string): AgentEntry | undefined =>\n AGENT_REGISTRY.find((a) => a.name === name);\n\n// ---------------------------------------------------------------------------\n// Sandbox provider registry (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nexport interface SandboxProviderEntry {\n readonly name: string;\n readonly label: string;\n /** Filename written to .shipyard/. */\n readonly containerfileName: string;\n /** CLI namespace for build/remove commands. */\n readonly cliNamespace: string;\n}\n\nconst SANDBOX_PROVIDER_REGISTRY: SandboxProviderEntry[] = [\n {\n name: \"docker\",\n label: \"Docker\",\n containerfileName: \"Dockerfile\",\n cliNamespace: \"docker\",\n },\n];\n\nexport const listSandboxProviders = (): SandboxProviderEntry[] =>\n SANDBOX_PROVIDER_REGISTRY;\n\nexport const getSandboxProvider = (\n name: string,\n): SandboxProviderEntry | undefined =>\n SANDBOX_PROVIDER_REGISTRY.find((p) => p.name === name);\n\n// ---------------------------------------------------------------------------\n// Next steps\n// ---------------------------------------------------------------------------\n\nexport function getNextStepsLines(): string[] {\n return [\n \"Next steps:\",\n `1. Fill in the values you need in \\`${CONFIG_DIR}/.env\\`.`,\n \"2. If using a model subscription, sign in. For Codex:\",\n ` codex --config 'cli_auth_credentials_store=\"file\"' login`,\n \" test -f ~/.codex/auth.json\",\n `3. If the runner installed successfully, start it with \\`npx ${CLI_NAME} runner start\\`; otherwise run \\`npx ${CLI_NAME} run\\`.`,\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Scaffolding helpers\n// ---------------------------------------------------------------------------\n\nfunction getTemplatesDir(): string {\n const thisFile = fileURLToPath(import.meta.url);\n return join(dirname(thisFile), \"templates\");\n}\n\nconst getTemplateDir = (\n templateName: string,\n): Effect.Effect<string, Error, never> =>\n Effect.gen(function* () {\n const template = TEMPLATES.find((t) => t.name === templateName);\n if (!template) {\n const names = TEMPLATES.map((t) => t.name).join(\", \");\n yield* Effect.fail(\n new Error(`Unknown template: \"${templateName}\". Available: ${names}`),\n );\n }\n return join(getTemplatesDir(), templateName);\n });\n\nconst COMPILED_FILE_EXTENSIONS = [\n \".js\",\n \".js.map\",\n \".d.ts\",\n \".d.ts.map\",\n \".mjs\",\n \".mjs.map\",\n \".d.mts\",\n \".d.mts.map\",\n];\n\nconst copyTemplateFiles = (\n templateDir: string,\n destDir: string,\n mainFilename: string,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const files = yield* fs\n .readDirectory(templateDir)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n yield* Effect.all(\n files\n .filter(\n (f) =>\n f !== \"template.json\" &&\n f !== \".env.example\" &&\n (f === \"select-issues.mjs\" ||\n !COMPILED_FILE_EXTENSIONS.some((ext) => f.endsWith(ext))),\n )\n .map((f) => {\n const destName = f === \"main.mts\" ? mainFilename : f;\n return fs\n .copyFile(join(templateDir, f), join(destDir, destName))\n .pipe(Effect.mapError((e) => new Error(e.message)));\n }),\n { concurrency: \"unbounded\" },\n );\n });\n\n/**\n * Replace the agent factory and sandbox provider in a scaffolded main.ts.\n *\n * Templates use `codex` as the default agent factory and `docker` as the\n * default sandbox provider. When a different agent, model, or sandbox provider\n * is selected, this function rewrites the imports and factory calls.\n */\nconst rewriteMainTs = (\n configDir: string,\n agent: AgentEntry,\n model: string,\n modelExplicit: boolean,\n sandboxProvider: SandboxProviderEntry,\n mainFilename: string,\n codexAuth: CodexAuthMode,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const mainTsPath = join(configDir, mainFilename);\n\n const exists = yield* fs\n .exists(mainTsPath)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n if (!exists) return;\n\n let content = yield* fs\n .readFileString(mainTsPath)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n\n // Replace the default factory function name in calls.\n // Templates always use Codex as the placeholder factory.\n content = content.replace(\n new RegExp(`\\\\b${TEMPLATE_AGENT_FACTORY}\\\\b`, \"g\"),\n agent.factoryImport,\n );\n content = content.replace(\n \"const CODEX_PROVIDER = true;\",\n `const CODEX_PROVIDER = ${agent.name === \"codex\"};`,\n );\n if (agent.name !== \"codex\" || modelExplicit) {\n const modelLiteral = JSON.stringify(model);\n content = content.replace(\n /shipyard\\.CODEX_MODELS\\.(?:routine|strong)/g,\n modelLiteral,\n );\n }\n // ChatGPT subscription auth is stored by the host Codex CLI. Mount the\n // file into the sandbox read-only so Codex can use it without exposing an\n // API key through the generated .env file.\n if (agent.name === \"codex\" && codexAuth === \"chatgpt\") {\n content = content.replace(\n \"const sandboxAuthOptions = {};\",\n `const sandboxAuthOptions = ${CODEX_CHATGPT_AUTH_OPTIONS};`,\n );\n }\n\n // Replace the sandbox provider. Templates always use `docker` as the\n // placeholder, where the registry name doubles as both the factory function\n // name and the `/sandboxes/<name>` import subpath segment. A single\n // case-sensitive word-boundary replace therefore rewrites the named import,\n // the import subpath, and every factory call site — and is a no-op when\n // docker is selected.\n content = content.replace(/\\bdocker\\b/g, sandboxProvider.name);\n\n yield* fs\n .writeFileString(mainTsPath, content)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n });\n\n/** Text file extensions eligible for `{{KEY}}` template argument substitution. */\nconst TEXT_FILE_EXTENSIONS = new Set([\n \".md\",\n \".txt\",\n \".env\",\n \".example\",\n // Dockerfile / Containerfile have no extension — handled by name check below\n]);\n\nconst isTextFile = (filename: string): boolean => {\n if (\n filename === \"Dockerfile\" ||\n filename === \"Containerfile\" ||\n filename === \".gitignore\"\n )\n return true;\n const dotIdx = filename.lastIndexOf(\".\");\n if (dotIdx === -1) return false;\n return TEXT_FILE_EXTENSIONS.has(filename.slice(dotIdx));\n};\n\n/**\n * Replace `{{KEY}}` template arguments from the issue tracker's\n * `templateArgs` map in all text files in the scaffolded config directory.\n */\nconst substituteTemplateArgs = (\n configDir: string,\n issueTracker: IssueTrackerEntry,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const files = yield* fs\n .readDirectory(configDir)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n const textFiles = files.filter(isTextFile);\n yield* Effect.all(\n textFiles.map((f) =>\n Effect.gen(function* () {\n const filePath = join(configDir, f);\n let content = yield* fs\n .readFileString(filePath)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n const original = content;\n for (const [key, value] of Object.entries(\n issueTracker.templateArgs,\n )) {\n content = content.replace(\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"),\n value,\n );\n }\n if (content !== original) {\n yield* fs\n .writeFileString(filePath, content)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n }\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n });\n\n// ---------------------------------------------------------------------------\n// Main scaffold function\n// ---------------------------------------------------------------------------\n\nexport interface ScaffoldOptions {\n agent: AgentEntry;\n model: string;\n /** Whether `model` came from an explicit `init --model` option. */\n modelExplicit?: boolean;\n templateName?: string;\n issueTracker?: IssueTrackerEntry;\n sandboxProvider?: SandboxProviderEntry;\n codexAuth?: CodexAuthMode;\n onProgress?: (update: ScaffoldProgressUpdate) => void;\n}\n\nexport interface ScaffoldProgressUpdate {\n readonly current: number;\n readonly total: number;\n readonly message: string;\n}\n\nexport interface ScaffoldResult {\n mainFilename: string;\n}\n\n/**\n * Detect whether the project's package.json has `\"type\": \"module\"`.\n * If so, we can use plain `.ts`; otherwise we use `.mts` to ensure ESM.\n */\nconst detectMainFilename = (\n repoDir: string,\n): Effect.Effect<string, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const pkgPath = join(repoDir, \"package.json\");\n const exists = yield* fs\n .exists(pkgPath)\n .pipe(Effect.orElseSucceed(() => false));\n if (!exists) return \"main.mts\";\n const content = yield* fs\n .readFileString(pkgPath)\n .pipe(Effect.orElseSucceed(() => \"\"));\n try {\n const pkg = JSON.parse(content) as Record<string, unknown>;\n return pkg[\"type\"] === \"module\" ? \"main.ts\" : \"main.mts\";\n } catch {\n return \"main.mts\";\n }\n });\n\nexport const scaffold = (\n repoDir: string,\n options: ScaffoldOptions,\n): Effect.Effect<ScaffoldResult, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const {\n agent,\n model,\n modelExplicit = false,\n templateName = \"simple-loop\",\n issueTracker = ISSUE_TRACKER_REGISTRY[0]!, // default: github-issues\n sandboxProvider = SANDBOX_PROVIDER_REGISTRY[0]!, // default: docker\n codexAuth = \"api-key\",\n } = options;\n const totalProgressSteps = 5;\n const reportProgress = (current: number, message: string): void =>\n options.onProgress?.({\n current,\n total: totalProgressSteps,\n message,\n });\n if (codexAuth === \"chatgpt\" && agent.name !== \"codex\") {\n return yield* Effect.fail(\n new Error(\n \"ChatGPT subscription authentication is only supported for Codex.\",\n ),\n );\n }\n const fs = yield* FileSystem.FileSystem;\n yield* assertConfigDirAvailable(repoDir);\n const configDir = join(repoDir, CONFIG_DIR);\n\n const mainFilename = yield* detectMainFilename(repoDir);\n reportProgress(1, \"Validated repository and configuration\");\n\n yield* fs\n .makeDirectory(configDir, { recursive: false })\n .pipe(Effect.mapError((e) => new Error(e.message)));\n\n const templateDir = yield* getTemplateDir(templateName);\n reportProgress(2, `Prepared ${CONFIG_DIR}/ directory`);\n\n // Build .env.example from agent + issue tracker env blocks\n const envExampleParts = [\n agent.name === \"codex\" && codexAuth === \"chatgpt\"\n ? CODEX_CHATGPT_ENV_EXAMPLE\n : agent.envExample,\n ];\n envExampleParts.push(roleModelEnvExample(agent.name));\n if (issueTracker.envExample) {\n envExampleParts.push(issueTracker.envExample);\n }\n const envExampleContent = envExampleParts.join(\"\\n\") + \"\\n\";\n const envExamplePath = join(configDir, \".env.example\");\n\n yield* Effect.all(\n [\n fs\n .writeFileString(\n join(configDir, sandboxProvider.containerfileName),\n agent.dockerfileTemplate,\n )\n .pipe(Effect.mapError((e) => new Error(e.message))),\n fs\n .writeFileString(join(configDir, \".gitignore\"), GITIGNORE)\n .pipe(Effect.mapError((e) => new Error(e.message))),\n fs\n .writeFileString(envExamplePath, envExampleContent)\n .pipe(Effect.mapError((e) => new Error(e.message))),\n fs\n .writeFileString(join(configDir, \".env\"), envExampleContent)\n .pipe(Effect.mapError((e) => new Error(e.message))),\n copyTemplateFiles(templateDir, configDir, mainFilename),\n ],\n { concurrency: \"unbounded\" },\n );\n reportProgress(3, \"Wrote configuration and template files\");\n\n // Rewrite main file with the selected agent factory, model, and sandbox provider\n yield* rewriteMainTs(\n configDir,\n agent,\n model,\n modelExplicit,\n sandboxProvider,\n mainFilename,\n codexAuth,\n );\n reportProgress(4, \"Configured selected agent and sandbox\");\n\n // Replace issue tracker template arguments in all text files.\n yield* substituteTemplateArgs(configDir, issueTracker);\n reportProgress(5, \"Applied issue tracker settings\");\n\n return { mainFilename };\n });\n","import { execFileSync } from \"node:child_process\";\nimport { statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { InitError } from \"./errors.js\";\n\nexport type CodexAuthMode = \"api-key\" | \"chatgpt\";\n\nexport interface ResolveCodexAuthModeOptions {\n readonly agentName: string;\n readonly requested?: CodexAuthMode;\n readonly interactive: boolean;\n readonly select: () => Promise<CodexAuthMode | undefined>;\n}\n\n/** Resolve Codex authentication immediately after agent selection. */\nexport const resolveCodexAuthMode = async (\n options: ResolveCodexAuthModeOptions,\n): Promise<CodexAuthMode> => {\n if (options.agentName !== \"codex\") {\n if (options.requested === \"chatgpt\") {\n throw new InitError({\n message: \"--codex-auth chatgpt can only be used with --agent codex.\",\n });\n }\n return \"api-key\";\n }\n\n if (options.requested !== undefined) return options.requested;\n if (!options.interactive) {\n throw new InitError({\n message:\n \"--codex-auth is required in non-interactive mode (no TTY detected).\",\n });\n }\n\n const selected = await options.select();\n if (selected === undefined) {\n throw new InitError({\n message: \"Codex authentication selection cancelled.\",\n });\n }\n return selected;\n};\n\nexport interface CodexAuthPreflightOptions {\n readonly cwd: string;\n readonly interactive: boolean;\n /** Test seam; production uses the user's default ~/.codex directory. */\n readonly authHome?: string;\n /** Test seam; production runs `codex login` in the user's terminal. */\n readonly login?: (cwd: string) => void;\n}\n\nexport const codexAuthFilePath = (\n authHome = join(homedir(), \".codex\"),\n): string => join(authHome, \"auth.json\");\n\nconst isRegularFile = (path: string): boolean => {\n try {\n return statSync(path).isFile();\n } catch {\n return false;\n }\n};\n\nconst isMissingCodexCli = (error: unknown): boolean =>\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\";\n\n// Shipyard mounts auth.json into the sandbox, so make this login use the file\n// store without changing the user's permanent Codex configuration.\nconst codexLoginArgs = [\n \"--config\",\n 'cli_auth_credentials_store=\"file\"',\n \"login\",\n];\n\nconst runCodexLogin = (cwd: string): void => {\n try {\n execFileSync(\"codex\", codexLoginArgs, { cwd, stdio: \"inherit\" });\n } catch (error) {\n if (!isMissingCodexCli(error)) throw error;\n // Shipyard already requires npm. Use npx as a no-global-install fallback\n // when the user has not installed the Codex CLI on the host yet.\n execFileSync(\n process.platform === \"win32\" ? \"npx.cmd\" : \"npx\",\n [\"--yes\", \"@openai/codex\", ...codexLoginArgs],\n { cwd, stdio: \"inherit\" },\n );\n }\n};\n\n/**\n * Ensure the host has a file-backed Codex ChatGPT login for the generated\n * sandbox mount. The browser/device login remains user-driven; init only\n * starts it when an interactive terminal is available.\n */\nexport const ensureCodexChatGptAuth = (\n options: CodexAuthPreflightOptions,\n): void => {\n const authFile = codexAuthFilePath(options.authHome);\n if (isRegularFile(authFile)) return;\n\n if (!options.interactive) {\n throw new InitError({\n message:\n \"Codex ChatGPT authentication is not ready: ~/.codex/auth.json was not found. Run `codex login` in an interactive terminal, then rerun `shipyard init --codex-auth chatgpt` (non-interactive mode cannot open the login flow).\",\n });\n }\n\n try {\n (options.login ?? runCodexLogin)(options.cwd);\n } catch (error) {\n if (error instanceof InitError) throw error;\n if (isMissingCodexCli(error)) {\n throw new InitError({\n message:\n \"The Codex CLI is not installed. Install it with `npm install --global @openai/codex`, run `codex login`, and rerun Shipyard init.\",\n });\n }\n throw new InitError({\n message:\n \"Codex login failed. Complete `codex login` successfully, then rerun Shipyard init.\",\n });\n }\n\n if (!isRegularFile(authFile)) {\n throw new InitError({\n message:\n 'Codex login finished, but ~/.codex/auth.json was not created. Codex may be using an OS keyring or a managed configuration. Set `cli_auth_credentials_store = \"file\"` in `~/.codex/config.toml`, run `codex login` again, and rerun Shipyard init.',\n });\n }\n};\n","import { join } from \"node:path\";\n\nexport const REPOSITORY_RUNNER_WORKFLOW_PATH =\n \".github/workflows/shipyard-wake.yml\";\nexport const REPOSITORY_RUNNER_WAKE_EXECUTABLE = \"shipyard-wake\";\n\nexport const REPOSITORY_RUNNER_WORKFLOW = `name: Shipyard wake-up\n\non:\n issues:\n types: [labeled]\n workflow_dispatch:\n\npermissions: {}\n\njobs:\n filter:\n name: Check wake eligibility\n runs-on: ubuntu-latest\n outputs:\n wake: \\${{ steps.filter.outputs.wake }}\n steps:\n - name: Match the wake-up trigger\n id: filter\n shell: bash\n env:\n EVENT_NAME: \\${{ github.event_name }}\n LABEL_NAME: \\${{ github.event.label.name }}\n run: |\n if [[ \"$EVENT_NAME\" == \"workflow_dispatch\" ]] || [[ \"$EVENT_NAME\" == \"issues\" && \"$LABEL_NAME\" == \"shipyard\" ]]; then\n echo \"wake=true\" >> \"$GITHUB_OUTPUT\"\n else\n echo \"wake=false\" >> \"$GITHUB_OUTPUT\"\n fi\n\n wake:\n name: Deliver wake-up\n needs: filter\n if: needs.filter.outputs.wake == 'true'\n runs-on: [self-hosted, macOS, shipyard]\n steps:\n - name: Signal the foreground repository runner\n shell: bash\n run: '\"$RUNNER_TEMP/../../shipyard-wake\"'\n`;\n\nexport const REPOSITORY_RUNNER_WAKE_SCRIPT = `#!/bin/bash\nset -euo pipefail\n\nrunner_dir=\"$(cd -- \"$(dirname -- \"$0\")\" && pwd)\"\nlock_path=\"$runner_dir/.shipyard-controller.lock\"\n\nif [[ ! -r \"$lock_path\" ]]; then\n echo \"::error::The Shipyard repository runner controller is unavailable. Start it with npx shipyard runner start.\"\n exit 1\nfi\n\ncontroller_pid=\"$(sed -n 's/.*\"pid\"[[:space:]]*:[[:space:]]*\\\\([0-9][0-9]*\\\\).*/\\\\1/p' \"$lock_path\" | head -n 1)\"\ncontroller_started_at=\"$(sed -n 's/.*\"processStartedAt\"[[:space:]]*:[[:space:]]*\"\\\\([^\"]*\\\\)\".*/\\\\1/p' \"$lock_path\" | head -n 1)\"\nif [[ -z \"$controller_pid\" ]] || [[ -z \"$controller_started_at\" ]]; then\n echo \"::error::The Shipyard repository runner controller is unavailable. Start it with npx shipyard runner start.\"\n exit 1\nfi\ncurrent_started_at=\"$(ps -p \"$controller_pid\" -o lstart= 2>/dev/null | awk '{$1=$1; print}' || true)\"\nif [[ \"$current_started_at\" != \"$controller_started_at\" ]] || ! kill -0 \"$controller_pid\" 2>/dev/null; then\n echo \"::error::The Shipyard repository runner controller is unavailable. Start it with npx shipyard runner start.\"\n exit 1\nfi\n\nif ! kill -USR1 \"$controller_pid\"; then\n echo \"::error::The Shipyard repository runner controller could not receive the wake-up.\"\n exit 1\nfi\n\necho \"Wake-up delivered to the Shipyard repository runner controller.\"\n`;\n\nexport class RepositoryRunnerWakeError extends Error {\n readonly name = \"RepositoryRunnerWakeError\";\n}\n\nexport interface RepositoryRunnerWakeFileAdapters {\n readonly exists: (path: string) => Promise<boolean>;\n readonly readText: (path: string) => Promise<string>;\n readonly writeText: (path: string, content: string) => Promise<void>;\n readonly makeDirectory: (path: string) => Promise<void>;\n readonly chmod: (path: string, mode: number) => Promise<void>;\n}\n\ninterface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface CommandOptions {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n}\n\nexport interface RepositoryRunnerWakeGitHubAdapter {\n readonly run: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => Promise<CommandResult>;\n}\n\nexport interface RepositoryRunnerWakeSubscription {\n readonly next: () => Promise<void>;\n readonly close: () => void;\n}\n\nconst workflowCollisionMessage = (): string =>\n `Refusing to overwrite the differing workflow at ${REPOSITORY_RUNNER_WORKFLOW_PATH}. Replace it with the required Shipyard wake-only workflow, then retry:\\n\\n${REPOSITORY_RUNNER_WORKFLOW}`;\n\nconst publishedWorkflowFailureMessage = (\n repository: string,\n defaultBranch: string,\n error: unknown,\n): string => {\n const details = error instanceof Error ? error.message : String(error);\n if (\n /HTTP 403|Resource not accessible by personal access token/i.test(details)\n ) {\n return `The Shipyard wake workflow could not be read for ${repository} on the default branch (${defaultBranch}). GitHub denied Contents: Read access for the host gh login. Authenticate gh with repository administration access, then start the runner again. GitHub reported: ${details}`;\n }\n return `The Shipyard wake workflow is not active for ${repository}. Commit and push ${REPOSITORY_RUNNER_WORKFLOW_PATH} to the default branch (${defaultBranch}), then start the runner again. GitHub reported: ${details}`;\n};\n\nexport const assertRepositoryRunnerWorkflowCanBeInstalled = async (\n repoDir: string,\n adapters: RepositoryRunnerWakeFileAdapters,\n): Promise<void> => {\n const workflowPath = join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH);\n if (!(await adapters.exists(workflowPath))) return;\n if ((await adapters.readText(workflowPath)) !== REPOSITORY_RUNNER_WORKFLOW) {\n throw new RepositoryRunnerWakeError(workflowCollisionMessage());\n }\n};\n\nconst ensureDirectory = async (\n path: string,\n adapters: RepositoryRunnerWakeFileAdapters,\n): Promise<void> => {\n if (!(await adapters.exists(path))) await adapters.makeDirectory(path);\n};\n\nexport const installRepositoryRunnerWakeFiles = async (\n options: { readonly repoDir: string; readonly runnerDir: string },\n adapters: RepositoryRunnerWakeFileAdapters,\n): Promise<void> => {\n await assertRepositoryRunnerWorkflowCanBeInstalled(options.repoDir, adapters);\n const githubDir = join(options.repoDir, \".github\");\n const workflowsDir = join(githubDir, \"workflows\");\n await ensureDirectory(githubDir, adapters);\n await ensureDirectory(workflowsDir, adapters);\n await adapters.writeText(\n join(options.repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH),\n REPOSITORY_RUNNER_WORKFLOW,\n );\n\n const wakeExecutable = join(\n options.runnerDir,\n REPOSITORY_RUNNER_WAKE_EXECUTABLE,\n );\n await adapters.writeText(wakeExecutable, REPOSITORY_RUNNER_WAKE_SCRIPT);\n await adapters.chmod(wakeExecutable, 0o700);\n};\n\nexport const requirePublishedRepositoryRunnerWorkflow = async (\n options: {\n readonly repoDir: string;\n readonly repository: string;\n readonly environment: NodeJS.ProcessEnv;\n },\n adapter: RepositoryRunnerWakeGitHubAdapter,\n): Promise<void> => {\n let defaultBranch: string;\n try {\n const result = await adapter.run(\n \"gh\",\n [\"api\", `repos/${options.repository}`, \"--jq\", \".default_branch\"],\n { cwd: options.repoDir, env: options.environment },\n );\n defaultBranch = result.stdout.trim();\n if (defaultBranch.length === 0) throw new Error(\"empty default branch\");\n } catch (error) {\n throw new RepositoryRunnerWakeError(\n `Could not determine the GitHub default branch for ${options.repository}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n let publishedWorkflow: string;\n try {\n const result = await adapter.run(\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"GET\",\n \"-H\",\n \"Accept: application/vnd.github.raw+json\",\n `repos/${options.repository}/contents/${REPOSITORY_RUNNER_WORKFLOW_PATH}?ref=${encodeURIComponent(defaultBranch)}`,\n ],\n { cwd: options.repoDir, env: options.environment },\n );\n publishedWorkflow = result.stdout;\n } catch (error) {\n throw new RepositoryRunnerWakeError(\n publishedWorkflowFailureMessage(options.repository, defaultBranch, error),\n );\n }\n\n if (publishedWorkflow !== REPOSITORY_RUNNER_WORKFLOW) {\n throw new RepositoryRunnerWakeError(\n `The Shipyard wake workflow on the default branch (${defaultBranch}) does not match the required workflow. Update and push ${REPOSITORY_RUNNER_WORKFLOW_PATH}, then start the runner again.\\n\\n${REPOSITORY_RUNNER_WORKFLOW}`,\n );\n }\n};\n\n/** Coalesces signal deliveries until the foreground controller consumes them. */\nexport const createRepositoryRunnerWakeSubscription = (\n subscribe: (listener: () => void) => () => void = (listener) => {\n process.on(\"SIGUSR1\", listener);\n return () => process.removeListener(\"SIGUSR1\", listener);\n },\n): RepositoryRunnerWakeSubscription => {\n let pending = false;\n let closed = false;\n let resolveNext: (() => void) | undefined;\n const unsubscribe = subscribe(() => {\n if (closed || pending) return;\n pending = true;\n resolveNext?.();\n resolveNext = undefined;\n });\n\n return {\n next: async () => {\n if (closed) return;\n if (!pending) {\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n }\n pending = false;\n },\n close: () => {\n if (closed) return;\n closed = true;\n unsubscribe();\n resolveNext?.();\n resolveNext = undefined;\n },\n };\n};\n","import { createHash } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport {\n access,\n chmod,\n mkdir,\n lstat,\n realpath,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { ACTIVATION_LABEL, CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\nimport {\n assertProtectedDirectoryIdentities,\n repositoryRunnerEnvironment,\n type ProtectedDirectoryIdentity,\n} from \"./runnerSecurity.js\";\nimport {\n assertRepositoryRunnerWorkflowCanBeInstalled,\n installRepositoryRunnerWakeFiles,\n} from \"./RepositoryRunnerWake.js\";\nimport {\n RUNNER_INSTALL_METADATA,\n RunnerLifecycleError,\n validateExistingRepositoryRunner,\n} from \"./RepositoryRunnerLifecycle.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst RUNNER_ARCHIVE = \"runner.tgz\";\nconst RELEASES_API =\n \"https://api.github.com/repos/actions/runner/releases/latest\";\n\nexport class RunnerInstallError extends Error {\n readonly name: string = \"RunnerInstallError\";\n}\n\nexport interface ExistingRepositoryRunnerRegistration {\n readonly id: number | undefined;\n readonly name: string;\n readonly status: string;\n readonly busy: boolean;\n}\n\nexport class RunnerInstallConflictError extends RunnerInstallError {\n override readonly name = \"RunnerInstallConflictError\";\n\n readonly confirmationMessage: string;\n\n constructor(\n readonly repository: string,\n readonly runners: readonly ExistingRepositoryRunnerRegistration[],\n ) {\n const names = runners.map(({ name }) => name).join(\", \");\n super(\n `A repository runner labeled \\`${ACTIVATION_LABEL}\\` is already registered for ${repository}: ${names}. Remove it before installing another.`,\n );\n const details = runners\n .map(\n ({ id, name, status, busy }) =>\n `${name}${id === undefined ? \"\" : ` (#${id})`} (${status}${busy ? \", busy\" : \"\"})`,\n )\n .join(\", \");\n this.confirmationMessage = `GitHub has ${runners.length} repository runner${runners.length === 1 ? \"\" : \"s\"} labeled \\`${ACTIVATION_LABEL}\\` for ${repository}: ${details}. Delete ${runners.length === 1 ? \"this registration\" : \"these registrations\"} and install a replacement?`;\n }\n}\n\nexport interface RunnerInstallOptions {\n readonly repoDir: string;\n readonly registrationToken?: string;\n readonly onProgress?: (update: RunnerInstallProgress) => void;\n}\n\nexport interface RunnerInstallProgress {\n readonly current: number;\n readonly total: number;\n readonly message: string;\n}\n\nexport interface RunnerInstallResult {\n readonly name: string;\n readonly repository: string;\n readonly version: string;\n readonly runnerDir: string;\n}\n\ninterface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface CommandOptions {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n}\n\n/** Internal seams used to test installation without GitHub or a live runner. */\nexport interface RunnerInstallAdapters {\n readonly platform: () => NodeJS.Platform | string;\n readonly arch: () => string;\n readonly hostname: () => string;\n readonly environment: () => NodeJS.ProcessEnv;\n readonly exists: (path: string) => Promise<boolean>;\n readonly readText: (path: string) => Promise<string>;\n readonly writeText: (path: string, content: string) => Promise<void>;\n readonly writeBytes: (path: string, content: Uint8Array) => Promise<void>;\n readonly makeDirectory: (path: string) => Promise<void>;\n readonly remove: (path: string) => Promise<void>;\n readonly chmod: (path: string, mode: number) => Promise<void>;\n readonly commandExists: (command: string) => Promise<boolean>;\n readonly inspectDirectory?: (\n path: string,\n ) => Promise<ProtectedDirectoryIdentity>;\n readonly fetchJson: (url: string) => Promise<unknown>;\n readonly fetchBytes: (url: string) => Promise<Uint8Array>;\n readonly run: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => Promise<CommandResult>;\n}\n\ninterface RunnerReleaseAsset {\n readonly name: string;\n readonly browser_download_url: string;\n readonly digest: string;\n}\n\ninterface RunnerRelease {\n readonly tag_name: string;\n readonly assets: readonly RunnerReleaseAsset[];\n}\n\nconst defaultAdapters: RunnerInstallAdapters = {\n platform: () => process.platform,\n arch: () => process.arch,\n hostname,\n environment: () => process.env,\n exists: async (path) => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n },\n readText: (path) => readFile(path, \"utf8\"),\n writeText: (path, content) => writeFile(path, content, { mode: 0o600 }),\n writeBytes: (path, content) => writeFile(path, content, { mode: 0o600 }),\n makeDirectory: (path) => mkdir(path, { recursive: false, mode: 0o700 }),\n remove: (path) => rm(path, { recursive: true, force: true }),\n chmod,\n commandExists: async (command) => {\n try {\n await execFileAsync(\"which\", [command]);\n return true;\n } catch {\n return false;\n }\n },\n inspectDirectory: async (path) => {\n const [stat, resolved] = await Promise.all([lstat(path), realpath(path)]);\n return {\n realPath: resolved,\n directory: stat.isDirectory(),\n symbolicLink: stat.isSymbolicLink(),\n };\n },\n fetchJson: async (url) => {\n const response = await fetch(url, {\n headers: {\n Accept: \"application/vnd.github+json\",\n \"User-Agent\": \"shipyard-runner-installer\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n });\n if (!response.ok) {\n throw new Error(`GitHub returned HTTP ${response.status}`);\n }\n return response.json();\n },\n fetchBytes: async (url) => {\n const response = await fetch(url, {\n headers: { \"User-Agent\": \"shipyard-runner-installer\" },\n });\n if (!response.ok) {\n throw new Error(`GitHub returned HTTP ${response.status}`);\n }\n return new Uint8Array(await response.arrayBuffer());\n },\n run: async (command, args, options) => {\n const result = await execFileAsync(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n },\n};\n\nexport const parseGitHubRepository = (\n remote: string,\n): { owner: string; repository: string } => {\n const trimmed = remote.trim();\n const sshMatch = trimmed.match(\n /^(?:git@github\\.com:|ssh:\\/\\/git@github\\.com\\/)([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n );\n const httpsMatch = trimmed.match(\n /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?\\/?$/,\n );\n const match = sshMatch ?? httpsMatch;\n if (!match) {\n throw new RunnerInstallError(\n \"The origin remote must be a GitHub.com repository (github.com/owner/repository). GitHub Enterprise and other hosts are not supported yet.\",\n );\n }\n return { owner: match[1]!, repository: match[2]! };\n};\n\nconst normalizeNamePart = (value: string): string => {\n const normalized = value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-+/g, \"-\");\n return normalized || \"unknown\";\n};\n\nconst requireCommand = async (\n adapters: RunnerInstallAdapters,\n command: string,\n purpose: string,\n): Promise<void> => {\n if (!(await adapters.commandExists(command))) {\n throw new RunnerInstallError(\n `Missing required command \\`${command}\\` (${purpose}). Install it and retry.`,\n );\n }\n};\n\nconst asRelease = (value: unknown): RunnerRelease => {\n if (typeof value !== \"object\" || value === null) {\n throw new RunnerInstallError(\n \"GitHub returned invalid runner release metadata.\",\n );\n }\n const release = value as Partial<RunnerRelease>;\n if (typeof release.tag_name !== \"string\" || !Array.isArray(release.assets)) {\n throw new RunnerInstallError(\n \"GitHub returned invalid runner release metadata.\",\n );\n }\n return release as RunnerRelease;\n};\n\nconst selectArm64Asset = (release: RunnerRelease): RunnerReleaseAsset => {\n const asset = release.assets.find((candidate) =>\n /^actions-runner-osx-arm64-[\\d.]+\\.tar\\.gz$/.test(candidate.name),\n );\n if (\n !asset ||\n !asset.browser_download_url.startsWith(\n \"https://github.com/actions/runner/releases/download/\",\n ) ||\n !/^sha256:[a-f0-9]{64}$/i.test(asset.digest)\n ) {\n throw new RunnerInstallError(\n \"The latest official GitHub Actions runner release has no verifiable macOS ARM64 archive.\",\n );\n }\n return asset;\n};\n\nconst appendRunnerIgnores = async (\n gitignorePath: string,\n adapters: RunnerInstallAdapters,\n): Promise<void> => {\n const current = (await adapters.exists(gitignorePath))\n ? await adapters.readText(gitignorePath)\n : \"\";\n const lines = new Set(current.split(/\\r?\\n/));\n const additions = [`${RUNNER_DIR}/`].filter((line) => !lines.has(line));\n if (additions.length === 0) return;\n const prefix =\n current.length === 0 || current.endsWith(\"\\n\") ? current : `${current}\\n`;\n await adapters.writeText(gitignorePath, `${prefix}${additions.join(\"\\n\")}\\n`);\n};\n\nconst commandFailure = (purpose: string, error: unknown): RunnerInstallError =>\n new RunnerInstallError(\n `${purpose} failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n\nconst reportProgress = (\n options: RunnerInstallOptions,\n current: number,\n total: number,\n message: string,\n): void => options.onProgress?.({ current, total, message });\n\nconst parseExistingRunnerRegistrations = (\n stdout: string,\n): readonly ExistingRepositoryRunnerRegistration[] => {\n const lines = stdout.trim().split(/\\r?\\n/).filter(Boolean);\n return lines.map((line) => {\n let value: unknown;\n try {\n value = JSON.parse(line);\n } catch {\n // Accept the earlier name-only response format from injected adapters.\n // Such a result can block an install, but cannot be deleted without an ID.\n return { id: undefined, name: line, status: \"unknown\", busy: false };\n }\n if (typeof value !== \"object\" || value === null) {\n throw new RunnerInstallError(\n \"GitHub returned invalid repository runner information.\",\n );\n }\n const registration = value as Record<string, unknown>;\n if (\n typeof registration.id !== \"number\" ||\n !Number.isInteger(registration.id) ||\n registration.id <= 0 ||\n typeof registration.name !== \"string\" ||\n registration.name.length === 0 ||\n typeof registration.status !== \"string\" ||\n typeof registration.busy !== \"boolean\"\n ) {\n throw new RunnerInstallError(\n \"GitHub returned invalid repository runner information.\",\n );\n }\n return {\n id: registration.id,\n name: registration.name,\n status: registration.status,\n busy: registration.busy,\n };\n });\n};\n\nexport const removeExistingRepositoryRunnerRegistrations = async (\n options: {\n readonly repoDir: string;\n readonly conflict: RunnerInstallConflictError;\n },\n adapters: RunnerInstallAdapters = defaultAdapters,\n): Promise<void> => {\n if (options.conflict.runners.some(({ id }) => id === undefined)) {\n throw new RunnerInstallError(\n \"GitHub did not provide runner IDs, so Shipyard cannot safely remove the existing registrations. Remove them in GitHub Settings > Actions > Runners, then retry.\",\n );\n }\n\n const environment = adapters.environment();\n const removed: string[] = [];\n for (const runner of options.conflict.runners) {\n try {\n await adapters.run(\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"DELETE\",\n `repos/${options.conflict.repository}/actions/runners/${runner.id}`,\n ],\n { cwd: options.repoDir, env: environment },\n );\n removed.push(runner.name);\n } catch (error) {\n const previous =\n removed.length === 0\n ? \"\"\n : ` Earlier registrations were already removed: ${removed.join(\", \")}.`;\n throw new RunnerInstallError(\n `${\n commandFailure(\n `Removing GitHub runner ${runner.name} (#${runner.id}) from ${options.conflict.repository}`,\n error,\n ).message\n }${previous}`,\n );\n }\n }\n};\n\nexport const installRepositoryRunnerWithReplacement = async (\n options: {\n readonly repoDir: string;\n readonly interactive: boolean;\n readonly install: () => Promise<RunnerInstallResult>;\n readonly confirmReplacement: (\n conflict: RunnerInstallConflictError,\n ) => Promise<boolean>;\n },\n adapters: RunnerInstallAdapters = defaultAdapters,\n): Promise<RunnerInstallResult> => {\n try {\n return await options.install();\n } catch (error) {\n if (\n !(error instanceof RunnerInstallConflictError) ||\n !options.interactive\n ) {\n throw error;\n }\n if (!(await options.confirmReplacement(error))) {\n throw new RunnerInstallError(\n `${error.message} Existing runner registrations were left unchanged; installation cancelled.`,\n );\n }\n await removeExistingRepositoryRunnerRegistrations(\n {\n repoDir: options.repoDir,\n conflict: error,\n },\n adapters,\n );\n return options.install();\n }\n};\n\nexport const installRepositoryRunner = async (\n options: RunnerInstallOptions,\n adapters: RunnerInstallAdapters = defaultAdapters,\n): Promise<RunnerInstallResult> => {\n if (adapters.platform() !== \"darwin\" || adapters.arch() !== \"arm64\") {\n throw new RunnerInstallError(\n \"Repository runners currently require Apple Silicon macOS (darwin/arm64).\",\n );\n }\n\n const configDir = join(options.repoDir, CONFIG_DIR);\n const runnerDir = join(configDir, RUNNER_DIR);\n if (!(await adapters.exists(configDir))) {\n throw new RunnerInstallError(\n `No ${CONFIG_DIR}/ found. Run \\`shipyard init\\` in this repository first.`,\n );\n }\n const runnerExists = await adapters.exists(runnerDir);\n const progressTotal = runnerExists ? 3 : 8;\n try {\n await assertRepositoryRunnerWorkflowCanBeInstalled(\n options.repoDir,\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n error instanceof Error ? error.message : String(error),\n );\n }\n\n await requireCommand(adapters, \"git\", \"reading the repository remote\");\n if (!runnerExists) {\n await requireCommand(adapters, \"tar\", \"extracting the runner archive\");\n }\n await requireCommand(adapters, \"gh\", \"checking repository runner uniqueness\");\n\n const hostEnv = adapters.environment();\n const gitRemote = await adapters\n .run(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: options.repoDir,\n env: hostEnv,\n })\n .catch((error) => {\n throw commandFailure(\"Reading the origin remote\", error);\n });\n const identity = parseGitHubRepository(gitRemote.stdout);\n const repository = `${identity.owner}/${identity.repository}`;\n const repoUrl = `https://github.com/${repository}`;\n const runnerName = `shipyard-${normalizeNamePart(identity.repository)}-${normalizeNamePart(adapters.hostname())}`;\n\n await adapters\n .run(\"gh\", [\"auth\", \"status\", \"--hostname\", \"github.com\"], {\n cwd: options.repoDir,\n env: hostEnv,\n })\n .catch((error) => {\n throw commandFailure(\n \"GitHub CLI authentication (repository administration is required)\",\n error,\n );\n });\n reportProgress(\n options,\n 1,\n progressTotal,\n \"Validated repository and GitHub access\",\n );\n\n if (runnerExists) {\n let metadata;\n try {\n metadata = await validateExistingRepositoryRunner(\n {\n repoDir: options.repoDir,\n runnerDir,\n repository,\n runnerName,\n },\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n error instanceof RunnerLifecycleError\n ? error.message\n : `Validating the existing repository runner failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n await appendRunnerIgnores(join(configDir, \".gitignore\"), adapters);\n await adapters.chmod(runnerDir, 0o700);\n await assertProtectedDirectoryIdentities(\n runnerDir,\n adapters.inspectDirectory,\n ).catch((error) => {\n throw commandFailure(\"Validating protected runner directories\", error);\n });\n reportProgress(options, 2, progressTotal, \"Validated existing runner\");\n try {\n await installRepositoryRunnerWakeFiles(\n { repoDir: options.repoDir, runnerDir },\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n `The existing runner is valid, but its wake-up files could not be refreshed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n reportProgress(options, 3, progressTotal, \"Refreshed wake-up workflow\");\n return {\n name: metadata.name,\n repository: metadata.repository,\n version: metadata.version,\n runnerDir,\n };\n }\n\n const existing = await adapters\n .run(\n \"gh\",\n [\n \"api\",\n \"--paginate\",\n `repos/${repository}/actions/runners`,\n \"--jq\",\n `.runners[] | select(any(.labels[]; .name == \\\"${ACTIVATION_LABEL}\\\")) | {id, name, status, busy}`,\n ],\n { cwd: options.repoDir, env: hostEnv },\n )\n .catch((error) => {\n throw commandFailure(\n \"Checking existing repository runners (repository administration is required)\",\n error,\n );\n });\n const existingRegistrations = parseExistingRunnerRegistrations(\n existing.stdout,\n );\n if (existingRegistrations.length > 0) {\n throw new RunnerInstallConflictError(repository, existingRegistrations);\n }\n reportProgress(\n options,\n 2,\n progressTotal,\n \"Checked for conflicting repository runners\",\n );\n\n let registrationToken = options.registrationToken;\n if (!registrationToken) {\n const tokenResult = await adapters\n .run(\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"POST\",\n `repos/${repository}/actions/runners/registration-token`,\n ],\n { cwd: options.repoDir, env: hostEnv },\n )\n .catch((error) => {\n throw commandFailure(\n \"Requesting a one-time runner registration token (repository administration is required)\",\n error,\n );\n });\n try {\n const parsed = JSON.parse(tokenResult.stdout) as { token?: unknown };\n if (typeof parsed.token !== \"string\" || parsed.token.length === 0) {\n throw new Error(\"response did not contain a token\");\n }\n registrationToken = parsed.token;\n } catch (error) {\n throw commandFailure(\"Reading the one-time registration token\", error);\n }\n }\n reportProgress(\n options,\n 3,\n progressTotal,\n \"Prepared runner registration token\",\n );\n\n let release: RunnerRelease;\n try {\n release = asRelease(await adapters.fetchJson(RELEASES_API));\n } catch (error) {\n if (error instanceof RunnerInstallError) throw error;\n throw commandFailure(\"Fetching official runner release metadata\", error);\n }\n const asset = selectArm64Asset(release);\n const version = release.tag_name.replace(/^v/, \"\");\n let archive: Uint8Array;\n try {\n archive = await adapters.fetchBytes(asset.browser_download_url);\n } catch (error) {\n throw commandFailure(\"Downloading the official runner archive\", error);\n }\n const actualDigest = createHash(\"sha256\").update(archive).digest(\"hex\");\n const expectedDigest = asset.digest.slice(\"sha256:\".length).toLowerCase();\n if (actualDigest !== expectedDigest) {\n throw new RunnerInstallError(\n `Runner archive digest mismatch: expected ${expectedDigest}, received ${actualDigest}. Nothing was installed.`,\n );\n }\n reportProgress(\n options,\n 4,\n progressTotal,\n \"Downloaded and verified official runner archive\",\n );\n\n await appendRunnerIgnores(join(configDir, \".gitignore\"), adapters);\n await adapters.makeDirectory(runnerDir).catch((error) => {\n throw commandFailure(\"Creating the protected runner directory\", error);\n });\n await assertProtectedDirectoryIdentities(\n runnerDir,\n adapters.inspectDirectory,\n ).catch((error) => {\n throw commandFailure(\"Validating protected runner directories\", error);\n });\n await adapters.chmod(runnerDir, 0o700);\n reportProgress(\n options,\n 5,\n progressTotal,\n \"Prepared protected runner directories\",\n );\n\n const archivePath = join(runnerDir, RUNNER_ARCHIVE);\n await adapters.writeBytes(archivePath, archive);\n try {\n await adapters.run(\"tar\", [\"-xzf\", archivePath, \"--directory\", runnerDir], {\n cwd: options.repoDir,\n env: repositoryRunnerEnvironment(hostEnv),\n });\n } catch (error) {\n await adapters.remove(runnerDir);\n throw commandFailure(\"Extracting the verified runner archive\", error);\n } finally {\n await adapters.remove(archivePath);\n }\n reportProgress(options, 6, progressTotal, \"Extracted runner archive\");\n\n try {\n await adapters.run(\n \"./config.sh\",\n [\n \"--url\",\n repoUrl,\n \"--token\",\n registrationToken!,\n \"--name\",\n runnerName,\n \"--labels\",\n ACTIVATION_LABEL,\n \"--work\",\n \"_work\",\n \"--unattended\",\n ],\n { cwd: runnerDir, env: repositoryRunnerEnvironment(hostEnv) },\n );\n } catch {\n const cleanup = await Promise.allSettled([adapters.remove(runnerDir)]);\n const cleanupSucceeded = cleanup.every(\n (result) => result.status === \"fulfilled\",\n );\n throw new RunnerInstallError(\n cleanupSucceeded\n ? `Registering ${runnerName} failed. Partial local runner files were removed so installation can be retried. Check GitHub Settings > Actions > Runners for an orphan registration; the one-time token was not stored.`\n : `Registering ${runnerName} failed and partial local runner files could not be fully removed. Remove only ${runnerDir}, check GitHub Settings > Actions > Runners for an orphan registration, then retry. The one-time token was not stored.`,\n );\n }\n reportProgress(options, 7, progressTotal, \"Registered runner with GitHub\");\n\n await adapters.writeText(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n `${JSON.stringify(\n {\n schemaVersion: 1,\n repository,\n repositoryUrl: repoUrl,\n name: runnerName,\n label: ACTIVATION_LABEL,\n version,\n },\n null,\n 2,\n )}\\n`,\n );\n\n try {\n await installRepositoryRunnerWakeFiles(\n { repoDir: options.repoDir, runnerDir },\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n `The runner was registered, but its wake-up files could not be installed. Runner files were retained at ${runnerDir}; fix the error and retry: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n reportProgress(options, 8, progressTotal, \"Installed wake-up workflow\");\n\n return { name: runnerName, repository, version, runnerDir };\n};\n","import { CLI_NAME } from \"./runtimeNames.js\";\nimport { REPOSITORY_RUNNER_WORKFLOW_PATH } from \"./RepositoryRunnerWake.js\";\n\nexport const repositoryRunnerNextSteps = (): readonly string[] => [\n `Ensure ${REPOSITORY_RUNNER_WORKFLOW_PATH} is committed and pushed to the repository's default branch`,\n `Keep the foreground controller open with \\`npx ${CLI_NAME} runner start\\``,\n `Inspect it from another terminal with \\`npx ${CLI_NAME} runner status\\``,\n `Stop it with \\`npx ${CLI_NAME} runner stop\\``,\n `Unregister and delete its protected files with \\`npx ${CLI_NAME} runner remove\\``,\n];\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { CONFIG_DIR } from \"./runtimeNames.js\";\nimport { REPOSITORY_RUNNER_WORKFLOW_PATH } from \"./RepositoryRunnerWake.js\";\n\nexport interface InitGitSetupResult {\n readonly branch: string;\n readonly commit: string;\n readonly pushError?: string;\n}\n\nconst errorText = (error: unknown): string => {\n if (error !== null && typeof error === \"object\" && \"stderr\" in error) {\n const stderr = error.stderr;\n if (typeof stderr === \"string\" || Buffer.isBuffer(stderr)) {\n const text = stderr.toString().trim();\n if (text) return text;\n }\n }\n return error instanceof Error ? error.message : String(error);\n};\n\n/** Commit generated setup files, then push the current branch to origin. */\nexport const commitAndPushInitSetup = (repoDir: string): InitGitSetupResult => {\n const branch = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd: repoDir,\n encoding: \"utf8\",\n }).trim();\n if (!branch) {\n throw new Error(\"Cannot push the Shipyard setup from a detached HEAD.\");\n }\n\n const paths = [CONFIG_DIR];\n if (existsSync(join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH))) {\n paths.push(REPOSITORY_RUNNER_WORKFLOW_PATH);\n }\n\n execFileSync(\"git\", [\"add\", \"--\", ...paths], {\n cwd: repoDir,\n stdio: \"ignore\",\n });\n // Keep unrelated staged changes out of the generated setup commit.\n execFileSync(\n \"git\",\n [\"commit\", \"--only\", \"-m\", \"Add Shipyard setup\", \"--\", ...paths],\n { cwd: repoDir, stdio: \"pipe\" },\n );\n const commit = execFileSync(\"git\", [\"rev-parse\", \"--short\", \"HEAD\"], {\n cwd: repoDir,\n encoding: \"utf8\",\n }).trim();\n\n try {\n execFileSync(\"git\", [\"push\", \"origin\", `HEAD:refs/heads/${branch}`], {\n cwd: repoDir,\n stdio: \"pipe\",\n });\n return { branch, commit };\n } catch (error) {\n return { branch, commit, pushError: errorText(error) };\n }\n};\n","import { execFile, spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n lstat,\n mkdir,\n readFile,\n realpath,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { NodeFileSystem } from \"@effect/platform-node\";\nimport { Effect } from \"effect\";\nimport { resolveEnv } from \"./EnvResolver.js\";\nimport { parseGitHubRepository } from \"./RepositoryRunner.js\";\nimport {\n repositoryRunnerEnvironment,\n type ProtectedDirectoryIdentity,\n} from \"./runnerSecurity.js\";\nimport {\n createRepositoryRunnerWakeSubscription,\n requirePublishedRepositoryRunnerWorkflow,\n} from \"./RepositoryRunnerWake.js\";\nimport {\n removeOwnedRepositoryRunnerContainers,\n recoverRepositoryRunner,\n RUNNER_CONTROLLER_LOCK,\n RUNNER_INSTALL_METADATA,\n RUNNER_WORK_DIR,\n RunnerLifecycleError,\n REPOSITORY_RUNNER_OWNER_ENV,\n lockOwnsProcess,\n type RunnerInstallMetadata,\n type RunnerLifecycleAdapters,\n type RunnerControllerLock,\n} from \"./RepositoryRunnerLifecycle.js\";\nimport { ACTIVATION_LABEL, CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\nimport {\n DEFAULT_LOG_RETENTION_DAYS,\n purgeRunLogs,\n type PurgeRunLogsOptions,\n type PurgeRunLogsResult,\n} from \"./LogRetention.js\";\n\nconst execFileAsync = promisify(execFile);\nconst CONTROLLER_STATE = \".shipyard-state.json\";\nconst LAST_FAILURE = \".shipyard-last-failure.json\";\nconst LOG_PURGE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\n\ninterface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface CommandOptions {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n}\n\nexport class RunnerControlError extends Error {\n readonly name = \"RunnerControlError\";\n}\n\nconst retainedFailures = new WeakSet<RunnerControlError>();\n\nexport interface RepositoryRunnerChild {\n readonly pid: number;\n readonly wait: () => Promise<{\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n }>;\n readonly terminate: (signal: NodeJS.Signals) => void;\n}\n\n/** Internal seams for process, GitHub, filesystem, credentials, and shutdown tests. */\nexport interface RunnerControlAdapters {\n readonly platform: () => NodeJS.Platform | string;\n readonly arch: () => string;\n readonly environment: () => NodeJS.ProcessEnv;\n readonly currentPid: () => number;\n readonly processIdentity: (pid: number) => Promise<string | undefined>;\n readonly exists: (path: string) => Promise<boolean>;\n readonly inspectDirectory?: (\n path: string,\n ) => Promise<ProtectedDirectoryIdentity>;\n readonly readText: (path: string) => Promise<string>;\n readonly writeText: (path: string, content: string) => Promise<void>;\n readonly writeExclusive: (path: string, content: string) => Promise<void>;\n readonly remove: (path: string) => Promise<void>;\n readonly makeDirectory: (path: string) => Promise<void>;\n readonly removeTree: (path: string) => Promise<void>;\n readonly commandExists: (command: string) => Promise<boolean>;\n readonly resolveEnvironment: (\n repoDir: string,\n ) => Promise<Record<string, string>>;\n readonly run: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => Promise<CommandResult>;\n readonly spawn: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => RepositoryRunnerChild;\n readonly isProcessRunning: (pid: number) => boolean;\n readonly signalProcess: (pid: number, signal: NodeJS.Signals) => void;\n readonly onShutdown: (handler: () => Promise<void>) => () => void;\n readonly onWake?: (handler: () => void) => () => void;\n readonly pause: (milliseconds: number) => Promise<void>;\n readonly now: () => Date;\n readonly purgeRunLogs: (\n options: PurgeRunLogsOptions,\n ) => Promise<PurgeRunLogsResult>;\n readonly scheduleRecurring: (\n task: () => Promise<void>,\n milliseconds: number,\n ) => () => void;\n readonly report: (message: string) => void;\n}\n\ntype RunnerControllerStateName =\n | \"idle\"\n | \"processing\"\n | \"stalled\"\n | \"stopping\"\n | \"stopped\";\n\ninterface RunnerWakeRecord {\n readonly source: \"startup\" | \"signal\";\n readonly recordedAt: string;\n}\n\ninterface RunnerControllerState {\n readonly schemaVersion: 1;\n readonly repository: string;\n readonly state: RunnerControllerStateName;\n readonly lastOutcome: string;\n readonly lastWake?: RunnerWakeRecord;\n}\n\nexport interface RepositoryRunnerStartResult {\n readonly repository: string;\n readonly initialWorkFound: boolean;\n}\n\nexport interface RepositoryRunnerStatus {\n readonly installed: boolean;\n readonly running: boolean;\n readonly pid?: number;\n readonly github: \"online\" | \"offline\" | \"unreachable\" | \"not-installed\";\n readonly repository?: string;\n readonly state: RunnerControllerStateName | \"not-installed\";\n readonly lastOutcome: string;\n readonly lastWake?: RunnerWakeRecord;\n}\n\nconst spawnForegroundChild = (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n): RepositoryRunnerChild => {\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n stdio: \"inherit\",\n detached: true,\n });\n const pid = child.pid;\n if (pid === undefined) {\n throw new RunnerControlError(`Could not start ${command}.`);\n }\n const result = new Promise<{\n code: number | null;\n signal: NodeJS.Signals | null;\n }>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => resolve({ code, signal }));\n });\n return {\n pid,\n wait: () => result,\n terminate: (signal) => {\n try {\n process.kill(-pid, signal);\n } catch {\n child.kill(signal);\n }\n },\n };\n};\n\nconst registerRunnerShutdown = (handler: () => Promise<void>): (() => void) => {\n const signals = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const;\n let handling = false;\n const listeners = new Map<NodeJS.Signals, () => void>();\n const unregister = () => {\n for (const [signal, listener] of listeners) {\n process.removeListener(signal, listener);\n }\n listeners.clear();\n };\n\n for (const signal of signals) {\n const listener = () => {\n if (handling) return;\n handling = true;\n void handler().finally(() => {\n unregister();\n process.exit(\n signal === \"SIGINT\" ? 130 : signal === \"SIGTERM\" ? 143 : 129,\n );\n });\n };\n listeners.set(signal, listener);\n process.once(signal, listener);\n }\n return unregister;\n};\n\nconst defaultAdapters: RunnerControlAdapters = {\n platform: () => process.platform,\n arch: () => process.arch,\n environment: () => process.env,\n currentPid: () => process.pid,\n processIdentity: async (pid) => {\n try {\n const result = await execFileAsync(\"ps\", [\n \"-p\",\n String(pid),\n \"-o\",\n \"lstart=\",\n ]);\n const identity = result.stdout.trim().replace(/\\s+/g, \" \");\n return identity.length > 0 ? identity : undefined;\n } catch {\n return undefined;\n }\n },\n exists: async (path) => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n },\n inspectDirectory: async (path) => {\n const [stat, resolved] = await Promise.all([lstat(path), realpath(path)]);\n return {\n realPath: resolved,\n directory: stat.isDirectory(),\n symbolicLink: stat.isSymbolicLink(),\n };\n },\n readText: (path) => readFile(path, \"utf8\"),\n writeText: (path, content) => writeFile(path, content, { mode: 0o600 }),\n writeExclusive: (path, content) =>\n writeFile(path, content, { encoding: \"utf8\", mode: 0o600, flag: \"wx\" }),\n remove: (path) => rm(path, { force: true }),\n makeDirectory: async (path) => {\n await mkdir(path, { recursive: true, mode: 0o700 });\n },\n removeTree: (path) => rm(path, { recursive: true, force: true }),\n commandExists: async (command) => {\n try {\n await execFileAsync(\"which\", [command]);\n return true;\n } catch {\n return false;\n }\n },\n resolveEnvironment: (repoDir) =>\n Effect.runPromise(\n resolveEnv(repoDir).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n run: async (command, args, options) => {\n const result = await execFileAsync(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n },\n spawn: spawnForegroundChild,\n isProcessRunning: (pid) => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n },\n signalProcess: (pid, signal) => process.kill(pid, signal),\n onShutdown: registerRunnerShutdown,\n pause: (milliseconds) =>\n new Promise((resolve) => setTimeout(resolve, milliseconds)),\n now: () => new Date(),\n purgeRunLogs,\n scheduleRecurring: (task, milliseconds) => {\n const timer = setInterval(() => {\n void task();\n }, milliseconds);\n return () => clearInterval(timer);\n },\n report: (message) => console.log(message),\n};\n\nconst readJson = async <T>(\n path: string,\n adapters: RunnerControlAdapters,\n): Promise<T | undefined> => {\n if (!(await adapters.exists(path))) return undefined;\n try {\n return JSON.parse(await adapters.readText(path)) as T;\n } catch (error) {\n throw new RunnerControlError(\n `Could not read repository runner state at ${path}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n};\n\nconst writeJson = (\n path: string,\n value: object,\n adapters: RunnerControlAdapters,\n): Promise<void> =>\n adapters.writeText(path, `${JSON.stringify(value, null, 2)}\\n`);\n\nconst controlFailure = (purpose: string, error: unknown): RunnerControlError =>\n error instanceof RunnerControlError\n ? error\n : new RunnerControlError(\n `${purpose} failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n\nconst runCommand = async (\n adapters: RunnerControlAdapters,\n purpose: string,\n command: string,\n args: readonly string[],\n options: CommandOptions,\n): Promise<CommandResult> => {\n try {\n return await adapters.run(command, args, options);\n } catch (error) {\n throw controlFailure(purpose, error);\n }\n};\n\nconst requireCommand = async (\n adapters: RunnerControlAdapters,\n command: string,\n purpose: string,\n): Promise<void> => {\n if (!(await adapters.commandExists(command))) {\n throw new RunnerControlError(\n `Missing required command \\`${command}\\` (${purpose}). Install it and retry.`,\n );\n }\n};\n\ninterface RunnerControlContext {\n readonly runnerDir: string;\n readonly repository: string;\n readonly metadata: RunnerInstallMetadata;\n readonly hostEnvironment: NodeJS.ProcessEnv;\n readonly runtimeEnvironment: NodeJS.ProcessEnv;\n}\n\nconst requireRunnerContext = async (\n repoDir: string,\n adapters: RunnerControlAdapters,\n): Promise<RunnerControlContext> => {\n if (adapters.platform() !== \"darwin\" || adapters.arch() !== \"arm64\") {\n throw new RunnerControlError(\n \"Repository runners currently require Apple Silicon macOS (darwin/arm64).\",\n );\n }\n\n const configDir = join(repoDir, CONFIG_DIR);\n const runnerDir = join(configDir, RUNNER_DIR);\n if (!(await adapters.exists(configDir))) {\n throw new RunnerControlError(\n `No ${CONFIG_DIR}/ found. Run \\`shipyard init\\` in this repository first.`,\n );\n }\n if (!(await adapters.exists(runnerDir))) {\n throw new RunnerControlError(\n `No repository runner is installed at ${runnerDir}. Run \\`shipyard runner install\\` first.`,\n );\n }\n if (adapters.inspectDirectory) {\n const runnerIdentity = await adapters\n .inspectDirectory(runnerDir)\n .catch((error) => {\n throw controlFailure(\n \"Inspecting the protected runner directory\",\n error,\n );\n });\n if (!runnerIdentity.directory || runnerIdentity.symbolicLink) {\n throw new RunnerControlError(\n `The protected repository runner path must be a real directory: ${runnerDir}`,\n );\n }\n }\n\n const metadata = await readJson<RunnerInstallMetadata>(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n adapters,\n );\n if (\n metadata?.schemaVersion !== 1 ||\n typeof metadata.repository !== \"string\" ||\n typeof metadata.name !== \"string\" ||\n metadata.label !== ACTIVATION_LABEL\n ) {\n throw new RunnerControlError(\n \"The repository runner installation metadata is missing or invalid. Reinstall the repository runner.\",\n );\n }\n if (!(await adapters.exists(join(runnerDir, \"run.sh\")))) {\n throw new RunnerControlError(\n \"The official repository runner executable is missing. Reinstall the repository runner.\",\n );\n }\n\n for (const [command, purpose] of [\n [\"git\", \"reading the repository remote\"],\n [\"npx\", \"running the local Shipyard package\"],\n [\"docker\", \"checking the Docker runtime\"],\n [\"gh\", \"checking GitHub access\"],\n ] as const) {\n await requireCommand(adapters, command, purpose);\n }\n\n const hostEnvironment = adapters.environment();\n const resolvedEnvironment = await adapters\n .resolveEnvironment(repoDir)\n .catch((error) => {\n throw controlFailure(\"Resolving repository credentials\", error);\n });\n const runtimeEnvironment = {\n ...hostEnvironment,\n ...resolvedEnvironment,\n [REPOSITORY_RUNNER_OWNER_ENV]: metadata.repository,\n };\n const remote = await runCommand(\n adapters,\n \"Reading the origin remote\",\n \"git\",\n [\"remote\", \"get-url\", \"origin\"],\n { cwd: repoDir, env: runtimeEnvironment },\n );\n let identity: { owner: string; repository: string };\n try {\n identity = parseGitHubRepository(remote.stdout);\n } catch (error) {\n throw new RunnerControlError(\n error instanceof Error ? error.message : String(error),\n );\n }\n const repository = `${identity.owner}/${identity.repository}`;\n if (repository !== metadata.repository) {\n throw new RunnerControlError(\n `The installed repository runner belongs to ${metadata.repository}, but this repository origin is ${repository}. Reinstall it for this repository.`,\n );\n }\n\n await runCommand(\n adapters,\n \"Checking the local Shipyard package\",\n \"npx\",\n [\"--no-install\", \"shipyard\", \"--version\"],\n { cwd: repoDir, env: runtimeEnvironment },\n );\n await runCommand(\n adapters,\n \"Checking Docker availability\",\n \"docker\",\n [\"info\"],\n { cwd: repoDir, env: runtimeEnvironment },\n );\n await runCommand(\n adapters,\n \"Checking GitHub authentication\",\n \"gh\",\n [\"auth\", \"status\", \"--hostname\", \"github.com\"],\n { cwd: repoDir, env: hostEnvironment },\n );\n\n const label = await runCommand(\n adapters,\n \"Checking the activation label\",\n \"gh\",\n [\n \"label\",\n \"list\",\n \"--repo\",\n repository,\n \"--json\",\n \"name\",\n \"--jq\",\n `.[] | select(.name == \"${ACTIVATION_LABEL}\") | .name`,\n ],\n { cwd: repoDir, env: hostEnvironment },\n );\n if (label.stdout.trim() !== ACTIVATION_LABEL) {\n await runCommand(\n adapters,\n \"Creating the activation label\",\n \"gh\",\n [\n \"label\",\n \"create\",\n ACTIVATION_LABEL,\n \"--repo\",\n repository,\n \"--color\",\n \"1D76DB\",\n \"--description\",\n \"Tasks available to the Shipyard repository runner\",\n \"--force\",\n ],\n { cwd: repoDir, env: hostEnvironment },\n );\n }\n\n await requirePublishedRepositoryRunnerWorkflow(\n {\n repoDir,\n repository,\n // The published workflow is an administrative runner preflight. Keep\n // it on the host's gh login instead of the runtime token from\n // .shipyard/.env, which has no runner administration permission.\n environment: hostEnvironment,\n },\n adapters,\n ).catch((error) => {\n throw new RunnerControlError(\n error instanceof Error ? error.message : String(error),\n );\n });\n\n return {\n runnerDir,\n repository,\n metadata,\n hostEnvironment,\n runtimeEnvironment,\n };\n};\n\nconst childFailure = (\n command: string,\n result: { code: number | null; signal: NodeJS.Signals | null },\n): RunnerControlError =>\n new RunnerControlError(\n result.signal === null\n ? `${command} exited with code ${result.code ?? \"unknown\"}.`\n : `${command} was terminated by ${result.signal}.`,\n );\n\nconst stopChildBounded = async (\n child: RepositoryRunnerChild,\n pause: (milliseconds: number) => Promise<void>,\n): Promise<void> => {\n child.terminate(\"SIGTERM\");\n const stopped = await Promise.race([\n child.wait().then(() => true),\n pause(5_000).then(() => false),\n ]);\n if (stopped) return;\n child.terminate(\"SIGKILL\");\n const killed = await Promise.race([\n child.wait().then(() => true),\n pause(1_000).then(() => false),\n ]);\n if (!killed) {\n throw new RunnerControlError(\n `Process ${child.pid} did not exit after SIGKILL.`,\n );\n }\n};\n\nconst bestEffort = async (operation: () => Promise<unknown>): Promise<void> => {\n try {\n await operation();\n } catch {\n // Cleanup and diagnostic persistence must not hide the triggering failure.\n }\n};\n\nconst startRepositoryRunnerManaged = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<RepositoryRunnerStartResult> => {\n const context = await requireRunnerContext(options.repoDir, adapters);\n const lifecycleAdapters: RunnerLifecycleAdapters = {\n environment: adapters.environment,\n exists: adapters.exists,\n readText: adapters.readText,\n makeDirectory: adapters.makeDirectory,\n inspectDirectory: adapters.inspectDirectory,\n remove: adapters.removeTree,\n run: adapters.run,\n isProcessRunning: adapters.isProcessRunning,\n signalProcess: adapters.signalProcess,\n pause: adapters.pause,\n processIdentity: adapters.processIdentity,\n };\n await recoverRepositoryRunner(\n {\n repoDir: options.repoDir,\n runnerDir: context.runnerDir,\n metadata: context.metadata,\n runnerEnvironment: repositoryRunnerEnvironment(context.hostEnvironment),\n dockerEnvironment: context.runtimeEnvironment,\n },\n lifecycleAdapters,\n ).catch((error) => {\n throw new RunnerControlError(\n error instanceof RunnerLifecycleError\n ? error.message\n : `Repository runner recovery failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n });\n const lockPath = join(context.runnerDir, RUNNER_CONTROLLER_LOCK);\n const statePath = join(context.runnerDir, CONTROLLER_STATE);\n const failurePath = join(context.runnerDir, LAST_FAILURE);\n const existingLock = await readJson<RunnerControllerLock>(lockPath, adapters);\n if (await lockOwnsProcess(existingLock, adapters)) {\n throw new RunnerControlError(\n `The repository runner is already running with process ${existingLock!.pid}.`,\n );\n }\n if (existingLock) {\n throw new RunnerControlError(\n \"The repository runner has stale process state. Run it again after recovery or remove the stale installation.\",\n );\n }\n\n const controllerPid = adapters.currentPid();\n const processStartedAt = await adapters.processIdentity(controllerPid);\n if (!processStartedAt) {\n throw new RunnerControlError(\n \"Could not establish the repository runner controller process identity.\",\n );\n }\n const lock: RunnerControllerLock = {\n schemaVersion: 1,\n pid: controllerPid,\n repository: context.repository,\n processStartedAt,\n };\n try {\n await adapters.writeExclusive(lockPath, `${JSON.stringify(lock)}\\n`);\n } catch (error) {\n throw controlFailure(\"Claiming the repository runner process\", error);\n }\n\n let listenerChild: RepositoryRunnerChild | undefined;\n let shipyardChild: RepositoryRunnerChild | undefined;\n let cancelLogPurge: (() => void) | undefined;\n let stopping = false;\n let lastWake: RunnerWakeRecord | undefined;\n let shutdownPromise: Promise<void> | undefined;\n let primaryFailure: RunnerControlError | undefined;\n const saveState = async (\n state: RunnerControllerStateName,\n lastOutcome: string,\n ): Promise<void> => {\n await writeJson(\n statePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n state,\n lastOutcome,\n ...(lastWake ? { lastWake } : {}),\n } satisfies RunnerControllerState,\n adapters,\n );\n adapters.report(`[repository runner] ${state}: ${lastOutcome}`);\n };\n const purgeLogs = async (): Promise<void> => {\n if (stopping || shipyardChild !== undefined) return;\n try {\n const result = await adapters.purgeRunLogs({\n repoDir: options.repoDir,\n retentionDays: DEFAULT_LOG_RETENTION_DAYS,\n now: adapters.now(),\n });\n const removed = result.removedCount;\n if (removed > 0) {\n adapters.report(\n `[repository runner] purged ${removed} outdated run-log ${removed === 1 ? \"entry\" : \"entries\"}`,\n );\n }\n } catch (error) {\n adapters.report(\n `[repository runner] log purge skipped: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n };\n const removeTransientWork = () =>\n adapters.removeTree(join(context.runnerDir, RUNNER_WORK_DIR));\n const removeOwnedContainers = () =>\n removeOwnedRepositoryRunnerContainers(\n {\n repoDir: options.repoDir,\n repository: context.repository,\n environment: context.runtimeEnvironment,\n },\n lifecycleAdapters,\n );\n const attemptCleanup = async (\n failures: string[],\n purpose: string,\n operation: () => Promise<unknown>,\n ): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n const message = `${purpose} failed: ${error instanceof Error ? error.message : String(error)}`;\n failures.push(message);\n adapters.report(`[repository runner] cleanup error: ${message}`);\n }\n };\n const persistCleanupFailures = async (\n failures: readonly string[],\n ): Promise<void> => {\n if (failures.length === 0) return;\n const cleanupMessage = `Repository runner cleanup failed: ${failures.join(\"; \")}`;\n const message = primaryFailure\n ? `${primaryFailure.message} ${cleanupMessage}`\n : cleanupMessage;\n await bestEffort(() =>\n writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n ).then(() => {\n if (primaryFailure) retainedFailures.add(primaryFailure);\n }),\n );\n await bestEffort(() => saveState(\"stopped\", cleanupMessage));\n };\n const shutdown = (): Promise<void> => {\n if (shutdownPromise) return shutdownPromise;\n shutdownPromise = (async () => {\n stopping = true;\n const failures: string[] = [];\n const children = [listenerChild, shipyardChild].filter(\n (child): child is RepositoryRunnerChild => child !== undefined,\n );\n listenerChild = undefined;\n shipyardChild = undefined;\n await Promise.all(\n children.map((child) =>\n attemptCleanup(failures, `Stopping process ${child.pid}`, () =>\n stopChildBounded(child, adapters.pause),\n ),\n ),\n );\n await attemptCleanup(\n failures,\n \"Removing repository-runner containers\",\n removeOwnedContainers,\n );\n await attemptCleanup(\n failures,\n \"Removing transient runner work\",\n removeTransientWork,\n );\n await attemptCleanup(failures, \"Removing controller lock\", () =>\n adapters.remove(lockPath),\n );\n if (failures.length === 0) {\n try {\n await saveState(\"stopped\", \"Stopped by signal\");\n } catch (error) {\n const message = `Persisting stopped state failed: ${error instanceof Error ? error.message : String(error)}`;\n failures.push(message);\n adapters.report(`[repository runner] cleanup error: ${message}`);\n }\n }\n await persistCleanupFailures(failures);\n })();\n return shutdownPromise;\n };\n const unregisterShutdown = adapters.onShutdown(shutdown);\n const wakeSubscription = createRepositoryRunnerWakeSubscription(\n adapters.onWake,\n );\n\n let initialWorkFound = false;\n try {\n await purgeLogs();\n cancelLogPurge = adapters.scheduleRecurring(\n purgeLogs,\n LOG_PURGE_CHECK_INTERVAL_MS,\n );\n\n const listEligibleIssueNumbers = async (): Promise<readonly string[]> => {\n const issues = await runCommand(\n adapters,\n \"Checking for eligible GitHub issues\",\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"GET\",\n \"--paginate\",\n `repos/${context.repository}/issues`,\n \"-f\",\n \"state=open\",\n \"-f\",\n `labels=${ACTIVATION_LABEL}`,\n \"-f\",\n \"per_page=100\",\n \"--jq\",\n \".[] | select(.pull_request == null) | .number\",\n ],\n { cwd: options.repoDir, env: context.runtimeEnvironment },\n );\n return [...new Set(issues.stdout.split(/\\s+/).filter(Boolean))].sort(\n (left, right) => Number(left) - Number(right),\n );\n };\n const sameIssueNumbers = (\n left: readonly string[],\n right: readonly string[],\n ): boolean =>\n left.length === right.length &&\n left.every((issue, index) => issue === right[index]);\n const processEligibleWork = async (): Promise<boolean> => {\n let issueNumbers = await listEligibleIssueNumbers();\n const workFound = issueNumbers.length > 0;\n\n while (!stopping && issueNumbers.length > 0) {\n await saveState(\"processing\", \"Shipyard is processing eligible issues\");\n shipyardChild = adapters.spawn(\"npx\", [\"shipyard\", \"run\"], {\n cwd: options.repoDir,\n env: context.runtimeEnvironment,\n });\n const runResult = await shipyardChild.wait();\n shipyardChild = undefined;\n if (stopping) {\n await shutdownPromise;\n return workFound;\n }\n if (runResult.code !== 0) {\n const failure = childFailure(\"npx shipyard run\", runResult);\n await writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n );\n await saveState(\"stopped\", failure.message);\n throw failure;\n }\n\n const nextIssueNumbers = await listEligibleIssueNumbers();\n if (nextIssueNumbers.length === 0) {\n await saveState(\"idle\", \"Shipyard completed; no eligible issues\");\n break;\n }\n if (sameIssueNumbers(issueNumbers, nextIssueNumbers)) {\n await saveState(\n \"stalled\",\n \"Shipyard made no progress; eligible issues are unchanged\",\n );\n break;\n }\n issueNumbers = nextIssueNumbers;\n }\n\n return workFound;\n };\n\n lastWake = {\n source: \"startup\",\n recordedAt: adapters.now().toISOString(),\n };\n initialWorkFound = await processEligibleWork();\n if (stopping) {\n await shutdownPromise;\n return { repository: context.repository, initialWorkFound };\n }\n\n if (!initialWorkFound) {\n await saveState(\"idle\", \"No eligible issues; listening\");\n }\n\n listenerChild = adapters.spawn(\"./run.sh\", [], {\n cwd: context.runnerDir,\n env: repositoryRunnerEnvironment(context.hostEnvironment),\n });\n const listenerExit = listenerChild.wait().then((result) => ({\n type: \"listener\" as const,\n result,\n }));\n\n let listenerResult:\n | { readonly code: number | null; readonly signal: NodeJS.Signals | null }\n | undefined;\n while (!listenerResult && !stopping) {\n const event = await Promise.race([\n listenerExit,\n wakeSubscription.next().then(() => ({ type: \"wake\" as const })),\n ]);\n if (event.type === \"listener\") {\n listenerResult = event.result;\n listenerChild = undefined;\n break;\n }\n if (stopping) break;\n lastWake = {\n source: \"signal\",\n recordedAt: adapters.now().toISOString(),\n };\n const workFound = await processEligibleWork();\n if (!workFound && !stopping) {\n await saveState(\"idle\", \"Wake-up delivered; no eligible issues\");\n }\n }\n\n if (stopping) {\n await shutdownPromise;\n return { repository: context.repository, initialWorkFound };\n }\n if (!listenerResult) {\n throw new RunnerControlError(\n \"The repository runner listener stopped without an exit result.\",\n );\n }\n if (listenerResult.code !== 0) {\n const failure = childFailure(\n \"Repository runner listener\",\n listenerResult,\n );\n await writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n );\n await saveState(\"stopped\", failure.message);\n throw failure;\n }\n await saveState(\"stopped\", \"Repository runner listener exited\");\n return { repository: context.repository, initialWorkFound };\n } catch (error) {\n const failure = controlFailure(\"Repository runner controller\", error);\n primaryFailure = failure;\n await bestEffort(() =>\n writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n ).then(() => retainedFailures.add(failure)),\n );\n await bestEffort(() => saveState(\"stopped\", failure.message));\n throw failure;\n } finally {\n if (cancelLogPurge !== undefined) {\n cancelLogPurge();\n cancelLogPurge = undefined;\n }\n wakeSubscription.close();\n unregisterShutdown();\n if (shutdownPromise) {\n await shutdownPromise;\n } else {\n const failures: string[] = [];\n if (listenerChild) {\n await attemptCleanup(\n failures,\n `Stopping process ${listenerChild.pid}`,\n () => stopChildBounded(listenerChild!, adapters.pause),\n );\n }\n if (shipyardChild) {\n await attemptCleanup(\n failures,\n `Stopping process ${shipyardChild.pid}`,\n () => stopChildBounded(shipyardChild!, adapters.pause),\n );\n }\n await attemptCleanup(\n failures,\n \"Removing repository-runner containers\",\n removeOwnedContainers,\n );\n await attemptCleanup(\n failures,\n \"Removing transient runner work\",\n removeTransientWork,\n );\n await attemptCleanup(failures, \"Removing controller lock\", () =>\n adapters.remove(lockPath),\n );\n await persistCleanupFailures(failures);\n }\n }\n};\n\nexport const startRepositoryRunner = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<RepositoryRunnerStartResult> => {\n try {\n return await startRepositoryRunnerManaged(options, adapters);\n } catch (error) {\n const failure = controlFailure(\"Repository runner startup\", error);\n if (retainedFailures.has(failure)) throw failure;\n const runnerDir = join(options.repoDir, CONFIG_DIR, RUNNER_DIR);\n if (await adapters.exists(runnerDir)) {\n const metadata = await readJson<RunnerInstallMetadata>(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n adapters,\n ).catch(() => undefined);\n const repository = metadata?.repository ?? \"unknown\";\n for (const [purpose, operation] of [\n [\n \"failure diagnostics\",\n () =>\n writeJson(\n join(runnerDir, LAST_FAILURE),\n {\n schemaVersion: 1,\n repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n ),\n ],\n [\n \"stopped state\",\n () =>\n writeJson(\n join(runnerDir, CONTROLLER_STATE),\n {\n schemaVersion: 1,\n repository,\n state: \"stopped\",\n lastOutcome: failure.message,\n } satisfies RunnerControllerState,\n adapters,\n ),\n ],\n ] as const) {\n try {\n await operation();\n } catch (persistenceError) {\n adapters.report(\n `[repository runner] Could not persist ${purpose}: ${persistenceError instanceof Error ? persistenceError.message : String(persistenceError)}`,\n );\n }\n }\n }\n throw failure;\n }\n};\n\nexport const getRepositoryRunnerStatus = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<RepositoryRunnerStatus> => {\n const runnerDir = join(options.repoDir, CONFIG_DIR, RUNNER_DIR);\n const metadata = await readJson<RunnerInstallMetadata>(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n adapters,\n );\n if (!metadata) {\n return {\n installed: false,\n running: false,\n github: \"not-installed\",\n state: \"not-installed\",\n lastOutcome: \"Repository runner is not installed\",\n };\n }\n\n const lock = await readJson<RunnerControllerLock>(\n join(runnerDir, RUNNER_CONTROLLER_LOCK),\n adapters,\n );\n const state = await readJson<RunnerControllerState>(\n join(runnerDir, CONTROLLER_STATE),\n adapters,\n );\n const running = await lockOwnsProcess(lock, adapters);\n let github: RepositoryRunnerStatus[\"github\"] = \"unreachable\";\n try {\n const response = await adapters.run(\n \"gh\",\n [\n \"api\",\n `repos/${metadata.repository}/actions/runners`,\n \"--jq\",\n `.runners[] | select(.name == \"${metadata.name}\") | .status`,\n ],\n {\n cwd: options.repoDir,\n // Runner connectivity is an administrative check. Do not let the\n // issue-agent token from .shipyard/.env shadow the host gh login.\n env: adapters.environment(),\n },\n );\n github = response.stdout.trim() === \"online\" ? \"online\" : \"offline\";\n } catch {\n github = \"unreachable\";\n }\n\n return {\n installed: true,\n running,\n ...(lock ? { pid: lock.pid } : {}),\n github,\n repository: metadata.repository,\n state: state?.state ?? (running ? \"idle\" : \"stopped\"),\n lastOutcome: state?.lastOutcome ?? \"No repository runner outcome recorded\",\n ...(state?.lastWake ? { lastWake: state.lastWake } : {}),\n };\n};\n\nexport const stopRepositoryRunner = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<{ readonly pid: number }> => {\n const lockPath = join(\n options.repoDir,\n CONFIG_DIR,\n RUNNER_DIR,\n RUNNER_CONTROLLER_LOCK,\n );\n const lock = await readJson<RunnerControllerLock>(lockPath, adapters);\n if (!lock || !Number.isInteger(lock.pid)) {\n throw new RunnerControlError(\"The repository runner is not running.\");\n }\n if (!adapters.isProcessRunning(lock.pid)) {\n throw new RunnerControlError(\n `The recorded repository runner process ${lock.pid} is no longer running.`,\n );\n }\n try {\n adapters.signalProcess(lock.pid, \"SIGTERM\");\n } catch (error) {\n throw controlFailure(\"Stopping the repository runner\", error);\n }\n return { pid: lock.pid };\n};\n","import { Cause, Effect, Exit } from \"effect\";\n\nexport const runEffectPromise = async <A, E>(\n effect: Effect.Effect<A, E>,\n): Promise<A> => {\n const exit = await Effect.runPromiseExit(effect);\n if (Exit.isFailure(exit)) throw Cause.squash(exit.cause);\n return exit.value;\n};\n","import { Command, Options } from \"@effect/cli\";\nimport { Effect } from \"effect\";\nimport * as clack from \"@clack/prompts\";\nimport { Display } from \"./Display.js\";\nimport { InitError } from \"./errors.js\";\nimport { purgeRunLogs } from \"./LogRetention.js\";\nimport { requireCanonicalConfigDir } from \"./runtimeConfig.js\";\nimport {\n installRepositoryRunnerWithReplacement,\n installRepositoryRunner,\n RunnerInstallError,\n} from \"./RepositoryRunner.js\";\nimport {\n getRepositoryRunnerStatus,\n RunnerControlError,\n startRepositoryRunner,\n stopRepositoryRunner,\n} from \"./RepositoryRunnerControl.js\";\nimport {\n removeRepositoryRunner,\n RunnerLifecycleError,\n} from \"./RepositoryRunnerLifecycle.js\";\nimport { runEffectPromise } from \"./runEffectPromise.js\";\n\nconst registrationTokenOption = Options.text(\"registration-token\").pipe(\n Options.withDescription(\n \"one-time runner registration token (not stored; administrative gh access is still required for uniqueness checks)\",\n ),\n Options.optional,\n);\n\nconst installRunnerCommand = Command.make(\n \"install\",\n { registrationToken: registrationTokenOption },\n ({ registrationToken }) =>\n Effect.gen(function* () {\n const display = yield* Display;\n const repoDir = process.cwd();\n const result = yield* Effect.tryPromise({\n try: () =>\n installRepositoryRunnerWithReplacement({\n repoDir,\n interactive: process.stdin.isTTY === true,\n confirmReplacement: async (conflict) => {\n const confirmed = await clack.confirm({\n message: conflict.confirmationMessage,\n initialValue: false,\n });\n return !clack.isCancel(confirmed) && confirmed === true;\n },\n install: () =>\n runEffectPromise(\n display.progress(\"Installing repository runner\", (report) =>\n Effect.tryPromise({\n try: () =>\n installRepositoryRunner({\n repoDir,\n registrationToken:\n registrationToken._tag === \"Some\"\n ? registrationToken.value\n : undefined,\n onProgress: report,\n }),\n catch: (error) =>\n error instanceof RunnerInstallError\n ? error\n : new InitError({\n message: `Repository runner installation failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n }),\n ),\n ),\n }),\n catch: (error) =>\n new InitError({\n message:\n error instanceof RunnerInstallError\n ? error.message\n : `Repository runner installation failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* display.status(\n `Installed ${result.name} for ${result.repository}.`,\n \"success\",\n );\n }),\n);\n\nconst runnerControlEffect = <A>(operation: () => Promise<A>) =>\n Effect.tryPromise({\n try: operation,\n catch: (error) =>\n new InitError({\n message:\n error instanceof RunnerControlError ||\n error instanceof RunnerLifecycleError\n ? error.message\n : `Repository runner operation failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n\nconst startRunnerCommand = Command.make(\"start\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const cwd = process.cwd();\n yield* display.status(\n \"Starting the repository runner in this terminal...\",\n \"info\",\n );\n const result = yield* runnerControlEffect(() =>\n startRepositoryRunner({ repoDir: cwd }),\n );\n yield* display.status(\n result.initialWorkFound\n ? `Repository runner for ${result.repository} stopped after processing startup work.`\n : `Repository runner for ${result.repository} stopped.`,\n \"info\",\n );\n }),\n);\n\nconst statusRunnerCommand = Command.make(\"status\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const status = yield* runnerControlEffect(() =>\n getRepositoryRunnerStatus({ repoDir: process.cwd() }),\n );\n yield* display.summary(\"Repository runner\", {\n Installed: status.installed ? \"yes\" : \"no\",\n \"Local process\": status.running\n ? `running (PID ${status.pid ?? \"unknown\"})`\n : \"stopped\",\n GitHub: status.github,\n Repository: status.repository ?? \"unknown\",\n State: status.state,\n \"Last outcome\": status.lastOutcome,\n \"Last wake\": status.lastWake\n ? `${status.lastWake.source} at ${status.lastWake.recordedAt}`\n : \"none recorded\",\n });\n }),\n);\n\nconst stopRunnerCommand = Command.make(\"stop\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const result = yield* runnerControlEffect(() =>\n stopRepositoryRunner({ repoDir: process.cwd() }),\n );\n yield* display.status(\n `Stopping repository runner process ${result.pid}...`,\n \"success\",\n );\n }),\n);\n\nconst forceRemoveRunnerOption = Options.boolean(\"force\").pipe(\n Options.withDescription(\n \"delete local runner files if GitHub unregistration fails\",\n ),\n);\n\nconst removeRunnerCommand = Command.make(\n \"remove\",\n { force: forceRemoveRunnerOption },\n ({ force }) =>\n Effect.gen(function* () {\n const display = yield* Display;\n const result = yield* runnerControlEffect(() =>\n removeRepositoryRunner({ repoDir: process.cwd(), force }),\n );\n yield* display.status(\"Repository runner removed.\", \"success\");\n if (result.manualCleanup) {\n yield* display.status(result.manualCleanup, \"warn\");\n }\n }),\n);\n\nconst purgeRunnerCommand = Command.make(\"purge\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const repoDir = process.cwd();\n yield* requireCanonicalConfigDir(repoDir);\n\n const result = yield* Effect.tryPromise({\n try: () => purgeRunLogs({ repoDir }),\n catch: (error) =>\n new InitError({\n message: `Run-log purge failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n const removed = result.removedCount;\n yield* display.status(\n removed === 0\n ? \"No run logs found.\"\n : `Purged ${removed} run-log ${removed === 1 ? \"entry\" : \"entries\"}.`,\n \"success\",\n );\n }),\n);\n\nexport const runnerCommand = Command.make(\"runner\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n yield* display.status(\n \"Repository runner and run-log commands. Use --help to see available subcommands.\",\n \"info\",\n );\n }),\n).pipe(\n Command.withSubcommands([\n installRunnerCommand,\n startRunnerCommand,\n statusRunnerCommand,\n stopRunnerCommand,\n removeRunnerCommand,\n purgeRunnerCommand,\n ]),\n);\n","import { createRequire } from \"node:module\";\n\ndeclare const __SHIPYARD_VERSION__: string | undefined;\n\nconst fallbackVersion = (): string => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n return pkg.version;\n};\n\n/**\n * The package version. Injected at build time by tsup via `define`. When\n * the source is loaded directly (e.g. via `tsx` during tests) the constant\n * is undefined, so we fall back to reading `package.json` at runtime.\n */\nexport const VERSION: string =\n typeof __SHIPYARD_VERSION__ !== \"undefined\"\n ? __SHIPYARD_VERSION__\n : fallbackVersion();\n","import { lstat, readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\nimport {\n REPOSITORY_RUNNER_WORKFLOW,\n REPOSITORY_RUNNER_WORKFLOW_PATH,\n} from \"./RepositoryRunnerWake.js\";\n\nexport const SHIPYARD_PACKAGE_NAME = \"@snappedly-tools/shipyard\";\n\nexport interface ShipyardRepositoryUninstallResult {\n readonly workflowRemoved: boolean;\n readonly workflowPreserved: boolean;\n readonly configDirectoryRemoved: boolean;\n}\n\nconst isMissingPath = (error: unknown): boolean =>\n error !== null &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\";\n\nconst lstatIfPresent = async (path: string) => {\n try {\n return await lstat(path);\n } catch (error) {\n if (isMissingPath(error)) return undefined;\n throw error;\n }\n};\n\n/** Check the config directory before runner cleanup can read from it. */\nexport const inspectShipyardConfigDirectory = async (\n repoDir: string,\n): Promise<boolean> => {\n const configDir = join(repoDir, CONFIG_DIR);\n const info = await lstatIfPresent(configDir);\n if (!info) return false;\n\n if (!info.isDirectory() || info.isSymbolicLink()) {\n throw new Error(\n `Refusing to uninstall because ${configDir} is not a real directory.`,\n );\n }\n return true;\n};\n\nconst removeWakeWorkflow = async (\n repoDir: string,\n): Promise<{ readonly removed: boolean; readonly preserved: boolean }> => {\n const githubDir = join(repoDir, \".github\");\n const workflowsDir = join(githubDir, \"workflows\");\n const workflowPath = join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH);\n\n const githubInfo = await lstatIfPresent(githubDir);\n if (!githubInfo) return { removed: false, preserved: false };\n if (!githubInfo.isDirectory() || githubInfo.isSymbolicLink()) {\n return { removed: false, preserved: githubInfo.isSymbolicLink() };\n }\n\n const workflowsInfo = await lstatIfPresent(workflowsDir);\n if (!workflowsInfo) return { removed: false, preserved: false };\n if (!workflowsInfo.isDirectory() || workflowsInfo.isSymbolicLink()) {\n return {\n removed: false,\n preserved: workflowsInfo.isSymbolicLink(),\n };\n }\n\n const workflowInfo = await lstatIfPresent(workflowPath);\n if (!workflowInfo) return { removed: false, preserved: false };\n if (!workflowInfo.isFile() || workflowInfo.isSymbolicLink()) {\n return { removed: false, preserved: true };\n }\n\n const workflow = await readFile(workflowPath, \"utf8\");\n if (workflow !== REPOSITORY_RUNNER_WORKFLOW) {\n return { removed: false, preserved: true };\n }\n\n await rm(workflowPath);\n return { removed: true, preserved: false };\n};\n\n/**\n * Remove the target repository's entire Shipyard config directory and generated\n * wake workflow. The repository runner must be unregistered before this runs.\n */\nexport const removeShipyardRepositoryFiles = async (options: {\n readonly repoDir: string;\n}): Promise<ShipyardRepositoryUninstallResult> => {\n const configDirExists = await inspectShipyardConfigDirectory(options.repoDir);\n if (configDirExists) {\n const configDir = join(options.repoDir, CONFIG_DIR);\n const runnerDir = join(configDir, RUNNER_DIR);\n if (await lstatIfPresent(runnerDir)) {\n throw new Error(\n `Remove the repository runner at ${runnerDir} before removing Shipyard configuration.`,\n );\n }\n }\n\n const workflow = await removeWakeWorkflow(options.repoDir);\n if (configDirExists) {\n await rm(join(options.repoDir, CONFIG_DIR), { recursive: true });\n }\n\n return {\n workflowRemoved: workflow.removed,\n workflowPreserved: workflow.preserved,\n configDirectoryRemoved: configDirExists,\n };\n};\n","import { Command, Options } from \"@effect/cli\";\nimport { Effect, Option } from \"effect\";\nimport * as clack from \"@clack/prompts\";\nimport { execSync, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { Display, type DisplayService } from \"./Display.js\";\nimport { buildImage, removeImage } from \"./DockerLifecycle.js\";\nimport {\n scaffold,\n listTemplates,\n listAgents,\n getAgent,\n getIssueTracker,\n listSandboxProviders,\n getSandboxProvider,\n DEFAULT_AGENT_NAME,\n getNextStepsLines,\n detectPackageManager,\n addDependencyCommand,\n removeDependencyCommand,\n hostHasDependency,\n getTemplateDependencies,\n} from \"./InitService.js\";\nimport { defaultImageName } from \"./sandboxes/docker.js\";\nimport type { AgentEntry, SandboxProviderEntry } from \"./InitService.js\";\nimport { ExecHostError, InitError } from \"./errors.js\";\nimport {\n ensureCodexChatGptAuth,\n resolveCodexAuthMode,\n type CodexAuthMode,\n} from \"./CodexAuth.js\";\nimport { requireCanonicalConfigDir } from \"./runtimeConfig.js\";\nimport {\n installRepositoryRunnerWithReplacement,\n installRepositoryRunner,\n} from \"./RepositoryRunner.js\";\nimport {\n removeRepositoryRunner,\n RunnerLifecycleError,\n} from \"./RepositoryRunnerLifecycle.js\";\nimport { DEFAULT_LOG_RETENTION_DAYS, purgeRunLogs } from \"./LogRetention.js\";\nimport { repositoryRunnerNextSteps } from \"./InitRepositoryRunner.js\";\nimport { commitAndPushInitSetup } from \"./InitGitSetup.js\";\nimport { runnerCommand } from \"./RepositoryRunnerCommands.js\";\nimport {\n ACTIVATION_LABEL,\n CONFIG_DIR,\n CLI_NAME,\n PRODUCT_NAME,\n RUNNER_DIR,\n} from \"./runtimeNames.js\";\nimport { VERSION } from \"./version.js\";\nimport {\n inspectShipyardConfigDirectory,\n removeShipyardRepositoryFiles,\n SHIPYARD_PACKAGE_NAME,\n} from \"./UninstallService.js\";\nimport { REPOSITORY_RUNNER_WORKFLOW_PATH } from \"./RepositoryRunnerWake.js\";\n\n// --- Shared options ---\n\nconst imageNameOption = Options.text(\"image-name\").pipe(\n Options.withDescription(\"Docker image name\"),\n Options.optional,\n);\n\nconst resolveImageName = (\n cliFlag: Option.Option<string>,\n cwd: string,\n): string => (cliFlag._tag === \"Some\" ? cliFlag.value : defaultImageName(cwd));\n\n// --- UID build-args ---\n\n/** Build-args that align the image UID/GID to the host (Linux/macOS). No-op on Windows. */\nconst defaultUidBuildArgs = (): Record<string, string> => {\n const args: Record<string, string> = {};\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined) args.AGENT_UID = String(uid);\n if (gid !== undefined) args.AGENT_GID = String(gid);\n return args;\n};\n\n/**\n * Apply the default log-retention policy without making an agent run depend on\n * maintenance. Explicit `runner purge` remains available when an operator\n * wants to run it directly or use a host scheduler.\n */\nconst purgeRunLogsBestEffort = (\n display: DisplayService,\n repoDir: string,\n): Effect.Effect<void> =>\n Effect.tryPromise({\n try: () =>\n purgeRunLogs({\n repoDir,\n retentionDays: DEFAULT_LOG_RETENTION_DAYS,\n }),\n catch: (error) => error,\n }).pipe(\n Effect.flatMap((result) => {\n const removed = result.removedCount;\n return removed === 0\n ? Effect.void\n : display.status(\n `Purged ${removed} outdated run-log ${removed === 1 ? \"entry\" : \"entries\"}.`,\n \"info\",\n );\n }),\n Effect.catchAll((error) =>\n display.status(\n `Automatic run-log purge skipped: ${error instanceof Error ? error.message : String(error)}`,\n \"warn\",\n ),\n ),\n );\n\n// --- Run command ---\n\nconst runSandboxOption = Options.choice(\"sandbox\", [\"docker\"] as const).pipe(\n Options.withDescription(\n \"Sandbox provider to build (inferred from Dockerfile)\",\n ),\n Options.optional,\n);\n\nconst skipBuildOption = Options.boolean(\"skip-build\").pipe(\n Options.withDescription(\"Skip rebuilding the sandbox image\"),\n);\n\nconst entrypointOption = Options.text(\"entrypoint\").pipe(\n Options.withDescription(\n \"TypeScript entrypoint (defaults to .shipyard/main.ts or main.mts)\",\n ),\n Options.optional,\n);\n\ntype RunSandbox = \"docker\";\n\nconst resolveRunEntrypoint = (\n cwd: string,\n configDir: string,\n entrypoint: Option.Option<string>,\n): string | InitError => {\n if (entrypoint._tag === \"Some\") {\n const path = resolve(cwd, entrypoint.value);\n return existsSync(path)\n ? path\n : new InitError({ message: `Entrypoint not found: ${entrypoint.value}` });\n }\n\n for (const filename of [\"main.ts\", \"main.mts\"]) {\n const path = join(configDir, filename);\n if (existsSync(path)) return path;\n }\n\n return new InitError({\n message:\n \"No Shipyard entrypoint found. Expected .shipyard/main.ts or .shipyard/main.mts; run `shipyard init` first or pass `--entrypoint <path>.\",\n });\n};\n\nconst resolveRunSandbox = (\n configDir: string,\n sandbox: Option.Option<RunSandbox>,\n): RunSandbox | InitError => {\n if (sandbox._tag === \"Some\") {\n const filename = \"Dockerfile\";\n if (!existsSync(join(configDir, filename))) {\n return new InitError({\n message: `No .shipyard/${filename} found for the selected ${sandbox.value} sandbox provider.`,\n });\n }\n return sandbox.value;\n }\n\n const hasDockerfile = existsSync(join(configDir, \"Dockerfile\"));\n if (hasDockerfile) return \"docker\";\n return new InitError({\n message:\n \"No .shipyard/Dockerfile found. Run `shipyard init` first, or pass `--skip-build` for a programmatically configured sandbox.\",\n });\n};\n\nconst executeEntrypoint = (\n cwd: string,\n entrypoint: string,\n): Effect.Effect<void, ExecHostError> =>\n Effect.async((resume, signal) => {\n const command = process.platform === \"win32\" ? \"npx.cmd\" : \"npx\";\n const args = [\"--no-install\", \"tsx\", entrypoint];\n const child = spawn(command, args, {\n cwd,\n env: process.env,\n stdio: \"inherit\",\n });\n const commandText = `${command} ${args.join(\" \")}`;\n let settled = false;\n\n const finish = (effect: Effect.Effect<void, ExecHostError>) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n resume(effect);\n };\n const onAbort = () => child.kill(\"SIGTERM\");\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.once(\"error\", (error) => {\n finish(\n Effect.fail(\n new ExecHostError({\n command: commandText,\n message: error.message,\n }),\n ),\n );\n });\n child.once(\"close\", (code, closeSignal) => {\n if (code === 0) {\n finish(Effect.succeed(undefined));\n return;\n }\n finish(\n Effect.fail(\n new ExecHostError({\n command: commandText,\n message:\n closeSignal === null\n ? `Process exited with code ${code ?? \"unknown\"}.`\n : `Process terminated by ${closeSignal}.`,\n }),\n ),\n );\n });\n });\n\nconst runCommand = Command.make(\n \"run\",\n {\n imageName: imageNameOption,\n sandbox: runSandboxOption,\n skipBuild: skipBuildOption,\n entrypoint: entrypointOption,\n },\n ({ imageName: imageNameFlag, sandbox, skipBuild, entrypoint }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n const configDir = yield* requireCanonicalConfigDir(cwd);\n yield* purgeRunLogsBestEffort(d, cwd);\n const resolvedEntrypoint = resolveRunEntrypoint(\n cwd,\n configDir,\n entrypoint,\n );\n if (resolvedEntrypoint instanceof InitError) {\n return yield* Effect.fail(resolvedEntrypoint);\n }\n\n if (!skipBuild) {\n const selectedSandbox = resolveRunSandbox(configDir, sandbox);\n if (selectedSandbox instanceof InitError) {\n return yield* Effect.fail(selectedSandbox);\n }\n const imageName = resolveImageName(imageNameFlag, cwd);\n yield* d.spinner(\n `Building Docker image '${imageName}'...`,\n buildImage(imageName, configDir, {\n buildArgs: defaultUidBuildArgs(),\n }),\n );\n }\n\n yield* d.status(\n `Running ${entrypoint._tag === \"Some\" ? entrypoint.value : \".shipyard/\" + resolvedEntrypoint.split(/[\\\\/]/).pop()}.`,\n \"info\",\n );\n yield* executeEntrypoint(cwd, resolvedEntrypoint);\n }),\n);\n\n// --- Init command ---\n\nconst templateOption = Options.text(\"template\").pipe(\n Options.withDescription(\n \"Template to scaffold (e.g. simple-loop, parallel-planner)\",\n ),\n Options.optional,\n);\n\nconst agentOption = Options.text(\"agent\").pipe(\n Options.withDescription(\"Agent to use (e.g. codex)\"),\n Options.optional,\n);\n\nconst codexAuthOption = Options.choice(\"codex-auth\", [\n \"api-key\",\n \"chatgpt\",\n]).pipe(\n Options.withDescription(\n \"How Codex should authenticate: API key or ChatGPT subscription\",\n ),\n Options.optional,\n);\n\nconst initModelOption = Options.text(\"model\").pipe(\n Options.withDescription(\n \"Model to use for the agent. Defaults to the agent's configured default model\",\n ),\n Options.optional,\n);\n\nconst sandboxOption = Options.text(\"sandbox\").pipe(\n Options.withDescription(\"Sandbox provider to use (docker)\"),\n Options.optional,\n);\n\n// Tri-state booleans (Some(true) / Some(false) / None) so we can tell \"user\n// chose false\" from \"user didn't pass the flag at all\" — only the latter\n// triggers the interactive prompt.\nconst installTemplateDepsOption = Options.choice(\"install-template-deps\", [\n \"true\",\n \"false\",\n]).pipe(\n Options.withDescription(\n \"Whether to install the template's host dependencies (e.g. zod for the planner templates)\",\n ),\n Options.optional,\n);\n\nconst commitSetupOption = Options.choice(\"commit-setup\", [\"true\", \"false\"])\n .pipe(\n Options.withDescription(\n \"Whether to commit and push .shipyard/ and any generated runner workflow\",\n ),\n )\n .pipe(Options.optional);\n\nconst uninstallYesOption = Options.boolean(\"yes\").pipe(\n Options.withDescription(\"confirm uninstall without an interactive prompt\"),\n);\n\nconst uninstallForceOption = Options.boolean(\"force\").pipe(\n Options.withDescription(\n \"remove local runner files if GitHub unregistration fails\",\n ),\n);\n\n/**\n * Translate an `Options.choice(\"flag\", [\"true\", \"false\"]).optional` value into\n * a tri-state boolean. None when the flag was absent; otherwise the parsed bool.\n */\nconst choiceToTriBool = (\n opt: Option.Option<\"true\" | \"false\">,\n): Option.Option<boolean> =>\n opt._tag === \"Some\" ? Option.some(opt.value === \"true\") : Option.none();\n\nconst initCommand = Command.make(\n \"init\",\n {\n imageName: imageNameOption,\n template: templateOption,\n agent: agentOption,\n codexAuth: codexAuthOption,\n model: initModelOption,\n sandbox: sandboxOption,\n installTemplateDeps: installTemplateDepsOption,\n commitSetup: commitSetupOption,\n },\n ({\n imageName: imageNameFlag,\n template,\n agent: agentFlag,\n codexAuth: codexAuthFlag,\n model: modelFlag,\n sandbox: sandboxFlag,\n installTemplateDeps: installTemplateDepsFlag,\n commitSetup: commitSetupFlag,\n }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n const imageName = resolveImageName(imageNameFlag, cwd);\n\n // Early validation of CLI flags before interactive prompts\n const templates = listTemplates();\n if (template._tag === \"Some\") {\n const valid = templates.find((tmpl) => tmpl.name === template.value);\n if (!valid) {\n const names = templates.map((tmpl) => tmpl.name).join(\", \");\n yield* Effect.fail(\n new InitError({\n message: `Unknown template \"${template.value}\". Available: ${names}`,\n }),\n );\n }\n }\n\n if (sandboxFlag._tag === \"Some\") {\n const valid = getSandboxProvider(sandboxFlag.value);\n if (!valid) {\n const names = listSandboxProviders()\n .map((p) => p.name)\n .join(\", \");\n yield* Effect.fail(\n new InitError({\n message: `Unknown sandbox provider \"${sandboxFlag.value}\". Available: ${names}`,\n }),\n );\n }\n }\n\n yield* d.progress(\"Initializing Shipyard\", (report) =>\n Effect.gen(function* () {\n const progressAt = (current: number, message: string) =>\n report({ current, total: 100, message });\n const progressRange = (\n start: number,\n end: number,\n update: { current: number; total: number; message: string },\n ) => {\n const total = Math.max(1, update.total);\n const fraction = Math.min(1, Math.max(0, update.current / total));\n progressAt(\n Math.round(start + (end - start) * fraction),\n update.message,\n );\n };\n const whilePrompt = async <A>(\n prompt: () => Promise<A>,\n ): Promise<A> => {\n report.pause();\n try {\n return await prompt();\n } finally {\n report.resume();\n }\n };\n const statusWithProgress = (\n message: string,\n severity: Parameters<DisplayService[\"status\"]>[1],\n ) =>\n Effect.acquireUseRelease(\n Effect.sync(() => report.pause()),\n () => d.status(message, severity),\n () => Effect.sync(() => report.resume()),\n );\n\n const installTemplateDepsChoice = choiceToTriBool(\n installTemplateDepsFlag,\n );\n const commitSetupChoice = choiceToTriBool(commitSetupFlag);\n\n const isInteractive = process.stdin.isTTY === true;\n const failIfNonInteractive = (flag: string) =>\n Effect.fail(\n new InitError({\n message: `${flag} is required in non-interactive mode (no TTY detected).`,\n }),\n );\n\n // Tri-state confirm: CLI flag wins; otherwise prompt interactively (or\n // fail fast in non-interactive mode naming the missing flag). Cancelling\n // the prompt is treated as abort — same shape as the select prompts above.\n const resolveConfirmFlag = (params: {\n choice: Option.Option<boolean>;\n flag: string;\n promptMessage: string;\n cancelMessage: string;\n }): Effect.Effect<boolean, InitError> =>\n Effect.gen(function* () {\n if (params.choice._tag === \"Some\") return params.choice.value;\n if (!isInteractive) {\n yield* failIfNonInteractive(params.flag);\n }\n const confirmed = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.confirm({\n message: params.promptMessage,\n initialValue: true,\n }),\n ),\n );\n if (clack.isCancel(confirmed)) {\n yield* Effect.fail(\n new InitError({ message: params.cancelMessage }),\n );\n }\n return confirmed === true;\n });\n\n // Resolve agent: CLI flag > interactive select\n const agents = listAgents();\n let selectedAgent: AgentEntry;\n if (agentFlag._tag === \"Some\") {\n const entry = getAgent(agentFlag.value);\n if (!entry) {\n const names = agents.map((a) => a.name).join(\", \");\n yield* Effect.fail(\n new InitError({\n message: `Unknown agent \"${agentFlag.value}\". Available: ${names}`,\n }),\n );\n }\n selectedAgent = entry!;\n } else {\n if (!isInteractive) {\n yield* failIfNonInteractive(\"--agent\");\n }\n const selected = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.select({\n message: \"Select an agent:\",\n initialValue: DEFAULT_AGENT_NAME,\n options: agents.map((a) => ({\n value: a.name,\n label: a.label,\n hint: `Default model: ${a.defaultModel}`,\n })),\n }),\n ),\n );\n if (clack.isCancel(selected)) {\n yield* Effect.fail(\n new InitError({ message: \"Agent selection cancelled.\" }),\n );\n }\n selectedAgent = getAgent(selected as string)!;\n }\n progressAt(6, `Selected ${selectedAgent.label}`);\n\n const selectedCodexAuth = yield* Effect.tryPromise({\n try: () =>\n resolveCodexAuthMode({\n agentName: selectedAgent.name,\n requested:\n codexAuthFlag._tag === \"Some\"\n ? codexAuthFlag.value\n : undefined,\n interactive: isInteractive,\n select: async () => {\n const selected = await whilePrompt(() =>\n clack.select({\n message: \"How will you authenticate Codex?\",\n initialValue: \"chatgpt\",\n options: [\n {\n value: \"chatgpt\" as const,\n label: \"Sign in with ChatGPT\",\n hint: \"Use your ChatGPT subscription\",\n },\n {\n value: \"api-key\" as const,\n label: \"OpenAI API key\",\n hint: \"Use API billing\",\n },\n ],\n }),\n );\n return clack.isCancel(selected)\n ? undefined\n : (selected as CodexAuthMode);\n },\n }),\n catch: (error) =>\n error instanceof InitError\n ? error\n : new InitError({\n message: `Codex authentication selection failed: ${String(error)}`,\n }),\n });\n progressAt(12, \"Authentication method selected\");\n\n // Resolve model: CLI flag > agent default\n const selectedModel =\n modelFlag._tag === \"Some\"\n ? modelFlag.value\n : selectedAgent.defaultModel;\n\n if (selectedCodexAuth === \"chatgpt\") {\n yield* Effect.try({\n try: () => {\n report.pause();\n try {\n ensureCodexChatGptAuth({\n cwd,\n interactive: isInteractive,\n });\n } finally {\n report.resume();\n }\n },\n catch: (error) =>\n error instanceof InitError\n ? error\n : new InitError({\n message: `Codex authentication setup failed: ${String(error)}`,\n }),\n });\n }\n progressAt(18, \"Authentication setup complete\");\n\n // Docker is the sole supported provider. Keep --sandbox docker accepted\n // for existing non-interactive init scripts.\n const selectedSandboxProvider: SandboxProviderEntry =\n getSandboxProvider(\"docker\")!;\n\n const selectedIssueTracker = getIssueTracker(\"github-issues\")!;\n\n // Resolve template: CLI flag > interactive select (already validated above)\n let selectedTemplate: string;\n if (template._tag === \"Some\") {\n selectedTemplate = template.value;\n } else {\n if (!isInteractive) {\n yield* failIfNonInteractive(\"--template\");\n }\n const selected = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.select({\n message: \"Select a template:\",\n initialValue: \"simple-loop\",\n options: templates.map((tmpl) => ({\n value: tmpl.name,\n label: tmpl.name,\n hint: tmpl.description,\n })),\n }),\n ),\n );\n if (clack.isCancel(selected)) {\n yield* Effect.fail(\n new InitError({ message: \"Template selection cancelled.\" }),\n );\n }\n selectedTemplate = selected as string;\n }\n progressAt(24, `Selected ${selectedTemplate} template`);\n\n // These labels are part of the GitHub Issues workflow contract.\n const failedLabels: string[] = [];\n const labels = [\n [\n ACTIVATION_LABEL,\n `Issues for ${PRODUCT_NAME} to work on`,\n \"F9A825\",\n ],\n [\"bug\", \"Something is broken\", \"D73A4A\"],\n [\"enhancement\", \"New feature or improvement\", \"A2EEEF\"],\n [\"needs-triage\", \"Maintainer evaluation needed\", \"FBCA04\"],\n [\"needs-info\", \"Waiting for reporter information\", \"D4C5F9\"],\n [\"ready-for-agent\", \"Ready for agent implementation\", \"0E8A16\"],\n [\"ready-for-human\", \"Requires human implementation\", \"1D76DB\"],\n [\"wontfix\", \"Will not be actioned\", \"FFFFFF\"],\n [\"shipyard:blocked\", \"Shipyard work needs intervention\", \"B60205\"],\n [\n \"shipyard:pending\",\n \"Shipyard is working on this ticket\",\n \"1D76DB\",\n ],\n [\n \"shipyard:complete\",\n \"Shipyard work ready for human review\",\n \"0E8A16\",\n ],\n [\n \"shipyard:outstanding-tasks\",\n \"Spec has uncompleted tickets\",\n \"FBCA04\",\n ],\n ] as const;\n for (const [index, [name, description, color]] of labels.entries()) {\n try {\n execSync(\n `gh label create \"${name}\" --description \"${description}\" --color \"${color}\" --force`,\n { cwd, stdio: \"ignore\" },\n );\n } catch {\n failedLabels.push(name);\n }\n progressAt(\n 24 + Math.round(((index + 1) / labels.length) * 10),\n \"Provisioning GitHub labels\",\n );\n }\n if (failedLabels.length) {\n let connected = Boolean(process.env.GH_REPO);\n try {\n execSync(\"git remote get-url origin\", { cwd, stdio: \"ignore\" });\n connected = true;\n } catch {\n // A local repository can be scaffolded before its GitHub remote exists.\n }\n const message = `Could not create GitHub labels: ${failedLabels.join(\", \")}. Check GitHub access and rerun init.`;\n if (connected) yield* Effect.fail(new InitError({ message }));\n report.pause();\n try {\n console.warn(message);\n } finally {\n report.resume();\n }\n }\n\n progressAt(34, `Scaffolding ${CONFIG_DIR}/ config directory`);\n yield* scaffold(cwd, {\n agent: selectedAgent,\n model: selectedModel,\n modelExplicit: modelFlag._tag === \"Some\",\n templateName: selectedTemplate,\n issueTracker: selectedIssueTracker,\n sandboxProvider: selectedSandboxProvider,\n codexAuth: selectedCodexAuth,\n onProgress: (update) => progressRange(34, 56, update),\n }).pipe(\n Effect.mapError(\n (e) =>\n new InitError({\n message: `${e instanceof Error ? e.message : e}`,\n }),\n ),\n );\n progressAt(56, \"Shipyard configuration generated\");\n\n // Detect the host package manager so the zod offer below and the next\n // steps below both use the right install command.\n const packageManager = yield* detectPackageManager(cwd);\n progressAt(58, `Detected ${packageManager}`);\n\n // If the chosen template imports zod on the host (the planner templates\n // build their <plan> output schema with it) and the host doesn't already\n // declare it, offer to install it. Without this, the very first\n // `npx tsx .shipyard/main.ts` crashes with ERR_MODULE_NOT_FOUND.\n if (getTemplateDependencies(selectedTemplate).includes(\"zod\")) {\n const alreadyInstalled = yield* hostHasDependency(cwd, \"zod\");\n if (!alreadyInstalled) {\n const installCmd = addDependencyCommand(packageManager, \"zod\");\n const shouldInstall = yield* resolveConfirmFlag({\n choice: installTemplateDepsChoice,\n flag: \"--install-template-deps\",\n promptMessage: `The ${selectedTemplate} template needs a schema validator. Install zod now (\\`${installCmd}\\`)?`,\n cancelMessage: \"Install-template-deps selection cancelled.\",\n });\n progressAt(\n 60,\n shouldInstall\n ? \"Installing template dependency\"\n : \"Skipping zod installation\",\n );\n if (shouldInstall) {\n progressAt(62, `Installing zod with ${packageManager}`);\n const installed = yield* Effect.sync(() => {\n try {\n execSync(installCmd, { cwd, stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n });\n progressAt(64, \"Template dependency setup complete\");\n yield* installed\n ? statusWithProgress(\n `Installed zod with ${packageManager}.`,\n \"success\",\n )\n : statusWithProgress(\n `Couldn't install zod automatically. Run \\`${installCmd}\\` before running the agent.`,\n \"warn\",\n );\n }\n }\n }\n progressAt(66, \"Template dependencies ready\");\n\n const providerLabel = selectedSandboxProvider.label;\n const containerfileDir = join(cwd, CONFIG_DIR);\n progressAt(68, `Building ${providerLabel} image '${imageName}'`);\n yield* buildImage(imageName, containerfileDir, {\n buildArgs: defaultUidBuildArgs(),\n });\n progressAt(78, \"Docker image built\");\n yield* statusWithProgress(\"Image built successfully.\", \"success\");\n\n progressAt(78, \"Installing repository runner\");\n const runner = yield* Effect.tryPromise({\n try: () =>\n installRepositoryRunnerWithReplacement({\n repoDir: cwd,\n interactive: isInteractive,\n confirmReplacement: async (conflict) => {\n const confirmed = await whilePrompt(() =>\n clack.confirm({\n message: conflict.confirmationMessage,\n initialValue: false,\n }),\n );\n return !clack.isCancel(confirmed) && confirmed === true;\n },\n install: () =>\n installRepositoryRunner({\n repoDir: cwd,\n onProgress: (update) => progressRange(78, 94, update),\n }),\n }),\n catch: (error) =>\n error instanceof InitError\n ? error\n : new InitError({\n message: `Repository runner installation failed: ${error instanceof Error ? error.message : String(error)}. Init is incomplete. Fix the issue and retry with \\`npx ${CLI_NAME} runner install\\`.`,\n }),\n });\n progressAt(94, \"Repository runner installed\");\n yield* statusWithProgress(\n `Installed ${runner.name} for ${runner.repository}.`,\n \"success\",\n );\n\n let shouldCommitSetup =\n commitSetupChoice._tag === \"Some\" && commitSetupChoice.value;\n if (commitSetupChoice._tag === \"None\" && isInteractive) {\n const confirmed = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.confirm({\n message:\n \"Commit .shipyard/ and any generated runner workflow, then push this branch to origin? Sandboxes need the setup committed. The push also sends any local commits not already on origin.\",\n initialValue: true,\n }),\n ),\n );\n if (clack.isCancel(confirmed)) {\n yield* Effect.fail(\n new InitError({\n message: \"Shipyard setup commit cancelled.\",\n }),\n );\n }\n shouldCommitSetup = confirmed === true;\n }\n progressAt(\n 96,\n shouldCommitSetup\n ? \"Committing and pushing Shipyard setup\"\n : \"Setup commit skipped\",\n );\n\n if (shouldCommitSetup) {\n const publishResult = yield* Effect.sync(() => {\n try {\n return {\n status: \"committed\" as const,\n result: commitAndPushInitSetup(cwd),\n };\n } catch (error) {\n return {\n status: \"failed\" as const,\n message:\n error instanceof Error ? error.message : String(error),\n };\n }\n });\n progressAt(99, \"Shipyard setup commit finished\");\n if (publishResult.status === \"failed\") {\n yield* statusWithProgress(\n `Could not commit the Shipyard setup: ${publishResult.message}`,\n \"warn\",\n );\n yield* statusWithProgress(\n `Commit \\`${CONFIG_DIR}/\\` before running Shipyard.`,\n \"warn\",\n );\n } else if (publishResult.result.pushError) {\n yield* statusWithProgress(\n `Committed ${publishResult.result.commit}, but could not push to origin/${publishResult.result.branch}: ${publishResult.result.pushError}`,\n \"warn\",\n );\n yield* statusWithProgress(\n `Push it later with \\`git push origin ${publishResult.result.branch}\\`.`,\n \"warn\",\n );\n } else {\n yield* statusWithProgress(\n `Committed ${publishResult.result.commit} and pushed origin/${publishResult.result.branch}.`,\n \"success\",\n );\n }\n } else {\n yield* statusWithProgress(\n `Commit \\`${CONFIG_DIR}/\\` before running Shipyard. Sandboxes do not receive uncommitted setup files.`,\n \"warn\",\n );\n yield* statusWithProgress(\n \"Push the runner wake workflow to the repository's default branch before starting the runner.\",\n \"warn\",\n );\n }\n\n progressAt(100, \"Initialization complete\");\n }),\n );\n\n yield* d.text(\"Repository runner next steps:\");\n for (const [index, line] of repositoryRunnerNextSteps().entries()) {\n yield* d.text(styleText(\"dim\", `${index + 1}. ${line}`));\n }\n\n yield* d.status(\"Init complete!\", \"success\");\n\n const nextSteps = getNextStepsLines();\n for (const [i, line] of nextSteps.entries()) {\n yield* d.text(i === 0 ? line : styleText(\"dim\", line));\n }\n }),\n);\n\n// --- Uninstall command ---\n\nconst uninstallCommand = Command.make(\n \"uninstall\",\n { yes: uninstallYesOption, force: uninstallForceOption },\n ({ yes, force }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const repoDir = process.cwd();\n const configDirExists = yield* Effect.tryPromise({\n try: () => inspectShipyardConfigDirectory(repoDir),\n catch: (error) =>\n new InitError({\n message: `Could not inspect Shipyard configuration: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n const runnerDir = join(repoDir, CONFIG_DIR, RUNNER_DIR);\n const runnerInstalled = configDirExists && existsSync(runnerDir);\n const workflowExists = existsSync(\n join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH),\n );\n const packageInstalled = yield* hostHasDependency(\n repoDir,\n SHIPYARD_PACKAGE_NAME,\n );\n\n if (\n !configDirExists &&\n !workflowExists &&\n !runnerInstalled &&\n !packageInstalled\n ) {\n yield* d.status(\n \"No Shipyard installation found in this repository.\",\n \"info\",\n );\n return;\n }\n\n if (!yes && process.stdin.isTTY !== true) {\n return yield* Effect.fail(\n new InitError({\n message:\n \"Shipyard uninstall needs confirmation. Run it in a terminal or pass --yes.\",\n }),\n );\n }\n\n if (!yes) {\n const actions = [\n runnerInstalled\n ? \"unregister and remove the repository runner\"\n : null,\n configDirExists\n ? `remove all of ${CONFIG_DIR}/, including .env and runtime data`\n : null,\n workflowExists ? \"remove the generated runner wake workflow\" : null,\n packageInstalled\n ? `remove ${SHIPYARD_PACKAGE_NAME} from package.json`\n : null,\n ].filter((action): action is string => action !== null);\n const confirmation = yield* Effect.tryPromise({\n try: () =>\n clack.confirm({\n message: `Uninstall Shipyard from ${repoDir}? This will ${actions.join(\", \")}. It leaves GitHub issues and labels unchanged.`,\n initialValue: false,\n }),\n catch: (error) =>\n new InitError({\n message: `Could not confirm Shipyard uninstall: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n if (clack.isCancel(confirmation) || confirmation !== true) {\n yield* d.status(\"Shipyard uninstall cancelled.\", \"info\");\n return;\n }\n }\n\n if (runnerInstalled) {\n const result = yield* Effect.tryPromise({\n try: () => removeRepositoryRunner({ repoDir, force }),\n catch: (error) =>\n error instanceof RunnerLifecycleError\n ? new InitError({ message: error.message })\n : new InitError({\n message: `Repository runner removal failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* d.status(\"Repository runner removed.\", \"success\");\n if (result.manualCleanup) {\n yield* d.status(result.manualCleanup, \"warn\");\n }\n }\n\n const files = yield* Effect.tryPromise({\n try: () => removeShipyardRepositoryFiles({ repoDir }),\n catch: (error) =>\n new InitError({\n message: `Could not remove Shipyard repository files: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n if (files.configDirectoryRemoved) {\n yield* d.status(`Removed all of ${CONFIG_DIR}/.`, \"success\");\n }\n if (files.workflowRemoved) {\n yield* d.status(\n `Removed ${REPOSITORY_RUNNER_WORKFLOW_PATH}.`,\n \"success\",\n );\n yield* d.status(\n \"Commit and push the workflow deletion to disable it on GitHub.\",\n \"info\",\n );\n } else if (files.workflowPreserved) {\n yield* d.status(\n `Preserved ${REPOSITORY_RUNNER_WORKFLOW_PATH} because it is customized or linked.`,\n \"warn\",\n );\n }\n if (packageInstalled) {\n const packageManager = yield* detectPackageManager(repoDir);\n const command = removeDependencyCommand(\n packageManager,\n SHIPYARD_PACKAGE_NAME,\n );\n yield* Effect.try({\n try: () => execSync(command, { cwd: repoDir, stdio: \"inherit\" }),\n catch: (error) =>\n new InitError({\n message: `Could not remove ${SHIPYARD_PACKAGE_NAME}. Rerun the uninstall after resolving the package-manager error: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* d.status(\n `Removed ${SHIPYARD_PACKAGE_NAME} with ${packageManager}.`,\n \"success\",\n );\n }\n\n yield* d.status(\"Shipyard uninstalled from this repository.\", \"success\");\n }),\n);\n\n// --- Build-image command ---\n\nconst dockerfileOption = Options.file(\"dockerfile\").pipe(\n Options.withDescription(\n \"Path to a custom Dockerfile (build context will be the current working directory)\",\n ),\n Options.optional,\n);\n\nconst buildImageCommand = Command.make(\n \"build-image\",\n {\n imageName: imageNameOption,\n dockerfile: dockerfileOption,\n },\n ({ imageName: imageNameFlag, dockerfile }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n yield* requireCanonicalConfigDir(cwd);\n\n const imageName = resolveImageName(imageNameFlag, cwd);\n\n const dockerfileDir = join(cwd, CONFIG_DIR);\n const dockerfilePath =\n dockerfile._tag === \"Some\" ? dockerfile.value : undefined;\n\n yield* d.spinner(\n `Building Docker image '${imageName}'...`,\n buildImage(imageName, dockerfileDir, {\n dockerfile: dockerfilePath,\n buildArgs: defaultUidBuildArgs(),\n }),\n );\n\n yield* d.status(\"Build complete!\", \"success\");\n }),\n);\n\n// --- Remove-image command ---\n\nconst removeImageCommand = Command.make(\n \"remove-image\",\n {\n imageName: imageNameOption,\n },\n ({ imageName: imageNameFlag }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n\n const imageName = resolveImageName(imageNameFlag, cwd);\n\n yield* d.spinner(\n `Removing Docker image '${imageName}'...`,\n removeImage(imageName),\n );\n yield* d.status(\"Image removed.\", \"success\");\n }),\n);\n\n// --- Docker namespace command ---\n\nconst dockerCommand = Command.make(\"docker\", {}, () =>\n Effect.gen(function* () {\n const d = yield* Display;\n yield* d.status(\n \"Docker sandbox commands. Use --help to see available subcommands.\",\n \"info\",\n );\n }),\n).pipe(Command.withSubcommands([buildImageCommand, removeImageCommand]));\n\n// --- Root command ---\n\nconst rootCommand = Command.make(CLI_NAME, {}, () =>\n Effect.gen(function* () {\n const d = yield* Display;\n yield* d.status(`${PRODUCT_NAME} v${VERSION}`, \"info\");\n yield* d.status(\"Use --help to see available commands.\", \"info\");\n }),\n);\n\nexport const shipyard = rootCommand.pipe(\n Command.withSubcommands([\n initCommand,\n uninstallCommand,\n runCommand,\n dockerCommand,\n runnerCommand,\n ]),\n);\n\nexport const cli = Command.run(shipyard, {\n name: CLI_NAME,\n version: VERSION,\n});\n","/**\n * Terminal cleanup for abrupt exits.\n *\n * @clack/prompts' spinner and taskLog call stdin.setRawMode(true) and hide\n * the cursor via escape sequences. When the process is killed by a signal\n * handler that calls process.exit() directly (e.g. during Ctrl-C cleanup in\n * SandboxFactory), clack's own cleanup is bypassed and the terminal is left\n * in raw mode with the cursor hidden.\n *\n * Registering a process 'exit' listener that restores these guarantees the\n * terminal is always left in a usable state.\n */\n\n/** Escape sequence to show the cursor (DECTCEM). */\nexport const SHOW_CURSOR = \"\\x1b[?25h\";\n\n/**\n * Creates a synchronous exit handler that restores terminal state.\n * Extracted as a pure function so it can be unit-tested without side effects.\n */\nexport const makeTerminalCleanupHandler =\n (\n stdin: { isTTY?: boolean; setRawMode?: (raw: boolean) => void },\n stdout: { write: (data: string) => boolean },\n ) =>\n (): void => {\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch {\n // Best-effort — may fail if stdin is already closed\n }\n }\n stdout.write(SHOW_CURSOR);\n };\n\n/**\n * Registers the terminal cleanup handler on process 'exit'.\n * Call once at program startup (main.ts).\n */\nexport const setupTerminalCleanup = (): void => {\n process.on(\"exit\", makeTerminalCleanupHandler(process.stdin, process.stdout));\n};\n","#!/usr/bin/env node\nimport { NodeContext, NodeRuntime } from \"@effect/platform-node\";\nimport { Effect, Layer } from \"effect\";\nimport { cli } from \"./cli.js\";\nimport { ClackDisplay } from \"./Display.js\";\nimport { withFriendlyErrors } from \"./ErrorHandler.js\";\nimport { setupTerminalCleanup } from \"./terminalCleanup.js\";\n\n// Restore terminal state on any exit.\n// @clack/prompts' spinner/taskLog set stdin to raw mode and hide the cursor.\n// If the process exits via a signal handler that calls process.exit() directly\n// (e.g. the Ctrl-C handler in SandboxFactory), clack's own cleanup is\n// bypassed, leaving the terminal broken. This exit hook fixes that.\nsetupTerminalCleanup();\n\nconst mainLayer = Layer.merge(NodeContext.layer, ClackDisplay.layer);\n\ncli(process.argv).pipe(\n withFriendlyErrors,\n Effect.provide(mainLayer),\n NodeRuntime.runMain,\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtimeConfig.ts","../src/InitService.ts","../src/CodexAuth.ts","../src/RepositoryRunnerWake.ts","../src/RepositoryRunner.ts","../src/InitGitSetup.ts","../src/RepositoryRunnerControl.ts","../src/runEffectPromise.ts","../src/RepositoryRunnerCommands.ts","../src/version.ts","../src/UninstallService.ts","../src/cli.ts","../src/terminalCleanup.ts","../src/main.ts"],"names":["Effect","FileSystem","join","reportProgress","resolve","execFileSync","execFileAsync","promisify","execFile","defaultAdapters","access","constants","lstat","realpath","readFile","writeFile","rm","mkdir","requireCommand","clack","configDirExists","Options","existsSync","spawn","runCommand","Command"],"mappings":"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","file":"main.js","sourcesContent":["import { FileSystem } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport { join } from \"node:path\";\n\nimport { ConfigDirError } from \"./errors.js\";\nimport { CONFIG_DIR, CLI_NAME } from \"./runtimeNames.js\";\n\nconst configDirExists = (\n repoDir: string,\n): Effect.Effect<boolean, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n return yield* fs\n .exists(join(repoDir, CONFIG_DIR))\n .pipe(Effect.catchAll(() => Effect.succeed(false)));\n });\n\nexport const requireCanonicalConfigDir = (\n repoDir: string,\n): Effect.Effect<string, ConfigDirError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n if (!(yield* configDirExists(repoDir))) {\n return yield* Effect.fail(\n new ConfigDirError({\n message: `No ${CONFIG_DIR}/ found. Run \\`${CLI_NAME} init\\` first.`,\n }),\n );\n }\n return join(repoDir, CONFIG_DIR);\n });\n\n/** Fail before initialization can overwrite an existing configuration directory. */\nexport const assertConfigDirAvailable = (\n repoDir: string,\n): Effect.Effect<void, ConfigDirError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n if (yield* configDirExists(repoDir)) {\n return yield* Effect.fail(\n new ConfigDirError({\n message: `${CONFIG_DIR}/ directory already exists. ${CLI_NAME} did not modify it. Use the existing configuration or remove it deliberately after preserving any active worktrees before re-initializing.`,\n }),\n );\n }\n });\n","import { FileSystem } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { SANDBOX_REPO_DIR } from \"./SandboxFactory.js\";\nimport type { CodexAuthMode } from \"./CodexAuth.js\";\nimport { assertConfigDirAvailable } from \"./runtimeConfig.js\";\nimport {\n ACTIVATION_LABEL,\n CONFIG_DIR,\n PRODUCT_NAME,\n CLI_NAME,\n LOCKS_DIR,\n} from \"./runtimeNames.js\";\nimport { CODEX_MODELS } from \"./modelConfig.js\";\n\nconst GITIGNORE = `.env\nlogs/\nworktrees/\n${LOCKS_DIR}/\n`;\n\nexport const DEFAULT_AGENT_NAME = \"codex\";\nconst TEMPLATE_AGENT_FACTORY = \"codex\";\n\nconst CODEX_CHATGPT_ENV_EXAMPLE = `# Codex ChatGPT subscription authentication\n# On the host, run \\`codex login\\` and make sure \\`~/.codex/auth.json\\` exists.\n# Shipyard mounts that file read-only into the sandbox.\n# Do not add OPENAI_API_KEY here: that selects API-key billing instead.`;\n\nconst CODEX_CHATGPT_AUTH_OPTIONS = `{\n mounts: [\n {\n hostPath: \"~/.codex/auth.json\",\n sandboxPath: \"~/.codex/auth.json\",\n readonly: true,\n },\n ],\n}`;\n\nconst roleModelEnvExample = (agentName: string): string =>\n agentName === \"codex\"\n ? `# Optional model choices for Shipyard workflows.\n# Choose models available to your Codex CLI account: https://learn.chatgpt.com/docs/models\n# The provider must support each value. Aliases can change their target over time.\n# SHIPYARD_ROUTINE_MODEL=gpt-6-luna\n# SHIPYARD_STRONG_MODEL=gpt-6-sol`\n : `# Optional model choices for Shipyard workflows.\n# Choose aliases or model IDs available to your Claude Code provider: https://code.claude.com/docs/en/model-config\n# The provider must support each value. Aliases can change their target over time.\n# SHIPYARD_ROUTINE_MODEL=sonnet\n# SHIPYARD_STRONG_MODEL=opus`;\n\nexport interface TemplateMetadata {\n name: string;\n description: string;\n /**\n * Host-side npm packages the template's `main` file imports directly (e.g.\n * the planner templates import `zod` for their `<plan>` output schema). Init\n * offers to install these with the detected package manager so that\n * `npx tsx ${CONFIG_DIR}/main.ts` doesn't crash with ERR_MODULE_NOT_FOUND.\n */\n dependencies?: readonly string[];\n}\n\nconst TEMPLATES: TemplateMetadata[] = [\n {\n name: \"simple-loop\",\n description: \"Implements standalone issues one by one and opens review PRs\",\n },\n {\n name: \"sequential-reviewer\",\n description:\n \"Implements issues one by one, with a code review step after each\",\n },\n {\n name: \"parallel-planner\",\n description:\n \"Plans parallelizable issues, implements them, and opens review PRs\",\n dependencies: [\"zod\"],\n },\n {\n name: \"parallel-planner-with-review\",\n description:\n \"Plans and implements parallel issues with per-branch review and PRs\",\n dependencies: [\"zod\"],\n },\n];\n\nexport const listTemplates = (): TemplateMetadata[] => TEMPLATES;\n\n/**\n * Host-side npm packages the given template imports directly. Empty when the\n * template name is unknown or the template declares no extra dependencies.\n */\nexport const getTemplateDependencies = (\n templateName: string,\n): readonly string[] =>\n TEMPLATES.find((t) => t.name === templateName)?.dependencies ?? [];\n\n// ---------------------------------------------------------------------------\n// Package manager detection (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nconst PACKAGE_MANAGERS = [\"npm\", \"pnpm\", \"yarn\", \"bun\"] as const;\n\n/** A package manager Shipyard can detect on the host and build install commands for. */\nexport type PackageManager = (typeof PACKAGE_MANAGERS)[number];\n\n// Lockfiles checked in priority order. bun.lock / bun.lockb are both valid bun\n// lockfiles (text vs binary), so both map to bun.\nconst LOCKFILES: ReadonlyArray<readonly [string, PackageManager]> = [\n [\"bun.lockb\", \"bun\"],\n [\"bun.lock\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nconst DEPENDENCY_COMMANDS: Record<\n PackageManager,\n { readonly add: string; readonly remove: string }\n> = {\n npm: { add: \"install\", remove: \"uninstall\" },\n pnpm: { add: \"add\", remove: \"remove\" },\n yarn: { add: \"add\", remove: \"remove\" },\n bun: { add: \"add\", remove: \"remove\" },\n};\n\n/**\n * Detect the host project's package manager. An explicit corepack-style\n * `packageManager` field in package.json wins; otherwise the first matching\n * lockfile decides. Defaults to npm when nothing matches.\n */\nexport const detectPackageManager = (\n repoDir: string,\n): Effect.Effect<PackageManager, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n\n const pkgPath = join(repoDir, \"package.json\");\n const pkgExists = yield* fs\n .exists(pkgPath)\n .pipe(Effect.orElseSucceed(() => false));\n if (pkgExists) {\n const content = yield* fs\n .readFileString(pkgPath)\n .pipe(Effect.orElseSucceed(() => \"\"));\n try {\n const pkg = JSON.parse(content) as Record<string, unknown>;\n const field = pkg[\"packageManager\"];\n if (typeof field === \"string\") {\n const name = field.split(\"@\")[0];\n const match = PACKAGE_MANAGERS.find((pm) => pm === name);\n if (match) return match;\n }\n } catch {\n // Malformed package.json — fall through to lockfile detection.\n }\n }\n\n for (const [file, pm] of LOCKFILES) {\n const exists = yield* fs\n .exists(join(repoDir, file))\n .pipe(Effect.orElseSucceed(() => false));\n if (exists) return pm;\n }\n\n return \"npm\";\n });\n\n/** Build the command that adds a runtime dependency for the given package manager. */\nexport const addDependencyCommand = (\n packageManager: PackageManager,\n pkg: string,\n): string =>\n `${packageManager} ${DEPENDENCY_COMMANDS[packageManager].add} ${pkg}`;\n\n/** Build the command that removes a dependency with the given package manager. */\nexport const removeDependencyCommand = (\n packageManager: PackageManager,\n pkg: string,\n): string =>\n `${packageManager} ${DEPENDENCY_COMMANDS[packageManager].remove} ${pkg}`;\n\n/**\n * Whether the host package.json already declares `pkg` in any of its dependency\n * maps. Used so init doesn't offer to install something already present.\n */\nexport const hostHasDependency = (\n repoDir: string,\n pkg: string,\n): Effect.Effect<boolean, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const pkgPath = join(repoDir, \"package.json\");\n const exists = yield* fs\n .exists(pkgPath)\n .pipe(Effect.orElseSucceed(() => false));\n if (!exists) return false;\n const content = yield* fs\n .readFileString(pkgPath)\n .pipe(Effect.orElseSucceed(() => \"\"));\n try {\n const parsed = JSON.parse(content) as Record<string, unknown>;\n const depMaps = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n ];\n return depMaps.some((key) => {\n const deps = parsed[key];\n return (\n typeof deps === \"object\" && deps !== null && pkg in (deps as object)\n );\n });\n } catch {\n return false;\n }\n });\n\n// ---------------------------------------------------------------------------\n// Agent registry (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nexport interface AgentEntry {\n readonly name: string;\n readonly label: string;\n readonly defaultModel: string;\n readonly factoryImport: string;\n readonly dockerfileTemplate: string;\n /** Lines to include in the generated `.env.example` for this agent's API key. */\n readonly envExample: string;\n}\n\nconst CLAUDE_CODE_DOCKERFILE = `FROM node:22-bookworm\n\n# Install system dependencies\nRUN apt-get update && apt-get install -y \\\\\n git \\\\\n curl \\\\\n jq \\\\\n && rm -rf /var/lib/apt/lists/*\n\n{{ISSUE_TRACKER_TOOLS}}\n\n# Build-args for UID/GID alignment: shipyard docker build-image\n# defaults these to the host user's UID/GID so image-built files\n# and explicit mounted files share an owner without runtime chown.\nARG AGENT_UID=1000\nARG AGENT_GID=1000\n\n# Rename the base image's \"node\" user to \"agent\" and align UID/GID.\nRUN groupmod -o -g $AGENT_GID node && usermod -o -u $AGENT_UID -g $AGENT_GID -d /home/agent -m -l agent node\nUSER \\${AGENT_UID}:\\${AGENT_GID}\n\n# Install Claude Code CLI\nRUN curl -fsSL https://claude.ai/install.sh | bash\n\n# Add Claude to PATH\nENV PATH=\"/home/agent/.local/bin:$PATH\"\n\nWORKDIR /home/agent\n\n# Shipyard syncs Git history into a sandbox-owned repository at ${SANDBOX_REPO_DIR}\n# and runs agent commands from ${SANDBOX_REPO_DIR}.\n# Structure your Dockerfile so that ${SANDBOX_REPO_DIR} can serve as the project root.\nENTRYPOINT [\"sleep\", \"infinity\"]\n`;\n\nconst CODEX_DOCKERFILE = `FROM node:22-bookworm\n\n# Install system dependencies\nRUN apt-get update && apt-get install -y \\\\\n git \\\\\n curl \\\\\n jq \\\\\n && rm -rf /var/lib/apt/lists/*\n\n{{ISSUE_TRACKER_TOOLS}}\n\n# Build-args for UID/GID alignment: shipyard docker build-image\n# defaults these to the host user's UID/GID so image-built files\n# and explicit mounted files share an owner without runtime chown.\nARG AGENT_UID=1000\nARG AGENT_GID=1000\n\n# Rename the base image's \"node\" user to \"agent\" and align UID/GID.\nRUN groupmod -o -g $AGENT_GID node && usermod -o -u $AGENT_UID -g $AGENT_GID -d /home/agent -m -l agent node\n\n# Install Codex CLI (run as root before USER agent)\nRUN npm install -g @openai/codex\n\nUSER \\${AGENT_UID}:\\${AGENT_GID}\n\nWORKDIR /home/agent\n\n# Shipyard syncs Git history into a sandbox-owned repository at ${SANDBOX_REPO_DIR}\n# and runs agent commands from ${SANDBOX_REPO_DIR}.\n# Structure your Dockerfile so that ${SANDBOX_REPO_DIR} can serve as the project root.\nENTRYPOINT [\"sleep\", \"infinity\"]\n`;\n\nconst AGENT_REGISTRY: AgentEntry[] = [\n {\n name: \"codex\",\n label: \"Codex\",\n defaultModel: CODEX_MODELS.routine.model,\n factoryImport: \"codex\",\n dockerfileTemplate: CODEX_DOCKERFILE,\n envExample: `# OpenAI API key\nOPENAI_API_KEY=`,\n },\n {\n name: \"claude-code\",\n label: \"Claude Code\",\n defaultModel: \"claude-opus-4-8\",\n factoryImport: \"claudeCode\",\n dockerfileTemplate: CLAUDE_CODE_DOCKERFILE,\n envExample: `# Claude Code OAuth token — get one by running \\`claude setup-token\\` on your host.\n# Lets the agent use your Claude subscription instead of an API key.\nCLAUDE_CODE_OAUTH_TOKEN=\n# Or use an Anthropic API key instead — uncomment and fill in:\n# ANTHROPIC_API_KEY=`,\n },\n];\n\nexport const listAgents = (): AgentEntry[] => AGENT_REGISTRY;\n\n// ---------------------------------------------------------------------------\n// Issue tracker registry (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nexport interface IssueTrackerEntry {\n readonly name: string;\n readonly label: string;\n readonly templateArgs: {\n readonly LIST_TASKS_COMMAND: string;\n readonly VIEW_TASK_COMMAND: string;\n readonly CLOSE_TASK_COMMAND: string;\n readonly ISSUE_TRACKER_TOOLS: string;\n };\n /** Lines to append to `.env.example` for this issue tracker, or empty string if none needed. */\n readonly envExample: string;\n}\n\nconst GITHUB_CLI_TOOLS = `# Install GitHub CLI\nRUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\\\\n | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \\\\\n && echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" \\\\\n | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \\\\\n && apt-get update && apt-get install -y gh \\\\\n && rm -rf /var/lib/apt/lists/*`;\n\nconst ISSUE_TRACKER_REGISTRY: IssueTrackerEntry[] = [\n {\n name: \"github-issues\",\n label: \"GitHub Issues\",\n templateArgs: {\n LIST_TASKS_COMMAND: `gh issue list --state open --label ${ACTIVATION_LABEL} --limit 100 --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'`,\n VIEW_TASK_COMMAND: \"gh issue view <ID>\",\n CLOSE_TASK_COMMAND: `gh issue close <ID> --comment \"Completed by ${PRODUCT_NAME}\"`,\n ISSUE_TRACKER_TOOLS: GITHUB_CLI_TOOLS,\n },\n envExample: `# GitHub personal access token — the agent uses it to read and manage GitHub Issues\n# Runner installation/start uses the host \\`gh\\` login for repository administration.\n# Create a fine-grained token: https://github.com/settings/personal-access-tokens/new\n# Required repository permissions: Contents, Issues, and Pull requests (Read and write); Metadata (Read)\n# Or leave blank and run: GH_TOKEN=\"$(gh auth token)\" npx shipyard run\nGH_TOKEN=\n`,\n },\n];\n\nexport const listIssueTrackers = (): IssueTrackerEntry[] =>\n ISSUE_TRACKER_REGISTRY;\n\nexport const getIssueTracker = (name: string): IssueTrackerEntry | undefined =>\n ISSUE_TRACKER_REGISTRY.find((b) => b.name === name);\n\nexport const getAgent = (name: string): AgentEntry | undefined =>\n AGENT_REGISTRY.find((a) => a.name === name);\n\n// ---------------------------------------------------------------------------\n// Sandbox provider registry (internal — not part of public API)\n// ---------------------------------------------------------------------------\n\nexport interface SandboxProviderEntry {\n readonly name: string;\n readonly label: string;\n /** Filename written to .shipyard/. */\n readonly containerfileName: string;\n /** CLI namespace for build/remove commands. */\n readonly cliNamespace: string;\n}\n\nconst SANDBOX_PROVIDER_REGISTRY: SandboxProviderEntry[] = [\n {\n name: \"docker\",\n label: \"Docker\",\n containerfileName: \"Dockerfile\",\n cliNamespace: \"docker\",\n },\n];\n\nexport const listSandboxProviders = (): SandboxProviderEntry[] =>\n SANDBOX_PROVIDER_REGISTRY;\n\nexport const getSandboxProvider = (\n name: string,\n): SandboxProviderEntry | undefined =>\n SANDBOX_PROVIDER_REGISTRY.find((p) => p.name === name);\n\n// ---------------------------------------------------------------------------\n// Next steps\n// ---------------------------------------------------------------------------\n\nexport function getNextStepsLines(): string[] {\n return [\n \"Next steps:\",\n `1. Fill in the values you need in \\`${CONFIG_DIR}/.env\\`.`,\n \"2. If using a model subscription, sign in. For Codex:\",\n ` codex --config 'cli_auth_credentials_store=\"file\"' login`,\n \" test -f ~/.codex/auth.json\",\n `3. Start the repository runner with \\`npx ${CLI_NAME} runner start\\`.`,\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Scaffolding helpers\n// ---------------------------------------------------------------------------\n\nfunction getTemplatesDir(): string {\n const thisFile = fileURLToPath(import.meta.url);\n return join(dirname(thisFile), \"templates\");\n}\n\nconst getTemplateDir = (\n templateName: string,\n): Effect.Effect<string, Error, never> =>\n Effect.gen(function* () {\n const template = TEMPLATES.find((t) => t.name === templateName);\n if (!template) {\n const names = TEMPLATES.map((t) => t.name).join(\", \");\n yield* Effect.fail(\n new Error(`Unknown template: \"${templateName}\". Available: ${names}`),\n );\n }\n return join(getTemplatesDir(), templateName);\n });\n\nconst COMPILED_FILE_EXTENSIONS = [\n \".js\",\n \".js.map\",\n \".d.ts\",\n \".d.ts.map\",\n \".mjs\",\n \".mjs.map\",\n \".d.mts\",\n \".d.mts.map\",\n];\n\nconst copyTemplateFiles = (\n templateDir: string,\n destDir: string,\n mainFilename: string,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const files = yield* fs\n .readDirectory(templateDir)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n yield* Effect.all(\n files\n .filter(\n (f) =>\n f !== \"template.json\" &&\n f !== \".env.example\" &&\n (f === \"select-issues.mjs\" ||\n !COMPILED_FILE_EXTENSIONS.some((ext) => f.endsWith(ext))),\n )\n .map((f) => {\n const destName = f === \"main.mts\" ? mainFilename : f;\n return fs\n .copyFile(join(templateDir, f), join(destDir, destName))\n .pipe(Effect.mapError((e) => new Error(e.message)));\n }),\n { concurrency: \"unbounded\" },\n );\n });\n\n/**\n * Replace the agent factory and sandbox provider in a scaffolded main.ts.\n *\n * Templates use `codex` as the default agent factory and `docker` as the\n * default sandbox provider. When a different agent, model, or sandbox provider\n * is selected, this function rewrites the imports and factory calls.\n */\nconst rewriteMainTs = (\n configDir: string,\n agent: AgentEntry,\n model: string,\n modelExplicit: boolean,\n sandboxProvider: SandboxProviderEntry,\n mainFilename: string,\n codexAuth: CodexAuthMode,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const mainTsPath = join(configDir, mainFilename);\n\n const exists = yield* fs\n .exists(mainTsPath)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n if (!exists) return;\n\n let content = yield* fs\n .readFileString(mainTsPath)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n\n // Replace the default factory function name in calls.\n // Templates always use Codex as the placeholder factory.\n content = content.replace(\n new RegExp(`\\\\b${TEMPLATE_AGENT_FACTORY}\\\\b`, \"g\"),\n agent.factoryImport,\n );\n content = content.replace(\n \"const CODEX_PROVIDER = true;\",\n `const CODEX_PROVIDER = ${agent.name === \"codex\"};`,\n );\n if (agent.name !== \"codex\" || modelExplicit) {\n const modelLiteral = JSON.stringify(model);\n content = content.replace(\n /shipyard\\.CODEX_MODELS\\.(?:routine|strong)/g,\n modelLiteral,\n );\n }\n // ChatGPT subscription auth is stored by the host Codex CLI. Mount the\n // file into the sandbox read-only so Codex can use it without exposing an\n // API key through the generated .env file.\n if (agent.name === \"codex\" && codexAuth === \"chatgpt\") {\n content = content.replace(\n \"const sandboxAuthOptions = {};\",\n `const sandboxAuthOptions = ${CODEX_CHATGPT_AUTH_OPTIONS};`,\n );\n }\n\n // Replace the sandbox provider. Templates always use `docker` as the\n // placeholder, where the registry name doubles as both the factory function\n // name and the `/sandboxes/<name>` import subpath segment. A single\n // case-sensitive word-boundary replace therefore rewrites the named import,\n // the import subpath, and every factory call site — and is a no-op when\n // docker is selected.\n content = content.replace(/\\bdocker\\b/g, sandboxProvider.name);\n\n yield* fs\n .writeFileString(mainTsPath, content)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n });\n\n/** Text file extensions eligible for `{{KEY}}` template argument substitution. */\nconst TEXT_FILE_EXTENSIONS = new Set([\n \".md\",\n \".txt\",\n \".env\",\n \".example\",\n // Dockerfile / Containerfile have no extension — handled by name check below\n]);\n\nconst isTextFile = (filename: string): boolean => {\n if (\n filename === \"Dockerfile\" ||\n filename === \"Containerfile\" ||\n filename === \".gitignore\"\n )\n return true;\n const dotIdx = filename.lastIndexOf(\".\");\n if (dotIdx === -1) return false;\n return TEXT_FILE_EXTENSIONS.has(filename.slice(dotIdx));\n};\n\n/**\n * Replace `{{KEY}}` template arguments from the issue tracker's\n * `templateArgs` map in all text files in the scaffolded config directory.\n */\nconst substituteTemplateArgs = (\n configDir: string,\n issueTracker: IssueTrackerEntry,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const files = yield* fs\n .readDirectory(configDir)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n const textFiles = files.filter(isTextFile);\n yield* Effect.all(\n textFiles.map((f) =>\n Effect.gen(function* () {\n const filePath = join(configDir, f);\n let content = yield* fs\n .readFileString(filePath)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n const original = content;\n for (const [key, value] of Object.entries(\n issueTracker.templateArgs,\n )) {\n content = content.replace(\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"),\n value,\n );\n }\n if (content !== original) {\n yield* fs\n .writeFileString(filePath, content)\n .pipe(Effect.mapError((e) => new Error(e.message)));\n }\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n });\n\n// ---------------------------------------------------------------------------\n// Main scaffold function\n// ---------------------------------------------------------------------------\n\nexport interface ScaffoldOptions {\n agent: AgentEntry;\n model: string;\n /** Whether `model` came from an explicit `init --model` option. */\n modelExplicit?: boolean;\n templateName?: string;\n issueTracker?: IssueTrackerEntry;\n sandboxProvider?: SandboxProviderEntry;\n codexAuth?: CodexAuthMode;\n onProgress?: (update: ScaffoldProgressUpdate) => void;\n}\n\nexport interface ScaffoldProgressUpdate {\n readonly current: number;\n readonly total: number;\n readonly message: string;\n}\n\nexport interface ScaffoldResult {\n mainFilename: string;\n}\n\n/**\n * Detect whether the project's package.json has `\"type\": \"module\"`.\n * If so, we can use plain `.ts`; otherwise we use `.mts` to ensure ESM.\n */\nconst detectMainFilename = (\n repoDir: string,\n): Effect.Effect<string, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const pkgPath = join(repoDir, \"package.json\");\n const exists = yield* fs\n .exists(pkgPath)\n .pipe(Effect.orElseSucceed(() => false));\n if (!exists) return \"main.mts\";\n const content = yield* fs\n .readFileString(pkgPath)\n .pipe(Effect.orElseSucceed(() => \"\"));\n try {\n const pkg = JSON.parse(content) as Record<string, unknown>;\n return pkg[\"type\"] === \"module\" ? \"main.ts\" : \"main.mts\";\n } catch {\n return \"main.mts\";\n }\n });\n\nexport const scaffold = (\n repoDir: string,\n options: ScaffoldOptions,\n): Effect.Effect<ScaffoldResult, Error, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const {\n agent,\n model,\n modelExplicit = false,\n templateName = \"simple-loop\",\n issueTracker = ISSUE_TRACKER_REGISTRY[0]!, // default: github-issues\n sandboxProvider = SANDBOX_PROVIDER_REGISTRY[0]!, // default: docker\n codexAuth = \"api-key\",\n } = options;\n const totalProgressSteps = 5;\n const reportProgress = (current: number, message: string): void =>\n options.onProgress?.({\n current,\n total: totalProgressSteps,\n message,\n });\n if (codexAuth === \"chatgpt\" && agent.name !== \"codex\") {\n return yield* Effect.fail(\n new Error(\n \"ChatGPT subscription authentication is only supported for Codex.\",\n ),\n );\n }\n const fs = yield* FileSystem.FileSystem;\n yield* assertConfigDirAvailable(repoDir);\n const configDir = join(repoDir, CONFIG_DIR);\n\n const mainFilename = yield* detectMainFilename(repoDir);\n reportProgress(1, \"Validated repository and configuration\");\n\n yield* fs\n .makeDirectory(configDir, { recursive: false })\n .pipe(Effect.mapError((e) => new Error(e.message)));\n\n const templateDir = yield* getTemplateDir(templateName);\n reportProgress(2, `Prepared ${CONFIG_DIR}/ directory`);\n\n // Build .env.example from agent + issue tracker env blocks\n const envExampleParts = [\n agent.name === \"codex\" && codexAuth === \"chatgpt\"\n ? CODEX_CHATGPT_ENV_EXAMPLE\n : agent.envExample,\n ];\n envExampleParts.push(roleModelEnvExample(agent.name));\n if (issueTracker.envExample) {\n envExampleParts.push(issueTracker.envExample);\n }\n const envExampleContent = envExampleParts.join(\"\\n\") + \"\\n\";\n const envExamplePath = join(configDir, \".env.example\");\n\n yield* Effect.all(\n [\n fs\n .writeFileString(\n join(configDir, sandboxProvider.containerfileName),\n agent.dockerfileTemplate,\n )\n .pipe(Effect.mapError((e) => new Error(e.message))),\n fs\n .writeFileString(join(configDir, \".gitignore\"), GITIGNORE)\n .pipe(Effect.mapError((e) => new Error(e.message))),\n fs\n .writeFileString(envExamplePath, envExampleContent)\n .pipe(Effect.mapError((e) => new Error(e.message))),\n fs\n .writeFileString(join(configDir, \".env\"), envExampleContent)\n .pipe(Effect.mapError((e) => new Error(e.message))),\n copyTemplateFiles(templateDir, configDir, mainFilename),\n ],\n { concurrency: \"unbounded\" },\n );\n reportProgress(3, \"Wrote configuration and template files\");\n\n // Rewrite main file with the selected agent factory, model, and sandbox provider\n yield* rewriteMainTs(\n configDir,\n agent,\n model,\n modelExplicit,\n sandboxProvider,\n mainFilename,\n codexAuth,\n );\n reportProgress(4, \"Configured selected agent and sandbox\");\n\n // Replace issue tracker template arguments in all text files.\n yield* substituteTemplateArgs(configDir, issueTracker);\n reportProgress(5, \"Applied issue tracker settings\");\n\n return { mainFilename };\n });\n","import { execFileSync } from \"node:child_process\";\nimport { statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { InitError } from \"./errors.js\";\n\nexport type CodexAuthMode = \"api-key\" | \"chatgpt\";\n\nexport interface ResolveCodexAuthModeOptions {\n readonly agentName: string;\n readonly requested?: CodexAuthMode;\n readonly interactive: boolean;\n readonly select: () => Promise<CodexAuthMode | undefined>;\n}\n\n/** Resolve Codex authentication immediately after agent selection. */\nexport const resolveCodexAuthMode = async (\n options: ResolveCodexAuthModeOptions,\n): Promise<CodexAuthMode> => {\n if (options.agentName !== \"codex\") {\n if (options.requested === \"chatgpt\") {\n throw new InitError({\n message: \"--codex-auth chatgpt can only be used with --agent codex.\",\n });\n }\n return \"api-key\";\n }\n\n if (options.requested !== undefined) return options.requested;\n if (!options.interactive) {\n throw new InitError({\n message:\n \"--codex-auth is required in non-interactive mode (no TTY detected).\",\n });\n }\n\n const selected = await options.select();\n if (selected === undefined) {\n throw new InitError({\n message: \"Codex authentication selection cancelled.\",\n });\n }\n return selected;\n};\n\nexport interface CodexAuthPreflightOptions {\n readonly cwd: string;\n readonly interactive: boolean;\n /** Test seam; production uses the user's default ~/.codex directory. */\n readonly authHome?: string;\n /** Test seam; production runs `codex login` in the user's terminal. */\n readonly login?: (cwd: string) => void;\n}\n\nexport const codexAuthFilePath = (\n authHome = join(homedir(), \".codex\"),\n): string => join(authHome, \"auth.json\");\n\nconst isRegularFile = (path: string): boolean => {\n try {\n return statSync(path).isFile();\n } catch {\n return false;\n }\n};\n\nconst isMissingCodexCli = (error: unknown): boolean =>\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\";\n\n// Shipyard mounts auth.json into the sandbox, so make this login use the file\n// store without changing the user's permanent Codex configuration.\nconst codexLoginArgs = [\n \"--config\",\n 'cli_auth_credentials_store=\"file\"',\n \"login\",\n];\n\nconst runCodexLogin = (cwd: string): void => {\n try {\n execFileSync(\"codex\", codexLoginArgs, { cwd, stdio: \"inherit\" });\n } catch (error) {\n if (!isMissingCodexCli(error)) throw error;\n // Shipyard already requires npm. Use npx as a no-global-install fallback\n // when the user has not installed the Codex CLI on the host yet.\n execFileSync(\n process.platform === \"win32\" ? \"npx.cmd\" : \"npx\",\n [\"--yes\", \"@openai/codex\", ...codexLoginArgs],\n { cwd, stdio: \"inherit\" },\n );\n }\n};\n\n/**\n * Ensure the host has a file-backed Codex ChatGPT login for the generated\n * sandbox mount. The browser/device login remains user-driven; init only\n * starts it when an interactive terminal is available.\n */\nexport const ensureCodexChatGptAuth = (\n options: CodexAuthPreflightOptions,\n): void => {\n const authFile = codexAuthFilePath(options.authHome);\n if (isRegularFile(authFile)) return;\n\n if (!options.interactive) {\n throw new InitError({\n message:\n \"Codex ChatGPT authentication is not ready: ~/.codex/auth.json was not found. Run `codex login` in an interactive terminal, then rerun `shipyard init --codex-auth chatgpt` (non-interactive mode cannot open the login flow).\",\n });\n }\n\n try {\n (options.login ?? runCodexLogin)(options.cwd);\n } catch (error) {\n if (error instanceof InitError) throw error;\n if (isMissingCodexCli(error)) {\n throw new InitError({\n message:\n \"The Codex CLI is not installed. Install it with `npm install --global @openai/codex`, run `codex login`, and rerun Shipyard init.\",\n });\n }\n throw new InitError({\n message:\n \"Codex login failed. Complete `codex login` successfully, then rerun Shipyard init.\",\n });\n }\n\n if (!isRegularFile(authFile)) {\n throw new InitError({\n message:\n 'Codex login finished, but ~/.codex/auth.json was not created. Codex may be using an OS keyring or a managed configuration. Set `cli_auth_credentials_store = \"file\"` in `~/.codex/config.toml`, run `codex login` again, and rerun Shipyard init.',\n });\n }\n};\n","import { join } from \"node:path\";\n\nexport const REPOSITORY_RUNNER_WORKFLOW_PATH =\n \".github/workflows/shipyard-wake.yml\";\nexport const REPOSITORY_RUNNER_WAKE_EXECUTABLE = \"shipyard-wake\";\n\nexport const REPOSITORY_RUNNER_WORKFLOW = `name: Shipyard wake-up\n\non:\n issues:\n types: [labeled]\n workflow_dispatch:\n\npermissions: {}\n\njobs:\n filter:\n name: Check wake eligibility\n runs-on: ubuntu-latest\n outputs:\n wake: \\${{ steps.filter.outputs.wake }}\n steps:\n - name: Match the wake-up trigger\n id: filter\n shell: bash\n env:\n EVENT_NAME: \\${{ github.event_name }}\n LABEL_NAME: \\${{ github.event.label.name }}\n run: |\n if [[ \"$EVENT_NAME\" == \"workflow_dispatch\" ]] || [[ \"$EVENT_NAME\" == \"issues\" && \"$LABEL_NAME\" == \"shipyard\" ]]; then\n echo \"wake=true\" >> \"$GITHUB_OUTPUT\"\n else\n echo \"wake=false\" >> \"$GITHUB_OUTPUT\"\n fi\n\n wake:\n name: Deliver wake-up\n needs: filter\n if: needs.filter.outputs.wake == 'true'\n runs-on: [self-hosted, macOS, shipyard]\n steps:\n - name: Signal the foreground repository runner\n shell: bash\n run: '\"$RUNNER_TEMP/../../shipyard-wake\"'\n`;\n\nexport const REPOSITORY_RUNNER_WAKE_SCRIPT = `#!/bin/bash\nset -euo pipefail\n\nrunner_dir=\"$(cd -- \"$(dirname -- \"$0\")\" && pwd)\"\nlock_path=\"$runner_dir/.shipyard-controller.lock\"\n\nif [[ ! -r \"$lock_path\" ]]; then\n echo \"::error::The Shipyard repository runner controller is unavailable. Start it with npx shipyard runner start.\"\n exit 1\nfi\n\ncontroller_pid=\"$(sed -n 's/.*\"pid\"[[:space:]]*:[[:space:]]*\\\\([0-9][0-9]*\\\\).*/\\\\1/p' \"$lock_path\" | head -n 1)\"\ncontroller_started_at=\"$(sed -n 's/.*\"processStartedAt\"[[:space:]]*:[[:space:]]*\"\\\\([^\"]*\\\\)\".*/\\\\1/p' \"$lock_path\" | head -n 1)\"\nif [[ -z \"$controller_pid\" ]] || [[ -z \"$controller_started_at\" ]]; then\n echo \"::error::The Shipyard repository runner controller is unavailable. Start it with npx shipyard runner start.\"\n exit 1\nfi\ncurrent_started_at=\"$(ps -p \"$controller_pid\" -o lstart= 2>/dev/null | awk '{$1=$1; print}' || true)\"\nif [[ \"$current_started_at\" != \"$controller_started_at\" ]] || ! kill -0 \"$controller_pid\" 2>/dev/null; then\n echo \"::error::The Shipyard repository runner controller is unavailable. Start it with npx shipyard runner start.\"\n exit 1\nfi\n\nif ! kill -USR1 \"$controller_pid\"; then\n echo \"::error::The Shipyard repository runner controller could not receive the wake-up.\"\n exit 1\nfi\n\necho \"Wake-up delivered to the Shipyard repository runner controller.\"\n`;\n\nexport class RepositoryRunnerWakeError extends Error {\n readonly name = \"RepositoryRunnerWakeError\";\n}\n\nexport interface RepositoryRunnerWakeFileAdapters {\n readonly exists: (path: string) => Promise<boolean>;\n readonly readText: (path: string) => Promise<string>;\n readonly writeText: (path: string, content: string) => Promise<void>;\n readonly makeDirectory: (path: string) => Promise<void>;\n readonly chmod: (path: string, mode: number) => Promise<void>;\n}\n\ninterface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface CommandOptions {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n}\n\nexport interface RepositoryRunnerWakeGitHubAdapter {\n readonly run: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => Promise<CommandResult>;\n}\n\nexport interface RepositoryRunnerWakeSubscription {\n readonly next: () => Promise<void>;\n readonly close: () => void;\n}\n\nconst workflowCollisionMessage = (): string =>\n `Refusing to overwrite the differing workflow at ${REPOSITORY_RUNNER_WORKFLOW_PATH}. Replace it with the required Shipyard wake-only workflow, then retry:\\n\\n${REPOSITORY_RUNNER_WORKFLOW}`;\n\nconst publishedWorkflowFailureMessage = (\n repository: string,\n defaultBranch: string,\n error: unknown,\n): string => {\n const details = error instanceof Error ? error.message : String(error);\n if (\n /HTTP 403|Resource not accessible by personal access token/i.test(details)\n ) {\n return `The Shipyard wake workflow could not be read for ${repository} on the default branch (${defaultBranch}). GitHub denied Contents: Read access for the host gh login. Authenticate gh with repository administration access, then start the runner again. GitHub reported: ${details}`;\n }\n return `The Shipyard wake workflow is not active for ${repository}. Commit and push ${REPOSITORY_RUNNER_WORKFLOW_PATH} to the default branch (${defaultBranch}), then start the runner again. GitHub reported: ${details}`;\n};\n\nexport const assertRepositoryRunnerWorkflowCanBeInstalled = async (\n repoDir: string,\n adapters: RepositoryRunnerWakeFileAdapters,\n): Promise<void> => {\n const workflowPath = join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH);\n if (!(await adapters.exists(workflowPath))) return;\n if ((await adapters.readText(workflowPath)) !== REPOSITORY_RUNNER_WORKFLOW) {\n throw new RepositoryRunnerWakeError(workflowCollisionMessage());\n }\n};\n\nconst ensureDirectory = async (\n path: string,\n adapters: RepositoryRunnerWakeFileAdapters,\n): Promise<void> => {\n if (!(await adapters.exists(path))) await adapters.makeDirectory(path);\n};\n\nexport const installRepositoryRunnerWakeFiles = async (\n options: { readonly repoDir: string; readonly runnerDir: string },\n adapters: RepositoryRunnerWakeFileAdapters,\n): Promise<void> => {\n await assertRepositoryRunnerWorkflowCanBeInstalled(options.repoDir, adapters);\n const githubDir = join(options.repoDir, \".github\");\n const workflowsDir = join(githubDir, \"workflows\");\n await ensureDirectory(githubDir, adapters);\n await ensureDirectory(workflowsDir, adapters);\n await adapters.writeText(\n join(options.repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH),\n REPOSITORY_RUNNER_WORKFLOW,\n );\n\n const wakeExecutable = join(\n options.runnerDir,\n REPOSITORY_RUNNER_WAKE_EXECUTABLE,\n );\n await adapters.writeText(wakeExecutable, REPOSITORY_RUNNER_WAKE_SCRIPT);\n await adapters.chmod(wakeExecutable, 0o700);\n};\n\nexport const requirePublishedRepositoryRunnerWorkflow = async (\n options: {\n readonly repoDir: string;\n readonly repository: string;\n readonly environment: NodeJS.ProcessEnv;\n },\n adapter: RepositoryRunnerWakeGitHubAdapter,\n): Promise<void> => {\n let defaultBranch: string;\n try {\n const result = await adapter.run(\n \"gh\",\n [\"api\", `repos/${options.repository}`, \"--jq\", \".default_branch\"],\n { cwd: options.repoDir, env: options.environment },\n );\n defaultBranch = result.stdout.trim();\n if (defaultBranch.length === 0) throw new Error(\"empty default branch\");\n } catch (error) {\n throw new RepositoryRunnerWakeError(\n `Could not determine the GitHub default branch for ${options.repository}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n let publishedWorkflow: string;\n try {\n const result = await adapter.run(\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"GET\",\n \"-H\",\n \"Accept: application/vnd.github.raw+json\",\n `repos/${options.repository}/contents/${REPOSITORY_RUNNER_WORKFLOW_PATH}?ref=${encodeURIComponent(defaultBranch)}`,\n ],\n { cwd: options.repoDir, env: options.environment },\n );\n publishedWorkflow = result.stdout;\n } catch (error) {\n throw new RepositoryRunnerWakeError(\n publishedWorkflowFailureMessage(options.repository, defaultBranch, error),\n );\n }\n\n if (publishedWorkflow !== REPOSITORY_RUNNER_WORKFLOW) {\n throw new RepositoryRunnerWakeError(\n `The Shipyard wake workflow on the default branch (${defaultBranch}) does not match the required workflow. Update and push ${REPOSITORY_RUNNER_WORKFLOW_PATH}, then start the runner again.\\n\\n${REPOSITORY_RUNNER_WORKFLOW}`,\n );\n }\n};\n\n/** Coalesces signal deliveries until the foreground controller consumes them. */\nexport const createRepositoryRunnerWakeSubscription = (\n subscribe: (listener: () => void) => () => void = (listener) => {\n process.on(\"SIGUSR1\", listener);\n return () => process.removeListener(\"SIGUSR1\", listener);\n },\n): RepositoryRunnerWakeSubscription => {\n let pending = false;\n let closed = false;\n let resolveNext: (() => void) | undefined;\n const unsubscribe = subscribe(() => {\n if (closed || pending) return;\n pending = true;\n resolveNext?.();\n resolveNext = undefined;\n });\n\n return {\n next: async () => {\n if (closed) return;\n if (!pending) {\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n }\n pending = false;\n },\n close: () => {\n if (closed) return;\n closed = true;\n unsubscribe();\n resolveNext?.();\n resolveNext = undefined;\n },\n };\n};\n","import { createHash } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport {\n access,\n chmod,\n mkdir,\n lstat,\n realpath,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { ACTIVATION_LABEL, CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\nimport {\n assertProtectedDirectoryIdentities,\n repositoryRunnerEnvironment,\n type ProtectedDirectoryIdentity,\n} from \"./runnerSecurity.js\";\nimport {\n assertRepositoryRunnerWorkflowCanBeInstalled,\n installRepositoryRunnerWakeFiles,\n} from \"./RepositoryRunnerWake.js\";\nimport {\n RUNNER_INSTALL_METADATA,\n RunnerLifecycleError,\n validateExistingRepositoryRunner,\n} from \"./RepositoryRunnerLifecycle.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst RUNNER_ARCHIVE = \"runner.tgz\";\nconst RELEASES_API =\n \"https://api.github.com/repos/actions/runner/releases/latest\";\n\nexport class RunnerInstallError extends Error {\n readonly name: string = \"RunnerInstallError\";\n}\n\nexport interface ExistingRepositoryRunnerRegistration {\n readonly id: number | undefined;\n readonly name: string;\n readonly status: string;\n readonly busy: boolean;\n}\n\nexport class RunnerInstallConflictError extends RunnerInstallError {\n override readonly name = \"RunnerInstallConflictError\";\n\n readonly confirmationMessage: string;\n\n constructor(\n readonly repository: string,\n readonly runners: readonly ExistingRepositoryRunnerRegistration[],\n ) {\n const names = runners.map(({ name }) => name).join(\", \");\n super(\n `A repository runner labeled \\`${ACTIVATION_LABEL}\\` is already registered for ${repository}: ${names}. Remove it before installing another.`,\n );\n const details = runners\n .map(\n ({ id, name, status, busy }) =>\n `${name}${id === undefined ? \"\" : ` (#${id})`} (${status}${busy ? \", busy\" : \"\"})`,\n )\n .join(\", \");\n this.confirmationMessage = `GitHub has ${runners.length} repository runner${runners.length === 1 ? \"\" : \"s\"} labeled \\`${ACTIVATION_LABEL}\\` for ${repository}: ${details}. Delete ${runners.length === 1 ? \"this registration\" : \"these registrations\"} and install a replacement?`;\n }\n}\n\nexport interface RunnerInstallOptions {\n readonly repoDir: string;\n readonly registrationToken?: string;\n readonly onProgress?: (update: RunnerInstallProgress) => void;\n}\n\nexport interface RunnerInstallProgress {\n readonly current: number;\n readonly total: number;\n readonly message: string;\n}\n\nexport interface RunnerInstallResult {\n readonly name: string;\n readonly repository: string;\n readonly version: string;\n readonly runnerDir: string;\n}\n\ninterface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface CommandOptions {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n}\n\n/** Internal seams used to test installation without GitHub or a live runner. */\nexport interface RunnerInstallAdapters {\n readonly platform: () => NodeJS.Platform | string;\n readonly arch: () => string;\n readonly hostname: () => string;\n readonly environment: () => NodeJS.ProcessEnv;\n readonly exists: (path: string) => Promise<boolean>;\n readonly readText: (path: string) => Promise<string>;\n readonly writeText: (path: string, content: string) => Promise<void>;\n readonly writeBytes: (path: string, content: Uint8Array) => Promise<void>;\n readonly makeDirectory: (path: string) => Promise<void>;\n readonly remove: (path: string) => Promise<void>;\n readonly chmod: (path: string, mode: number) => Promise<void>;\n readonly commandExists: (command: string) => Promise<boolean>;\n readonly inspectDirectory?: (\n path: string,\n ) => Promise<ProtectedDirectoryIdentity>;\n readonly fetchJson: (url: string) => Promise<unknown>;\n readonly fetchBytes: (url: string) => Promise<Uint8Array>;\n readonly run: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => Promise<CommandResult>;\n}\n\ninterface RunnerReleaseAsset {\n readonly name: string;\n readonly browser_download_url: string;\n readonly digest: string;\n}\n\ninterface RunnerRelease {\n readonly tag_name: string;\n readonly assets: readonly RunnerReleaseAsset[];\n}\n\nconst defaultAdapters: RunnerInstallAdapters = {\n platform: () => process.platform,\n arch: () => process.arch,\n hostname,\n environment: () => process.env,\n exists: async (path) => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n },\n readText: (path) => readFile(path, \"utf8\"),\n writeText: (path, content) => writeFile(path, content, { mode: 0o600 }),\n writeBytes: (path, content) => writeFile(path, content, { mode: 0o600 }),\n makeDirectory: (path) => mkdir(path, { recursive: false, mode: 0o700 }),\n remove: (path) => rm(path, { recursive: true, force: true }),\n chmod,\n commandExists: async (command) => {\n try {\n await execFileAsync(\"which\", [command]);\n return true;\n } catch {\n return false;\n }\n },\n inspectDirectory: async (path) => {\n const [stat, resolved] = await Promise.all([lstat(path), realpath(path)]);\n return {\n realPath: resolved,\n directory: stat.isDirectory(),\n symbolicLink: stat.isSymbolicLink(),\n };\n },\n fetchJson: async (url) => {\n const response = await fetch(url, {\n headers: {\n Accept: \"application/vnd.github+json\",\n \"User-Agent\": \"shipyard-runner-installer\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n });\n if (!response.ok) {\n throw new Error(`GitHub returned HTTP ${response.status}`);\n }\n return response.json();\n },\n fetchBytes: async (url) => {\n const response = await fetch(url, {\n headers: { \"User-Agent\": \"shipyard-runner-installer\" },\n });\n if (!response.ok) {\n throw new Error(`GitHub returned HTTP ${response.status}`);\n }\n return new Uint8Array(await response.arrayBuffer());\n },\n run: async (command, args, options) => {\n const result = await execFileAsync(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n },\n};\n\nexport const parseGitHubRepository = (\n remote: string,\n): { owner: string; repository: string } => {\n const trimmed = remote.trim();\n const sshMatch = trimmed.match(\n /^(?:git@github\\.com:|ssh:\\/\\/git@github\\.com\\/)([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n );\n const httpsMatch = trimmed.match(\n /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?\\/?$/,\n );\n const match = sshMatch ?? httpsMatch;\n if (!match) {\n throw new RunnerInstallError(\n \"The origin remote must be a GitHub.com repository (github.com/owner/repository). GitHub Enterprise and other hosts are not supported yet.\",\n );\n }\n return { owner: match[1]!, repository: match[2]! };\n};\n\nconst normalizeNamePart = (value: string): string => {\n const normalized = value\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-+/g, \"-\");\n return normalized || \"unknown\";\n};\n\nconst requireCommand = async (\n adapters: RunnerInstallAdapters,\n command: string,\n purpose: string,\n): Promise<void> => {\n if (!(await adapters.commandExists(command))) {\n throw new RunnerInstallError(\n `Missing required command \\`${command}\\` (${purpose}). Install it and retry.`,\n );\n }\n};\n\nconst asRelease = (value: unknown): RunnerRelease => {\n if (typeof value !== \"object\" || value === null) {\n throw new RunnerInstallError(\n \"GitHub returned invalid runner release metadata.\",\n );\n }\n const release = value as Partial<RunnerRelease>;\n if (typeof release.tag_name !== \"string\" || !Array.isArray(release.assets)) {\n throw new RunnerInstallError(\n \"GitHub returned invalid runner release metadata.\",\n );\n }\n return release as RunnerRelease;\n};\n\nconst selectArm64Asset = (release: RunnerRelease): RunnerReleaseAsset => {\n const asset = release.assets.find((candidate) =>\n /^actions-runner-osx-arm64-[\\d.]+\\.tar\\.gz$/.test(candidate.name),\n );\n if (\n !asset ||\n !asset.browser_download_url.startsWith(\n \"https://github.com/actions/runner/releases/download/\",\n ) ||\n !/^sha256:[a-f0-9]{64}$/i.test(asset.digest)\n ) {\n throw new RunnerInstallError(\n \"The latest official GitHub Actions runner release has no verifiable macOS ARM64 archive.\",\n );\n }\n return asset;\n};\n\nconst appendRunnerIgnores = async (\n gitignorePath: string,\n adapters: RunnerInstallAdapters,\n): Promise<void> => {\n const current = (await adapters.exists(gitignorePath))\n ? await adapters.readText(gitignorePath)\n : \"\";\n const lines = new Set(current.split(/\\r?\\n/));\n const additions = [`${RUNNER_DIR}/`].filter((line) => !lines.has(line));\n if (additions.length === 0) return;\n const prefix =\n current.length === 0 || current.endsWith(\"\\n\") ? current : `${current}\\n`;\n await adapters.writeText(gitignorePath, `${prefix}${additions.join(\"\\n\")}\\n`);\n};\n\nconst commandFailure = (purpose: string, error: unknown): RunnerInstallError =>\n new RunnerInstallError(\n `${purpose} failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n\nconst reportProgress = (\n options: RunnerInstallOptions,\n current: number,\n total: number,\n message: string,\n): void => options.onProgress?.({ current, total, message });\n\nconst parseExistingRunnerRegistrations = (\n stdout: string,\n): readonly ExistingRepositoryRunnerRegistration[] => {\n const lines = stdout.trim().split(/\\r?\\n/).filter(Boolean);\n return lines.map((line) => {\n let value: unknown;\n try {\n value = JSON.parse(line);\n } catch {\n // Accept the earlier name-only response format from injected adapters.\n // Such a result can block an install, but cannot be deleted without an ID.\n return { id: undefined, name: line, status: \"unknown\", busy: false };\n }\n if (typeof value !== \"object\" || value === null) {\n throw new RunnerInstallError(\n \"GitHub returned invalid repository runner information.\",\n );\n }\n const registration = value as Record<string, unknown>;\n if (\n typeof registration.id !== \"number\" ||\n !Number.isInteger(registration.id) ||\n registration.id <= 0 ||\n typeof registration.name !== \"string\" ||\n registration.name.length === 0 ||\n typeof registration.status !== \"string\" ||\n typeof registration.busy !== \"boolean\"\n ) {\n throw new RunnerInstallError(\n \"GitHub returned invalid repository runner information.\",\n );\n }\n return {\n id: registration.id,\n name: registration.name,\n status: registration.status,\n busy: registration.busy,\n };\n });\n};\n\nexport const removeExistingRepositoryRunnerRegistrations = async (\n options: {\n readonly repoDir: string;\n readonly conflict: RunnerInstallConflictError;\n },\n adapters: RunnerInstallAdapters = defaultAdapters,\n): Promise<void> => {\n if (options.conflict.runners.some(({ id }) => id === undefined)) {\n throw new RunnerInstallError(\n \"GitHub did not provide runner IDs, so Shipyard cannot safely remove the existing registrations. Remove them in GitHub Settings > Actions > Runners, then retry.\",\n );\n }\n\n const environment = adapters.environment();\n const removed: string[] = [];\n for (const runner of options.conflict.runners) {\n try {\n await adapters.run(\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"DELETE\",\n `repos/${options.conflict.repository}/actions/runners/${runner.id}`,\n ],\n { cwd: options.repoDir, env: environment },\n );\n removed.push(runner.name);\n } catch (error) {\n const previous =\n removed.length === 0\n ? \"\"\n : ` Earlier registrations were already removed: ${removed.join(\", \")}.`;\n throw new RunnerInstallError(\n `${\n commandFailure(\n `Removing GitHub runner ${runner.name} (#${runner.id}) from ${options.conflict.repository}`,\n error,\n ).message\n }${previous}`,\n );\n }\n }\n};\n\nexport const installRepositoryRunnerWithReplacement = async (\n options: {\n readonly repoDir: string;\n readonly interactive: boolean;\n readonly install: () => Promise<RunnerInstallResult>;\n readonly confirmReplacement: (\n conflict: RunnerInstallConflictError,\n ) => Promise<boolean>;\n },\n adapters: RunnerInstallAdapters = defaultAdapters,\n): Promise<RunnerInstallResult> => {\n try {\n return await options.install();\n } catch (error) {\n if (\n !(error instanceof RunnerInstallConflictError) ||\n !options.interactive\n ) {\n throw error;\n }\n if (!(await options.confirmReplacement(error))) {\n throw new RunnerInstallError(\n `${error.message} Existing runner registrations were left unchanged; installation cancelled.`,\n );\n }\n await removeExistingRepositoryRunnerRegistrations(\n {\n repoDir: options.repoDir,\n conflict: error,\n },\n adapters,\n );\n return options.install();\n }\n};\n\nexport const installRepositoryRunner = async (\n options: RunnerInstallOptions,\n adapters: RunnerInstallAdapters = defaultAdapters,\n): Promise<RunnerInstallResult> => {\n if (adapters.platform() !== \"darwin\" || adapters.arch() !== \"arm64\") {\n throw new RunnerInstallError(\n \"Repository runners currently require Apple Silicon macOS (darwin/arm64).\",\n );\n }\n\n const configDir = join(options.repoDir, CONFIG_DIR);\n const runnerDir = join(configDir, RUNNER_DIR);\n if (!(await adapters.exists(configDir))) {\n throw new RunnerInstallError(\n `No ${CONFIG_DIR}/ found. Run \\`shipyard init\\` in this repository first.`,\n );\n }\n const runnerExists = await adapters.exists(runnerDir);\n const progressTotal = runnerExists ? 3 : 8;\n try {\n await assertRepositoryRunnerWorkflowCanBeInstalled(\n options.repoDir,\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n error instanceof Error ? error.message : String(error),\n );\n }\n\n await requireCommand(adapters, \"git\", \"reading the repository remote\");\n if (!runnerExists) {\n await requireCommand(adapters, \"tar\", \"extracting the runner archive\");\n }\n await requireCommand(adapters, \"gh\", \"checking repository runner uniqueness\");\n\n const hostEnv = adapters.environment();\n const gitRemote = await adapters\n .run(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: options.repoDir,\n env: hostEnv,\n })\n .catch((error) => {\n throw commandFailure(\"Reading the origin remote\", error);\n });\n const identity = parseGitHubRepository(gitRemote.stdout);\n const repository = `${identity.owner}/${identity.repository}`;\n const repoUrl = `https://github.com/${repository}`;\n const runnerName = `shipyard-${normalizeNamePart(identity.repository)}-${normalizeNamePart(adapters.hostname())}`;\n\n await adapters\n .run(\"gh\", [\"auth\", \"status\", \"--hostname\", \"github.com\"], {\n cwd: options.repoDir,\n env: hostEnv,\n })\n .catch((error) => {\n throw commandFailure(\n \"GitHub CLI authentication (repository administration is required)\",\n error,\n );\n });\n reportProgress(\n options,\n 1,\n progressTotal,\n \"Validated repository and GitHub access\",\n );\n\n if (runnerExists) {\n let metadata;\n try {\n metadata = await validateExistingRepositoryRunner(\n {\n repoDir: options.repoDir,\n runnerDir,\n repository,\n runnerName,\n },\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n error instanceof RunnerLifecycleError\n ? error.message\n : `Validating the existing repository runner failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n await appendRunnerIgnores(join(configDir, \".gitignore\"), adapters);\n await adapters.chmod(runnerDir, 0o700);\n await assertProtectedDirectoryIdentities(\n runnerDir,\n adapters.inspectDirectory,\n ).catch((error) => {\n throw commandFailure(\"Validating protected runner directories\", error);\n });\n reportProgress(options, 2, progressTotal, \"Validated existing runner\");\n try {\n await installRepositoryRunnerWakeFiles(\n { repoDir: options.repoDir, runnerDir },\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n `The existing runner is valid, but its wake-up files could not be refreshed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n reportProgress(options, 3, progressTotal, \"Refreshed wake-up workflow\");\n return {\n name: metadata.name,\n repository: metadata.repository,\n version: metadata.version,\n runnerDir,\n };\n }\n\n const existing = await adapters\n .run(\n \"gh\",\n [\n \"api\",\n \"--paginate\",\n `repos/${repository}/actions/runners`,\n \"--jq\",\n `.runners[] | select(any(.labels[]; .name == \\\"${ACTIVATION_LABEL}\\\")) | {id, name, status, busy}`,\n ],\n { cwd: options.repoDir, env: hostEnv },\n )\n .catch((error) => {\n throw commandFailure(\n \"Checking existing repository runners (repository administration is required)\",\n error,\n );\n });\n const existingRegistrations = parseExistingRunnerRegistrations(\n existing.stdout,\n );\n if (existingRegistrations.length > 0) {\n throw new RunnerInstallConflictError(repository, existingRegistrations);\n }\n reportProgress(\n options,\n 2,\n progressTotal,\n \"Checked for conflicting repository runners\",\n );\n\n let registrationToken = options.registrationToken;\n if (!registrationToken) {\n const tokenResult = await adapters\n .run(\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"POST\",\n `repos/${repository}/actions/runners/registration-token`,\n ],\n { cwd: options.repoDir, env: hostEnv },\n )\n .catch((error) => {\n throw commandFailure(\n \"Requesting a one-time runner registration token (repository administration is required)\",\n error,\n );\n });\n try {\n const parsed = JSON.parse(tokenResult.stdout) as { token?: unknown };\n if (typeof parsed.token !== \"string\" || parsed.token.length === 0) {\n throw new Error(\"response did not contain a token\");\n }\n registrationToken = parsed.token;\n } catch (error) {\n throw commandFailure(\"Reading the one-time registration token\", error);\n }\n }\n reportProgress(\n options,\n 3,\n progressTotal,\n \"Prepared runner registration token\",\n );\n\n let release: RunnerRelease;\n try {\n release = asRelease(await adapters.fetchJson(RELEASES_API));\n } catch (error) {\n if (error instanceof RunnerInstallError) throw error;\n throw commandFailure(\"Fetching official runner release metadata\", error);\n }\n const asset = selectArm64Asset(release);\n const version = release.tag_name.replace(/^v/, \"\");\n let archive: Uint8Array;\n try {\n archive = await adapters.fetchBytes(asset.browser_download_url);\n } catch (error) {\n throw commandFailure(\"Downloading the official runner archive\", error);\n }\n const actualDigest = createHash(\"sha256\").update(archive).digest(\"hex\");\n const expectedDigest = asset.digest.slice(\"sha256:\".length).toLowerCase();\n if (actualDigest !== expectedDigest) {\n throw new RunnerInstallError(\n `Runner archive digest mismatch: expected ${expectedDigest}, received ${actualDigest}. Nothing was installed.`,\n );\n }\n reportProgress(\n options,\n 4,\n progressTotal,\n \"Downloaded and verified official runner archive\",\n );\n\n await appendRunnerIgnores(join(configDir, \".gitignore\"), adapters);\n await adapters.makeDirectory(runnerDir).catch((error) => {\n throw commandFailure(\"Creating the protected runner directory\", error);\n });\n await assertProtectedDirectoryIdentities(\n runnerDir,\n adapters.inspectDirectory,\n ).catch((error) => {\n throw commandFailure(\"Validating protected runner directories\", error);\n });\n await adapters.chmod(runnerDir, 0o700);\n reportProgress(\n options,\n 5,\n progressTotal,\n \"Prepared protected runner directories\",\n );\n\n const archivePath = join(runnerDir, RUNNER_ARCHIVE);\n await adapters.writeBytes(archivePath, archive);\n try {\n await adapters.run(\"tar\", [\"-xzf\", archivePath, \"--directory\", runnerDir], {\n cwd: options.repoDir,\n env: repositoryRunnerEnvironment(hostEnv),\n });\n } catch (error) {\n await adapters.remove(runnerDir);\n throw commandFailure(\"Extracting the verified runner archive\", error);\n } finally {\n await adapters.remove(archivePath);\n }\n reportProgress(options, 6, progressTotal, \"Extracted runner archive\");\n\n try {\n await adapters.run(\n \"./config.sh\",\n [\n \"--url\",\n repoUrl,\n \"--token\",\n registrationToken!,\n \"--name\",\n runnerName,\n \"--labels\",\n ACTIVATION_LABEL,\n \"--work\",\n \"_work\",\n \"--unattended\",\n ],\n { cwd: runnerDir, env: repositoryRunnerEnvironment(hostEnv) },\n );\n } catch {\n const cleanup = await Promise.allSettled([adapters.remove(runnerDir)]);\n const cleanupSucceeded = cleanup.every(\n (result) => result.status === \"fulfilled\",\n );\n throw new RunnerInstallError(\n cleanupSucceeded\n ? `Registering ${runnerName} failed. Partial local runner files were removed so installation can be retried. Check GitHub Settings > Actions > Runners for an orphan registration; the one-time token was not stored.`\n : `Registering ${runnerName} failed and partial local runner files could not be fully removed. Remove only ${runnerDir}, check GitHub Settings > Actions > Runners for an orphan registration, then retry. The one-time token was not stored.`,\n );\n }\n reportProgress(options, 7, progressTotal, \"Registered runner with GitHub\");\n\n await adapters.writeText(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n `${JSON.stringify(\n {\n schemaVersion: 1,\n repository,\n repositoryUrl: repoUrl,\n name: runnerName,\n label: ACTIVATION_LABEL,\n version,\n },\n null,\n 2,\n )}\\n`,\n );\n\n try {\n await installRepositoryRunnerWakeFiles(\n { repoDir: options.repoDir, runnerDir },\n adapters,\n );\n } catch (error) {\n throw new RunnerInstallError(\n `The runner was registered, but its wake-up files could not be installed. Runner files were retained at ${runnerDir}; fix the error and retry: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n reportProgress(options, 8, progressTotal, \"Installed wake-up workflow\");\n\n return { name: runnerName, repository, version, runnerDir };\n};\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { CONFIG_DIR } from \"./runtimeNames.js\";\nimport { REPOSITORY_RUNNER_WORKFLOW_PATH } from \"./RepositoryRunnerWake.js\";\n\nexport interface InitGitSetupResult {\n readonly branch: string;\n readonly commit: string;\n readonly pushError?: string;\n}\n\nconst errorText = (error: unknown): string => {\n if (error !== null && typeof error === \"object\" && \"stderr\" in error) {\n const stderr = error.stderr;\n if (typeof stderr === \"string\" || Buffer.isBuffer(stderr)) {\n const text = stderr.toString().trim();\n if (text) return text;\n }\n }\n return error instanceof Error ? error.message : String(error);\n};\n\n/** Commit generated setup files, then push the current branch to origin. */\nexport const commitAndPushInitSetup = (repoDir: string): InitGitSetupResult => {\n const branch = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd: repoDir,\n encoding: \"utf8\",\n }).trim();\n if (!branch) {\n throw new Error(\"Cannot push the Shipyard setup from a detached HEAD.\");\n }\n\n const paths = [CONFIG_DIR];\n if (existsSync(join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH))) {\n paths.push(REPOSITORY_RUNNER_WORKFLOW_PATH);\n }\n for (const packageFile of [\"package.json\", \"package-lock.json\"]) {\n if (existsSync(join(repoDir, packageFile))) paths.push(packageFile);\n }\n\n execFileSync(\"git\", [\"add\", \"--\", ...paths], {\n cwd: repoDir,\n stdio: \"ignore\",\n });\n // Keep unrelated staged changes out of the generated setup commit.\n execFileSync(\n \"git\",\n [\"commit\", \"--only\", \"-m\", \"Add Shipyard setup\", \"--\", ...paths],\n { cwd: repoDir, stdio: \"pipe\" },\n );\n const commit = execFileSync(\"git\", [\"rev-parse\", \"--short\", \"HEAD\"], {\n cwd: repoDir,\n encoding: \"utf8\",\n }).trim();\n\n try {\n execFileSync(\"git\", [\"push\", \"origin\", `HEAD:refs/heads/${branch}`], {\n cwd: repoDir,\n stdio: \"pipe\",\n });\n return { branch, commit };\n } catch (error) {\n return { branch, commit, pushError: errorText(error) };\n }\n};\n","import { execFile, spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n lstat,\n mkdir,\n readFile,\n realpath,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { NodeFileSystem } from \"@effect/platform-node\";\nimport { Effect } from \"effect\";\nimport { resolveEnv } from \"./EnvResolver.js\";\nimport { parseGitHubRepository } from \"./RepositoryRunner.js\";\nimport {\n repositoryRunnerEnvironment,\n type ProtectedDirectoryIdentity,\n} from \"./runnerSecurity.js\";\nimport {\n createRepositoryRunnerWakeSubscription,\n requirePublishedRepositoryRunnerWorkflow,\n} from \"./RepositoryRunnerWake.js\";\nimport {\n removeOwnedRepositoryRunnerContainers,\n recoverRepositoryRunner,\n RUNNER_CONTROLLER_LOCK,\n RUNNER_INSTALL_METADATA,\n RUNNER_WORK_DIR,\n RunnerLifecycleError,\n REPOSITORY_RUNNER_OWNER_ENV,\n lockOwnsProcess,\n type RunnerInstallMetadata,\n type RunnerLifecycleAdapters,\n type RunnerControllerLock,\n} from \"./RepositoryRunnerLifecycle.js\";\nimport { ACTIVATION_LABEL, CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\nimport {\n DEFAULT_LOG_RETENTION_DAYS,\n purgeRunLogs,\n type PurgeRunLogsOptions,\n type PurgeRunLogsResult,\n} from \"./LogRetention.js\";\n\nconst execFileAsync = promisify(execFile);\nconst CONTROLLER_STATE = \".shipyard-state.json\";\nconst LAST_FAILURE = \".shipyard-last-failure.json\";\nconst LOG_PURGE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\n\ninterface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface CommandOptions {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n}\n\nexport class RunnerControlError extends Error {\n readonly name = \"RunnerControlError\";\n}\n\nconst retainedFailures = new WeakSet<RunnerControlError>();\n\nexport interface RepositoryRunnerChild {\n readonly pid: number;\n readonly wait: () => Promise<{\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n }>;\n readonly terminate: (signal: NodeJS.Signals) => void;\n}\n\n/** Internal seams for process, GitHub, filesystem, credentials, and shutdown tests. */\nexport interface RunnerControlAdapters {\n readonly platform: () => NodeJS.Platform | string;\n readonly arch: () => string;\n readonly environment: () => NodeJS.ProcessEnv;\n readonly currentPid: () => number;\n readonly processIdentity: (pid: number) => Promise<string | undefined>;\n readonly exists: (path: string) => Promise<boolean>;\n readonly inspectDirectory?: (\n path: string,\n ) => Promise<ProtectedDirectoryIdentity>;\n readonly readText: (path: string) => Promise<string>;\n readonly writeText: (path: string, content: string) => Promise<void>;\n readonly writeExclusive: (path: string, content: string) => Promise<void>;\n readonly remove: (path: string) => Promise<void>;\n readonly makeDirectory: (path: string) => Promise<void>;\n readonly removeTree: (path: string) => Promise<void>;\n readonly commandExists: (command: string) => Promise<boolean>;\n readonly resolveEnvironment: (\n repoDir: string,\n ) => Promise<Record<string, string>>;\n readonly run: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => Promise<CommandResult>;\n readonly spawn: (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n ) => RepositoryRunnerChild;\n readonly isProcessRunning: (pid: number) => boolean;\n readonly signalProcess: (pid: number, signal: NodeJS.Signals) => void;\n readonly onShutdown: (handler: () => Promise<void>) => () => void;\n readonly onWake?: (handler: () => void) => () => void;\n readonly pause: (milliseconds: number) => Promise<void>;\n readonly now: () => Date;\n readonly purgeRunLogs: (\n options: PurgeRunLogsOptions,\n ) => Promise<PurgeRunLogsResult>;\n readonly scheduleRecurring: (\n task: () => Promise<void>,\n milliseconds: number,\n ) => () => void;\n readonly report: (message: string) => void;\n}\n\ntype RunnerControllerStateName =\n | \"idle\"\n | \"processing\"\n | \"stalled\"\n | \"stopping\"\n | \"stopped\";\n\ninterface RunnerWakeRecord {\n readonly source: \"startup\" | \"signal\";\n readonly recordedAt: string;\n}\n\ninterface RunnerControllerState {\n readonly schemaVersion: 1;\n readonly repository: string;\n readonly state: RunnerControllerStateName;\n readonly lastOutcome: string;\n readonly lastWake?: RunnerWakeRecord;\n}\n\nexport interface RepositoryRunnerStartResult {\n readonly repository: string;\n readonly initialWorkFound: boolean;\n}\n\nexport interface RepositoryRunnerStatus {\n readonly installed: boolean;\n readonly running: boolean;\n readonly pid?: number;\n readonly github: \"online\" | \"offline\" | \"unreachable\" | \"not-installed\";\n readonly repository?: string;\n readonly state: RunnerControllerStateName | \"not-installed\";\n readonly lastOutcome: string;\n readonly lastWake?: RunnerWakeRecord;\n}\n\nconst spawnForegroundChild = (\n command: string,\n args: readonly string[],\n options: CommandOptions,\n): RepositoryRunnerChild => {\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n stdio: \"inherit\",\n detached: true,\n });\n const pid = child.pid;\n if (pid === undefined) {\n throw new RunnerControlError(`Could not start ${command}.`);\n }\n const result = new Promise<{\n code: number | null;\n signal: NodeJS.Signals | null;\n }>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => resolve({ code, signal }));\n });\n return {\n pid,\n wait: () => result,\n terminate: (signal) => {\n try {\n process.kill(-pid, signal);\n } catch {\n child.kill(signal);\n }\n },\n };\n};\n\nconst registerRunnerShutdown = (handler: () => Promise<void>): (() => void) => {\n const signals = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const;\n let handling = false;\n const listeners = new Map<NodeJS.Signals, () => void>();\n const unregister = () => {\n for (const [signal, listener] of listeners) {\n process.removeListener(signal, listener);\n }\n listeners.clear();\n };\n\n for (const signal of signals) {\n const listener = () => {\n if (handling) return;\n handling = true;\n void handler().finally(() => {\n unregister();\n process.exit(\n signal === \"SIGINT\" ? 130 : signal === \"SIGTERM\" ? 143 : 129,\n );\n });\n };\n listeners.set(signal, listener);\n process.once(signal, listener);\n }\n return unregister;\n};\n\nconst defaultAdapters: RunnerControlAdapters = {\n platform: () => process.platform,\n arch: () => process.arch,\n environment: () => process.env,\n currentPid: () => process.pid,\n processIdentity: async (pid) => {\n try {\n const result = await execFileAsync(\"ps\", [\n \"-p\",\n String(pid),\n \"-o\",\n \"lstart=\",\n ]);\n const identity = result.stdout.trim().replace(/\\s+/g, \" \");\n return identity.length > 0 ? identity : undefined;\n } catch {\n return undefined;\n }\n },\n exists: async (path) => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n },\n inspectDirectory: async (path) => {\n const [stat, resolved] = await Promise.all([lstat(path), realpath(path)]);\n return {\n realPath: resolved,\n directory: stat.isDirectory(),\n symbolicLink: stat.isSymbolicLink(),\n };\n },\n readText: (path) => readFile(path, \"utf8\"),\n writeText: (path, content) => writeFile(path, content, { mode: 0o600 }),\n writeExclusive: (path, content) =>\n writeFile(path, content, { encoding: \"utf8\", mode: 0o600, flag: \"wx\" }),\n remove: (path) => rm(path, { force: true }),\n makeDirectory: async (path) => {\n await mkdir(path, { recursive: true, mode: 0o700 });\n },\n removeTree: (path) => rm(path, { recursive: true, force: true }),\n commandExists: async (command) => {\n try {\n await execFileAsync(\"which\", [command]);\n return true;\n } catch {\n return false;\n }\n },\n resolveEnvironment: (repoDir) =>\n Effect.runPromise(\n resolveEnv(repoDir).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n run: async (command, args, options) => {\n const result = await execFileAsync(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n },\n spawn: spawnForegroundChild,\n isProcessRunning: (pid) => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n },\n signalProcess: (pid, signal) => process.kill(pid, signal),\n onShutdown: registerRunnerShutdown,\n pause: (milliseconds) =>\n new Promise((resolve) => setTimeout(resolve, milliseconds)),\n now: () => new Date(),\n purgeRunLogs,\n scheduleRecurring: (task, milliseconds) => {\n const timer = setInterval(() => {\n void task();\n }, milliseconds);\n return () => clearInterval(timer);\n },\n report: (message) => console.log(message),\n};\n\nconst readJson = async <T>(\n path: string,\n adapters: RunnerControlAdapters,\n): Promise<T | undefined> => {\n if (!(await adapters.exists(path))) return undefined;\n try {\n return JSON.parse(await adapters.readText(path)) as T;\n } catch (error) {\n throw new RunnerControlError(\n `Could not read repository runner state at ${path}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n};\n\nconst writeJson = (\n path: string,\n value: object,\n adapters: RunnerControlAdapters,\n): Promise<void> =>\n adapters.writeText(path, `${JSON.stringify(value, null, 2)}\\n`);\n\nconst controlFailure = (purpose: string, error: unknown): RunnerControlError =>\n error instanceof RunnerControlError\n ? error\n : new RunnerControlError(\n `${purpose} failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n\nconst runCommand = async (\n adapters: RunnerControlAdapters,\n purpose: string,\n command: string,\n args: readonly string[],\n options: CommandOptions,\n): Promise<CommandResult> => {\n try {\n return await adapters.run(command, args, options);\n } catch (error) {\n throw controlFailure(purpose, error);\n }\n};\n\nconst requireCommand = async (\n adapters: RunnerControlAdapters,\n command: string,\n purpose: string,\n): Promise<void> => {\n if (!(await adapters.commandExists(command))) {\n throw new RunnerControlError(\n `Missing required command \\`${command}\\` (${purpose}). Install it and retry.`,\n );\n }\n};\n\ninterface RunnerControlContext {\n readonly runnerDir: string;\n readonly repository: string;\n readonly metadata: RunnerInstallMetadata;\n readonly hostEnvironment: NodeJS.ProcessEnv;\n readonly runtimeEnvironment: NodeJS.ProcessEnv;\n}\n\nconst requireRunnerContext = async (\n repoDir: string,\n adapters: RunnerControlAdapters,\n): Promise<RunnerControlContext> => {\n if (adapters.platform() !== \"darwin\" || adapters.arch() !== \"arm64\") {\n throw new RunnerControlError(\n \"Repository runners currently require Apple Silicon macOS (darwin/arm64).\",\n );\n }\n\n const configDir = join(repoDir, CONFIG_DIR);\n const runnerDir = join(configDir, RUNNER_DIR);\n if (!(await adapters.exists(configDir))) {\n throw new RunnerControlError(\n `No ${CONFIG_DIR}/ found. Run \\`shipyard init\\` in this repository first.`,\n );\n }\n if (!(await adapters.exists(runnerDir))) {\n throw new RunnerControlError(\n `No repository runner is installed at ${runnerDir}. Run \\`shipyard runner install\\` first.`,\n );\n }\n if (adapters.inspectDirectory) {\n const runnerIdentity = await adapters\n .inspectDirectory(runnerDir)\n .catch((error) => {\n throw controlFailure(\n \"Inspecting the protected runner directory\",\n error,\n );\n });\n if (!runnerIdentity.directory || runnerIdentity.symbolicLink) {\n throw new RunnerControlError(\n `The protected repository runner path must be a real directory: ${runnerDir}`,\n );\n }\n }\n\n const metadata = await readJson<RunnerInstallMetadata>(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n adapters,\n );\n if (\n metadata?.schemaVersion !== 1 ||\n typeof metadata.repository !== \"string\" ||\n typeof metadata.name !== \"string\" ||\n metadata.label !== ACTIVATION_LABEL\n ) {\n throw new RunnerControlError(\n \"The repository runner installation metadata is missing or invalid. Reinstall the repository runner.\",\n );\n }\n if (!(await adapters.exists(join(runnerDir, \"run.sh\")))) {\n throw new RunnerControlError(\n \"The official repository runner executable is missing. Reinstall the repository runner.\",\n );\n }\n\n for (const [command, purpose] of [\n [\"git\", \"reading the repository remote\"],\n [\"npx\", \"running the local Shipyard package\"],\n [\"docker\", \"checking the Docker runtime\"],\n [\"gh\", \"checking GitHub access\"],\n ] as const) {\n await requireCommand(adapters, command, purpose);\n }\n\n const hostEnvironment = adapters.environment();\n const resolvedEnvironment = await adapters\n .resolveEnvironment(repoDir)\n .catch((error) => {\n throw controlFailure(\"Resolving repository credentials\", error);\n });\n const runtimeEnvironment = {\n ...hostEnvironment,\n ...resolvedEnvironment,\n [REPOSITORY_RUNNER_OWNER_ENV]: metadata.repository,\n };\n const remote = await runCommand(\n adapters,\n \"Reading the origin remote\",\n \"git\",\n [\"remote\", \"get-url\", \"origin\"],\n { cwd: repoDir, env: runtimeEnvironment },\n );\n let identity: { owner: string; repository: string };\n try {\n identity = parseGitHubRepository(remote.stdout);\n } catch (error) {\n throw new RunnerControlError(\n error instanceof Error ? error.message : String(error),\n );\n }\n const repository = `${identity.owner}/${identity.repository}`;\n if (repository !== metadata.repository) {\n throw new RunnerControlError(\n `The installed repository runner belongs to ${metadata.repository}, but this repository origin is ${repository}. Reinstall it for this repository.`,\n );\n }\n\n await runCommand(\n adapters,\n \"Checking the local Shipyard package\",\n \"npx\",\n [\"--no-install\", \"shipyard\", \"--version\"],\n { cwd: repoDir, env: runtimeEnvironment },\n );\n await runCommand(\n adapters,\n \"Checking Docker availability\",\n \"docker\",\n [\"info\"],\n { cwd: repoDir, env: runtimeEnvironment },\n );\n await runCommand(\n adapters,\n \"Checking GitHub authentication\",\n \"gh\",\n [\"auth\", \"status\", \"--hostname\", \"github.com\"],\n { cwd: repoDir, env: hostEnvironment },\n );\n\n const label = await runCommand(\n adapters,\n \"Checking the activation label\",\n \"gh\",\n [\n \"label\",\n \"list\",\n \"--repo\",\n repository,\n \"--json\",\n \"name\",\n \"--jq\",\n `.[] | select(.name == \"${ACTIVATION_LABEL}\") | .name`,\n ],\n { cwd: repoDir, env: hostEnvironment },\n );\n if (label.stdout.trim() !== ACTIVATION_LABEL) {\n await runCommand(\n adapters,\n \"Creating the activation label\",\n \"gh\",\n [\n \"label\",\n \"create\",\n ACTIVATION_LABEL,\n \"--repo\",\n repository,\n \"--color\",\n \"1D76DB\",\n \"--description\",\n \"Tasks available to the Shipyard repository runner\",\n \"--force\",\n ],\n { cwd: repoDir, env: hostEnvironment },\n );\n }\n\n await requirePublishedRepositoryRunnerWorkflow(\n {\n repoDir,\n repository,\n // The published workflow is an administrative runner preflight. Keep\n // it on the host's gh login instead of the runtime token from\n // .shipyard/.env, which has no runner administration permission.\n environment: hostEnvironment,\n },\n adapters,\n ).catch((error) => {\n throw new RunnerControlError(\n error instanceof Error ? error.message : String(error),\n );\n });\n\n return {\n runnerDir,\n repository,\n metadata,\n hostEnvironment,\n runtimeEnvironment,\n };\n};\n\nconst childFailure = (\n command: string,\n result: { code: number | null; signal: NodeJS.Signals | null },\n): RunnerControlError =>\n new RunnerControlError(\n result.signal === null\n ? `${command} exited with code ${result.code ?? \"unknown\"}.`\n : `${command} was terminated by ${result.signal}.`,\n );\n\nconst stopChildBounded = async (\n child: RepositoryRunnerChild,\n pause: (milliseconds: number) => Promise<void>,\n): Promise<void> => {\n child.terminate(\"SIGTERM\");\n const stopped = await Promise.race([\n child.wait().then(() => true),\n pause(5_000).then(() => false),\n ]);\n if (stopped) return;\n child.terminate(\"SIGKILL\");\n const killed = await Promise.race([\n child.wait().then(() => true),\n pause(1_000).then(() => false),\n ]);\n if (!killed) {\n throw new RunnerControlError(\n `Process ${child.pid} did not exit after SIGKILL.`,\n );\n }\n};\n\nconst bestEffort = async (operation: () => Promise<unknown>): Promise<void> => {\n try {\n await operation();\n } catch {\n // Cleanup and diagnostic persistence must not hide the triggering failure.\n }\n};\n\nconst startRepositoryRunnerManaged = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<RepositoryRunnerStartResult> => {\n const context = await requireRunnerContext(options.repoDir, adapters);\n const lifecycleAdapters: RunnerLifecycleAdapters = {\n environment: adapters.environment,\n exists: adapters.exists,\n readText: adapters.readText,\n makeDirectory: adapters.makeDirectory,\n inspectDirectory: adapters.inspectDirectory,\n remove: adapters.removeTree,\n run: adapters.run,\n isProcessRunning: adapters.isProcessRunning,\n signalProcess: adapters.signalProcess,\n pause: adapters.pause,\n processIdentity: adapters.processIdentity,\n };\n await recoverRepositoryRunner(\n {\n repoDir: options.repoDir,\n runnerDir: context.runnerDir,\n metadata: context.metadata,\n runnerEnvironment: repositoryRunnerEnvironment(context.hostEnvironment),\n dockerEnvironment: context.runtimeEnvironment,\n },\n lifecycleAdapters,\n ).catch((error) => {\n throw new RunnerControlError(\n error instanceof RunnerLifecycleError\n ? error.message\n : `Repository runner recovery failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n });\n const lockPath = join(context.runnerDir, RUNNER_CONTROLLER_LOCK);\n const statePath = join(context.runnerDir, CONTROLLER_STATE);\n const failurePath = join(context.runnerDir, LAST_FAILURE);\n const existingLock = await readJson<RunnerControllerLock>(lockPath, adapters);\n if (await lockOwnsProcess(existingLock, adapters)) {\n throw new RunnerControlError(\n `The repository runner is already running with process ${existingLock!.pid}.`,\n );\n }\n if (existingLock) {\n throw new RunnerControlError(\n \"The repository runner has stale process state. Run it again after recovery or remove the stale installation.\",\n );\n }\n\n const controllerPid = adapters.currentPid();\n const processStartedAt = await adapters.processIdentity(controllerPid);\n if (!processStartedAt) {\n throw new RunnerControlError(\n \"Could not establish the repository runner controller process identity.\",\n );\n }\n const lock: RunnerControllerLock = {\n schemaVersion: 1,\n pid: controllerPid,\n repository: context.repository,\n processStartedAt,\n };\n try {\n await adapters.writeExclusive(lockPath, `${JSON.stringify(lock)}\\n`);\n } catch (error) {\n throw controlFailure(\"Claiming the repository runner process\", error);\n }\n\n let listenerChild: RepositoryRunnerChild | undefined;\n let shipyardChild: RepositoryRunnerChild | undefined;\n let cancelLogPurge: (() => void) | undefined;\n let stopping = false;\n let lastWake: RunnerWakeRecord | undefined;\n let shutdownPromise: Promise<void> | undefined;\n let primaryFailure: RunnerControlError | undefined;\n const saveState = async (\n state: RunnerControllerStateName,\n lastOutcome: string,\n ): Promise<void> => {\n await writeJson(\n statePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n state,\n lastOutcome,\n ...(lastWake ? { lastWake } : {}),\n } satisfies RunnerControllerState,\n adapters,\n );\n adapters.report(`[repository runner] ${state}: ${lastOutcome}`);\n };\n const purgeLogs = async (): Promise<void> => {\n if (stopping || shipyardChild !== undefined) return;\n try {\n const result = await adapters.purgeRunLogs({\n repoDir: options.repoDir,\n retentionDays: DEFAULT_LOG_RETENTION_DAYS,\n now: adapters.now(),\n });\n const removed = result.removedCount;\n if (removed > 0) {\n adapters.report(\n `[repository runner] purged ${removed} outdated run-log ${removed === 1 ? \"entry\" : \"entries\"}`,\n );\n }\n } catch (error) {\n adapters.report(\n `[repository runner] log purge skipped: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n };\n const removeTransientWork = () =>\n adapters.removeTree(join(context.runnerDir, RUNNER_WORK_DIR));\n const removeOwnedContainers = () =>\n removeOwnedRepositoryRunnerContainers(\n {\n repoDir: options.repoDir,\n repository: context.repository,\n environment: context.runtimeEnvironment,\n },\n lifecycleAdapters,\n );\n const attemptCleanup = async (\n failures: string[],\n purpose: string,\n operation: () => Promise<unknown>,\n ): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n const message = `${purpose} failed: ${error instanceof Error ? error.message : String(error)}`;\n failures.push(message);\n adapters.report(`[repository runner] cleanup error: ${message}`);\n }\n };\n const persistCleanupFailures = async (\n failures: readonly string[],\n ): Promise<void> => {\n if (failures.length === 0) return;\n const cleanupMessage = `Repository runner cleanup failed: ${failures.join(\"; \")}`;\n const message = primaryFailure\n ? `${primaryFailure.message} ${cleanupMessage}`\n : cleanupMessage;\n await bestEffort(() =>\n writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n ).then(() => {\n if (primaryFailure) retainedFailures.add(primaryFailure);\n }),\n );\n await bestEffort(() => saveState(\"stopped\", cleanupMessage));\n };\n const shutdown = (): Promise<void> => {\n if (shutdownPromise) return shutdownPromise;\n shutdownPromise = (async () => {\n stopping = true;\n const failures: string[] = [];\n const children = [listenerChild, shipyardChild].filter(\n (child): child is RepositoryRunnerChild => child !== undefined,\n );\n listenerChild = undefined;\n shipyardChild = undefined;\n await Promise.all(\n children.map((child) =>\n attemptCleanup(failures, `Stopping process ${child.pid}`, () =>\n stopChildBounded(child, adapters.pause),\n ),\n ),\n );\n await attemptCleanup(\n failures,\n \"Removing repository-runner containers\",\n removeOwnedContainers,\n );\n await attemptCleanup(\n failures,\n \"Removing transient runner work\",\n removeTransientWork,\n );\n await attemptCleanup(failures, \"Removing controller lock\", () =>\n adapters.remove(lockPath),\n );\n if (failures.length === 0) {\n try {\n await saveState(\"stopped\", \"Stopped by signal\");\n } catch (error) {\n const message = `Persisting stopped state failed: ${error instanceof Error ? error.message : String(error)}`;\n failures.push(message);\n adapters.report(`[repository runner] cleanup error: ${message}`);\n }\n }\n await persistCleanupFailures(failures);\n })();\n return shutdownPromise;\n };\n const unregisterShutdown = adapters.onShutdown(shutdown);\n const wakeSubscription = createRepositoryRunnerWakeSubscription(\n adapters.onWake,\n );\n\n let initialWorkFound = false;\n try {\n await purgeLogs();\n cancelLogPurge = adapters.scheduleRecurring(\n purgeLogs,\n LOG_PURGE_CHECK_INTERVAL_MS,\n );\n\n const listEligibleIssueNumbers = async (): Promise<readonly string[]> => {\n const issues = await runCommand(\n adapters,\n \"Checking for eligible GitHub issues\",\n \"gh\",\n [\n \"api\",\n \"--method\",\n \"GET\",\n \"--paginate\",\n `repos/${context.repository}/issues`,\n \"-f\",\n \"state=open\",\n \"-f\",\n `labels=${ACTIVATION_LABEL}`,\n \"-f\",\n \"per_page=100\",\n \"--jq\",\n \".[] | select(.pull_request == null) | .number\",\n ],\n { cwd: options.repoDir, env: context.runtimeEnvironment },\n );\n return [...new Set(issues.stdout.split(/\\s+/).filter(Boolean))].sort(\n (left, right) => Number(left) - Number(right),\n );\n };\n const sameIssueNumbers = (\n left: readonly string[],\n right: readonly string[],\n ): boolean =>\n left.length === right.length &&\n left.every((issue, index) => issue === right[index]);\n const processEligibleWork = async (): Promise<boolean> => {\n let issueNumbers = await listEligibleIssueNumbers();\n const workFound = issueNumbers.length > 0;\n\n while (!stopping && issueNumbers.length > 0) {\n await saveState(\"processing\", \"Shipyard is processing eligible issues\");\n shipyardChild = adapters.spawn(\"npx\", [\"shipyard\", \"run\"], {\n cwd: options.repoDir,\n env: context.runtimeEnvironment,\n });\n const runResult = await shipyardChild.wait();\n shipyardChild = undefined;\n if (stopping) {\n await shutdownPromise;\n return workFound;\n }\n if (runResult.code !== 0) {\n const failure = childFailure(\"npx shipyard run\", runResult);\n await writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n );\n await saveState(\"stopped\", failure.message);\n throw failure;\n }\n\n const nextIssueNumbers = await listEligibleIssueNumbers();\n if (nextIssueNumbers.length === 0) {\n await saveState(\"idle\", \"Shipyard completed; no eligible issues\");\n break;\n }\n if (sameIssueNumbers(issueNumbers, nextIssueNumbers)) {\n await saveState(\n \"stalled\",\n \"Shipyard made no progress; eligible issues are unchanged\",\n );\n break;\n }\n issueNumbers = nextIssueNumbers;\n }\n\n return workFound;\n };\n\n lastWake = {\n source: \"startup\",\n recordedAt: adapters.now().toISOString(),\n };\n initialWorkFound = await processEligibleWork();\n if (stopping) {\n await shutdownPromise;\n return { repository: context.repository, initialWorkFound };\n }\n\n if (!initialWorkFound) {\n await saveState(\"idle\", \"No eligible issues; listening\");\n }\n\n listenerChild = adapters.spawn(\"./run.sh\", [], {\n cwd: context.runnerDir,\n env: repositoryRunnerEnvironment(context.hostEnvironment),\n });\n const listenerExit = listenerChild.wait().then((result) => ({\n type: \"listener\" as const,\n result,\n }));\n\n let listenerResult:\n | { readonly code: number | null; readonly signal: NodeJS.Signals | null }\n | undefined;\n while (!listenerResult && !stopping) {\n const event = await Promise.race([\n listenerExit,\n wakeSubscription.next().then(() => ({ type: \"wake\" as const })),\n ]);\n if (event.type === \"listener\") {\n listenerResult = event.result;\n listenerChild = undefined;\n break;\n }\n if (stopping) break;\n lastWake = {\n source: \"signal\",\n recordedAt: adapters.now().toISOString(),\n };\n const workFound = await processEligibleWork();\n if (!workFound && !stopping) {\n await saveState(\"idle\", \"Wake-up delivered; no eligible issues\");\n }\n }\n\n if (stopping) {\n await shutdownPromise;\n return { repository: context.repository, initialWorkFound };\n }\n if (!listenerResult) {\n throw new RunnerControlError(\n \"The repository runner listener stopped without an exit result.\",\n );\n }\n if (listenerResult.code !== 0) {\n const failure = childFailure(\n \"Repository runner listener\",\n listenerResult,\n );\n await writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n );\n await saveState(\"stopped\", failure.message);\n throw failure;\n }\n await saveState(\"stopped\", \"Repository runner listener exited\");\n return { repository: context.repository, initialWorkFound };\n } catch (error) {\n const failure = controlFailure(\"Repository runner controller\", error);\n primaryFailure = failure;\n await bestEffort(() =>\n writeJson(\n failurePath,\n {\n schemaVersion: 1,\n repository: context.repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n ).then(() => retainedFailures.add(failure)),\n );\n await bestEffort(() => saveState(\"stopped\", failure.message));\n throw failure;\n } finally {\n if (cancelLogPurge !== undefined) {\n cancelLogPurge();\n cancelLogPurge = undefined;\n }\n wakeSubscription.close();\n unregisterShutdown();\n if (shutdownPromise) {\n await shutdownPromise;\n } else {\n const failures: string[] = [];\n if (listenerChild) {\n await attemptCleanup(\n failures,\n `Stopping process ${listenerChild.pid}`,\n () => stopChildBounded(listenerChild!, adapters.pause),\n );\n }\n if (shipyardChild) {\n await attemptCleanup(\n failures,\n `Stopping process ${shipyardChild.pid}`,\n () => stopChildBounded(shipyardChild!, adapters.pause),\n );\n }\n await attemptCleanup(\n failures,\n \"Removing repository-runner containers\",\n removeOwnedContainers,\n );\n await attemptCleanup(\n failures,\n \"Removing transient runner work\",\n removeTransientWork,\n );\n await attemptCleanup(failures, \"Removing controller lock\", () =>\n adapters.remove(lockPath),\n );\n await persistCleanupFailures(failures);\n }\n }\n};\n\nexport const startRepositoryRunner = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<RepositoryRunnerStartResult> => {\n try {\n return await startRepositoryRunnerManaged(options, adapters);\n } catch (error) {\n const failure = controlFailure(\"Repository runner startup\", error);\n if (retainedFailures.has(failure)) throw failure;\n const runnerDir = join(options.repoDir, CONFIG_DIR, RUNNER_DIR);\n if (await adapters.exists(runnerDir)) {\n const metadata = await readJson<RunnerInstallMetadata>(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n adapters,\n ).catch(() => undefined);\n const repository = metadata?.repository ?? \"unknown\";\n for (const [purpose, operation] of [\n [\n \"failure diagnostics\",\n () =>\n writeJson(\n join(runnerDir, LAST_FAILURE),\n {\n schemaVersion: 1,\n repository,\n message: failure.message,\n recordedAt: adapters.now().toISOString(),\n },\n adapters,\n ),\n ],\n [\n \"stopped state\",\n () =>\n writeJson(\n join(runnerDir, CONTROLLER_STATE),\n {\n schemaVersion: 1,\n repository,\n state: \"stopped\",\n lastOutcome: failure.message,\n } satisfies RunnerControllerState,\n adapters,\n ),\n ],\n ] as const) {\n try {\n await operation();\n } catch (persistenceError) {\n adapters.report(\n `[repository runner] Could not persist ${purpose}: ${persistenceError instanceof Error ? persistenceError.message : String(persistenceError)}`,\n );\n }\n }\n }\n throw failure;\n }\n};\n\nexport const getRepositoryRunnerStatus = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<RepositoryRunnerStatus> => {\n const runnerDir = join(options.repoDir, CONFIG_DIR, RUNNER_DIR);\n const metadata = await readJson<RunnerInstallMetadata>(\n join(runnerDir, RUNNER_INSTALL_METADATA),\n adapters,\n );\n if (!metadata) {\n return {\n installed: false,\n running: false,\n github: \"not-installed\",\n state: \"not-installed\",\n lastOutcome: \"Repository runner is not installed\",\n };\n }\n\n const lock = await readJson<RunnerControllerLock>(\n join(runnerDir, RUNNER_CONTROLLER_LOCK),\n adapters,\n );\n const state = await readJson<RunnerControllerState>(\n join(runnerDir, CONTROLLER_STATE),\n adapters,\n );\n const running = await lockOwnsProcess(lock, adapters);\n let github: RepositoryRunnerStatus[\"github\"] = \"unreachable\";\n try {\n const response = await adapters.run(\n \"gh\",\n [\n \"api\",\n `repos/${metadata.repository}/actions/runners`,\n \"--jq\",\n `.runners[] | select(.name == \"${metadata.name}\") | .status`,\n ],\n {\n cwd: options.repoDir,\n // Runner connectivity is an administrative check. Do not let the\n // issue-agent token from .shipyard/.env shadow the host gh login.\n env: adapters.environment(),\n },\n );\n github = response.stdout.trim() === \"online\" ? \"online\" : \"offline\";\n } catch {\n github = \"unreachable\";\n }\n\n return {\n installed: true,\n running,\n ...(lock ? { pid: lock.pid } : {}),\n github,\n repository: metadata.repository,\n state: state?.state ?? (running ? \"idle\" : \"stopped\"),\n lastOutcome: state?.lastOutcome ?? \"No repository runner outcome recorded\",\n ...(state?.lastWake ? { lastWake: state.lastWake } : {}),\n };\n};\n\nexport const stopRepositoryRunner = async (\n options: { readonly repoDir: string },\n adapters: RunnerControlAdapters = defaultAdapters,\n): Promise<{ readonly pid: number }> => {\n const lockPath = join(\n options.repoDir,\n CONFIG_DIR,\n RUNNER_DIR,\n RUNNER_CONTROLLER_LOCK,\n );\n const lock = await readJson<RunnerControllerLock>(lockPath, adapters);\n if (!lock || !Number.isInteger(lock.pid)) {\n throw new RunnerControlError(\"The repository runner is not running.\");\n }\n if (!adapters.isProcessRunning(lock.pid)) {\n throw new RunnerControlError(\n `The recorded repository runner process ${lock.pid} is no longer running.`,\n );\n }\n try {\n adapters.signalProcess(lock.pid, \"SIGTERM\");\n } catch (error) {\n throw controlFailure(\"Stopping the repository runner\", error);\n }\n return { pid: lock.pid };\n};\n","import { Cause, Effect, Exit } from \"effect\";\n\nexport const runEffectPromise = async <A, E>(\n effect: Effect.Effect<A, E>,\n): Promise<A> => {\n const exit = await Effect.runPromiseExit(effect);\n if (Exit.isFailure(exit)) throw Cause.squash(exit.cause);\n return exit.value;\n};\n","import { Command, Options } from \"@effect/cli\";\nimport { Effect } from \"effect\";\nimport * as clack from \"@clack/prompts\";\nimport { Display } from \"./Display.js\";\nimport { InitError } from \"./errors.js\";\nimport { purgeRunLogs } from \"./LogRetention.js\";\nimport { requireCanonicalConfigDir } from \"./runtimeConfig.js\";\nimport {\n installRepositoryRunnerWithReplacement,\n installRepositoryRunner,\n RunnerInstallError,\n} from \"./RepositoryRunner.js\";\nimport {\n getRepositoryRunnerStatus,\n RunnerControlError,\n startRepositoryRunner,\n stopRepositoryRunner,\n} from \"./RepositoryRunnerControl.js\";\nimport {\n removeRepositoryRunner,\n RunnerLifecycleError,\n} from \"./RepositoryRunnerLifecycle.js\";\nimport { runEffectPromise } from \"./runEffectPromise.js\";\n\nconst registrationTokenOption = Options.text(\"registration-token\").pipe(\n Options.withDescription(\n \"one-time runner registration token (not stored; administrative gh access is still required for uniqueness checks)\",\n ),\n Options.optional,\n);\n\nconst installRunnerCommand = Command.make(\n \"install\",\n { registrationToken: registrationTokenOption },\n ({ registrationToken }) =>\n Effect.gen(function* () {\n const display = yield* Display;\n const repoDir = process.cwd();\n const result = yield* Effect.tryPromise({\n try: () =>\n installRepositoryRunnerWithReplacement({\n repoDir,\n interactive: process.stdin.isTTY === true,\n confirmReplacement: async (conflict) => {\n const confirmed = await clack.confirm({\n message: conflict.confirmationMessage,\n initialValue: false,\n });\n return !clack.isCancel(confirmed) && confirmed === true;\n },\n install: () =>\n runEffectPromise(\n display.progress(\"Installing repository runner\", (report) =>\n Effect.tryPromise({\n try: () =>\n installRepositoryRunner({\n repoDir,\n registrationToken:\n registrationToken._tag === \"Some\"\n ? registrationToken.value\n : undefined,\n onProgress: report,\n }),\n catch: (error) =>\n error instanceof RunnerInstallError\n ? error\n : new InitError({\n message: `Repository runner installation failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n }),\n ),\n ),\n }),\n catch: (error) =>\n new InitError({\n message:\n error instanceof RunnerInstallError\n ? error.message\n : `Repository runner installation failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* display.status(\n `Installed ${result.name} for ${result.repository}.`,\n \"success\",\n );\n }),\n);\n\nconst runnerControlEffect = <A>(operation: () => Promise<A>) =>\n Effect.tryPromise({\n try: operation,\n catch: (error) =>\n new InitError({\n message:\n error instanceof RunnerControlError ||\n error instanceof RunnerLifecycleError\n ? error.message\n : `Repository runner operation failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n\nconst startRunnerCommand = Command.make(\"start\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const cwd = process.cwd();\n yield* display.status(\n \"Starting the repository runner in this terminal...\",\n \"info\",\n );\n const result = yield* runnerControlEffect(() =>\n startRepositoryRunner({ repoDir: cwd }),\n );\n yield* display.status(\n result.initialWorkFound\n ? `Repository runner for ${result.repository} stopped after processing startup work.`\n : `Repository runner for ${result.repository} stopped.`,\n \"info\",\n );\n }),\n);\n\nconst statusRunnerCommand = Command.make(\"status\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const status = yield* runnerControlEffect(() =>\n getRepositoryRunnerStatus({ repoDir: process.cwd() }),\n );\n yield* display.summary(\"Repository runner\", {\n Installed: status.installed ? \"yes\" : \"no\",\n \"Local process\": status.running\n ? `running (PID ${status.pid ?? \"unknown\"})`\n : \"stopped\",\n GitHub: status.github,\n Repository: status.repository ?? \"unknown\",\n State: status.state,\n \"Last outcome\": status.lastOutcome,\n \"Last wake\": status.lastWake\n ? `${status.lastWake.source} at ${status.lastWake.recordedAt}`\n : \"none recorded\",\n });\n }),\n);\n\nconst stopRunnerCommand = Command.make(\"stop\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const result = yield* runnerControlEffect(() =>\n stopRepositoryRunner({ repoDir: process.cwd() }),\n );\n yield* display.status(\n `Stopping repository runner process ${result.pid}...`,\n \"success\",\n );\n }),\n);\n\nconst forceRemoveRunnerOption = Options.boolean(\"force\").pipe(\n Options.withDescription(\n \"delete local runner files if GitHub unregistration fails\",\n ),\n);\n\nconst removeRunnerCommand = Command.make(\n \"remove\",\n { force: forceRemoveRunnerOption },\n ({ force }) =>\n Effect.gen(function* () {\n const display = yield* Display;\n const result = yield* runnerControlEffect(() =>\n removeRepositoryRunner({ repoDir: process.cwd(), force }),\n );\n yield* display.status(\"Repository runner removed.\", \"success\");\n if (result.manualCleanup) {\n yield* display.status(result.manualCleanup, \"warn\");\n }\n }),\n);\n\nconst purgeRunnerCommand = Command.make(\"purge\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n const repoDir = process.cwd();\n yield* requireCanonicalConfigDir(repoDir);\n\n const result = yield* Effect.tryPromise({\n try: () => purgeRunLogs({ repoDir }),\n catch: (error) =>\n new InitError({\n message: `Run-log purge failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n const removed = result.removedCount;\n yield* display.status(\n removed === 0\n ? \"No run logs found.\"\n : `Purged ${removed} run-log ${removed === 1 ? \"entry\" : \"entries\"}.`,\n \"success\",\n );\n }),\n);\n\nexport const runnerCommand = Command.make(\"runner\", {}, () =>\n Effect.gen(function* () {\n const display = yield* Display;\n yield* display.status(\n \"Repository runner and run-log commands. Use --help to see available subcommands.\",\n \"info\",\n );\n }),\n).pipe(\n Command.withSubcommands([\n installRunnerCommand,\n startRunnerCommand,\n statusRunnerCommand,\n stopRunnerCommand,\n removeRunnerCommand,\n purgeRunnerCommand,\n ]),\n);\n","import { createRequire } from \"node:module\";\n\ndeclare const __SHIPYARD_VERSION__: string | undefined;\n\nconst fallbackVersion = (): string => {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version: string };\n return pkg.version;\n};\n\n/**\n * The package version. Injected at build time by tsup via `define`. When\n * the source is loaded directly (e.g. via `tsx` during tests) the constant\n * is undefined, so we fall back to reading `package.json` at runtime.\n */\nexport const VERSION: string =\n typeof __SHIPYARD_VERSION__ !== \"undefined\"\n ? __SHIPYARD_VERSION__\n : fallbackVersion();\n","import { lstat, readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\nimport {\n REPOSITORY_RUNNER_WORKFLOW,\n REPOSITORY_RUNNER_WORKFLOW_PATH,\n} from \"./RepositoryRunnerWake.js\";\n\nexport const SHIPYARD_PACKAGE_NAME = \"@snappedly-tools/shipyard\";\n\nexport interface ShipyardRepositoryUninstallResult {\n readonly workflowRemoved: boolean;\n readonly workflowPreserved: boolean;\n readonly configDirectoryRemoved: boolean;\n}\n\nconst isMissingPath = (error: unknown): boolean =>\n error !== null &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\";\n\nconst lstatIfPresent = async (path: string) => {\n try {\n return await lstat(path);\n } catch (error) {\n if (isMissingPath(error)) return undefined;\n throw error;\n }\n};\n\n/** Check the config directory before runner cleanup can read from it. */\nexport const inspectShipyardConfigDirectory = async (\n repoDir: string,\n): Promise<boolean> => {\n const configDir = join(repoDir, CONFIG_DIR);\n const info = await lstatIfPresent(configDir);\n if (!info) return false;\n\n if (!info.isDirectory() || info.isSymbolicLink()) {\n throw new Error(\n `Refusing to uninstall because ${configDir} is not a real directory.`,\n );\n }\n return true;\n};\n\nconst removeWakeWorkflow = async (\n repoDir: string,\n): Promise<{ readonly removed: boolean; readonly preserved: boolean }> => {\n const githubDir = join(repoDir, \".github\");\n const workflowsDir = join(githubDir, \"workflows\");\n const workflowPath = join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH);\n\n const githubInfo = await lstatIfPresent(githubDir);\n if (!githubInfo) return { removed: false, preserved: false };\n if (!githubInfo.isDirectory() || githubInfo.isSymbolicLink()) {\n return { removed: false, preserved: githubInfo.isSymbolicLink() };\n }\n\n const workflowsInfo = await lstatIfPresent(workflowsDir);\n if (!workflowsInfo) return { removed: false, preserved: false };\n if (!workflowsInfo.isDirectory() || workflowsInfo.isSymbolicLink()) {\n return {\n removed: false,\n preserved: workflowsInfo.isSymbolicLink(),\n };\n }\n\n const workflowInfo = await lstatIfPresent(workflowPath);\n if (!workflowInfo) return { removed: false, preserved: false };\n if (!workflowInfo.isFile() || workflowInfo.isSymbolicLink()) {\n return { removed: false, preserved: true };\n }\n\n const workflow = await readFile(workflowPath, \"utf8\");\n if (workflow !== REPOSITORY_RUNNER_WORKFLOW) {\n return { removed: false, preserved: true };\n }\n\n await rm(workflowPath);\n return { removed: true, preserved: false };\n};\n\n/**\n * Remove the target repository's entire Shipyard config directory and generated\n * wake workflow. The repository runner must be unregistered before this runs.\n */\nexport const removeShipyardRepositoryFiles = async (options: {\n readonly repoDir: string;\n}): Promise<ShipyardRepositoryUninstallResult> => {\n const configDirExists = await inspectShipyardConfigDirectory(options.repoDir);\n if (configDirExists) {\n const configDir = join(options.repoDir, CONFIG_DIR);\n const runnerDir = join(configDir, RUNNER_DIR);\n if (await lstatIfPresent(runnerDir)) {\n throw new Error(\n `Remove the repository runner at ${runnerDir} before removing Shipyard configuration.`,\n );\n }\n }\n\n const workflow = await removeWakeWorkflow(options.repoDir);\n if (configDirExists) {\n await rm(join(options.repoDir, CONFIG_DIR), { recursive: true });\n }\n\n return {\n workflowRemoved: workflow.removed,\n workflowPreserved: workflow.preserved,\n configDirectoryRemoved: configDirExists,\n };\n};\n","import { Command, Options } from \"@effect/cli\";\nimport { Effect, Option } from \"effect\";\nimport * as clack from \"@clack/prompts\";\nimport { execFile, execSync, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { promisify, styleText } from \"node:util\";\n\nimport { Display, type DisplayService } from \"./Display.js\";\nimport { buildImage, removeImage } from \"./DockerLifecycle.js\";\nimport {\n scaffold,\n listTemplates,\n listAgents,\n getAgent,\n getIssueTracker,\n listSandboxProviders,\n getSandboxProvider,\n DEFAULT_AGENT_NAME,\n getNextStepsLines,\n detectPackageManager,\n addDependencyCommand,\n removeDependencyCommand,\n hostHasDependency,\n getTemplateDependencies,\n} from \"./InitService.js\";\nimport { defaultImageName } from \"./sandboxes/docker.js\";\nimport type { AgentEntry, SandboxProviderEntry } from \"./InitService.js\";\nimport { ExecHostError, InitError } from \"./errors.js\";\nimport {\n ensureCodexChatGptAuth,\n resolveCodexAuthMode,\n type CodexAuthMode,\n} from \"./CodexAuth.js\";\nimport { requireCanonicalConfigDir } from \"./runtimeConfig.js\";\nimport {\n installRepositoryRunnerWithReplacement,\n installRepositoryRunner,\n} from \"./RepositoryRunner.js\";\nimport {\n removeRepositoryRunner,\n RunnerLifecycleError,\n} from \"./RepositoryRunnerLifecycle.js\";\nimport { DEFAULT_LOG_RETENTION_DAYS, purgeRunLogs } from \"./LogRetention.js\";\nimport { commitAndPushInitSetup } from \"./InitGitSetup.js\";\nimport { runnerCommand } from \"./RepositoryRunnerCommands.js\";\nimport {\n ACTIVATION_LABEL,\n CONFIG_DIR,\n CLI_NAME,\n PRODUCT_NAME,\n RUNNER_DIR,\n} from \"./runtimeNames.js\";\nimport { VERSION } from \"./version.js\";\nimport {\n inspectShipyardConfigDirectory,\n removeShipyardRepositoryFiles,\n SHIPYARD_PACKAGE_NAME,\n} from \"./UninstallService.js\";\nimport { REPOSITORY_RUNNER_WORKFLOW_PATH } from \"./RepositoryRunnerWake.js\";\n\nconst execFileAsync = promisify(execFile);\n\n// --- Shared options ---\n\nconst imageNameOption = Options.text(\"image-name\").pipe(\n Options.withDescription(\"Docker image name\"),\n Options.optional,\n);\n\nconst resolveImageName = (\n cliFlag: Option.Option<string>,\n cwd: string,\n): string => (cliFlag._tag === \"Some\" ? cliFlag.value : defaultImageName(cwd));\n\n// --- UID build-args ---\n\n/** Build-args that align the image UID/GID to the host (Linux/macOS). No-op on Windows. */\nconst defaultUidBuildArgs = (): Record<string, string> => {\n const args: Record<string, string> = {};\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined) args.AGENT_UID = String(uid);\n if (gid !== undefined) args.AGENT_GID = String(gid);\n return args;\n};\n\n/**\n * Apply the default log-retention policy without making an agent run depend on\n * maintenance. Explicit `runner purge` remains available when an operator\n * wants to run it directly or use a host scheduler.\n */\nconst purgeRunLogsBestEffort = (\n display: DisplayService,\n repoDir: string,\n): Effect.Effect<void> =>\n Effect.tryPromise({\n try: () =>\n purgeRunLogs({\n repoDir,\n retentionDays: DEFAULT_LOG_RETENTION_DAYS,\n }),\n catch: (error) => error,\n }).pipe(\n Effect.flatMap((result) => {\n const removed = result.removedCount;\n return removed === 0\n ? Effect.void\n : display.status(\n `Purged ${removed} outdated run-log ${removed === 1 ? \"entry\" : \"entries\"}.`,\n \"info\",\n );\n }),\n Effect.catchAll((error) =>\n display.status(\n `Automatic run-log purge skipped: ${error instanceof Error ? error.message : String(error)}`,\n \"warn\",\n ),\n ),\n );\n\n// --- Run command ---\n\nconst runSandboxOption = Options.choice(\"sandbox\", [\"docker\"] as const).pipe(\n Options.withDescription(\n \"Sandbox provider to build (inferred from Dockerfile)\",\n ),\n Options.optional,\n);\n\nconst skipBuildOption = Options.boolean(\"skip-build\").pipe(\n Options.withDescription(\"Skip rebuilding the sandbox image\"),\n);\n\nconst entrypointOption = Options.text(\"entrypoint\").pipe(\n Options.withDescription(\n \"TypeScript entrypoint (defaults to .shipyard/main.ts or main.mts)\",\n ),\n Options.optional,\n);\n\ntype RunSandbox = \"docker\";\n\nconst resolveRunEntrypoint = (\n cwd: string,\n configDir: string,\n entrypoint: Option.Option<string>,\n): string | InitError => {\n if (entrypoint._tag === \"Some\") {\n const path = resolve(cwd, entrypoint.value);\n return existsSync(path)\n ? path\n : new InitError({ message: `Entrypoint not found: ${entrypoint.value}` });\n }\n\n for (const filename of [\"main.ts\", \"main.mts\"]) {\n const path = join(configDir, filename);\n if (existsSync(path)) return path;\n }\n\n return new InitError({\n message:\n \"No Shipyard entrypoint found. Expected .shipyard/main.ts or .shipyard/main.mts; run `shipyard init` first or pass `--entrypoint <path>.\",\n });\n};\n\nconst resolveRunSandbox = (\n configDir: string,\n sandbox: Option.Option<RunSandbox>,\n): RunSandbox | InitError => {\n if (sandbox._tag === \"Some\") {\n const filename = \"Dockerfile\";\n if (!existsSync(join(configDir, filename))) {\n return new InitError({\n message: `No .shipyard/${filename} found for the selected ${sandbox.value} sandbox provider.`,\n });\n }\n return sandbox.value;\n }\n\n const hasDockerfile = existsSync(join(configDir, \"Dockerfile\"));\n if (hasDockerfile) return \"docker\";\n return new InitError({\n message:\n \"No .shipyard/Dockerfile found. Run `shipyard init` first, or pass `--skip-build` for a programmatically configured sandbox.\",\n });\n};\n\nconst executeEntrypoint = (\n cwd: string,\n entrypoint: string,\n): Effect.Effect<void, ExecHostError> =>\n Effect.async((resume, signal) => {\n const command = process.platform === \"win32\" ? \"npx.cmd\" : \"npx\";\n const args = [\"--no-install\", \"tsx\", entrypoint];\n const child = spawn(command, args, {\n cwd,\n env: process.env,\n stdio: \"inherit\",\n });\n const commandText = `${command} ${args.join(\" \")}`;\n let settled = false;\n\n const finish = (effect: Effect.Effect<void, ExecHostError>) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n resume(effect);\n };\n const onAbort = () => child.kill(\"SIGTERM\");\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.once(\"error\", (error) => {\n finish(\n Effect.fail(\n new ExecHostError({\n command: commandText,\n message: error.message,\n }),\n ),\n );\n });\n child.once(\"close\", (code, closeSignal) => {\n if (code === 0) {\n finish(Effect.succeed(undefined));\n return;\n }\n finish(\n Effect.fail(\n new ExecHostError({\n command: commandText,\n message:\n closeSignal === null\n ? `Process exited with code ${code ?? \"unknown\"}.`\n : `Process terminated by ${closeSignal}.`,\n }),\n ),\n );\n });\n });\n\nconst runCommand = Command.make(\n \"run\",\n {\n imageName: imageNameOption,\n sandbox: runSandboxOption,\n skipBuild: skipBuildOption,\n entrypoint: entrypointOption,\n },\n ({ imageName: imageNameFlag, sandbox, skipBuild, entrypoint }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n const configDir = yield* requireCanonicalConfigDir(cwd);\n yield* purgeRunLogsBestEffort(d, cwd);\n const resolvedEntrypoint = resolveRunEntrypoint(\n cwd,\n configDir,\n entrypoint,\n );\n if (resolvedEntrypoint instanceof InitError) {\n return yield* Effect.fail(resolvedEntrypoint);\n }\n\n if (!skipBuild) {\n const selectedSandbox = resolveRunSandbox(configDir, sandbox);\n if (selectedSandbox instanceof InitError) {\n return yield* Effect.fail(selectedSandbox);\n }\n const imageName = resolveImageName(imageNameFlag, cwd);\n yield* d.spinner(\n `Building Docker image '${imageName}'...`,\n buildImage(imageName, configDir, {\n buildArgs: defaultUidBuildArgs(),\n }),\n );\n }\n\n yield* d.status(\n `Running ${entrypoint._tag === \"Some\" ? entrypoint.value : \".shipyard/\" + resolvedEntrypoint.split(/[\\\\/]/).pop()}.`,\n \"info\",\n );\n yield* executeEntrypoint(cwd, resolvedEntrypoint);\n }),\n);\n\n// --- Init command ---\n\nconst templateOption = Options.text(\"template\").pipe(\n Options.withDescription(\n \"Template to scaffold (e.g. simple-loop, parallel-planner)\",\n ),\n Options.optional,\n);\n\nconst agentOption = Options.text(\"agent\").pipe(\n Options.withDescription(\"Agent to use (e.g. codex)\"),\n Options.optional,\n);\n\nconst codexAuthOption = Options.choice(\"codex-auth\", [\n \"api-key\",\n \"chatgpt\",\n]).pipe(\n Options.withDescription(\n \"How Codex should authenticate: API key or ChatGPT subscription\",\n ),\n Options.optional,\n);\n\nconst initModelOption = Options.text(\"model\").pipe(\n Options.withDescription(\n \"Model to use for the agent. Defaults to the agent's configured default model\",\n ),\n Options.optional,\n);\n\nconst sandboxOption = Options.text(\"sandbox\").pipe(\n Options.withDescription(\"Sandbox provider to use (docker)\"),\n Options.optional,\n);\n\n// Tri-state booleans (Some(true) / Some(false) / None) so we can tell \"user\n// chose false\" from \"user didn't pass the flag at all\" — only the latter\n// triggers the interactive prompt.\nconst installTemplateDepsOption = Options.choice(\"install-template-deps\", [\n \"true\",\n \"false\",\n]).pipe(\n Options.withDescription(\n \"Whether to install the template's host dependencies (e.g. zod for the planner templates)\",\n ),\n Options.optional,\n);\n\nconst commitSetupOption = Options.choice(\"commit-setup\", [\"true\", \"false\"])\n .pipe(\n Options.withDescription(\n \"Whether to commit and push .shipyard/ and any generated runner workflow\",\n ),\n )\n .pipe(Options.optional);\n\nconst uninstallYesOption = Options.boolean(\"yes\").pipe(\n Options.withDescription(\"confirm uninstall without an interactive prompt\"),\n);\n\nconst uninstallForceOption = Options.boolean(\"force\").pipe(\n Options.withDescription(\n \"remove local runner files if GitHub unregistration fails\",\n ),\n);\n\n/**\n * Translate an `Options.choice(\"flag\", [\"true\", \"false\"]).optional` value into\n * a tri-state boolean. None when the flag was absent; otherwise the parsed bool.\n */\nconst choiceToTriBool = (\n opt: Option.Option<\"true\" | \"false\">,\n): Option.Option<boolean> =>\n opt._tag === \"Some\" ? Option.some(opt.value === \"true\") : Option.none();\n\nconst initCommand = Command.make(\n \"init\",\n {\n imageName: imageNameOption,\n template: templateOption,\n agent: agentOption,\n codexAuth: codexAuthOption,\n model: initModelOption,\n sandbox: sandboxOption,\n installTemplateDeps: installTemplateDepsOption,\n commitSetup: commitSetupOption,\n },\n ({\n imageName: imageNameFlag,\n template,\n agent: agentFlag,\n codexAuth: codexAuthFlag,\n model: modelFlag,\n sandbox: sandboxFlag,\n installTemplateDeps: installTemplateDepsFlag,\n commitSetup: commitSetupFlag,\n }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n const imageName = resolveImageName(imageNameFlag, cwd);\n\n // Early validation of CLI flags before interactive prompts\n const templates = listTemplates();\n if (template._tag === \"Some\") {\n const valid = templates.find((tmpl) => tmpl.name === template.value);\n if (!valid) {\n const names = templates.map((tmpl) => tmpl.name).join(\", \");\n yield* Effect.fail(\n new InitError({\n message: `Unknown template \"${template.value}\". Available: ${names}`,\n }),\n );\n }\n }\n\n if (sandboxFlag._tag === \"Some\") {\n const valid = getSandboxProvider(sandboxFlag.value);\n if (!valid) {\n const names = listSandboxProviders()\n .map((p) => p.name)\n .join(\", \");\n yield* Effect.fail(\n new InitError({\n message: `Unknown sandbox provider \"${sandboxFlag.value}\". Available: ${names}`,\n }),\n );\n }\n }\n\n yield* d.progress(\"Initializing Shipyard\", (report) =>\n Effect.gen(function* () {\n const progressAt = (current: number, message: string) =>\n report({ current, total: 100, message });\n const progressRange = (\n start: number,\n end: number,\n update: { current: number; total: number; message: string },\n ) => {\n const total = Math.max(1, update.total);\n const fraction = Math.min(1, Math.max(0, update.current / total));\n progressAt(\n Math.round(start + (end - start) * fraction),\n update.message,\n );\n };\n const whilePrompt = async <A>(\n prompt: () => Promise<A>,\n ): Promise<A> => {\n report.pause();\n try {\n return await prompt();\n } finally {\n report.resume();\n }\n };\n const statusWithProgress = (\n message: string,\n severity: Parameters<DisplayService[\"status\"]>[1],\n ) =>\n Effect.acquireUseRelease(\n Effect.sync(() => report.pause()),\n () => d.status(message, severity),\n () => Effect.sync(() => report.resume()),\n );\n\n const installTemplateDepsChoice = choiceToTriBool(\n installTemplateDepsFlag,\n );\n const commitSetupChoice = choiceToTriBool(commitSetupFlag);\n\n const isInteractive = process.stdin.isTTY === true;\n const failIfNonInteractive = (flag: string) =>\n Effect.fail(\n new InitError({\n message: `${flag} is required in non-interactive mode (no TTY detected).`,\n }),\n );\n\n // Tri-state confirm: CLI flag wins; otherwise prompt interactively (or\n // fail fast in non-interactive mode naming the missing flag). Cancelling\n // the prompt is treated as abort — same shape as the select prompts above.\n const resolveConfirmFlag = (params: {\n choice: Option.Option<boolean>;\n flag: string;\n promptMessage: string;\n cancelMessage: string;\n }): Effect.Effect<boolean, InitError> =>\n Effect.gen(function* () {\n if (params.choice._tag === \"Some\") return params.choice.value;\n if (!isInteractive) {\n yield* failIfNonInteractive(params.flag);\n }\n const confirmed = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.confirm({\n message: params.promptMessage,\n initialValue: true,\n }),\n ),\n );\n if (clack.isCancel(confirmed)) {\n yield* Effect.fail(\n new InitError({ message: params.cancelMessage }),\n );\n }\n return confirmed === true;\n });\n\n // Resolve agent: CLI flag > interactive select\n const agents = listAgents();\n let selectedAgent: AgentEntry;\n if (agentFlag._tag === \"Some\") {\n const entry = getAgent(agentFlag.value);\n if (!entry) {\n const names = agents.map((a) => a.name).join(\", \");\n yield* Effect.fail(\n new InitError({\n message: `Unknown agent \"${agentFlag.value}\". Available: ${names}`,\n }),\n );\n }\n selectedAgent = entry!;\n } else {\n if (!isInteractive) {\n yield* failIfNonInteractive(\"--agent\");\n }\n const selected = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.select({\n message: \"Select an agent:\",\n initialValue: DEFAULT_AGENT_NAME,\n options: agents.map((a) => ({\n value: a.name,\n label: a.label,\n })),\n }),\n ),\n );\n if (clack.isCancel(selected)) {\n yield* Effect.fail(\n new InitError({ message: \"Agent selection cancelled.\" }),\n );\n }\n selectedAgent = getAgent(selected as string)!;\n }\n progressAt(6, `Selected ${selectedAgent.label}`);\n\n const selectedCodexAuth = yield* Effect.tryPromise({\n try: () =>\n resolveCodexAuthMode({\n agentName: selectedAgent.name,\n requested:\n codexAuthFlag._tag === \"Some\"\n ? codexAuthFlag.value\n : undefined,\n interactive: isInteractive,\n select: async () => {\n const selected = await whilePrompt(() =>\n clack.select({\n message: \"How will you authenticate Codex?\",\n initialValue: \"chatgpt\",\n options: [\n {\n value: \"chatgpt\" as const,\n label: \"Sign in with ChatGPT\",\n hint: \"Use your ChatGPT subscription\",\n },\n {\n value: \"api-key\" as const,\n label: \"OpenAI API key\",\n hint: \"Use API billing\",\n },\n ],\n }),\n );\n return clack.isCancel(selected)\n ? undefined\n : (selected as CodexAuthMode);\n },\n }),\n catch: (error) =>\n error instanceof InitError\n ? error\n : new InitError({\n message: `Codex authentication selection failed: ${String(error)}`,\n }),\n });\n progressAt(12, \"Authentication method selected\");\n\n // Resolve model: CLI flag > agent default\n const selectedModel =\n modelFlag._tag === \"Some\"\n ? modelFlag.value\n : selectedAgent.defaultModel;\n\n if (selectedCodexAuth === \"chatgpt\") {\n yield* Effect.try({\n try: () => {\n report.pause();\n try {\n ensureCodexChatGptAuth({\n cwd,\n interactive: isInteractive,\n });\n } finally {\n report.resume();\n }\n },\n catch: (error) =>\n error instanceof InitError\n ? error\n : new InitError({\n message: `Codex authentication setup failed: ${String(error)}`,\n }),\n });\n }\n progressAt(18, \"Authentication setup complete\");\n\n // Docker is the sole supported provider. Keep --sandbox docker accepted\n // for existing non-interactive init scripts.\n const selectedSandboxProvider: SandboxProviderEntry =\n getSandboxProvider(\"docker\")!;\n\n const selectedIssueTracker = getIssueTracker(\"github-issues\")!;\n\n // Resolve template: CLI flag > interactive select (already validated above)\n let selectedTemplate: string;\n if (template._tag === \"Some\") {\n selectedTemplate = template.value;\n } else {\n if (!isInteractive) {\n yield* failIfNonInteractive(\"--template\");\n }\n const selected = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.select({\n message: \"Select a template:\",\n initialValue: \"simple-loop\",\n options: templates.map((tmpl) => ({\n value: tmpl.name,\n label: tmpl.name,\n hint: tmpl.description,\n })),\n }),\n ),\n );\n if (clack.isCancel(selected)) {\n yield* Effect.fail(\n new InitError({ message: \"Template selection cancelled.\" }),\n );\n }\n selectedTemplate = selected as string;\n }\n progressAt(24, `Selected ${selectedTemplate} template`);\n\n // These labels are part of the GitHub Issues workflow contract.\n const failedLabels: string[] = [];\n const labels = [\n [\n ACTIVATION_LABEL,\n `Issues for ${PRODUCT_NAME} to work on`,\n \"F9A825\",\n ],\n [\"bug\", \"Something is broken\", \"D73A4A\"],\n [\"enhancement\", \"New feature or improvement\", \"A2EEEF\"],\n [\"needs-triage\", \"Maintainer evaluation needed\", \"FBCA04\"],\n [\"needs-info\", \"Waiting for reporter information\", \"D4C5F9\"],\n [\"ready-for-agent\", \"Ready for agent implementation\", \"0E8A16\"],\n [\"ready-for-human\", \"Requires human implementation\", \"1D76DB\"],\n [\"wontfix\", \"Will not be actioned\", \"FFFFFF\"],\n [\"shipyard:blocked\", \"Shipyard work needs intervention\", \"B60205\"],\n [\n \"shipyard:pending\",\n \"Shipyard is working on this ticket\",\n \"1D76DB\",\n ],\n [\n \"shipyard:complete\",\n \"Shipyard work ready for human review\",\n \"0E8A16\",\n ],\n [\n \"shipyard:outstanding-tasks\",\n \"Spec has uncompleted tickets\",\n \"FBCA04\",\n ],\n ] as const;\n for (const [index, [name, description, color]] of labels.entries()) {\n const created = yield* Effect.promise(() =>\n execFileAsync(\n \"gh\",\n [\n \"label\",\n \"create\",\n name,\n \"--description\",\n description,\n \"--color\",\n color,\n \"--force\",\n ],\n { cwd },\n ).then(\n () => true,\n () => false,\n ),\n );\n if (!created) failedLabels.push(name);\n progressAt(\n 24 + Math.round(((index + 1) / labels.length) * 10),\n \"Provisioning GitHub labels\",\n );\n }\n if (failedLabels.length) {\n let connected = Boolean(process.env.GH_REPO);\n try {\n execSync(\"git remote get-url origin\", { cwd, stdio: \"ignore\" });\n connected = true;\n } catch {\n // A local repository can be scaffolded before its GitHub remote exists.\n }\n const message = `Could not create GitHub labels: ${failedLabels.join(\", \")}. Check GitHub access and rerun init.`;\n if (connected) yield* Effect.fail(new InitError({ message }));\n report.pause();\n try {\n console.warn(message);\n } finally {\n report.resume();\n }\n }\n\n progressAt(34, `Scaffolding ${CONFIG_DIR}/ config directory`);\n yield* scaffold(cwd, {\n agent: selectedAgent,\n model: selectedModel,\n modelExplicit: modelFlag._tag === \"Some\",\n templateName: selectedTemplate,\n issueTracker: selectedIssueTracker,\n sandboxProvider: selectedSandboxProvider,\n codexAuth: selectedCodexAuth,\n onProgress: (update) => progressRange(34, 56, update),\n }).pipe(\n Effect.mapError(\n (e) =>\n new InitError({\n message: `${e instanceof Error ? e.message : e}`,\n }),\n ),\n );\n progressAt(56, \"Shipyard configuration generated\");\n\n // Detect the host package manager so the zod offer below and the next\n // steps below both use the right install command.\n const packageManager = yield* detectPackageManager(cwd);\n progressAt(58, `Detected ${packageManager}`);\n\n // If the chosen template imports zod on the host (the planner templates\n // build their <plan> output schema with it) and the host doesn't already\n // declare it, offer to install it. Without this, the very first\n // `npx tsx .shipyard/main.ts` crashes with ERR_MODULE_NOT_FOUND.\n if (getTemplateDependencies(selectedTemplate).includes(\"zod\")) {\n const alreadyInstalled = yield* hostHasDependency(cwd, \"zod\");\n if (!alreadyInstalled) {\n const installCmd = addDependencyCommand(packageManager, \"zod\");\n const shouldInstall = yield* resolveConfirmFlag({\n choice: installTemplateDepsChoice,\n flag: \"--install-template-deps\",\n promptMessage: `The ${selectedTemplate} template needs a schema validator. Install zod now (\\`${installCmd}\\`)?`,\n cancelMessage: \"Install-template-deps selection cancelled.\",\n });\n progressAt(\n 60,\n shouldInstall\n ? \"Installing template dependency\"\n : \"Skipping zod installation\",\n );\n if (shouldInstall) {\n progressAt(62, `Installing zod with ${packageManager}`);\n const installed = yield* Effect.sync(() => {\n try {\n execSync(installCmd, { cwd, stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n });\n progressAt(64, \"Template dependency setup complete\");\n yield* installed\n ? statusWithProgress(\n `Installed zod with ${packageManager}.`,\n \"success\",\n )\n : statusWithProgress(\n `Couldn't install zod automatically. Run \\`${installCmd}\\` before running the agent.`,\n \"warn\",\n );\n }\n }\n }\n progressAt(66, \"Template dependencies ready\");\n\n const providerLabel = selectedSandboxProvider.label;\n const containerfileDir = join(cwd, CONFIG_DIR);\n progressAt(68, `Building ${providerLabel} image '${imageName}'`);\n yield* buildImage(imageName, containerfileDir, {\n buildArgs: defaultUidBuildArgs(),\n });\n progressAt(78, \"Docker image built\");\n yield* statusWithProgress(\"Image built successfully.\", \"success\");\n\n progressAt(78, \"Installing repository runner\");\n const runner = yield* Effect.tryPromise({\n try: () =>\n installRepositoryRunnerWithReplacement({\n repoDir: cwd,\n interactive: isInteractive,\n confirmReplacement: async (conflict) => {\n const confirmed = await whilePrompt(() =>\n clack.confirm({\n message: conflict.confirmationMessage,\n initialValue: false,\n }),\n );\n return !clack.isCancel(confirmed) && confirmed === true;\n },\n install: () =>\n installRepositoryRunner({\n repoDir: cwd,\n onProgress: (update) => progressRange(78, 94, update),\n }),\n }),\n catch: (error) =>\n error instanceof InitError\n ? error\n : new InitError({\n message: `Repository runner installation failed: ${error instanceof Error ? error.message : String(error)}. Init is incomplete. Fix the issue and retry with \\`npx ${CLI_NAME} runner install\\`.`,\n }),\n });\n progressAt(94, \"Repository runner installed\");\n yield* statusWithProgress(\n `Installed ${runner.name} for ${runner.repository}.`,\n \"success\",\n );\n\n let shouldCommitSetup =\n commitSetupChoice._tag === \"Some\" && commitSetupChoice.value;\n if (commitSetupChoice._tag === \"None\" && isInteractive) {\n const confirmed = yield* Effect.promise(() =>\n whilePrompt(() =>\n clack.confirm({\n message:\n \"Commit .shipyard/, any generated runner workflow, and package.json/package-lock.json when present, then push this branch to origin? Sandboxes need the setup committed. The push also sends any local commits not already on origin.\",\n initialValue: true,\n }),\n ),\n );\n if (clack.isCancel(confirmed)) {\n yield* Effect.fail(\n new InitError({\n message: \"Shipyard setup commit cancelled.\",\n }),\n );\n }\n shouldCommitSetup = confirmed === true;\n }\n progressAt(\n 96,\n shouldCommitSetup\n ? \"Committing and pushing Shipyard setup\"\n : \"Setup commit skipped\",\n );\n\n if (shouldCommitSetup) {\n const publishResult = yield* Effect.sync(() => {\n try {\n return {\n status: \"committed\" as const,\n result: commitAndPushInitSetup(cwd),\n };\n } catch (error) {\n return {\n status: \"failed\" as const,\n message:\n error instanceof Error ? error.message : String(error),\n };\n }\n });\n progressAt(99, \"Shipyard setup commit finished\");\n if (publishResult.status === \"failed\") {\n yield* statusWithProgress(\n `Could not commit the Shipyard setup: ${publishResult.message}`,\n \"warn\",\n );\n yield* statusWithProgress(\n `Commit \\`${CONFIG_DIR}/\\` before running Shipyard.`,\n \"warn\",\n );\n } else if (publishResult.result.pushError) {\n yield* statusWithProgress(\n `Committed ${publishResult.result.commit}, but could not push to origin/${publishResult.result.branch}: ${publishResult.result.pushError}`,\n \"warn\",\n );\n yield* statusWithProgress(\n `Push it later with \\`git push origin ${publishResult.result.branch}\\`.`,\n \"warn\",\n );\n } else {\n yield* statusWithProgress(\n `Committed ${publishResult.result.commit} and pushed origin/${publishResult.result.branch}.`,\n \"success\",\n );\n }\n } else {\n yield* statusWithProgress(\n `Commit \\`${CONFIG_DIR}/\\` before running Shipyard. Sandboxes do not receive uncommitted setup files.`,\n \"warn\",\n );\n yield* statusWithProgress(\n \"Push the runner wake workflow to the repository's default branch before starting the runner.\",\n \"warn\",\n );\n }\n\n progressAt(100, \"Initialization complete\");\n }),\n );\n\n yield* d.status(\"Init complete!\", \"success\");\n\n const nextSteps = getNextStepsLines();\n for (const [i, line] of nextSteps.entries()) {\n yield* d.text(i === 0 ? line : styleText(\"dim\", line));\n }\n }),\n);\n\n// --- Uninstall command ---\n\nconst uninstallCommand = Command.make(\n \"uninstall\",\n { yes: uninstallYesOption, force: uninstallForceOption },\n ({ yes, force }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const repoDir = process.cwd();\n const configDirExists = yield* Effect.tryPromise({\n try: () => inspectShipyardConfigDirectory(repoDir),\n catch: (error) =>\n new InitError({\n message: `Could not inspect Shipyard configuration: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n const runnerDir = join(repoDir, CONFIG_DIR, RUNNER_DIR);\n const runnerInstalled = configDirExists && existsSync(runnerDir);\n const workflowExists = existsSync(\n join(repoDir, REPOSITORY_RUNNER_WORKFLOW_PATH),\n );\n const packageInstalled = yield* hostHasDependency(\n repoDir,\n SHIPYARD_PACKAGE_NAME,\n );\n\n if (\n !configDirExists &&\n !workflowExists &&\n !runnerInstalled &&\n !packageInstalled\n ) {\n yield* d.status(\n \"No Shipyard installation found in this repository.\",\n \"info\",\n );\n return;\n }\n\n if (!yes && process.stdin.isTTY !== true) {\n return yield* Effect.fail(\n new InitError({\n message:\n \"Shipyard uninstall needs confirmation. Run it in a terminal or pass --yes.\",\n }),\n );\n }\n\n if (!yes) {\n const actions = [\n runnerInstalled\n ? \"unregister and remove the repository runner\"\n : null,\n configDirExists\n ? `remove all of ${CONFIG_DIR}/, including .env and runtime data`\n : null,\n workflowExists ? \"remove the generated runner wake workflow\" : null,\n packageInstalled\n ? `remove ${SHIPYARD_PACKAGE_NAME} from package.json`\n : null,\n ].filter((action): action is string => action !== null);\n const confirmation = yield* Effect.tryPromise({\n try: () =>\n clack.confirm({\n message: `Uninstall Shipyard from ${repoDir}? This will ${actions.join(\", \")}. It leaves GitHub issues and labels unchanged.`,\n initialValue: false,\n }),\n catch: (error) =>\n new InitError({\n message: `Could not confirm Shipyard uninstall: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n if (clack.isCancel(confirmation) || confirmation !== true) {\n yield* d.status(\"Shipyard uninstall cancelled.\", \"info\");\n return;\n }\n }\n\n if (runnerInstalled) {\n const result = yield* Effect.tryPromise({\n try: () => removeRepositoryRunner({ repoDir, force }),\n catch: (error) =>\n error instanceof RunnerLifecycleError\n ? new InitError({ message: error.message })\n : new InitError({\n message: `Repository runner removal failed: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* d.status(\"Repository runner removed.\", \"success\");\n if (result.manualCleanup) {\n yield* d.status(result.manualCleanup, \"warn\");\n }\n }\n\n const files = yield* Effect.tryPromise({\n try: () => removeShipyardRepositoryFiles({ repoDir }),\n catch: (error) =>\n new InitError({\n message: `Could not remove Shipyard repository files: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n if (files.configDirectoryRemoved) {\n yield* d.status(`Removed all of ${CONFIG_DIR}/.`, \"success\");\n }\n if (files.workflowRemoved) {\n yield* d.status(\n `Removed ${REPOSITORY_RUNNER_WORKFLOW_PATH}.`,\n \"success\",\n );\n yield* d.status(\n \"Commit and push the workflow deletion to disable it on GitHub.\",\n \"info\",\n );\n } else if (files.workflowPreserved) {\n yield* d.status(\n `Preserved ${REPOSITORY_RUNNER_WORKFLOW_PATH} because it is customized or linked.`,\n \"warn\",\n );\n }\n if (packageInstalled) {\n const packageManager = yield* detectPackageManager(repoDir);\n const command = removeDependencyCommand(\n packageManager,\n SHIPYARD_PACKAGE_NAME,\n );\n yield* Effect.try({\n try: () => execSync(command, { cwd: repoDir, stdio: \"inherit\" }),\n catch: (error) =>\n new InitError({\n message: `Could not remove ${SHIPYARD_PACKAGE_NAME}. Rerun the uninstall after resolving the package-manager error: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* d.status(\n `Removed ${SHIPYARD_PACKAGE_NAME} with ${packageManager}.`,\n \"success\",\n );\n }\n\n yield* d.status(\"Shipyard uninstalled from this repository.\", \"success\");\n }),\n);\n\n// --- Build-image command ---\n\nconst dockerfileOption = Options.file(\"dockerfile\").pipe(\n Options.withDescription(\n \"Path to a custom Dockerfile (build context will be the current working directory)\",\n ),\n Options.optional,\n);\n\nconst buildImageCommand = Command.make(\n \"build-image\",\n {\n imageName: imageNameOption,\n dockerfile: dockerfileOption,\n },\n ({ imageName: imageNameFlag, dockerfile }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n yield* requireCanonicalConfigDir(cwd);\n\n const imageName = resolveImageName(imageNameFlag, cwd);\n\n const dockerfileDir = join(cwd, CONFIG_DIR);\n const dockerfilePath =\n dockerfile._tag === \"Some\" ? dockerfile.value : undefined;\n\n yield* d.spinner(\n `Building Docker image '${imageName}'...`,\n buildImage(imageName, dockerfileDir, {\n dockerfile: dockerfilePath,\n buildArgs: defaultUidBuildArgs(),\n }),\n );\n\n yield* d.status(\"Build complete!\", \"success\");\n }),\n);\n\n// --- Remove-image command ---\n\nconst removeImageCommand = Command.make(\n \"remove-image\",\n {\n imageName: imageNameOption,\n },\n ({ imageName: imageNameFlag }) =>\n Effect.gen(function* () {\n const d = yield* Display;\n const cwd = process.cwd();\n\n const imageName = resolveImageName(imageNameFlag, cwd);\n\n yield* d.spinner(\n `Removing Docker image '${imageName}'...`,\n removeImage(imageName),\n );\n yield* d.status(\"Image removed.\", \"success\");\n }),\n);\n\n// --- Docker namespace command ---\n\nconst dockerCommand = Command.make(\"docker\", {}, () =>\n Effect.gen(function* () {\n const d = yield* Display;\n yield* d.status(\n \"Docker sandbox commands. Use --help to see available subcommands.\",\n \"info\",\n );\n }),\n).pipe(Command.withSubcommands([buildImageCommand, removeImageCommand]));\n\n// --- Root command ---\n\nconst rootCommand = Command.make(CLI_NAME, {}, () =>\n Effect.gen(function* () {\n const d = yield* Display;\n yield* d.status(`${PRODUCT_NAME} v${VERSION}`, \"info\");\n yield* d.status(\"Use --help to see available commands.\", \"info\");\n }),\n);\n\nexport const shipyard = rootCommand.pipe(\n Command.withSubcommands([\n initCommand,\n uninstallCommand,\n runCommand,\n dockerCommand,\n runnerCommand,\n ]),\n);\n\nexport const cli = Command.run(shipyard, {\n name: CLI_NAME,\n version: VERSION,\n});\n","/**\n * Terminal cleanup for abrupt exits.\n *\n * @clack/prompts' spinner and taskLog call stdin.setRawMode(true) and hide\n * the cursor via escape sequences. When the process is killed by a signal\n * handler that calls process.exit() directly (e.g. during Ctrl-C cleanup in\n * SandboxFactory), clack's own cleanup is bypassed and the terminal is left\n * in raw mode with the cursor hidden.\n *\n * Registering a process 'exit' listener that restores these guarantees the\n * terminal is always left in a usable state.\n */\n\n/** Escape sequence to show the cursor (DECTCEM). */\nexport const SHOW_CURSOR = \"\\x1b[?25h\";\n\n/**\n * Creates a synchronous exit handler that restores terminal state.\n * Extracted as a pure function so it can be unit-tested without side effects.\n */\nexport const makeTerminalCleanupHandler =\n (\n stdin: { isTTY?: boolean; setRawMode?: (raw: boolean) => void },\n stdout: { write: (data: string) => boolean },\n ) =>\n (): void => {\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch {\n // Best-effort — may fail if stdin is already closed\n }\n }\n stdout.write(SHOW_CURSOR);\n };\n\n/**\n * Registers the terminal cleanup handler on process 'exit'.\n * Call once at program startup (main.ts).\n */\nexport const setupTerminalCleanup = (): void => {\n process.on(\"exit\", makeTerminalCleanupHandler(process.stdin, process.stdout));\n};\n","#!/usr/bin/env node\nimport { NodeContext, NodeRuntime } from \"@effect/platform-node\";\nimport { Effect, Layer } from \"effect\";\nimport { cli } from \"./cli.js\";\nimport { ClackDisplay } from \"./Display.js\";\nimport { withFriendlyErrors } from \"./ErrorHandler.js\";\nimport { setupTerminalCleanup } from \"./terminalCleanup.js\";\n\n// Restore terminal state on any exit.\n// @clack/prompts' spinner/taskLog set stdin to raw mode and hide the cursor.\n// If the process exits via a signal handler that calls process.exit() directly\n// (e.g. the Ctrl-C handler in SandboxFactory), clack's own cleanup is\n// bypassed, leaving the terminal broken. This exit hook fixes that.\nsetupTerminalCleanup();\n\nconst mainLayer = Layer.merge(NodeContext.layer, ClackDisplay.layer);\n\ncli(process.argv).pipe(\n withFriendlyErrors,\n Effect.provide(mainLayer),\n NodeRuntime.runMain,\n);\n"]}
|