paseo-room 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/index.js +1114 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/result.ts","../src/layout.ts","../src/fsops.ts","../src/room/clauses.ts","../src/room/instructions.ts","../src/which.ts","../src/agents/claude.ts","../src/agents/codex.ts","../src/paseo.ts","../src/roles.ts","../src/room.ts","../src/commands.ts","../src/wizard.ts","../src/cli.ts","../src/render.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"paseo-room\",\n \"version\": \"0.1.0-alpha.0\",\n \"description\": \"One CLI that configures Codex/Claude role homes in $HOME and registers them with your local Paseo daemon.\",\n \"keywords\": [\n \"paseo\",\n \"codex\",\n \"claude-code\",\n \"agent\",\n \"orchestration\",\n \"cli\"\n ],\n \"homepage\": \"https://github.com/cuongntr/paseo-room#readme\",\n \"bugs\": \"https://github.com/cuongntr/paseo-room/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/cuongntr/paseo-room.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Invoker <cuongnt1987@gmail.com>\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=22\"\n },\n \"bin\": {\n \"paseo-room\": \"dist/index.js\"\n },\n \"files\": [\n \"dist/\"\n ],\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"vitest run\",\n \"build\": \"tsup\",\n \"prepack\": \"npm run build\",\n \"verify\": \"npm run typecheck && npm run lint && npm test && npm run build\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^1.8.0\",\n \"@getpaseo/client\": \"0.8.0-beta.1\",\n \"commander\": \"^14.0.3\",\n \"semver\": \"^7.8.5\",\n \"smol-toml\": \"^1.8.0\",\n \"zod\": \"^4.5.4\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^22.0.0\",\n \"@types/semver\": \"^7.7.0\",\n \"eslint\": \"^10.10.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"~5.9.3\",\n \"typescript-eslint\": \"^8.70.0\",\n \"vitest\": \"^4.1.11\"\n }\n}\n","export type Status = 'pass' | 'warn' | 'fail';\nexport interface Check {\n readonly id: string;\n readonly status: Status;\n readonly message: string;\n readonly fix?: string;\n}\nexport interface Operation {\n readonly action: 'create' | 'update' | 'remove' | 'noop';\n readonly kind: 'dir' | 'file' | 'link' | 'provider';\n readonly target: string;\n}\nexport type Outcome = 'ok' | 'changes-planned' | 'failed';\nexport interface Result {\n readonly command: string;\n readonly outcome: Outcome;\n readonly changed: boolean;\n readonly checks: readonly Check[];\n readonly operations: readonly Operation[];\n}\n\nexport function pass(id: string, message: string): Check {\n return { id, status: 'pass', message };\n}\nexport function fail(id: string, message: string, fix: string): Check {\n return { id, status: 'fail', message, fix };\n}\nexport function failed(command: string, checks: readonly Check[]): Result {\n return { command, outcome: 'failed', changed: false, checks, operations: [] };\n}\nexport function hasFailure(checks: readonly Check[]): boolean {\n return checks.some(check => check.status === 'fail');\n}\nexport function exitCode(result: Result): number {\n return result.outcome === 'failed' || hasFailure(result.checks) ? 1 : 0;\n}\n","import { homedir } from 'node:os';\nimport { join, resolve, sep } from 'node:path';\nimport { fail, type Check } from './result.js';\nimport type { AgentId, Role } from './roles.js';\n\nexport interface Options {\n readonly roomHome?: string;\n readonly codexHome?: string;\n readonly claudeHome?: string;\n readonly codexBin?: string;\n readonly claudeBin?: string;\n readonly paseoBin?: string;\n}\nexport interface Layout {\n readonly home: string;\n readonly roomHome: string;\n readonly paseoHome: string;\n readonly agentHome: Record<AgentId, string>;\n readonly bin: Record<AgentId | 'paseo', string>;\n}\n\nfunction pick(...candidates: readonly (string | undefined)[]): string {\n for (const candidate of candidates) if (candidate?.trim()) return candidate.trim();\n throw new Error('Could not determine HOME; pass explicit --room-home and --codex-home/--claude-home paths.');\n}\n\n/** Everything is derived from HOME; flags and environment only override defaults. */\nexport function resolveLayout(options: Options = {}, env: NodeJS.ProcessEnv = process.env): Layout {\n const home = pick(env.HOME, homedir());\n // Relative overrides resolve against the working directory, as a CLI flag should.\n return {\n home,\n roomHome: resolve(pick(options.roomHome, env.PASEO_ROOM_HOME, join(home, '.paseo-room'))),\n paseoHome: resolve(pick(env.PASEO_HOME, join(home, '.paseo'))),\n agentHome: {\n codex: resolve(pick(options.codexHome, env.CODEX_HOME, join(home, '.codex'))),\n claude: resolve(pick(options.claudeHome, env.CLAUDE_CONFIG_DIR, join(home, '.claude'))),\n },\n bin: {\n codex: pick(options.codexBin, env.CODEX_BIN, 'codex'),\n claude: pick(options.claudeBin, env.CLAUDE_BIN, 'claude'),\n paseo: pick(options.paseoBin, env.PASEO_BIN, 'paseo'),\n },\n };\n}\n\n/** True when `path` is the root itself or sits underneath it. */\nexport function contains(root: string, path: string): boolean {\n return path === root || path.startsWith(root.endsWith(sep) ? root : root + sep);\n}\n\n/** The room home must own its directory: no overlap with $HOME or a source agent home. */\nexport function layoutChecks(layout: Layout, agents: readonly AgentId[]): Check[] {\n const checks: Check[] = [];\n if (contains(layout.roomHome, layout.home)) {\n checks.push(fail('room.home', `Refusing to use ${layout.roomHome} as the room home: it contains your home directory.`,\n 'Point --room-home at a dedicated directory, by default ~/.paseo-room.'));\n }\n for (const id of agents) {\n const home = layout.agentHome[id];\n if (contains(layout.roomHome, home) || contains(home, layout.roomHome)) {\n checks.push(fail(`${id}.home`, `The ${id} home ${home} overlaps the room home ${layout.roomHome}.`,\n `Pass --${id}-home pointing at your own ${id} configuration (this happens when setup runs inside a room seat).`));\n }\n }\n return checks;\n}\n\nexport function roleHome(layout: Layout, agent: AgentId, role: Role): string {\n return join(layout.roomHome, 'roles', agent, role);\n}\nexport function sharedRoom(layout: Layout): string {\n return join(layout.roomHome, 'room');\n}\n","import { chmod, lstat, mkdir, readFile, readlink, rm, symlink, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Operation } from './result.js';\n\nexport type Entry =\n | { readonly kind: 'dir'; readonly path: string }\n /** `once` writes the file only when absent: runtime state the agent owns after setup. */\n | { readonly kind: 'file'; readonly path: string; readonly content: string; readonly once?: true }\n | { readonly kind: 'link'; readonly path: string; readonly target: string };\n\nconst DIR_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\nasync function current(entry: Entry): Promise<'absent' | 'same' | 'different'> {\n let stat;\n try { stat = await lstat(entry.path); } catch { return 'absent'; }\n if (entry.kind === 'dir') return stat.isDirectory() ? 'same' : 'different';\n if (entry.kind === 'link') {\n if (!stat.isSymbolicLink()) return 'different';\n return await readlink(entry.path) === entry.target ? 'same' : 'different';\n }\n if (!stat.isFile()) return 'different';\n if (entry.once) return 'same';\n return await readFile(entry.path, 'utf8') === entry.content ? 'same' : 'different';\n}\n\n/** Everything lives under the room home, which this CLI owns outright. */\nexport async function planEntries(entries: readonly Entry[]): Promise<Operation[]> {\n const operations: Operation[] = [];\n for (const entry of entries) {\n const state = await current(entry);\n operations.push({\n action: state === 'same' ? 'noop' : state === 'absent' ? 'create' : 'update',\n kind: entry.kind,\n target: entry.path,\n });\n }\n return operations;\n}\n\n/** Rewrites only what differs, so a repeat run costs stats rather than writes. */\nexport async function applyEntries(entries: readonly Entry[]): Promise<void> {\n for (const entry of entries) {\n if (await current(entry) === 'same') continue;\n if (entry.kind === 'dir') {\n await mkdir(entry.path, { recursive: true, mode: DIR_MODE });\n continue;\n }\n await mkdir(dirname(entry.path), { recursive: true, mode: DIR_MODE });\n await rm(entry.path, { force: true, recursive: true });\n if (entry.kind === 'link') await symlink(entry.target, entry.path);\n else {\n await writeFile(entry.path, entry.content, { mode: FILE_MODE });\n await chmod(entry.path, FILE_MODE);\n }\n }\n}\n\nexport async function exists(path: string): Promise<boolean> {\n try { await lstat(path); return true; } catch { return false; }\n}\n\n/** Which of `names` exist under `home`, probed once for all roles that share them. */\nexport async function existingPaths(home: string, names: readonly string[]): Promise<string[]> {\n const paths = names.map(name => join(home, name));\n const present = await Promise.all(paths.map(exists));\n return paths.filter((_, index) => present[index] === true);\n}\n\nexport async function readIfPresent(path: string): Promise<string | undefined> {\n try { return await readFile(path, 'utf8'); } catch { return undefined; }\n}\n","/**\n * The room's authority contract, in the wording the agents actually read.\n *\n * Write each statement as ordinary wrapped prose. Blank lines separate\n * statements; line breaks inside a statement are just there for reading and\n * collapse into single spaces when rendered.\n */\nfunction clause(source: string): readonly string[] {\n return source\n .trim()\n .split(/\\n\\s*\\n/)\n .map(statement => statement.split('\\n').map(line => line.trim()).join(' '));\n}\n\nexport const CLAUSES = {\n 'RC-001': clause(`\n Human owns product goals, priority, material-cost choices, external effects, and\n irreversible-risk decisions. No agent may take ownership of these decisions; obtain\n Human approval before crossing those boundaries.\n\n Human may direct the technical route, decomposition, and lifecycle, and may override\n an acceptance decision. Human does not normally operate the agent protocol.\n `),\n\n 'RC-002': clause(`\n Each role must read workspace-local docs/WORKSPACE_PROTOCOL.md when it exists.\n Repository conventions, narrower scopes, validation commands, and escalation details\n may refine workflow, but cannot weaken this authority contract.\n\n A local protocol cannot give Peer orchestration, give Supervisor or Peer technical\n acceptance, permit multiple writable Peers, or transfer Human decisions to an agent.\n `),\n\n 'RC-003': clause(`\n Use tests, artifacts, lifecycle states, and completion/error/attention events as\n evidence, not as automatic authorization or acceptance.\n\n Wait for state-changing events when progress depends on another actor. Do not\n repeatedly poll unchanged state; resume when new evidence or a relevant event arrives.\n `),\n\n 'RC-004': clause(`\n Preserve unrelated work. Stay within the granted repository scope and external-action\n authority; do not treat access to a tool as permission to expand either boundary.\n `),\n\n 'RC-101': clause(`\n Supervisor routes the Human directive to Lead without changing its outcome, requested\n output, constraints, or approval gates. Label added context separately; it must not\n rewrite the directive.\n `),\n\n 'RC-102': clause(`\n Supervisor observes technical work rather than choosing architecture, decomposing\n work, or moving write ownership. Prefer routing work through Lead.\n\n Supervisor must not edit project work, run project validation, or decide technical\n acceptance. Supervisor must not direct Peer while Lead is healthy; an unhealthy Lead\n calls for bounded recovery or escalation, not taking over Peer work.\n `),\n\n 'RC-103': clause(`\n Supervisor has Paseo tools enabled solely within its authority. Use the smallest Paseo\n room/session lifecycle action needed for an explicit Human request or bounded room\n recovery; preserve current ownership and inform Lead of every change.\n `),\n\n 'RC-104': clause(`\n Supervisor sends technical questions and evidence to Lead. Escalate product, priority,\n material-cost, external-effect, and irreversible-risk choices to Human rather than\n deciding them.\n `),\n\n 'RC-201': clause(`\n Lead owns project framing, architecture, dependencies, integration, verification, and\n technical acceptance within Human boundaries. Lead executes the Human outcome and\n constraints, escalating Human-owned choices to Human.\n\n Lead has Paseo tools enabled to manage project agents and direct Peer; this capability\n does not expand project or external-action authority.\n `),\n\n 'RC-202': clause(`\n Lead owns decomposition and moving write-scope assignment: give each moving scope\n exactly one owner, with at most one active writable Peer across the project at a time.\n Lead must not edit a scope concurrently with its writing Peer.\n\n Before transferring write ownership, stop the prior writer and establish a stable\n handoff. Read-only review does not create another writer.\n `),\n\n 'RC-203': clause(`\n Before delegation, Lead supplies a complete Peer brief: one bounded outcome,\n prerequisites, explicit write scope or read-only mode, stable contract and invariants,\n required acceptance evidence, and conditions that reopen the decision.\n `),\n\n 'RC-204': clause(`\n Lead permits independent Peer judgment: REOPEN_REQUEST challenges a premise;\n DEPENDENCY_REQUEST asks for an unowned prerequisite; BLOCKED reports that no safe\n progress is possible.\n\n For each signal, Peer provides evidence, consequence, and the needed decision or\n dependency. Lead resolves technical signals or escalates Human-owned choices; Peer\n must not seize unowned work while waiting.\n `),\n\n 'RC-205': clause(`\n Lead inspects the exact candidate or a deterministic snapshot and explicitly accepts\n or rejects it with a technical reason. Passing tests and completion reports are\n evidence, not acceptance. Among agents, Lead alone accepts; Human retains override\n authority.\n `),\n\n 'RC-206': clause(`\n When material uncertainty warrants independent review, Lead may dispatch a fresh\n read-only Peer with an exact stable candidate and a bounded question. Review is\n optional: do not introduce a dedicated reviewer role or a fixed reviewer count.\n `),\n\n 'RC-301': clause(`\n Peer owns exactly one Lead-delegated bounded outcome and proportionate evidence. Do\n not add adjacent tasks; send technical questions to Lead and escalate Human-owned\n choices through Lead.\n `),\n\n 'RC-302': clause(`\n A writing Peer owns only its assigned moving write scope. A review Peer stays\n read-only and inspects only the named candidate or snapshot, without changing project\n files or the candidate.\n `),\n\n 'RC-303': clause(`\n Peer must not spawn, manage, coordinate, or infer room topology, direct another Peer,\n or perform Paseo room/session lifecycle operations. Peer receives no Paseo tools;\n enabled is false. This capability boundary is not an operating-system sandbox.\n `),\n\n 'RC-304': clause(`\n Peer hands off a candidate by naming an immutable commit or deterministic snapshot,\n the original base, all changed paths, verification performed and its results, and\n residual risk. Make the candidate reproducible for Lead inspection.\n `),\n\n 'RC-305': clause(`\n Peer must not self-accept any work, including difficult work. Peer tests and\n completion are evidence only; Lead alone performs technical acceptance among agents,\n subject to Human override.\n `),\n};\n\nexport type RoleContractId = keyof typeof CLAUSES;\nexport const SHARED_IDS = ['RC-001', 'RC-002', 'RC-003', 'RC-004'] as const;\n","import type { Role } from '../roles.js';\nimport { CLAUSES, SHARED_IDS, type RoleContractId } from './clauses.js';\n\nexport type InstructionKind = Role | 'workspace';\n\nconst ROLE_IDS: Record<Role, readonly RoleContractId[]> = {\n supervisor: ['RC-101', 'RC-102', 'RC-103', 'RC-104'],\n lead: ['RC-201', 'RC-202', 'RC-203', 'RC-204', 'RC-205', 'RC-206'],\n // Peer needs the challenge protocol as well as its own numbered obligations.\n peer: ['RC-204', 'RC-301', 'RC-302', 'RC-303', 'RC-304', 'RC-305'],\n};\n\nconst TITLES: Record<InstructionKind, string> = {\n workspace: 'Paseo Room workspace protocol — operator reference/template',\n supervisor: 'Supervisor role instructions',\n lead: 'Lead role instructions',\n peer: 'Peer role instructions',\n};\n\nconst PREFACES: Record<InstructionKind, string> = {\n workspace: 'Operator reference: copy what you need into a workspace-local docs/WORKSPACE_PROTOCOL.md. Installation never creates or replaces that workspace file.',\n supervisor: 'You are Supervisor, the Human-facing routing seat, not the project Lead.',\n lead: 'You are Lead, the project technical owner under Human authority.',\n peer: 'You are Peer, executing one brief from Lead in writing or read-only review mode.',\n};\n\nexport function instructionIds(kind: InstructionKind): readonly RoleContractId[] {\n if (kind === 'workspace') return Object.keys(CLAUSES) as RoleContractId[];\n // Every role carries the shared authority contract plus its own obligations.\n return [...SHARED_IDS, ...ROLE_IDS[kind]];\n}\n\nexport function renderInstructions(kind: InstructionKind): string {\n const sections = instructionIds(kind).map(\n id => `## ${id}\\n${CLAUSES[id].map(statement => `- ${statement}`).join('\\n')}`,\n );\n return [`# ${TITLES[kind]}`, PREFACES[kind], ...sections].join('\\n\\n') + '\\n';\n}\n","import { execFile } from 'node:child_process';\nimport { access, constants, realpath } from 'node:fs/promises';\nimport { delimiter, isAbsolute, join, resolve } from 'node:path';\nimport { promisify } from 'node:util';\n\nconst run = promisify(execFile);\n\n/** Resolve a command to an absolute, executable, canonical path. */\nexport async function which(command: string, env: NodeJS.ProcessEnv = process.env): Promise<string | undefined> {\n const candidates = isAbsolute(command) || command.includes('/')\n ? [resolve(command)]\n : (env.PATH ?? '').split(delimiter).filter(Boolean).map(entry => join(entry, command));\n for (const candidate of candidates) {\n try {\n await access(candidate, constants.X_OK);\n return await realpath(candidate);\n } catch { /* try the next PATH entry */ }\n }\n return undefined;\n}\n\nexport interface CommandOutput {\n readonly ok: boolean;\n readonly stdout: string;\n}\n/** Bounded, shell-free probe. Failures are reported, never thrown. */\nexport async function probe(executable: string, args: readonly string[], env: NodeJS.ProcessEnv): Promise<CommandOutput> {\n try {\n const { stdout } = await run(executable, [...args], { env, timeout: 20_000, maxBuffer: 16 * 1024 * 1024, encoding: 'utf8' });\n return { ok: true, stdout };\n } catch {\n return { ok: false, stdout: '' };\n }\n}\n","import { basename, join } from 'node:path';\nimport type { Layout } from '../layout.js';\nimport { roleHome } from '../layout.js';\nimport type { Entry } from '../fsops.js';\nimport { existingPaths, exists, readIfPresent } from '../fsops.js';\nimport { fail, pass, type Check } from '../result.js';\nimport type { Role } from '../roles.js';\nimport { renderInstructions } from '../room/instructions.js';\nimport { which } from '../which.js';\nimport type { Agent, AgentPlan } from './types.js';\n\n/** Operator resources shared by reference; credentials stay where Claude put them. */\nconst SHARED = ['.credentials.json', 'skills', 'plugins', 'commands', 'hooks'] as const;\n/** Copied once so a fresh role home does not re-run interactive onboarding. */\nconst SEEDED_KEYS = ['hasCompletedOnboarding', 'theme', 'installMethod', 'userID', 'oauthAccount'] as const;\n\nfunction asObject(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? { ...value } : {};\n}\n/** Any unreadable or non-object source is simply an empty starting point. */\nfunction readObject(source: string | undefined): Record<string, unknown> {\n try { return asObject(source === undefined ? {} : JSON.parse(source)); } catch { return {}; }\n}\n\n/** Keep the operator's hooks and env (Paseo installs its own), override nothing else. */\nexport function renderRoleSettings(source: string | undefined, role: Role): string {\n const settings = readObject(source);\n settings.env = { ...asObject(settings.env), PASEO_ROOM_ROLE: role };\n return JSON.stringify(settings, null, 2) + '\\n';\n}\n\nexport function renderRoleState(source: string | undefined): string {\n const root = readObject(source);\n const state: Record<string, unknown> = { hasCompletedOnboarding: true };\n for (const key of SEEDED_KEYS) if (key in root) state[key] = root[key];\n return JSON.stringify(state, null, 2) + '\\n';\n}\n\nexport const claudeAgent: Agent = {\n id: 'claude',\n label: 'Claude Code',\n homeEnv: 'CLAUDE_CONFIG_DIR',\n // Claude's own subagents would be a second control plane; Paseo owns agent\n // lifecycle. This is the Claude counterpart of Codex's [agents] enabled = false.\n pins: { disallowedTools: ['Task'] },\n async build(layout: Layout, roles: readonly Role[]): Promise<AgentPlan> {\n const home = layout.agentHome.claude;\n const binary = await which(layout.bin.claude);\n if (!binary) {\n return { entries: [], checks: [fail('claude.bin', 'Claude Code executable not found.', 'Install Claude Code, or pass --claude-bin /path/to/claude.')] };\n }\n if (!(await exists(home))) {\n return { entries: [], checks: [fail('claude.home', `No Claude config directory at ${home}.`, 'Run claude once to initialise it, or pass --claude-home.')] };\n }\n const checks: Check[] = [pass('claude.home', `Claude Code found at ${binary} using ${home}.`)];\n\n const settingsSource = await readIfPresent(join(home, 'settings.json'));\n const stateSource = await readIfPresent(join(layout.home, '.claude.json'));\n const shared = await existingPaths(home, SHARED);\n const entries: Entry[] = [];\n for (const role of roles) {\n const target = roleHome(layout, 'claude', role);\n entries.push({ kind: 'dir', path: target });\n entries.push({ kind: 'file', path: join(target, 'CLAUDE.md'), content: renderInstructions(role) });\n entries.push({ kind: 'file', path: join(target, 'settings.json'), content: renderRoleSettings(settingsSource, role) });\n entries.push({ kind: 'file', path: join(target, '.claude.json'), content: renderRoleState(stateSource), once: true });\n for (const path of shared) entries.push({ kind: 'link', path: join(target, basename(path)), target: path });\n }\n return { entries, checks, binary };\n },\n};\n","import { basename, join } from 'node:path';\nimport { parse, stringify, type TomlTable } from 'smol-toml';\nimport type { Layout } from '../layout.js';\nimport { roleHome } from '../layout.js';\nimport type { Entry } from '../fsops.js';\nimport { existingPaths, readIfPresent } from '../fsops.js';\nimport { fail, pass, type Check } from '../result.js';\nimport type { Role } from '../roles.js';\nimport { renderInstructions } from '../room/instructions.js';\nimport { probe, which } from '../which.js';\nimport type { Agent, AgentPlan } from './types.js';\n\n/** Read-only operator resources every role shares by reference, never by copy. */\nconst SHARED = ['auth.json', 'AGENTS.md', 'skills', 'plugins', 'hooks.json'] as const;\nconst CATALOG = 'model-catalog.json';\n\nfunction table(parent: TomlTable, key: string): TomlTable {\n const value = parent[key];\n if (value === undefined || typeof value !== 'object' || Array.isArray(value) || value instanceof Date) {\n return (parent[key] = {});\n }\n return value;\n}\n\nexport interface RoleConfigInput {\n readonly roleDocument: string;\n readonly catalogPath?: string;\n}\n/**\n * Copy the operator's config, then override only the keys the room owns.\n *\n * `model_instructions_file` is deliberately untouched: it *replaces* Codex's base\n * prompt, so writing it would mean vendoring and maintaining a full copy of that\n * prompt. The room contract is additive and belongs in `developer_instructions`.\n */\nexport function renderRoleConfig(source: TomlTable, input: RoleConfigInput): string {\n const config = structuredClone(source);\n config.sandbox_mode = 'danger-full-access';\n config.approval_policy = 'never';\n // An active profile outranks the top-level keys, so the room's must land there too.\n if (typeof config.profile === 'string') {\n const profile = table(table(config, 'profiles'), config.profile);\n profile.sandbox_mode = 'danger-full-access';\n profile.approval_policy = 'never';\n }\n config.developer_instructions = input.roleDocument;\n if (input.catalogPath) config.model_catalog_json = input.catalogPath;\n // Codex's own multi-agent mode would compete with the room's role contract.\n table(config, 'agents').enabled = false;\n const features = table(config, 'features');\n features.multi_agent = false;\n // Newer configs represent v2 as a table; keep that shape rather than writing a\n // boolean at the same key, which would be a TOML conflict.\n if (typeof features.multi_agent_v2 === 'boolean' || features.multi_agent_v2 === undefined) features.multi_agent_v2 = false;\n else table(features, 'multi_agent_v2').enabled = false;\n return stringify(config) + '\\n';\n}\n\nexport function renderCatalog(catalog: unknown): string {\n return JSON.stringify(catalog, (key, value: unknown) => (key === 'multi_agent_version' ? null : value), 2) + '\\n';\n}\n\nexport const codexAgent: Agent = {\n id: 'codex',\n label: 'Codex',\n homeEnv: 'CODEX_HOME',\n // Without these, Paseo's own mode preset (default auto-review) is sent to the\n // app-server and outranks the sandbox/approval keys in the generated config.\n pins: { params: { sandbox_mode: 'danger-full-access', approval_policy: 'never' } },\n async build(layout: Layout, roles: readonly Role[]): Promise<AgentPlan> {\n const checks: Check[] = [];\n const home = layout.agentHome.codex;\n const binary = await which(layout.bin.codex);\n if (!binary) {\n return { entries: [], checks: [fail('codex.bin', 'Codex executable not found.', 'Install Codex, or pass --codex-bin /path/to/codex.')] };\n }\n const configPath = join(home, 'config.toml');\n const raw = await readIfPresent(configPath);\n if (raw === undefined) {\n return { entries: [], checks: [fail('codex.home', `No config.toml in ${home}.`, 'Run codex once to initialise it, or pass --codex-home.')] };\n }\n let source: TomlTable;\n try { source = parse(raw); } catch {\n return { entries: [], checks: [fail('codex.config', `Could not read ${configPath} as TOML.`, 'Fix the syntax in your Codex config, then run setup again.')] };\n }\n checks.push(pass('codex.home', `Codex found at ${binary} using ${home}.`));\n\n const entries: Entry[] = [];\n\n // The catalog is optional: an older Codex simply keeps its built-in models.\n let catalogSource: string | undefined;\n const models = await probe(binary, ['debug', 'models'], { HOME: layout.home, CODEX_HOME: home, PATH: process.env.PATH ?? '' });\n if (models.ok) {\n try { catalogSource = renderCatalog(JSON.parse(models.stdout)); } catch { catalogSource = undefined; }\n }\n if (!catalogSource) checks.push({ id: 'codex.catalog', status: 'warn', message: 'Codex model catalog unavailable; roles keep the default catalog.' });\n\n const shared = await existingPaths(home, SHARED);\n for (const role of roles) {\n const target = roleHome(layout, 'codex', role);\n const catalogPath = catalogSource ? join(target, CATALOG) : undefined;\n const roleDocument = renderInstructions(role);\n entries.push({ kind: 'dir', path: target });\n // Codex reads the brief from developer_instructions; this copy is for the operator.\n entries.push({ kind: 'file', path: join(target, 'role-instructions.md'), content: roleDocument });\n entries.push({\n kind: 'file',\n path: join(target, 'config.toml'),\n content: renderRoleConfig(source, { roleDocument, ...(catalogPath ? { catalogPath } : {}) }),\n });\n if (catalogSource && catalogPath) entries.push({ kind: 'file', path: catalogPath, content: catalogSource });\n for (const path of shared) entries.push({ kind: 'link', path: join(target, basename(path)), target: path });\n }\n return { entries, checks, binary };\n },\n};\n","import type { PaseoClient, PaseoClientConfig } from '@getpaseo/client';\nimport { gte, valid } from 'semver';\nimport { z } from 'zod';\nimport type { Layout } from './layout.js';\nimport { fail, pass, type Check } from './result.js';\nimport type { Provider } from './agents/types.js';\nimport { probe, which } from './which.js';\n\nexport const MINIMUM_VERSION = '0.8.0-beta.1';\n\nconst statusSchema = z.object({\n listen: z.string().min(1),\n localDaemon: z.enum(['running', 'stopped', 'stale_pid', 'unresponsive']),\n cliVersion: z.string(),\n daemonVersion: z.string().nullable(),\n});\n\nexport interface Daemon {\n readonly url: string;\n readonly version: string;\n}\nexport interface DaemonResult {\n readonly checks: readonly Check[];\n readonly daemon?: Daemon;\n}\n\nexport function normalizeUrl(listen: string): string | undefined {\n const match = /^(?:ws:\\/\\/)?([^:/]+|\\[[^\\]]+\\]):(\\d+)$/.exec(listen.trim());\n if (!match) return undefined;\n const [, host = '', port = ''] = match;\n const local = ['localhost', '127.0.0.1', '0.0.0.0', '[::1]', '[::]'].includes(host) ? '127.0.0.1' : host;\n return `ws://${local}:${port}`;\n}\n\n/** The whole compatibility story: is Paseo running, and is it new enough? */\nexport function assessStatus(raw: unknown): DaemonResult {\n const parsed = statusSchema.safeParse(raw);\n if (!parsed.success) {\n return { checks: [fail('paseo.status', 'Paseo status output was not understood.', 'Upgrade Paseo, then run: paseo daemon status --json')] };\n }\n const status = parsed.data;\n if (status.localDaemon !== 'running') {\n return { checks: [fail('paseo.daemon', `Paseo daemon is ${status.localDaemon}.`, 'Start it with: paseo daemon start')] };\n }\n const cli = valid(status.cliVersion);\n const daemon = status.daemonVersion === null ? null : valid(status.daemonVersion);\n if (!cli || !daemon) {\n return { checks: [fail('paseo.version', 'Paseo did not report a usable version.', 'Upgrade Paseo to a release that reports semver versions.')] };\n }\n if (cli !== daemon) {\n return { checks: [fail('paseo.version', `Paseo CLI is ${cli} but the running daemon is ${daemon}.`, 'Restart the daemon with: paseo daemon restart')] };\n }\n if (!gte(daemon, MINIMUM_VERSION)) {\n return { checks: [fail('paseo.version', `Paseo ${daemon} is older than the required ${MINIMUM_VERSION}.`, 'Upgrade Paseo, then run setup again.')] };\n }\n const url = normalizeUrl(status.listen);\n if (!url) {\n return { checks: [fail('paseo.listen', `Paseo listen address ${status.listen} was not understood.`, 'Use a host:port listen address in the Paseo config.')] };\n }\n return { checks: [pass('paseo.version', `Paseo ${daemon} is running on ${url} (compatible, needs >= ${MINIMUM_VERSION}).`)], daemon: { url, version: daemon } };\n}\n\nexport async function checkDaemon(layout: Layout, env: NodeJS.ProcessEnv = process.env): Promise<DaemonResult> {\n const binary = await which(layout.bin.paseo, env);\n if (!binary) {\n return { checks: [fail('paseo.bin', 'Paseo executable not found.', 'Install Paseo, or pass --paseo-bin /path/to/paseo.')] };\n }\n const output = await probe(binary, ['daemon', 'status', '--json'], {\n HOME: layout.home, PASEO_HOME: layout.paseoHome, PATH: env.PATH ?? '',\n ...(env.PASEO_PASSWORD === undefined ? {} : { PASEO_PASSWORD: env.PASEO_PASSWORD }),\n });\n if (!output.ok) {\n return { checks: [fail('paseo.status', 'Could not read Paseo daemon status.', 'Run: paseo daemon status --json')] };\n }\n try { return assessStatus(JSON.parse(output.stdout)); }\n catch { return assessStatus(undefined); }\n}\n\nconst configSchema = z.object({ config: z.object({ providers: z.record(z.string(), z.unknown()).optional() }) });\n\nexport interface Session {\n readProviders(): Promise<Record<string, unknown>>;\n writeProviders(providers: Readonly<Record<string, Provider>>): Promise<void>;\n removeProviders(ids: readonly string[]): Promise<void>;\n refresh(ids: readonly string[]): Promise<void>;\n}\nexport type ClientFactory = (config: PaseoClientConfig) => PaseoClient;\n\n/** One connection per command. No retries, no reconnects, no background state. */\nexport async function withSession<T>(\n daemon: Daemon,\n run: (session: Session) => Promise<T>,\n options: { readonly password?: string; readonly factory?: ClientFactory } = {},\n): Promise<T> {\n const quiet = { debug() { /* silent */ }, info() { /* silent */ }, warn() { /* silent */ }, error() { /* silent */ } };\n // Loaded here so the \"Paseo is not running\" path never pays for the SDK.\n const factory = options.factory ?? (await import('@getpaseo/client')).createPaseoClient;\n const client = factory({\n url: `${daemon.url}/ws`,\n ...(options.password === undefined ? {} : { password: options.password }),\n appVersion: MINIMUM_VERSION,\n connectTimeoutMs: 10_000,\n reconnect: { enabled: false },\n logger: quiet,\n });\n try {\n await client.connect();\n return await run({\n async readProviders() {\n const response = configSchema.parse(await client.config.get());\n return response.config.providers ?? {};\n },\n async writeProviders(providers) {\n await client.config.patch({ providers } as unknown as Parameters<PaseoClient['config']['patch']>[0]);\n },\n async removeProviders(ids) {\n await client.config.patch({ removeProviders: [...ids] });\n },\n async refresh(ids) {\n await client.providers.refresh({ providers: [...ids] });\n },\n });\n } finally {\n await client.close();\n }\n}\n\n/** Compare only the keys the room owns; unrelated fields stay the operator's. */\nexport function providerMatches(desired: Provider, live: unknown): boolean {\n if (live === null || typeof live !== 'object') return false;\n const entry = live as Record<string, unknown>;\n const env = entry.env;\n const tools = entry.paseoTools;\n const same = (left: unknown, right: unknown): boolean => JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n return entry.extends === desired.extends &&\n same(entry.command, desired.command) &&\n env !== null && typeof env === 'object' &&\n Object.entries(desired.env).every(([key, value]) => (env as Record<string, unknown>)[key] === value) &&\n tools !== null && typeof tools === 'object' &&\n (tools as { enabled?: unknown }).enabled === desired.paseoTools.enabled &&\n // Pins are the room's guarantee: drifting them silently re-enables what they block.\n same(entry.params, desired.params) &&\n same(entry.disallowedTools, desired.disallowedTools);\n}\n","export const ROLES = ['supervisor', 'lead', 'peer'] as const;\nexport type Role = (typeof ROLES)[number];\n\nexport const AGENT_IDS = ['codex', 'claude'] as const;\nexport type AgentId = (typeof AGENT_IDS)[number];\n\n/** Supervisor and Lead orchestrate; Peer executes one brief and gets no room tools. */\nexport const ROLE_PASEO_TOOLS: Record<Role, boolean> = { supervisor: true, lead: true, peer: false };\n\nexport function providerId(agent: AgentId, role: Role): string {\n return `${agent}-${role}`;\n}\nexport function providerLabel(agent: AgentId, role: Role): string {\n const title = (value: string): string => value.charAt(0).toUpperCase() + value.slice(1);\n return `${title(agent)} ${title(role)}`;\n}\n","import { join } from 'node:path';\nimport { z } from 'zod';\nimport { readIfPresent } from './fsops.js';\nimport type { Layout } from './layout.js';\nimport { AGENT_IDS, ROLES, type AgentId, type Role } from './roles.js';\n\nexport const MARKER = 'room.json';\n\nconst markerSchema = z.object({\n version: z.string(),\n agents: z.array(z.enum(AGENT_IDS)).min(1),\n roles: z.array(z.enum(ROLES)).min(1),\n});\nexport type Marker = z.infer<typeof markerSchema>;\n\n/** Deterministic on purpose: re-running setup must not show a phantom change. */\nexport function renderMarker(version: string, agents: readonly AgentId[], roles: readonly Role[]): string {\n return JSON.stringify({ version, agents: [...agents], roles: [...roles] } satisfies Marker, null, 2) + '\\n';\n}\n\n/** Records what setup created, so verify and remove touch nothing else. */\nexport async function readMarker(layout: Layout): Promise<Marker | undefined> {\n const source = await readIfPresent(join(layout.roomHome, MARKER));\n if (source === undefined) return undefined;\n try { return markerSchema.parse(JSON.parse(source)); } catch { return undefined; }\n}\n","import { join } from 'node:path';\nimport { rm } from 'node:fs/promises';\nimport metadata from '../package.json' with { type: 'json' };\nimport { claudeAgent } from './agents/claude.js';\nimport { codexAgent } from './agents/codex.js';\nimport type { Agent, Provider } from './agents/types.js';\nimport { applyEntries, exists, planEntries, type Entry } from './fsops.js';\nimport { layoutChecks, resolveLayout, roleHome, sharedRoom, type Layout, type Options } from './layout.js';\nimport { checkDaemon, providerMatches, withSession, type ClientFactory, type Session } from './paseo.js';\nimport { fail, failed, hasFailure, pass, type Check, type Operation, type Result } from './result.js';\nimport { renderInstructions } from './room/instructions.js';\nimport { MARKER, readMarker, renderMarker, type Marker } from './room.js';\nimport { providerId, providerLabel, ROLES, ROLE_PASEO_TOOLS, type AgentId, type Role } from './roles.js';\n\nexport const AGENTS: Record<AgentId, Agent> = { codex: codexAgent, claude: claudeAgent };\n\nexport interface RunOptions extends Options {\n readonly agents?: readonly AgentId[];\n readonly apply?: boolean;\n readonly env?: NodeJS.ProcessEnv;\n readonly factory?: ClientFactory;\n}\n\nfunction sessionOptions(options: RunOptions): { password?: string; factory?: ClientFactory } {\n const password = (options.env ?? process.env).PASEO_PASSWORD;\n return { ...(password === undefined ? {} : { password }), ...(options.factory ? { factory: options.factory } : {}) };\n}\n\n/** The only per-agent differences are the home variable and the provider pins. */\nfunction roleProviders(layout: Layout, agent: Agent, binary: string, roles: readonly Role[]): Record<string, Provider> {\n return Object.fromEntries(roles.map(role => [providerId(agent.id, role), {\n extends: agent.id,\n label: providerLabel(agent.id, role),\n command: [binary],\n env: { [agent.homeEnv]: roleHome(layout, agent.id, role) },\n paseoTools: { enabled: ROLE_PASEO_TOOLS[role] },\n ...agent.pins,\n }]));\n}\n\ninterface Desired {\n readonly entries: readonly Entry[];\n readonly providers: Readonly<Record<string, Provider>>;\n readonly checks: readonly Check[];\n}\nasync function buildDesired(layout: Layout, agents: readonly AgentId[], roles: readonly Role[]): Promise<Desired> {\n // Operator reference, not linked into any seat: each repo owns its own protocol.\n const entries: Entry[] = [\n { kind: 'dir', path: layout.roomHome },\n { kind: 'dir', path: sharedRoom(layout) },\n { kind: 'file', path: join(sharedRoom(layout), 'workspace-protocol.md'), content: renderInstructions('workspace') },\n ];\n const providers: Record<string, Provider> = {};\n const checks: Check[] = [];\n for (const id of agents) {\n const agent = AGENTS[id];\n const plan = await agent.build(layout, roles);\n entries.push(...plan.entries);\n checks.push(...plan.checks);\n if (plan.binary !== undefined) Object.assign(providers, roleProviders(layout, agent, plan.binary, roles));\n }\n entries.push({ kind: 'file', path: join(layout.roomHome, MARKER), content: renderMarker(metadata.version, agents, roles) });\n return { entries, providers, checks };\n}\n\ninterface Stale {\n readonly providerIds: readonly string[];\n readonly directories: readonly string[];\n}\nconst NOTHING_STALE: Stale = { providerIds: [], directories: [] };\n\n/** A previous setup may have seated agents or roles this one does not: drop those. */\nasync function staleFrom(layout: Layout, previous: Marker | undefined, agents: readonly AgentId[], roles: readonly Role[]): Promise<Stale> {\n if (!previous) return NOTHING_STALE;\n const kept = new Set(agents.flatMap(agent => roles.map(role => providerId(agent, role))));\n const providerIds: string[] = [];\n const directories: string[] = [];\n for (const agent of previous.agents) {\n for (const role of previous.roles) {\n if (kept.has(providerId(agent, role))) continue;\n providerIds.push(providerId(agent, role));\n const path = roleHome(layout, agent, role);\n if (await exists(path)) directories.push(path);\n }\n }\n return { providerIds, directories };\n}\n\n/** One definition of drift, shared by the command that fixes it and the one that reports it. */\nasync function planRoom(session: Session, desired: Desired, stale: Stale): Promise<Operation[]> {\n const live = await session.readProviders();\n return [\n ...await planEntries(desired.entries),\n ...Object.entries(desired.providers).map(([id, provider]) => ({\n action: !(id in live) ? 'create' : providerMatches(provider, live[id]) ? 'noop' : 'update',\n kind: 'provider',\n target: id,\n }) satisfies Operation),\n ...stale.providerIds.filter(id => id in live).map(id => ({ action: 'remove', kind: 'provider', target: id }) satisfies Operation),\n ...stale.directories.map(path => ({ action: 'remove', kind: 'dir', target: path }) satisfies Operation),\n ];\n}\n\n/** The whole product: write the role homes, then register them with Paseo. */\nexport async function setup(options: RunOptions = {}): Promise<Result> {\n const layout = resolveLayout(options, options.env);\n const agents = options.agents ?? ['codex'];\n const invalid = layoutChecks(layout, agents);\n if (invalid.length > 0) return failed('setup', invalid);\n const daemon = await checkDaemon(layout, options.env);\n if (!daemon.daemon) return failed('setup', daemon.checks);\n const desired = await buildDesired(layout, agents, ROLES);\n const checks = [...daemon.checks, ...desired.checks];\n if (hasFailure(checks)) return failed('setup', checks);\n const stale = await staleFrom(layout, await readMarker(layout), agents, ROLES);\n\n return withSession(daemon.daemon, async session => {\n const operations = await planRoom(session, desired, stale);\n const pending = operations.filter(operation => operation.action !== 'noop');\n if (!options.apply) {\n return {\n command: 'setup', outcome: pending.length > 0 ? 'changes-planned' : 'ok', changed: false, checks, operations,\n } satisfies Result;\n }\n await applyEntries(desired.entries);\n for (const path of stale.directories) await rm(path, { recursive: true, force: true });\n const ids = Object.keys(desired.providers);\n await session.writeProviders(desired.providers);\n if (stale.providerIds.length > 0) await session.removeProviders(stale.providerIds);\n await session.refresh(ids);\n return {\n command: 'setup', outcome: 'ok', changed: pending.length > 0,\n checks: [...checks, pass('room.applied', `Room ready at ${layout.roomHome} with ${String(ids.length)} Paseo providers.`)],\n operations,\n } satisfies Result;\n }, sessionOptions(options));\n}\n\nexport async function verify(options: RunOptions = {}): Promise<Result> {\n const layout = resolveLayout(options, options.env);\n const marker = await readMarker(layout);\n if (!marker) {\n return failed('verify', [fail('room.marker', `No room found at ${layout.roomHome}.`, 'Run: paseo-room setup --apply')]);\n }\n const invalid = layoutChecks(layout, marker.agents);\n if (invalid.length > 0) return failed('verify', invalid);\n const daemon = await checkDaemon(layout, options.env);\n if (!daemon.daemon) return failed('verify', daemon.checks);\n const desired = await buildDesired(layout, marker.agents, marker.roles);\n const checks = [...daemon.checks, ...desired.checks];\n if (hasFailure(checks)) return failed('verify', checks);\n\n return withSession(daemon.daemon, async session => {\n const operations = await planRoom(session, desired, NOTHING_STALE);\n const drifted = operations.filter(operation => operation.action !== 'noop');\n const providers = drifted.filter(operation => operation.kind === 'provider').length;\n const files = drifted.length - providers;\n const all: Check[] = [...checks,\n files === 0\n ? pass('room.files', 'Every managed role file matches the current definition.')\n : fail('room.files', `${String(files)} managed role files are missing or outdated.`, 'Run: paseo-room setup --apply'),\n providers === 0\n ? pass('room.providers', `All ${String(Object.keys(desired.providers).length)} Paseo providers are registered as expected.`)\n : fail('room.providers', `${String(providers)} Paseo providers are missing or differ.`, 'Run: paseo-room setup --apply'),\n ];\n return {\n command: 'verify', outcome: hasFailure(all) ? 'failed' : 'ok', changed: false, checks: all, operations,\n } satisfies Result;\n }, sessionOptions(options));\n}\n\nexport async function remove(options: RunOptions = {}): Promise<Result> {\n const layout = resolveLayout(options, options.env);\n const marker = await readMarker(layout);\n if (!marker) {\n return failed('remove', [fail('room.marker', `No room found at ${layout.roomHome}.`, 'Nothing to remove; the room home was never created here.')]);\n }\n // A recursive delete needs a floor, so the layout rules gate this command too.\n const invalid = layoutChecks(layout, marker.agents);\n if (invalid.length > 0) return failed('remove', invalid);\n const ids = marker.agents.flatMap(agent => marker.roles.map(role => providerId(agent, role)));\n const operations: Operation[] = [\n ...ids.map(id => ({ action: 'remove', kind: 'provider', target: id }) satisfies Operation),\n { action: 'remove', kind: 'dir', target: layout.roomHome },\n ];\n if (!options.apply) {\n return { command: 'remove', outcome: 'changes-planned', changed: false, checks: [], operations };\n }\n const daemon = await checkDaemon(layout, options.env);\n const checks: Check[] = [];\n if (daemon.daemon) {\n await withSession(daemon.daemon, session => session.removeProviders(ids), sessionOptions(options));\n checks.push(pass('room.providers', `Removed ${String(ids.length)} Paseo providers.`));\n } else {\n checks.push({ id: 'room.providers', status: 'warn', message: 'Paseo is unreachable; provider entries were left in place.', fix: 'Start Paseo and run remove again to clear them.' });\n }\n // Only the room home is deleted; agent homes were never written to.\n await rm(layout.roomHome, { recursive: true, force: true });\n checks.push(pass('room.files', `Deleted ${layout.roomHome}.`));\n return { command: 'remove', outcome: 'ok', changed: true, checks, operations };\n}\n","import * as clack from '@clack/prompts';\nimport { AGENTS, remove, setup, verify, type RunOptions } from './commands.js';\nimport type { Result } from './result.js';\nimport { AGENT_IDS, type AgentId } from './roles.js';\n\nexport interface Prompts {\n select(options: { readonly message: string; readonly options: readonly { readonly value: string; readonly label: string }[] }): Promise<string | symbol>;\n multiselect(options: { readonly message: string; readonly options: readonly { readonly value: AgentId; readonly label: string }[] }): Promise<AgentId[] | symbol>;\n confirm(options: { readonly message: string }): Promise<boolean | symbol>;\n}\nexport const terminalPrompts: Prompts = {\n select: options => clack.select({ message: options.message, options: [...options.options] }),\n multiselect: options => clack.multiselect({ message: options.message, options: [...options.options], required: true }),\n confirm: options => clack.confirm({ message: options.message, initialValue: false }),\n};\n\n/** Guided path over the same commands the flags use; nothing extra happens here. */\nexport async function runWizard(\n prompts: Prompts,\n emit: (result: Result) => number,\n write: (text: string) => void,\n options: RunOptions = {},\n): Promise<number> {\n const cancelled = (): number => { write('Cancelled; nothing was changed.\\n'); return 0; };\n const action = await prompts.select({\n message: 'What do you want to do?',\n options: [\n { value: 'setup', label: 'Set up / update the room' },\n { value: 'verify', label: 'Verify the current room' },\n { value: 'remove', label: 'Remove the room' },\n ],\n });\n if (typeof action === 'symbol') return cancelled();\n if (action === 'verify') return emit(await verify(options));\n if (action === 'remove') {\n const preview = await remove(options);\n const status = emit(preview);\n if (preview.outcome !== 'changes-planned') return status;\n const approved = await prompts.confirm({ message: 'Delete the room home and its Paseo providers?' });\n return approved === true ? emit(await remove({ ...options, apply: true })) : cancelled();\n }\n const agents = await prompts.multiselect({\n message: 'Which coding agents should the room use?',\n options: AGENT_IDS.map(value => ({ value, label: AGENTS[value].label })),\n });\n if (typeof agents === 'symbol' || agents.length === 0) return cancelled();\n const preview = await setup({ ...options, agents });\n const status = emit(preview);\n if (preview.outcome !== 'changes-planned') return status;\n const approved = await prompts.confirm({ message: 'Apply these changes?' });\n if (approved !== true) return cancelled();\n return emit(await setup({ ...options, agents, apply: true }));\n}\n","import { Command, CommanderError } from 'commander';\nimport metadata from '../package.json' with { type: 'json' };\nimport { remove, setup, verify, type RunOptions } from './commands.js';\nimport { renderHuman, renderJson } from './render.js';\nimport { exitCode, fail, failed, type Result } from './result.js';\nimport { AGENT_IDS, type AgentId } from './roles.js';\nimport type { Prompts } from './wizard.js';\n\nexport interface Output {\n readonly stdout: (text: string) => void;\n readonly stderr: (text: string) => void;\n}\nexport interface CliContext {\n readonly isTTY?: boolean;\n readonly prompts?: Prompts;\n readonly options?: RunOptions;\n}\n\n/** Commander passes no initial value, so the first call starts the list. */\nfunction collectAgent(value: string, previous: AgentId[] | undefined): AgentId[] {\n const agent = AGENT_IDS.find(id => id === value);\n if (!agent) throw new CommanderError(2, 'agent', `Unknown agent: ${value}`);\n const seated = previous ?? [];\n return seated.includes(agent) ? seated : [...seated, agent];\n}\n\nconst PATH_FLAGS = ['roomHome', 'codexHome', 'claudeHome', 'codexBin', 'claudeBin', 'paseoBin'] as const;\n\nfunction optionsFrom(raw: Record<string, unknown>, base: RunOptions): RunOptions {\n const paths: Record<string, string> = {};\n for (const flag of PATH_FLAGS) {\n const value = raw[flag];\n if (typeof value === 'string' && value.trim()) paths[flag] = value.trim();\n }\n const agents = Array.isArray(raw.agent) && raw.agent.length > 0 ? (raw.agent as AgentId[]) : undefined;\n return { ...base, ...paths, ...(agents ? { agents } : {}), ...(raw.apply === true ? { apply: true } : {}) };\n}\n\nexport async function runCli(argv: readonly string[], output: Output, context: CliContext = {}): Promise<number> {\n const password = (context.options?.env ?? process.env).PASEO_PASSWORD;\n const redact = (text: string): string => (password ? text.split(password).join('[redacted]') : text);\n // Set once the flags are parsed; the wizard path never sees flags, so text output is right there.\n let json = false;\n const emit = (result: Result): number => {\n output.stdout(redact(json ? renderJson(result) : renderHuman(result)));\n return exitCode(result);\n };\n const isTTY = context.isTTY ?? (process.stdin.isTTY && process.stdout.isTTY);\n const base = context.options ?? {};\n\n if (argv.length === 0) {\n if (!isTTY) {\n output.stderr('paseo-room: no command given. Try: paseo-room setup, verify, remove, or --help.\\n');\n return 2;\n }\n // @clack/prompts is only reachable here, so keep it off the scripted path.\n const { runWizard, terminalPrompts } = await import('./wizard.js');\n return runWizard(context.prompts ?? terminalPrompts, emit, text => { output.stdout(text); }, base);\n }\n\n const program = new Command()\n .name('paseo-room')\n .description('Configure Codex/Claude role homes in $HOME and register them with your local Paseo daemon.')\n .version(metadata.version)\n .argument('<command>', 'setup | verify | remove')\n .option('--agent <agent>', 'codex or claude; repeat for both (default: codex)', collectAgent)\n .option('--apply', 'actually make the changes (default: dry run)')\n .option('--json', 'machine-readable output')\n .option('--room-home <path>', 'where role homes are written (default: ~/.paseo-room)')\n .option('--codex-home <path>', 'source Codex config (default: ~/.codex)')\n .option('--claude-home <path>', 'source Claude Code config (default: ~/.claude)')\n .option('--codex-bin <path>', 'Codex executable (default: found on PATH)')\n .option('--claude-bin <path>', 'Claude Code executable (default: found on PATH)')\n .option('--paseo-bin <path>', 'Paseo executable (default: found on PATH)')\n .configureOutput({ writeOut: text => { output.stdout(text); }, writeErr: text => { output.stderr(text); } })\n .exitOverride();\n\n let command: string;\n let options: RunOptions;\n try {\n program.parse([...argv], { from: 'user' });\n const raw = program.opts<Record<string, unknown>>();\n json = raw.json === true;\n command = program.args[0] ?? '';\n options = optionsFrom(raw, base);\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return 0;\n return 2;\n }\n\n try {\n if (command === 'setup') return emit(await setup(options));\n if (command === 'verify') return emit(await verify(options));\n if (command === 'remove') return emit(await remove(options));\n } catch (error) {\n const detail = error instanceof Error ? error.message : 'unknown error';\n return emit(failed(command, [fail(`${command}.error`, redact(detail), 'Check that Paseo is running and reachable, then try again.')]));\n }\n output.stderr(`paseo-room: unknown command \"${command}\". Try: setup, verify, remove.\\n`);\n return 2;\n}\n","import type { Result } from './result.js';\n\nexport function renderJson(result: Result): string {\n return `${JSON.stringify({ schemaVersion: 2, ...result }, null, 2)}\\n`;\n}\n\nconst ICONS = { pass: '✓', warn: '!', fail: '✗' } as const;\n\nexport function renderHuman(result: Result): string {\n const lines: string[] = [];\n for (const check of result.checks) {\n lines.push(`${ICONS[check.status]} ${check.message}`);\n if (check.fix) lines.push(` → ${check.fix}`);\n }\n const changes = result.operations.filter(operation => operation.action !== 'noop');\n if (changes.length > 0) {\n lines.push('', result.changed ? 'Applied:' : 'Planned changes:');\n for (const operation of changes) lines.push(` ${operation.action} ${operation.kind} ${operation.target}`);\n const unchanged = result.operations.length - changes.length;\n if (unchanged > 0) lines.push(` (${String(unchanged)} already up to date)`);\n } else if (result.operations.length > 0) {\n lines.push('', 'Everything is already up to date.');\n }\n lines.push('', `${result.command}: ${result.outcome}`);\n return `${lines.join('\\n')}\\n`;\n}\n","#!/usr/bin/env node\nimport { runCli } from './cli.js';\n\nprocess.exitCode = await runCli(process.argv.slice(2), {\n stdout: text => { process.stdout.write(text); },\n stderr: text => { process.stderr.write(text); },\n});\n"],"mappings":"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","names":["join","join","resolve","join","basename","join","SHARED","run","join","z","join","rm","preview","status","approved","runWizard","terminalPrompts"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "paseo-room",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"description": "One CLI that configures Codex/Claude role homes in $HOME and registers them with your local Paseo daemon.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"paseo",
|
|
7
|
+
"codex",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"agent",
|
|
10
|
+
"orchestration",
|
|
11
|
+
"cli"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/cuongntr/paseo-room#readme",
|
|
14
|
+
"bugs": "https://github.com/cuongntr/paseo-room/issues",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/cuongntr/paseo-room.git"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"author": "Invoker <cuongnt1987@gmail.com>",
|
|
21
|
+
"type": "module",
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=22"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"paseo-room": "dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist/"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"lint": "eslint . --max-warnings 0",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"prepack": "npm run build",
|
|
37
|
+
"verify": "npm run typecheck && npm run lint && npm test && npm run build"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@clack/prompts": "^1.8.0",
|
|
41
|
+
"@getpaseo/client": "0.8.0-beta.1",
|
|
42
|
+
"commander": "^14.0.3",
|
|
43
|
+
"semver": "^7.8.5",
|
|
44
|
+
"smol-toml": "^1.8.0",
|
|
45
|
+
"zod": "^4.5.4"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@eslint/js": "^10.0.1",
|
|
49
|
+
"@types/node": "^22.0.0",
|
|
50
|
+
"@types/semver": "^7.7.0",
|
|
51
|
+
"eslint": "^10.10.0",
|
|
52
|
+
"tsup": "^8.5.1",
|
|
53
|
+
"typescript": "~5.9.3",
|
|
54
|
+
"typescript-eslint": "^8.70.0",
|
|
55
|
+
"vitest": "^4.1.11"
|
|
56
|
+
}
|
|
57
|
+
}
|