@hua-labs/tap 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts","../src/state.ts","../src/config/resolve.ts","../src/utils.ts","../src/version.ts","../src/permissions.ts","../src/toml.ts","../src/adapters/claude.ts","../src/adapters/codex.ts","../src/artifact-backups.ts","../src/adapters/common.ts","../src/adapters/gemini.ts","../src/adapters/index.ts","../src/engine/bridge.ts","../src/runtime/resolve-node.ts","../src/commands/add.ts","../src/commands/status.ts","../src/engine/rollback.ts","../src/commands/remove.ts","../src/commands/bridge.ts","../src/commands/serve.ts","../src/commands/init-worktree.ts","../src/engine/dashboard.ts","../src/commands/dashboard.ts","../src/output.ts","../src/cli.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createInitialState, saveState, stateExists } from \"../state.js\";\nimport {\n findRepoRoot,\n resolveCommsDir,\n log,\n logSuccess,\n logWarn,\n logHeader,\n} from \"../utils.js\";\nimport { version } from \"../version.js\";\nimport {\n applyClaudePermissions,\n applyCodexPermissions,\n buildPermissionSummary,\n} from \"../permissions.js\";\nimport type { CommandResult } from \"../types.js\";\nimport type { PermissionMode } from \"../permissions.js\";\nimport { resolveConfig } from \"../config/index.js\";\n\nconst COMMS_DIRS = [\n \"inbox\",\n \"reviews\",\n \"findings\",\n \"handoff\",\n \"retros\",\n \"archive\",\n];\n\nfunction parsePermissionMode(args: string[]): PermissionMode {\n const idx = args.indexOf(\"--permissions\");\n if (idx !== -1 && args[idx + 1]) {\n const value = args[idx + 1];\n if (value === \"full\" || value === \"safe\") return value;\n logWarn(`Unknown permission mode: ${value}. Using \"safe\".`);\n }\n return \"safe\";\n}\n\nexport async function initCommand(args: string[]): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const commsDir = resolveCommsDir(args, repoRoot);\n const permMode = parsePermissionMode(args);\n\n // Check if already initialized\n if (stateExists(repoRoot) && !args.includes(\"--force\")) {\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_ALREADY_INITIALIZED\",\n message: \"Already initialized. Use --force to re-initialize.\",\n warnings: [],\n data: { commsDir, repoRoot },\n };\n }\n\n logHeader(\"@hua-labs/tap init\");\n\n // Create comms directory structure\n log(`Comms directory: ${commsDir}`);\n for (const dir of COMMS_DIRS) {\n const dirPath = path.join(commsDir, dir);\n fs.mkdirSync(dirPath, { recursive: true });\n logSuccess(`Created ${dir}/`);\n }\n\n // Create .gitignore in comms dir\n const gitignorePath = path.join(commsDir, \".gitignore\");\n if (!fs.existsSync(gitignorePath)) {\n fs.writeFileSync(\n gitignorePath,\n [\"tap.db\", \".lock\", \"*.tmp.*\", \".DS_Store\"].join(\"\\n\") + \"\\n\",\n \"utf-8\",\n );\n logSuccess(\"Created .gitignore\");\n }\n\n // Create state directory (config-resolved — may differ from default .tap-comms/)\n const { config } = resolveConfig({}, repoRoot);\n const stateDir = config.stateDir;\n fs.mkdirSync(path.join(stateDir, \"pids\"), { recursive: true });\n fs.mkdirSync(path.join(stateDir, \"logs\"), { recursive: true });\n fs.mkdirSync(path.join(stateDir, \"backups\"), { recursive: true });\n const stateDirRel = path.relative(repoRoot, stateDir);\n logSuccess(`Created ${stateDirRel}/ state directory`);\n\n // Add state dir + local config to repo .gitignore if not present\n const repoGitignore = path.join(repoRoot, \".gitignore\");\n const gitignoreEntries = [\n { entry: stateDirRel.replace(/\\\\/g, \"/\") + \"/\", label: \"tap-comms state\" },\n {\n entry: \"tap-config.local.json\",\n label: \"tap-comms local config (machine-specific)\",\n },\n ];\n if (fs.existsSync(repoGitignore)) {\n const content = fs.readFileSync(repoGitignore, \"utf-8\");\n for (const { entry, label } of gitignoreEntries) {\n if (!content.includes(entry)) {\n fs.appendFileSync(repoGitignore, `\\n# ${label}\\n${entry}\\n`);\n logSuccess(`Added ${entry} to .gitignore`);\n }\n }\n }\n\n // Create initial state\n const state = createInitialState(commsDir, repoRoot, version);\n saveState(repoRoot, state);\n logSuccess(\"Created state.json\");\n\n // Apply permissions\n const warnings: string[] = [];\n logHeader(`Permissions: ${permMode} mode`);\n\n const claudeResult = applyClaudePermissions(repoRoot, permMode);\n warnings.push(...claudeResult.warnings);\n\n const codexResult = applyCodexPermissions(repoRoot, commsDir, permMode);\n warnings.push(...codexResult.warnings);\n\n const permSummary = buildPermissionSummary(permMode, repoRoot, commsDir);\n\n if (permMode === \"full\") {\n logWarn(\"Full mode: no destructive operation guards. Use with caution.\");\n }\n\n logHeader(\"Done! Next steps:\");\n log(\"npx @hua-labs/tap add claude # Add Claude runtime\");\n log(\"npx @hua-labs/tap add codex # Add Codex runtime\");\n log(\"npx @hua-labs/tap status # Check status\");\n\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_INIT_OK\",\n message: \"Initialized successfully\",\n warnings,\n data: {\n commsDir,\n repoRoot,\n permissions: permSummary,\n },\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as crypto from \"node:crypto\";\nimport type {\n TapState,\n TapStateV1,\n InstanceState,\n InstanceId,\n RuntimeName,\n OwnedArtifact,\n} from \"./types.js\";\nimport { resolveConfig } from \"./config/index.js\";\n\nconst STATE_FILE = \"state.json\";\nconst SCHEMA_VERSION = 2;\n\nexport function getStateDir(repoRoot: string): string {\n const { config } = resolveConfig({}, repoRoot);\n return config.stateDir;\n}\n\nexport function getStatePath(repoRoot: string): string {\n return path.join(getStateDir(repoRoot), STATE_FILE);\n}\n\nexport function stateExists(repoRoot: string): boolean {\n return fs.existsSync(getStatePath(repoRoot));\n}\n\n// ─── v1 → v2 Migration ────────────────────────────────────────\n\nexport function migrateStateV1toV2(v1: TapStateV1): TapState {\n const instances: Record<InstanceId, InstanceState> = {};\n\n for (const [runtime, rs] of Object.entries(v1.runtimes)) {\n if (!rs) continue;\n const instanceId = runtime as InstanceId; // default instance = runtime name\n instances[instanceId] = {\n instanceId,\n runtime: runtime as RuntimeName,\n agentName: null,\n port: null,\n headless: null,\n ...rs,\n };\n }\n\n return {\n schemaVersion: SCHEMA_VERSION,\n createdAt: v1.createdAt,\n updatedAt: v1.updatedAt,\n commsDir: v1.commsDir,\n repoRoot: v1.repoRoot,\n packageVersion: v1.packageVersion,\n instances,\n };\n}\n\n// ─── Load / Save ───────────────────────────────────────────────\n\nexport function loadState(repoRoot: string): TapState | null {\n const statePath = getStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return null;\n\n const raw = fs.readFileSync(statePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n\n // Auto-migrate v1 → v2\n if (parsed.schemaVersion === 1 || parsed.runtimes) {\n const migrated = migrateStateV1toV2(parsed as TapStateV1);\n saveState(repoRoot, migrated);\n return migrated;\n }\n\n return parsed as TapState;\n}\n\nexport function saveState(repoRoot: string, state: TapState): void {\n const stateDir = getStateDir(repoRoot);\n fs.mkdirSync(stateDir, { recursive: true });\n const statePath = getStatePath(repoRoot);\n const tmp = `${statePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(state, null, 2), \"utf-8\");\n fs.renameSync(tmp, statePath);\n}\n\nexport function createInitialState(\n commsDir: string,\n repoRoot: string,\n packageVersion: string,\n): TapState {\n const now = new Date().toISOString();\n return {\n schemaVersion: SCHEMA_VERSION,\n createdAt: now,\n updatedAt: now,\n commsDir: path.resolve(commsDir),\n repoRoot: path.resolve(repoRoot),\n packageVersion,\n instances: {},\n };\n}\n\n// ─── Instance CRUD ─────────────────────────────────────────────\n\nexport function updateInstanceState(\n state: TapState,\n instanceId: InstanceId,\n instanceState: InstanceState,\n): TapState {\n return {\n ...state,\n updatedAt: new Date().toISOString(),\n instances: {\n ...state.instances,\n [instanceId]: instanceState,\n },\n };\n}\n\nexport function removeInstanceState(\n state: TapState,\n instanceId: InstanceId,\n): TapState {\n const { [instanceId]: _removed, ...remaining } = state.instances;\n return {\n ...state,\n updatedAt: new Date().toISOString(),\n instances: remaining,\n };\n}\n\nexport function getInstalledInstances(state: TapState): InstanceId[] {\n return (Object.keys(state.instances) as InstanceId[]).filter(\n (id) => state.instances[id]?.installed,\n );\n}\n\nexport function getInstanceArtifacts(\n state: TapState,\n instanceId: InstanceId,\n): OwnedArtifact[] {\n return state.instances[instanceId]?.ownedArtifacts ?? [];\n}\n\n// ─── Backup ────────────────────────────────────────────────────\n\nexport function ensureBackupDir(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n const backupDir = path.join(stateDir, \"backups\", instanceId);\n fs.mkdirSync(backupDir, { recursive: true });\n return backupDir;\n}\n\nexport function backupFile(filePath: string, backupDir: string): string {\n const basename = path.basename(filePath);\n const hash = fileHash(filePath);\n const backupPath = path.join(backupDir, `${basename}.${hash}.bak`);\n fs.copyFileSync(filePath, backupPath);\n return backupPath;\n}\n\nexport function fileHash(filePath: string): string {\n if (!fs.existsSync(filePath)) return \"\";\n const content = fs.readFileSync(filePath);\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n// ─── Deprecated (v1 compat wrappers) ───────────────────────────\n\n/** @deprecated Use updateInstanceState */\nexport function updateRuntimeState(\n state: TapState,\n runtime: RuntimeName,\n runtimeState: InstanceState,\n): TapState {\n return updateInstanceState(state, runtime, runtimeState);\n}\n\n/** @deprecated Use removeInstanceState */\nexport function removeRuntimeState(\n state: TapState,\n runtime: RuntimeName,\n): TapState {\n return removeInstanceState(state, runtime);\n}\n\n/** @deprecated Use getInstalledInstances */\nexport function getInstalledRuntimes(state: TapState): InstanceId[] {\n return getInstalledInstances(state);\n}\n\n/** @deprecated Use getInstanceArtifacts */\nexport function getRuntimeArtifacts(\n state: TapState,\n instanceId: InstanceId,\n): OwnedArtifact[] {\n return getInstanceArtifacts(state, instanceId);\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n} from \"./types.js\";\n\n// ─── File names ────────────────────────────────────────────────\n\nexport const SHARED_CONFIG_FILE = \"tap-config.json\";\nexport const LOCAL_CONFIG_FILE = \"tap-config.local.json\";\n\n// ─── Defaults ──────────────────────────────────────────────────\n\nconst DEFAULT_RUNTIME_COMMAND = \"node\";\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\n\n// ─── Repo root discovery ───────────────────────────────────────\n\nexport function findRepoRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(dir, \".git\"))) return dir;\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return process.cwd();\n}\n\n// ─── JSON file loading ─────────────────────────────────────────\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nexport function loadSharedConfig(repoRoot: string): TapSharedConfig | null {\n return loadJsonFile<TapSharedConfig>(path.join(repoRoot, SHARED_CONFIG_FILE));\n}\n\nexport function loadLocalConfig(repoRoot: string): TapLocalConfig | null {\n return loadJsonFile<TapLocalConfig>(path.join(repoRoot, LOCAL_CONFIG_FILE));\n}\n\n// ─── CLI overrides ─────────────────────────────────────────────\n\nexport interface ConfigOverrides {\n commsDir?: string;\n stateDir?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n}\n\n// ─── Resolution ────────────────────────────────────────────────\n\n/**\n * Resolve config with priority: CLI flag > env > local config > shared config > auto.\n */\nexport function resolveConfig(\n overrides: ConfigOverrides = {},\n startDir?: string,\n): ConfigResolution {\n const repoRoot = findRepoRoot(startDir);\n const shared = loadSharedConfig(repoRoot) ?? {};\n const local = loadLocalConfig(repoRoot) ?? {};\n\n const sources: Record<keyof TapResolvedConfig, ConfigSource> = {\n repoRoot: \"auto\",\n commsDir: \"auto\",\n stateDir: \"auto\",\n runtimeCommand: \"auto\",\n appServerUrl: \"auto\",\n };\n\n // ─── commsDir ──────────────────────────────────────────────\n let commsDir: string;\n if (overrides.commsDir) {\n commsDir = path.resolve(overrides.commsDir);\n sources.commsDir = \"cli-flag\";\n } else if (process.env.TAP_COMMS_DIR) {\n commsDir = path.resolve(process.env.TAP_COMMS_DIR);\n sources.commsDir = \"env\";\n } else if (local.commsDir) {\n commsDir = resolvePath(repoRoot, local.commsDir);\n sources.commsDir = \"local-config\";\n } else if (shared.commsDir) {\n commsDir = resolvePath(repoRoot, shared.commsDir);\n sources.commsDir = \"shared-config\";\n } else {\n commsDir = path.join(path.dirname(repoRoot), \"tap-comms\");\n }\n\n // ─── stateDir ──────────────────────────────────────────────\n let stateDir: string;\n if (overrides.stateDir) {\n stateDir = path.resolve(overrides.stateDir);\n sources.stateDir = \"cli-flag\";\n } else if (process.env.TAP_STATE_DIR) {\n stateDir = path.resolve(process.env.TAP_STATE_DIR);\n sources.stateDir = \"env\";\n } else if (local.stateDir) {\n stateDir = resolvePath(repoRoot, local.stateDir);\n sources.stateDir = \"local-config\";\n } else if (shared.stateDir) {\n stateDir = resolvePath(repoRoot, shared.stateDir);\n sources.stateDir = \"shared-config\";\n } else {\n stateDir = path.join(repoRoot, \".tap-comms\");\n }\n\n // ─── runtimeCommand ────────────────────────────────────────\n let runtimeCommand: string;\n if (overrides.runtimeCommand) {\n runtimeCommand = overrides.runtimeCommand;\n sources.runtimeCommand = \"cli-flag\";\n } else if (process.env.TAP_RUNTIME_COMMAND) {\n runtimeCommand = process.env.TAP_RUNTIME_COMMAND;\n sources.runtimeCommand = \"env\";\n } else if (local.runtimeCommand) {\n runtimeCommand = local.runtimeCommand;\n sources.runtimeCommand = \"local-config\";\n } else if (shared.runtimeCommand) {\n runtimeCommand = shared.runtimeCommand;\n sources.runtimeCommand = \"shared-config\";\n } else {\n runtimeCommand = DEFAULT_RUNTIME_COMMAND;\n }\n\n // ─── appServerUrl ──────────────────────────────────────────\n let appServerUrl: string;\n if (overrides.appServerUrl) {\n appServerUrl = overrides.appServerUrl;\n sources.appServerUrl = \"cli-flag\";\n } else if (process.env.TAP_APP_SERVER_URL) {\n appServerUrl = process.env.TAP_APP_SERVER_URL;\n sources.appServerUrl = \"env\";\n } else if (local.appServerUrl) {\n appServerUrl = local.appServerUrl;\n sources.appServerUrl = \"local-config\";\n } else if (shared.appServerUrl) {\n appServerUrl = shared.appServerUrl;\n sources.appServerUrl = \"shared-config\";\n } else {\n appServerUrl = DEFAULT_APP_SERVER_URL;\n }\n\n return {\n config: { repoRoot, commsDir, stateDir, runtimeCommand, appServerUrl },\n sources,\n };\n}\n\n// ─── Save helpers ──────────────────────────────────────────────\n\nexport function saveSharedConfig(\n repoRoot: string,\n config: TapSharedConfig,\n): void {\n const filePath = path.join(repoRoot, SHARED_CONFIG_FILE);\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\nexport function saveLocalConfig(\n repoRoot: string,\n config: TapLocalConfig,\n): void {\n const filePath = path.join(repoRoot, LOCAL_CONFIG_FILE);\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\n/** Resolve a path relative to repoRoot, or keep absolute as-is. */\nfunction resolvePath(repoRoot: string, p: string): string {\n return path.isAbsolute(p) ? p : path.resolve(repoRoot, p);\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n AdapterContext,\n CommandCode,\n InstanceId,\n Platform,\n RuntimeName,\n TapState,\n} from \"./types.js\";\nimport { resolveConfig } from \"./config/index.js\";\n\nconst VALID_RUNTIMES: RuntimeName[] = [\"claude\", \"codex\", \"gemini\"];\n\nexport function isValidRuntime(name: string): name is RuntimeName {\n return VALID_RUNTIMES.includes(name as RuntimeName);\n}\n\nexport function detectPlatform(): Platform {\n return process.platform as Platform;\n}\n\nexport function findRepoRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(dir, \".git\"))) return dir;\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return process.cwd();\n}\n\nexport function resolveCommsDir(args: string[], repoRoot: string): string {\n // Check --comms-dir flag\n const idx = args.indexOf(\"--comms-dir\");\n if (idx !== -1 && args[idx + 1]) {\n return path.resolve(args[idx + 1]);\n }\n\n // Delegate to config resolution (env > local > shared > auto)\n const { config } = resolveConfig({}, repoRoot);\n return config.commsDir;\n}\n\nexport function createAdapterContext(\n commsDir: string,\n repoRoot: string,\n): AdapterContext {\n // Use config-resolved stateDir if available\n const { config } = resolveConfig({}, repoRoot);\n return {\n commsDir: path.resolve(commsDir),\n repoRoot: path.resolve(repoRoot),\n stateDir: config.stateDir,\n platform: detectPlatform(),\n };\n}\n\nexport function parseArgs(args: string[]): {\n positional: string[];\n flags: Record<string, string | boolean>;\n} {\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next && !next.startsWith(\"--\")) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else if (arg.startsWith(\"-\")) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { positional, flags };\n}\n\n// ─── JSON mode suppression ──────────────────────────────────────\n\nlet _jsonMode = false;\n\nexport function setJsonMode(enabled: boolean): void {\n _jsonMode = enabled;\n}\n\nexport function log(message: string): void {\n if (!_jsonMode) console.log(` ${message}`);\n}\n\nexport function logSuccess(message: string): void {\n if (!_jsonMode) console.log(` + ${message}`);\n}\n\nexport function logWarn(message: string): void {\n if (!_jsonMode) console.log(` ! ${message}`);\n}\n\nexport function logError(message: string): void {\n if (!_jsonMode) console.error(` x ${message}`);\n}\n\nexport function logHeader(message: string): void {\n if (!_jsonMode) console.log(`\\n ${message}\\n`);\n}\n\n// ─── Instance ID utilities ─────────────────────────────────────\n\nexport type ResolveResult =\n | { ok: true; instanceId: InstanceId }\n | { ok: false; code: CommandCode; message: string };\n\n/**\n * Resolve a user-provided identifier to an instance ID.\n * Accepts either an exact instance ID or a runtime name (if unambiguous).\n */\nexport function resolveInstanceId(\n identifier: string,\n state: TapState,\n): ResolveResult {\n // Exact match\n if (state.instances[identifier]) {\n return { ok: true, instanceId: identifier };\n }\n\n // Runtime name → find matching instances\n if (isValidRuntime(identifier)) {\n const matches = Object.values(state.instances).filter(\n (inst) => inst.runtime === identifier,\n );\n\n if (matches.length === 1) {\n return { ok: true, instanceId: matches[0].instanceId };\n }\n\n if (matches.length > 1) {\n const ids = matches.map((m) => m.instanceId).join(\", \");\n return {\n ok: false,\n code: \"TAP_INSTANCE_AMBIGUOUS\",\n message: `Multiple ${identifier} instances found: ${ids}. Specify one explicitly.`,\n };\n }\n }\n\n return {\n ok: false,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `Instance not found: ${identifier}`,\n };\n}\n\n/** Build an instance ID from runtime + optional name. */\nexport function buildInstanceId(\n runtime: RuntimeName,\n name?: string,\n): InstanceId {\n return name ? `${runtime}-${name}` : runtime;\n}\n\n/** Extract the runtime name from an instance ID. */\nexport function extractRuntimeFromInstanceId(id: InstanceId): RuntimeName {\n for (const r of VALID_RUNTIMES) {\n if (id === r || id.startsWith(`${r}-`)) return r;\n }\n throw new Error(`Cannot extract runtime from instance ID: ${id}`);\n}\n\n/** Check if a port is already claimed by another instance. */\nexport function findPortConflict(\n state: TapState,\n port: number,\n excludeInstanceId?: InstanceId,\n): InstanceId | null {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (id !== excludeInstanceId && inst.port === port) return id;\n }\n return null;\n}\n","export const version = \"0.1.0\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { logSuccess, logWarn } from \"./utils.js\";\nimport { replaceTomlTable, renderTomlTable, extractTomlTable } from \"./toml.js\";\n\nexport type PermissionMode = \"safe\" | \"full\";\n\n// ─── Claude Deny List ───────────────────────────────────────────\n\nconst CLAUDE_DENY_RULES = [\n \"Bash(git push --force:*)\",\n \"Bash(git push -f:*)\",\n \"Bash(git push --force-with-lease:*)\",\n \"Bash(git reset --hard:*)\",\n \"Bash(git checkout -- .:*)\",\n \"Bash(git clean -f:*)\",\n \"Bash(git clean -fd:*)\",\n \"Bash(git clean -fdx:*)\",\n \"Bash(git restore --source=:*)\",\n \"Bash(git branch -D:*)\",\n \"Bash(git stash drop:*)\",\n \"Bash(rm -rf:*)\",\n];\n\n/**\n * Apply Claude permission settings to .claude/settings.local.json.\n * Safe mode: adds deny list for destructive operations.\n * Full mode: removes tap-managed deny rules (restores full access).\n */\nexport function applyClaudePermissions(\n repoRoot: string,\n mode: PermissionMode,\n): { applied: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const claudeDir = path.join(repoRoot, \".claude\");\n const settingsPath = path.join(claudeDir, \"settings.local.json\");\n\n fs.mkdirSync(claudeDir, { recursive: true });\n\n let settings: Record<string, unknown> = {};\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, \"utf-8\"));\n } catch {\n warnings.push(\n \".claude/settings.local.json was invalid JSON. Starting fresh.\",\n );\n settings = {};\n }\n }\n\n const existingDeny = Array.isArray(settings.deny)\n ? (settings.deny as string[])\n : [];\n\n if (mode === \"full\") {\n // Remove tap-managed deny rules, keep user-added ones\n const tapRuleSet = new Set(CLAUDE_DENY_RULES);\n const cleaned = existingDeny.filter((r) => !tapRuleSet.has(r));\n settings.deny = cleaned;\n\n const tmp = `${settingsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, settingsPath);\n\n logWarn(\"Claude: full mode — tap deny rules removed. Use with caution.\");\n warnings.push(\"Full permission mode: tap deny rules removed.\");\n return { applied: true, warnings };\n }\n\n // Safe mode: merge deny rules without duplicating\n const newDeny = [...new Set([...existingDeny, ...CLAUDE_DENY_RULES])];\n settings.deny = newDeny;\n\n const tmp = `${settingsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, settingsPath);\n\n logSuccess(\n `Claude: ${CLAUDE_DENY_RULES.length} deny rules applied to .claude/settings.local.json`,\n );\n\n return { applied: true, warnings };\n}\n\n// ─── Codex Config Patching ──────────────────────────────────────\n\nfunction findCodexConfigPath(): string {\n return path.join(os.homedir(), \".codex\", \"config.toml\");\n}\n\nfunction canonicalizeTrustPath(targetPath: string): string {\n let resolved = path.resolve(targetPath).replace(/\\//g, \"\\\\\");\n const driveRoot = /^[A-Za-z]:\\\\$/;\n if (!driveRoot.test(resolved)) {\n resolved = resolved.replace(/\\\\+$/g, \"\");\n }\n return resolved.startsWith(\"\\\\\\\\?\\\\\") ? resolved : `\\\\\\\\?\\\\${resolved}`;\n}\n\n/**\n * Apply Codex permission settings to ~/.codex/config.toml.\n * Safe mode: network full + trust project paths.\n * Full mode: danger-full-access warning (manual step).\n */\nexport function applyCodexPermissions(\n repoRoot: string,\n commsDir: string,\n mode: PermissionMode,\n): { applied: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const configPath = findCodexConfigPath();\n\n // Read existing config\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n let content = \"\";\n if (fs.existsSync(configPath)) {\n content = fs.readFileSync(configPath, \"utf-8\");\n }\n\n // Both modes need trust paths\n const trustTargets = getCodexWritableRoots(repoRoot, commsDir);\n\n if (mode === \"full\") {\n // Full mode: danger-full-access + trust\n logWarn(\"Codex: full mode — setting sandbox to danger-full-access.\");\n warnings.push(\n \"Full mode: sandbox set to danger-full-access. Use with caution.\",\n );\n\n content = replaceTomlTable(\n content,\n \"sandbox\",\n renderTomlTable(\n \"sandbox\",\n { mode: \"danger-full-access\" },\n extractTomlTable(content, \"sandbox\"),\n ),\n );\n } else {\n // Safe mode: workspace-write + network full + writable_roots\n content = replaceTomlTable(\n content,\n \"sandbox\",\n renderTomlTable(\n \"sandbox\",\n { mode: \"workspace-write\", network_access: \"full\" },\n extractTomlTable(content, \"sandbox\"),\n ),\n );\n\n // Writable roots for workspace-write mode\n const forwardSlashRoots = trustTargets.map((r) => r.replace(/\\\\/g, \"/\"));\n content = replaceTomlTable(\n content,\n \"sandbox_workspace_write\",\n renderTomlTable(\n \"sandbox_workspace_write\",\n { writable_roots: forwardSlashRoots },\n extractTomlTable(content, \"sandbox_workspace_write\"),\n ),\n );\n\n // Windows elevated sandbox\n if (process.platform === \"win32\") {\n content = replaceTomlTable(\n content,\n \"windows\",\n renderTomlTable(\n \"windows\",\n { sandbox: \"elevated\" },\n extractTomlTable(content, \"windows\"),\n ),\n );\n }\n }\n\n // Trust project paths (both modes)\n for (const target of trustTargets) {\n const selector = `projects.'${canonicalizeTrustPath(target)}'`;\n content = replaceTomlTable(\n content,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(content, selector),\n ),\n );\n }\n\n // Write back\n const tmp = `${configPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, \"utf-8\");\n fs.renameSync(tmp, configPath);\n\n const modeLabel =\n mode === \"full\" ? \"danger-full-access\" : \"workspace-write, network=full\";\n logSuccess(\n `Codex: sandbox=${modeLabel}, ${trustTargets.length} path(s) trusted`,\n );\n\n return { applied: true, warnings };\n}\n\n// ─── Codex Writable Roots ───────────────────────────────────────\n\nexport function getCodexWritableRoots(\n repoRoot: string,\n commsDir: string,\n): string[] {\n const roots = [repoRoot, commsDir];\n\n // Add worktree siblings\n const parent = path.dirname(repoRoot);\n for (let i = 1; i <= 4; i++) {\n const wtPath = path.join(parent, `hua-wt-${i}`);\n if (fs.existsSync(wtPath)) roots.push(wtPath);\n }\n\n return [...new Set(roots.map((r) => path.resolve(r)))];\n}\n\n// ─── Permission Summary ────────────────────────────────────────\n\nexport interface PermissionSummary {\n mode: PermissionMode;\n claude: { applied: boolean; denyCount: number; warnings: string[] };\n codex: { applied: boolean; trustedPaths: string[]; warnings: string[] };\n}\n\nexport function buildPermissionSummary(\n mode: PermissionMode,\n repoRoot: string,\n commsDir: string,\n): PermissionSummary {\n const trustedPaths = getCodexWritableRoots(repoRoot, commsDir);\n\n return {\n mode,\n claude: {\n applied: true,\n denyCount: mode === \"safe\" ? CLAUDE_DENY_RULES.length : 0,\n warnings: mode === \"full\" ? [\"Full mode: tap deny rules removed.\"] : [],\n },\n codex: {\n applied: true,\n trustedPaths,\n warnings:\n mode === \"full\"\n ? [\"Full mode: sandbox set to danger-full-access.\"]\n : [],\n },\n };\n}\n","function splitLines(content: string): string[] {\n return content.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n}\n\nfunction tableHeader(selector: string): string {\n return `[${selector}]`;\n}\n\nfunction findTableRange(\n lines: string[],\n selector: string,\n): { start: number; end: number } | null {\n const header = tableHeader(selector);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim() !== header) continue;\n\n let end = lines.length;\n for (let j = i + 1; j < lines.length; j++) {\n const trimmed = lines[j].trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n end = j;\n break;\n }\n }\n return { start: i, end };\n }\n return null;\n}\n\nfunction escapeBasicString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction renderValue(value: string | string[]): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => `\"${escapeBasicString(item)}\"`).join(\", \")}]`;\n }\n return `\"${escapeBasicString(value)}\"`;\n}\n\nexport function extractTomlTable(\n content: string,\n selector: string,\n): string | null {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n if (!range) return null;\n return `${lines.slice(range.start, range.end).join(\"\\n\")}\\n`;\n}\n\nexport function removeTomlTable(content: string, selector: string): string {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n if (!range) return content;\n\n const next = [...lines.slice(0, range.start), ...lines.slice(range.end)];\n return `${trimTomlDocument(next.join(\"\\n\"))}\\n`;\n}\n\nexport function replaceTomlTable(\n content: string,\n selector: string,\n replacement: string,\n): string {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n const replacementLines = replacement.replace(/\\r\\n/g, \"\\n\").trimEnd().split(\"\\n\");\n\n if (!range) {\n const doc = trimTomlDocument(content);\n if (!doc) return `${replacement.trimEnd()}\\n`;\n return `${doc}\\n\\n${replacement.trimEnd()}\\n`;\n }\n\n const next = [\n ...lines.slice(0, range.start),\n ...replacementLines,\n ...lines.slice(range.end),\n ];\n return `${trimTomlDocument(next.join(\"\\n\"))}\\n`;\n}\n\nexport function renderTomlTable(\n selector: string,\n entries: Record<string, string | string[]>,\n existingContent?: string | null,\n): string {\n const preserved = parseTomlAssignments(existingContent ?? \"\");\n const merged: Record<string, string | string[]> = { ...preserved, ...entries };\n\n const lines = [tableHeader(selector)];\n for (const [key, value] of Object.entries(merged)) {\n lines.push(`${key} = ${renderValue(value)}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function parseTomlAssignments(\n tableContent: string,\n): Record<string, string | string[]> {\n const lines = splitLines(tableContent);\n const values: Record<string, string | string[]> = {};\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\") || (line.startsWith(\"[\") && line.endsWith(\"]\"))) {\n continue;\n }\n\n const match = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.+)$/);\n if (!match) continue;\n\n const [, key, rawValue] = match;\n const value = rawValue.trim();\n\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const items = value\n .slice(1, -1)\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n .map(unquoteTomlString);\n values[key] = items;\n continue;\n }\n\n values[key] = unquoteTomlString(value);\n }\n\n return values;\n}\n\nexport function trimTomlDocument(content: string): string {\n return content.replace(/\\s+$/g, \"\").replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\nfunction unquoteTomlString(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n const inner = value.slice(1, -1);\n return value.startsWith('\"')\n ? inner.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\")\n : inner;\n }\n return value;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { fileHash, backupFile, ensureBackupDir } from \"../state.js\";\nimport type {\n RuntimeAdapter,\n AdapterContext,\n ProbeResult,\n PatchPlan,\n ApplyResult,\n VerifyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n VerifyCheck,\n} from \"../types.js\";\n\nconst MCP_SERVER_KEY = \"tap-comms\";\n\nfunction findMcpJsonPath(ctx: AdapterContext): string {\n return path.join(ctx.repoRoot, \".mcp.json\");\n}\n\nfunction findClaudeCommand(): string | null {\n try {\n execSync(\"claude --version\", { stdio: \"pipe\" });\n return \"claude\";\n } catch {\n return null;\n }\n}\n\n/**\n * Build the MCP server entry for .mcp.json.\n *\n * v1: local tap-plugin/channels only. Returns null if not found.\n */\nfunction buildMcpServerEntry(\n ctx: AdapterContext,\n): Record<string, unknown> | null {\n const localChannels = findLocalChannels(ctx);\n if (!localChannels) return null;\n\n return {\n type: \"stdio\",\n command: \"npx\",\n args: [\"bun\", localChannels],\n env: { TAP_COMMS_DIR: ctx.commsDir },\n };\n}\n\nfunction findLocalChannels(ctx: AdapterContext): string | null {\n const candidates = [\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n path.join(\n ctx.repoRoot,\n \"node_modules\",\n \"@hua-labs\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n ];\n for (const p of candidates) {\n if (fs.existsSync(p)) return p;\n }\n return null;\n}\n\nexport const claudeAdapter: RuntimeAdapter = {\n runtime: \"claude\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n\n const configPath = findMcpJsonPath(ctx);\n const configExists = fs.existsSync(configPath);\n const runtimeCommand = findClaudeCommand();\n const canWrite = configExists\n ? (() => {\n try {\n fs.accessSync(configPath, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n })()\n : true; // Can create new file\n\n if (!runtimeCommand) {\n warnings.push(\n \"Claude CLI not found in PATH. Config will be created but may need manual setup.\",\n );\n }\n\n // Check if local tap-comms MCP server source exists (v1: required)\n const localChannels = findLocalChannels(ctx);\n if (!localChannels) {\n issues.push(\n \"tap-comms MCP server not found locally. \" +\n \"Ensure packages/tap-plugin/channels/tap-comms.ts exists. \" +\n \"Run from the monorepo root.\",\n );\n }\n\n // Check if comms dir exists\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n return {\n installed: true, // Claude adapter always \"installed\" — .mcp.json is per-project\n configPath,\n configExists,\n runtimeCommand,\n version: null,\n canWrite,\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? findMcpJsonPath(ctx);\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts: OwnedArtifact[] = [];\n\n // Check for existing tap-comms entry\n if (probe.configExists) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n const config = JSON.parse(raw);\n if (config.mcpServers?.[MCP_SERVER_KEY]) {\n conflicts.push(\n `Existing \"${MCP_SERVER_KEY}\" entry in .mcp.json will be overwritten.`,\n );\n }\n } catch {\n warnings.push(\n \".mcp.json exists but is not valid JSON. Will be overwritten.\",\n );\n }\n }\n\n const serverEntry = buildMcpServerEntry(ctx);\n\n if (!serverEntry) {\n warnings.push(\n \"tap-comms MCP server not found locally. Skipping .mcp.json patch. \" +\n \"Run from monorepo root with packages/tap-plugin/channels/ available.\",\n );\n return {\n runtime: \"claude\",\n operations: [],\n ownedArtifacts: [],\n backupDir: ensureBackupDir(ctx.stateDir, \"claude\"),\n restartRequired: false,\n conflicts,\n warnings,\n };\n }\n\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: `mcpServers.${MCP_SERVER_KEY}`,\n value: serverEntry,\n });\n\n ownedArtifacts.push({\n kind: \"json-path\",\n path: configPath,\n selector: `mcpServers.${MCP_SERVER_KEY}`,\n });\n\n const backupDir = ensureBackupDir(ctx.stateDir, \"claude\");\n\n return {\n runtime: \"claude\",\n operations,\n ownedArtifacts,\n backupDir,\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(_ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const changedFiles: string[] = [];\n const warnings: string[] = [];\n let appliedOps = 0;\n\n for (const op of plan.operations) {\n try {\n if (op.type === \"set\" || op.type === \"merge\") {\n // Read or create .mcp.json\n let config: Record<string, unknown> = {};\n if (fs.existsSync(op.path)) {\n // Backup first\n backupFile(op.path, plan.backupDir);\n const raw = fs.readFileSync(op.path, \"utf-8\");\n try {\n config = JSON.parse(raw);\n } catch {\n // Invalid JSON, start fresh but backup the original\n warnings.push(\n `${op.path} was invalid JSON. Created backup and starting fresh.`,\n );\n }\n }\n\n // Set nested key\n if (op.key) {\n setNestedKey(config, op.key, op.value);\n }\n\n // Write atomically\n const tmp = `${op.path}.tmp.${process.pid}`;\n fs.writeFileSync(\n tmp,\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n fs.renameSync(tmp, op.path);\n changedFiles.push(op.path);\n appliedOps++;\n }\n } catch (err) {\n warnings.push(\n `Failed to apply op on ${op.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const lastAppliedHash =\n changedFiles.length > 0 ? fileHash(changedFiles[0]) : \"\";\n\n return {\n success: appliedOps > 0,\n appliedOps,\n backupCreated: true,\n lastAppliedHash,\n ownedArtifacts: plan.ownedArtifacts,\n changedFiles,\n restartRequired: plan.restartRequired,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const checks: VerifyCheck[] = [];\n const warnings: string[] = [];\n\n // 1. Config file exists\n const configPath = plan.operations[0]?.path;\n if (configPath) {\n checks.push({\n name: \"Config file exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath)\n ? undefined\n : `${configPath} not found`,\n });\n\n // 2. Config is valid JSON\n if (fs.existsSync(configPath)) {\n try {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(raw);\n checks.push({ name: \"Config is valid JSON\", passed: true });\n\n // 3. Managed entry present\n const entry = config.mcpServers?.[MCP_SERVER_KEY];\n checks.push({\n name: \"tap-comms entry present\",\n passed: !!entry,\n message: entry\n ? undefined\n : `mcpServers.${MCP_SERVER_KEY} not found`,\n });\n\n // 4. Entry has correct env\n if (entry) {\n const hasCommsDir = entry.env?.TAP_COMMS_DIR === ctx.commsDir;\n checks.push({\n name: \"TAP_COMMS_DIR configured\",\n passed: hasCommsDir,\n message: hasCommsDir ? undefined : `Expected ${ctx.commsDir}`,\n });\n }\n } catch {\n checks.push({\n name: \"Config is valid JSON\",\n passed: false,\n message: \"Parse error\",\n });\n }\n }\n }\n\n // 5. Comms dir exists\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n\n // 6. Runtime command found\n const cmd = findClaudeCommand();\n checks.push({\n name: \"Claude CLI found\",\n passed: !!cmd,\n message: cmd ? undefined : \"claude not in PATH (non-blocking)\",\n });\n if (!cmd) {\n warnings.push(\n \"Claude CLI not in PATH. Config is ready but cannot verify runtime reads it.\",\n );\n }\n\n const ok = checks\n .filter((c) => c.name !== \"Claude CLI found\")\n .every((c) => c.passed);\n\n return { ok, checks, restartRequired: true, warnings };\n },\n\n bridgeMode(): BridgeMode {\n return \"native-push\";\n },\n};\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { backupFile, ensureBackupDir, fileHash } from \"../state.js\";\nimport {\n artifactBackupPath,\n writeArtifactBackup,\n} from \"../artifact-backups.js\";\nimport {\n extractTomlTable,\n renderTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport type {\n AdapterContext,\n ApplyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n PatchPlan,\n ProbeResult,\n RuntimeAdapter,\n VerifyCheck,\n VerifyResult,\n} from \"../types.js\";\nimport {\n buildManagedMcpServerSpec,\n canWriteOrCreate,\n getHomeDir,\n probeCommand,\n} from \"./common.js\";\n\nconst MCP_SELECTOR = \"mcp_servers.tap-comms\";\nconst ENV_SELECTOR = \"mcp_servers.tap-comms.env\";\n\nfunction findCodexConfigPath(): string {\n return path.join(getHomeDir(), \".codex\", \"config.toml\");\n}\n\nfunction canonicalizeTrustPath(targetPath: string): string {\n let resolved = path.resolve(targetPath).replace(/\\//g, \"\\\\\");\n const driveRoot = /^[A-Za-z]:\\\\$/;\n if (!driveRoot.test(resolved)) {\n resolved = resolved.replace(/\\\\+$/g, \"\");\n }\n return resolved.startsWith(\"\\\\\\\\?\\\\\") ? resolved : `\\\\\\\\?\\\\${resolved}`;\n}\n\nfunction trustSelector(targetPath: string): string {\n return `projects.'${canonicalizeTrustPath(targetPath)}'`;\n}\n\nfunction getTrustTargets(ctx: AdapterContext): string[] {\n const targets = [ctx.repoRoot, process.cwd()];\n return [...new Set(targets.map((value) => path.resolve(value)))];\n}\n\nfunction buildManagedArtifacts(\n configPath: string,\n ctx: AdapterContext,\n): OwnedArtifact[] {\n const artifacts: OwnedArtifact[] = [\n { kind: \"toml-table\", path: configPath, selector: MCP_SELECTOR },\n { kind: \"toml-table\", path: configPath, selector: ENV_SELECTOR },\n ];\n\n for (const target of getTrustTargets(ctx)) {\n artifacts.push({\n kind: \"toml-table\",\n path: configPath,\n selector: trustSelector(target),\n });\n }\n\n return artifacts;\n}\n\nfunction readConfigOrEmpty(configPath: string): string {\n if (!fs.existsSync(configPath)) return \"\";\n return fs.readFileSync(configPath, \"utf-8\");\n}\n\nfunction writeTomlFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\nfunction verifyManagedToml(\n content: string,\n ctx: AdapterContext,\n configPath: string,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const managed = buildManagedMcpServerSpec(ctx);\n const mainTable = extractTomlTable(content, MCP_SELECTOR);\n const envTable = extractTomlTable(content, ENV_SELECTOR);\n\n checks.push({\n name: \"Codex config exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath) ? undefined : `${configPath} not found`,\n });\n checks.push({\n name: \"tap-comms MCP table present\",\n passed: !!mainTable,\n message: mainTable ? undefined : `${MCP_SELECTOR} not found`,\n });\n checks.push({\n name: \"tap-comms env table present\",\n passed: !!envTable,\n message: envTable ? undefined : `${ENV_SELECTOR} not found`,\n });\n\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n const trustTable = extractTomlTable(content, selector);\n checks.push({\n name: `Trust table present: ${canonicalizeTrustPath(target)}`,\n passed: !!trustTable && trustTable.includes('trust_level = \"trusted\"'),\n message:\n trustTable && trustTable.includes('trust_level = \"trusted\"')\n ? undefined\n : `${selector} missing trust_level = \"trusted\"`,\n });\n }\n\n if (mainTable && managed.command) {\n checks.push({\n name: \"Managed command configured\",\n passed:\n mainTable.includes(\n `command = \"${managed.command.replace(/\\\\/g, \"\\\\\\\\\")}\"`,\n ) &&\n mainTable.includes(\n `args = [\"${managed.args[0]?.replace(/\\\\/g, \"\\\\\\\\\") ?? \"\"}\"]`,\n ),\n message: \"Managed tap-comms command/args do not match expected values\",\n });\n }\n\n return checks;\n}\n\nexport const codexAdapter: RuntimeAdapter = {\n runtime: \"codex\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n const configPath = findCodexConfigPath();\n const configExists = fs.existsSync(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"codex\", \"codex.cmd\"] : [\"codex\"],\n );\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Codex CLI not found in PATH. Config can still be written, but runtime verification will be limited.\",\n );\n }\n\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n return {\n installed: true,\n configPath,\n configExists,\n runtimeCommand: runtimeProbe.command,\n version: runtimeProbe.version,\n canWrite: canWriteOrCreate(configPath),\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? findCodexConfigPath();\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts = buildManagedArtifacts(configPath, ctx);\n\n if (probe.configExists) {\n const content = readConfigOrEmpty(configPath);\n if (extractTomlTable(content, MCP_SELECTOR)) {\n conflicts.push(`Existing ${MCP_SELECTOR} table will be updated.`);\n }\n if (extractTomlTable(content, ENV_SELECTOR)) {\n conflicts.push(`Existing ${ENV_SELECTOR} table will be updated.`);\n }\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n if (extractTomlTable(content, selector)) {\n conflicts.push(`Existing ${selector} table will be updated.`);\n }\n }\n }\n\n for (const artifact of ownedArtifacts) {\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: artifact.selector,\n });\n }\n\n return {\n runtime: \"codex\",\n operations,\n ownedArtifacts,\n backupDir: ensureBackupDir(ctx.stateDir, \"codex\"),\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const configPath = plan.operations[0]?.path ?? findCodexConfigPath();\n const warnings: string[] = [];\n const changedFiles: string[] = [];\n const managed = buildManagedMcpServerSpec(ctx);\n\n warnings.push(...managed.warnings);\n if (managed.issues.length > 0 || !managed.command) {\n return {\n success: false,\n appliedOps: 0,\n backupCreated: false,\n lastAppliedHash: \"\",\n ownedArtifacts: [],\n changedFiles,\n restartRequired: false,\n warnings: [...managed.warnings, ...managed.issues],\n };\n }\n\n const existingContent = readConfigOrEmpty(configPath);\n if (fs.existsSync(configPath) && existingContent) {\n backupFile(configPath, plan.backupDir);\n }\n\n const artifactsWithBackups = plan.ownedArtifacts.map((artifact) => {\n const previousContent =\n artifact.kind === \"toml-table\"\n ? extractTomlTable(existingContent, artifact.selector)\n : null;\n const backupPath = artifactBackupPath(\n plan.backupDir,\n artifact.kind,\n artifact.selector,\n );\n\n writeArtifactBackup(backupPath, {\n kind: \"toml-table\",\n selector: artifact.selector,\n existed: previousContent !== null,\n content: previousContent ?? undefined,\n });\n\n return { ...artifact, backupPath };\n });\n\n let nextContent = existingContent;\n nextContent = replaceTomlTable(\n nextContent,\n MCP_SELECTOR,\n renderTomlTable(\n MCP_SELECTOR,\n {\n command: managed.command,\n args: managed.args,\n },\n extractTomlTable(existingContent, MCP_SELECTOR),\n ),\n );\n nextContent = replaceTomlTable(\n nextContent,\n ENV_SELECTOR,\n renderTomlTable(\n ENV_SELECTOR,\n managed.env,\n extractTomlTable(existingContent, ENV_SELECTOR),\n ),\n );\n\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n nextContent = replaceTomlTable(\n nextContent,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(existingContent, selector),\n ),\n );\n }\n\n writeTomlFile(configPath, nextContent);\n changedFiles.push(configPath);\n\n return {\n success: true,\n appliedOps: plan.operations.length,\n backupCreated: true,\n lastAppliedHash: fileHash(configPath),\n ownedArtifacts: artifactsWithBackups,\n changedFiles,\n restartRequired: true,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const warnings: string[] = [];\n const configPath = plan.operations[0]?.path ?? findCodexConfigPath();\n const content = readConfigOrEmpty(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"codex\", \"codex.cmd\"] : [\"codex\"],\n );\n\n const checks = verifyManagedToml(content, ctx, configPath);\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n checks.push({\n name: \"Codex CLI found\",\n passed: !!runtimeProbe.command,\n message: runtimeProbe.command\n ? undefined\n : \"codex not in PATH (non-blocking)\",\n });\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Codex CLI not in PATH. Config is written, but runtime verification is partial.\",\n );\n }\n\n return {\n ok: checks\n .filter((check) => check.name !== \"Codex CLI found\")\n .every((check) => check.passed),\n checks,\n restartRequired: true,\n warnings,\n };\n },\n\n bridgeMode(): BridgeMode {\n return \"app-server\";\n },\n\n resolveBridgeScript(ctx: AdapterContext): string | null {\n const distDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // 1. Relative to bundled CLI (npm install / npx)\n path.join(distDir, \"bridges\", \"codex-bridge-runner.mjs\"),\n // 2. Monorepo development — dist inside repo\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-comms\",\n \"dist\",\n \"bridges\",\n \"codex-bridge-runner.mjs\",\n ),\n // 3. Source file — dev mode with strip-types\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-comms\",\n \"src\",\n \"bridges\",\n \"codex-bridge-runner.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n },\n};\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ArtifactKind } from \"./types.js\";\n\ntype BackupPayload =\n | {\n kind: \"json-path\";\n selector: string;\n existed: boolean;\n value?: unknown;\n }\n | {\n kind: \"toml-table\";\n selector: string;\n existed: boolean;\n content?: string;\n }\n | {\n kind: \"file\";\n selector: string;\n existed: boolean;\n };\n\nfunction selectorHash(selector: string): string {\n return crypto.createHash(\"sha256\").update(selector).digest(\"hex\").slice(0, 12);\n}\n\nexport function artifactBackupPath(\n backupDir: string,\n kind: ArtifactKind,\n selector: string,\n): string {\n const safeKind = kind.replace(/[^a-z-]/gi, \"-\");\n return path.join(backupDir, `${safeKind}-${selectorHash(selector)}.json`);\n}\n\nexport function writeArtifactBackup(\n backupPath: string,\n payload: BackupPayload,\n): void {\n fs.mkdirSync(path.dirname(backupPath), { recursive: true });\n const tmp = `${backupPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, backupPath);\n}\n\nexport function readArtifactBackup(backupPath: string): BackupPayload | null {\n if (!fs.existsSync(backupPath)) return null;\n\n try {\n const raw = fs.readFileSync(backupPath, \"utf-8\");\n return JSON.parse(raw) as BackupPayload;\n } catch {\n return null;\n }\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport type { AdapterContext } from \"../types.js\";\n\nexport interface CommandProbe {\n command: string | null;\n version: string | null;\n}\n\nexport interface ManagedMcpServerSpec {\n command: string | null;\n args: string[];\n env: Record<string, string>;\n sourcePath: string | null;\n warnings: string[];\n issues: string[];\n}\n\nexport function probeCommand(candidates: string[]): CommandProbe {\n for (const candidate of candidates) {\n const result = spawnSync(candidate, [\"--version\"], {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n });\n\n if (result.status === 0) {\n const version =\n `${result.stdout ?? \"\"}${result.stderr ?? \"\"}`.trim() || null;\n return { command: candidate, version };\n }\n }\n\n return { command: null, version: null };\n}\n\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\nexport function toForwardSlashPath(filePath: string): string {\n return path.resolve(filePath).replace(/\\\\/g, \"/\");\n}\n\nexport function canWriteOrCreate(filePath: string): boolean {\n try {\n if (fs.existsSync(filePath)) {\n fs.accessSync(filePath, fs.constants.W_OK);\n return true;\n }\n\n const parent = path.dirname(filePath);\n fs.mkdirSync(parent, { recursive: true });\n fs.accessSync(parent, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function findLocalTapCommsSource(ctx: AdapterContext): string | null {\n const candidates = [\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n path.join(\n ctx.repoRoot,\n \"node_modules\",\n \"@hua-labs\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function findPreferredBunCommand(): string | null {\n const home = getHomeDir();\n const candidates =\n process.platform === \"win32\"\n ? [path.join(home, \".bun\", \"bin\", \"bun.exe\"), \"bun\", \"bun.cmd\"]\n : [path.join(home, \".bun\", \"bin\", \"bun\"), \"bun\"];\n\n for (const candidate of candidates) {\n if (path.isAbsolute(candidate) && !fs.existsSync(candidate)) continue;\n\n const result = spawnSync(candidate, [\"--version\"], {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) {\n return path.isAbsolute(candidate)\n ? toForwardSlashPath(candidate)\n : candidate;\n }\n }\n\n return null;\n}\n\nexport function buildManagedMcpServerSpec(\n ctx: AdapterContext,\n): ManagedMcpServerSpec {\n const sourcePath = findLocalTapCommsSource(ctx);\n const bunCommand = findPreferredBunCommand();\n const warnings: string[] = [];\n const issues: string[] = [];\n\n if (sourcePath && bunCommand) {\n return {\n command: bunCommand,\n args: [toForwardSlashPath(sourcePath)],\n env: {\n TAP_AGENT_NAME: \"<set-per-session>\",\n TAP_COMMS_DIR: toForwardSlashPath(ctx.commsDir),\n },\n sourcePath,\n warnings,\n issues,\n };\n }\n\n if (!sourcePath) {\n issues.push(\n \"tap-comms MCP server source not found. v1 requires a repo-local tap-plugin/channels installation.\",\n );\n }\n\n if (!bunCommand) {\n issues.push(\"bun is required to run the repo-local tap-comms MCP server.\");\n }\n\n return {\n command: null,\n args: [],\n env: {\n TAP_AGENT_NAME: \"<set-per-session>\",\n TAP_COMMS_DIR: toForwardSlashPath(ctx.commsDir),\n },\n sourcePath,\n warnings,\n issues,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { backupFile, ensureBackupDir, fileHash } from \"../state.js\";\nimport { artifactBackupPath, writeArtifactBackup } from \"../artifact-backups.js\";\nimport type {\n AdapterContext,\n ApplyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n PatchPlan,\n ProbeResult,\n RuntimeAdapter,\n VerifyCheck,\n VerifyResult,\n} from \"../types.js\";\nimport {\n buildManagedMcpServerSpec,\n canWriteOrCreate,\n getHomeDir,\n probeCommand,\n} from \"./common.js\";\n\nconst GEMINI_SELECTOR = \"mcpServers.tap-comms\";\n\nfunction candidateConfigPaths(ctx: AdapterContext): string[] {\n const home = getHomeDir();\n return [\n path.join(ctx.repoRoot, \".gemini\", \"settings.json\"),\n path.join(home, \".gemini\", \"settings.json\"),\n path.join(home, \".gemini\", \"antigravity\", \"mcp_config.json\"),\n ];\n}\n\nfunction chooseGeminiConfigPath(ctx: AdapterContext): string {\n const [workspaceConfig, homeConfig, antigravityConfig] = candidateConfigPaths(ctx);\n\n if (fs.existsSync(workspaceConfig)) return workspaceConfig;\n if (fs.existsSync(homeConfig)) return homeConfig;\n\n if (fs.existsSync(antigravityConfig)) {\n const raw = fs.readFileSync(antigravityConfig, \"utf-8\").trim();\n if (raw) {\n try {\n JSON.parse(raw);\n return antigravityConfig;\n } catch {\n // Fall through to workspace-managed config.\n }\n }\n }\n\n return workspaceConfig;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, \"utf-8\").trim();\n if (!raw) return {};\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\nfunction readNestedKey(obj: Record<string, unknown>, keyPath: string): unknown {\n let current: unknown = obj;\n for (const key of keyPath.split(\".\")) {\n if (typeof current !== \"object\" || current === null || !(key in current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\nfunction verifyGeminiConfig(\n config: Record<string, unknown>,\n configPath: string,\n ctx: AdapterContext,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const entry = readNestedKey(config, GEMINI_SELECTOR) as Record<string, unknown> | undefined;\n\n checks.push({\n name: \"Gemini config exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath) ? undefined : `${configPath} not found`,\n });\n checks.push({\n name: \"tap-comms entry present\",\n passed: !!entry,\n message: entry ? undefined : `${GEMINI_SELECTOR} not found`,\n });\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir) ? undefined : `${ctx.commsDir} not found`,\n });\n\n if (entry?.env && typeof entry.env === \"object\") {\n checks.push({\n name: \"TAP_COMMS_DIR configured\",\n passed:\n (entry.env as Record<string, unknown>).TAP_COMMS_DIR ===\n ctx.commsDir.replace(/\\\\/g, \"/\"),\n message: `Expected ${ctx.commsDir.replace(/\\\\/g, \"/\")}`,\n });\n }\n\n return checks;\n}\n\nexport const geminiAdapter: RuntimeAdapter = {\n runtime: \"gemini\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n const configPath = chooseGeminiConfigPath(ctx);\n const configExists = fs.existsSync(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"gemini\", \"gemini.cmd\"] : [\"gemini\"],\n );\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Gemini CLI not found in PATH. Config can still be written, but runtime verification will be limited.\",\n );\n }\n\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(`Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`);\n }\n\n const managed = buildManagedMcpServerSpec(ctx);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n return {\n installed: true,\n configPath,\n configExists,\n runtimeCommand: runtimeProbe.command,\n version: runtimeProbe.version,\n canWrite: canWriteOrCreate(configPath),\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? chooseGeminiConfigPath(ctx);\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts: OwnedArtifact[] = [\n { kind: \"json-path\", path: configPath, selector: GEMINI_SELECTOR },\n ];\n\n if (probe.configExists) {\n try {\n const config = readJsonFile(configPath);\n if (readNestedKey(config, GEMINI_SELECTOR) !== undefined) {\n conflicts.push(`Existing ${GEMINI_SELECTOR} entry will be updated.`);\n }\n } catch {\n warnings.push(`${configPath} exists but is not valid JSON. It will be replaced.`);\n }\n }\n\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: GEMINI_SELECTOR,\n });\n\n return {\n runtime: \"gemini\",\n operations,\n ownedArtifacts,\n backupDir: ensureBackupDir(ctx.stateDir, \"gemini\"),\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const configPath = plan.operations[0]?.path ?? chooseGeminiConfigPath(ctx);\n const warnings: string[] = [];\n const changedFiles: string[] = [];\n const managed = buildManagedMcpServerSpec(ctx);\n\n warnings.push(...managed.warnings);\n if (managed.issues.length > 0 || !managed.command) {\n return {\n success: false,\n appliedOps: 0,\n backupCreated: false,\n lastAppliedHash: \"\",\n ownedArtifacts: [],\n changedFiles,\n restartRequired: false,\n warnings: [...managed.warnings, ...managed.issues],\n };\n }\n\n let config: Record<string, unknown> = {};\n let previousValue: unknown = undefined;\n\n if (fs.existsSync(configPath)) {\n if (fs.readFileSync(configPath, \"utf-8\").trim()) {\n backupFile(configPath, plan.backupDir);\n }\n try {\n config = readJsonFile(configPath);\n } catch {\n warnings.push(`${configPath} was invalid JSON. Created backup and starting fresh.`);\n config = {};\n }\n previousValue = readNestedKey(config, GEMINI_SELECTOR);\n }\n\n const artifact = plan.ownedArtifacts[0];\n const backupPath = artifactBackupPath(plan.backupDir, artifact.kind, artifact.selector);\n writeArtifactBackup(backupPath, {\n kind: \"json-path\",\n selector: artifact.selector,\n existed: previousValue !== undefined,\n value: previousValue,\n });\n\n setNestedKey(config, GEMINI_SELECTOR, {\n command: managed.command,\n args: managed.args,\n env: managed.env,\n });\n\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n const tmp = `${configPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, configPath);\n changedFiles.push(configPath);\n\n return {\n success: true,\n appliedOps: plan.operations.length,\n backupCreated: true,\n lastAppliedHash: fileHash(configPath),\n ownedArtifacts: [{ ...artifact, backupPath }],\n changedFiles,\n restartRequired: true,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const warnings: string[] = [];\n const configPath = plan.operations[0]?.path ?? chooseGeminiConfigPath(ctx);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"gemini\", \"gemini.cmd\"] : [\"gemini\"],\n );\n\n let checks: VerifyCheck[];\n try {\n const config = readJsonFile(configPath);\n checks = verifyGeminiConfig(config, configPath, ctx);\n } catch {\n checks = [\n {\n name: \"Gemini config is valid JSON\",\n passed: false,\n message: \"Parse error\",\n },\n ];\n }\n\n checks.push({\n name: \"Gemini CLI found\",\n passed: !!runtimeProbe.command,\n message: runtimeProbe.command ? undefined : \"gemini not in PATH (non-blocking)\",\n });\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Gemini CLI not in PATH. Config is written, but runtime verification is partial.\",\n );\n }\n\n return {\n ok: checks.filter((check) => check.name !== \"Gemini CLI found\").every((check) => check.passed),\n checks,\n restartRequired: true,\n warnings,\n };\n },\n\n bridgeMode(): BridgeMode {\n return \"polling\";\n },\n};\n","import type { RuntimeAdapter, RuntimeName } from \"../types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { geminiAdapter } from \"./gemini.js\";\n\nconst adapters: Partial<Record<RuntimeName, RuntimeAdapter>> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n gemini: geminiAdapter,\n};\n\nexport function getAdapter(runtime: RuntimeName): RuntimeAdapter {\n const adapter = adapters[runtime];\n if (!adapter) {\n throw new Error(\n `Adapter for \"${runtime}\" is not yet available. ` +\n `Supported: ${Object.keys(adapters).join(\", \")}`,\n );\n }\n return adapter;\n}\n\nexport function listAdapters(): RuntimeName[] {\n return Object.keys(adapters) as RuntimeName[];\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn, execSync } from \"node:child_process\";\nimport type {\n RuntimeName,\n InstanceId,\n BridgeState,\n HeadlessConfig,\n Platform,\n} from \"../types.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\n\nexport interface BridgeStartOptions {\n instanceId: InstanceId;\n runtime: RuntimeName;\n stateDir: string;\n commsDir: string;\n bridgeScript: string;\n platform: Platform;\n agentName?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n repoRoot?: string;\n port?: number;\n /** Headless configuration. Passed as env vars to the bridge process. */\n headless?: HeadlessConfig | null;\n /** Bridge script operational flags (forwarded to codex-app-server-bridge.ts) */\n busyMode?: \"steer\" | \"wait\";\n pollSeconds?: number;\n reconnectSeconds?: number;\n messageLookbackMinutes?: number;\n threadId?: string;\n ephemeral?: boolean;\n processExistingMessages?: boolean;\n}\n\nexport interface BridgeStopOptions {\n instanceId: InstanceId;\n stateDir: string;\n platform: Platform;\n}\n\nfunction pidFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"pids\", `bridge-${instanceId}.json`);\n}\n\nfunction logFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"logs\", `bridge-${instanceId}.log`);\n}\n\nexport function loadBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n): BridgeState | null {\n const pidPath = pidFilePath(stateDir, instanceId);\n if (!fs.existsSync(pidPath)) return null;\n\n try {\n const raw = fs.readFileSync(pidPath, \"utf-8\");\n return JSON.parse(raw) as BridgeState;\n } catch {\n return null;\n }\n}\n\nexport function saveBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n state: BridgeState,\n): void {\n const pidPath = pidFilePath(stateDir, instanceId);\n fs.mkdirSync(path.dirname(pidPath), { recursive: true });\n const tmp = `${pidPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(state, null, 2), \"utf-8\");\n fs.renameSync(tmp, pidPath);\n}\n\nexport function clearBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const pidPath = pidFilePath(stateDir, instanceId);\n if (fs.existsSync(pidPath)) {\n fs.unlinkSync(pidPath);\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isBridgeRunning(\n stateDir: string,\n instanceId: InstanceId,\n): boolean {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return false;\n return isProcessAlive(state.pid);\n}\n\nexport async function startBridge(\n options: BridgeStartOptions,\n): Promise<BridgeState> {\n const {\n instanceId,\n runtime,\n stateDir,\n commsDir,\n bridgeScript,\n agentName,\n port,\n } = options;\n\n // Resolve agent name: explicit > env > error\n const resolvedAgent =\n agentName || process.env.TAP_AGENT_NAME || process.env.CODEX_TAP_AGENT_NAME;\n\n if (!resolvedAgent) {\n throw new Error(\n `No agent name for ${instanceId} bridge. ` +\n `Set TAP_AGENT_NAME env var or pass --agent-name flag.`,\n );\n }\n\n // Check if already running\n if (isBridgeRunning(stateDir, instanceId)) {\n const existing = loadBridgeState(stateDir, instanceId)!;\n throw new Error(\n `Bridge for ${instanceId} is already running (PID: ${existing.pid})`,\n );\n }\n\n // Clear stale PID\n clearBridgeState(stateDir, instanceId);\n\n const logPath = logFilePath(stateDir, instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n\n // Log rotation: rename existing log to .prev\n rotateLog(logPath);\n\n const logFd = fs.openSync(logPath, \"a\");\n\n // Use explicit repoRoot (not derived from stateDir — stateDir may be external)\n const repoRoot = options.repoRoot ?? path.resolve(stateDir, \"..\");\n const resolved = resolveNodeRuntime(\n options.runtimeCommand ?? \"node\",\n repoRoot,\n );\n const command = resolved.command;\n\n // Build env with fnm Node prepended to PATH so the bridge runner's\n // 2nd-stage spawn also finds the correct Node (결 finding: 2-stage spawn)\n const runtimeEnv = buildRuntimeEnv(repoRoot);\n\n // Spawn detached process — pass both command and strip-types metadata\n // so the runner doesn't re-guess (avoids bun + --experimental-strip-types)\n const child = spawn(command, [bridgeScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: {\n ...runtimeEnv,\n TAP_COMMS_DIR: commsDir,\n TAP_BRIDGE_RUNTIME: runtime,\n TAP_BRIDGE_INSTANCE_ID: instanceId,\n TAP_AGENT_NAME: resolvedAgent,\n CODEX_TAP_AGENT_NAME: resolvedAgent,\n TAP_RESOLVED_NODE: resolved.command,\n TAP_STRIP_TYPES: resolved.supportsStripTypes ? \"1\" : \"0\",\n ...(options.appServerUrl\n ? { CODEX_APP_SERVER_URL: options.appServerUrl }\n : {}),\n ...(port != null ? { TAP_BRIDGE_PORT: String(port) } : {}),\n ...(options.headless?.enabled\n ? {\n TAP_HEADLESS: \"true\",\n TAP_AGENT_ROLE: options.headless.role,\n TAP_MAX_REVIEW_ROUNDS: String(options.headless.maxRounds),\n TAP_QUALITY_FLOOR: options.headless.qualitySeverityFloor,\n }\n : {}),\n // Bridge script operational flags\n ...(options.busyMode ? { TAP_BUSY_MODE: options.busyMode } : {}),\n ...(options.pollSeconds != null\n ? { TAP_POLL_SECONDS: String(options.pollSeconds) }\n : {}),\n ...(options.reconnectSeconds != null\n ? { TAP_RECONNECT_SECONDS: String(options.reconnectSeconds) }\n : {}),\n ...(options.messageLookbackMinutes != null\n ? {\n TAP_MESSAGE_LOOKBACK_MINUTES: String(\n options.messageLookbackMinutes,\n ),\n }\n : {}),\n ...(options.threadId ? { TAP_THREAD_ID: options.threadId } : {}),\n ...(options.ephemeral ? { TAP_EPHEMERAL: \"true\" } : {}),\n ...(options.processExistingMessages\n ? { TAP_PROCESS_EXISTING: \"true\" }\n : {}),\n },\n });\n\n child.unref();\n fs.closeSync(logFd);\n\n if (!child.pid) {\n throw new Error(`Failed to spawn bridge process for ${instanceId}`);\n }\n\n const state: BridgeState = {\n pid: child.pid,\n statePath: pidFilePath(stateDir, instanceId),\n lastHeartbeat: new Date().toISOString(),\n };\n\n saveBridgeState(stateDir, instanceId, state);\n\n // NOTE: Heartbeat updates are the bridge process's responsibility.\n // The bridge script should periodically write to the PID file's lastHeartbeat field.\n // CLI only records the initial heartbeat at spawn time.\n\n return state;\n}\n\nexport async function stopBridge(options: BridgeStopOptions): Promise<boolean> {\n const { instanceId, stateDir, platform } = options;\n const state = loadBridgeState(stateDir, instanceId);\n\n if (!state) {\n return false; // No PID file\n }\n\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return false; // Already dead\n }\n\n try {\n if (platform === \"win32\") {\n // Windows: use taskkill\n execSync(`taskkill /PID ${state.pid} /F /T`, { stdio: \"pipe\" });\n } else {\n // Unix: SIGTERM\n process.kill(state.pid, \"SIGTERM\");\n\n // Give it a moment, then SIGKILL if needed\n await new Promise((resolve) => setTimeout(resolve, 2000));\n if (isProcessAlive(state.pid)) {\n process.kill(state.pid, \"SIGKILL\");\n }\n }\n } catch {\n // Process may have already exited\n }\n\n clearBridgeState(stateDir, instanceId);\n return true;\n}\n\n// ─── Log rotation ──────────────────────────────────────────────\n\nexport function rotateLog(logPath: string): void {\n if (!fs.existsSync(logPath)) return;\n try {\n const stats = fs.statSync(logPath);\n if (stats.size === 0) return;\n const prevPath = `${logPath}.prev`;\n fs.renameSync(logPath, prevPath);\n } catch {\n // Best-effort: don't fail bridge start if rotation fails\n }\n}\n\n// ─── Heartbeat ─────────────────────────────────────────────────\n\n/**\n * Update the heartbeat timestamp for a running bridge.\n * Bridge processes should call this periodically.\n *\n * Only the owning process (matching PID) can update the heartbeat.\n * This prevents state dir collision when multiple writers exist.\n * See: 묵 finding — bridge-heartbeat-state-dir-collision\n */\nexport function updateBridgeHeartbeat(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return;\n\n // Guard: only the owning process may update heartbeat\n if (state.pid !== process.pid) return;\n\n state.lastHeartbeat = new Date().toISOString();\n saveBridgeState(stateDir, instanceId, state);\n}\n\n/**\n * Get heartbeat age in seconds. Returns null if no state or no heartbeat.\n */\nexport function getHeartbeatAge(\n stateDir: string,\n instanceId: InstanceId,\n): number | null {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state?.lastHeartbeat) return null;\n const heartbeatTime = new Date(state.lastHeartbeat).getTime();\n if (isNaN(heartbeatTime)) return null;\n return Math.floor((Date.now() - heartbeatTime) / 1000);\n}\n\nexport function getBridgeStatus(\n stateDir: string,\n instanceId: InstanceId,\n): \"running\" | \"stopped\" | \"stale\" {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return \"stopped\";\n\n // Primary check: is the process actually alive?\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return \"stale\";\n }\n\n // Process is alive → running.\n // Heartbeat staleness is informational only — the bridge process\n // is responsible for updating lastHeartbeat. If it doesn't,\n // PID alive is still the authoritative signal.\n return \"running\";\n}\n","/**\n * Common Node.js runtime resolver for all tap-comms child processes.\n *\n * Resolution chain:\n * .node-version + fnm probe → configured command → tsx fallback\n *\n * Extracted from codex-bridge-runner.ts (M69) to share across:\n * - bridge engine spawn\n * - bridge runner spawn\n * - future CLI commands\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport type RuntimeSource = \"fnm\" | \"config\" | \"path\" | \"tsx-fallback\" | \"bun\";\n\nexport interface ResolvedRuntime {\n /** Absolute path or command name for the resolved runtime. */\n command: string;\n /** Whether --experimental-strip-types is supported and should be used. */\n supportsStripTypes: boolean;\n /** Where the runtime was resolved from (for diagnostics). */\n source: RuntimeSource;\n /** Detected major version, if available. */\n majorVersion: number | null;\n}\n\n// ─── .node-version ─────────────────────────────────────────────\n\nexport function readNodeVersion(repoRoot: string): string | null {\n const nvFile = path.join(repoRoot, \".node-version\");\n if (!fs.existsSync(nvFile)) return null;\n try {\n const raw = fs.readFileSync(nvFile, \"utf-8\").trim();\n return raw.length > 0 ? raw.replace(/^v/, \"\") : null;\n } catch {\n return null;\n }\n}\n\n// ─── fnm probe ─────────────────────────────────────────────────\n\nfunction fnmCandidateDirs(): string[] {\n if (process.platform === \"win32\") {\n return [\n process.env.FNM_DIR,\n process.env.APPDATA ? path.join(process.env.APPDATA, \"fnm\") : null,\n process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, \"fnm\")\n : null,\n process.env.USERPROFILE\n ? path.join(process.env.USERPROFILE, \"scoop\", \"persist\", \"fnm\")\n : null,\n ].filter(Boolean) as string[];\n }\n // macOS / Linux\n return [\n process.env.FNM_DIR,\n process.env.HOME\n ? path.join(process.env.HOME, \".local\", \"share\", \"fnm\")\n : null,\n process.env.HOME ? path.join(process.env.HOME, \".fnm\") : null,\n process.env.XDG_DATA_HOME\n ? path.join(process.env.XDG_DATA_HOME, \"fnm\")\n : null,\n ].filter(Boolean) as string[];\n}\n\nfunction nodeExecutableName(): string {\n return process.platform === \"win32\" ? \"node.exe\" : \"node\";\n}\n\nexport function probeFnmNode(desiredVersion: string): string | null {\n const dirs = fnmCandidateDirs();\n const exe = nodeExecutableName();\n\n for (const baseDir of dirs) {\n const candidate = path.join(\n baseDir,\n \"node-versions\",\n `v${desiredVersion}`,\n \"installation\",\n exe,\n );\n if (!fs.existsSync(candidate)) continue;\n\n try {\n const v = execSync(`\"${candidate}\" --version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (v.startsWith(`v${desiredVersion.split(\".\")[0]}.`)) {\n return candidate;\n }\n } catch {\n // candidate exists but doesn't work — skip\n }\n }\n\n return null;\n}\n\n// ─── Version detection ─────────────────────────────────────────\n\nexport function detectNodeMajorVersion(command: string): number | null {\n try {\n const version = execSync(`\"${command}\" --version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const match = version.match(/^v?(\\d+)\\./);\n return match ? parseInt(match[1], 10) : null;\n } catch {\n return null;\n }\n}\n\nexport function checkStripTypesSupport(command: string): boolean {\n const major = detectNodeMajorVersion(command);\n if (major !== null && major >= 22) return true;\n try {\n execSync(`\"${command}\" --experimental-strip-types -e \"\"`, {\n timeout: 5000,\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\n// ─── tsx fallback ──────────────────────────────────────────────\n\nexport function findTsxFallback(repoRoot: string): string | null {\n const candidates = [\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx.exe\"),\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx.CMD\"),\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx\"),\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n return null;\n}\n\n// ─── fnm bin directory (for PATH prepending) ───────────────────\n\n/**\n * Returns the directory containing the fnm-managed node binary,\n * suitable for prepending to PATH in child processes.\n */\nexport function getFnmBinDir(repoRoot: string): string | null {\n const desiredVersion = readNodeVersion(repoRoot);\n if (!desiredVersion) return null;\n\n const nodePath = probeFnmNode(desiredVersion);\n if (!nodePath) return null;\n\n return path.dirname(nodePath);\n}\n\n// ─── Main resolver ─────────────────────────────────────────────\n\n/**\n * Resolve the Node.js runtime to use for spawning child processes.\n *\n * Priority: bun passthrough → .node-version + fnm → configured command → tsx fallback\n */\nexport function resolveNodeRuntime(\n configCommand: string,\n repoRoot: string,\n): ResolvedRuntime {\n // Bun: native TS support, no strip-types needed\n if (configCommand === \"bun\" || configCommand.endsWith(\"bun.exe\")) {\n return {\n command: configCommand,\n supportsStripTypes: false,\n source: \"bun\",\n majorVersion: null,\n };\n }\n\n // .node-version + fnm discovery\n const desiredVersion = readNodeVersion(repoRoot);\n if (desiredVersion) {\n const fnmNode = probeFnmNode(desiredVersion);\n if (fnmNode) {\n const major = detectNodeMajorVersion(fnmNode);\n return {\n command: fnmNode,\n supportsStripTypes: checkStripTypesSupport(fnmNode),\n source: \"fnm\",\n majorVersion: major,\n };\n }\n }\n\n // Configured command (from config or PATH)\n const major = detectNodeMajorVersion(configCommand);\n if (major !== null) {\n return {\n command: configCommand,\n supportsStripTypes: checkStripTypesSupport(configCommand),\n source: major === detectNodeMajorVersion(\"node\") ? \"path\" : \"config\",\n majorVersion: major,\n };\n }\n\n // tsx fallback\n const tsx = findTsxFallback(repoRoot);\n if (tsx) {\n return {\n command: tsx,\n supportsStripTypes: false,\n source: \"tsx-fallback\",\n majorVersion: null,\n };\n }\n\n // Last resort\n return {\n command: configCommand,\n supportsStripTypes: false,\n source: \"path\",\n majorVersion: null,\n };\n}\n\n// ─── Env builder for child processes ───────────────────────────\n\n/**\n * Build an env object with fnm Node prepended to PATH.\n * Use this when spawning child processes that need the correct Node.\n */\nexport function buildRuntimeEnv(\n repoRoot: string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const fnmBin = getFnmBinDir(repoRoot);\n if (!fnmBin) return { ...baseEnv };\n\n const pathKey = process.platform === \"win32\" ? \"Path\" : \"PATH\";\n const currentPath = baseEnv[pathKey] ?? baseEnv.PATH ?? \"\";\n\n return {\n ...baseEnv,\n [pathKey]: `${fnmBin}${path.delimiter}${currentPath}`,\n };\n}\n","import {\n loadState,\n saveState,\n updateInstanceState,\n ensureBackupDir,\n} from \"../state.js\";\nimport {\n findRepoRoot,\n isValidRuntime,\n createAdapterContext,\n parseArgs,\n buildInstanceId,\n findPortConflict,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport { startBridge } from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport type {\n RuntimeName,\n BridgeState,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n} from \"../types.js\";\n\nexport async function addCommand(args: string[]): Promise<CommandResult> {\n const { positional, flags } = parseArgs(args);\n const runtimeArg = positional[0];\n\n if (!runtimeArg) {\n return {\n ok: false,\n command: \"add\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing runtime argument. Usage: npx @hua-labs/tap add <claude|codex|gemini> [--name <name>] [--port <port>] [--headless] [--role <role>]\",\n warnings: [],\n data: {},\n };\n }\n\n if (!isValidRuntime(runtimeArg)) {\n return {\n ok: false,\n command: \"add\",\n code: \"TAP_RUNTIME_UNKNOWN\",\n message: `Unknown runtime: ${runtimeArg}. Available: claude, codex, gemini`,\n warnings: [],\n data: {},\n };\n }\n\n const runtime: RuntimeName = runtimeArg;\n const instanceName =\n typeof flags[\"name\"] === \"string\" ? flags[\"name\"] : undefined;\n const instanceId = buildInstanceId(runtime, instanceName);\n const portStr = typeof flags[\"port\"] === \"string\" ? flags[\"port\"] : undefined;\n const port = portStr ? parseInt(portStr, 10) : null;\n const force = flags[\"force\"] === true;\n const headlessFlag = flags[\"headless\"] === true;\n const roleArg = typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : undefined;\n\n // Validate --role value\n const validRoles: AgentRole[] = [\"reviewer\", \"validator\", \"long-running\"];\n if (roleArg && !validRoles.includes(roleArg as AgentRole)) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid role: ${roleArg}. Available: ${validRoles.join(\", \")}`,\n warnings: [],\n data: {},\n };\n }\n\n // --headless requires --name (for instance isolation)\n if (headlessFlag && !instanceName) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: \"--headless requires --name for instance isolation\",\n warnings: [],\n data: {},\n };\n }\n\n // Build headless config\n const headless: HeadlessConfig | null = headlessFlag\n ? {\n enabled: true,\n role: (roleArg as AgentRole) ?? \"reviewer\",\n maxRounds: 5,\n qualitySeverityFloor: \"high\",\n }\n : null;\n\n if (portStr && (port === null || isNaN(port))) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid port: ${portStr}`,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n if (state.instances[instanceId]?.installed && !force) {\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NO_OP\",\n message: `${instanceId} is already installed. Use --force to re-install.`,\n warnings: [],\n data: {},\n };\n }\n\n // Port conflict check\n if (port !== null) {\n const conflict = findPortConflict(state, port, instanceId);\n if (conflict) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_PORT_CONFLICT\",\n message: `Port ${port} is already used by instance \"${conflict}\".`,\n warnings: [],\n data: { conflictingInstance: conflict },\n };\n }\n }\n\n logHeader(`@hua-labs/tap add ${instanceId}`);\n if (instanceName) log(`Instance name: ${instanceName}`);\n if (port !== null) log(`Port: ${port}`);\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const adapter = getAdapter(runtime);\n const warnings: string[] = [];\n\n // 1. Probe\n log(\"Probing runtime...\");\n const probe = await adapter.probe(ctx);\n\n if (!probe.installed) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_RUNTIME_NOT_FOUND\",\n message: `${runtime} runtime not found.`,\n warnings: probe.warnings,\n data: { issues: probe.issues },\n };\n }\n\n logSuccess(`Found ${runtime} (${probe.runtimeCommand ?? \"unknown\"})`);\n if (probe.configPath) log(`Config: ${probe.configPath}`);\n warnings.push(...probe.warnings);\n for (const w of probe.warnings) logWarn(w);\n\n // 2. Plan\n log(\"Planning patches...\");\n const plan = await adapter.plan(ctx, probe);\n warnings.push(...plan.warnings);\n\n if (plan.conflicts.length > 0) {\n logWarn(\"Conflicts detected:\");\n for (const c of plan.conflicts) logWarn(` ${c}`);\n }\n\n log(`Operations: ${plan.operations.length}`);\n log(`Artifacts: ${plan.ownedArtifacts.length}`);\n for (const w of plan.warnings) logWarn(w);\n\n // 3. Check for no-op plan\n if (plan.operations.length === 0) {\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NO_OP\",\n message: \"No operations to apply. Runtime not configured.\",\n warnings,\n data: { planOps: 0 },\n };\n }\n\n // 4. Backup\n const backupDir = ensureBackupDir(ctx.stateDir, instanceId);\n log(`Backup dir: ${backupDir}`);\n\n // 5. Apply\n log(\"Applying patches...\");\n const result = await adapter.apply(ctx, plan);\n warnings.push(...result.warnings);\n\n if (!result.success) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_PATCH_FAILED\",\n message: \"Failed to apply patches.\",\n warnings,\n data: { appliedOps: result.appliedOps },\n };\n }\n\n logSuccess(`Applied ${result.appliedOps} operation(s)`);\n for (const f of result.changedFiles) logSuccess(`Modified: ${f}`);\n for (const w of result.warnings) logWarn(w);\n\n // 6. Verify\n log(\"Verifying...\");\n const verify = await adapter.verify(ctx, plan);\n warnings.push(...verify.warnings);\n\n for (const check of verify.checks) {\n if (check.passed) {\n logSuccess(`${check.name}`);\n } else {\n logError(`${check.name}: ${check.message ?? \"failed\"}`);\n }\n }\n\n if (!verify.ok) {\n logWarn(\n \"Verification had failures. Runtime may need manual configuration.\",\n );\n }\n\n // 7. Start bridge if needed (app-server mode only)\n let bridge: BridgeState | null = null;\n const mode = adapter.bridgeMode();\n\n if (mode === \"app-server\") {\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n if (!bridgeScript) {\n logWarn(\"Bridge script not found. Bridge not started.\");\n warnings.push(\"Bridge script not found. Run bridge manually.\");\n } else {\n const agentNameEnv =\n process.env.TAP_AGENT_NAME || process.env.CODEX_TAP_AGENT_NAME;\n if (!agentNameEnv) {\n logWarn(\n \"No agent name set (TAP_AGENT_NAME). Bridge not started. \" +\n \"Use: npx @hua-labs/tap bridge start <instance> --agent-name <name>\",\n );\n warnings.push(\"Bridge not auto-started: no agent name available.\");\n } else {\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n log(`Starting bridge: ${bridgeScript}`);\n try {\n bridge = await startBridge({\n instanceId,\n runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: agentNameEnv,\n runtimeCommand: resolvedCfg.runtimeCommand,\n appServerUrl: resolvedCfg.appServerUrl,\n repoRoot,\n port: port ?? undefined,\n headless,\n });\n logSuccess(`Bridge started (PID: ${bridge.pid})`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logWarn(`Bridge not started: ${msg}`);\n warnings.push(`Bridge not started: ${msg}`);\n }\n }\n }\n }\n\n // 8. Save state\n const instanceState = {\n instanceId,\n runtime,\n agentName: null,\n port,\n installed: true,\n configPath: probe.configPath ?? \"\",\n bridgeMode: mode,\n restartRequired: result.restartRequired,\n ownedArtifacts: result.ownedArtifacts,\n backupPath: backupDir,\n lastAppliedHash: result.lastAppliedHash,\n lastVerifiedAt: verify.ok ? new Date().toISOString() : null,\n bridge,\n headless,\n warnings: [...result.warnings, ...verify.warnings],\n };\n\n const newState = updateInstanceState(state, instanceId, instanceState);\n saveState(repoRoot, newState);\n logSuccess(\"State saved\");\n\n if (result.restartRequired) {\n logWarn(`Restart ${runtime} to pick up the new configuration.`);\n }\n\n logHeader(\"Done!\");\n\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_ADD_OK\",\n message: `${instanceId} configured`,\n warnings,\n data: {\n appliedOps: result.appliedOps,\n restartRequired: result.restartRequired,\n changedFiles: result.changedFiles,\n verified: verify.ok,\n },\n };\n}\n","import { loadState, saveState, getInstalledInstances } from \"../state.js\";\nimport { isBridgeRunning } from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { findRepoRoot, log, logHeader, logWarn } from \"../utils.js\";\nimport type { InstanceState, CommandResult } from \"../types.js\";\n\nfunction resolveStatus(inst: InstanceState, stateDir: string): string {\n if (!inst.installed) return \"not installed\";\n\n switch (inst.bridgeMode) {\n case \"native-push\":\n case \"polling\":\n return inst.lastVerifiedAt ? \"active\" : \"configured\";\n\n case \"app-server\":\n if (inst.bridge && isBridgeRunning(stateDir, inst.instanceId)) {\n return \"active\";\n }\n // Clear stale bridge metadata if process is dead\n if (inst.bridge) {\n inst.bridge = null;\n }\n return inst.lastVerifiedAt ? \"configured\" : \"installed\";\n\n default:\n return \"installed\";\n }\n}\n\nfunction instanceStatusLine(inst: InstanceState, status: string): string {\n const bridgeInfo = inst.bridge ? ` (pid: ${inst.bridge.pid})` : \"\";\n const mode = inst.bridgeMode;\n const portStr = inst.port ? ` port:${inst.port}` : \"\";\n const restart = inst.restartRequired ? \" [restart required]\" : \"\";\n const warns =\n inst.warnings.length > 0 ? ` [${inst.warnings.length} warning(s)]` : \"\";\n\n return `${inst.instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${status.padEnd(14)} ${mode.padEnd(14)}${bridgeInfo}${portStr}${restart}${warns}`;\n}\n\nexport async function statusCommand(_args: string[]): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"status\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n logHeader(\"@hua-labs/tap status\");\n\n log(`Version: ${state.packageVersion}`);\n log(`Comms dir: ${state.commsDir}`);\n log(`Repo root: ${state.repoRoot}`);\n log(`Schema: v${state.schemaVersion}`);\n log(`Updated: ${state.updatedAt}`);\n\n const installed = getInstalledInstances(state);\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n\n const instances: Record<\n string,\n {\n status: string;\n runtime: string;\n bridgeMode: string;\n bridge: unknown;\n port: number | null;\n warnings: string[];\n }\n > = {};\n\n // Track if any stale bridge metadata was cleaned\n const bridgesBefore = installed.map((id) => state.instances[id]?.bridge);\n\n if (installed.length === 0) {\n log(\"\");\n log(\"No instances installed.\");\n log(\"Run: npx @hua-labs/tap add <claude|codex|gemini>\");\n } else {\n log(\"\");\n log(\n `${\"Instance\".padEnd(20)} ${\"Runtime\".padEnd(8)} ${\"Status\".padEnd(14)} ${\"Bridge Mode\".padEnd(14)} Details`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(14)} ${\"─\".repeat(14)} ${\"─\".repeat(20)}`,\n );\n\n for (const id of installed) {\n const inst = state.instances[id];\n if (inst) {\n // resolveStatus may clear inst.bridge if stale\n const status = resolveStatus(inst, stateDir);\n log(instanceStatusLine(inst, status));\n if (inst.warnings.length > 0) {\n for (const w of inst.warnings) {\n logWarn(` ${w}`);\n }\n }\n instances[id] = {\n status,\n runtime: inst.runtime,\n bridgeMode: inst.bridgeMode,\n bridge: inst.bridge,\n port: inst.port,\n warnings: inst.warnings,\n };\n }\n }\n }\n\n // Persist stale bridge cleanup if any were cleared\n const bridgesAfter = installed.map((id) => state.instances[id]?.bridge);\n const staleCleared = bridgesBefore.some((b, i) => b !== bridgesAfter[i]);\n if (staleCleared) {\n state.updatedAt = new Date().toISOString();\n saveState(repoRoot, state);\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"status\",\n code: \"TAP_STATUS_OK\",\n message: `${installed.length} instance(s) installed`,\n warnings: [],\n data: {\n version: state.packageVersion,\n commsDir: state.commsDir,\n repoRoot: state.repoRoot,\n instances,\n },\n };\n}\n","import * as fs from \"node:fs\";\nimport { readArtifactBackup } from \"../artifact-backups.js\";\nimport {\n extractTomlTable,\n removeTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport type { InstanceId, InstanceState, OwnedArtifact } from \"../types.js\";\n\nexport interface RollbackResult {\n success: boolean;\n restoredCount: number;\n restoredFiles: string[];\n errors: string[];\n}\n\n/**\n * Roll back only the artifacts the runtime owns, restoring prior table/key\n * content when selector backups are available.\n */\nexport async function rollbackRuntime(\n _instanceId: InstanceId,\n runtimeState: InstanceState,\n): Promise<RollbackResult> {\n const errors: string[] = [];\n const restoredFiles: string[] = [];\n let restoredCount = 0;\n\n for (const artifact of runtimeState.ownedArtifacts) {\n try {\n const result = rollbackArtifact(artifact);\n if (result.restored) {\n restoredCount++;\n restoredFiles.push(artifact.path);\n }\n if (result.error) {\n errors.push(result.error);\n }\n } catch (err) {\n errors.push(\n `Failed to rollback ${artifact.path}#${artifact.selector}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return {\n success: errors.length === 0,\n restoredCount,\n restoredFiles,\n errors,\n };\n}\n\ninterface ArtifactRollbackResult {\n restored: boolean;\n error?: string;\n}\n\nfunction rollbackArtifact(artifact: OwnedArtifact): ArtifactRollbackResult {\n if (!fs.existsSync(artifact.path)) {\n return { restored: false, error: `File not found: ${artifact.path}` };\n }\n\n switch (artifact.kind) {\n case \"json-path\":\n return rollbackJsonPath(artifact);\n case \"toml-table\":\n return rollbackTomlTable(artifact);\n case \"file\":\n return rollbackFile(artifact);\n default:\n return {\n restored: false,\n error: `Unknown artifact kind: ${artifact.kind}`,\n };\n }\n}\n\nfunction rollbackJsonPath(artifact: OwnedArtifact): ArtifactRollbackResult {\n const raw = fs.readFileSync(artifact.path, \"utf-8\");\n let config: Record<string, unknown>;\n\n try {\n config = JSON.parse(raw);\n } catch {\n return { restored: false, error: `Invalid JSON: ${artifact.path}` };\n }\n\n const backup = artifact.backupPath\n ? readArtifactBackup(artifact.backupPath)\n : null;\n if (backup?.kind === \"json-path\" && backup.selector === artifact.selector) {\n if (backup.existed) {\n setNestedKey(config, artifact.selector, backup.value);\n } else {\n deleteNestedKey(config, artifact.selector);\n cleanEmptyParents(config, artifact.selector);\n }\n } else {\n const removed = deleteNestedKey(config, artifact.selector);\n if (!removed) {\n return {\n restored: false,\n error: `Key not found: ${artifact.selector} in ${artifact.path}`,\n };\n }\n cleanEmptyParents(config, artifact.selector);\n }\n\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n}\n\nfunction rollbackTomlTable(artifact: OwnedArtifact): ArtifactRollbackResult {\n const content = fs.readFileSync(artifact.path, \"utf-8\");\n const backup = artifact.backupPath\n ? readArtifactBackup(artifact.backupPath)\n : null;\n\n if (backup?.kind === \"toml-table\" && backup.selector === artifact.selector) {\n const nextContent = backup.existed\n ? replaceTomlTable(content, artifact.selector, backup.content ?? \"\")\n : removeTomlTable(content, artifact.selector);\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, nextContent, \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n }\n\n if (!extractTomlTable(content, artifact.selector)) {\n return {\n restored: false,\n error: `TOML table not found: ${artifact.selector}`,\n };\n }\n\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, removeTomlTable(content, artifact.selector), \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n}\n\nfunction rollbackFile(artifact: OwnedArtifact): ArtifactRollbackResult {\n if (fs.existsSync(artifact.path)) {\n fs.unlinkSync(artifact.path);\n return { restored: true };\n }\n return { restored: false, error: `File not found: ${artifact.path}` };\n}\n\nfunction deleteNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n): boolean {\n const keys = keyPath.split(\".\");\n let current = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n return false;\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (!(lastKey in current)) return false;\n delete current[lastKey];\n return true;\n}\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n}\n\nfunction cleanEmptyParents(\n obj: Record<string, unknown>,\n keyPath: string,\n): void {\n const keys = keyPath.split(\".\");\n for (let depth = keys.length - 2; depth >= 0; depth--) {\n let current = obj;\n for (let i = 0; i < depth; i++) {\n current = current[keys[i]] as Record<string, unknown>;\n if (!current) return;\n }\n\n const key = keys[depth];\n const value = current[key];\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.keys(value).length === 0\n ) {\n delete current[key];\n }\n }\n}\n","import { loadState, saveState, removeInstanceState } from \"../state.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { rollbackRuntime } from \"../engine/rollback.js\";\nimport { stopBridge } from \"../engine/bridge.js\";\nimport type { CommandResult } from \"../types.js\";\n\nexport async function removeCommand(args: string[]): Promise<CommandResult> {\n const identifier = args.find((a) => !a.startsWith(\"-\"));\n\n if (!identifier) {\n return {\n ok: false,\n command: \"remove\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance argument. Usage: npx @hua-labs/tap remove <instance>\",\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"remove\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"remove\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const instance = state.instances[instanceId];\n\n if (!instance?.installed) {\n return {\n ok: true,\n command: \"remove\",\n instanceId,\n code: \"TAP_NO_OP\",\n message: `${instanceId} is not installed.`,\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap remove ${instanceId}`);\n\n // Stop bridge if running before rollback\n if (instance.bridge) {\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const stopped = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n if (stopped) {\n logSuccess(`Bridge for ${instanceId} stopped`);\n } else {\n log(`No running bridge for ${instanceId}`);\n }\n }\n\n const result = await rollbackRuntime(instanceId, instance);\n\n if (result.success) {\n logSuccess(`Rolled back ${result.restoredCount} artifact(s)`);\n for (const f of result.restoredFiles) logSuccess(`Restored: ${f}`);\n\n const newState = removeInstanceState(state, instanceId);\n saveState(repoRoot, newState);\n logSuccess(\"State updated\");\n\n logHeader(\"Done!\");\n\n return {\n ok: true,\n command: \"remove\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_REMOVE_OK\",\n message: `${instanceId} removed successfully`,\n warnings: [],\n data: {\n restoredCount: result.restoredCount,\n restoredFiles: result.restoredFiles,\n },\n };\n }\n\n for (const e of result.errors) logError(e);\n\n return {\n ok: false,\n command: \"remove\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_ROLLBACK_FAILED\",\n message: \"Rollback had errors. State preserved for retry.\",\n warnings: result.errors,\n data: { restoredCount: result.restoredCount },\n };\n}\n","import * as path from \"node:path\";\nimport { loadState, saveState, updateInstanceState } from \"../state.js\";\nimport {\n startBridge,\n stopBridge,\n getBridgeStatus,\n loadBridgeState,\n getHeartbeatAge,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n parseArgs,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type {\n InstanceId,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n} from \"../types.js\";\n\nfunction formatAge(seconds: number): string {\n if (seconds < 60) return `${seconds}s ago`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m ago`;\n}\n\nconst BRIDGE_HELP = `\nUsage:\n tap-comms bridge <subcommand> [instance] [options]\n\nSubcommands:\n start <instance> Start bridge for an instance (e.g. codex, codex-reviewer)\n stop <instance> Stop bridge for an instance\n stop Stop all running bridges\n status Show bridge status for all instances\n status <instance> Show bridge status for a specific instance\n\nOptions:\n --agent-name <name> Agent identity for bridge (or set TAP_AGENT_NAME env)\n --busy-mode <steer|wait> How to handle active turns (default: steer)\n --poll-seconds <n> Inbox poll interval (default: 5)\n --reconnect-seconds <n> Reconnect delay after disconnect (default: 5)\n --message-lookback-minutes <n> Process messages from last N minutes (default: 10)\n --thread-id <id> Resume specific thread\n --ephemeral Use ephemeral thread (no persistence)\n --process-existing-messages Process all existing inbox messages\n\nExamples:\n npx @hua-labs/tap bridge start codex --agent-name myAgent\n npx @hua-labs/tap bridge start codex-reviewer --agent-name reviewer --busy-mode steer\n npx @hua-labs/tap bridge stop codex\n npx @hua-labs/tap bridge stop\n npx @hua-labs/tap bridge status\n`.trim();\n\n// ─── Subcommand: start ─────────────────────────────────────────\n\nasync function bridgeStart(\n identifier: string,\n agentName?: string,\n flags: Record<string, string | boolean | undefined> = {},\n): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const instance = state.instances[instanceId];\n\n if (!instance?.installed) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance?.runtime,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `${instanceId} is not installed. Run: npx @hua-labs/tap add ${instance?.runtime ?? identifier}`,\n warnings: [],\n data: {},\n };\n }\n\n const adapter = getAdapter(instance.runtime);\n const mode = adapter.bridgeMode();\n\n if (mode !== \"app-server\") {\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_NO_OP\",\n message: `${instanceId} uses ${mode} mode — no bridge needed.`,\n warnings: [],\n data: { bridgeMode: mode },\n };\n }\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n\n if (!bridgeScript) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_SCRIPT_MISSING\",\n message: `Bridge script not found for ${instanceId}. Ensure the runtime is properly configured.`,\n warnings: [],\n data: {},\n };\n }\n\n // Resolve runtime command + appServerUrl from config\n const { config: resolvedConfig } = resolveConfig({}, repoRoot);\n const runtimeCommand = resolvedConfig.runtimeCommand;\n const appServerUrl = resolvedConfig.appServerUrl;\n\n logHeader(`@hua-labs/tap bridge start ${instanceId}`);\n log(`Bridge script: ${bridgeScript}`);\n log(`Bridge mode: ${mode}`);\n log(`Runtime cmd: ${runtimeCommand}`);\n log(`App server: ${appServerUrl}`);\n if (instance.port) log(`Port: ${instance.port}`);\n // Show headless status from instance config or --headless flag (resolved below)\n const willBeHeadless =\n flags[\"headless\"] === true || instance.headless?.enabled;\n if (willBeHeadless) {\n const role =\n (typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : null) ??\n instance.headless?.role ??\n \"reviewer\";\n log(`Headless: ${role}`);\n }\n\n try {\n // Parse bridge operational flags from CLI\n\n // --busy-mode validation (PS1 parity: ValidateSet(\"wait\", \"steer\"))\n const busyModeRaw = flags[\"busy-mode\"];\n if (\n busyModeRaw !== undefined &&\n busyModeRaw !== \"steer\" &&\n busyModeRaw !== \"wait\"\n ) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid --busy-mode: ${String(busyModeRaw)}. Must be \"steer\" or \"wait\".`,\n warnings: [],\n data: {},\n };\n }\n const busyMode = busyModeRaw as \"steer\" | \"wait\" | undefined;\n const pollSeconds =\n typeof flags[\"poll-seconds\"] === \"string\"\n ? parseInt(flags[\"poll-seconds\"], 10)\n : undefined;\n const reconnectSeconds =\n typeof flags[\"reconnect-seconds\"] === \"string\"\n ? parseInt(flags[\"reconnect-seconds\"], 10)\n : undefined;\n const messageLookbackMinutes =\n typeof flags[\"message-lookback-minutes\"] === \"string\"\n ? parseInt(flags[\"message-lookback-minutes\"], 10)\n : undefined;\n const threadId =\n typeof flags[\"thread-id\"] === \"string\" ? flags[\"thread-id\"] : undefined;\n const ephemeral = flags[\"ephemeral\"] === true;\n const processExistingMessages = flags[\"process-existing-messages\"] === true;\n\n // --headless flag on bridge start: create ad-hoc headless config\n // even if instance wasn't created with `tap add --headless`\n const headlessFlag = flags[\"headless\"] === true;\n const roleArg =\n typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : undefined;\n const validRoles: AgentRole[] = [\"reviewer\", \"validator\", \"long-running\"];\n if (roleArg && !validRoles.includes(roleArg as AgentRole)) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid --role: ${roleArg}. Must be: ${validRoles.join(\", \")}`,\n warnings: [],\n data: {},\n };\n }\n\n const headless: HeadlessConfig | null = headlessFlag\n ? {\n enabled: true,\n role: (roleArg as AgentRole) ?? \"reviewer\",\n maxRounds: 5,\n qualitySeverityFloor: \"high\",\n }\n : instance.headless;\n\n const bridge = await startBridge({\n instanceId,\n runtime: instance.runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName,\n runtimeCommand,\n appServerUrl,\n repoRoot,\n port: instance.port ?? undefined,\n headless,\n busyMode,\n pollSeconds,\n reconnectSeconds,\n messageLookbackMinutes,\n threadId,\n ephemeral,\n processExistingMessages,\n });\n\n logSuccess(`Bridge started (PID: ${bridge.pid})`);\n log(`Log: ${path.join(ctx.stateDir, \"logs\", `bridge-${instanceId}.log`)}`);\n\n // Update state with bridge info\n const updated = { ...instance, bridge };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_OK\",\n message: `Bridge for ${instanceId} started (PID: ${bridge.pid})`,\n warnings: [],\n data: { pid: bridge.pid },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(msg);\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_FAILED\",\n message: msg,\n warnings: [],\n data: {},\n };\n }\n}\n\n// ─── Subcommand: stop ──────────────────────────────────────────\n\nasync function bridgeStopOne(identifier: string): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n\n logHeader(`@hua-labs/tap bridge stop ${instanceId}`);\n\n const stopped = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n if (stopped) {\n logSuccess(`Bridge for ${instanceId} stopped`);\n\n // Clear bridge from state\n const instance = state.instances[instanceId];\n if (instance) {\n const updated = { ...instance, bridge: null };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n }\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_STOP_OK\",\n message: `Bridge for ${instanceId} stopped`,\n warnings: [],\n data: {},\n };\n }\n\n log(`No running bridge for ${instanceId}`);\n\n // Clear stale bridge metadata from state even if process was already dead\n const instance = state.instances[instanceId];\n if (instance?.bridge) {\n const updated = { ...instance, bridge: null };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n }\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `No running bridge for ${instanceId}`,\n warnings: [],\n data: {},\n };\n}\n\nasync function bridgeStopAll(): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const stopped: string[] = [];\n\n logHeader(\"@hua-labs/tap bridge stop (all)\");\n\n let stateChanged = false;\n\n for (const instanceId of instanceIds) {\n const didStop = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n if (didStop) {\n logSuccess(`Stopped bridge for ${instanceId}`);\n stopped.push(instanceId);\n }\n\n // Clear stale bridge metadata regardless of whether process was alive\n const instance = state.instances[instanceId];\n if (instance?.bridge) {\n state.instances[instanceId] = { ...instance, bridge: null };\n stateChanged = true;\n }\n }\n\n if (stateChanged) {\n state.updatedAt = new Date().toISOString();\n saveState(repoRoot, state);\n }\n\n const message =\n stopped.length > 0\n ? `Stopped ${stopped.length} bridge(s): ${stopped.join(\", \")}`\n : \"No running bridges found\";\n\n log(message);\n\n return {\n ok: true,\n command: \"bridge\",\n code: stopped.length > 0 ? \"TAP_BRIDGE_STOP_OK\" : \"TAP_BRIDGE_NOT_RUNNING\",\n message,\n warnings: [],\n data: { stopped },\n };\n}\n\n// ─── Subcommand: status ────────────────────────────────────────\n\nfunction bridgeStatusAll(): CommandResult {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const bridges: Record<\n string,\n {\n status: string;\n runtime: string;\n pid: number | null;\n port: number | null;\n lastHeartbeat: string | null;\n }\n > = {};\n\n logHeader(\"@hua-labs/tap bridge status\");\n log(\n `${\"Instance\".padEnd(20)} ${\"Runtime\".padEnd(8)} ${\"Status\".padEnd(10)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Last Heartbeat\"}`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(10)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(20)}`,\n );\n\n for (const instanceId of instanceIds) {\n const inst = state.instances[instanceId];\n if (!inst?.installed) continue;\n\n if (inst.bridgeMode !== \"app-server\") {\n log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${\"n/a\".padEnd(10)} ${\"-\".padEnd(8)} ${\"-\".padEnd(6)} ${inst.bridgeMode} mode`,\n );\n bridges[instanceId] = {\n status: \"n/a\",\n runtime: inst.runtime,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n };\n continue;\n }\n\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n const pid = bridgeState?.pid ?? null;\n const heartbeat = bridgeState?.lastHeartbeat ?? null;\n const pidStr = pid ? String(pid) : \"-\";\n const portStr = inst.port ? String(inst.port) : \"-\";\n const ageStr = age !== null ? formatAge(age) : \"-\";\n\n const statusColor =\n status === \"running\"\n ? \"running\"\n : status === \"stale\"\n ? \"stale!\"\n : \"stopped\";\n\n log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${statusColor.padEnd(10)} ${pidStr.padEnd(8)} ${portStr.padEnd(6)} ${ageStr}`,\n );\n\n bridges[instanceId] = {\n status,\n runtime: inst.runtime,\n pid,\n port: inst.port,\n lastHeartbeat: heartbeat,\n };\n }\n\n if (instanceIds.length === 0) {\n log(\"No instances installed.\");\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceIds.length} instance(s) checked`,\n warnings: [],\n data: { bridges },\n };\n}\n\nfunction bridgeStatusOne(identifier: string): CommandResult {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const inst = state.instances[instanceId];\n\n if (!inst?.installed) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `${instanceId} is not installed.`,\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap bridge status ${instanceId}`);\n log(`Instance: ${instanceId}`);\n log(`Runtime: ${inst.runtime}`);\n log(`Bridge mode: ${inst.bridgeMode}`);\n if (inst.port) log(`Port: ${inst.port}`);\n\n // Non-app-server instances don't use bridges\n if (inst.bridgeMode !== \"app-server\") {\n log(`Status: n/a (${inst.bridgeMode} mode)`);\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceId} bridge: n/a (${inst.bridgeMode} mode)`,\n warnings: [],\n data: {\n status: \"n/a\",\n bridgeMode: inst.bridgeMode,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n },\n };\n }\n\n const { config: resolvedCfg2 } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg2.stateDir;\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n log(`Status: ${status}`);\n\n if (bridgeState) {\n log(`PID: ${bridgeState.pid}`);\n log(\n `Heartbeat: ${bridgeState.lastHeartbeat}${age !== null ? ` (${formatAge(age)})` : \"\"}`,\n );\n log(\n `Log: ${path.join(stateDir, \"logs\", `bridge-${instanceId}.log`)}`,\n );\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceId} bridge: ${status}`,\n warnings: [],\n data: {\n status,\n bridgeMode: inst.bridgeMode,\n pid: bridgeState?.pid ?? null,\n port: inst.port,\n lastHeartbeat: bridgeState?.lastHeartbeat ?? null,\n },\n };\n}\n\n// ─── Command Router ────────────────────────────────────────────\n\nexport async function bridgeCommand(args: string[]): Promise<CommandResult> {\n const { positional, flags } = parseArgs(args);\n const subcommand = positional[0];\n const identifierArg = positional[1];\n const agentName =\n typeof flags[\"agent-name\"] === \"string\" ? flags[\"agent-name\"] : undefined;\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n log(BRIDGE_HELP);\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: BRIDGE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n switch (subcommand) {\n case \"start\": {\n if (!identifierArg) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance. Usage: npx @hua-labs/tap bridge start <instance>\",\n warnings: [],\n data: {},\n };\n }\n return bridgeStart(identifierArg, agentName, flags);\n }\n\n case \"stop\": {\n if (!identifierArg) {\n return bridgeStopAll();\n }\n return bridgeStopOne(identifierArg);\n }\n\n case \"status\": {\n if (identifierArg) {\n return bridgeStatusOne(identifierArg);\n }\n return bridgeStatusAll();\n }\n\n default:\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown bridge subcommand: ${subcommand}. Use: start, stop, status`,\n warnings: [],\n data: {},\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync, spawn } from \"node:child_process\";\nimport { findRepoRoot } from \"../utils.js\";\nimport { loadState } from \"../state.js\";\nimport type { CommandResult } from \"../types.js\";\n\nfunction findServerEntry(repoRoot: string): string | null {\n const candidates = [\n path.join(repoRoot, \"packages\", \"tap-plugin\", \"channels\", \"tap-comms.ts\"),\n path.join(\n repoRoot,\n \"node_modules\",\n \"@hua-labs\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n ];\n for (const p of candidates) {\n if (fs.existsSync(p)) return p;\n }\n return null;\n}\n\nfunction isBunInstalled(): boolean {\n try {\n execSync(\"bun --version\", { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * serve is special: it takes over the process on success.\n * Only returns a CommandResult on error.\n */\nexport async function serveCommand(args: string[]): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n\n let commsDir: string | undefined;\n\n const commsDirIdx = args.indexOf(\"--comms-dir\");\n if (commsDirIdx !== -1 && args[commsDirIdx + 1]) {\n commsDir = path.resolve(args[commsDirIdx + 1]);\n }\n\n if (!commsDir && process.env.TAP_COMMS_DIR) {\n commsDir = process.env.TAP_COMMS_DIR;\n }\n\n if (!commsDir) {\n const state = loadState(repoRoot);\n if (state) {\n commsDir = state.commsDir;\n }\n }\n\n if (!commsDir) {\n return {\n ok: false,\n command: \"serve\",\n code: \"TAP_NOT_INITIALIZED\",\n message:\n \"Cannot determine comms directory. Set TAP_COMMS_DIR env var, use --comms-dir, or run 'init' first.\",\n warnings: [],\n data: {},\n };\n }\n\n if (!isBunInstalled()) {\n return {\n ok: false,\n command: \"serve\",\n code: \"TAP_SERVE_BUN_REQUIRED\",\n message:\n \"bun is required to run the tap-comms MCP server. Install: https://bun.sh\",\n warnings: [],\n data: {},\n };\n }\n\n const serverEntry = findServerEntry(repoRoot);\n if (!serverEntry) {\n return {\n ok: false,\n command: \"serve\",\n code: \"TAP_SERVE_NO_SERVER\",\n message:\n \"tap-comms MCP server not found. Run from a repo with packages/tap-plugin/channels/.\",\n warnings: [],\n data: {},\n };\n }\n\n // Start MCP server — takes over the process\n const child = spawn(\"bun\", [serverEntry], {\n stdio: \"inherit\",\n env: {\n ...process.env,\n TAP_COMMS_DIR: commsDir,\n },\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (err) => {\n resolve({\n ok: false,\n command: \"serve\",\n code: \"TAP_INTERNAL_ERROR\",\n message: `Failed to start MCP server: ${err.message}`,\n warnings: [],\n data: {},\n });\n });\n\n child.on(\"exit\", (code) => {\n resolve({\n ok: code === 0,\n command: \"serve\",\n code: code === 0 ? \"TAP_SERVE_OK\" : \"TAP_INTERNAL_ERROR\",\n message:\n code === 0\n ? \"MCP server stopped\"\n : `MCP server exited with code ${code}`,\n warnings: [],\n data: { exitCode: code },\n });\n });\n });\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { resolveConfig } from \"../config/index.js\";\nimport {\n findRepoRoot,\n parseArgs,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst INIT_WORKTREE_HELP = `\nUsage:\n tap-comms init-worktree [options]\n\nOptions:\n --path <dir> Worktree directory (required, e.g. ../hua-wt-3)\n --branch <name> Branch name to create (default: derived from path)\n --base <ref> Base ref for new branch (default: origin/main)\n --mission <file> Mission file to associate (e.g. m74-feature.md)\n --comms-dir <path> Override comms directory\n --skip-install Skip pnpm install step\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap init-worktree --path ../hua-wt-3 --branch feat/my-feature\n npx @hua-labs/tap init-worktree --path ../hua-wt-4 --branch fix/bug --mission m74-fix.md\n`.trim();\n\ninterface WorktreeOptions {\n worktreePath: string;\n branch: string;\n base: string;\n mission?: string;\n commsDir: string;\n skipInstall: boolean;\n repoRoot: string;\n}\n\n// ─── Warning collector ─────────────────────────────────────────\n\nfunction warn(warnings: string[], message: string): void {\n logWarn(message);\n warnings.push(message);\n}\n\n// ─── Step helpers ──────────────────────────────────────────────\n\nfunction run(\n cmd: string,\n opts?: { cwd?: string; ignoreError?: boolean },\n): string {\n try {\n return execSync(cmd, {\n cwd: opts?.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 120_000,\n }).trim();\n } catch (err) {\n if (opts?.ignoreError) return \"\";\n throw err;\n }\n}\n\nfunction toAbsolute(p: string): string {\n const resolved = path.resolve(p);\n // Normalize to forward slashes for .mcp.json compatibility\n return resolved.replace(/\\\\/g, \"/\");\n}\n\nfunction probeBun(candidate: string): boolean {\n try {\n const out = execSync(`\"${candidate}\" --version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }).trim();\n return /^\\d+\\.\\d+/.test(out);\n } catch {\n return false;\n }\n}\n\nfunction findBun(): string | null {\n const candidates =\n process.platform === \"win32\" ? [\"bun.exe\", \"bun\"] : [\"bun\"];\n\n for (const name of candidates) {\n try {\n const out = execSync(\n process.platform === \"win32\" ? `where ${name}` : `which ${name}`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"], timeout: 5000 },\n ).trim();\n // Validate each candidate with --version before accepting\n for (const line of out.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed && probeBun(trimmed)) return trimmed;\n }\n } catch {\n // not found\n }\n }\n\n // Check common locations\n const home = process.env.HOME || process.env.USERPROFILE || \"\";\n const bunHome = path.join(\n home,\n \".bun\",\n \"bin\",\n process.platform === \"win32\" ? \"bun.exe\" : \"bun\",\n );\n if (fs.existsSync(bunHome) && probeBun(bunHome)) return bunHome;\n\n return null;\n}\n\n// ─── Step 1: Create worktree ───────────────────────────────────\n\nfunction step1CreateWorktree(opts: WorktreeOptions): boolean {\n log(\"Step 1/9: Creating worktree...\");\n\n if (fs.existsSync(opts.worktreePath)) {\n logWarn(`Directory already exists: ${opts.worktreePath}`);\n // Check if it's already a worktree\n try {\n run(\"git rev-parse --git-dir\", { cwd: opts.worktreePath });\n logWarn(\"Already a git worktree. Continuing...\");\n return true;\n } catch {\n logError(\"Directory exists but is not a git worktree.\");\n return false;\n }\n }\n\n try {\n // Try creating with new branch\n run(\n `git worktree add \"${opts.worktreePath}\" -b ${opts.branch} ${opts.base}`,\n { cwd: opts.repoRoot },\n );\n logSuccess(`Worktree created: ${opts.worktreePath}`);\n logSuccess(`Branch: ${opts.branch} (from ${opts.base})`);\n } catch {\n // Branch may already exist\n try {\n run(`git worktree add \"${opts.worktreePath}\" ${opts.branch}`, {\n cwd: opts.repoRoot,\n });\n logSuccess(`Worktree created with existing branch: ${opts.branch}`);\n } catch (err) {\n logError(\n `Failed to create worktree: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n }\n return true;\n}\n\n// ─── Step 2: Merge origin/main ─────────────────────────────────\n\nfunction step2MergeMain(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 2/9: Merging origin/main...\");\n\n try {\n run(\"git fetch origin main\", { cwd: opts.worktreePath });\n } catch {\n warn(warnings, \"Could not fetch origin/main. Skipping merge.\");\n return;\n }\n\n try {\n const behind = run(\"git rev-list --count HEAD..origin/main\", {\n cwd: opts.worktreePath,\n });\n if (behind === \"0\") {\n logSuccess(\"Already up to date with origin/main.\");\n return;\n }\n\n run(\"git merge origin/main --no-edit -X theirs\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"Merged origin/main.\");\n } catch {\n warn(\n warnings,\n \"Merge had issues. You may need to resolve conflicts manually.\",\n );\n }\n}\n\n// ─── Step 3: Copy permissions ──────────────────────────────────\n\nfunction step3CopyPermissions(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 3/9: Copying permissions...\");\n\n const srcSettings = path.join(\n opts.repoRoot,\n \".claude\",\n \"settings.local.json\",\n );\n const destDir = path.join(opts.worktreePath, \".claude\");\n const destSettings = path.join(destDir, \"settings.local.json\");\n\n if (!fs.existsSync(srcSettings)) {\n warn(\n warnings,\n \"No .claude/settings.local.json found in main repo. Skipping.\",\n );\n return;\n }\n\n fs.mkdirSync(destDir, { recursive: true });\n fs.copyFileSync(srcSettings, destSettings);\n logSuccess(\"Copied settings.local.json\");\n\n try {\n run(\"git update-index --skip-worktree .claude/settings.local.json\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"Marked skip-worktree\");\n } catch {\n warn(warnings, \"Could not set skip-worktree. File may show as modified.\");\n }\n}\n\n// ─── Step 4: Generate .mcp.json ────────────────────────────────\n\nfunction step4GenerateMcpJson(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 4/9: Generating .mcp.json...\");\n\n const bunPath = findBun();\n if (!bunPath) {\n warn(warnings, \"bun not found. .mcp.json not generated.\");\n warn(\n warnings,\n \"Install bun (https://bun.sh) and re-run, or create .mcp.json manually.\",\n );\n return;\n }\n\n const wtAbs = toAbsolute(opts.worktreePath);\n const bunAbs = toAbsolute(bunPath);\n const commsAbs = toAbsolute(opts.commsDir);\n\n // Find tap-comms channel entry point\n const channelEntry = path.join(\n wtAbs,\n \"packages/tap-plugin/channels/tap-comms.ts\",\n );\n\n const mcpConfig = {\n mcpServers: {\n \"tap-comms\": {\n command: bunAbs,\n args: [channelEntry],\n cwd: wtAbs,\n env: {\n TAP_COMMS_DIR: commsAbs,\n TAP_AGENT_NAME: \"unnamed\",\n },\n },\n },\n };\n\n const mcpPath = path.join(opts.worktreePath, \".mcp.json\");\n fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2) + \"\\n\", \"utf-8\");\n logSuccess(`.mcp.json generated (absolute paths + cwd)`);\n log(` bun: ${bunAbs}`);\n log(` comms: ${commsAbs}`);\n}\n\n// ─── Step 5: Install dependencies ──────────────────────────────\n\nfunction step5Install(opts: WorktreeOptions, warnings: string[]): void {\n if (opts.skipInstall) {\n log(\"Step 5/9: Skipping pnpm install (--skip-install).\");\n return;\n }\n\n log(\"Step 5/9: Installing dependencies...\");\n\n try {\n run(\"pnpm install --prefer-offline\", { cwd: opts.worktreePath });\n logSuccess(\"Dependencies installed.\");\n } catch {\n warn(\n warnings,\n \"pnpm install failed. Try running manually in the worktree.\",\n );\n }\n}\n\n// ─── Step 6: Build ESLint plugin ───────────────────────────────\n\nfunction step6BuildEslintPlugin(\n opts: WorktreeOptions,\n warnings: string[],\n): void {\n if (opts.skipInstall) {\n log(\"Step 6/9: Skipping eslint plugin build (--skip-install).\");\n return;\n }\n\n log(\"Step 6/9: Building eslint-plugin-i18n...\");\n\n try {\n run(\"pnpm build --filter @hua-labs/eslint-plugin-i18n\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"eslint-plugin-i18n built.\");\n } catch {\n warn(warnings, \"eslint-plugin-i18n build failed. Non-blocking.\");\n }\n}\n\n// ─── Step 7: Verify comms ──────────────────────────────────────\n\nfunction step7VerifyComms(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 7/9: Verifying comms directory...\");\n\n if (!fs.existsSync(opts.commsDir)) {\n warn(warnings, `Comms directory not found: ${opts.commsDir}`);\n warn(warnings, \"Create it or run: npx @hua-labs/tap init\");\n return;\n }\n\n const requiredDirs = [\"inbox\", \"findings\", \"reviews\", \"letters\"];\n for (const dir of requiredDirs) {\n const dirPath = path.join(opts.commsDir, dir);\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logSuccess(`Created ${dir}/`);\n }\n }\n\n logSuccess(`Comms verified: ${opts.commsDir}`);\n}\n\n// ─── Step 8: Verify bun ────────────────────────────────────────\n\nfunction step8VerifyBun(warnings: string[]): void {\n log(\"Step 8/9: Verifying bun...\");\n\n const bunPath = findBun();\n if (!bunPath) {\n warn(warnings, \"bun not found in PATH.\");\n warn(warnings, \"Install: curl -fsSL https://bun.sh/install | bash\");\n return;\n }\n\n try {\n const version = run(`\"${bunPath}\" --version`);\n logSuccess(`bun ${version} found: ${bunPath}`);\n } catch {\n warn(warnings, \"bun found but version check failed.\");\n }\n}\n\n// ─── Step 9: Ready message ─────────────────────────────────────\n\nfunction step9Ready(opts: WorktreeOptions): void {\n logHeader(\"Ready!\");\n log(`Worktree: ${toAbsolute(opts.worktreePath)}`);\n log(`Branch: ${opts.branch}`);\n log(`Comms: ${toAbsolute(opts.commsDir)}`);\n if (opts.mission) log(`Mission: ${opts.mission}`);\n log(\"\");\n log(\"Next steps:\");\n log(` cd ${opts.worktreePath}`);\n log(\" claude # Start Claude Code session\");\n log(\"\");\n}\n\n// ─── Command entry ─────────────────────────────────────────────\n\nexport async function initWorktreeCommand(\n args: string[],\n): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(INIT_WORKTREE_HELP);\n return {\n ok: true,\n command: \"init-worktree\",\n code: \"TAP_NO_OP\",\n message: \"init-worktree help\",\n warnings: [],\n data: {},\n };\n }\n\n const worktreePath =\n typeof flags[\"path\"] === \"string\" ? flags[\"path\"] : undefined;\n if (!worktreePath) {\n return {\n ok: false,\n command: \"init-worktree\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing --path. Usage: npx @hua-labs/tap init-worktree --path ../hua-wt-3\",\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const { config } = resolveConfig({}, repoRoot);\n\n const branch =\n typeof flags[\"branch\"] === \"string\"\n ? flags[\"branch\"]\n : path.basename(path.resolve(worktreePath));\n const base =\n typeof flags[\"base\"] === \"string\" ? flags[\"base\"] : \"origin/main\";\n const mission =\n typeof flags[\"mission\"] === \"string\" ? flags[\"mission\"] : undefined;\n const commsDir =\n typeof flags[\"comms-dir\"] === \"string\"\n ? flags[\"comms-dir\"]\n : config.commsDir;\n const skipInstall = flags[\"skip-install\"] === true;\n\n const opts: WorktreeOptions = {\n worktreePath: path.resolve(worktreePath),\n branch,\n base,\n mission,\n commsDir: path.resolve(commsDir),\n skipInstall,\n repoRoot,\n };\n\n logHeader(`@hua-labs/tap init-worktree`);\n log(`Path: ${opts.worktreePath}`);\n log(`Branch: ${opts.branch}`);\n log(`Base: ${opts.base}`);\n log(`Comms: ${opts.commsDir}`);\n if (mission) log(`Mission: ${mission}`);\n log(\"\");\n\n const warnings: string[] = [];\n\n // Execute steps\n const created = step1CreateWorktree(opts);\n if (!created) {\n return {\n ok: false,\n command: \"init-worktree\",\n code: \"TAP_PATCH_FAILED\",\n message: \"Failed to create worktree.\",\n warnings,\n data: {},\n };\n }\n\n step2MergeMain(opts, warnings);\n step3CopyPermissions(opts, warnings);\n step4GenerateMcpJson(opts, warnings);\n step5Install(opts, warnings);\n step6BuildEslintPlugin(opts, warnings);\n step7VerifyComms(opts, warnings);\n step8VerifyBun(warnings);\n step9Ready(opts);\n\n return {\n ok: true,\n command: \"init-worktree\" as never,\n code: \"TAP_INIT_OK\",\n message: `Worktree initialized: ${opts.worktreePath}`,\n warnings,\n data: {\n path: opts.worktreePath,\n branch: opts.branch,\n commsDir: opts.commsDir,\n },\n };\n}\n","/**\n * Dashboard data collection engine.\n * Aggregates: agents (comms presence), bridges (state + PID), PRs (gh CLI).\n *\n * Ref: tap public repo tap-ops-dashboard.ps1 (single-agent view)\n * M74 extends to control-tower view (all agents, all bridges, all PRs).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { resolveConfig } from \"../config/index.js\";\nimport {\n loadBridgeState,\n getBridgeStatus,\n getHeartbeatAge,\n isProcessAlive,\n} from \"./bridge.js\";\nimport type { InstanceId } from \"../types.js\";\nimport { loadState } from \"../state.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface AgentInfo {\n name: string;\n status: string | null;\n lastActivity: string | null;\n joinedAt: string | null;\n}\n\nexport interface BridgeInfo {\n instanceId: string;\n runtime: string;\n status: \"running\" | \"stopped\" | \"stale\";\n pid: number | null;\n port: number | null;\n heartbeatAge: number | null;\n headless: boolean;\n}\n\nexport interface PRInfo {\n number: number;\n title: string;\n author: string;\n state: string;\n url: string;\n}\n\nexport interface DashboardWarning {\n level: \"warn\" | \"error\";\n message: string;\n}\n\nexport interface DashboardSnapshot {\n generatedAt: string;\n repoRoot: string;\n commsDir: string;\n agents: AgentInfo[];\n bridges: BridgeInfo[];\n prs: PRInfo[];\n warnings: DashboardWarning[];\n}\n\n// ─── Agent collection ──────────────────────────────────────────\n\nfunction collectAgents(commsDir: string): AgentInfo[] {\n // Read heartbeats.json (written by tap-comms MCP server)\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n if (!fs.existsSync(heartbeatsPath)) return [];\n\n try {\n const raw = fs.readFileSync(heartbeatsPath, \"utf-8\");\n const data = JSON.parse(raw) as Record<\n string,\n {\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: string;\n joinedAt?: string;\n }\n >;\n\n return Object.entries(data).map(([name, info]) => ({\n name: info.agent ?? name,\n status: info.status ?? null,\n lastActivity: info.lastActivity ?? info.timestamp ?? null,\n joinedAt: info.joinedAt ?? null,\n }));\n } catch {\n return [];\n }\n}\n\n// ─── Bridge collection ─────────────────────────────────────────\n\nfunction collectBridges(repoRoot: string): BridgeInfo[] {\n const state = loadState(repoRoot);\n const { config } = resolveConfig({}, repoRoot);\n const stateDir = config.stateDir;\n const bridges: BridgeInfo[] = [];\n\n // Collect from state.json instances (if initialized)\n if (state) {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (!inst?.installed) continue;\n if (inst.bridgeMode !== \"app-server\") continue;\n\n const instanceId = id as InstanceId;\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n bridges.push({\n instanceId: id,\n runtime: inst.runtime,\n status,\n pid: bridgeState?.pid ?? null,\n port: inst.port ?? null,\n heartbeatAge: age,\n headless: inst.headless?.enabled ?? false,\n });\n }\n }\n\n // Also scan .tmp/ for daemon state dirs (catches externally-launched bridges)\n const tmpDir = path.join(repoRoot, \".tmp\");\n if (fs.existsSync(tmpDir)) {\n try {\n const dirs = fs\n .readdirSync(tmpDir)\n .filter((d) => d.startsWith(\"codex-app-server-bridge\"));\n\n for (const dir of dirs) {\n const daemonPath = path.join(tmpDir, dir, \"bridge-daemon.json\");\n if (!fs.existsSync(daemonPath)) continue;\n\n try {\n const raw = fs.readFileSync(daemonPath, \"utf-8\");\n const daemon = JSON.parse(raw) as {\n pid?: number;\n startedAt?: string;\n appServerUrl?: string;\n };\n\n // Skip if already covered by state.json instances\n const alreadyCovered = bridges.some(\n (b) => b.pid === daemon.pid && b.pid !== null,\n );\n if (alreadyCovered) continue;\n\n const agentFile = path.join(tmpDir, dir, \"agent-name.txt\");\n const agentName = fs.existsSync(agentFile)\n ? fs.readFileSync(agentFile, \"utf-8\").trim()\n : dir;\n\n const running = daemon.pid ? isProcessAlive(daemon.pid) : false;\n const portMatch = daemon.appServerUrl?.match(/:(\\d+)/);\n const port = portMatch ? parseInt(portMatch[1], 10) : null;\n\n bridges.push({\n instanceId: agentName,\n runtime: \"codex\",\n status: running ? \"running\" : \"stale\",\n pid: daemon.pid ?? null,\n port,\n heartbeatAge: null,\n headless: false,\n });\n } catch {\n // Skip corrupted daemon files\n }\n }\n } catch {\n // .tmp/ read failed\n }\n }\n\n return bridges;\n}\n\n// ─── PR collection ─────────────────────────────────────────────\n\nfunction collectPRs(): PRInfo[] {\n try {\n const output = execSync(\n \"gh pr list --state all --limit 10 --json number,title,author,state,url\",\n { encoding: \"utf-8\", timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n );\n\n const prs = JSON.parse(output) as Array<{\n number: number;\n title: string;\n author: { login: string };\n state: string;\n url: string;\n }>;\n\n return prs.map((pr) => ({\n number: pr.number,\n title: pr.title,\n author: pr.author.login,\n state: pr.state,\n url: pr.url,\n }));\n } catch {\n return [];\n }\n}\n\n// ─── Warnings ──────────────────────────────────────────────────\n\nfunction collectWarnings(\n bridges: BridgeInfo[],\n agents: AgentInfo[],\n): DashboardWarning[] {\n const warnings: DashboardWarning[] = [];\n\n for (const bridge of bridges) {\n if (bridge.status === \"stale\") {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} is stale (PID ${bridge.pid} dead)`,\n });\n }\n if (\n bridge.status === \"running\" &&\n bridge.heartbeatAge !== null &&\n bridge.heartbeatAge > 60\n ) {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} heartbeat stale (${bridge.heartbeatAge}s ago)`,\n });\n }\n }\n\n if (bridges.length === 0) {\n warnings.push({\n level: \"warn\",\n message: \"No bridges configured\",\n });\n }\n\n if (agents.length === 0) {\n warnings.push({\n level: \"warn\",\n message: \"No agent heartbeats found\",\n });\n }\n\n return warnings;\n}\n\n// ─── Snapshot ──────────────────────────────────────────────────\n\nexport function collectDashboardSnapshot(\n repoRoot?: string,\n commsDirOverride?: string,\n): DashboardSnapshot {\n const { config } = resolveConfig(\n commsDirOverride ? { commsDir: commsDirOverride } : {},\n repoRoot,\n );\n const resolved = config;\n\n const agents = collectAgents(resolved.commsDir);\n const bridges = collectBridges(resolved.repoRoot);\n const prs = collectPRs();\n const warnings = collectWarnings(bridges, agents);\n\n return {\n generatedAt: new Date().toISOString(),\n repoRoot: resolved.repoRoot,\n commsDir: resolved.commsDir,\n agents,\n bridges,\n prs,\n warnings,\n };\n}\n","import { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport type { DashboardSnapshot } from \"../engine/dashboard.js\";\nimport { findRepoRoot, parseArgs, log, logHeader } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\n// ─── Formatting helpers ────────────────────────────────────────\n\nfunction formatAge(seconds: number | null): string {\n if (seconds === null) return \"-\";\n if (seconds < 60) return `${seconds}s ago`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m ago`;\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"running\":\n return \"running\";\n case \"stale\":\n return \"stale!\";\n case \"stopped\":\n return \"stopped\";\n case \"MERGED\":\n return \"merged\";\n case \"OPEN\":\n return \"open\";\n case \"CLOSED\":\n return \"closed\";\n default:\n return status;\n }\n}\n\nfunction truncate(str: string, len: number): string {\n return str.length > len ? str.slice(0, len - 1) + \"…\" : str;\n}\n\n// ─── Render ────────────────────────────────────────────────────\n\nfunction renderSnapshot(snapshot: DashboardSnapshot): void {\n logHeader(\"tap dashboard\");\n log(`Time: ${snapshot.generatedAt}`);\n log(`Repo: ${snapshot.repoRoot}`);\n log(`Comms: ${snapshot.commsDir}`);\n\n // ── Agents ──\n log(\"\");\n log(\"── Agents ──────────────────────────\");\n if (snapshot.agents.length === 0) {\n log(\" (no heartbeats)\");\n } else {\n for (const agent of snapshot.agents) {\n const activity = agent.lastActivity\n ? formatAge(\n Math.floor(\n (Date.now() - new Date(agent.lastActivity).getTime()) / 1000,\n ),\n )\n : \"unknown\";\n const status = agent.status ?? \"unknown\";\n log(` ${agent.name.padEnd(12)} ${status.padEnd(10)} active ${activity}`);\n }\n }\n\n // ── Bridges ──\n log(\"\");\n log(\"── Bridges ─────────────────────────\");\n if (snapshot.bridges.length === 0) {\n log(\" (none)\");\n } else {\n log(\n ` ${\"Instance\".padEnd(20)} ${\"Status\".padEnd(10)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Heartbeat\"}`,\n );\n log(\n ` ${\"─\".repeat(20)} ${\"─\".repeat(10)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(12)}`,\n );\n for (const b of snapshot.bridges) {\n const headlessTag = b.headless ? \" [H]\" : \"\";\n log(\n ` ${truncate(b.instanceId + headlessTag, 20).padEnd(20)} ${formatStatus(b.status).padEnd(10)} ${(b.pid ? String(b.pid) : \"-\").padEnd(8)} ${(b.port ? String(b.port) : \"-\").padEnd(6)} ${formatAge(b.heartbeatAge)}`,\n );\n }\n }\n\n // ── PRs ──\n log(\"\");\n log(\"── PRs ─────────────────────────────\");\n if (snapshot.prs.length === 0) {\n log(\" (gh CLI unavailable or no PRs)\");\n } else {\n for (const pr of snapshot.prs) {\n const icon =\n pr.state === \"MERGED\" ? \"+\" : pr.state === \"OPEN\" ? \"~\" : \"x\";\n log(\n ` ${icon} #${String(pr.number).padEnd(5)} ${formatStatus(pr.state).padEnd(8)} ${truncate(pr.title, 50)}`,\n );\n }\n }\n\n // ── Warnings ──\n log(\"\");\n log(\"── Warnings ────────────────────────\");\n if (snapshot.warnings.length === 0) {\n log(\" [OK] no warnings\");\n } else {\n for (const w of snapshot.warnings) {\n const prefix = w.level === \"error\" ? \"[ERR]\" : \"[WARN]\";\n log(` ${prefix} ${w.message}`);\n }\n }\n}\n\n// ─── Command ───────────────────────────────────────────────────\n\nexport async function dashboardCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n const jsonMode = flags[\"json\"] === true;\n const watchMode = flags[\"watch\"] === true;\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : \"5\";\n const intervalSeconds = Math.max(2, parseInt(intervalStr, 10) || 5);\n const commsDirOverride =\n typeof flags[\"comms-dir\"] === \"string\" ? flags[\"comms-dir\"] : undefined;\n\n const repoRoot = findRepoRoot();\n\n if (watchMode) {\n // Watch loop — runs until Ctrl+C\n const run = (): void => {\n const snapshot = collectDashboardSnapshot(repoRoot, commsDirOverride);\n if (jsonMode) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n // Clear screen\n process.stdout.write(\"\\x1B[2J\\x1B[H\");\n renderSnapshot(snapshot);\n log(\"\");\n log(` Refreshing every ${intervalSeconds}s — Ctrl+C to exit`);\n }\n };\n\n run();\n const timer = setInterval(run, intervalSeconds * 1000);\n\n // Handle graceful shutdown\n const cleanup = (): void => {\n clearInterval(timer);\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep alive\n await new Promise(() => {});\n\n return {\n ok: true,\n command: \"unknown\",\n code: \"TAP_NO_OP\",\n message: \"Watch mode ended\",\n warnings: [],\n data: {},\n };\n }\n\n // Single run\n const snapshot = collectDashboardSnapshot(repoRoot, commsDirOverride);\n\n if (jsonMode) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n renderSnapshot(snapshot);\n }\n\n return {\n ok: true,\n command: \"dashboard\",\n code: \"TAP_STATUS_OK\",\n message: `Dashboard: ${snapshot.bridges.length} bridge(s), ${snapshot.agents.length} agent(s), ${snapshot.prs.length} PR(s)`,\n warnings: snapshot.warnings.map((w) => w.message),\n data: snapshot as unknown as Record<string, unknown>,\n };\n}\n","import type { CommandResult } from \"./types.js\";\nimport { logSuccess, logWarn, logError } from \"./utils.js\";\n\n/**\n * Emit a CommandResult to stdout.\n * --json mode: single JSON object.\n * Human mode: formatted log messages.\n */\nexport function emitResult(result: CommandResult, jsonMode: boolean): void {\n if (jsonMode) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Human mode\n if (result.ok) {\n logSuccess(result.message);\n } else {\n logError(result.message);\n }\n\n for (const w of result.warnings) {\n logWarn(w);\n }\n}\n\n/**\n * Determine exit code from CommandResult.\n * 0 = ok:true, 1 = ok:false\n */\nexport function exitCode(result: CommandResult): number {\n return result.ok ? 0 : 1;\n}\n\n/**\n * Check if --json flag is present in args.\n * Removes it from the array and returns the flag state.\n */\nexport function extractJsonFlag(args: string[]): {\n jsonMode: boolean;\n cleanArgs: string[];\n} {\n const jsonMode = args.includes(\"--json\");\n const cleanArgs = args.filter((a) => a !== \"--json\");\n return { jsonMode, cleanArgs };\n}\n","import { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { removeCommand } from \"./commands/remove.js\";\nimport { bridgeCommand } from \"./commands/bridge.js\";\nimport { serveCommand } from \"./commands/serve.js\";\nimport { initWorktreeCommand } from \"./commands/init-worktree.js\";\nimport { dashboardCommand } from \"./commands/dashboard.js\";\nimport { version } from \"./version.js\";\nimport { extractJsonFlag, emitResult, exitCode } from \"./output.js\";\nimport { setJsonMode } from \"./utils.js\";\nimport type { CommandName, CommandResult } from \"./types.js\";\n\nconst HELP = `\n@hua-labs/tap — Cross-model AI agent communication setup\n\nUsage:\n tap-comms <command> [options]\n\nCommands:\n init Initialize comms directory and state\n init-worktree Set up a new git worktree with tap-comms\n add <runtime> Add a runtime instance (claude, codex, gemini)\n remove <instance> Remove an instance and rollback config\n status Show installed instances and bridge status\n bridge <sub> [inst] Manage bridges (start, stop, status)\n dashboard Show unified ops dashboard\n serve Start tap-comms MCP server (stdio)\n version Show version\n\nOptions:\n --help, -h Show help\n --json Machine-readable JSON output\n --comms-dir <path> Override comms directory path\n\nExamples:\n npx @hua-labs/tap init\n npx @hua-labs/tap init-worktree --path ../hua-wt-3 --branch feat/my-feature\n npx @hua-labs/tap add claude\n npx @hua-labs/tap add codex --name reviewer --port 4501\n npx @hua-labs/tap status\n`.trim();\n\nfunction normalizeCommandName(command: string | undefined): CommandName {\n switch (command) {\n case \"init\":\n case \"init-worktree\":\n case \"add\":\n case \"remove\":\n case \"status\":\n case \"bridge\":\n case \"dashboard\":\n case \"serve\":\n return command;\n default:\n return \"unknown\";\n }\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n const { jsonMode, cleanArgs } = extractJsonFlag(rawArgs);\n setJsonMode(jsonMode);\n const command = cleanArgs[0];\n\n if (!command || command === \"--help\" || command === \"-h\") {\n if (jsonMode) {\n console.log(JSON.stringify({ help: HELP }));\n } else {\n console.log(HELP);\n }\n process.exit(0);\n }\n\n if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n if (jsonMode) {\n console.log(JSON.stringify({ version }));\n } else {\n console.log(`@hua-labs/tap v${version}`);\n }\n process.exit(0);\n }\n\n const commandArgs = cleanArgs.slice(1);\n let result: CommandResult;\n\n try {\n switch (command) {\n case \"init\":\n result = await initCommand(commandArgs);\n break;\n case \"init-worktree\":\n result = await initWorktreeCommand(commandArgs);\n break;\n case \"add\":\n result = await addCommand(commandArgs);\n break;\n case \"remove\":\n result = await removeCommand(commandArgs);\n break;\n case \"status\":\n result = await statusCommand(commandArgs);\n break;\n case \"bridge\":\n result = await bridgeCommand(commandArgs);\n break;\n case \"dashboard\":\n result = await dashboardCommand(commandArgs);\n break;\n case \"serve\": {\n // serve takes over stdio for MCP protocol — don't emit result on stdout\n const serveResult = await serveCommand(commandArgs);\n if (!serveResult.ok) {\n // Only emit on error (before MCP server starts)\n emitResult(serveResult, jsonMode);\n }\n process.exit(exitCode(serveResult));\n break;\n }\n default:\n result = {\n ok: false,\n command: \"unknown\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown command: ${command}`,\n warnings: [],\n data: { requestedCommand: command },\n };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n result = {\n ok: false,\n command: normalizeCommandName(command),\n code: \"TAP_INTERNAL_ERROR\",\n message,\n warnings: [],\n data: command ? { requestedCommand: command } : {},\n };\n }\n\n emitResult(result, jsonMode);\n process.exit(exitCode(result));\n}\n\nmain();\n"],"mappings":"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","names":["fs","path","fs","path","basename","fs","path","findRepoRoot","fs","path","tmp","findRepoRoot","fs","path","fs","path","crypto","fs","path","fs","os","path","version","findCodexConfigPath","canonicalizeTrustPath","fs","path","setNestedKey","fs","path","execSync","fs","path","execSync","version","major","execSync","resolve","findRepoRoot","findRepoRoot","fs","setNestedKey","tmp","findRepoRoot","path","findRepoRoot","instance","fs","path","execSync","spawn","execSync","findRepoRoot","spawn","resolve","fs","path","execSync","execSync","version","findRepoRoot","fs","path","execSync","execSync","formatAge","findRepoRoot","run","snapshot"]}