@helmsmith/workbrokr 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../platform/core/cli-kit-lib/src/auth-provider.ts","../../../platform/core/cli-kit-lib/src/create-cli.ts","../src/commands/audit.ts","../src/lib/context.ts","../src/core/config.ts","../src/core/errors.ts","../src/core/git.ts","../src/core/guards.ts","../src/core/scopes.ts","../src/core/hooks.ts","../src/core/manifest.ts","../src/core/paths.ts","../src/core/ports.ts","../src/core/refresh.ts","../src/core/registry.ts","../src/core/runner.ts","../src/core/session.ts","../src/lib/storybrokr.ts","../src/lib/effort.ts","../src/commands/_shared/output.ts","../src/commands/env.ts","../src/commands/finish.ts","../src/commands/hook.ts","../src/commands/init.ts","../src/mcp/server.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/promote.ts","../src/commands/reap.ts","../src/commands/retire.ts","../src/commands/start.ts","../src/commands/status.ts","../src/cli.ts"],"sourcesContent":["/**\n * AuthProvider — the contract cli-kit consumers implement to wire\n * their auth library into commands that need a token.\n *\n * Why pluggable: cli-kit is consumed by toolbox apps (which use\n * `@helmsmith/agent-auth`) AND by platform CLIs (which may use\n * different auth flows). Hardcoding agent-auth would force every\n * consumer onto it.\n *\n * Why minimal: this interface is published and breaking it forces\n * every consumer to update. Login flows, token storage, refresh\n * policy — those belong in the auth library, not here.\n */\nexport interface AuthProvider {\n /**\n * Returns a fresh access token. Implementations are expected to\n * handle refresh internally and throw if the user isn't logged in.\n */\n getToken(): Promise<string>;\n\n /**\n * Returns the current user's identity, if available. `null` if not\n * logged in or the provider doesn't expose identity. Used by\n * `--whoami`-style commands.\n */\n whoami?(): Promise<{ id: string; email?: string; name?: string } | null>;\n}\n\n/**\n * No-op AuthProvider for commands that don't need auth, or for tests.\n * Calling `getToken()` throws — opt in explicitly.\n */\nexport const noopAuthProvider: AuthProvider = {\n async getToken(): Promise<string> {\n throw new Error(\n 'noopAuthProvider.getToken() called — wire a real AuthProvider via createCli({ auth })',\n );\n },\n async whoami() {\n return null;\n },\n};\n","import { Command } from 'commander';\nimport type { AuthProvider } from './auth-provider.js';\nimport { noopAuthProvider } from './auth-provider.js';\n\nexport interface CreateCliOptions {\n /** CLI binary name as it appears in `--help` and version output. */\n name: string;\n /** Semver version, usually read from the consumer's package.json. */\n version: string;\n /** One-line description shown in `--help`. */\n description?: string;\n /**\n * Auth provider injected by the consumer. Available to action\n * handlers via `program.getOptionValue(\"_auth\")` or by closing over\n * the returned reference. Defaults to a no-op that throws on use.\n */\n auth?: AuthProvider;\n}\n\nexport interface Cli {\n /** The configured commander Program. Register subcommands on it. */\n program: Command;\n /** The AuthProvider passed in (or the no-op default). */\n auth: AuthProvider;\n}\n\n/**\n * Bootstrap a commander Program with conventions shared across the\n * AgentX ecosystem: name, version, description, error formatting,\n * and a hook to access the consumer's auth provider.\n *\n * Usage:\n *\n * ```ts\n * const { program, auth } = createCli({\n * name: \"pritty\",\n * version: VERSION,\n * auth: agentAuthProvider,\n * });\n * program.command(\"commit\").action(async () => {\n * const token = await auth.getToken();\n * // ...\n * });\n * program.parse();\n * ```\n */\nexport function createCli(opts: CreateCliOptions): Cli {\n const program = new Command();\n program.name(opts.name).version(opts.version);\n if (opts.description) program.description(opts.description);\n\n // Standardize error output across the ecosystem: print to stderr,\n // exit non-zero, no commander's default \"error: ...\" prefix that\n // some users find noisy. Consumers can override with their own\n // .exitOverride() if needed.\n program.configureOutput({\n outputError: (str, write) => write(str),\n });\n\n return { program, auth: opts.auth ?? noopAuthProvider };\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { auditProject } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerAudit(program: Command): void {\n program\n .command('audit')\n .description(\n 'List what would otherwise be forgotten: unsaved work, stray checkouts, aging leases, drift, stale notices',\n )\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the findings as JSON')\n .action(async (o: { projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: true });\n const findings = await auditProject(ctx);\n if (o.json) printJson(findings);\n else if (findings.length === 0) console.log(chalk.green('nothing forgotten'));\n else\n for (const f of findings)\n console.log(\n `${chalk.yellow(f.kind.padEnd(14))} ${f.area ? `${f.area} ` : ''}${f.detail}`,\n );\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import chalk from 'chalk';\nimport {\n claimRanges,\n currentOwner,\n Git,\n homeDir,\n loadManifest,\n Registry,\n startServices,\n stopServices,\n} from '../core/index.js';\nimport type { Ctx } from './effort.js';\nimport { storybrokrCli } from './storybrokr.js';\n\n/** The repo root is the MAIN checkout of whatever checkout the caller stands in. */\nexport function resolveRepoRoot(cwd: string, override?: string): string {\n if (override) return override;\n return new Git(cwd).mainRoot();\n}\n\n/** Build the context every verb shares; the project's port ranges are claimed on first use. */\nexport async function buildCtx(\n opts: { cwd?: string; projectRoot?: string; quiet?: boolean } = {},\n): Promise<Ctx> {\n const repoRoot = resolveRepoRoot(opts.cwd ?? process.cwd(), opts.projectRoot);\n const manifest = await loadManifest(repoRoot);\n const home = homeDir();\n const registry = Registry.open(home);\n if (!registry.project(manifest.project)) claimRanges(registry, manifest, repoRoot);\n return {\n home,\n repoRoot,\n manifest,\n registry,\n owner: currentOwner(),\n runner: { start: startServices, stop: stopServices },\n storybrokr: storybrokrCli,\n log: opts.quiet ? () => {} : (line) => console.error(chalk.gray(line)),\n };\n}\n","import {\n appendFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n realpathSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { WorkkitError } from './errors.js';\nimport { Git } from './git.js';\nimport type { Manifest } from './types.js';\n\n/** Substitute `${NAME}` placeholders; an unknown name is a manifest error, never an empty string. */\nexport function renderTemplate(s: string, vars: Record<string, string>): string {\n return s.replace(/\\$\\{([A-Z0-9_]+)\\}/g, (_, name: string) => {\n if (!(name in vars)) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n `template references ${name}, which this effort does not define`,\n );\n }\n return vars[name];\n });\n}\n\nexport interface EmitConfigArgs {\n m: Manifest;\n worktree: string;\n /** absent for a frontend effort: no .slot is written and SLOT is empty */\n slot?: number;\n ports: Record<string, number>;\n storybookPort?: number;\n area: string;\n branch: string;\n}\n\nexport interface EmittedConfig {\n envFile: string;\n slotFile?: string;\n logDir: string;\n vars: Record<string, string>;\n}\n\n/** Resolves the Storybook host root inside a worktree (`worktree/<storybook.hostRoot>` or `worktree`). */\nexport function storybookHostFor(m: Manifest, worktree?: string): string {\n if (!worktree) return '';\n return m.storybook?.hostRoot ? join(worktree, m.storybook.hostRoot) : worktree;\n}\n\n/** The variables a slot derives, in the shape templates and `work env` expose. */\nexport function slotVars(\n m: Manifest,\n o: {\n slot?: number;\n ports: Record<string, number>;\n storybookPort?: number;\n area?: string;\n branch?: string;\n worktree?: string;\n logDir?: string;\n },\n): Record<string, string> {\n const vars: Record<string, string> = {\n SLOT: o.slot === undefined ? '' : String(o.slot),\n PROJECT: m.project,\n AREA: o.area ?? '',\n BRANCH: o.branch ?? '',\n WORKTREE: o.worktree ?? '',\n LOG_DIR: o.logDir ?? '',\n PORT_STORYBOOK: o.storybookPort === undefined ? '' : String(o.storybookPort),\n STORYBROKR_HOST: storybookHostFor(m, o.worktree),\n };\n for (const service of Object.keys(m.ports.services)) {\n const p = o.ports[service];\n vars[`PORT_${service.toUpperCase()}`] = p === undefined ? '' : String(p);\n }\n return vars;\n}\n\n/**\n * Make sure git never sees the emitted files: patterns go into the repo's shared\n * `info/exclude` (one per clone, applies to every worktree), so no .gitignore edit is needed.\n */\nexport function ensureExcluded(worktree: string, patterns: string[]): void {\n const r = new Git(worktree).tryRun(['rev-parse', '--path-format=absolute', '--git-common-dir']);\n if (r.code !== 0) return; // not a git checkout (tests, scratch dirs): nothing to exclude from\n const common = realpathSync(r.out.trim());\n const file = join(common, 'info', 'exclude');\n mkdirSync(join(common, 'info'), { recursive: true });\n const present = new Set(\n existsSync(file)\n ? readFileSync(file, 'utf8')\n .split('\\n')\n .map((l) => l.trim())\n : [],\n );\n const missing = patterns.filter((p) => !present.has(p));\n if (missing.length === 0) return;\n appendFileSync(\n file,\n `${present.size ? '\\n' : ''}# written by @helmsmith/workbrokr: per-worktree config and logs\\n${missing.join('\\n')}\\n`,\n );\n}\n\n/** Write `.slot`, the env file and the log dir into the worktree; nothing is tracked by git. */\nexport function emitWorktreeConfig(a: EmitConfigArgs): EmittedConfig {\n ensureExcluded(a.worktree, [\n '.slot',\n a.m.env.file,\n `${a.m.logs.dir.replace(/\\/+$/, '')}/`,\n `${a.m.worktreeRoot.replace(/\\/+$/, '')}/`,\n ]);\n const logDir = join(a.worktree, a.m.logs.dir);\n mkdirSync(logDir, { recursive: true });\n const vars = slotVars(a.m, { ...a, logDir });\n const envFile = join(a.worktree, a.m.env.file);\n const lines = Object.entries(a.m.env.template).map(([k, v]) => `${k}=${renderTemplate(v, vars)}`);\n writeFileSync(envFile, `${lines.join('\\n')}\\n`);\n let slotFile: string | undefined;\n if (a.slot !== undefined) {\n slotFile = join(a.worktree, '.slot');\n writeFileSync(slotFile, `${a.slot}\\n`);\n }\n return slotFile ? { envFile, slotFile, logDir, vars } : { envFile, logDir, vars };\n}\n","export type ErrorCode =\n | 'MANIFEST_NOT_FOUND'\n | 'MANIFEST_INVALID'\n | 'AREA_UNKNOWN'\n | 'TASK_INVALID'\n | 'TYPE_UNKNOWN'\n | 'MODE_UNKNOWN'\n | 'MODE_MISMATCH'\n | 'SCOPE_REQUIRES_TASK'\n | 'SCOPE_OUTSIDE_AREA'\n | 'MAIN_CHECKOUT'\n | 'WORKTREE_INVALID'\n | 'PROTECTED_BRANCH'\n | 'EFFORT_OPEN'\n | 'EFFORT_NOT_FOUND'\n | 'SCOPE_CONFLICT'\n | 'COMMONS_LOCKED'\n | 'NO_FREE_SLOT'\n | 'LEASE_NOT_FOUND'\n | 'PORT_RANGE_TAKEN'\n | 'SYNC_CONFLICT'\n | 'DIRTY_WORKTREE'\n | 'UNPUSHED'\n | 'HEALTH_TIMEOUT'\n | 'SERVICE_FAILED'\n | 'STORYBROKR_FAILED'\n | 'GIT_FAILED'\n | 'INTERNAL';\n\nconst REFUSALS = new Set<ErrorCode>([\n 'MANIFEST_INVALID',\n 'AREA_UNKNOWN',\n 'TASK_INVALID',\n 'TYPE_UNKNOWN',\n 'MODE_UNKNOWN',\n 'MODE_MISMATCH',\n 'SCOPE_REQUIRES_TASK',\n 'SCOPE_OUTSIDE_AREA',\n 'MAIN_CHECKOUT',\n 'WORKTREE_INVALID',\n 'PROTECTED_BRANCH',\n 'EFFORT_OPEN',\n 'EFFORT_NOT_FOUND',\n 'SCOPE_CONFLICT',\n 'COMMONS_LOCKED',\n 'NO_FREE_SLOT',\n 'LEASE_NOT_FOUND',\n 'PORT_RANGE_TAKEN',\n 'SYNC_CONFLICT',\n 'DIRTY_WORKTREE',\n 'UNPUSHED',\n]);\n\n/** 2 = refused (a rule said no), 1 = something broke. */\nexport function exitCodeFor(code: ErrorCode): 1 | 2 {\n return REFUSALS.has(code) ? 2 : 1;\n}\n\nexport class WorkkitError extends Error {\n readonly code: ErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: ErrorCode, message: string, details?: Record<string, unknown>) {\n super(message);\n this.name = 'WorkkitError';\n this.code = code;\n if (details) this.details = details;\n }\n}\n\nexport interface ErrorBody {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n/** Shape every surface (CLI --json, MCP) returns for a failure. */\nexport function toErrorBody(err: unknown): ErrorBody {\n if (err instanceof WorkkitError) {\n return err.details\n ? { code: err.code, message: err.message, details: err.details }\n : { code: err.code, message: err.message };\n }\n return { code: 'INTERNAL', message: err instanceof Error ? err.message : String(err) };\n}\n","import { spawnSync } from 'node:child_process';\nimport { existsSync, mkdirSync, realpathSync, rmSync, statSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\nimport { WorkkitError } from './errors.js';\n\nconst realpathOr = (p: string): string => {\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n};\n\n/** No control characters, whitespace or `=`: the name is spliced into a `-c submodule.<name>.url=` key. */\nconst SAFE_SUBMODULE_NAME = /^[^\\p{Cc}\\s=]+$/u;\n\nexport interface SyncResult {\n kind: 'up-to-date' | 'ff' | 'merge' | 'conflict';\n before: string;\n after: string;\n conflicted: string[];\n}\n\n/** The git operations the verbs need, each a thin, named wrapper over the CLI. */\nexport class Git {\n constructor(readonly cwd: string) {}\n\n tryRun(args: string[]): { code: number; out: string; err: string } {\n const r = spawnSync('git', args, { cwd: this.cwd, encoding: 'utf8' });\n return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };\n }\n\n run(args: string[]): string {\n const r = this.tryRun(args);\n if (r.code !== 0) {\n throw new WorkkitError(\n 'GIT_FAILED',\n `git ${args.join(' ')} (in ${this.cwd}): ${r.err.trim() || r.out.trim()}`,\n {\n args,\n cwd: this.cwd,\n },\n );\n }\n return r.out;\n }\n\n private lines(args: string[]): string[] {\n return this.run(args)\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n }\n\n /** The checkout's top level (symlinks resolved). */\n root(): string {\n return realpathSync(this.run(['rev-parse', '--show-toplevel']).trim());\n }\n\n /** The main checkout's top level, from any worktree of the repo. */\n mainRoot(): string {\n const common = realpathSync(\n this.run(['rev-parse', '--path-format=absolute', '--git-common-dir']).trim(),\n );\n return dirname(common);\n }\n\n /** The main checkout is the one whose git dir IS the common dir (compared as absolute realpaths). */\n isMainCheckout(): boolean {\n const gitDir = realpathSync(\n this.run(['rev-parse', '--path-format=absolute', '--git-dir']).trim(),\n );\n const common = realpathSync(\n this.run(['rev-parse', '--path-format=absolute', '--git-common-dir']).trim(),\n );\n return gitDir === common;\n }\n\n currentBranch(): string {\n return this.run(['branch', '--show-current']).trim();\n }\n\n branchExists(name: string): boolean {\n return this.tryRun(['rev-parse', '--verify', '-q', `refs/heads/${name}`]).code === 0;\n }\n\n remoteBranchExists(name: string): boolean {\n return this.run(['ls-remote', '--heads', 'origin', name]).trim().length > 0;\n }\n\n fetch(branch: string): void {\n this.run(['fetch', '-q', 'origin', branch]);\n }\n\n hasUpstream(): boolean {\n return this.tryRun(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}']).code === 0;\n }\n\n /** Commits on HEAD that origin does not have: against the upstream, else the same-named remote branch, else origin/<base>. */\n unpushedCount(base: string): number {\n let ref = `origin/${base}`;\n if (this.hasUpstream()) ref = '@{u}';\n else if (this.remoteBranchExists(this.currentBranch())) ref = `origin/${this.currentBranch()}`;\n return this.lines(['rev-list', `${ref}..HEAD`]).length;\n }\n\n isDirty(): boolean {\n return this.run(['status', '--porcelain']).trim().length > 0;\n }\n\n changedPathsStaged(): string[] {\n return this.lines(['diff', '--cached', '--name-only']);\n }\n\n changedPaths(from: string, to: string): string[] {\n return this.lines(['diff', '--name-only', '--no-renames', from, to]);\n }\n\n /** Paths this branch changed since it diverged from origin/<base> (three-dot), without the base's own changes. */\n changedSince(base: string): string[] {\n return this.lines(['diff', '--name-only', '--no-renames', `origin/${base}...HEAD`]);\n }\n\n commitsNotOn(base: string): string[] {\n return this.lines(['rev-list', `origin/${base}..HEAD`]);\n }\n\n rev(ref: string): string {\n return this.run(['rev-parse', ref]).trim();\n }\n\n /** Fast-forward when HEAD has no own commits, otherwise merge; never rebase. A conflict is left in place. */\n syncFrom(base: string): SyncResult {\n const target = `origin/${base}`;\n const before = this.rev('HEAD');\n const targetRev = this.rev(target);\n if (before === targetRev) return { kind: 'up-to-date', before, after: before, conflicted: [] };\n if (this.tryRun(['merge-base', '--is-ancestor', 'HEAD', target]).code === 0) {\n this.run(['merge', '--ff-only', '-q', target]);\n return { kind: 'ff', before, after: this.rev('HEAD'), conflicted: [] };\n }\n if (this.tryRun(['merge-base', '--is-ancestor', target, 'HEAD']).code === 0) {\n return { kind: 'up-to-date', before, after: before, conflicted: [] };\n }\n const merged = this.tryRun(['merge', '--no-edit', '-q', target]);\n if (merged.code === 0)\n return { kind: 'merge', before, after: this.rev('HEAD'), conflicted: [] };\n const conflicted = this.lines(['diff', '--name-only', '--diff-filter=U']);\n return { kind: 'conflict', before, after: before, conflicted };\n }\n\n worktreeAdd(path: string, branch: string, startPoint?: string): void {\n mkdirSync(dirname(path), { recursive: true });\n if (this.branchExists(branch)) this.run(['worktree', 'add', '-q', path, branch]);\n else\n this.run(['worktree', 'add', '-q', '--no-track', '-b', branch, path, startPoint ?? 'HEAD']);\n }\n\n worktreeRemove(path: string): void {\n this.run(['worktree', 'remove', '--force', path]);\n }\n\n checkout(branch: string, createFrom?: string): void {\n if (this.branchExists(branch)) this.run(['checkout', '-q', branch]);\n else this.run(['checkout', '-q', '--no-track', '-b', branch, createFrom ?? 'HEAD']);\n }\n\n push(branch: string): void {\n this.run(['push', '-q', '-u', 'origin', branch]);\n }\n\n deleteLocalBranch(branch: string): void {\n this.run(['branch', '-q', '-D', branch]);\n }\n\n isAncestor(ancestor: string, descendant: string): boolean {\n return this.tryRun(['merge-base', '--is-ancestor', ancestor, descendant]).code === 0;\n }\n\n /** True when HEAD's tree matches origin/<base>, or every commit on HEAD is patch-equivalent to origin/<base> (squash-merged). */\n isEquivalentToBase(base: string): boolean {\n const target = `origin/${base}`;\n if (this.tryRun(['diff', '--quiet', target, 'HEAD']).code === 0) return true;\n const cherry = this.tryRun(['cherry', target, 'HEAD']);\n if (cherry.code !== 0) return false;\n const lines = cherry.out\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n return lines.length > 0 && lines.every((l) => l.startsWith('- '));\n }\n\n /**\n * Give a linked worktree its own clone of every submodule the main checkout has initialized,\n * cloned locally from the main checkout's module directory (no network) and then re-pointed at\n * the real URL. `git worktree add` under submodule.recurse leaves a gitfile aimed at a module\n * directory that was never cloned; a gitfile aimed at the MAIN checkout's module directory is\n * worse, because that module's core.worktree is the main checkout's submodule, so any git\n * command in the worktree's submodule (checkout -f, reset, merge) rewrites the human's files.\n * Both shapes are replaced; a submodule that is already its own working tree is left alone.\n */\n repairSubmodules(mainRoot: string, log: (line: string) => void = () => {}): void {\n const gitmodules = join(this.cwd, '.gitmodules');\n if (!existsSync(gitmodules)) return;\n const cfg = this.tryRun([\n 'config',\n '-f',\n '.gitmodules',\n '--get-regexp',\n '^submodule\\\\..*\\\\.path$',\n ]);\n if (cfg.code !== 0) return;\n const wtGitDir = this.run(['rev-parse', '--path-format=absolute', '--git-dir']).trim();\n for (const line of cfg.out.split('\\n').filter(Boolean)) {\n const m = /^submodule\\.(.+)\\.path\\s+(.+)$/.exec(line.trim());\n if (!m) continue;\n const [, name, subPath] = m as unknown as [string, string, string];\n // the name becomes a path segment under <git-dir>/modules and a config key: refuse anything\n // git itself would reject (CVE-2018-11235 shape) before we delete or spawn with it\n const modulesDir = resolve(wtGitDir, 'modules');\n const moduleDir = resolve(modulesDir, name);\n if (\n !SAFE_SUBMODULE_NAME.test(name) ||\n name.split(/[\\\\/]/).some((seg) => seg === '' || seg === '.' || seg === '..') ||\n !moduleDir.startsWith(modulesDir + sep)\n ) {\n log(`submodule ${subPath}: refusing name ${JSON.stringify(name)}; not repaired`);\n continue;\n }\n const wtSub = join(this.cwd, subPath);\n const wtGit = join(wtSub, '.git');\n if (this.isOwnSubmodule(wtSub, wtGit)) continue;\n const mainSub = join(mainRoot, subPath);\n if (!existsSync(join(mainSub, '.git'))) continue; // never initialized there: nothing to clone from\n const src = new Git(mainSub).tryRun(['rev-parse', '--path-format=absolute', '--git-dir']);\n if (src.code !== 0 || !src.out.trim()) continue;\n // a stale or borrowed gitfile and a half-made module dir both make `submodule update` refuse\n if (existsSync(wtGit) && statSync(wtGit).isFile()) rmSync(wtGit);\n rmSync(moduleDir, { recursive: true, force: true });\n const r = this.tryRun([\n '-c',\n 'protocol.file.allow=always',\n '-c',\n `submodule.${name}.url=${src.out.trim()}`,\n 'submodule',\n 'update',\n '--init',\n '--',\n subPath,\n ]);\n if (r.code !== 0) {\n log(\n `submodule ${subPath}: not repaired (${(r.err || r.out).trim()}); the project's refresh steps may still set it up`,\n );\n continue;\n }\n this.tryRun(['submodule', 'sync', '-q', '--', subPath]); // back to the .gitmodules URL\n }\n }\n\n /** A submodule is the worktree's own when git, run inside it, says its top level IS that directory. */\n private isOwnSubmodule(wtSub: string, wtGit: string): boolean {\n if (!existsSync(wtGit)) return false;\n const top = new Git(wtSub).tryRun(['rev-parse', '--show-toplevel']);\n if (top.code !== 0) return false;\n return realpathOr(top.out.trim()) === realpathOr(wtSub);\n }\n}\n","import { existsSync, realpathSync } from 'node:fs';\nimport { WorkkitError } from './errors.js';\nimport type { Git } from './git.js';\nimport type { Registry } from './registry.js';\nimport { allowedScopesForEffort, commonsTouched, pathsMatching } from './scopes.js';\nimport type { Effort, Manifest } from './types.js';\n\nexport function assertNotProtected(m: Manifest, branch: string): void {\n if (m.protectedBranches.includes(branch)) {\n throw new WorkkitError(\n 'PROTECTED_BRANCH',\n `branch \"${branch}\" is protected (${m.protectedBranches.join(', ')}): work happens on <type>/<area> branches, never here`,\n { branch },\n );\n }\n}\n\nexport function assertNotMainCheckout(git: Git): void {\n if (git.isMainCheckout()) {\n throw new WorkkitError(\n 'MAIN_CHECKOUT',\n `${git.cwd} is the main checkout, which is a mirror of the base branch: run \\`work start\\` to get an area worktree`,\n { cwd: git.cwd },\n );\n }\n}\n\nconst same = (a: string, b: string) => {\n try {\n return realpathSync(a) === realpathSync(b);\n } catch {\n return a === b;\n }\n};\n\nconst effortLabel = (e: Pick<Effort, 'area' | 'task'>) =>\n e.task ? `${e.area}--${e.task}` : e.area;\n\nexport interface CommitCheck {\n m: Manifest;\n registry: Registry;\n git: Git;\n project: string;\n branch: string;\n stagedPaths: string[];\n ownerSession: string;\n /** the committing checkout's top level: a lock held by the effort living there is the committer's own */\n checkoutRoot?: string;\n}\n\n/** What a pre-commit hook asks: may this commit be made? Refusals are sentences for stderr. */\nexport function checkCommit(c: CommitCheck): { refusals: string[]; warnings: string[] } {\n const refusals: string[] = [];\n const warnings: string[] = [];\n if (c.m.protectedBranches.includes(c.branch)) {\n refusals.push(\n `branch \"${c.branch}\" is protected (${c.m.protectedBranches.join(', ')}): work happens on <type>/<area> branches, never here`,\n );\n }\n const allEfforts = c.registry.efforts({ project: c.project });\n const efforts = new Map(allEfforts.map((e) => [e.id, e]));\n for (const lease of c.registry.leases({ project: c.project, kind: 'commons' })) {\n const holder = efforts.get(lease.effort);\n const holderHasWorktree = Boolean(holder && existsSync(holder.worktree));\n if (holder && holderHasWorktree && c.checkoutRoot) {\n if (same(holder.worktree, c.checkoutRoot)) continue;\n } else if (lease.owner.session === c.ownerSession) {\n continue;\n }\n const globs = c.m.commons[String(lease.value)] ?? [];\n const hit = pathsMatching(c.stagedPaths, globs);\n if (hit.length > 0) {\n refusals.push(\n `commons \"${lease.value}\" is write-locked by ${lease.owner.session} (effort ${lease.effort}, since ${lease.touched}); staged: ${hit.join(', ')}`,\n );\n }\n }\n const openEfforts = allEfforts.filter((e) => e.state === 'active' || e.state === 'starting');\n for (const other of openEfforts) {\n if (c.checkoutRoot && existsSync(other.worktree) && same(other.worktree, c.checkoutRoot)) {\n continue;\n }\n if (!c.checkoutRoot && other.branch === c.branch) continue;\n const hit = pathsMatching(c.stagedPaths, other.scopes);\n if (hit.length > 0) {\n refusals.push(\n `path(s) ${hit.join(', ')} are inside the active scope of ${effortLabel(other)} (${other.branch}, owned by ${other.owner.session})`,\n );\n }\n }\n const mine = openEfforts.find((e) =>\n c.checkoutRoot && existsSync(e.worktree)\n ? same(e.worktree, c.checkoutRoot)\n : e.branch === c.branch,\n );\n if (mine && c.stagedPaths.length > 0) {\n const allowed = allowedScopesForEffort(c.m, mine);\n const inScope = new Set(pathsMatching(c.stagedPaths, allowed));\n const outside = c.stagedPaths.filter((p) => !inScope.has(p));\n if (outside.length > 0) {\n warnings.push(\n `${outside.length} staged path(s) are outside the effort's scope (${effortLabel(mine)}): ${outside.join(', ')}`,\n );\n }\n }\n return { refusals, warnings };\n}\n\nexport interface PushCheck {\n m: Manifest;\n registry: Registry;\n git: Git;\n project: string;\n /** the local branch being pushed ('' for a delete) */\n branch: string;\n /** the destination ref (`refs/heads/<name>`); absent = same name as the local branch */\n remoteRef?: string;\n isDelete?: boolean;\n changedPaths: string[];\n}\n\n/** What a pre-push hook asks: a protected destination → refusal; leaving the scope or touching commons → warnings. */\nexport function checkPush(c: PushCheck): { refusals: string[]; warnings: string[] } {\n const refusals: string[] = [];\n const warnings: string[] = [];\n const destination = (c.remoteRef ?? `refs/heads/${c.branch}`).replace(/^refs\\/heads\\//, '');\n if (c.m.protectedBranches.includes(destination)) {\n refusals.push(\n c.isDelete\n ? `refusing to delete protected branch \"${destination}\"`\n : `\"${destination}\" is protected (${c.m.protectedBranches.join(', ')}): nothing is pushed to it directly, open a PR from ${c.branch || 'an area branch'}`,\n );\n return { refusals, warnings };\n }\n if (c.isDelete) return { refusals, warnings };\n const effort = c.registry\n .efforts({ project: c.project })\n .find((e) => (e.state === 'active' || e.state === 'parked') && e.branch === c.branch);\n const commons = commonsTouched(c.m, c.changedPaths);\n if (effort) {\n const allowed = allowedScopesForEffort(c.m, effort);\n const inScope = new Set(pathsMatching(c.changedPaths, allowed));\n const outside = c.changedPaths.filter((p) => !inScope.has(p));\n if (outside.length > 0) {\n warnings.push(\n `${outside.length} changed path(s) are outside the effort's scope (${effortLabel(effort)}): ${outside.join(', ')} — add a scope template or expect a merge collision`,\n );\n }\n }\n for (const name of commons)\n warnings.push(`commons ${name} touched: the other areas are told at \\`work finish\\``);\n return { refusals, warnings };\n}\n","import picomatch from 'picomatch';\nimport { WorkkitError } from './errors.js';\nimport type { AreaSpec, Effort, Manifest, Mode } from './types.js';\n\n/** `{group}` = every segment but the last, `{section}` = the last segment of an area path. */\nexport function areaVars(area: string): { group: string; section: string } {\n const parts = area.split('/');\n return { group: parts.slice(0, -1).join('/'), section: parts[parts.length - 1] };\n}\n\nfunction fill(template: string, vars: Record<string, string | undefined>): string | null {\n let missing = false;\n const out = template.replace(/\\{(group|section|module)\\}/g, (_, name: string) => {\n const v = vars[name];\n if (v === undefined || v === '') {\n missing = true;\n return '';\n }\n return v;\n });\n return missing ? null : out;\n}\n\nfunction extraScopesForMode(spec: AreaSpec, mode: Mode): string[] {\n if (!spec.extraScopes) return [];\n if (Array.isArray(spec.extraScopes)) {\n return mode === 'frontend' || mode === 'fullstack' ? spec.extraScopes : [];\n }\n const out: string[] = [];\n if (mode === 'frontend' || mode === 'fullstack') out.push(...(spec.extraScopes.frontend ?? []));\n if (mode === 'backend' || mode === 'fullstack') out.push(...(spec.extraScopes.backend ?? []));\n return out;\n}\n\nconst normalizeGlob = (g: string) => g.replace(/^\\.\\//, '').replace(/\\/+$/, '');\nconst hasWildcard = (s: string) => /[*?[{]/.test(s);\n\n/** True when every path matched by `child` is guaranteed to be inside `parent`. */\nexport function isSubGlob(child: string, parent: string): boolean {\n const c = normalizeGlob(child);\n const p = normalizeGlob(parent);\n if (c === p) return true;\n const cSegs = c.split('/');\n const pSegs = p.split('/');\n for (let i = 0; i < pSegs.length; i++) {\n const ps = pSegs[i];\n if (ps === '**') return true;\n const cs = cSegs[i];\n if (cs === undefined || cs === '**') return false;\n if (!hasWildcard(ps) && !hasWildcard(cs)) {\n if (ps !== cs) return false;\n continue;\n }\n if (!hasWildcard(cs) && hasWildcard(ps)) {\n if (!picomatch.isMatch(cs, ps, { dot: true })) return false;\n continue;\n }\n if (cs !== ps) return false;\n }\n return cSegs.length === pSegs.length;\n}\n\n/** The globs an effort on `area` holds exclusively in `mode`; backend/fullstack templates need the area's module. */\nexport function expandScopes(\n m: Manifest,\n area: string,\n mode: Mode,\n narrowedScopes?: string[],\n hasTask = false,\n): string[] {\n const spec = m.areas[area];\n if (!spec)\n throw new WorkkitError(\n 'AREA_UNKNOWN',\n `unknown area \"${area}\" (known: ${Object.keys(m.areas).join(', ')})`,\n );\n const vars = { ...areaVars(area), module: spec.module };\n const out: string[] = [];\n if (mode === 'frontend' || mode === 'fullstack') {\n for (const t of m.scopes.frontend) {\n const g = fill(t, vars);\n if (g) out.push(g);\n }\n }\n if (mode === 'backend' || mode === 'fullstack') {\n if (!spec.module) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n `area \"${area}\" has no module, so a ${mode} effort cannot hold a backend scope; add areas[\"${area}\"].module or use --mode frontend`,\n );\n }\n for (const t of m.scopes.backend) {\n const g = fill(t, vars);\n if (g) out.push(g);\n }\n }\n out.push(...extraScopesForMode(spec, mode));\n if (!narrowedScopes || narrowedScopes.length === 0) return out;\n if (!hasTask) {\n throw new WorkkitError(\n 'SCOPE_REQUIRES_TASK',\n '--scope narrowing requires --task <slug> so primary area efforts always protect the full area',\n );\n }\n const allowed = [...out, ...(spec.sharedScopes ?? [])];\n for (const g of narrowedScopes) {\n if (!allowed.some((base) => isSubGlob(g, base))) {\n throw new WorkkitError(\n 'SCOPE_OUTSIDE_AREA',\n `narrowed scope \"${g}\" is outside ${area}'s ${mode} scopes (${allowed.join(', ')})`,\n { area, mode, scope: g, allowed },\n );\n }\n }\n return narrowedScopes;\n}\n\n/** All globs an effort is allowed to touch without an out-of-scope warning (exclusive scopes + sharedScopes + commons). */\nexport function allowedScopesForEffort(\n m: Manifest,\n effort: Pick<Effort, 'area' | 'scopes'>,\n): string[] {\n const shared = m.areas[effort.area]?.sharedScopes ?? [];\n const allCommons = Object.values(m.commons).flat();\n return [...effort.scopes, ...shared, ...allCommons];\n}\n\n/** The part of a glob before its first wildcard character. */\nexport function literalPrefix(glob: string): string {\n const i = glob.search(/[*?[{]/);\n return i < 0 ? glob : glob.slice(0, i);\n}\n\nfunction segmentsOverlap(sx: string, sy: string): boolean {\n if (sx === sy) return true;\n const wx = hasWildcard(sx);\n const wy = hasWildcard(sy);\n if (!wx && !wy) return false;\n if (!wx && wy) return picomatch.isMatch(sx, sy, { dot: true });\n if (wx && !wy) return picomatch.isMatch(sy, sx, { dot: true });\n const starToken = /^\\*([^*?[{]+)\\*$/;\n const mx = starToken.exec(sx);\n const my = starToken.exec(sy);\n if (mx && my) {\n const tx = mx[1];\n const ty = my[1];\n return tx.includes(ty) || ty.includes(tx);\n }\n return true;\n}\n\nfunction twoGlobsOverlap(x: string, y: string): boolean {\n const xs = normalizeGlob(x).split('/');\n const ys = normalizeGlob(y).split('/');\n const len = Math.min(xs.length, ys.length);\n for (let i = 0; i < len; i++) {\n if (xs[i] === '**' || ys[i] === '**') return true;\n if (!segmentsOverlap(xs[i], ys[i])) return false;\n }\n if (xs.length === ys.length) return true;\n const longer = xs.length > ys.length ? xs : ys;\n return longer[len] === '**';\n}\n\n/** Pairs `a ~ b` whose path segments overlap. */\nexport function globsOverlap(a: string[], b: string[]): string[] {\n const pairs: string[] = [];\n for (const x of a) {\n for (const y of b) {\n if (twoGlobsOverlap(x, y)) pairs.push(`${x} ~ ${y}`);\n }\n }\n return pairs;\n}\n\nexport function pathsMatching(paths: string[], globs: string[]): string[] {\n if (globs.length === 0) return [];\n const isMatch = picomatch(globs, { dot: true });\n return paths.filter((p) => isMatch(p));\n}\n\n/** Names of the commons any of `paths` falls under. */\nexport function commonsTouched(m: Manifest, paths: string[]): string[] {\n return Object.entries(m.commons)\n .filter(([, globs]) => pathsMatching(paths, globs).length > 0)\n .map(([name]) => name);\n}\n","import { chmodSync, lstatSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { WorkkitError } from './errors.js';\nimport { Git } from './git.js';\nimport { BRANCH_NAME } from './manifest.js';\n\nexport const HOOKS_DIR = '.helmsmith/hooks';\n\n/**\n * The protected-branch rule is enforced by the shell script itself, with the list baked in at\n * install time, so it holds in a GUI client or a shell without `workbrokr` on PATH. Only the\n * commons and scope checks need the binary; without it they are skipped with a warning.\n */\nfunction preCommitScript(protectedBranches: string[]): string {\n return `#!/bin/sh\n# Installed by \\`work init\\` (@helmsmith/workbrokr). The protected-branch rule lives here; the rest in workbrokr.\nPROTECTED=\"${protectedBranches.join(' ')}\"\nbranch=$(git symbolic-ref --short -q HEAD)\nfor p in $PROTECTED; do\n if [ \"$branch\" = \"$p\" ]; then\n echo \"work: branch \\\\\"$branch\\\\\" is protected ($PROTECTED): work happens on <type>/<area> branches, never here\" >&2\n exit 2\n fi\ndone\nif command -v workbrokr >/dev/null 2>&1; then\n workbrokr hook pre-commit \"$@\" || exit $?\nelse\n echo \"work: workbrokr is not on PATH; commons and scope checks skipped (npm i -g @helmsmith/workbrokr)\" >&2\nfi\nCOMMON_DIR=$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null)\nLEGACY=\"$COMMON_DIR/hooks/pre-commit\"\nif [ -n \"$COMMON_DIR\" ] && [ -x \"$LEGACY\" ]; then\n SELF_DIR=$(cd \"$(dirname \"$0\")\" && pwd)\n LEGACY_DIR=$(cd \"$(dirname \"$LEGACY\")\" && pwd)\n if [ \"$SELF_DIR\" != \"$LEGACY_DIR\" ]; then\n exec \"$LEGACY\" \"$@\"\n fi\nfi\nexit 0\n`;\n}\n\nfunction prePushScript(protectedBranches: string[]): string {\n return `#!/bin/sh\n# Installed by \\`work init\\` (@helmsmith/workbrokr). Refuses a push to, or a delete of, a protected branch here; the rest in workbrokr.\nPROTECTED=\"${protectedBranches.join(' ')}\"\ninput=$(cat)\nprintf '%s\\\\n' \"$input\" | while read -r lref lsha rref rsha; do\n [ -n \"$rref\" ] || continue\n dest=\\${rref#refs/heads/}\n for p in $PROTECTED; do\n if [ \"$dest\" = \"$p\" ]; then\n echo \"work: \\\\\"$dest\\\\\" is protected ($PROTECTED): nothing is pushed to it directly, open a PR from an area branch\" >&2\n exit 2\n fi\n done\ndone || exit 2\nif command -v workbrokr >/dev/null 2>&1; then\n printf '%s\\\\n' \"$input\" | workbrokr hook pre-push \"$@\" || exit $?\nelse\n echo \"work: workbrokr is not on PATH; scope and commons warnings skipped\" >&2\nfi\nCOMMON_DIR=$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null)\nLEGACY=\"$COMMON_DIR/hooks/pre-push\"\nif [ -n \"$COMMON_DIR\" ] && [ -x \"$LEGACY\" ]; then\n SELF_DIR=$(cd \"$(dirname \"$0\")\" && pwd)\n LEGACY_DIR=$(cd \"$(dirname \"$LEGACY\")\" && pwd)\n if [ \"$SELF_DIR\" != \"$LEGACY_DIR\" ]; then\n printf '%s\\\\n' \"$input\" | exec \"$LEGACY\" \"$@\"\n fi\nfi\nexit 0\n`;\n}\n\nexport function installHooks(\n repoRoot: string,\n opts: { protectedBranches: string[] },\n): { hooksDir: string; files: string[] } {\n for (const b of opts.protectedBranches) {\n if (!BRANCH_NAME.test(b))\n throw new WorkkitError('MANIFEST_INVALID', `protected branch \"${b}\" is not a plain ref name`);\n }\n const hooksDir = join(repoRoot, HOOKS_DIR);\n mkdirSync(hooksDir, { recursive: true });\n const files: string[] = [];\n const scripts: [string, string][] = [\n ['pre-commit', preCommitScript(opts.protectedBranches)],\n ['pre-push', prePushScript(opts.protectedBranches)],\n ];\n for (const [name, body] of scripts) {\n const file = join(hooksDir, name);\n // A symlink planted at the hook's path would turn this write into a write elsewhere.\n let existing: ReturnType<typeof lstatSync> | undefined;\n try {\n existing = lstatSync(file);\n } catch {\n existing = undefined;\n }\n if (existing?.isSymbolicLink()) {\n throw new WorkkitError('INTERNAL', `refusing to write hook ${file}: it is a symlink`, {\n file,\n });\n }\n writeFileSync(file, body);\n chmodSync(file, 0o755);\n files.push(file);\n }\n new Git(repoRoot).run(['config', 'core.hooksPath', HOOKS_DIR]);\n return { hooksDir, files };\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { z } from 'zod';\nimport { WorkkitError } from './errors.js';\nimport type { Manifest } from './types.js';\n\nexport const MANIFEST_FILES = [\n 'helmsmith.config.ts',\n 'helmsmith.config.mjs',\n 'helmsmith.config.json',\n] as const;\n\n/**\n * Branch names the manifest may protect or base on. Git allows more (`$`, `\"`, `;`, backticks), but\n * these names are baked into the installed hook scripts, so only shell-inert characters pass.\n */\nexport const BRANCH_NAME = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;\nconst BRANCH_NAME_HINT = 'must be a plain ref name: letters, digits, \".\", \"_\", \"/\", \"-\"';\nexport const TASK_SLUG = /^(?!.*--)[a-z0-9][a-z0-9_-]{0,47}$/;\n\nconst Service = z.object({\n start: z.string().min(1),\n stop: z.string().min(1),\n health: z.string().min(1),\n healthyCodes: z.array(z.number().int()).optional(),\n reset: z.string().optional(),\n healthTimeoutMs: z.number().int().positive().optional(),\n modes: z.array(z.enum(['backend', 'fullstack'])).optional(),\n});\n\nconst ExtraScopes = z.union([\n z.array(z.string()),\n z.object({\n frontend: z.array(z.string()).optional(),\n backend: z.array(z.string()).optional(),\n }),\n]);\n\nconst Schema = z.object({\n project: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),\n baseBranch: z.string().regex(BRANCH_NAME, BRANCH_NAME_HINT),\n protectedBranches: z.array(z.string().regex(BRANCH_NAME, BRANCH_NAME_HINT)).optional(),\n worktreeRoot: z.string().default('.claude/worktrees'),\n branch: z\n .object({ types: z.array(z.string().regex(/^[a-z]+$/)).min(1) })\n .default({ types: ['feature', 'chore', 'fix'] }),\n slots: z\n .object({\n count: z.number().int().min(1).max(100),\n reserved: z.array(z.number().int().min(0)),\n })\n .default({ count: 10, reserved: [0] }),\n ports: z.object({\n services: z.record(z.string(), z.object({ base: z.number().int().min(1024).max(65535) })),\n }),\n services: z.record(z.string(), Service),\n storybook: z.object({ hostRoot: z.string() }).optional(),\n logs: z.object({ dir: z.string() }).default({ dir: '.logs' }),\n env: z.object({ file: z.string(), template: z.record(z.string(), z.string()) }).optional(),\n seed: z.array(z.string().min(1)).optional(),\n refresh: z\n .array(\n z.object({\n when: z.string().optional(),\n always: z.boolean().optional(),\n run: z.string().optional(),\n mark: z.string().optional(),\n restoreWhenIfClean: z.boolean().optional(),\n }),\n )\n .default([]),\n scopes: z.object({ frontend: z.array(z.string()), backend: z.array(z.string()) }),\n areas: z.record(\n z.string().regex(/^(?!.*--)[a-z0-9-]+(\\/[a-z0-9-]+)*$/),\n z.object({\n module: z.string().optional(),\n commons: z.array(z.string()).optional(),\n extraScopes: ExtraScopes.optional(),\n sharedScopes: z.array(z.string()).optional(),\n }),\n ),\n commons: z.record(z.string(), z.array(z.string())).default({}),\n expiry: z\n .object({\n slotHours: z.number().positive(),\n commonsHours: z.number().positive(),\n storybookHours: z.number().positive(),\n })\n .default({ slotHours: 12, commonsHours: 4, storybookHours: 2 }),\n archive: z\n .object({\n paths: z.array(z.string()),\n keepDays: z.number().int().positive(),\n keepPerArea: z.number().int().positive(),\n })\n .default({ paths: [], keepDays: 30, keepPerArea: 5 }),\n});\n\n/** Variables the env template may reference. */\nexport function templateVariables(m: {\n ports: { services: Record<string, unknown> };\n}): Set<string> {\n const vars = new Set([\n 'SLOT',\n 'LOG_DIR',\n 'PROJECT',\n 'AREA',\n 'BRANCH',\n 'WORKTREE',\n 'PORT_STORYBOOK',\n 'STORYBROKR_HOST',\n ]);\n for (const s of Object.keys(m.ports.services)) vars.add(`PORT_${s.toUpperCase()}`);\n return vars;\n}\n\nfunction defaultEnv(services: string[]): Manifest['env'] {\n // biome-ignore lint/suspicious/noTemplateCurlyInString: these ARE the manifest's template placeholders\n const template: Record<string, string> = {\n // biome-ignore lint/suspicious/noTemplateCurlyInString: manifest template placeholder\n SLOT: '${SLOT}',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: manifest template placeholder\n LOG_DIR: '${LOG_DIR}',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: manifest template placeholder\n STORYBROKR_HOST: '${STORYBROKR_HOST}',\n };\n for (const s of services) template[`PORT_${s.toUpperCase()}`] = `\\${PORT_${s.toUpperCase()}}`;\n return { file: '.env.slot', template };\n}\n\nexport function validateManifest(raw: unknown): Manifest {\n const parsed = Schema.safeParse(raw);\n if (!parsed.success) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n );\n }\n const m = parsed.data;\n const problems: string[] = [];\n const areas = Object.keys(m.areas).sort();\n for (const a of areas) {\n for (const b of areas) {\n if (a !== b && b.startsWith(`${a}/`)) {\n problems.push(`area \"${a}\" is an ancestor of \"${b}\": areas must be leaves`);\n }\n }\n }\n for (const s of Object.keys(m.services)) {\n if (!m.ports.services[s]) problems.push(`service \"${s}\" has no port base under ports.services`);\n }\n for (const s of Object.keys(m.ports.services)) {\n if (!m.services[s] && s !== 'storybook') problems.push(`port \"${s}\" names no service`);\n }\n for (const r of m.slots.reserved) {\n if (r >= m.slots.count) problems.push(`reserved slot ${r} is outside 0..${m.slots.count - 1}`);\n }\n const env = m.env ?? defaultEnv(Object.keys(m.ports.services));\n const allowed = templateVariables(m);\n for (const [k, v] of Object.entries(env.template)) {\n for (const [, name] of v.matchAll(/\\$\\{([A-Z0-9_]+)\\}/g)) {\n if (!allowed.has(name)) {\n problems.push(\n `env.template.${k} references ${name}, which no slot derives (allowed: ${[...allowed].join(', ')})`,\n );\n }\n }\n }\n for (const [area, spec] of Object.entries(m.areas)) {\n for (const c of spec.commons ?? []) {\n if (!m.commons[c])\n problems.push(`area \"${area}\" names commons \"${c}\", which is not declared`);\n }\n }\n if (problems.length) throw new WorkkitError('MANIFEST_INVALID', problems.join('; '));\n return { ...m, protectedBranches: m.protectedBranches ?? [m.baseBranch], env } as Manifest;\n}\n\nexport async function loadManifest(repoRoot: string): Promise<Manifest> {\n for (const name of MANIFEST_FILES) {\n const file = join(repoRoot, name);\n if (!existsSync(file)) continue;\n if (name.endsWith('.json')) return validateManifest(JSON.parse(readFileSync(file, 'utf8')));\n // Node >= 24 strips types from an imported .ts file natively; the query string defeats the\n // module cache so a re-read inside one process sees edits.\n const mod = (await import(`${pathToFileURL(file).href}?t=${Date.now()}`)) as {\n default?: unknown;\n };\n return validateManifest(mod.default);\n }\n throw new WorkkitError(\n 'MANIFEST_NOT_FOUND',\n `no ${MANIFEST_FILES.join(' | ')} in ${repoRoot}; run \\`work init\\``,\n );\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport function homeDir(env: NodeJS.ProcessEnv = process.env): string {\n return env.HELMSMITH_HOME && env.HELMSMITH_HOME.length > 0\n ? env.HELMSMITH_HOME\n : join(homedir(), '.cache', 'helmsmith');\n}\n\nexport const registryFile = (home: string) => join(home, 'registry.json');\nexport const lockDir = (home: string) => join(home, 'registry.lock');\n","import { WorkkitError } from './errors.js';\nimport type { Registry } from './registry.js';\nimport type { Manifest } from './types.js';\n\nexport interface PortRange {\n base: number;\n count: number;\n}\n\n/** Slot N's port for every service: base + N. */\nexport function portsForSlot(m: Manifest, slot: number): Record<string, number> {\n return Object.fromEntries(\n Object.entries(m.ports.services).map(([service, { base }]) => [service, base + slot]),\n );\n}\n\n/** The ports a project claims: one range [base, base + slots.count) per service. */\nexport function rangesFor(m: Manifest): Record<string, PortRange> {\n return Object.fromEntries(\n Object.entries(m.ports.services).map(([service, { base }]) => [\n service,\n { base, count: m.slots.count },\n ]),\n );\n}\n\nexport function rangesOverlap(a: PortRange, b: PortRange): boolean {\n return a.base < b.base + b.count && b.base < a.base + a.count;\n}\n\n/**\n * Record the project's ranges in the registry. Idempotent for the same project; refuses when\n * another project already holds an overlapping range, naming it and the service.\n */\nexport function claimRanges(registry: Registry, m: Manifest, repoRoot: string): void {\n const mine = rangesFor(m);\n const others = Object.entries(registry.read().projects).filter(([name]) => name !== m.project);\n for (const [service, range] of Object.entries(mine)) {\n for (const [name, entry] of others) {\n for (const [theirService, theirs] of Object.entries(entry.ranges)) {\n if (rangesOverlap(range, theirs)) {\n throw new WorkkitError(\n 'PORT_RANGE_TAKEN',\n `ports ${range.base}-${range.base + range.count - 1} for \"${service}\" overlap project \"${name}\" (${theirService}: ${theirs.base}-${theirs.base + theirs.count - 1}); pick another base in ports.services.${service}`,\n { project: name, service, theirs },\n );\n }\n }\n }\n }\n registry.upsertProject(m.project, { root: repoRoot, ranges: mine });\n}\n","import { spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport picomatch from 'picomatch';\nimport { WorkkitError } from './errors.js';\nimport type { RefreshEntry } from './types.js';\n\nfunction matchesWhen(glob: string): (p: string) => boolean {\n const isMatch = picomatch(glob, { dot: true });\n return (p) => isMatch(p);\n}\n\nfunction readStamps(stampFile?: string): Record<string, string> {\n if (!stampFile || !existsSync(stampFile)) return {};\n try {\n return JSON.parse(readFileSync(stampFile, 'utf8')) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\nfunction writeStamps(stampFile: string, stamps: Record<string, string>): void {\n mkdirSync(dirname(stampFile), { recursive: true });\n writeFileSync(stampFile, `${JSON.stringify(stamps, null, 2)}\\n`);\n}\n\nfunction matchedFilesInWorktree(worktree: string, whenGlob: string): string[] {\n if (!/[*?[{]/.test(whenGlob)) {\n return existsSync(join(worktree, whenGlob)) ? [whenGlob] : [];\n }\n const r = spawnSync('git', ['ls-files'], { cwd: worktree, encoding: 'utf8' });\n if (r.status !== 0) return [];\n const isMatch = matchesWhen(whenGlob);\n return (r.stdout ?? '')\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0 && isMatch(l) && existsSync(join(worktree, l)));\n}\n\nfunction hashFiles(worktree: string, relPaths: string[]): string | null {\n if (relPaths.length === 0) return null;\n const h = createHash('sha256');\n for (const rel of [...relPaths].sort()) {\n const abs = join(worktree, rel);\n if (!existsSync(abs)) continue;\n h.update(`${rel}\\0`);\n h.update(readFileSync(abs));\n h.update('\\0');\n }\n return h.digest('hex');\n}\n\nfunction isFileCleanInGit(worktree: string, relPath: string): boolean {\n const r = spawnSync('git', ['status', '--porcelain', '--', relPath], {\n cwd: worktree,\n encoding: 'utf8',\n });\n return r.status === 0 && (r.stdout ?? '').trim().length === 0;\n}\n\nexport interface SelectRefreshOptions {\n worktree?: string;\n stampFile?: string;\n}\n\nexport interface SelectRefreshResult {\n runs: string[];\n marks: string[];\n pendingStamps?: Record<string, string>;\n cleanWhenFiles?: string[];\n}\n\n/** Which refresh commands and marks a sync's changed paths or unstamped `when` files call for, in manifest order. */\nexport function selectRefresh(\n entries: RefreshEntry[],\n changedPaths: string[],\n opts?: SelectRefreshOptions,\n): SelectRefreshResult {\n const runs: string[] = [];\n const marks: string[] = [];\n const stored = readStamps(opts?.stampFile);\n const pendingStamps: Record<string, string> = { ...stored };\n const cleanWhenFiles = new Set<string>();\n\n for (const e of entries) {\n let hit = e.always === true;\n let matchedFiles: string[] = [];\n if (e.when !== undefined) {\n const byChanged = changedPaths.some(matchesWhen(e.when));\n if (opts?.worktree) {\n matchedFiles = matchedFilesInWorktree(opts.worktree, e.when);\n const digest = hashFiles(opts.worktree, matchedFiles);\n if (digest !== null) {\n if (stored[e.when] !== digest) hit = true;\n pendingStamps[e.when] = digest;\n }\n }\n if (byChanged) hit = true;\n }\n if (!hit) continue;\n if (e.run) {\n runs.push(e.run);\n if (opts?.worktree && e.when && e.restoreWhenIfClean !== false) {\n for (const f of matchedFiles) {\n if (isFileCleanInGit(opts.worktree, f)) cleanWhenFiles.add(f);\n }\n }\n }\n if (e.mark) marks.push(e.mark);\n }\n if (!opts?.worktree) return { runs, marks };\n return {\n runs,\n marks,\n pendingStamps,\n cleanWhenFiles: [...cleanWhenFiles],\n };\n}\n\nexport interface RunRefreshOptions {\n stampFile?: string;\n pendingStamps?: Record<string, string>;\n restoreFiles?: string[];\n}\n\n/** Run each command through `sh -c` in the worktree; the first failure names its command. */\nexport function runRefresh(\n runs: string[],\n cwd: string,\n log: (line: string) => void,\n env: NodeJS.ProcessEnv = process.env,\n opts?: RunRefreshOptions,\n): void {\n for (const cmd of runs) {\n log(`$ ${cmd}`);\n const r = spawnSync('sh', ['-c', cmd], { cwd, env, encoding: 'utf8' });\n if (r.stdout) log(r.stdout.trimEnd());\n if (r.stderr) log(r.stderr.trimEnd());\n if (r.status !== 0) {\n throw new WorkkitError('INTERNAL', `refresh command failed (${r.status}): ${cmd}`, {\n cmd,\n status: r.status,\n });\n }\n }\n if (opts?.restoreFiles && opts.restoreFiles.length > 0) {\n for (const rel of opts.restoreFiles) {\n if (!isFileCleanInGit(cwd, rel)) {\n spawnSync('git', ['checkout', '--', rel], { cwd, encoding: 'utf8' });\n }\n }\n }\n if (opts?.stampFile && opts.pendingStamps) {\n writeStamps(opts.stampFile, opts.pendingStamps);\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { WorkkitError } from './errors.js';\nimport { lockDir, registryFile } from './paths.js';\nimport { portsForSlot } from './ports.js';\nimport type {\n Effort,\n Lease,\n LeaseKind,\n Manifest,\n Notice,\n Owner,\n ProjectEntry,\n RegistryFile,\n} from './types.js';\n\nexport const newId = (prefix: string) => `${prefix}_${randomBytes(4).toString('hex')}`;\n\nconst EMPTY: RegistryFile = { version: 1, projects: {}, leases: [], efforts: [] };\nconst LOCK_STALE_MS = 30_000;\nconst LOCK_WAIT_MS = 5_000;\n\n/** Synchronous sleep: the lock is held for microseconds, so a busy wait with a pause is fine. */\nfunction sleep(ms: number): void {\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\n}\n\nexport class Registry {\n private constructor(\n private readonly home: string,\n private readonly now: () => Date,\n ) {}\n\n static open(home: string, now: () => Date = () => new Date()): Registry {\n mkdirSync(home, { recursive: true });\n return new Registry(home, now);\n }\n\n /** The registry as it is on disk. A file that does not parse is refused, never replaced. */\n read(): RegistryFile {\n const file = registryFile(this.home);\n if (!existsSync(file)) return structuredClone(EMPTY);\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(file, 'utf8'));\n } catch (err) {\n throw new WorkkitError(\n 'INTERNAL',\n `${file} is corrupt (${err instanceof Error ? err.message : String(err)}); nothing was changed. Move it aside (mv ${file} ${file}.corrupt-$(date +%s)) to start fresh, knowing its leases and running pids are lost`,\n { file },\n );\n }\n const r = parsed as Partial<RegistryFile> | null;\n if (!r || typeof r !== 'object' || r.version !== 1) {\n throw new WorkkitError(\n 'INTERNAL',\n `${file} has an unknown registry version (${String(r?.version)}); this build reads version 1`,\n { file },\n );\n }\n return {\n version: 1,\n projects: r.projects ?? {},\n leases: r.leases ?? [],\n efforts: r.efforts ?? [],\n notices: r.notices ?? [],\n };\n }\n\n /** Lock, re-read, mutate, write atomically, unlock. The only way state changes. */\n update<T>(fn: (r: RegistryFile) => T): T {\n const lock = lockDir(this.home);\n const started = Date.now();\n for (;;) {\n try {\n mkdirSync(lock);\n break;\n } catch {\n try {\n if (Date.now() - statSync(lock).mtimeMs > LOCK_STALE_MS) {\n rmSync(lock, { recursive: true, force: true });\n continue;\n }\n } catch {\n continue; // the lock vanished between the failed mkdir and the stat: retry at once\n }\n if (Date.now() - started > LOCK_WAIT_MS) {\n throw new WorkkitError(\n 'INTERNAL',\n `registry lock ${lock} held for over ${LOCK_WAIT_MS} ms`,\n );\n }\n sleep(25);\n }\n }\n try {\n const r = this.read();\n const out = fn(r);\n const file = registryFile(this.home);\n const tmp = `${file}.${process.pid}.tmp`;\n writeFileSync(tmp, `${JSON.stringify(r, null, 2)}\\n`);\n renameSync(tmp, file);\n return out;\n } finally {\n rmSync(lock, { recursive: true, force: true });\n }\n }\n\n project(name: string): ProjectEntry | undefined {\n return this.read().projects[name];\n }\n\n upsertProject(name: string, entry: ProjectEntry): void {\n this.update((r) => {\n r.projects[name] = entry;\n });\n }\n\n leases(filter: Partial<Pick<Lease, 'project' | 'kind' | 'effort'>> = {}): Lease[] {\n return this.read().leases.filter((l) =>\n Object.entries(filter).every(([k, v]) => (l as unknown as Record<string, unknown>)[k] === v),\n );\n }\n\n efforts(filter: Partial<Pick<Effort, 'project' | 'area' | 'task' | 'state'>> = {}): Effort[] {\n return this.read().efforts.filter((e) =>\n Object.entries(filter).every(([k, v]) => (e as unknown as Record<string, unknown>)[k] === v),\n );\n }\n\n activeEffortFor(project: string, area: string, task?: string): Effort | undefined {\n return this.efforts({ project, area, state: 'active' }).find(\n (e) => (e.task ?? undefined) === (task ?? undefined),\n );\n }\n\n /** An effort that is being started counts as open: nobody else may start on the same (area, task) meanwhile. */\n openEffortFor(project: string, area: string, task?: string): Effort | undefined {\n return this.efforts({ project, area }).find(\n (e) =>\n (e.state === 'starting' || e.state === 'active') &&\n (e.task ?? undefined) === (task ?? undefined),\n );\n }\n\n addNotice(project: string, area: string, notice: Notice): void {\n this.update((r) => {\n const existing = r.notices ?? [];\n const dup = existing.findIndex(\n (n) =>\n n.project === project &&\n n.area === area &&\n n.notice.from === notice.from &&\n n.notice.text === notice.text,\n );\n if (dup >= 0) {\n existing[dup] = { project, area, notice };\n r.notices = existing;\n } else {\n r.notices = [...existing, { project, area, notice }];\n }\n });\n }\n\n notices(project: string, area: string): Notice[] {\n return (this.read().notices ?? [])\n .filter((n) => n.project === project && n.area === area)\n .map((n) => n.notice);\n }\n\n clearNotices(project: string, area: string): void {\n this.update((r) => {\n r.notices = (r.notices ?? []).filter((n) => !(n.project === project && n.area === area));\n });\n }\n\n clearNoticesFrom(project: string, branches: string[]): void {\n const set = new Set(branches);\n this.update((r) => {\n r.notices = (r.notices ?? []).filter(\n (n) => !(n.project === project && set.has(n.notice.from)),\n );\n });\n }\n\n pruneNoticesWhere(project: string, area: string, remove: (n: Notice) => boolean): void {\n this.update((r) => {\n r.notices = (r.notices ?? []).filter(\n (n) => !(n.project === project && n.area === area && remove(n.notice)),\n );\n });\n }\n\n allocateSlot(\n project: string,\n m: Manifest,\n owner: Owner,\n effort: string,\n exclude: Set<number> = new Set(),\n ): Lease {\n return this.update((r) => {\n const taken = new Set(\n r.leases\n .filter((l) => l.project === project && l.kind === 'slot')\n .map((l) => l.value as number),\n );\n const reserved = new Set(m.slots.reserved);\n let slot = -1;\n for (let n = 0; n < m.slots.count; n++) {\n if (!taken.has(n) && !reserved.has(n) && !exclude.has(n)) {\n slot = n;\n break;\n }\n }\n if (slot < 0) {\n throw new WorkkitError(\n 'NO_FREE_SLOT',\n `no free slot in ${project} (0..${m.slots.count - 1}, reserved ${[...reserved].join(',')})`,\n );\n }\n const lease = this.lease(\n project,\n 'slot',\n slot,\n owner,\n effort,\n m.expiry.slotHours,\n portsForSlot(m, slot),\n );\n r.leases.push(lease);\n return lease;\n });\n }\n\n addLease(\n kind: LeaseKind,\n project: string,\n value: string | number,\n owner: Owner,\n effort: string,\n hours: number,\n extra: Partial<Lease> = {},\n ): Lease {\n return this.update((r) => {\n const l = { ...this.lease(project, kind, value, owner, effort, hours), ...extra };\n r.leases.push(l);\n return l;\n });\n }\n\n private lease(\n project: string,\n kind: LeaseKind,\n value: string | number,\n owner: Owner,\n effort: string,\n hours: number,\n ports?: Record<string, number>,\n ): Lease {\n const now = this.now();\n return {\n id: newId('lease'),\n project,\n kind,\n value,\n ...(ports ? { ports } : {}),\n owner,\n effort,\n created: now.toISOString(),\n touched: now.toISOString(),\n expires: new Date(now.getTime() + hours * 3_600_000).toISOString(),\n };\n }\n\n touch(leaseId: string, hours: number): void {\n this.update((r) => {\n const l = r.leases.find((x) => x.id === leaseId);\n if (!l) throw new WorkkitError('LEASE_NOT_FOUND', leaseId);\n const now = this.now();\n l.touched = now.toISOString();\n l.expires = new Date(now.getTime() + hours * 3_600_000).toISOString();\n });\n }\n\n patchLease(leaseId: string, patch: Partial<Lease>): void {\n this.update((r) => {\n const i = r.leases.findIndex((x) => x.id === leaseId);\n if (i < 0) throw new WorkkitError('LEASE_NOT_FOUND', leaseId);\n r.leases[i] = { ...r.leases[i], ...patch };\n });\n }\n\n release(leaseId: string): void {\n this.update((r) => {\n r.leases = r.leases.filter((l) => l.id !== leaseId);\n });\n }\n\n expired(now: Date = this.now()): Lease[] {\n return this.read().leases.filter((l) => Date.parse(l.expires) < now.getTime());\n }\n\n addEffort(e: Effort): void {\n this.update((r) => {\n r.efforts.push(e);\n });\n }\n\n updateEffort(id: string, patch: Partial<Effort>): Effort {\n return this.update((r) => {\n const i = r.efforts.findIndex((e) => e.id === id);\n if (i < 0) throw new WorkkitError('EFFORT_NOT_FOUND', `no effort ${id}`);\n r.efforts[i] = { ...r.efforts[i], ...patch };\n return r.efforts[i];\n });\n }\n\n removeEfforts(predicate: (e: Effort) => boolean): number {\n return this.update((r) => {\n const before = r.efforts.length;\n r.efforts = r.efforts.filter((e) => !predicate(e));\n return before - r.efforts.length;\n });\n }\n}\n","import { spawn, spawnSync } from 'node:child_process';\nimport { closeSync, openSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { WorkkitError } from './errors.js';\nimport type { Manifest, ServiceSpec } from './types.js';\n\nconst DEFAULT_HEALTH_TIMEOUT_MS = 180_000;\nconst HEALTH_POLL_MS = 1_000;\nconst PROBE_CAP_MS = 10_000;\nconst STOP_COMMAND_TIMEOUT_MS = 15_000;\nconst STOP_GRACE_MS = 5_000;\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport function isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/** The process's start time as `ps` prints it: a pid plus this string identifies one process, not a reused number. */\nexport function pidSignature(pid: number): string {\n const r = spawnSync('ps', ['-o', 'lstart=', '-p', String(pid)], { encoding: 'utf8' });\n return r.status === 0 ? (r.stdout ?? '').trim() : '';\n}\n\nexport function serviceModes(name: string, spec: ServiceSpec): ('backend' | 'fullstack')[] {\n if (spec.modes && spec.modes.length > 0) return spec.modes;\n return name === 'frontend' ? ['fullstack'] : ['backend', 'fullstack'];\n}\n\nexport interface RunnerArgs {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n logDir: string;\n mode?: 'backend' | 'fullstack';\n onlyServices?: string[];\n onLog?: (line: string) => void;\n /** called the moment a service's process exists, before its health is known */\n onSpawn?: (service: string, pid: number, signature: string) => void;\n}\n\n/** One health probe, time-boxed: exit 0, and when `healthyCodes` is set the last stdout token is one of them. */\nexport function probe(\n spec: ServiceSpec,\n cwd: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number = PROBE_CAP_MS,\n): { healthy: boolean; last: string } {\n const r = spawnSync('sh', ['-c', spec.health], {\n cwd,\n env,\n encoding: 'utf8',\n timeout: Math.max(100, timeoutMs),\n });\n const out = (r.stdout ?? '').trim();\n const last = out.split(/\\s+/).filter(Boolean).pop() ?? '';\n if (r.error) return { healthy: false, last: `probe ${r.error.message}` };\n if (r.status !== 0) return { healthy: false, last: (r.stderr ?? '').trim() || out };\n if (spec.healthyCodes && spec.healthyCodes.length > 0)\n return { healthy: spec.healthyCodes.includes(Number(last)), last };\n return { healthy: true, last };\n}\n\nexport async function waitHealthy(o: {\n name: string;\n spec: ServiceSpec;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeoutMs?: number;\n}): Promise<void> {\n const budget = o.timeoutMs ?? o.spec.healthTimeoutMs ?? DEFAULT_HEALTH_TIMEOUT_MS;\n const deadline = Date.now() + budget;\n let last = '';\n while (Date.now() < deadline) {\n const p = probe(o.spec, o.cwd, o.env, Math.min(PROBE_CAP_MS, deadline - Date.now()));\n if (p.healthy) return;\n last = p.last;\n if (Date.now() >= deadline) break;\n await sleep(Math.min(HEALTH_POLL_MS, Math.max(0, deadline - Date.now())));\n }\n throw new WorkkitError(\n 'HEALTH_TIMEOUT',\n `service \"${o.name}\" was not healthy within ${(budget / 1000).toFixed(0)} s (last probe: ${last || 'no output'})`,\n { service: o.name, last },\n );\n}\n\n/** Start one service detached in its own process group, logging to <logDir>/<name>.log; returns the group leader's pid. */\nfunction spawnService(name: string, spec: ServiceSpec, a: RunnerArgs): number {\n const fd = openSync(join(a.logDir, `${name}.log`), 'a');\n try {\n const child = spawn('sh', ['-c', spec.start], {\n cwd: a.cwd,\n env: a.env,\n detached: true,\n stdio: ['ignore', fd, fd],\n });\n child.unref();\n if (child.pid === undefined) {\n throw new WorkkitError('SERVICE_FAILED', `service \"${name}\" did not spawn: ${spec.start}`, {\n service: name,\n });\n }\n return child.pid;\n } finally {\n closeSync(fd);\n }\n}\n\n/** Start every service in manifest order, waiting for each one's health; on failure stop what started. */\nexport async function startServices(\n a: RunnerArgs,\n): Promise<{ pids: Record<string, number>; signatures: Record<string, string> }> {\n const pids: Record<string, number> = {};\n const signatures: Record<string, string> = {};\n const targetMode = a.mode ?? 'fullstack';\n const entries = Object.entries(a.m.services).filter(([name, spec]) => {\n if (a.onlyServices) return a.onlyServices.includes(name);\n return serviceModes(name, spec).includes(targetMode);\n });\n for (const [name, spec] of entries) {\n a.onLog?.(`starting ${name}: ${spec.start}`);\n pids[name] = spawnService(name, spec, a);\n signatures[name] = pidSignature(pids[name]);\n a.onSpawn?.(name, pids[name], signatures[name]);\n try {\n await waitHealthy({ name, spec, cwd: a.cwd, env: a.env });\n } catch (err) {\n await stopServices({ m: a.m, cwd: a.cwd, env: a.env, pids, signatures, onLog: a.onLog });\n throw err;\n }\n a.onLog?.(`${name} healthy (pid ${pids[name]})`);\n }\n return { pids, signatures };\n}\n\nfunction killGroup(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(-pid, signal);\n } catch {\n try {\n process.kill(pid, signal);\n } catch {\n // already gone\n }\n }\n}\n\n/**\n * Run each `stop` in reverse order (time-boxed), then SIGTERM and finally SIGKILL only the pids we\n * started — and only while each pid still carries the start-time signature recorded at spawn.\n */\nexport async function stopServices(o: {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n pids: Record<string, number>;\n signatures?: Record<string, string>;\n skipStopCommands?: boolean;\n onLog?: (line: string) => void;\n}): Promise<void> {\n const names = Object.keys(o.m.services)\n .filter((n) => o.pids[n] !== undefined)\n .reverse();\n if (!o.skipStopCommands) {\n for (const name of names) {\n const spec = o.m.services[name];\n o.onLog?.(`stopping ${name}: ${spec.stop}`);\n const r = spawnSync('sh', ['-c', spec.stop], {\n cwd: o.cwd,\n env: o.env,\n encoding: 'utf8',\n timeout: STOP_COMMAND_TIMEOUT_MS,\n });\n if (r.error) o.onLog?.(`stop command for ${name} ${r.error.message}`);\n }\n }\n const ours = names.filter((n) => {\n const pid = o.pids[n];\n if (!isAlive(pid)) return false;\n const expected = o.signatures?.[n];\n if (expected === undefined) return true;\n const actual = pidSignature(pid);\n if (actual !== expected) {\n o.onLog?.(\n `not signalling pid ${pid} (${n}): it is no longer the process started for this lease`,\n );\n return false;\n }\n return true;\n });\n const alive = () => ours.filter((n) => isAlive(o.pids[n]));\n if (alive().length === 0) return;\n for (const n of alive()) killGroup(o.pids[n], 'SIGTERM');\n const deadline = Date.now() + STOP_GRACE_MS;\n while (alive().length > 0 && Date.now() < deadline) await sleep(200);\n for (const n of alive()) killGroup(o.pids[n], 'SIGKILL');\n const hardDeadline = Date.now() + STOP_GRACE_MS;\n while (alive().length > 0 && Date.now() < hardDeadline) await sleep(100);\n}\n","import { hostname, userInfo } from 'node:os';\nimport type { Owner } from './types.js';\n\n/**\n * Who holds a lease. `WORK_SESSION` when the shell says so, else Claude Code's session id, else\n * `user@host`. No pid or ppid: a git hook runs as a child of git and must agree with the shell\n * that started the effort.\n */\nexport function currentOwner(env: NodeJS.ProcessEnv = process.env): Owner {\n const named = [env.WORK_SESSION, env.CLAUDE_SESSION_NAME, env.CLAUDE_CODE_SESSION_ID].find(\n (v) => v !== undefined && v.length > 0,\n );\n return { session: named ?? `${userInfo().username}@${hostname()}`, pid: process.pid };\n}\n","import { spawnSync } from 'node:child_process';\nimport { WorkkitError } from '../core/index.js';\n\nexport interface StorybrokrInstance {\n id: string;\n port: number;\n url: string;\n}\n\n/** The frontend runner: the installed `storybrokr` CLI, which owns its daemon, ports and instances. */\nexport interface StorybrokrClient {\n up(\n story: string,\n hostRoot: string,\n opts?: { ttlMinutes?: number },\n ): Promise<StorybrokrInstance>;\n down(id: string): Promise<void>;\n downHost?(hostRoot: string): Promise<void>;\n touch?(id: string): Promise<void>;\n}\n\nconst MIN_STORYBROKR_VERSION = '0.3.0';\nlet versionChecked = false;\n\nexport function compareSemver(a: string, b: string): number {\n const pa = a\n .trim()\n .replace(/^v/, '')\n .split('.')\n .map((n) => Number.parseInt(n, 10) || 0);\n const pb = b\n .trim()\n .replace(/^v/, '')\n .split('.')\n .map((n) => Number.parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i++) {\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return 0;\n}\n\nfunction run(args: string[]): { code: number; out: string; err: string } {\n const r = spawnSync('storybrokr', args, { encoding: 'utf8' });\n if (r.error) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr is not installed (npm i -g @helmsmith/storybrokr): ${r.error.message}`,\n );\n }\n return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };\n}\n\nfunction assertStorybrokrVersion(): void {\n if (versionChecked) return;\n const r = run(['--version']);\n const found = r.out.trim();\n if (r.code !== 0 || compareSemver(found, MIN_STORYBROKR_VERSION) < 0) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr >= ${MIN_STORYBROKR_VERSION} required (found ${found || 'unknown'}); upgrade @helmsmith/storybrokr`,\n );\n }\n versionChecked = true;\n}\n\nexport const storybrokrCli: StorybrokrClient = {\n async up(story, hostRoot, opts) {\n assertStorybrokrVersion();\n const args = ['up', story, '--host', hostRoot, '--json'];\n if (opts?.ttlMinutes !== undefined) args.push('--ttl', String(opts.ttlMinutes));\n const r = run(args);\n if (r.code !== 0) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr up ${story} failed: ${r.err.trim() || r.out.trim()}`,\n );\n }\n const record = JSON.parse(r.out) as { id: string; port: number; url: string };\n return { id: record.id, port: record.port, url: record.url };\n },\n async down(id) {\n const r = run(['down', id]);\n if (r.code !== 0)\n throw new WorkkitError('STORYBROKR_FAILED', `storybrokr down ${id} failed: ${r.err.trim()}`);\n },\n async downHost(hostRoot) {\n // Best-effort sweep of all instances in this worktree's hostRoot; ignore when storybrokr isn't installed.\n const r = spawnSync('storybrokr', ['down', '--host', hostRoot, '--json'], { encoding: 'utf8' });\n void r;\n },\n async touch(id) {\n // Best-effort touch; ignore errors if the instance was already stopped.\n const r = spawnSync('storybrokr', ['touch', id], { encoding: 'utf8' });\n void r;\n },\n};\n","import {\n appendFileSync,\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n realpathSync,\n rmSync,\n statSync,\n} from 'node:fs';\nimport { connect, createServer } from 'node:net';\nimport { dirname, join } from 'node:path';\nimport {\n assertNotProtected,\n commonsTouched,\n type Effort,\n emitWorktreeConfig,\n ensureExcluded,\n expandScopes,\n Git,\n globsOverlap,\n type Lease,\n type Manifest,\n type Mode,\n type Notice,\n newId,\n type Owner,\n portsForSlot,\n type Registry,\n runRefresh,\n selectRefresh,\n serviceModes,\n slotVars,\n storybookHostFor,\n TASK_SLUG,\n WorkkitError,\n} from '../core/index.js';\nimport type { StorybrokrClient } from './storybrokr.js';\n\nexport type { StorybrokrClient } from './storybrokr.js';\n\nexport interface ServiceRunner {\n start(a: {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n logDir: string;\n mode?: 'backend' | 'fullstack';\n onlyServices?: string[];\n onLog?: (l: string) => void;\n onSpawn?: (service: string, pid: number, signature: string) => void;\n }): Promise<{ pids: Record<string, number>; signatures?: Record<string, string> }>;\n stop(o: {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n pids: Record<string, number>;\n signatures?: Record<string, string>;\n skipStopCommands?: boolean;\n onLog?: (l: string) => void;\n }): Promise<void>;\n}\n\nexport interface Ctx {\n home: string;\n repoRoot: string;\n manifest: Manifest;\n registry: Registry;\n owner: Owner;\n runner: ServiceRunner;\n storybrokr: StorybrokrClient;\n log: (line: string) => void;\n}\n\nexport interface StartOptions {\n area: string;\n task?: string;\n type: string;\n mode: Mode;\n scopes?: string[];\n join?: boolean;\n sync?: boolean;\n story?: string;\n}\n\nexport interface StartResult {\n effort: Effort;\n leases: Lease[];\n sync: 'up-to-date' | 'ff' | 'merge' | 'skipped';\n refreshed: string[];\n marks: string[];\n joined: boolean;\n warnings: string[];\n /** informational notices other efforts left for this area */\n notices: Notice[];\n}\n\nexport const worktreePathFor = (ctx: Ctx, area: string, task?: string) =>\n task\n ? join(ctx.repoRoot, ctx.manifest.worktreeRoot, '_tasks', `${area}--${task}`)\n : join(ctx.repoRoot, ctx.manifest.worktreeRoot, area);\nexport const branchFor = (type: string, area: string, task?: string) =>\n task ? `${type}/${area}--${task}` : `${type}/${area}`;\nconst effortLabel = (area: string, task?: string) => (task ? `${area}--${task}` : area);\nconst now = () => new Date().toISOString();\nconst STARTING_GRACE_MS = 30 * 60_000;\nconst JOIN_WAIT_MS = 60_000;\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nconst realpathOr = (p: string) => {\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n};\n\nfunction fetchBaseOnce(ctx: Ctx): void {\n new Git(ctx.repoRoot).tryRun(['fetch', '-q', 'origin', ctx.manifest.baseBranch]);\n}\n\nfunction hoursFor(m: Manifest, kind: Lease['kind']): number {\n return {\n slot: m.expiry.slotHours,\n storybook: m.expiry.storybookHours,\n commons: m.expiry.commonsHours,\n }[kind];\n}\n\nfunction modeCovers(existing: Mode, requested: Mode): boolean {\n if (existing === 'fullstack') return true;\n return existing === requested;\n}\n\nconst STORYBROKR_TOUCH_THROTTLE_MS = 60_000;\n\n/** Activity on an effort extends every lease it holds (spec §8.4: idle is measured from the last touch). */\nexport function touchEffort(ctx: Ctx, effort: Effort): void {\n const prevMs = Date.parse(effort.lastActivity);\n const shouldTouchStorybrokr =\n Number.isNaN(prevMs) || Date.now() - prevMs >= STORYBROKR_TOUCH_THROTTLE_MS;\n for (const l of ctx.registry.leases({ effort: effort.id })) {\n ctx.registry.touch(l.id, hoursFor(ctx.manifest, l.kind));\n if (l.kind === 'storybook' && shouldTouchStorybrokr) {\n void Promise.resolve(ctx.storybrokr.touch?.(String(l.value))).catch(() => {});\n }\n }\n ctx.registry.updateEffort(effort.id, { lastActivity: now() });\n}\n\n// ── ports ────────────────────────────────────────────────────────────────────\n\nfunction portBusy(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const srv = createServer();\n srv.once('error', () => resolve(true));\n srv.listen(port, '127.0.0.1', () => srv.close(() => resolve(false)));\n });\n}\n\nasync function busyPorts(ports: Record<string, number>): Promise<string[]> {\n const out: string[] = [];\n for (const [service, port] of Object.entries(ports))\n if (await portBusy(port)) out.push(`${service}=${port}`);\n return out;\n}\n\nfunction portAnswers(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const sock = connect({ port, host: '127.0.0.1' });\n const done = (v: boolean) => {\n sock.destroy();\n resolve(v);\n };\n sock.setTimeout(300, () => done(false));\n sock.once('connect', () => done(true));\n sock.once('error', () => done(false));\n });\n}\n\nasync function anyPortAnswers(ports: Record<string, number> | undefined): Promise<boolean> {\n for (const port of Object.values(ports ?? {})) if (await portAnswers(port)) return true;\n return false;\n}\n\nasync function claimFreeSlot(\n ctx: Ctx,\n effortId: string,\n warnings: string[],\n): Promise<Lease> {\n const m = ctx.manifest;\n const exclude = new Set<number>();\n const busyNotes: string[] = [];\n for (;;) {\n const candidate = ctx.registry.allocateSlot(m.project, m, ctx.owner, effortId, exclude);\n const busy = await busyPorts(candidate.ports ?? {});\n if (busy.length === 0) {\n if (busyNotes.length) warnings.push(...busyNotes);\n return candidate;\n }\n ctx.registry.release(candidate.id);\n exclude.add(candidate.value as number);\n busyNotes.push(`slot ${candidate.value}: ${busy.join(', ')} already in use`);\n ctx.log(busyNotes[busyNotes.length - 1]);\n }\n}\n\n// ── start ────────────────────────────────────────────────────────────────────\n\nfunction guardStart(\n ctx: Ctx,\n o: StartOptions,\n): { branch: string; scopes: string[]; commons: string[]; warnings: string[] } {\n const m = ctx.manifest;\n const spec = m.areas[o.area];\n if (!spec)\n throw new WorkkitError(\n 'AREA_UNKNOWN',\n `unknown area \"${o.area}\" (known: ${Object.keys(m.areas).join(', ')})`,\n { area: o.area },\n );\n if (o.task !== undefined && !TASK_SLUG.test(o.task))\n throw new WorkkitError(\n 'TASK_INVALID',\n `invalid task slug \"${o.task}\" (must match /^[a-z0-9][a-z0-9_-]{0,47}$/ with no \"--\")`,\n { task: o.task },\n );\n if (!m.branch.types.includes(o.type))\n throw new WorkkitError(\n 'TYPE_UNKNOWN',\n `unknown type \"${o.type}\" (allowed: ${m.branch.types.join(', ')})`,\n { type: o.type },\n );\n if (o.mode !== 'frontend' && o.mode !== 'backend' && o.mode !== 'fullstack')\n throw new WorkkitError(\n 'MODE_UNKNOWN',\n `unknown mode \"${o.mode}\" (frontend | backend | fullstack)`,\n );\n const branch = branchFor(o.type, o.area, o.task);\n assertNotProtected(m, branch);\n const scopes = expandScopes(m, o.area, o.mode, o.scopes, Boolean(o.task));\n const commons = spec.commons ?? [];\n const warnings: string[] = [];\n if (commons.length > 0) {\n for (const e of ctx.registry.efforts({ project: m.project })) {\n if (\n (e.area === o.area && (e.task ?? undefined) === (o.task ?? undefined)) ||\n (e.state !== 'active' && e.state !== 'starting') ||\n !existsSync(e.worktree)\n )\n continue;\n const changed = new Git(e.worktree)\n .tryRun(['diff', '--name-only', '--no-renames', `origin/${m.baseBranch}...HEAD`])\n .out.split('\\n')\n .filter(Boolean);\n const hit = commonsTouched(m, changed).filter((c) => commons.includes(c));\n if (hit.length > 0)\n warnings.push(\n `${effortLabel(e.area, e.task)} (${e.branch}, ${e.owner.session}) already has commits under commons ${hit.join(', ')}: coordinate or wait for its merge`,\n );\n }\n }\n return { branch, scopes, commons, warnings };\n}\n\n/** One registry transaction: nobody else may be open on the same (area, task) or hold an overlapping scope; the effort is written as `starting`. */\nfunction reserveEffort(\n ctx: Ctx,\n o: StartOptions,\n branch: string,\n scopes: string[],\n commons: string[],\n): Effort {\n const m = ctx.manifest;\n const effort: Effort = {\n id: newId('eff'),\n project: m.project,\n area: o.area,\n ...(o.task ? { task: o.task } : {}),\n type: o.type,\n mode: o.mode,\n branch,\n worktree: worktreePathFor(ctx, o.area, o.task),\n owner: ctx.owner,\n state: 'starting',\n scopes,\n commons,\n leases: [],\n notices: [],\n started: now(),\n lastActivity: now(),\n };\n ctx.registry.update((r) => {\n const open = r.efforts.filter(\n (e) => e.project === m.project && (e.state === 'active' || e.state === 'starting'),\n );\n const onTarget = open.find(\n (e) => e.area === o.area && (e.task ?? undefined) === (o.task ?? undefined),\n );\n if (onTarget) {\n const label = effortLabel(o.area, o.task);\n throw new WorkkitError(\n 'EFFORT_OPEN',\n `an effort is open on ${label} (${onTarget.branch}, ${onTarget.mode}) owned by ${onTarget.owner.session} since ${onTarget.started}; finish it, or pass --join to work in the same checkout`,\n { owner: onTarget.owner.session, effort: onTarget.id, branch: onTarget.branch },\n );\n }\n for (const e of open) {\n const pairs = globsOverlap(scopes, e.scopes);\n if (pairs.length > 0) {\n const otherLabel = effortLabel(e.area, e.task);\n throw new WorkkitError(\n 'SCOPE_CONFLICT',\n `scope overlaps the open effort on ${otherLabel} (${e.branch}, owner ${e.owner.session}): ${pairs.join('; ')}`,\n { with: otherLabel, owner: e.owner.session, effort: e.id, pairs },\n );\n }\n }\n r.efforts.push(effort);\n });\n return effort;\n}\n\n/** The directory at the worktree path must be THIS repo's registered worktree, never the main checkout seen through a bare directory. */\nfunction ensureWorktree(\n ctx: Ctx,\n area: string,\n branch: string,\n task?: string,\n): { wg: Git; created: boolean } {\n const m = ctx.manifest;\n const path = worktreePathFor(ctx, area, task);\n const main = new Git(ctx.repoRoot);\n if (!existsSync(path)) {\n main.worktreeAdd(path, branch, `origin/${m.baseBranch}`);\n const wg = new Git(path);\n wg.repairSubmodules(ctx.repoRoot, ctx.log);\n return { wg, created: true };\n }\n const registered = main\n .run(['worktree', 'list', '--porcelain'])\n .split('\\n')\n .filter((l) => l.startsWith('worktree '))\n .map((l) => realpathOr(l.slice(9)));\n const real = realpathOr(path);\n const wg = new Git(path);\n const topLevel = wg.tryRun(['rev-parse', '--show-toplevel']);\n if (\n !registered.includes(real) ||\n topLevel.code !== 0 ||\n realpathOr(topLevel.out.trim()) !== real ||\n wg.isMainCheckout()\n ) {\n throw new WorkkitError(\n 'WORKTREE_INVALID',\n `${path} exists but is not this repository's worktree for ${effortLabel(area, task)} (a leftover directory?); move it away, or \\`git worktree prune\\` and retry`,\n { worktree: path },\n );\n }\n wg.repairSubmodules(ctx.repoRoot, ctx.log);\n const current = wg.currentBranch();\n if (current !== branch) {\n if (wg.isDirty())\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `${path} has uncommitted changes on ${current}; commit or park them before switching to ${branch}`,\n { worktree: path },\n );\n const unshipped = wg.commitsNotOn(m.baseBranch);\n if (unshipped.length > 0 && !wg.isEquivalentToBase(m.baseBranch)) {\n throw new WorkkitError(\n 'EFFORT_OPEN',\n `${current} holds ${unshipped.length} commit(s) not yet on ${m.baseBranch}: ship or finish it first, or --join it`,\n { branch: current, area },\n );\n }\n wg.checkout(branch, `origin/${m.baseBranch}`);\n if (\n !wg.isDirty() &&\n wg.commitsNotOn(m.baseBranch).length > 0 &&\n wg.isEquivalentToBase(m.baseBranch)\n ) {\n wg.run(['reset', '--hard', `origin/${m.baseBranch}`]);\n }\n } else if (\n !wg.isDirty() &&\n wg.commitsNotOn(m.baseBranch).length > 0 &&\n wg.isEquivalentToBase(m.baseBranch)\n ) {\n wg.run(['reset', '--hard', `origin/${m.baseBranch}`]);\n }\n return { wg, created: false };\n}\n\nfunction appendLog(file: string, line: string): void {\n appendFileSync(file, `${new Date().toISOString()} ${line}\\n`);\n}\n\nexport async function startEffort(ctx: Ctx, o: StartOptions): Promise<StartResult> {\n const m = ctx.manifest;\n fetchBaseOnce(ctx);\n const { branch, scopes, commons, warnings } = guardStart(ctx, o);\n const notices = ctx.registry.notices(m.project, o.area);\n\n let open = ctx.registry.openEffortFor(m.project, o.area, o.task);\n if (open && o.join) {\n const deadline = Date.now() + JOIN_WAIT_MS;\n while (open && open.state === 'starting' && Date.now() < deadline) {\n await sleep(200);\n open = ctx.registry.openEffortFor(m.project, o.area, o.task);\n }\n if (!open || open.state !== 'active') {\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `effort on ${effortLabel(o.area, o.task)} did not become active in time to join`,\n { area: o.area, task: o.task },\n );\n }\n if (!modeCovers(open.mode, o.mode)) {\n const label = effortLabel(o.area, o.task);\n throw new WorkkitError(\n 'MODE_MISMATCH',\n `open effort on ${label} is in ${open.mode} mode, which does not cover ${o.mode}; run \\`work promote --area ${o.area}${o.task ? ` --task ${o.task}` : ''} --mode fullstack\\` first`,\n { area: o.area, task: o.task, openMode: open.mode, requestedMode: o.mode },\n );\n }\n const currentLeases = ctx.registry.leases({ effort: open.id });\n if (o.story && !currentLeases.some((l) => l.kind === 'storybook')) {\n const hostRoot = storybookHostFor(m, open.worktree);\n const inst = await ctx.storybrokr.up(o.story, hostRoot, {\n ttlMinutes: Math.ceil(m.expiry.storybookHours * 60),\n });\n const sbLease = ctx.registry.addLease(\n 'storybook',\n m.project,\n inst.id,\n ctx.owner,\n open.id,\n m.expiry.storybookHours,\n { ports: { storybook: inst.port } },\n );\n open = ctx.registry.updateEffort(open.id, {\n leases: [...open.leases, sbLease.id],\n });\n }\n const existingParticipants = open.participants ?? [];\n const isAlreadyMember =\n open.owner.session === ctx.owner.session ||\n existingParticipants.some((p) => p.session === ctx.owner.session);\n if (!isAlreadyMember) {\n open = ctx.registry.updateEffort(open.id, {\n participants: [...existingParticipants, ctx.owner],\n });\n }\n touchEffort(ctx, open);\n return {\n effort: open,\n leases: ctx.registry.leases({ effort: open.id }),\n sync: 'skipped',\n refreshed: [],\n marks: [],\n joined: true,\n warnings,\n notices,\n };\n }\n\n const effort = reserveEffort(ctx, o, branch, scopes, commons);\n const leases: Lease[] = [];\n const abandon = async (stopPids: boolean) => {\n for (const l of ctx.registry.leases({ effort: effort.id })) {\n if (stopPids && l.kind === 'slot' && l.pids && Object.keys(l.pids).length > 0) {\n await ctx.runner\n .stop({\n m,\n cwd: effort.worktree,\n env: process.env,\n pids: l.pids,\n signatures: l.signatures,\n onLog: ctx.log,\n })\n .catch(() => undefined);\n } else if (stopPids && l.kind === 'storybook') {\n await ctx.storybrokr.down(String(l.value)).catch(() => undefined);\n }\n ctx.registry.release(l.id);\n }\n ctx.registry.removeEfforts((e) => e.id === effort.id);\n };\n const onSignal = () => {\n abandon(true).finally(() => process.exit(130));\n };\n process.once('SIGINT', onSignal);\n process.once('SIGTERM', onSignal);\n\n try {\n const { wg, created } = ensureWorktree(ctx, o.area, branch, o.task);\n const worktree = wg.root();\n ctx.registry.updateEffort(effort.id, { worktree });\n effort.worktree = worktree;\n const logDir = join(worktree, m.logs.dir);\n mkdirSync(logDir, { recursive: true });\n const refreshLog = join(logDir, 'refresh.log');\n const stampFile = join(logDir, '.refresh-stamps.json');\n\n if (created && m.seed && m.seed.length > 0) {\n runRefresh(\n m.seed,\n worktree,\n (l) => {\n appendLog(refreshLog, l);\n ctx.log(l);\n },\n { ...process.env, WORKTREE: worktree, MAIN_ROOT: ctx.repoRoot },\n );\n }\n\n let sync: StartResult['sync'] = 'skipped';\n let changed: string[] = [];\n if (o.sync !== false) {\n const r = wg.syncFrom(m.baseBranch);\n if (r.kind === 'conflict') {\n throw new WorkkitError(\n 'SYNC_CONFLICT',\n `merging origin/${m.baseBranch} into ${branch} conflicts in ${r.conflicted.join(', ')}; resolve in ${worktree}, commit, then rerun with --no-sync`,\n { conflicted: r.conflicted, worktree },\n );\n }\n sync = r.kind;\n if (r.kind === 'ff' || r.kind === 'merge') changed = wg.changedPaths(r.before, r.after);\n ctx.registry.pruneNoticesWhere(\n m.project,\n o.area,\n (n) => wg.isAncestor(`origin/${n.from}`, 'HEAD') || wg.isAncestor(n.from, 'HEAD'),\n );\n }\n const sel = selectRefresh(m.refresh, changed, { worktree, stampFile });\n runRefresh(\n sel.runs,\n worktree,\n (l) => {\n appendLog(refreshLog, l);\n ctx.log(l);\n },\n process.env,\n {\n stampFile,\n pendingStamps: sel.pendingStamps,\n restoreFiles: sel.cleanWhenFiles,\n },\n );\n\n const baseSha = wg.rev('HEAD');\n\n for (const name of commons)\n leases.push(\n ctx.registry.addLease(\n 'commons',\n m.project,\n name,\n ctx.owner,\n effort.id,\n m.expiry.commonsHours,\n ),\n );\n\n if (o.mode === 'fullstack' || o.mode === 'backend') {\n const slot = await claimFreeSlot(ctx, effort.id, warnings);\n leases.push(slot);\n const cfg = emitWorktreeConfig({\n m,\n worktree,\n slot: slot.value as number,\n ports: slot.ports ?? {},\n area: o.area,\n branch,\n });\n const env = { ...process.env, ...cfg.vars };\n if (sel.marks.includes('db-reset') && m.services.postgres?.reset) {\n runRefresh([m.services.postgres.reset], worktree, (l) => appendLog(refreshLog, l), env);\n }\n const pids: Record<string, number> = {};\n const signatures: Record<string, string> = {};\n const result = await ctx.runner.start({\n m,\n cwd: worktree,\n env,\n logDir,\n mode: o.mode,\n onLog: ctx.log,\n onSpawn: (service, pid, signature) => {\n pids[service] = pid;\n signatures[service] = signature;\n ctx.registry.patchLease(slot.id, { pids: { ...pids }, signatures: { ...signatures } });\n },\n });\n ctx.registry.patchLease(slot.id, {\n pids: result.pids,\n signatures: result.signatures ?? signatures,\n });\n } else {\n let storybookPort: number | undefined;\n if (o.story) {\n const hostRoot = storybookHostFor(m, worktree);\n const inst = await ctx.storybrokr.up(o.story, hostRoot, {\n ttlMinutes: Math.ceil(m.expiry.storybookHours * 60),\n });\n storybookPort = inst.port;\n leases.push(\n ctx.registry.addLease(\n 'storybook',\n m.project,\n inst.id,\n ctx.owner,\n effort.id,\n m.expiry.storybookHours,\n { ports: { storybook: inst.port } },\n ),\n );\n }\n emitWorktreeConfig({ m, worktree, ports: {}, storybookPort, area: o.area, branch });\n }\n\n const active = ctx.registry.updateEffort(effort.id, {\n state: 'active',\n baseSha,\n leases: leases.map((l) => l.id),\n lastActivity: now(),\n });\n return {\n effort: active,\n leases: ctx.registry.leases({ effort: effort.id }),\n sync,\n refreshed: sel.runs,\n marks: sel.marks,\n joined: false,\n warnings,\n notices,\n };\n } catch (err) {\n await abandon(true);\n throw err;\n } finally {\n process.off('SIGINT', onSignal);\n process.off('SIGTERM', onSignal);\n }\n}\n\n// ── promote ──────────────────────────────────────────────────────────────────\n\nexport interface PromoteOptions {\n area: string;\n task?: string;\n mode: 'backend' | 'fullstack';\n story?: string;\n}\n\nexport interface PromoteResult {\n effort: Effort;\n leases: Lease[];\n startedServices: string[];\n warnings: string[];\n}\n\nexport async function promoteEffort(ctx: Ctx, o: PromoteOptions): Promise<PromoteResult> {\n const m = ctx.manifest;\n if (o.mode !== 'backend' && o.mode !== 'fullstack') {\n throw new WorkkitError('MODE_UNKNOWN', `promote target mode must be backend or fullstack`);\n }\n const open = ctx.registry.openEffortFor(m.project, o.area, o.task);\n if (!open) {\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `no open effort on ${effortLabel(o.area, o.task)} to promote`,\n { area: o.area, task: o.task },\n );\n }\n if (\n (open.mode === 'fullstack' && o.mode === 'backend') ||\n (open.mode === 'frontend' && o.mode === 'backend')\n ) {\n throw new WorkkitError(\n 'MODE_MISMATCH',\n `cannot transition effort on ${effortLabel(o.area, o.task)} from ${open.mode} to ${o.mode}`,\n { from: open.mode, to: o.mode },\n );\n }\n const modeScopes = expandScopes(m, o.area, o.mode);\n const nextScopes = open.task ? [...new Set([...open.scopes, ...modeScopes])] : modeScopes;\n\n ctx.registry.update((r) => {\n const others = r.efforts.filter(\n (e) =>\n e.project === m.project &&\n e.id !== open.id &&\n (e.state === 'active' || e.state === 'starting'),\n );\n for (const e of others) {\n const pairs = globsOverlap(nextScopes, e.scopes);\n if (pairs.length > 0) {\n const otherLabel = effortLabel(e.area, e.task);\n throw new WorkkitError(\n 'SCOPE_CONFLICT',\n `promoting ${effortLabel(o.area, o.task)} to ${o.mode} overlaps ${otherLabel} (${e.branch}): ${pairs.join('; ')}`,\n { with: otherLabel, owner: e.owner.session, effort: e.id, pairs },\n );\n }\n }\n const idx = r.efforts.findIndex((e) => e.id === open.id);\n if (idx >= 0) {\n r.efforts[idx] = { ...r.efforts[idx], mode: o.mode, scopes: nextScopes, lastActivity: now() };\n }\n });\n\n const warnings: string[] = [];\n let slot = ctx.registry.leases({ effort: open.id, kind: 'slot' })[0];\n const sb = ctx.registry.leases({ effort: open.id, kind: 'storybook' })[0];\n if (!slot) {\n slot = await claimFreeSlot(ctx, open.id, warnings);\n ctx.registry.updateEffort(open.id, { leases: [...open.leases, slot.id] });\n }\n const cfg = emitWorktreeConfig({\n m,\n worktree: open.worktree,\n slot: slot.value as number,\n ports: slot.ports ?? {},\n storybookPort: sb?.ports?.storybook,\n area: o.area,\n branch: open.branch,\n });\n const env = { ...process.env, ...cfg.vars };\n const logDir = join(open.worktree, m.logs.dir);\n mkdirSync(logDir, { recursive: true });\n\n const existingPids = { ...(slot.pids ?? {}) };\n const existingSigs = { ...(slot.signatures ?? {}) };\n const missingServices = Object.entries(m.services)\n .filter(([name, spec]) => serviceModes(name, spec).includes(o.mode) && !existingPids[name])\n .map(([name]) => name);\n\n if (missingServices.length > 0) {\n const result = await ctx.runner.start({\n m,\n cwd: open.worktree,\n env,\n logDir,\n mode: o.mode,\n onlyServices: missingServices,\n onLog: ctx.log,\n onSpawn: (service, pid, signature) => {\n existingPids[service] = pid;\n existingSigs[service] = signature;\n ctx.registry.patchLease(slot.id, {\n pids: { ...existingPids },\n signatures: { ...existingSigs },\n });\n },\n });\n ctx.registry.patchLease(slot.id, {\n pids: { ...existingPids, ...result.pids },\n signatures: { ...existingSigs, ...(result.signatures ?? {}) },\n });\n }\n\n const updated = ctx.registry.updateEffort(open.id, { lastActivity: now() });\n touchEffort(ctx, updated);\n return {\n effort: updated,\n leases: ctx.registry.leases({ effort: open.id }),\n startedServices: missingServices,\n warnings,\n };\n}\n\n// ── status / env ─────────────────────────────────────────────────────────────\n\nexport interface AreaStatus {\n area: string;\n effort?: Effort;\n leases: Lease[];\n /** commits on origin/<base> the area's branch does not have (0 without a worktree) */\n behindBase: number;\n notices: Notice[];\n worktree?: string;\n}\n\nexport interface StatusReport {\n project: string;\n areas: AreaStatus[];\n leases: Lease[];\n}\n\nfunction behindBase(ctx: Ctx, worktree: string): number {\n if (!existsSync(worktree)) return 0;\n const g = new Git(worktree);\n const r = g.tryRun(['rev-list', '--count', `HEAD..origin/${ctx.manifest.baseBranch}`]);\n return r.code === 0 ? Number(r.out.trim()) || 0 : 0;\n}\n\n/** Every area of the project (or one), with its open effort, leases, drift from the base branch and notices. Asking about one area counts as activity on it. */\nexport function statusFor(ctx: Ctx, area?: string, task?: string): StatusReport {\n const m = ctx.manifest;\n fetchBaseOnce(ctx);\n const names = (area ? [area] : Object.keys(m.areas)).sort();\n const areas: AreaStatus[] = names.map((name) => {\n const effort = ctx.registry.openEffortFor(m.project, name, area ? task : undefined);\n if (effort && area) touchEffort(ctx, effort);\n const worktree = worktreePathFor(ctx, name, area ? task : undefined);\n const out: AreaStatus = {\n area: area && task ? `${name}--${task}` : name,\n leases: effort ? ctx.registry.leases({ effort: effort.id }) : [],\n behindBase: behindBase(ctx, worktree),\n notices: ctx.registry.notices(m.project, name),\n };\n if (effort) out.effort = effort;\n if (existsSync(worktree)) out.worktree = worktree;\n return out;\n });\n return { project: m.project, areas, leases: ctx.registry.leases({ project: m.project }) };\n}\n\n/** The slot-derived variables for a slot number alone: what a Makefile asks before any effort exists. */\nexport function slotEnv(m: Manifest, slot: number): Record<string, string> {\n return slotVars(m, { slot, ports: portsForSlot(m, slot) });\n}\n\n/** The variables the open effort's config was emitted with, plus MODE. Counts as activity. */\nexport function effortEnv(ctx: Ctx, area: string, task?: string): Record<string, string> {\n const m = ctx.manifest;\n const effort = ctx.registry.openEffortFor(m.project, area, task);\n if (!effort)\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `no open effort on ${effortLabel(area, task)}; \\`work start --area ${area} …\\` first`,\n { area, task },\n );\n touchEffort(ctx, effort);\n const slot = ctx.registry.leases({ effort: effort.id, kind: 'slot' })[0];\n const sb = ctx.registry.leases({ effort: effort.id, kind: 'storybook' })[0];\n const vars = slotVars(m, {\n slot: slot ? (slot.value as number) : undefined,\n ports: slot?.ports ?? {},\n storybookPort: sb?.ports?.storybook,\n area,\n branch: effort.branch,\n worktree: effort.worktree,\n logDir: join(effort.worktree, m.logs.dir),\n });\n return { ...vars, MODE: effort.mode };\n}\n\n// ── finish / reap ────────────────────────────────────────────────────────────\n\nfunction leaseEnv(ctx: Ctx, effort: Effort, lease: Lease): NodeJS.ProcessEnv {\n const vars = slotVars(ctx.manifest, {\n slot: lease.kind === 'slot' ? (lease.value as number) : undefined,\n ports: lease.ports ?? {},\n area: effort.area,\n branch: effort.branch,\n worktree: effort.worktree,\n logDir: join(effort.worktree, ctx.manifest.logs.dir),\n });\n return { ...process.env, ...vars };\n}\n\n/** Stop what a lease started (and only that), bring its Storybook down, release it. Without the worktree the stop commands are skipped but the pids are still signalled. */\nasync function releaseLease(ctx: Ctx, effort: Effort | undefined, lease: Lease): Promise<void> {\n try {\n if (lease.kind === 'slot' && lease.pids && Object.keys(lease.pids).length > 0) {\n const hasWorktree = effort !== undefined && existsSync(effort.worktree);\n await ctx.runner.stop({\n m: ctx.manifest,\n cwd: hasWorktree && effort ? effort.worktree : ctx.repoRoot,\n env: effort ? leaseEnv(ctx, effort, lease) : process.env,\n pids: lease.pids,\n signatures: lease.signatures,\n skipStopCommands: !hasWorktree,\n onLog: ctx.log,\n });\n } else if (lease.kind === 'storybook') {\n await ctx.storybrokr.down(String(lease.value));\n }\n } catch (err) {\n ctx.log(\n `while releasing ${lease.kind} ${lease.value}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n ctx.registry.release(lease.id);\n}\n\n/** Tell every other area that a commons set changed on this branch (informational only, kept until the area is retired or synced). */\nfunction leaveNotices(ctx: Ctx, effort: Effort, commons: string[]): number {\n if (commons.length === 0) return 0;\n const notice: Notice = {\n from: effort.branch,\n text: `commons ${commons.join(', ')} changed on ${effort.branch}: sync and re-verify`,\n at: now(),\n };\n let count = 0;\n for (const area of Object.keys(ctx.manifest.areas)) {\n if (area === effort.area) continue;\n ctx.registry.addNotice(ctx.manifest.project, area, notice);\n count++;\n }\n return count;\n}\n\nexport interface FinishOptions {\n area: string;\n task?: string;\n park?: boolean;\n intoArea?: boolean;\n force?: boolean;\n}\n\nexport interface FinishResult {\n effort: Effort;\n pushed: boolean;\n parked: boolean;\n mergedIntoArea?: boolean;\n left?: boolean;\n notices: number;\n}\n\n/** Stop the runner, release every lease, push the branch (or merge --into-area), leave notices; area worktrees stay, task worktrees are cleaned up. */\nexport async function finishEffort(ctx: Ctx, o: FinishOptions): Promise<FinishResult> {\n const m = ctx.manifest;\n const effort =\n ctx.registry.openEffortFor(m.project, o.area, o.task) ??\n ctx.registry\n .efforts({ project: m.project, area: o.area, state: 'parked' })\n .filter((e) => (e.task ?? undefined) === (o.task ?? undefined))\n .sort((a, b) => b.started.localeCompare(a.started))[0];\n if (!effort)\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `no open or parked effort on ${effortLabel(o.area, o.task)}`,\n { area: o.area, task: o.task },\n );\n\n if (!o.force && effort.participants && effort.participants.length > 0) {\n if (ctx.owner.session === effort.owner.session) {\n const [nextOwner, ...rest] = effort.participants;\n const updated = ctx.registry.updateEffort(effort.id, {\n owner: nextOwner,\n participants: rest,\n lastActivity: now(),\n });\n touchEffort(ctx, updated);\n return { effort: updated, pushed: false, parked: false, left: true, notices: 0 };\n }\n if (effort.participants.some((p) => p.session === ctx.owner.session)) {\n const updated = ctx.registry.updateEffort(effort.id, {\n participants: effort.participants.filter((p) => p.session !== ctx.owner.session),\n lastActivity: now(),\n });\n touchEffort(ctx, updated);\n return { effort: updated, pushed: false, parked: false, left: true, notices: 0 };\n }\n }\n\n const label = effortLabel(effort.area, effort.task);\n const g = new Git(effort.worktree);\n let parked = false;\n if (g.isDirty()) {\n if (!o.park) {\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `${effort.worktree} has uncommitted changes: commit them, or \\`work finish --park\\` to commit them as wip(${label}) and push`,\n { worktree: effort.worktree },\n );\n }\n g.run(['add', '-A']);\n g.run(['commit', '-q', '-m', `wip(${label}): parked ${now()}`]);\n parked = true;\n }\n\n if (o.intoArea) {\n if (!effort.task) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n '--into-area requires a task sub-effort (--task <slug>)',\n { area: effort.area },\n );\n }\n fetchBaseOnce(ctx);\n const parentBranch = branchFor(effort.type, effort.area);\n const { wg: areaGit } = ensureWorktree(ctx, effort.area, parentBranch);\n if (areaGit.isDirty()) {\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `parent area worktree ${areaGit.cwd} has uncommitted changes; commit or clean it before merging task ${effort.branch} --into-area`,\n { worktree: areaGit.cwd },\n );\n }\n const merged = areaGit.tryRun(['merge', '--no-edit', '-q', effort.branch]);\n if (merged.code !== 0) {\n const conflicted = areaGit\n .tryRun(['diff', '--name-only', '--diff-filter=U'])\n .out.split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n areaGit.tryRun(['merge', '--abort']);\n throw new WorkkitError(\n 'SYNC_CONFLICT',\n `merging ${effort.branch} into ${parentBranch} conflicts in ${conflicted.join(', ')}; resolve in ${effort.worktree} before retrying \\`work finish --into-area\\``,\n { conflicted, worktree: areaGit.cwd },\n );\n }\n }\n\n for (const lease of ctx.registry.leases({ effort: effort.id }))\n await releaseLease(ctx, effort, lease);\n await Promise.resolve(ctx.storybrokr.downHost?.(storybookHostFor(m, effort.worktree))).catch(\n () => undefined,\n );\n\n let notices = 0;\n if (!o.intoArea) {\n g.push(effort.branch);\n if (g.commitsNotOn(m.baseBranch).length > 0 && !g.isEquivalentToBase(m.baseBranch)) {\n const since = g.changedSince(m.baseBranch);\n const sinceSet = new Set(since);\n const changed = effort.baseSha\n ? g.changedPaths(effort.baseSha, 'HEAD').filter((p) => sinceSet.has(p))\n : since;\n notices = leaveNotices(ctx, effort, commonsTouched(m, changed));\n }\n }\n\n if (effort.task) {\n archiveWorktree(ctx, label, effort.worktree);\n const main = new Git(ctx.repoRoot);\n main.worktreeRemove(effort.worktree);\n if (o.intoArea) {\n main.deleteLocalBranch(effort.branch);\n }\n const finished: Effort = { ...effort, state: 'finished', lastActivity: now() };\n ctx.registry.removeEfforts((e) => e.id === effort.id);\n return {\n effort: finished,\n pushed: !o.intoArea,\n parked,\n mergedIntoArea: Boolean(o.intoArea),\n notices,\n };\n }\n\n const finished = ctx.registry.updateEffort(effort.id, { state: 'finished', lastActivity: now() });\n return { effort: finished, pushed: true, parked, notices };\n}\n\n/** Expire idle efforts as a whole: when any lease is expired (or garbage) every lease of that effort is released and the effort parked. */\nexport async function reapLeases(\n ctx: Ctx,\n o: { dryRun?: boolean; now?: Date } = {},\n): Promise<{ reaped: Lease[] }> {\n const m = ctx.manifest;\n const at = o.now ?? new Date();\n const efforts = new Map(ctx.registry.efforts({ project: m.project }).map((e) => [e.id, e]));\n const leases = ctx.registry.leases({ project: m.project });\n const doomed = new Set<string>();\n for (const l of leases) {\n const effort = efforts.get(l.effort);\n // a start in progress is never reaped; a start that died is, once real time has moved on\n if (effort?.state === 'starting' && Date.now() - Date.parse(effort.started) < STARTING_GRACE_MS)\n continue;\n const expired = Date.parse(l.expires) < at.getTime();\n const orphaned = !effort || !existsSync(effort.worktree);\n const garbage = orphaned && !(await anyPortAnswers(l.ports));\n if (expired || garbage) doomed.add(l.effort);\n }\n const reaped = leases.filter((l) => doomed.has(l.effort));\n if (o.dryRun) return { reaped };\n for (const lease of reaped) await releaseLease(ctx, efforts.get(lease.effort), lease);\n for (const id of doomed) {\n const effort = efforts.get(id);\n if (effort) {\n await Promise.resolve(ctx.storybrokr.downHost?.(storybookHostFor(m, effort.worktree))).catch(\n () => undefined,\n );\n if (effort.state === 'active' || effort.state === 'starting') {\n ctx.registry.updateEffort(effort.id, {\n state: 'parked',\n parkedReason: `idle: a lease expired by ${at.toISOString()}`,\n lastActivity: now(),\n });\n }\n }\n }\n return { reaped };\n}\n\n// ── retire / audit ───────────────────────────────────────────────────────────\n\nexport const ARCHIVE_DIR = '.slot-archive';\n\nfunction dirSize(path: string): number {\n if (!existsSync(path)) return 0;\n let total = 0;\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n const p = join(path, entry.name);\n total += entry.isDirectory() ? dirSize(p) : statSync(p).size;\n }\n return total;\n}\n\n/** `.slot-archive/<area>/<UTC to the second>/<path>`; retention runs only inside the area's own directory. */\nfunction archiveWorktree(ctx: Ctx, area: string, worktree: string): string[] {\n const m = ctx.manifest;\n const areaRoot = join(ctx.repoRoot, ARCHIVE_DIR, area);\n const stamp = now().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);\n const target = join(areaRoot, stamp);\n const archived: string[] = [];\n for (const rel of m.archive.paths) {\n const src = join(worktree, rel);\n if (!existsSync(src)) continue;\n const dst = join(target, rel);\n mkdirSync(dirname(dst), { recursive: true });\n cpSync(src, dst, { recursive: true });\n archived.push(dst);\n }\n if (archived.length > 0) ensureExcluded(ctx.repoRoot, [`${ARCHIVE_DIR}/`]);\n if (existsSync(areaRoot)) {\n const stamps = readdirSync(areaRoot, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort()\n .reverse();\n const cutoff = Date.now() - m.archive.keepDays * 86_400_000;\n stamps.forEach((d, i) => {\n const t = statSync(join(areaRoot, d)).mtimeMs;\n if (i >= m.archive.keepPerArea || t < cutoff)\n rmSync(join(areaRoot, d), { recursive: true, force: true });\n });\n }\n return archived;\n}\n\nexport interface RetireResult {\n archived: string[];\n removed: string;\n branchesDeleted: string[];\n branchesKept: string[];\n}\n\n/** The only destructive verb: archive, remove the worktree, delete the local branches that are fully on origin. */\nexport async function retireArea(ctx: Ctx, o: { area: string }): Promise<RetireResult> {\n const m = ctx.manifest;\n if (!m.areas[o.area])\n throw new WorkkitError('AREA_UNKNOWN', `unknown area \"${o.area}\"`, { area: o.area });\n const open = ctx.registry\n .efforts({ project: m.project, area: o.area })\n .find((e) => e.state === 'starting' || e.state === 'active');\n if (open)\n throw new WorkkitError(\n 'EFFORT_OPEN',\n `an effort is open on ${effortLabel(open.area, open.task)} (${open.owner.session}); \\`work finish\\` it first`,\n { owner: open.owner.session },\n );\n const worktree = realpathOr(worktreePathFor(ctx, o.area));\n const main = new Git(ctx.repoRoot);\n let archived: string[] = [];\n await Promise.resolve(ctx.storybrokr.downHost?.(storybookHostFor(m, worktree))).catch(\n () => undefined,\n );\n if (existsSync(worktree)) {\n const g = new Git(worktree);\n if (g.isDirty())\n throw new WorkkitError(\n 'UNPUSHED',\n `${worktree} has uncommitted changes; commit and push them (or \\`work finish --park\\`) before retiring`,\n { worktree },\n );\n const unpushed = g.unpushedCount(m.baseBranch);\n if (unpushed > 0)\n throw new WorkkitError(\n 'UNPUSHED',\n `${g.currentBranch()} has ${unpushed} commit(s) not on origin; push before retiring`,\n { worktree, unpushed },\n );\n archived = archiveWorktree(ctx, o.area, worktree);\n main.worktreeRemove(worktree);\n }\n const branchesDeleted: string[] = [];\n const branchesKept: string[] = [];\n const allAreaBranches = m.branch.types.map((type) => `${type}/${o.area}`);\n for (const branch of allAreaBranches) {\n if (!main.branchExists(branch)) continue;\n const onOrigin =\n main.remoteBranchExists(branch) &&\n main.tryRun(['rev-list', '--count', `origin/${branch}..${branch}`]).out.trim() === '0';\n if (onOrigin) {\n main.deleteLocalBranch(branch);\n branchesDeleted.push(branch);\n } else branchesKept.push(branch);\n }\n ctx.registry.removeEfforts((e) => e.project === m.project && e.area === o.area);\n ctx.registry.clearNotices(m.project, o.area);\n ctx.registry.clearNoticesFrom(m.project, allAreaBranches);\n return { archived, removed: worktree, branchesDeleted, branchesKept };\n}\n\nexport type FindingKind =\n | 'dirty'\n | 'unpushed'\n | 'foreign-branch'\n | 'lease-aging'\n | 'behind-base'\n | 'notice-stale'\n | 'archive-size';\nexport interface Finding {\n kind: FindingKind;\n area?: string;\n detail: string;\n}\n\nconst BEHIND_LIMIT = 20;\nconst NOTICE_STALE_MS = 7 * 86_400_000;\nconst ARCHIVE_LIMIT_BYTES = 5 * 1024 ** 3;\n\nfunction registeredWorktrees(ctx: Ctx): { path: string; branch: string }[] {\n const out: { path: string; branch: string }[] = [];\n const porcelain = new Git(ctx.repoRoot).run(['worktree', 'list', '--porcelain']);\n let current: { path: string; branch: string } | null = null;\n for (const line of porcelain.split('\\n')) {\n if (line.startsWith('worktree ')) current = { path: line.slice(9), branch: '' };\n else if (line.startsWith('branch ') && current)\n current.branch = line.slice(7).replace(/^refs\\/heads\\//, '');\n else if (line === '' && current) {\n out.push(current);\n current = null;\n }\n }\n if (current) out.push(current);\n const wtRoot = join(realpathOr(ctx.repoRoot), ctx.manifest.worktreeRoot);\n return out.filter((w) => existsSync(w.path) && realpathOr(w.path).startsWith(wtRoot));\n}\n\n/** What would otherwise be forgotten: unsaved work, stray checkouts, aging leases, drift, stale notices, archive bulk. */\nexport async function auditProject(ctx: Ctx): Promise<Finding[]> {\n const m = ctx.manifest;\n fetchBaseOnce(ctx);\n const findings: Finding[] = [];\n const types = m.branch.types.join('|');\n const areaOf = (branch: string): string | null => {\n const match = new RegExp(`^(${types})/(.+?)(?:--([a-z0-9][a-z0-9_-]*))?$`).exec(branch);\n return match && m.areas[match[2]] ? match[2] : null;\n };\n for (const w of registeredWorktrees(ctx)) {\n const area = areaOf(w.branch);\n if (!area) {\n findings.push({\n kind: 'foreign-branch',\n detail: `${w.path} is on \"${w.branch || 'detached HEAD'}\", not a <type>/<area> branch of a declared area`,\n });\n continue;\n }\n const g = new Git(w.path);\n if (g.isDirty())\n findings.push({\n kind: 'dirty',\n area,\n detail: `${w.path} has uncommitted changes on ${w.branch}`,\n });\n const unpushed = g.unpushedCount(m.baseBranch);\n if (unpushed > 0)\n findings.push({\n kind: 'unpushed',\n area,\n detail: `${w.branch} has ${unpushed} commit(s) not on origin`,\n });\n const behind = behindBase(ctx, w.path);\n if (behind > BEHIND_LIMIT)\n findings.push({\n kind: 'behind-base',\n area,\n detail: `${w.branch} is ${behind} commits behind ${m.baseBranch}`,\n });\n }\n const nowMs = Date.now();\n for (const l of ctx.registry.leases({ project: m.project })) {\n const half = (Date.parse(l.touched) + Date.parse(l.expires)) / 2;\n if (nowMs > half)\n findings.push({\n kind: 'lease-aging',\n detail: `${l.kind} ${l.value} held by ${l.owner.session}, last used ${l.touched}, expires ${l.expires}`,\n });\n }\n for (const area of Object.keys(m.areas)) {\n for (const n of ctx.registry.notices(m.project, area)) {\n if (nowMs - Date.parse(n.at) > NOTICE_STALE_MS)\n findings.push({ kind: 'notice-stale', area, detail: `${n.text} (since ${n.at})` });\n }\n }\n const bytes = dirSize(join(ctx.repoRoot, ARCHIVE_DIR));\n if (bytes > ARCHIVE_LIMIT_BYTES)\n findings.push({\n kind: 'archive-size',\n detail: `${ARCHIVE_DIR} holds ${(bytes / 1024 ** 3).toFixed(1)} GB`,\n });\n return findings;\n}\n","import chalk from 'chalk';\nimport { exitCodeFor, toErrorBody } from '../../core/index.js';\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\n/** Print a failure the way every surface agrees on, then exit 2 (refused) or 1 (broken). */\nexport function fail(err: unknown, json: boolean): never {\n const body = toErrorBody(err);\n if (json) console.error(JSON.stringify(body));\n else {\n console.error(chalk.red(`${body.code}: ${body.message}`));\n if (body.details) console.error(chalk.gray(` ${JSON.stringify(body.details)}`));\n }\n process.exit(exitCodeFor(body.code));\n}\n\nexport function warn(line: string): void {\n console.error(chalk.yellow(`! ${line}`));\n}\n","import type { Command } from 'commander';\nimport { WorkkitError } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport { effortEnv, slotEnv } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerEnv(program: Command): void {\n program\n .command('env')\n .description(\"The slot-derived variables of an area's open effort, or of a slot number alone\")\n .option('--area <area>', 'the area whose open effort to read')\n .option('--task <slug>', 'intra-area task slug')\n .option(\n '--slot <n>',\n 'compute the variables for this slot from the manifest alone',\n (v: string) => Number(v),\n )\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print as JSON (default: KEY=value lines)')\n .option('--sh', 'print KEY=value lines (the default)')\n .action(\n async (o: {\n area?: string;\n task?: string;\n slot?: number;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: true });\n let vars: Record<string, string>;\n if (o.area) vars = effortEnv(ctx, o.area, o.task);\n else if (o.slot !== undefined && Number.isInteger(o.slot))\n vars = slotEnv(ctx.manifest, o.slot);\n else throw new WorkkitError('EFFORT_NOT_FOUND', 'pass --area <area> or --slot <n>');\n if (o.json) printJson(vars);\n else for (const [k, v] of Object.entries(vars)) console.log(`${k}=${v}`);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { finishEffort } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerFinish(program: Command): void {\n program\n .command('finish')\n .description(\n \"Stop the effort's runner, release its leases, push its branch (or merge --into-area); area worktrees stay, task worktrees are cleaned up\",\n )\n .requiredOption('--area <area>', 'the area whose open effort to finish')\n .option('--task <slug>', 'finish an intra-area task sub-effort')\n .option('--park', 'commit uncommitted changes as wip(<area>) instead of refusing')\n .option('--into-area', 'merge task branch into <type>/<area> instead of pushing to origin')\n .option('--force', 'stop and finish even if other joined participants remain')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (o: {\n area: string;\n task?: string;\n park?: boolean;\n intoArea?: boolean;\n force?: boolean;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await finishEffort(ctx, {\n area: o.area,\n task: o.task,\n park: o.park,\n intoArea: o.intoArea,\n force: o.force,\n });\n if (o.json) printJson(r);\n else {\n const label = r.effort.task ? `${r.effort.area}--${r.effort.task}` : r.effort.area;\n if (r.left) {\n console.log(`${chalk.bold(label)}: left shared effort (other participants remain)`);\n } else if (r.mergedIntoArea) {\n console.log(\n `${chalk.bold(label)} finished: ${r.effort.branch} merged into ${r.effort.type}/${r.effort.area}`,\n );\n } else {\n console.log(\n `${chalk.bold(label)} finished: ${r.effort.branch} pushed${r.parked ? ' (uncommitted changes parked as wip)' : ''}`,\n );\n }\n if (r.notices) console.log(` ${r.notices} area(s) told about commons changes`);\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import { readFileSync, realpathSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport {\n checkCommit,\n checkPush,\n currentOwner,\n Git,\n homeDir,\n installHooks,\n loadManifest,\n Registry,\n WorkkitError,\n} from '../core/index.js';\nimport { fail, printJson } from './_shared/output.js';\n\nconst ZEROS = /^0+$/;\n\n/** A hook must never break a repo that stopped using the tool: no manifest → nothing to check. */\nasync function hookContext(cwd: string) {\n const git = new Git(cwd);\n const repoRoot = git.mainRoot();\n try {\n const manifest = await loadManifest(repoRoot);\n return { git, repoRoot, manifest, registry: Registry.open(homeDir()) };\n } catch (err) {\n if (err instanceof WorkkitError && err.code === 'MANIFEST_NOT_FOUND') return null;\n throw err;\n }\n}\n\nexport async function runPreCommit(cwd: string): Promise<number> {\n const c = await hookContext(cwd);\n if (!c) return 0;\n const root = c.git.root();\n touchByWorktree(c.registry, c.manifest, root);\n const { refusals, warnings } = checkCommit({\n m: c.manifest,\n registry: c.registry,\n git: c.git,\n project: c.manifest.project,\n branch: c.git.currentBranch(),\n stagedPaths: c.git.changedPathsStaged(),\n ownerSession: currentOwner().session,\n checkoutRoot: root,\n });\n for (const w of warnings) console.error(chalk.yellow(`work: ${w}`));\n for (const r of refusals) console.error(chalk.red(`work: ${r}`));\n return refusals.length ? 2 : 0;\n}\n\n/** stdin carries `<local ref> <local sha> <remote ref> <remote sha>` per ref being pushed. */\nexport async function runPrePush(cwd: string, stdin: string): Promise<number> {\n const c = await hookContext(cwd);\n if (!c) return 0;\n touchByWorktree(c.registry, c.manifest, c.git.root());\n let code = 0;\n for (const line of stdin.split('\\n').filter(Boolean)) {\n const [localRef, localSha, remoteRef, remoteSha] = line.split(/\\s+/);\n if (!localRef || !localSha || !remoteRef) continue;\n const isDelete = ZEROS.test(localSha);\n const branch = isDelete ? '' : localRef.replace(/^refs\\/heads\\//, '');\n let changed: string[] = [];\n if (!isDelete) {\n const from =\n remoteSha && !ZEROS.test(remoteSha) ? remoteSha : `origin/${c.manifest.baseBranch}`;\n const range =\n remoteSha && !ZEROS.test(remoteSha) ? `${from}..${localSha}` : `${from}...${localSha}`;\n changed = c.git\n .tryRun(['diff', '--name-only', '--no-renames', range])\n .out.split('\\n')\n .filter(Boolean);\n }\n const { refusals, warnings } = checkPush({\n m: c.manifest,\n registry: c.registry,\n git: c.git,\n project: c.manifest.project,\n branch,\n remoteRef,\n isDelete,\n changedPaths: changed,\n });\n for (const w of warnings) console.error(chalk.yellow(`work: ${w}`));\n for (const r of refusals) console.error(chalk.red(`work: ${r}`));\n if (refusals.length) code = 2;\n }\n return code;\n}\n\n/** A commit or push from an effort's worktree is activity on that effort. */\nfunction touchByWorktree(\n registry: Registry,\n m: {\n project: string;\n expiry: { slotHours: number; commonsHours: number; storybookHours: number };\n },\n root: string,\n): void {\n const same = (p: string) => {\n try {\n return realpathSync(p) === realpathSync(root);\n } catch {\n return false;\n }\n };\n const hours = {\n slot: m.expiry.slotHours,\n storybook: m.expiry.storybookHours,\n commons: m.expiry.commonsHours,\n };\n for (const e of registry.efforts({ project: m.project })) {\n if ((e.state !== 'active' && e.state !== 'starting') || !same(e.worktree)) continue;\n for (const l of registry.leases({ effort: e.id })) registry.touch(l.id, hours[l.kind]);\n registry.updateEffort(e.id, { lastActivity: new Date().toISOString() });\n }\n}\n\nexport function registerHook(program: Command): void {\n const hook = program.command('hook').description('Entry points the installed git hooks call');\n hook\n .command('pre-commit')\n .description('Refuse commits on protected branches and writes under write-locked commons')\n .action(async () => {\n try {\n process.exit(await runPreCommit(process.cwd()));\n } catch (err) {\n fail(err, false);\n }\n });\n hook\n .command('pre-push')\n .description(\n 'Refuse pushes to protected branches; warn when paths leave the effort scope or touch commons',\n )\n .argument('[remote]', 'passed by git, unused')\n .argument('[url]', 'passed by git, unused')\n .action(async () => {\n try {\n const stdin = process.stdin.isTTY ? '' : readFileSync(0, 'utf8');\n process.exit(await runPrePush(process.cwd(), stdin));\n } catch (err) {\n fail(err, false);\n }\n });\n\n const hooks = program.command('hooks').description('Manage the git hooks in a clone');\n hooks\n .command('install')\n .description(\n \"Write .helmsmith/hooks and point this clone's core.hooksPath at them (for a repo whose manifest already exists)\",\n )\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(async (o: { projectRoot?: string; json?: boolean }) => {\n try {\n const repoRoot = o.projectRoot ? resolve(o.projectRoot) : new Git(process.cwd()).mainRoot();\n const manifest = await loadManifest(repoRoot);\n const out = installHooks(repoRoot, { protectedBranches: manifest.protectedBranches });\n if (o.json) printJson(out);\n else for (const f of out.files) console.log(`installed ${f}`);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import { existsSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport {\n claimRanges,\n Git,\n homeDir,\n installHooks,\n MANIFEST_FILES,\n Registry,\n validateManifest,\n WorkkitError,\n} from '../core/index.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport interface InitOptions {\n repoRoot: string;\n home: string;\n project: string;\n baseBranch: string;\n /** `name=port`, repeatable */\n services: string[];\n storybookHost?: string;\n worktreeRoot?: string;\n hooks: boolean;\n force: boolean;\n}\n\nconst STORYBOOK_BASE = 6100;\n\nfunction defaultService(name: string): Record<string, unknown> {\n const PORT = `\\${PORT_${name.toUpperCase()}}`;\n if (name === 'postgres' || name === 'db') {\n return {\n start: `docker compose up -d ${name}`,\n stop: `docker compose stop ${name}`,\n health: `pg_isready -h 127.0.0.1 -p ${PORT} -q`,\n healthTimeoutMs: 120000,\n };\n }\n return {\n start: `make -C ${name} dev`,\n stop: `make -C ${name} dev-stop`,\n health: `curl -sf -o /dev/null http://127.0.0.1:${PORT}/health`,\n healthTimeoutMs: 300000,\n };\n}\n\n/** The starter manifest: real, loadable, with every project-specific line marked for editing. */\nexport function buildStarterManifest(o: InitOptions): Record<string, unknown> {\n const ports: Record<string, { base: number }> = {};\n const services: Record<string, unknown> = {};\n for (const spec of o.services) {\n const m = /^([a-z][a-z0-9_-]*)=(\\d{4,5})$/.exec(spec);\n if (!m)\n throw new WorkkitError('MANIFEST_INVALID', `--service expects name=port, got \"${spec}\"`);\n ports[m[1]] = { base: Number(m[2]) };\n services[m[1]] = defaultService(m[1]);\n }\n if (o.storybookHost) ports.storybook = { base: STORYBOOK_BASE };\n const manifest: Record<string, unknown> = {\n project: o.project,\n baseBranch: o.baseBranch,\n protectedBranches: [o.baseBranch],\n worktreeRoot: o.worktreeRoot ?? '.claude/worktrees',\n branch: { types: ['feature', 'chore', 'fix'] },\n slots: { count: 10, reserved: [0] },\n ports: { services: ports },\n services,\n ...(o.storybookHost ? { storybook: { hostRoot: o.storybookHost } } : {}),\n logs: { dir: '.logs' },\n refresh: [],\n scopes: {\n frontend: [\n 'app/{group}/{section}/**',\n 'components/{group}/{section}/**',\n 'app/api/{section}/**',\n ],\n backend: ['services/{module}/**'],\n },\n areas: {},\n commons: {},\n expiry: { slotHours: 12, commonsHours: 4, storybookHours: 2 },\n archive: { paths: [], keepDays: 30, keepPerArea: 5 },\n };\n validateManifest(manifest);\n return manifest;\n}\n\nconst HEADER = `// biome-ignore-all lint/suspicious/noTemplateCurlyInString: \\${PORT_*} are the manifest's own placeholders\n// helmsmith.config.mjs — read by \\`work\\` (@helmsmith/workbrokr). Written by \\`work init\\`.\n// Edit: the services' start/stop/health commands, the scope templates, the areas (leaves only,\n// each with its backend module) and the commons. Nothing here is read by the application.\n`;\n\nexport function runInit(o: InitOptions): { manifestPath: string; hooks: string[] } {\n const repoRoot = resolve(o.repoRoot);\n for (const name of MANIFEST_FILES) {\n if (existsSync(join(repoRoot, name)) && !o.force) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n `${name} already exists in ${repoRoot}; pass --force to overwrite`,\n );\n }\n }\n const manifest = buildStarterManifest(o);\n const manifestPath = join(repoRoot, 'helmsmith.config.mjs');\n writeFileSync(manifestPath, `${HEADER}export default ${JSON.stringify(manifest, null, 2)};\\n`);\n claimRanges(Registry.open(o.home), validateManifest(manifest), repoRoot);\n const hooks = o.hooks ? installHooks(repoRoot, { protectedBranches: [o.baseBranch] }).files : [];\n return { manifestPath, hooks };\n}\n\nfunction defaultRepoRoot(): string {\n try {\n return new Git(process.cwd()).mainRoot();\n } catch {\n return process.cwd();\n }\n}\n\nfunction defaultBaseBranch(repoRoot: string): string {\n const g = new Git(repoRoot);\n const head = g.tryRun(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);\n if (head.code === 0) return head.out.trim().replace(/^origin\\//, '');\n return 'main';\n}\n\nexport function registerInit(program: Command): void {\n program\n .command('init')\n .description(\n 'Write helmsmith.config.mjs for this repo, claim its port ranges, install the git hooks',\n )\n .requiredOption('--project <name>', 'project name (lowercase, digits, dashes)')\n .option('--base-branch <branch>', \"base branch (default: origin's HEAD, else main)\")\n .option(\n '--service <name=port>',\n 'a service and its slot-0 port; repeat per service',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option('--storybook-host <dir>', 'the package whose .storybook storybrokr boots from')\n .option('--worktree-root <dir>', 'where area worktrees live (default .claude/worktrees)')\n .option('--repo-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--no-hooks', 'do not install the git hooks')\n .option('--force', 'overwrite an existing manifest')\n .option('--json', 'print the result as JSON')\n .action(\n (o: {\n project: string;\n baseBranch?: string;\n service: string[];\n storybookHost?: string;\n worktreeRoot?: string;\n repoRoot?: string;\n hooks: boolean;\n force?: boolean;\n json?: boolean;\n }) => {\n try {\n const repoRoot = o.repoRoot ? resolve(o.repoRoot) : defaultRepoRoot();\n if (o.service.length === 0)\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n 'at least one --service name=port is required',\n );\n const out = runInit({\n repoRoot,\n home: homeDir(),\n project: o.project,\n baseBranch: o.baseBranch ?? defaultBaseBranch(repoRoot),\n services: o.service,\n storybookHost: o.storybookHost,\n worktreeRoot: o.worktreeRoot,\n hooks: o.hooks,\n force: o.force === true,\n });\n if (o.json) printJson(out);\n else {\n console.log(`wrote ${out.manifestPath}`);\n for (const h of out.hooks) console.log(`installed ${h}`);\n console.log(\n 'next: edit the services and areas, commit helmsmith.config.mjs and .helmsmith/hooks, then `work start`',\n );\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { toErrorBody } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport {\n auditProject,\n type Ctx,\n effortEnv,\n finishEffort,\n promoteEffort,\n reapLeases,\n startEffort,\n statusFor,\n} from '../lib/effort.js';\nimport { VERSION } from '../version.js';\n\ntype ToolResult = { content: { type: 'text'; text: string }[]; isError?: boolean };\n\nconst ok = (value: unknown): ToolResult => ({\n content: [{ type: 'text', text: JSON.stringify(value, null, 2) }],\n});\nconst failed = (err: unknown): ToolResult => ({\n content: [{ type: 'text', text: JSON.stringify(toErrorBody(err)) }],\n isError: true,\n});\n\nasync function guard(fn: () => Promise<unknown>): Promise<ToolResult> {\n try {\n return ok(await fn());\n } catch (err) {\n return failed(err);\n }\n}\n\n/** The same verbs as the CLI, with the same JSON the CLI's --json prints; refusals carry code + details. */\nexport function buildMcpServer(ctxFactory: (projectRoot?: string) => Promise<Ctx>): McpServer {\n const server = new McpServer({ name: 'work', version: VERSION });\n\n server.registerTool(\n 'work_start',\n {\n description:\n 'Start an effort on an area (or intra-area task): its worktree on <type>/<area> (or <type>/<area>--<task>), synced from the base branch, refreshed, leased (a slot for fullstack/backend, a storybrokr instance for frontend with a story) and running. Refuses with EFFORT_OPEN (another effort is open; join=true to share it), SCOPE_CONFLICT, SYNC_CONFLICT (resolve in the worktree, rerun with sync=false).',\n inputSchema: {\n area: z.string().describe('a leaf area from helmsmith.config (e.g. org/applications)'),\n task: z\n .string()\n .optional()\n .describe('optional intra-area task slug for parallel sub-efforts (<type>/<area>--<task>)'),\n type: z.string().describe('feature | chore | fix'),\n mode: z.enum(['frontend', 'backend', 'fullstack']),\n scopes: z\n .array(z.string())\n .optional()\n .describe('optional narrowed scope globs for a task sub-effort'),\n story: z\n .string()\n .optional()\n .describe(\n 'frontend: story file or component folder for storybrokr, relative to its host',\n ),\n join: z\n .boolean()\n .optional()\n .describe('work in the already-open effort instead of refusing'),\n sync: z\n .boolean()\n .optional()\n .describe('fetch and merge the base branch first (default true)'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, type, mode, scopes, story, join, sync, projectRoot }) =>\n guard(async () =>\n startEffort(await ctxFactory(projectRoot), {\n area,\n task,\n type,\n mode,\n scopes,\n story,\n join,\n sync,\n }),\n ),\n );\n\n server.registerTool(\n 'work_promote',\n {\n description:\n 'Promote an open effort in place to backend or fullstack mode, claiming a slot if needed and starting only newly required services.',\n inputSchema: {\n area: z.string().describe('the area of the open effort'),\n task: z.string().optional().describe('optional intra-area task slug'),\n mode: z.enum(['backend', 'fullstack']).describe('target mode to promote into'),\n story: z.string().optional().describe('optional story path'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, mode, story, projectRoot }) =>\n guard(async () => promoteEffort(await ctxFactory(projectRoot), { area, task, mode, story })),\n );\n\n server.registerTool(\n 'work_status',\n {\n description:\n 'Per area: the open effort, its leases, how far behind the base branch it is, pending notices; plus every lease of the project.',\n inputSchema: {\n area: z.string().optional(),\n task: z.string().optional(),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, projectRoot }) =>\n guard(async () => statusFor(await ctxFactory(projectRoot), area, task)),\n );\n\n server.registerTool(\n 'work_finish',\n {\n description:\n \"Stop the effort's runner, release its leases, push its branch (or merge --into-area for task sub-efforts), leave commons notices. Refuses DIRTY_WORKTREE unless park=true (commits as wip).\",\n inputSchema: {\n area: z.string(),\n task: z.string().optional().describe('optional intra-area task slug'),\n park: z.boolean().optional(),\n intoArea: z\n .boolean()\n .optional()\n .describe('merge task branch into <type>/<area> instead of pushing to origin'),\n force: z\n .boolean()\n .optional()\n .describe('stop and finish even if other joined participants remain'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, park, intoArea, force, projectRoot }) =>\n guard(async () =>\n finishEffort(await ctxFactory(projectRoot), { area, task, park, intoArea, force }),\n ),\n );\n\n server.registerTool(\n 'work_reap',\n {\n description:\n 'Expire idle leases: stop only what they started, release them, park their efforts. dryRun lists without touching.',\n inputSchema: {\n dryRun: z.boolean().optional(),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ dryRun, projectRoot }) =>\n guard(async () => reapLeases(await ctxFactory(projectRoot), { dryRun })),\n );\n\n server.registerTool(\n 'work_audit',\n {\n description:\n 'Findings: dirty or unpushed area worktrees, foreign worktrees, aging leases, drift from the base branch, stale notices, archive size.',\n inputSchema: {\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ projectRoot }) => guard(async () => auditProject(await ctxFactory(projectRoot))),\n );\n\n server.registerTool(\n 'work_env',\n {\n description:\n \"The slot-derived variables of an area's open effort (PORT_*, SLOT, LOG_DIR, WORKTREE, BRANCH, MODE).\",\n inputSchema: {\n area: z.string(),\n task: z.string().optional(),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, projectRoot }) =>\n guard(async () => effortEnv(await ctxFactory(projectRoot), area, task)),\n );\n\n return server;\n}\n\nexport async function runStdio(): Promise<void> {\n const server = buildMcpServer((projectRoot) => buildCtx({ projectRoot, quiet: true }));\n await server.connect(new StdioServerTransport());\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// tsup builds this module into two separate entry bundles that sit at different depths under\n// the package root — dist/cli.js (one level down) and, via server/daemon.ts, dist/server/\n// start.js (two levels down) — so a single relative '../package.json' can't reach it from\n// both. Walk upward from this module's own file instead; that also covers `tsx src/cli.ts` /\n// dev imports, since no package.json sits between src/ (or src/server/) and the package root.\nfunction findPackageJson(startDir: string): string {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, 'package.json');\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) throw new Error(`package.json not found above ${startDir}`);\n dir = parent;\n }\n}\n\nconst pkgFile = findPackageJson(dirname(fileURLToPath(import.meta.url)));\nexport const VERSION: string = (JSON.parse(readFileSync(pkgFile, 'utf8')) as { version: string })\n .version;\n","import type { Command } from 'commander';\nimport { runStdio } from '../mcp/server.js';\n\nexport function registerMcp(program: Command): void {\n program\n .command('mcp')\n .description('Serve the MCP stdio interface (the same verbs as the CLI)')\n .action(async () => {\n await runStdio();\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { promoteEffort } from '../lib/effort.js';\nimport { fail, printJson, warn } from './_shared/output.js';\n\nexport function registerPromote(program: Command): void {\n program\n .command('promote')\n .description('Promote an open effort in place to backend or fullstack mode')\n .requiredOption('--area <area>', 'the area of the open effort')\n .option('--task <slug>', 'intra-area task slug if promoting a task sub-effort')\n .requiredOption('--mode <mode>', 'target mode: backend | fullstack')\n .option('--story <path>', 'optional story path to attach via storybrokr')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (o: {\n area: string;\n task?: string;\n mode: 'backend' | 'fullstack';\n story?: string;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await promoteEffort(ctx, {\n area: o.area,\n task: o.task,\n mode: o.mode,\n story: o.story,\n });\n if (o.json) printJson(r);\n else {\n const label = r.effort.task ? `${r.effort.area}--${r.effort.task}` : r.effort.area;\n console.log(\n `${chalk.bold(label)} promoted to ${r.effort.mode}${r.startedServices.length ? ` (started: ${r.startedServices.join(', ')})` : ''}`,\n );\n for (const w of r.warnings) warn(w);\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { reapLeases } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerReap(program: Command): void {\n program\n .command('reap')\n .description(\n 'Expire idle leases: stop only what they started, release them, park their efforts',\n )\n .option('--dry-run', 'list what would be reaped without touching anything')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(async (o: { dryRun?: boolean; projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await reapLeases(ctx, { dryRun: o.dryRun });\n if (o.json) printJson(r);\n else if (r.reaped.length === 0) console.log(chalk.gray('nothing to reap'));\n else\n for (const l of r.reaped)\n console.log(\n `${o.dryRun ? 'would reap' : 'reaped'} ${l.kind} ${l.value} (${l.owner.session}, expired ${l.expires})`,\n );\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { retireArea } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerRetire(program: Command): void {\n program\n .command('retire')\n .description(\n \"Archive an area's evidence, remove its worktree and its local branches that are on origin (the only destructive verb)\",\n )\n .requiredOption('--area <area>', 'the area to retire')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(async (o: { area: string; projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await retireArea(ctx, { area: o.area });\n if (o.json) printJson(r);\n else {\n console.log(`${chalk.bold(o.area)} retired: removed ${r.removed}`);\n for (const a of r.archived) console.log(` archived ${a}`);\n for (const b of r.branchesDeleted) console.log(` deleted local branch ${b}`);\n for (const b of r.branchesKept)\n console.log(chalk.yellow(` kept ${b}: not fully on origin`));\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport type { Mode } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport { type StartResult, startEffort } from '../lib/effort.js';\nimport { fail, printJson, warn } from './_shared/output.js';\n\nexport function printStart(r: StartResult): void {\n const e = r.effort;\n const label = e.task ? `${e.area}--${e.task}` : e.area;\n console.log(\n `${chalk.bold(label)} ${e.type}/${e.mode} ${e.branch}${r.joined ? chalk.yellow(' (joined)') : ''}`,\n );\n console.log(` worktree ${e.worktree}`);\n console.log(\n ` sync ${r.sync}${r.refreshed.length ? ` refreshed: ${r.refreshed.join('; ')}` : ''}`,\n );\n for (const l of r.leases) {\n const ports = l.ports\n ? ` ${Object.entries(l.ports)\n .map(([k, v]) => `${k}=${v}`)\n .join(' ')}`\n : '';\n console.log(` lease ${l.kind} ${l.value}${ports} expires ${l.expires}`);\n }\n for (const w of r.warnings) warn(w);\n for (const n of r.notices) console.log(chalk.yellow(` notice ${n.text} (${n.at})`));\n}\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description(\n \"Start an effort: the area's worktree on <type>/<area> (or <type>/<area>--<task>), synced from the base branch, leased and running\",\n )\n .requiredOption('--area <area>', 'a leaf area from helmsmith.config (e.g. org/applications)')\n .option('--task <slug>', 'intra-area task slug for parallel sub-efforts (<type>/<area>--<slug>)')\n .requiredOption('--type <type>', 'feature | chore | fix (as the manifest allows)')\n .requiredOption('--mode <mode>', 'fullstack | backend (a slot) | frontend (storybrokr)')\n .option('--scope <glob...>', 'narrow exclusive scope globs for this task sub-effort')\n .option(\n '--story <path>',\n 'frontend: the story file or component folder storybrokr boots, relative to the Storybook host',\n )\n .option('--join', 'work in the already-open effort on this area instead of refusing')\n .option('--no-sync', 'skip the fetch and merge from the base branch (reproducing something)')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (o: {\n area: string;\n task?: string;\n type: string;\n mode: string;\n scope?: string[];\n story?: string;\n join?: boolean;\n sync: boolean;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await startEffort(ctx, {\n area: o.area,\n task: o.task,\n type: o.type,\n mode: o.mode as Mode,\n scopes: o.scope,\n story: o.story,\n join: o.join,\n sync: o.sync,\n });\n if (o.json) printJson(r);\n else printStart(r);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport type { Lease } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport { type StatusReport, statusFor } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nconst age = (iso: string) => {\n const mins = Math.max(0, Math.round((Date.now() - Date.parse(iso)) / 60_000));\n return mins < 60\n ? `${mins}m`\n : mins < 1440\n ? `${Math.round(mins / 60)}h`\n : `${Math.round(mins / 1440)}d`;\n};\nconst expiresIn = (iso: string) => {\n const mins = Math.round((Date.parse(iso) - Date.now()) / 60_000);\n return mins <= 0 ? chalk.red('expired') : mins < 60 ? `${mins}m` : `${Math.round(mins / 60)}h`;\n};\n\nexport function printStatus(r: StatusReport): void {\n console.log(chalk.bold(`${r.project}`));\n const cols = ['AREA', 'TYPE/MODE', 'BRANCH', 'OWNER', 'STARTED', 'LEASES', 'BEHIND', 'NOTICES'];\n const rows = r.areas.map((a) => [\n a.area,\n a.effort ? `${a.effort.type}/${a.effort.mode}` : chalk.gray('-'),\n a.effort?.branch ?? chalk.gray('-'),\n a.effort?.owner.session ?? chalk.gray('-'),\n a.effort ? age(a.effort.started) : chalk.gray('-'),\n a.leases.length ? a.leases.map((l) => `${l.kind}:${l.value}`).join(',') : chalk.gray('-'),\n a.behindBase > 0 ? chalk.yellow(String(a.behindBase)) : '0',\n a.notices.length ? chalk.yellow(String(a.notices.length)) : '0',\n ]);\n // biome-ignore lint/suspicious/noControlCharactersInRegex: strips chalk's ANSI colour codes for width math\n const plain = (s: string) => s.replace(/\\u001b\\[[0-9;]*m/g, '');\n const widths = cols.map((c, i) => Math.max(c.length, ...rows.map((row) => plain(row[i]).length)));\n const line = (cells: string[]) =>\n cells.map((c, i) => c + ' '.repeat(widths[i] - plain(c).length)).join(' ');\n console.log(chalk.bold(line(cols)));\n for (const row of rows) console.log(line(row));\n if (r.leases.length) {\n console.log('');\n console.log(chalk.bold('KIND VALUE OWNER AGE EXPIRES-IN'));\n for (const l of r.leases as Lease[]) {\n console.log(\n `${l.kind.padEnd(10)} ${String(l.value).padEnd(12)} ${l.owner.session.padEnd(21)} ${age(l.created).padEnd(5)} ${expiresIn(l.expires)}`,\n );\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Open efforts, leases, drift from the base branch and notices, per area')\n .option('--area <area>', 'one area only')\n .option('--task <slug>', 'intra-area task slug')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the report as JSON')\n .action(async (o: { area?: string; task?: string; projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: true });\n const r = statusFor(ctx, o.area, o.task);\n if (o.json) printJson(r);\n else printStatus(r);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import { createCli } from '@helmsmith/cli-kit';\nimport { registerAudit } from './commands/audit.js';\nimport { registerEnv } from './commands/env.js';\nimport { registerFinish } from './commands/finish.js';\nimport { registerHook } from './commands/hook.js';\nimport { registerInit } from './commands/init.js';\nimport { registerMcp } from './commands/mcp.js';\nimport { registerPromote } from './commands/promote.js';\nimport { registerReap } from './commands/reap.js';\nimport { registerRetire } from './commands/retire.js';\nimport { registerStart } from './commands/start.js';\nimport { registerStatus } from './commands/status.js';\nimport { VERSION } from './version.js';\n\nconst { program } = createCli({\n name: 'work',\n version: VERSION,\n description: 'Area-based work: start, promote, status, finish, reap, retire, audit.',\n});\n\nregisterInit(program);\nregisterStart(program);\nregisterPromote(program);\nregisterStatus(program);\nregisterEnv(program);\nregisterFinish(program);\nregisterReap(program);\nregisterRetire(program);\nregisterAudit(program);\nregisterHook(program);\nregisterMcp(program);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":["program","chalk","existsSync","mkdirSync","realpathSync","join","join","realpathSync","mkdirSync","existsSync","existsSync","realpathSync","realpathSync","existsSync","mkdirSync","writeFileSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","join","mkdirSync","writeFileSync","join","spawnSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","picomatch","picomatch","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","join","spawnSync","existsSync","mkdirSync","readFileSync","rmSync","statSync","writeFileSync","now","mkdirSync","existsSync","readFileSync","statSync","rmSync","writeFileSync","spawnSync","join","sleep","spawnSync","join","spawnSync","spawnSync","appendFileSync","existsSync","mkdirSync","realpathSync","rmSync","statSync","dirname","join","join","effortLabel","sleep","realpathOr","realpathSync","resolve","existsSync","wg","appendFileSync","mkdirSync","finished","statSync","dirname","rmSync","chalk","chalk","program","chalk","program","chalk","program","chalk","readFileSync","realpathSync","resolve","chalk","chalk","same","realpathSync","program","readFileSync","resolve","existsSync","writeFileSync","join","resolve","resolve","existsSync","join","writeFileSync","program","z","existsSync","readFileSync","dirname","join","z","join","program","chalk","program","chalk","chalk","program","chalk","chalk","program","chalk","chalk","chalk","program","chalk","chalk","program"]}
1
+ {"version":3,"sources":["../../../platform/core/cli-kit-lib/src/auth-provider.ts","../../../platform/core/cli-kit-lib/src/create-cli.ts","../src/commands/audit.ts","../src/lib/context.ts","../src/core/config.ts","../src/core/errors.ts","../src/core/git.ts","../src/core/guards.ts","../src/core/scopes.ts","../src/core/hooks.ts","../src/core/manifest.ts","../src/core/paths.ts","../src/core/ports.ts","../src/core/refresh.ts","../src/core/registry.ts","../src/core/runner.ts","../src/core/session.ts","../src/lib/pritty.ts","../src/lib/storybrokr.ts","../src/lib/effort.ts","../src/commands/_shared/output.ts","../src/commands/env.ts","../src/commands/finish.ts","../src/commands/hook.ts","../src/commands/init.ts","../src/mcp/server.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/pr.ts","../src/commands/promote.ts","../src/commands/reap.ts","../src/commands/retire.ts","../src/commands/start.ts","../src/commands/status.ts","../src/cli.ts"],"sourcesContent":["/**\n * AuthProvider — the contract cli-kit consumers implement to wire\n * their auth library into commands that need a token.\n *\n * Why pluggable: cli-kit is consumed by toolbox apps (which use\n * `@helmsmith/agent-auth`) AND by platform CLIs (which may use\n * different auth flows). Hardcoding agent-auth would force every\n * consumer onto it.\n *\n * Why minimal: this interface is published and breaking it forces\n * every consumer to update. Login flows, token storage, refresh\n * policy — those belong in the auth library, not here.\n */\nexport interface AuthProvider {\n /**\n * Returns a fresh access token. Implementations are expected to\n * handle refresh internally and throw if the user isn't logged in.\n */\n getToken(): Promise<string>;\n\n /**\n * Returns the current user's identity, if available. `null` if not\n * logged in or the provider doesn't expose identity. Used by\n * `--whoami`-style commands.\n */\n whoami?(): Promise<{ id: string; email?: string; name?: string } | null>;\n}\n\n/**\n * No-op AuthProvider for commands that don't need auth, or for tests.\n * Calling `getToken()` throws — opt in explicitly.\n */\nexport const noopAuthProvider: AuthProvider = {\n async getToken(): Promise<string> {\n throw new Error(\n 'noopAuthProvider.getToken() called — wire a real AuthProvider via createCli({ auth })',\n );\n },\n async whoami() {\n return null;\n },\n};\n","import { Command } from 'commander';\nimport type { AuthProvider } from './auth-provider.js';\nimport { noopAuthProvider } from './auth-provider.js';\n\nexport interface CreateCliOptions {\n /** CLI binary name as it appears in `--help` and version output. */\n name: string;\n /** Semver version, usually read from the consumer's package.json. */\n version: string;\n /** One-line description shown in `--help`. */\n description?: string;\n /**\n * Auth provider injected by the consumer. Available to action\n * handlers via `program.getOptionValue(\"_auth\")` or by closing over\n * the returned reference. Defaults to a no-op that throws on use.\n */\n auth?: AuthProvider;\n}\n\nexport interface Cli {\n /** The configured commander Program. Register subcommands on it. */\n program: Command;\n /** The AuthProvider passed in (or the no-op default). */\n auth: AuthProvider;\n}\n\n/**\n * Bootstrap a commander Program with conventions shared across the\n * AgentX ecosystem: name, version, description, error formatting,\n * and a hook to access the consumer's auth provider.\n *\n * Usage:\n *\n * ```ts\n * const { program, auth } = createCli({\n * name: \"pritty\",\n * version: VERSION,\n * auth: agentAuthProvider,\n * });\n * program.command(\"commit\").action(async () => {\n * const token = await auth.getToken();\n * // ...\n * });\n * program.parse();\n * ```\n */\nexport function createCli(opts: CreateCliOptions): Cli {\n const program = new Command();\n program.name(opts.name).version(opts.version);\n if (opts.description) program.description(opts.description);\n\n // Standardize error output across the ecosystem: print to stderr,\n // exit non-zero, no commander's default \"error: ...\" prefix that\n // some users find noisy. Consumers can override with their own\n // .exitOverride() if needed.\n program.configureOutput({\n outputError: (str, write) => write(str),\n });\n\n return { program, auth: opts.auth ?? noopAuthProvider };\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { auditProject } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerAudit(program: Command): void {\n program\n .command('audit')\n .description(\n 'List what would otherwise be forgotten: unsaved work, stray checkouts, aging leases, drift, stale notices',\n )\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the findings as JSON')\n .action(async (o: { projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: true });\n const findings = await auditProject(ctx);\n if (o.json) printJson(findings);\n else if (findings.length === 0) console.log(chalk.green('nothing forgotten'));\n else\n for (const f of findings)\n console.log(\n `${chalk.yellow(f.kind.padEnd(14))} ${f.area ? `${f.area} ` : ''}${f.detail}`,\n );\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import chalk from 'chalk';\nimport {\n currentOwner,\n ensureRanges,\n Git,\n homeDir,\n loadManifest,\n Registry,\n startServices,\n stopServices,\n} from '../core/index.js';\nimport type { Ctx } from './effort.js';\nimport { prittyCli } from './pritty.js';\nimport { storybrokrCli } from './storybrokr.js';\n\n/** The repo root is the MAIN checkout of whatever checkout the caller stands in. */\nexport function resolveRepoRoot(cwd: string, override?: string): string {\n if (override) return override;\n return new Git(cwd).mainRoot();\n}\n\n/** Build the context every verb shares; the project's port ranges are claimed on first use and re-checked when the manifest changes them. */\nexport async function buildCtx(\n opts: { cwd?: string; projectRoot?: string; quiet?: boolean } = {},\n): Promise<Ctx> {\n const repoRoot = resolveRepoRoot(opts.cwd ?? process.cwd(), opts.projectRoot);\n const manifest = await loadManifest(repoRoot);\n const home = homeDir();\n const registry = Registry.open(home);\n ensureRanges(registry, manifest, repoRoot);\n return {\n home,\n repoRoot,\n manifest,\n registry,\n owner: currentOwner(),\n runner: { start: startServices, stop: stopServices },\n storybrokr: storybrokrCli,\n pritty: prittyCli,\n log: opts.quiet ? () => {} : (line) => console.error(chalk.gray(line)),\n };\n}\n","import {\n appendFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n realpathSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { WorkkitError } from './errors.js';\nimport { Git } from './git.js';\nimport type { Manifest } from './types.js';\n\n/** Substitute `${NAME}` placeholders; an unknown name is a manifest error, never an empty string. */\nexport function renderTemplate(s: string, vars: Record<string, string>): string {\n return s.replace(/\\$\\{([A-Z0-9_]+)\\}/g, (_, name: string) => {\n if (!(name in vars)) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n `template references ${name}, which this effort does not define`,\n );\n }\n return vars[name];\n });\n}\n\nexport interface EmitConfigArgs {\n m: Manifest;\n worktree: string;\n /** absent for a frontend effort: no .slot is written and SLOT is empty */\n slot?: number;\n ports: Record<string, number>;\n storybookPort?: number;\n area: string;\n branch: string;\n}\n\nexport interface EmittedConfig {\n envFile: string;\n slotFile?: string;\n logDir: string;\n vars: Record<string, string>;\n}\n\n/** Resolves the Storybook host root inside a worktree (`worktree/<storybook.hostRoot>` or `worktree`). */\nexport function storybookHostFor(m: Manifest, worktree?: string): string {\n if (!worktree) return '';\n return m.storybook?.hostRoot ? join(worktree, m.storybook.hostRoot) : worktree;\n}\n\n/** The variables a slot derives, in the shape templates and `work env` expose. */\nexport function slotVars(\n m: Manifest,\n o: {\n slot?: number;\n ports: Record<string, number>;\n storybookPort?: number;\n area?: string;\n branch?: string;\n worktree?: string;\n logDir?: string;\n },\n): Record<string, string> {\n const vars: Record<string, string> = {\n SLOT: o.slot === undefined ? '' : String(o.slot),\n PROJECT: m.project,\n AREA: o.area ?? '',\n BRANCH: o.branch ?? '',\n WORKTREE: o.worktree ?? '',\n LOG_DIR: o.logDir ?? '',\n STORYBROKR_HOST: storybookHostFor(m, o.worktree),\n };\n for (const service of Object.keys(m.ports.services)) {\n const p = o.ports[service];\n vars[`PORT_${service.toUpperCase()}`] = p === undefined ? '' : String(p);\n }\n // The storybrokr instance port wins; a manifest that also declares a `storybook`\n // port service supplies the slot-derived fallback through the loop above.\n if (o.storybookPort !== undefined) vars.PORT_STORYBOOK = String(o.storybookPort);\n else if (vars.PORT_STORYBOOK === undefined) vars.PORT_STORYBOOK = '';\n return vars;\n}\n\n/**\n * Make sure git never sees the emitted files: patterns go into the repo's shared\n * `info/exclude` (one per clone, applies to every worktree), so no .gitignore edit is needed.\n */\nexport function ensureExcluded(worktree: string, patterns: string[]): void {\n const r = new Git(worktree).tryRun(['rev-parse', '--path-format=absolute', '--git-common-dir']);\n if (r.code !== 0) return; // not a git checkout (tests, scratch dirs): nothing to exclude from\n const common = realpathSync(r.out.trim());\n const file = join(common, 'info', 'exclude');\n mkdirSync(join(common, 'info'), { recursive: true });\n const present = new Set(\n existsSync(file)\n ? readFileSync(file, 'utf8')\n .split('\\n')\n .map((l) => l.trim())\n : [],\n );\n const missing = patterns.filter((p) => !present.has(p));\n if (missing.length === 0) return;\n appendFileSync(\n file,\n `${present.size ? '\\n' : ''}# written by @helmsmith/workbrokr: per-worktree config and logs\\n${missing.join('\\n')}\\n`,\n );\n}\n\n/** Write `.slot`, the env file and the log dir into the worktree; nothing is tracked by git. */\nexport function emitWorktreeConfig(a: EmitConfigArgs): EmittedConfig {\n ensureExcluded(a.worktree, [\n '.slot',\n a.m.env.file,\n `${a.m.logs.dir.replace(/\\/+$/, '')}/`,\n `${a.m.worktreeRoot.replace(/\\/+$/, '')}/`,\n ]);\n const logDir = join(a.worktree, a.m.logs.dir);\n mkdirSync(logDir, { recursive: true });\n const vars = slotVars(a.m, { ...a, logDir });\n const envFile = join(a.worktree, a.m.env.file);\n const lines = Object.entries(a.m.env.template).map(([k, v]) => `${k}=${renderTemplate(v, vars)}`);\n writeFileSync(envFile, `${lines.join('\\n')}\\n`);\n let slotFile: string | undefined;\n if (a.slot !== undefined) {\n slotFile = join(a.worktree, '.slot');\n writeFileSync(slotFile, `${a.slot}\\n`);\n }\n return slotFile ? { envFile, slotFile, logDir, vars } : { envFile, logDir, vars };\n}\n","export type ErrorCode =\n | 'MANIFEST_NOT_FOUND'\n | 'MANIFEST_INVALID'\n | 'AREA_UNKNOWN'\n | 'TASK_INVALID'\n | 'TYPE_UNKNOWN'\n | 'MODE_UNKNOWN'\n | 'MODE_MISMATCH'\n | 'SCOPE_REQUIRES_TASK'\n | 'SCOPE_OUTSIDE_AREA'\n | 'MAIN_CHECKOUT'\n | 'WORKTREE_INVALID'\n | 'PROTECTED_BRANCH'\n | 'EFFORT_OPEN'\n | 'EFFORT_NOT_FOUND'\n | 'SCOPE_CONFLICT'\n | 'COMMONS_LOCKED'\n | 'NO_FREE_SLOT'\n | 'LEASE_NOT_FOUND'\n | 'PORT_RANGE_TAKEN'\n | 'SYNC_CONFLICT'\n | 'DIRTY_WORKTREE'\n | 'UNPUSHED'\n | 'HEALTH_TIMEOUT'\n | 'SERVICE_FAILED'\n | 'STORYBROKR_FAILED'\n | 'GIT_FAILED'\n | 'PUSH_REJECTED'\n | 'PRITTY_FAILED'\n | 'PR_CLOSED'\n | 'INTERNAL';\n\nconst REFUSALS = new Set<ErrorCode>([\n 'MANIFEST_INVALID',\n 'AREA_UNKNOWN',\n 'TASK_INVALID',\n 'TYPE_UNKNOWN',\n 'MODE_UNKNOWN',\n 'MODE_MISMATCH',\n 'SCOPE_REQUIRES_TASK',\n 'SCOPE_OUTSIDE_AREA',\n 'MAIN_CHECKOUT',\n 'WORKTREE_INVALID',\n 'PROTECTED_BRANCH',\n 'EFFORT_OPEN',\n 'EFFORT_NOT_FOUND',\n 'SCOPE_CONFLICT',\n 'COMMONS_LOCKED',\n 'NO_FREE_SLOT',\n 'LEASE_NOT_FOUND',\n 'PORT_RANGE_TAKEN',\n 'SYNC_CONFLICT',\n 'DIRTY_WORKTREE',\n 'UNPUSHED',\n 'PR_CLOSED',\n]);\n\n/** 2 = refused (a rule said no), 1 = something broke. */\nexport function exitCodeFor(code: ErrorCode): 1 | 2 {\n return REFUSALS.has(code) ? 2 : 1;\n}\n\nexport class WorkkitError extends Error {\n readonly code: ErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: ErrorCode, message: string, details?: Record<string, unknown>) {\n super(message);\n this.name = 'WorkkitError';\n this.code = code;\n if (details) this.details = details;\n }\n}\n\nexport interface ErrorBody {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n/** Shape every surface (CLI --json, MCP) returns for a failure. */\nexport function toErrorBody(err: unknown): ErrorBody {\n if (err instanceof WorkkitError) {\n return err.details\n ? { code: err.code, message: err.message, details: err.details }\n : { code: err.code, message: err.message };\n }\n return { code: 'INTERNAL', message: err instanceof Error ? err.message : String(err) };\n}\n","import { spawnSync } from 'node:child_process';\nimport { existsSync, mkdirSync, realpathSync, rmSync, statSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\nimport { WorkkitError } from './errors.js';\n\nconst realpathOr = (p: string): string => {\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n};\n\n/** No control characters, whitespace or `=`: the name is spliced into a `-c submodule.<name>.url=` key. */\nconst SAFE_SUBMODULE_NAME = /^[^\\p{Cc}\\s=]+$/u;\n\nexport interface SyncResult {\n kind: 'up-to-date' | 'ff' | 'merge' | 'conflict';\n before: string;\n after: string;\n conflicted: string[];\n}\n\n/** The git operations the verbs need, each a thin, named wrapper over the CLI. */\nexport class Git {\n constructor(readonly cwd: string) {}\n\n tryRun(args: string[]): { code: number; out: string; err: string } {\n const r = spawnSync('git', args, { cwd: this.cwd, encoding: 'utf8' });\n return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };\n }\n\n run(args: string[]): string {\n const r = this.tryRun(args);\n if (r.code !== 0) {\n throw new WorkkitError(\n 'GIT_FAILED',\n `git ${args.join(' ')} (in ${this.cwd}): ${r.err.trim() || r.out.trim()}`,\n {\n args,\n cwd: this.cwd,\n },\n );\n }\n return r.out;\n }\n\n private lines(args: string[]): string[] {\n return this.run(args)\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n }\n\n /** The checkout's top level (symlinks resolved). */\n root(): string {\n return realpathSync(this.run(['rev-parse', '--show-toplevel']).trim());\n }\n\n /** The main checkout's top level, from any worktree of the repo. */\n mainRoot(): string {\n const common = realpathSync(\n this.run(['rev-parse', '--path-format=absolute', '--git-common-dir']).trim(),\n );\n return dirname(common);\n }\n\n /** The main checkout is the one whose git dir IS the common dir (compared as absolute realpaths). */\n isMainCheckout(): boolean {\n const gitDir = realpathSync(\n this.run(['rev-parse', '--path-format=absolute', '--git-dir']).trim(),\n );\n const common = realpathSync(\n this.run(['rev-parse', '--path-format=absolute', '--git-common-dir']).trim(),\n );\n return gitDir === common;\n }\n\n currentBranch(): string {\n return this.run(['branch', '--show-current']).trim();\n }\n\n branchExists(name: string): boolean {\n return this.tryRun(['rev-parse', '--verify', '-q', `refs/heads/${name}`]).code === 0;\n }\n\n remoteBranchExists(name: string): boolean {\n return this.run(['ls-remote', '--heads', 'origin', name]).trim().length > 0;\n }\n\n fetch(branch: string): void {\n this.run(['fetch', '-q', 'origin', branch]);\n }\n\n hasUpstream(): boolean {\n return this.tryRun(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}']).code === 0;\n }\n\n /** Commits on HEAD that origin does not have: against the upstream, else the same-named remote branch, else origin/<base>. */\n unpushedCount(base: string): number {\n let ref = `origin/${base}`;\n if (this.hasUpstream()) ref = '@{u}';\n else if (this.remoteBranchExists(this.currentBranch())) ref = `origin/${this.currentBranch()}`;\n return this.lines(['rev-list', `${ref}..HEAD`]).length;\n }\n\n /** Non-merge commits on HEAD that origin/<base> does not have: the branch's own work (sync merges do not count). */\n ownCommitCount(base: string): number {\n const r = this.tryRun(['rev-list', '--count', '--no-merges', `origin/${base}..HEAD`]);\n return r.code === 0 ? Number(r.out.trim()) || 0 : 0;\n }\n\n /** `branch` is already in origin/<base>: an ancestor of it, patch-equivalent (squash-merged), or without own commits. */\n branchMergedInto(branch: string, base: string): boolean {\n const target = `origin/${base}`;\n if (this.isAncestor(branch, target)) return true;\n const own = this.tryRun(['rev-list', '--count', '--no-merges', `${target}..${branch}`]);\n if (own.code === 0 && Number(own.out.trim()) === 0) return true;\n const cherry = this.tryRun(['cherry', target, branch]);\n if (cherry.code !== 0) return false;\n const lines = cherry.out\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n return lines.length > 0 && lines.every((l) => l.startsWith('- '));\n }\n\n /** Commits on origin/<base> that HEAD does not have (0 when the ref is unknown). */\n behindCount(base: string): number {\n const r = this.tryRun(['rev-list', '--count', `HEAD..origin/${base}`]);\n return r.code === 0 ? Number(r.out.trim()) || 0 : 0;\n }\n\n isDirty(): boolean {\n return this.run(['status', '--porcelain']).trim().length > 0;\n }\n\n changedPathsStaged(): string[] {\n return this.lines(['diff', '--cached', '--name-only']);\n }\n\n /** The other parent of a merge in progress, or undefined when none is. */\n mergeHead(): string | undefined {\n const r = this.tryRun(['rev-parse', '-q', '--verify', 'MERGE_HEAD']);\n return r.code === 0 ? r.out.trim() : undefined;\n }\n\n /** Staged paths whose index content differs from `ref` (so, authored here rather than taken from `ref`). */\n stagedDifferingFrom(ref: string, paths: string[]): string[] {\n if (paths.length === 0) return [];\n return this.lines(['diff', '--cached', '--name-only', '--no-renames', ref, '--', ...paths]);\n }\n\n changedPaths(from: string, to: string): string[] {\n return this.lines(['diff', '--name-only', '--no-renames', from, to]);\n }\n\n /** Paths this branch changed since it diverged from origin/<base> (three-dot), without the base's own changes. */\n changedSince(base: string): string[] {\n return this.lines(['diff', '--name-only', '--no-renames', `origin/${base}...HEAD`]);\n }\n\n commitsNotOn(base: string): string[] {\n return this.lines(['rev-list', `origin/${base}..HEAD`]);\n }\n\n rev(ref: string): string {\n return this.run(['rev-parse', ref]).trim();\n }\n\n /** Fast-forward when HEAD has no own commits, otherwise merge; never rebase. A conflict is left in place. */\n syncFrom(base: string): SyncResult {\n const target = `origin/${base}`;\n const before = this.rev('HEAD');\n const targetRev = this.rev(target);\n if (before === targetRev) return { kind: 'up-to-date', before, after: before, conflicted: [] };\n if (this.tryRun(['merge-base', '--is-ancestor', 'HEAD', target]).code === 0) {\n this.run(['merge', '--ff-only', '-q', target]);\n return { kind: 'ff', before, after: this.rev('HEAD'), conflicted: [] };\n }\n if (this.tryRun(['merge-base', '--is-ancestor', target, 'HEAD']).code === 0) {\n return { kind: 'up-to-date', before, after: before, conflicted: [] };\n }\n const merged = this.tryRun(['merge', '--no-edit', '-q', target]);\n if (merged.code === 0)\n return { kind: 'merge', before, after: this.rev('HEAD'), conflicted: [] };\n const conflicted = this.lines(['diff', '--name-only', '--diff-filter=U']);\n return { kind: 'conflict', before, after: before, conflicted };\n }\n\n /** `origin/<branch>` after a fetch attempt, when the remote has it; the local copy may have been retired. */\n remoteRef(branch: string): string | undefined {\n this.tryRun(['fetch', '-q', 'origin', branch]);\n const ref = `refs/remotes/origin/${branch}`;\n return this.tryRun(['rev-parse', '--verify', '-q', ref]).code === 0\n ? `origin/${branch}`\n : undefined;\n }\n\n /**\n * Add a worktree on `branch`: the local branch if it exists, else a tracking\n * branch from origin/<branch> if the remote has it (so retiring the local\n * branch while its PR was open never recreates it from the base), else a\n * new branch from `startPoint`.\n */\n worktreeAdd(path: string, branch: string, startPoint?: string): void {\n mkdirSync(dirname(path), { recursive: true });\n if (this.branchExists(branch)) {\n this.run(['worktree', 'add', '-q', path, branch]);\n return;\n }\n const remote = this.remoteRef(branch);\n if (remote) {\n this.run(['worktree', 'add', '-q', '--track', '-b', branch, path, remote]);\n return;\n }\n this.run(['worktree', 'add', '-q', '--no-track', '-b', branch, path, startPoint ?? 'HEAD']);\n }\n\n worktreeRemove(path: string): void {\n this.run(['worktree', 'remove', '--force', path]);\n }\n\n checkout(branch: string, createFrom?: string): void {\n if (this.branchExists(branch)) {\n this.run(['checkout', '-q', branch]);\n return;\n }\n const remote = this.remoteRef(branch);\n if (remote) {\n this.run(['checkout', '-q', '--track', '-b', branch, remote]);\n return;\n }\n this.run(['checkout', '-q', '--no-track', '-b', branch, createFrom ?? 'HEAD']);\n }\n\n push(branch: string): void {\n this.run(['push', '-q', '-u', 'origin', branch]);\n }\n\n deleteLocalBranch(branch: string): void {\n this.run(['branch', '-q', '-D', branch]);\n }\n\n isAncestor(ancestor: string, descendant: string): boolean {\n return this.tryRun(['merge-base', '--is-ancestor', ancestor, descendant]).code === 0;\n }\n\n /** True when HEAD's tree matches origin/<base>, or every commit on HEAD is patch-equivalent to origin/<base> (squash-merged). */\n isEquivalentToBase(base: string): boolean {\n const target = `origin/${base}`;\n if (this.tryRun(['diff', '--quiet', target, 'HEAD']).code === 0) return true;\n const cherry = this.tryRun(['cherry', target, 'HEAD']);\n if (cherry.code !== 0) return false;\n const lines = cherry.out\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n return lines.length > 0 && lines.every((l) => l.startsWith('- '));\n }\n\n /**\n * Give a linked worktree its own clone of every submodule the main checkout has initialized,\n * cloned locally from the main checkout's module directory (no network) and then re-pointed at\n * the real URL. `git worktree add` under submodule.recurse leaves a gitfile aimed at a module\n * directory that was never cloned; a gitfile aimed at the MAIN checkout's module directory is\n * worse, because that module's core.worktree is the main checkout's submodule, so any git\n * command in the worktree's submodule (checkout -f, reset, merge) rewrites the human's files.\n * Both shapes are replaced; a submodule that is already its own working tree is left alone.\n */\n repairSubmodules(mainRoot: string, log: (line: string) => void = () => {}): void {\n const gitmodules = join(this.cwd, '.gitmodules');\n if (!existsSync(gitmodules)) return;\n const cfg = this.tryRun([\n 'config',\n '-f',\n '.gitmodules',\n '--get-regexp',\n '^submodule\\\\..*\\\\.path$',\n ]);\n if (cfg.code !== 0) return;\n const wtGitDir = this.run(['rev-parse', '--path-format=absolute', '--git-dir']).trim();\n for (const line of cfg.out.split('\\n').filter(Boolean)) {\n const m = /^submodule\\.(.+)\\.path\\s+(.+)$/.exec(line.trim());\n if (!m) continue;\n const [, name, subPath] = m as unknown as [string, string, string];\n // the name becomes a path segment under <git-dir>/modules and a config key: refuse anything\n // git itself would reject (CVE-2018-11235 shape) before we delete or spawn with it\n const modulesDir = resolve(wtGitDir, 'modules');\n const moduleDir = resolve(modulesDir, name);\n if (\n !SAFE_SUBMODULE_NAME.test(name) ||\n name.split(/[\\\\/]/).some((seg) => seg === '' || seg === '.' || seg === '..') ||\n !moduleDir.startsWith(modulesDir + sep)\n ) {\n log(`submodule ${subPath}: refusing name ${JSON.stringify(name)}; not repaired`);\n continue;\n }\n const wtSub = join(this.cwd, subPath);\n const wtGit = join(wtSub, '.git');\n if (this.isOwnSubmodule(wtSub, wtGit)) continue;\n const mainSub = join(mainRoot, subPath);\n if (!existsSync(join(mainSub, '.git'))) continue; // never initialized there: nothing to clone from\n const src = new Git(mainSub).tryRun(['rev-parse', '--path-format=absolute', '--git-dir']);\n if (src.code !== 0 || !src.out.trim()) continue;\n // a stale or borrowed gitfile and a half-made module dir both make `submodule update` refuse\n if (existsSync(wtGit) && statSync(wtGit).isFile()) rmSync(wtGit);\n rmSync(moduleDir, { recursive: true, force: true });\n const r = this.tryRun([\n '-c',\n 'protocol.file.allow=always',\n '-c',\n `submodule.${name}.url=${src.out.trim()}`,\n 'submodule',\n 'update',\n '--init',\n '--',\n subPath,\n ]);\n if (r.code !== 0) {\n log(\n `submodule ${subPath}: not repaired (${(r.err || r.out).trim()}); the project's refresh steps may still set it up`,\n );\n continue;\n }\n this.tryRun(['submodule', 'sync', '-q', '--', subPath]); // back to the .gitmodules URL\n }\n }\n\n /** A submodule is the worktree's own when git, run inside it, says its top level IS that directory. */\n private isOwnSubmodule(wtSub: string, wtGit: string): boolean {\n if (!existsSync(wtGit)) return false;\n const top = new Git(wtSub).tryRun(['rev-parse', '--show-toplevel']);\n if (top.code !== 0) return false;\n return realpathOr(top.out.trim()) === realpathOr(wtSub);\n }\n}\n","import { existsSync, realpathSync } from 'node:fs';\nimport { WorkkitError } from './errors.js';\nimport type { Git } from './git.js';\nimport type { Registry } from './registry.js';\nimport { allowedScopesForEffort, commonsTouched, pathsMatching } from './scopes.js';\nimport type { Effort, Manifest } from './types.js';\n\nexport function assertNotProtected(m: Manifest, branch: string): void {\n if (m.protectedBranches.includes(branch)) {\n throw new WorkkitError(\n 'PROTECTED_BRANCH',\n `branch \"${branch}\" is protected (${m.protectedBranches.join(', ')}): work happens on <type>/<area> branches, never here`,\n { branch },\n );\n }\n}\n\nexport function assertNotMainCheckout(git: Git): void {\n if (git.isMainCheckout()) {\n throw new WorkkitError(\n 'MAIN_CHECKOUT',\n `${git.cwd} is the main checkout, which is a mirror of the base branch: run \\`work start\\` to get an area worktree`,\n { cwd: git.cwd },\n );\n }\n}\n\nconst same = (a: string, b: string) => {\n try {\n return realpathSync(a) === realpathSync(b);\n } catch {\n return a === b;\n }\n};\n\nconst effortLabel = (e: Pick<Effort, 'area' | 'task'>) =>\n e.task ? `${e.area}--${e.task}` : e.area;\n\nexport interface CommitCheck {\n m: Manifest;\n registry: Registry;\n git: Git;\n project: string;\n branch: string;\n stagedPaths: string[];\n ownerSession: string;\n /** the committing checkout's top level: a lock held by the effort living there is the committer's own */\n checkoutRoot?: string;\n}\n\n/** What a pre-commit hook asks: may this commit be made? Refusals are sentences for stderr. */\nexport function checkCommit(c: CommitCheck): { refusals: string[]; warnings: string[] } {\n const refusals: string[] = [];\n const warnings: string[] = [];\n if (c.m.protectedBranches.includes(c.branch)) {\n refusals.push(\n `branch \"${c.branch}\" is protected (${c.m.protectedBranches.join(', ')}): work happens on <type>/<area> branches, never here`,\n );\n }\n // Resolving a merge stages everything the other parent brought in. Those paths are\n // not this effort's writes: scope and commons checks look only at paths whose staged\n // content differs from MERGE_HEAD (authored here, or a conflict resolved by hand).\n const mergeHead = c.git.mergeHead();\n const authored = mergeHead\n ? new Set(c.git.stagedDifferingFrom(mergeHead, c.stagedPaths))\n : new Set(c.stagedPaths);\n const ownPaths = c.stagedPaths.filter((p) => authored.has(p));\n const allEfforts = c.registry.efforts({ project: c.project });\n const efforts = new Map(allEfforts.map((e) => [e.id, e]));\n const openEfforts = allEfforts.filter((e) => e.state === 'active' || e.state === 'starting');\n const mine = openEfforts.find((e) =>\n c.checkoutRoot && existsSync(e.worktree)\n ? same(e.worktree, c.checkoutRoot)\n : e.branch === c.branch,\n );\n for (const lease of c.registry.leases({ project: c.project, kind: 'commons' })) {\n const holder = efforts.get(lease.effort);\n const holderHasWorktree = Boolean(holder && existsSync(holder.worktree));\n if (holder && holderHasWorktree && c.checkoutRoot) {\n if (same(holder.worktree, c.checkoutRoot)) continue;\n } else if (lease.owner.session === c.ownerSession) {\n continue;\n }\n // every effort of the area that owns the commons holds the same lease: its tasks share it\n if (holder && mine && holder.area === mine.area) continue;\n const globs = c.m.commons[String(lease.value)] ?? [];\n const hit = pathsMatching(ownPaths, globs);\n if (hit.length > 0) {\n refusals.push(\n `commons \"${lease.value}\" is write-locked by ${lease.owner.session} (effort ${lease.effort}, since ${lease.touched}); staged: ${hit.join(', ')}`,\n );\n }\n }\n for (const other of openEfforts) {\n if (c.checkoutRoot && existsSync(other.worktree) && same(other.worktree, c.checkoutRoot)) {\n continue;\n }\n if (!c.checkoutRoot && other.branch === c.branch) continue;\n const hit = pathsMatching(ownPaths, other.scopes);\n if (hit.length > 0) {\n refusals.push(\n `path(s) ${hit.join(', ')} are inside the active scope of ${effortLabel(other)} (${other.branch}, owned by ${other.owner.session})`,\n );\n }\n }\n if (mine && ownPaths.length > 0) {\n const allowed = allowedScopesForEffort(c.m, mine);\n const inScope = new Set(pathsMatching(ownPaths, allowed));\n const outside = ownPaths.filter((p) => !inScope.has(p));\n if (outside.length > 0) {\n warnings.push(\n `${outside.length} staged path(s) are outside the effort's scope (${effortLabel(mine)}): ${outside.join(', ')}`,\n );\n }\n }\n return { refusals, warnings };\n}\n\nexport interface PushCheck {\n m: Manifest;\n registry: Registry;\n git: Git;\n project: string;\n /** the local branch being pushed ('' for a delete) */\n branch: string;\n /** the destination ref (`refs/heads/<name>`); absent = same name as the local branch */\n remoteRef?: string;\n isDelete?: boolean;\n changedPaths: string[];\n}\n\n/** What a pre-push hook asks: a protected destination → refusal; leaving the scope or touching commons → warnings. */\nexport function checkPush(c: PushCheck): { refusals: string[]; warnings: string[] } {\n const refusals: string[] = [];\n const warnings: string[] = [];\n const destination = (c.remoteRef ?? `refs/heads/${c.branch}`).replace(/^refs\\/heads\\//, '');\n if (c.m.protectedBranches.includes(destination)) {\n refusals.push(\n c.isDelete\n ? `refusing to delete protected branch \"${destination}\"`\n : `\"${destination}\" is protected (${c.m.protectedBranches.join(', ')}): nothing is pushed to it directly, open a PR from ${c.branch || 'an area branch'}`,\n );\n return { refusals, warnings };\n }\n if (c.isDelete) return { refusals, warnings };\n const effort = c.registry\n .efforts({ project: c.project })\n .find((e) => (e.state === 'active' || e.state === 'parked') && e.branch === c.branch);\n const commons = commonsTouched(c.m, c.changedPaths);\n if (effort) {\n const allowed = allowedScopesForEffort(c.m, effort);\n const inScope = new Set(pathsMatching(c.changedPaths, allowed));\n const outside = c.changedPaths.filter((p) => !inScope.has(p));\n if (outside.length > 0) {\n warnings.push(\n `${outside.length} changed path(s) are outside the effort's scope (${effortLabel(effort)}): ${outside.join(', ')} — add a scope template or expect a merge collision`,\n );\n }\n }\n for (const name of commons)\n warnings.push(`commons ${name} touched: the other areas are told at \\`work finish\\``);\n return { refusals, warnings };\n}\n","import picomatch from 'picomatch';\nimport { WorkkitError } from './errors.js';\nimport type { AreaSpec, Effort, Manifest, Mode } from './types.js';\n\n/** `{group}` = every segment but the last, `{section}` = the last segment of an area path. */\nexport function areaVars(area: string): { group: string; section: string } {\n const parts = area.split('/');\n return { group: parts.slice(0, -1).join('/'), section: parts[parts.length - 1] };\n}\n\nfunction fill(template: string, vars: Record<string, string | undefined>): string | null {\n let missing = false;\n const out = template.replace(/\\{(group|section|module)\\}/g, (_, name: string) => {\n const v = vars[name];\n if (v === undefined || v === '') {\n missing = true;\n return '';\n }\n return v;\n });\n return missing ? null : out;\n}\n\nfunction extraScopesForMode(spec: AreaSpec, mode: Mode): string[] {\n if (!spec.extraScopes) return [];\n if (Array.isArray(spec.extraScopes)) {\n return mode === 'frontend' || mode === 'fullstack' ? spec.extraScopes : [];\n }\n const out: string[] = [];\n if (mode === 'frontend' || mode === 'fullstack') out.push(...(spec.extraScopes.frontend ?? []));\n if (mode === 'backend' || mode === 'fullstack') out.push(...(spec.extraScopes.backend ?? []));\n return out;\n}\n\nconst normalizeGlob = (g: string) => g.replace(/^\\.\\//, '').replace(/\\/+$/, '');\nconst hasWildcard = (s: string) => /[*?[{]/.test(s);\n\n/** True when every path matched by `child` is guaranteed to be inside `parent`. */\nexport function isSubGlob(child: string, parent: string): boolean {\n const c = normalizeGlob(child);\n const p = normalizeGlob(parent);\n if (c === p) return true;\n const cSegs = c.split('/');\n const pSegs = p.split('/');\n for (let i = 0; i < pSegs.length; i++) {\n const ps = pSegs[i];\n if (ps === '**') return true;\n const cs = cSegs[i];\n if (cs === undefined || cs === '**') return false;\n if (!hasWildcard(ps) && !hasWildcard(cs)) {\n if (ps !== cs) return false;\n continue;\n }\n if (!hasWildcard(cs) && hasWildcard(ps)) {\n if (!picomatch.isMatch(cs, ps, { dot: true })) return false;\n continue;\n }\n if (cs !== ps) return false;\n }\n return cSegs.length === pSegs.length;\n}\n\n/** The globs an effort on `area` holds exclusively in `mode`; backend/fullstack templates need the area's module. */\nexport function expandScopes(\n m: Manifest,\n area: string,\n mode: Mode,\n narrowedScopes?: string[],\n hasTask = false,\n): string[] {\n const spec = m.areas[area];\n if (!spec)\n throw new WorkkitError(\n 'AREA_UNKNOWN',\n `unknown area \"${area}\" (known: ${Object.keys(m.areas).join(', ')})`,\n );\n const vars = { ...areaVars(area), module: spec.module };\n const out: string[] = [];\n if (mode === 'frontend' || mode === 'fullstack') {\n for (const t of m.scopes.frontend) {\n const g = fill(t, vars);\n if (g) out.push(g);\n }\n }\n if (mode === 'backend' || mode === 'fullstack') {\n if (!spec.module) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n `area \"${area}\" has no module, so a ${mode} effort cannot hold a backend scope; add areas[\"${area}\"].module or use --mode frontend`,\n );\n }\n for (const t of m.scopes.backend) {\n const g = fill(t, vars);\n if (g) out.push(g);\n }\n }\n out.push(...extraScopesForMode(spec, mode));\n if (!narrowedScopes || narrowedScopes.length === 0) return out;\n if (!hasTask) {\n throw new WorkkitError(\n 'SCOPE_REQUIRES_TASK',\n '--scope narrowing requires --task <slug> so primary area efforts always protect the full area',\n );\n }\n const allowed = [...out, ...(spec.sharedScopes ?? [])];\n for (const g of narrowedScopes) {\n if (!allowed.some((base) => isSubGlob(g, base))) {\n throw new WorkkitError(\n 'SCOPE_OUTSIDE_AREA',\n `narrowed scope \"${g}\" is outside ${area}'s ${mode} scopes (${allowed.join(', ')})`,\n { area, mode, scope: g, allowed },\n );\n }\n }\n return narrowedScopes;\n}\n\n/** All globs an effort is allowed to touch without an out-of-scope warning (exclusive scopes + sharedScopes + commons). */\nexport function allowedScopesForEffort(\n m: Manifest,\n effort: Pick<Effort, 'area' | 'scopes'>,\n): string[] {\n const shared = m.areas[effort.area]?.sharedScopes ?? [];\n const allCommons = Object.values(m.commons).flat();\n return [...effort.scopes, ...shared, ...allCommons];\n}\n\n/** The part of a glob before its first wildcard character. */\nexport function literalPrefix(glob: string): string {\n const i = glob.search(/[*?[{]/);\n return i < 0 ? glob : glob.slice(0, i);\n}\n\nfunction segmentsOverlap(sx: string, sy: string): boolean {\n if (sx === sy) return true;\n const wx = hasWildcard(sx);\n const wy = hasWildcard(sy);\n if (!wx && !wy) return false;\n if (!wx && wy) return picomatch.isMatch(sx, sy, { dot: true });\n if (wx && !wy) return picomatch.isMatch(sy, sx, { dot: true });\n const starToken = /^\\*([^*?[{]+)\\*$/;\n const mx = starToken.exec(sx);\n const my = starToken.exec(sy);\n if (mx && my) {\n const tx = mx[1];\n const ty = my[1];\n return tx.includes(ty) || ty.includes(tx);\n }\n return true;\n}\n\nfunction twoGlobsOverlap(x: string, y: string): boolean {\n const xs = normalizeGlob(x).split('/');\n const ys = normalizeGlob(y).split('/');\n const len = Math.min(xs.length, ys.length);\n for (let i = 0; i < len; i++) {\n if (xs[i] === '**' || ys[i] === '**') return true;\n if (!segmentsOverlap(xs[i], ys[i])) return false;\n }\n if (xs.length === ys.length) return true;\n const longer = xs.length > ys.length ? xs : ys;\n return longer[len] === '**';\n}\n\n/** Pairs `a ~ b` whose path segments overlap. */\nexport function globsOverlap(a: string[], b: string[]): string[] {\n const pairs: string[] = [];\n for (const x of a) {\n for (const y of b) {\n if (twoGlobsOverlap(x, y)) pairs.push(`${x} ~ ${y}`);\n }\n }\n return pairs;\n}\n\nexport function pathsMatching(paths: string[], globs: string[]): string[] {\n if (globs.length === 0) return [];\n const isMatch = picomatch(globs, { dot: true });\n return paths.filter((p) => isMatch(p));\n}\n\n/** Names of the commons any of `paths` falls under. */\nexport function commonsTouched(m: Manifest, paths: string[]): string[] {\n return Object.entries(m.commons)\n .filter(([, globs]) => pathsMatching(paths, globs).length > 0)\n .map(([name]) => name);\n}\n","import { chmodSync, lstatSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { WorkkitError } from './errors.js';\nimport { Git } from './git.js';\nimport { BRANCH_NAME } from './manifest.js';\n\nexport const HOOKS_DIR = '.helmsmith/hooks';\n\n/**\n * The protected-branch rule is enforced by the shell script itself, with the list baked in at\n * install time, so it holds in a GUI client or a shell without `workbrokr` on PATH. Only the\n * commons and scope checks need the binary; without it they are skipped with a warning.\n */\nfunction preCommitScript(protectedBranches: string[]): string {\n return `#!/bin/sh\n# Installed by \\`work init\\` (@helmsmith/workbrokr). The protected-branch rule lives here; the rest in workbrokr.\nPROTECTED=\"${protectedBranches.join(' ')}\"\nbranch=$(git symbolic-ref --short -q HEAD)\nfor p in $PROTECTED; do\n if [ \"$branch\" = \"$p\" ]; then\n echo \"work: branch \\\\\"$branch\\\\\" is protected ($PROTECTED): work happens on <type>/<area> branches, never here\" >&2\n exit 2\n fi\ndone\nif command -v workbrokr >/dev/null 2>&1; then\n workbrokr hook pre-commit \"$@\" || exit $?\nelse\n echo \"work: workbrokr is not on PATH; commons and scope checks skipped (npm i -g @helmsmith/workbrokr)\" >&2\nfi\nCOMMON_DIR=$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null)\nLEGACY=\"$COMMON_DIR/hooks/pre-commit\"\nif [ -n \"$COMMON_DIR\" ] && [ -x \"$LEGACY\" ]; then\n SELF_DIR=$(cd \"$(dirname \"$0\")\" && pwd)\n LEGACY_DIR=$(cd \"$(dirname \"$LEGACY\")\" && pwd)\n if [ \"$SELF_DIR\" != \"$LEGACY_DIR\" ]; then\n exec \"$LEGACY\" \"$@\"\n fi\nfi\nexit 0\n`;\n}\n\nfunction prePushScript(protectedBranches: string[]): string {\n return `#!/bin/sh\n# Installed by \\`work init\\` (@helmsmith/workbrokr). Refuses a push to, or a delete of, a protected branch here; the rest in workbrokr.\nPROTECTED=\"${protectedBranches.join(' ')}\"\ninput=$(cat)\nprintf '%s\\\\n' \"$input\" | while read -r lref lsha rref rsha; do\n [ -n \"$rref\" ] || continue\n dest=\\${rref#refs/heads/}\n for p in $PROTECTED; do\n if [ \"$dest\" = \"$p\" ]; then\n echo \"work: \\\\\"$dest\\\\\" is protected ($PROTECTED): nothing is pushed to it directly, open a PR from an area branch\" >&2\n exit 2\n fi\n done\ndone || exit 2\nif command -v workbrokr >/dev/null 2>&1; then\n printf '%s\\\\n' \"$input\" | workbrokr hook pre-push \"$@\" || exit $?\nelse\n echo \"work: workbrokr is not on PATH; scope and commons warnings skipped\" >&2\nfi\nCOMMON_DIR=$(git rev-parse --path-format=absolute --git-common-dir 2>/dev/null)\nLEGACY=\"$COMMON_DIR/hooks/pre-push\"\nif [ -n \"$COMMON_DIR\" ] && [ -x \"$LEGACY\" ]; then\n SELF_DIR=$(cd \"$(dirname \"$0\")\" && pwd)\n LEGACY_DIR=$(cd \"$(dirname \"$LEGACY\")\" && pwd)\n if [ \"$SELF_DIR\" != \"$LEGACY_DIR\" ]; then\n printf '%s\\\\n' \"$input\" | exec \"$LEGACY\" \"$@\"\n fi\nfi\nexit 0\n`;\n}\n\nexport function installHooks(\n repoRoot: string,\n opts: { protectedBranches: string[] },\n): { hooksDir: string; files: string[] } {\n for (const b of opts.protectedBranches) {\n if (!BRANCH_NAME.test(b))\n throw new WorkkitError('MANIFEST_INVALID', `protected branch \"${b}\" is not a plain ref name`);\n }\n const hooksDir = join(repoRoot, HOOKS_DIR);\n mkdirSync(hooksDir, { recursive: true });\n const files: string[] = [];\n const scripts: [string, string][] = [\n ['pre-commit', preCommitScript(opts.protectedBranches)],\n ['pre-push', prePushScript(opts.protectedBranches)],\n ];\n for (const [name, body] of scripts) {\n const file = join(hooksDir, name);\n // A symlink planted at the hook's path would turn this write into a write elsewhere.\n let existing: ReturnType<typeof lstatSync> | undefined;\n try {\n existing = lstatSync(file);\n } catch {\n existing = undefined;\n }\n if (existing?.isSymbolicLink()) {\n throw new WorkkitError('INTERNAL', `refusing to write hook ${file}: it is a symlink`, {\n file,\n });\n }\n writeFileSync(file, body);\n chmodSync(file, 0o755);\n files.push(file);\n }\n new Git(repoRoot).run(['config', 'core.hooksPath', HOOKS_DIR]);\n return { hooksDir, files };\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { z } from 'zod';\nimport { WorkkitError } from './errors.js';\nimport type { Manifest } from './types.js';\n\nexport const MANIFEST_FILES = [\n 'helmsmith.config.ts',\n 'helmsmith.config.mjs',\n 'helmsmith.config.json',\n] as const;\n\n/**\n * Branch names the manifest may protect or base on. Git allows more (`$`, `\"`, `;`, backticks), but\n * these names are baked into the installed hook scripts, so only shell-inert characters pass.\n */\nexport const BRANCH_NAME = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;\nconst BRANCH_NAME_HINT = 'must be a plain ref name: letters, digits, \".\", \"_\", \"/\", \"-\"';\nexport const TASK_SLUG = /^(?!.*--)[a-z0-9][a-z0-9_-]{0,47}$/;\n\nconst Service = z.object({\n start: z.string().min(1),\n stop: z.string().min(1),\n health: z.string().min(1),\n healthyCodes: z.array(z.number().int()).optional(),\n reset: z.string().optional(),\n healthTimeoutMs: z.number().int().positive().optional(),\n modes: z.array(z.enum(['backend', 'fullstack'])).optional(),\n});\n\nconst ExtraScopes = z.union([\n z.array(z.string()),\n z.object({\n frontend: z.array(z.string()).optional(),\n backend: z.array(z.string()).optional(),\n }),\n]);\n\nconst Schema = z.object({\n project: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),\n baseBranch: z.string().regex(BRANCH_NAME, BRANCH_NAME_HINT),\n protectedBranches: z.array(z.string().regex(BRANCH_NAME, BRANCH_NAME_HINT)).optional(),\n worktreeRoot: z.string().default('.claude/worktrees'),\n branch: z\n .object({ types: z.array(z.string().regex(/^[a-z]+$/)).min(1) })\n .default({ types: ['feature', 'chore', 'fix'] }),\n slots: z\n .object({\n count: z.number().int().min(1).max(100),\n reserved: z.array(z.number().int().min(0)),\n })\n .default({ count: 10, reserved: [0] }),\n ports: z.object({\n services: z.record(z.string(), z.object({ base: z.number().int().min(1024).max(65535) })),\n }),\n services: z.record(z.string(), Service),\n storybook: z.object({ hostRoot: z.string() }).optional(),\n logs: z.object({ dir: z.string() }).default({ dir: '.logs' }),\n env: z.object({ file: z.string(), template: z.record(z.string(), z.string()) }).optional(),\n seed: z.array(z.string().min(1)).optional(),\n refresh: z\n .array(\n z.object({\n when: z.string().optional(),\n always: z.boolean().optional(),\n run: z.string().optional(),\n mark: z.string().optional(),\n restoreWhenIfClean: z.boolean().optional(),\n }),\n )\n .default([]),\n scopes: z.object({ frontend: z.array(z.string()), backend: z.array(z.string()) }),\n areas: z.record(\n z.string().regex(/^(?!.*--)[a-z0-9-]+(\\/[a-z0-9-]+)*$/),\n z.object({\n module: z.string().optional(),\n commons: z.array(z.string()).optional(),\n extraScopes: ExtraScopes.optional(),\n sharedScopes: z.array(z.string()).optional(),\n }),\n ),\n commons: z.record(z.string(), z.array(z.string())).default({}),\n expiry: z\n .object({\n slotHours: z.number().positive(),\n commonsHours: z.number().positive(),\n storybookHours: z.number().positive(),\n })\n .default({ slotHours: 12, commonsHours: 4, storybookHours: 2 }),\n archive: z\n .object({\n paths: z.array(z.string()),\n keepDays: z.number().int().positive(),\n keepPerArea: z.number().int().positive(),\n })\n .default({ paths: [], keepDays: 30, keepPerArea: 5 }),\n});\n\n/** Variables the env template may reference. */\nexport function templateVariables(m: {\n ports: { services: Record<string, unknown> };\n}): Set<string> {\n const vars = new Set([\n 'SLOT',\n 'LOG_DIR',\n 'PROJECT',\n 'AREA',\n 'BRANCH',\n 'WORKTREE',\n 'PORT_STORYBOOK',\n 'STORYBROKR_HOST',\n ]);\n for (const s of Object.keys(m.ports.services)) vars.add(`PORT_${s.toUpperCase()}`);\n return vars;\n}\n\nfunction defaultEnv(services: string[]): Manifest['env'] {\n // biome-ignore lint/suspicious/noTemplateCurlyInString: these ARE the manifest's template placeholders\n const template: Record<string, string> = {\n // biome-ignore lint/suspicious/noTemplateCurlyInString: manifest template placeholder\n SLOT: '${SLOT}',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: manifest template placeholder\n LOG_DIR: '${LOG_DIR}',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: manifest template placeholder\n STORYBROKR_HOST: '${STORYBROKR_HOST}',\n };\n for (const s of services) template[`PORT_${s.toUpperCase()}`] = `\\${PORT_${s.toUpperCase()}}`;\n return { file: '.env.slot', template };\n}\n\nexport function validateManifest(raw: unknown): Manifest {\n const parsed = Schema.safeParse(raw);\n if (!parsed.success) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n );\n }\n const m = parsed.data;\n const problems: string[] = [];\n const areas = Object.keys(m.areas).sort();\n for (const a of areas) {\n for (const b of areas) {\n if (a !== b && b.startsWith(`${a}/`)) {\n problems.push(`area \"${a}\" is an ancestor of \"${b}\": areas must be leaves`);\n }\n }\n }\n for (const s of Object.keys(m.services)) {\n if (!m.ports.services[s]) problems.push(`service \"${s}\" has no port base under ports.services`);\n }\n for (const s of Object.keys(m.ports.services)) {\n if (!m.services[s] && s !== 'storybook') problems.push(`port \"${s}\" names no service`);\n }\n for (const r of m.slots.reserved) {\n if (r >= m.slots.count) problems.push(`reserved slot ${r} is outside 0..${m.slots.count - 1}`);\n }\n const env = m.env ?? defaultEnv(Object.keys(m.ports.services));\n const allowed = templateVariables(m);\n for (const [k, v] of Object.entries(env.template)) {\n for (const [, name] of v.matchAll(/\\$\\{([A-Z0-9_]+)\\}/g)) {\n if (!allowed.has(name)) {\n problems.push(\n `env.template.${k} references ${name}, which no slot derives (allowed: ${[...allowed].join(', ')})`,\n );\n }\n }\n }\n for (const [area, spec] of Object.entries(m.areas)) {\n for (const c of spec.commons ?? []) {\n if (!m.commons[c])\n problems.push(`area \"${area}\" names commons \"${c}\", which is not declared`);\n }\n }\n if (problems.length) throw new WorkkitError('MANIFEST_INVALID', problems.join('; '));\n return { ...m, protectedBranches: m.protectedBranches ?? [m.baseBranch], env } as Manifest;\n}\n\nexport async function loadManifest(repoRoot: string): Promise<Manifest> {\n for (const name of MANIFEST_FILES) {\n const file = join(repoRoot, name);\n if (!existsSync(file)) continue;\n if (name.endsWith('.json')) return validateManifest(JSON.parse(readFileSync(file, 'utf8')));\n // Node >= 24 strips types from an imported .ts file natively; the query string defeats the\n // module cache so a re-read inside one process sees edits.\n const mod = (await import(`${pathToFileURL(file).href}?t=${Date.now()}`)) as {\n default?: unknown;\n };\n return validateManifest(mod.default);\n }\n throw new WorkkitError(\n 'MANIFEST_NOT_FOUND',\n `no ${MANIFEST_FILES.join(' | ')} in ${repoRoot}; run \\`work init\\``,\n );\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport function homeDir(env: NodeJS.ProcessEnv = process.env): string {\n return env.HELMSMITH_HOME && env.HELMSMITH_HOME.length > 0\n ? env.HELMSMITH_HOME\n : join(homedir(), '.cache', 'helmsmith');\n}\n\nexport const registryFile = (home: string) => join(home, 'registry.json');\nexport const lockDir = (home: string) => join(home, 'registry.lock');\n","import { WorkkitError } from './errors.js';\nimport type { Registry } from './registry.js';\nimport type { Manifest } from './types.js';\n\nexport interface PortRange {\n base: number;\n count: number;\n}\n\n/** Slot N's port for every service: base + N. */\nexport function portsForSlot(m: Manifest, slot: number): Record<string, number> {\n return Object.fromEntries(\n Object.entries(m.ports.services).map(([service, { base }]) => [service, base + slot]),\n );\n}\n\n/** The ports a project claims: one range [base, base + slots.count) per service. */\nexport function rangesFor(m: Manifest): Record<string, PortRange> {\n return Object.fromEntries(\n Object.entries(m.ports.services).map(([service, { base }]) => [\n service,\n { base, count: m.slots.count },\n ]),\n );\n}\n\nexport function rangesOverlap(a: PortRange, b: PortRange): boolean {\n return a.base < b.base + b.count && b.base < a.base + a.count;\n}\n\n/**\n * Record the project's ranges in the registry. Idempotent for the same project; refuses when\n * another project already holds an overlapping range, naming it and the service.\n */\n/**\n * Every command: refuse when this project's ranges overlap another project's, and\n * (re-)register them when the manifest's ranges differ from what the registry holds.\n */\nexport function ensureRanges(registry: Registry, m: Manifest, repoRoot: string): void {\n const mine = rangesFor(m);\n assertNoOverlap(registry, m, mine);\n const current = registry.project(m.project);\n if (current && JSON.stringify(current.ranges) === JSON.stringify(mine)) return;\n registry.upsertProject(m.project, { root: repoRoot, ranges: mine });\n}\n\nexport function claimRanges(registry: Registry, m: Manifest, repoRoot: string): void {\n const mine = rangesFor(m);\n assertNoOverlap(registry, m, mine);\n registry.upsertProject(m.project, { root: repoRoot, ranges: mine });\n}\n\nfunction assertNoOverlap(\n registry: Registry,\n m: Manifest,\n mine: ReturnType<typeof rangesFor>,\n): void {\n const others = Object.entries(registry.read().projects).filter(([name]) => name !== m.project);\n for (const [service, range] of Object.entries(mine)) {\n for (const [name, entry] of others) {\n for (const [theirService, theirs] of Object.entries(entry.ranges)) {\n if (rangesOverlap(range, theirs)) {\n throw new WorkkitError(\n 'PORT_RANGE_TAKEN',\n `ports ${range.base}-${range.base + range.count - 1} for \"${service}\" overlap project \"${name}\" (${theirService}: ${theirs.base}-${theirs.base + theirs.count - 1}); pick another base in ports.services.${service}`,\n { project: name, service, theirs },\n );\n }\n }\n }\n }\n}\n","import { spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport picomatch from 'picomatch';\nimport { WorkkitError } from './errors.js';\nimport type { RefreshEntry } from './types.js';\n\nfunction matchesWhen(glob: string): (p: string) => boolean {\n const isMatch = picomatch(glob, { dot: true });\n return (p) => isMatch(p);\n}\n\nfunction readStamps(stampFile?: string): Record<string, string> {\n if (!stampFile || !existsSync(stampFile)) return {};\n try {\n return JSON.parse(readFileSync(stampFile, 'utf8')) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\nfunction writeStamps(stampFile: string, stamps: Record<string, string>): void {\n mkdirSync(dirname(stampFile), { recursive: true });\n writeFileSync(stampFile, `${JSON.stringify(stamps, null, 2)}\\n`);\n}\n\nfunction matchedFilesInWorktree(worktree: string, whenGlob: string): string[] {\n if (!/[*?[{]/.test(whenGlob)) {\n return existsSync(join(worktree, whenGlob)) ? [whenGlob] : [];\n }\n const r = spawnSync('git', ['ls-files'], { cwd: worktree, encoding: 'utf8' });\n if (r.status !== 0) return [];\n const isMatch = matchesWhen(whenGlob);\n return (r.stdout ?? '')\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0 && isMatch(l) && existsSync(join(worktree, l)));\n}\n\nfunction hashFiles(worktree: string, relPaths: string[]): string | null {\n if (relPaths.length === 0) return null;\n const h = createHash('sha256');\n for (const rel of [...relPaths].sort()) {\n const abs = join(worktree, rel);\n if (!existsSync(abs)) continue;\n h.update(`${rel}\\0`);\n h.update(readFileSync(abs));\n h.update('\\0');\n }\n return h.digest('hex');\n}\n\nfunction isFileCleanInGit(worktree: string, relPath: string): boolean {\n const r = spawnSync('git', ['status', '--porcelain', '--', relPath], {\n cwd: worktree,\n encoding: 'utf8',\n });\n return r.status === 0 && (r.stdout ?? '').trim().length === 0;\n}\n\nexport interface SelectRefreshOptions {\n worktree?: string;\n stampFile?: string;\n}\n\nexport interface SelectRefreshResult {\n runs: string[];\n marks: string[];\n pendingStamps?: Record<string, string>;\n cleanWhenFiles?: string[];\n}\n\n/** Which refresh commands and marks a sync's changed paths or unstamped `when` files call for, in manifest order. */\nexport function selectRefresh(\n entries: RefreshEntry[],\n changedPaths: string[],\n opts?: SelectRefreshOptions,\n): SelectRefreshResult {\n const runs: string[] = [];\n const marks: string[] = [];\n const stored = readStamps(opts?.stampFile);\n const pendingStamps: Record<string, string> = { ...stored };\n const cleanWhenFiles = new Set<string>();\n\n for (const e of entries) {\n let hit = e.always === true;\n let matchedFiles: string[] = [];\n if (e.when !== undefined) {\n const byChanged = changedPaths.some(matchesWhen(e.when));\n if (opts?.worktree) {\n matchedFiles = matchedFilesInWorktree(opts.worktree, e.when);\n const digest = hashFiles(opts.worktree, matchedFiles);\n if (digest !== null) {\n if (stored[e.when] !== digest) hit = true;\n pendingStamps[e.when] = digest;\n }\n }\n if (byChanged) hit = true;\n }\n if (!hit) continue;\n if (e.run) {\n runs.push(e.run);\n if (opts?.worktree && e.when && e.restoreWhenIfClean !== false) {\n for (const f of matchedFiles) {\n if (isFileCleanInGit(opts.worktree, f)) cleanWhenFiles.add(f);\n }\n }\n }\n if (e.mark) marks.push(e.mark);\n }\n if (!opts?.worktree) return { runs, marks };\n return {\n runs,\n marks,\n pendingStamps,\n cleanWhenFiles: [...cleanWhenFiles],\n };\n}\n\nexport interface RunRefreshOptions {\n stampFile?: string;\n pendingStamps?: Record<string, string>;\n restoreFiles?: string[];\n}\n\n/** Run each command through `sh -c` in the worktree; the first failure names its command. */\nexport function runRefresh(\n runs: string[],\n cwd: string,\n log: (line: string) => void,\n env: NodeJS.ProcessEnv = process.env,\n opts?: RunRefreshOptions,\n): void {\n for (const cmd of runs) {\n log(`$ ${cmd}`);\n const r = spawnSync('sh', ['-c', cmd], { cwd, env, encoding: 'utf8' });\n if (r.stdout) log(r.stdout.trimEnd());\n if (r.stderr) log(r.stderr.trimEnd());\n if (r.status !== 0) {\n throw new WorkkitError('INTERNAL', `refresh command failed (${r.status}): ${cmd}`, {\n cmd,\n status: r.status,\n });\n }\n }\n if (opts?.restoreFiles && opts.restoreFiles.length > 0) {\n for (const rel of opts.restoreFiles) {\n if (!isFileCleanInGit(cwd, rel)) {\n spawnSync('git', ['checkout', '--', rel], { cwd, encoding: 'utf8' });\n }\n }\n }\n if (opts?.stampFile && opts.pendingStamps) {\n writeStamps(opts.stampFile, opts.pendingStamps);\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { WorkkitError } from './errors.js';\nimport { lockDir, registryFile } from './paths.js';\nimport { portsForSlot } from './ports.js';\nimport type {\n Effort,\n Lease,\n LeaseKind,\n Manifest,\n Notice,\n Owner,\n ProjectEntry,\n RegistryFile,\n} from './types.js';\n\nexport const newId = (prefix: string) => `${prefix}_${randomBytes(4).toString('hex')}`;\n\nconst EMPTY: RegistryFile = { version: 1, projects: {}, leases: [], efforts: [] };\n// The lock is held for microseconds, so anything older than the stale threshold belongs to a\n// dead process; the wait must exceed it, or every command fails for the gap between the two.\nconst LOCK_STALE_MS = 10_000;\nconst LOCK_WAIT_MS = 15_000;\n\n/** Synchronous sleep: the lock is held for microseconds, so a busy wait with a pause is fine. */\nfunction sleep(ms: number): void {\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\n}\n\nexport class Registry {\n private constructor(\n private readonly home: string,\n private readonly now: () => Date,\n ) {}\n\n static open(home: string, now: () => Date = () => new Date()): Registry {\n mkdirSync(home, { recursive: true });\n return new Registry(home, now);\n }\n\n /** The registry as it is on disk. A file that does not parse is refused, never replaced. */\n read(): RegistryFile {\n const file = registryFile(this.home);\n if (!existsSync(file)) return structuredClone(EMPTY);\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(file, 'utf8'));\n } catch (err) {\n throw new WorkkitError(\n 'INTERNAL',\n `${file} is corrupt (${err instanceof Error ? err.message : String(err)}); nothing was changed. Move it aside (mv ${file} ${file}.corrupt-$(date +%s)) to start fresh, knowing its leases and running pids are lost`,\n { file },\n );\n }\n const r = parsed as Partial<RegistryFile> | null;\n if (!r || typeof r !== 'object' || r.version !== 1) {\n throw new WorkkitError(\n 'INTERNAL',\n `${file} has an unknown registry version (${String(r?.version)}); this build reads version 1`,\n { file },\n );\n }\n return {\n version: 1,\n projects: r.projects ?? {},\n leases: r.leases ?? [],\n efforts: r.efforts ?? [],\n notices: r.notices ?? [],\n };\n }\n\n /** Lock, re-read, mutate, write atomically, unlock. The only way state changes. */\n update<T>(fn: (r: RegistryFile) => T): T {\n const lock = lockDir(this.home);\n const started = Date.now();\n for (;;) {\n try {\n mkdirSync(lock);\n break;\n } catch {\n try {\n if (Date.now() - statSync(lock).mtimeMs > LOCK_STALE_MS) {\n // claim the stale lock by renaming it: two waiters cannot both win the rename,\n // so neither deletes a fresh lock the other just took\n const claimed = `${lock}.stale.${process.pid}.${Date.now()}`;\n renameSync(lock, claimed);\n rmSync(claimed, { recursive: true, force: true });\n continue;\n }\n } catch {\n continue; // the lock vanished between the failed mkdir and the stat: retry at once\n }\n if (Date.now() - started > LOCK_WAIT_MS) {\n throw new WorkkitError(\n 'INTERNAL',\n `registry lock ${lock} held for over ${LOCK_WAIT_MS} ms`,\n );\n }\n sleep(25);\n }\n }\n try {\n const r = this.read();\n const out = fn(r);\n const file = registryFile(this.home);\n const tmp = `${file}.${process.pid}.tmp`;\n writeFileSync(tmp, `${JSON.stringify(r, null, 2)}\\n`);\n renameSync(tmp, file);\n return out;\n } finally {\n rmSync(lock, { recursive: true, force: true });\n }\n }\n\n project(name: string): ProjectEntry | undefined {\n return this.read().projects[name];\n }\n\n upsertProject(name: string, entry: ProjectEntry): void {\n this.update((r) => {\n r.projects[name] = entry;\n });\n }\n\n leases(filter: Partial<Pick<Lease, 'project' | 'kind' | 'effort'>> = {}): Lease[] {\n return this.read().leases.filter((l) =>\n Object.entries(filter).every(([k, v]) => (l as unknown as Record<string, unknown>)[k] === v),\n );\n }\n\n efforts(filter: Partial<Pick<Effort, 'project' | 'area' | 'task' | 'state'>> = {}): Effort[] {\n return this.read().efforts.filter((e) =>\n Object.entries(filter).every(([k, v]) => (e as unknown as Record<string, unknown>)[k] === v),\n );\n }\n\n activeEffortFor(project: string, area: string, task?: string): Effort | undefined {\n return this.efforts({ project, area, state: 'active' }).find(\n (e) => (e.task ?? undefined) === (task ?? undefined),\n );\n }\n\n /** An effort that is being started counts as open: nobody else may start on the same (area, task) meanwhile. */\n openEffortFor(project: string, area: string, task?: string): Effort | undefined {\n return this.efforts({ project, area }).find(\n (e) =>\n (e.state === 'starting' || e.state === 'active') &&\n (e.task ?? undefined) === (task ?? undefined),\n );\n }\n\n addNotice(project: string, area: string, notice: Notice): void {\n this.update((r) => {\n const existing = r.notices ?? [];\n const dup = existing.findIndex(\n (n) =>\n n.project === project &&\n n.area === area &&\n n.notice.from === notice.from &&\n n.notice.text === notice.text,\n );\n if (dup >= 0) {\n existing[dup] = { project, area, notice };\n r.notices = existing;\n } else {\n r.notices = [...existing, { project, area, notice }];\n }\n });\n }\n\n notices(project: string, area: string): Notice[] {\n return (this.read().notices ?? [])\n .filter((n) => n.project === project && n.area === area)\n .map((n) => n.notice);\n }\n\n clearNotices(project: string, area: string): void {\n this.update((r) => {\n r.notices = (r.notices ?? []).filter((n) => !(n.project === project && n.area === area));\n });\n }\n\n clearNoticesFrom(project: string, branches: string[]): void {\n const set = new Set(branches);\n this.update((r) => {\n r.notices = (r.notices ?? []).filter(\n (n) => !(n.project === project && set.has(n.notice.from)),\n );\n });\n }\n\n pruneNoticesWhere(project: string, area: string, remove: (n: Notice) => boolean): void {\n this.update((r) => {\n r.notices = (r.notices ?? []).filter(\n (n) => !(n.project === project && n.area === area && remove(n.notice)),\n );\n });\n }\n\n allocateSlot(\n project: string,\n m: Manifest,\n owner: Owner,\n effort: string,\n exclude: Set<number> = new Set(),\n ): Lease {\n return this.update((r) => {\n const taken = new Set(\n r.leases\n .filter((l) => l.project === project && l.kind === 'slot')\n .map((l) => l.value as number),\n );\n const reserved = new Set(m.slots.reserved);\n let slot = -1;\n for (let n = 0; n < m.slots.count; n++) {\n if (!taken.has(n) && !reserved.has(n) && !exclude.has(n)) {\n slot = n;\n break;\n }\n }\n if (slot < 0) {\n throw new WorkkitError(\n 'NO_FREE_SLOT',\n `no free slot in ${project} (0..${m.slots.count - 1}, reserved ${[...reserved].join(',')}): \\`work status\\` lists the efforts holding them; \\`work finish\\` or \\`work reap\\` frees one`,\n );\n }\n const lease = this.lease(\n project,\n 'slot',\n slot,\n owner,\n effort,\n m.expiry.slotHours,\n portsForSlot(m, slot),\n );\n r.leases.push(lease);\n return lease;\n });\n }\n\n addLease(\n kind: LeaseKind,\n project: string,\n value: string | number,\n owner: Owner,\n effort: string,\n hours: number,\n extra: Partial<Lease> = {},\n ): Lease {\n return this.update((r) => {\n const l = { ...this.lease(project, kind, value, owner, effort, hours), ...extra };\n r.leases.push(l);\n return l;\n });\n }\n\n private lease(\n project: string,\n kind: LeaseKind,\n value: string | number,\n owner: Owner,\n effort: string,\n hours: number,\n ports?: Record<string, number>,\n ): Lease {\n const now = this.now();\n return {\n id: newId('lease'),\n project,\n kind,\n value,\n ...(ports ? { ports } : {}),\n owner,\n effort,\n created: now.toISOString(),\n touched: now.toISOString(),\n expires: new Date(now.getTime() + hours * 3_600_000).toISOString(),\n };\n }\n\n touch(leaseId: string, hours: number): void {\n this.update((r) => {\n const l = r.leases.find((x) => x.id === leaseId);\n if (!l) throw new WorkkitError('LEASE_NOT_FOUND', leaseId);\n const now = this.now();\n l.touched = now.toISOString();\n l.expires = new Date(now.getTime() + hours * 3_600_000).toISOString();\n });\n }\n\n patchLease(leaseId: string, patch: Partial<Lease>): void {\n this.update((r) => {\n const i = r.leases.findIndex((x) => x.id === leaseId);\n if (i < 0) throw new WorkkitError('LEASE_NOT_FOUND', leaseId);\n r.leases[i] = { ...r.leases[i], ...patch };\n });\n }\n\n release(leaseId: string): void {\n this.update((r) => {\n r.leases = r.leases.filter((l) => l.id !== leaseId);\n });\n }\n\n expired(now: Date = this.now()): Lease[] {\n return this.read().leases.filter((l) => Date.parse(l.expires) < now.getTime());\n }\n\n addEffort(e: Effort): void {\n this.update((r) => {\n r.efforts.push(e);\n });\n }\n\n updateEffort(id: string, patch: Partial<Effort>): Effort {\n return this.update((r) => {\n const i = r.efforts.findIndex((e) => e.id === id);\n if (i < 0) throw new WorkkitError('EFFORT_NOT_FOUND', `no effort ${id}`);\n r.efforts[i] = { ...r.efforts[i], ...patch };\n return r.efforts[i];\n });\n }\n\n removeEfforts(predicate: (e: Effort) => boolean): number {\n return this.update((r) => {\n const before = r.efforts.length;\n r.efforts = r.efforts.filter((e) => !predicate(e));\n return before - r.efforts.length;\n });\n }\n}\n","import { spawn, spawnSync } from 'node:child_process';\nimport { closeSync, openSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { WorkkitError } from './errors.js';\nimport type { Manifest, ServiceSpec } from './types.js';\n\nconst DEFAULT_HEALTH_TIMEOUT_MS = 180_000;\nconst HEALTH_POLL_MS = 1_000;\nconst PROBE_CAP_MS = 10_000;\nconst STOP_COMMAND_TIMEOUT_MS = 15_000;\nconst STOP_GRACE_MS = 5_000;\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport function isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/** The process's start time as `ps` prints it: a pid plus this string identifies one process, not a reused number. */\nexport function pidSignature(pid: number): string {\n const r = spawnSync('ps', ['-o', 'lstart=', '-p', String(pid)], { encoding: 'utf8' });\n return r.status === 0 ? (r.stdout ?? '').trim() : '';\n}\n\nexport function serviceModes(name: string, spec: ServiceSpec): ('backend' | 'fullstack')[] {\n if (spec.modes && spec.modes.length > 0) return spec.modes;\n return name === 'frontend' ? ['fullstack'] : ['backend', 'fullstack'];\n}\n\nexport interface RunnerArgs {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n logDir: string;\n mode?: 'backend' | 'fullstack';\n onlyServices?: string[];\n onLog?: (line: string) => void;\n /** called the moment a service's process exists, before its health is known */\n onSpawn?: (service: string, pid: number, signature: string) => void;\n}\n\n/** One health probe, time-boxed: exit 0, and when `healthyCodes` is set the last stdout token is one of them. */\nexport function probe(\n spec: ServiceSpec,\n cwd: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number = PROBE_CAP_MS,\n): { healthy: boolean; last: string } {\n const r = spawnSync('sh', ['-c', spec.health], {\n cwd,\n env,\n encoding: 'utf8',\n timeout: Math.max(100, timeoutMs),\n });\n const out = (r.stdout ?? '').trim();\n const last = out.split(/\\s+/).filter(Boolean).pop() ?? '';\n if (r.error) return { healthy: false, last: `probe ${r.error.message}` };\n if (r.status !== 0) return { healthy: false, last: (r.stderr ?? '').trim() || out };\n if (spec.healthyCodes && spec.healthyCodes.length > 0)\n return { healthy: spec.healthyCodes.includes(Number(last)), last };\n return { healthy: true, last };\n}\n\nexport async function waitHealthy(o: {\n name: string;\n spec: ServiceSpec;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeoutMs?: number;\n}): Promise<void> {\n const budget = o.timeoutMs ?? o.spec.healthTimeoutMs ?? DEFAULT_HEALTH_TIMEOUT_MS;\n const deadline = Date.now() + budget;\n let last = '';\n while (Date.now() < deadline) {\n const p = probe(o.spec, o.cwd, o.env, Math.min(PROBE_CAP_MS, deadline - Date.now()));\n if (p.healthy) return;\n last = p.last;\n if (Date.now() >= deadline) break;\n await sleep(Math.min(HEALTH_POLL_MS, Math.max(0, deadline - Date.now())));\n }\n throw new WorkkitError(\n 'HEALTH_TIMEOUT',\n `service \"${o.name}\" was not healthy within ${(budget / 1000).toFixed(0)} s (last probe: ${last || 'no output'})`,\n { service: o.name, last },\n );\n}\n\n/** Start one service detached in its own process group, logging to <logDir>/<name>.log; returns the group leader's pid. */\nfunction spawnService(name: string, spec: ServiceSpec, a: RunnerArgs): number {\n const fd = openSync(join(a.logDir, `${name}.log`), 'a');\n try {\n const child = spawn('sh', ['-c', spec.start], {\n cwd: a.cwd,\n env: a.env,\n detached: true,\n stdio: ['ignore', fd, fd],\n });\n child.unref();\n if (child.pid === undefined) {\n throw new WorkkitError('SERVICE_FAILED', `service \"${name}\" did not spawn: ${spec.start}`, {\n service: name,\n });\n }\n return child.pid;\n } finally {\n closeSync(fd);\n }\n}\n\n/** Start every service in manifest order, waiting for each one's health; on failure stop what started. */\nexport async function startServices(\n a: RunnerArgs,\n): Promise<{ pids: Record<string, number>; signatures: Record<string, string> }> {\n const pids: Record<string, number> = {};\n const signatures: Record<string, string> = {};\n const targetMode = a.mode ?? 'fullstack';\n const entries = Object.entries(a.m.services).filter(([name, spec]) => {\n if (a.onlyServices) return a.onlyServices.includes(name);\n return serviceModes(name, spec).includes(targetMode);\n });\n for (const [name, spec] of entries) {\n a.onLog?.(`starting ${name}: ${spec.start}`);\n pids[name] = spawnService(name, spec, a);\n signatures[name] = pidSignature(pids[name]);\n a.onSpawn?.(name, pids[name], signatures[name]);\n try {\n await waitHealthy({ name, spec, cwd: a.cwd, env: a.env });\n } catch (err) {\n await stopServices({ m: a.m, cwd: a.cwd, env: a.env, pids, signatures, onLog: a.onLog });\n throw err;\n }\n a.onLog?.(`${name} healthy (pid ${pids[name]})`);\n }\n return { pids, signatures };\n}\n\nfunction killGroup(pid: number, signal: NodeJS.Signals): void {\n try {\n process.kill(-pid, signal);\n } catch {\n try {\n process.kill(pid, signal);\n } catch {\n // already gone\n }\n }\n}\n\n/**\n * Run each `stop` in reverse order (time-boxed), then SIGTERM and finally SIGKILL only the pids we\n * started — and only while each pid still carries the start-time signature recorded at spawn.\n */\nexport async function stopServices(o: {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n pids: Record<string, number>;\n signatures?: Record<string, string>;\n skipStopCommands?: boolean;\n onLog?: (line: string) => void;\n}): Promise<void> {\n const names = Object.keys(o.m.services)\n .filter((n) => o.pids[n] !== undefined)\n .reverse();\n if (!o.skipStopCommands) {\n for (const name of names) {\n const spec = o.m.services[name];\n o.onLog?.(`stopping ${name}: ${spec.stop}`);\n const r = spawnSync('sh', ['-c', spec.stop], {\n cwd: o.cwd,\n env: o.env,\n encoding: 'utf8',\n timeout: STOP_COMMAND_TIMEOUT_MS,\n });\n if (r.error) o.onLog?.(`stop command for ${name} ${r.error.message}`);\n }\n }\n const ours = names.filter((n) => {\n const pid = o.pids[n];\n if (!isAlive(pid)) return false;\n const expected = o.signatures?.[n];\n if (expected === undefined) return true;\n const actual = pidSignature(pid);\n if (actual !== expected) {\n o.onLog?.(\n `not signalling pid ${pid} (${n}): it is no longer the process started for this lease`,\n );\n return false;\n }\n return true;\n });\n const alive = () => ours.filter((n) => isAlive(o.pids[n]));\n if (alive().length === 0) return;\n for (const n of alive()) killGroup(o.pids[n], 'SIGTERM');\n const deadline = Date.now() + STOP_GRACE_MS;\n while (alive().length > 0 && Date.now() < deadline) await sleep(200);\n for (const n of alive()) killGroup(o.pids[n], 'SIGKILL');\n const hardDeadline = Date.now() + STOP_GRACE_MS;\n while (alive().length > 0 && Date.now() < hardDeadline) await sleep(100);\n}\n","import { hostname, userInfo } from 'node:os';\nimport type { Owner } from './types.js';\n\n/**\n * Who holds a lease. `WORK_SESSION` when the shell says so, else Claude Code's session id, else\n * `user@host`. No pid or ppid: a git hook runs as a child of git and must agree with the shell\n * that started the effort.\n */\nexport function currentOwner(env: NodeJS.ProcessEnv = process.env): Owner {\n const named = [env.WORK_SESSION, env.CLAUDE_SESSION_NAME, env.CLAUDE_CODE_SESSION_ID].find(\n (v) => v !== undefined && v.length > 0,\n );\n return { session: named ?? `${userInfo().username}@${hostname()}`, pid: process.pid };\n}\n","import { spawnSync } from 'node:child_process';\nimport { WorkkitError } from '../core/index.js';\nimport { compareSemver } from './storybrokr.js';\n\nexport interface PrRecord {\n number: number;\n url: string;\n draft: boolean;\n}\n\nexport interface PrittyPrOptions {\n cwd: string;\n base: string;\n draft?: boolean;\n title?: string;\n body?: string;\n bodyFile?: string;\n}\n\n/** The PR mechanics: the installed `pritty` CLI (0.1.1 or newer), spawned in the worktree. */\nexport interface PrittyClient {\n /** The installed pritty version, checked once. */\n version(): string;\n /** Open a PR for the current branch, or return (and, with given words, update) the open one. */\n pr(o: PrittyPrOptions): Promise<PrRecord & { created: boolean }>;\n /** The open PR for the current branch and base, and what became of the last one when none is open; creates nothing. */\n check(o: { cwd: string; base: string }): Promise<PrCheck>;\n}\n\nexport interface PrCheck {\n open: PrRecord | null;\n last: { number: number; url: string; state: 'MERGED' | 'CLOSED' } | null;\n}\n\nexport const MIN_PRITTY_VERSION = '0.1.2';\n\nexport function assertPrittyVersion(client: PrittyClient): void {\n const found = client.version();\n if (compareSemver(found, MIN_PRITTY_VERSION) < 0) {\n throw new WorkkitError(\n 'PRITTY_FAILED',\n `pritty >= ${MIN_PRITTY_VERSION} required (found ${found || 'unknown'}); npm i -g @helmsmith/pritty`,\n );\n }\n}\n\nfunction run(args: string[], cwd?: string): { code: number; out: string; err: string } {\n const r = spawnSync('pritty', args, { cwd, encoding: 'utf8', env: process.env });\n if (r.error) {\n throw new WorkkitError(\n 'PRITTY_FAILED',\n `pritty is not installed (npm i -g @helmsmith/pritty): ${r.error.message}`,\n );\n }\n return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };\n}\n\n/** The last stdout line is the JSON pritty promises under --json / --check. */\nfunction lastJsonLine<T>(out: string, what: string): T {\n const line = out.trim().split('\\n').filter(Boolean).pop() ?? '';\n try {\n return JSON.parse(line) as T;\n } catch {\n throw new WorkkitError('PRITTY_FAILED', `pritty ${what} printed no JSON: ${out.trim()}`);\n }\n}\n\nlet versionFound: string | undefined;\n\nexport const prittyCli: PrittyClient = {\n version() {\n if (versionFound === undefined) {\n const r = run(['--version']);\n versionFound = r.code === 0 ? r.out.trim() : '';\n }\n return versionFound;\n },\n async pr(o) {\n const args = ['pr', '--base', o.base, '--no-push', '--auto-approve', '--json'];\n if (o.draft) args.push('--draft');\n if (o.title !== undefined) args.push('--title', o.title);\n if (o.body !== undefined) args.push('--body', o.body);\n if (o.bodyFile !== undefined) args.push('--body-file', o.bodyFile);\n const r = run(args, o.cwd);\n if (r.code !== 0) {\n throw new WorkkitError('PRITTY_FAILED', `pritty pr failed: ${(r.err || r.out).trim()}`, {\n stderr: r.err,\n });\n }\n const j = lastJsonLine<{ number: number; url: string; draft: boolean; created: boolean }>(\n r.out,\n 'pr',\n );\n return { number: j.number, url: j.url, draft: Boolean(j.draft), created: Boolean(j.created) };\n },\n async check(o) {\n const r = run(['pr', '--check', '--base', o.base], o.cwd);\n if (r.code !== 0) {\n throw new WorkkitError(\n 'PRITTY_FAILED',\n `pritty pr --check failed: ${(r.err || r.out).trim()}`,\n {\n stderr: r.err,\n },\n );\n }\n const j = lastJsonLine<{\n open: { number: number; url: string; draft: boolean } | null;\n last?: { number: number; url: string; state: 'MERGED' | 'CLOSED' } | null;\n }>(r.out, 'pr --check');\n return {\n open: j.open\n ? { number: j.open.number, url: j.open.url, draft: Boolean(j.open.draft) }\n : null,\n last: j.last ?? null,\n };\n },\n};\n","import { spawnSync } from 'node:child_process';\nimport { WorkkitError } from '../core/index.js';\n\nexport interface StorybrokrInstance {\n id: string;\n port: number;\n url: string;\n}\n\n/** The frontend runner: the installed `storybrokr` CLI, which owns its daemon, ports and instances. */\nexport interface StorybrokrClient {\n up(\n story: string,\n hostRoot: string,\n opts?: { ttlMinutes?: number; includeChildren?: boolean },\n ): Promise<StorybrokrInstance>;\n down(id: string): Promise<void>;\n /** Stop every instance whose host is `hostRoot`; returns their ids. Never starts a daemon. */\n downHost?(hostRoot: string): Promise<string[]>;\n touch?(id: string): Promise<void>;\n /** The installed storybrokr version, once checked. */\n version?(): string;\n}\n\nconst MIN_STORYBROKR_VERSION = '0.3.0';\nlet versionChecked = false;\nlet versionFound = '';\n\nexport function compareSemver(a: string, b: string): number {\n const pa = a\n .trim()\n .replace(/^v/, '')\n .split('.')\n .map((n) => Number.parseInt(n, 10) || 0);\n const pb = b\n .trim()\n .replace(/^v/, '')\n .split('.')\n .map((n) => Number.parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i++) {\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return 0;\n}\n\nfunction run(args: string[]): { code: number; out: string; err: string } {\n const r = spawnSync('storybrokr', args, { encoding: 'utf8' });\n if (r.error) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr is not installed (npm i -g @helmsmith/storybrokr): ${r.error.message}`,\n );\n }\n return { code: r.status ?? 1, out: r.stdout ?? '', err: r.stderr ?? '' };\n}\n\nfunction assertStorybrokrVersion(): void {\n if (versionChecked) return;\n const r = run(['--version']);\n const found = r.out.trim();\n if (r.code !== 0 || compareSemver(found, MIN_STORYBROKR_VERSION) < 0) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr >= ${MIN_STORYBROKR_VERSION} required (found ${found || 'unknown'}); upgrade @helmsmith/storybrokr`,\n );\n }\n versionChecked = true;\n versionFound = found;\n}\n\nexport const storybrokrCli: StorybrokrClient = {\n async up(story, hostRoot, opts) {\n assertStorybrokrVersion();\n const args = ['up', story, '--host', hostRoot, '--json'];\n if (opts?.ttlMinutes !== undefined) args.push('--ttl', String(opts.ttlMinutes));\n if (opts?.includeChildren) args.push('--include-children');\n const r = run(args);\n if (r.code !== 0) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr up ${story} failed: ${r.err.trim() || r.out.trim()}`,\n );\n }\n const record = JSON.parse(r.out) as { id: string; port: number; url: string };\n return { id: record.id, port: record.port, url: record.url };\n },\n async down(id) {\n const r = run(['down', id]);\n if (r.code !== 0)\n throw new WorkkitError('STORYBROKR_FAILED', `storybrokr down ${id} failed: ${r.err.trim()}`);\n },\n async downHost(hostRoot) {\n // --if-running: never start a daemon just to find nothing to stop\n const r = spawnSync('storybrokr', ['down', '--host', hostRoot, '--if-running', '--json'], {\n encoding: 'utf8',\n });\n if (r.error) return []; // storybrokr not installed: nothing can be running\n if (r.status !== 0) {\n throw new WorkkitError(\n 'STORYBROKR_FAILED',\n `storybrokr down --host ${hostRoot} failed: ${(r.stderr || r.stdout || '').trim()}`,\n );\n }\n try {\n const parsed = JSON.parse(r.stdout) as { stopped?: string[] };\n return parsed.stopped ?? [];\n } catch {\n return [];\n }\n },\n version() {\n assertStorybrokrVersion();\n return versionFound;\n },\n async touch(id) {\n // Best-effort touch; ignore errors if the instance was already stopped.\n const r = spawnSync('storybrokr', ['touch', id], { encoding: 'utf8' });\n void r;\n },\n};\n","import {\n appendFileSync,\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { connect, createServer } from 'node:net';\nimport { dirname, join } from 'node:path';\nimport {\n assertNotProtected,\n commonsTouched,\n type Effort,\n emitWorktreeConfig,\n ensureExcluded,\n expandScopes,\n Git,\n globsOverlap,\n type Lease,\n type Manifest,\n type Mode,\n type Notice,\n newId,\n type Owner,\n portsForSlot,\n type Registry,\n runRefresh,\n selectRefresh,\n serviceModes,\n slotVars,\n storybookHostFor,\n TASK_SLUG,\n WorkkitError,\n} from '../core/index.js';\nimport { assertPrittyVersion, type PrittyClient, type PrRecord } from './pritty.js';\nimport type { StorybrokrClient } from './storybrokr.js';\n\nexport type { PrittyClient, PrRecord } from './pritty.js';\nexport type { StorybrokrClient } from './storybrokr.js';\n\nexport interface ServiceRunner {\n start(a: {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n logDir: string;\n mode?: 'backend' | 'fullstack';\n onlyServices?: string[];\n onLog?: (l: string) => void;\n onSpawn?: (service: string, pid: number, signature: string) => void;\n }): Promise<{ pids: Record<string, number>; signatures?: Record<string, string> }>;\n stop(o: {\n m: Manifest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n pids: Record<string, number>;\n signatures?: Record<string, string>;\n skipStopCommands?: boolean;\n onLog?: (l: string) => void;\n }): Promise<void>;\n}\n\nexport interface Ctx {\n home: string;\n repoRoot: string;\n manifest: Manifest;\n registry: Registry;\n owner: Owner;\n runner: ServiceRunner;\n storybrokr: StorybrokrClient;\n pritty: PrittyClient;\n log: (line: string) => void;\n}\n\nexport interface StartOptions {\n area: string;\n task?: string;\n type: string;\n mode: Mode;\n scopes?: string[];\n join?: boolean;\n sync?: boolean;\n story?: string;\n}\n\nexport interface StartResult {\n effort: Effort;\n leases: Lease[];\n sync: 'up-to-date' | 'ff' | 'merge' | 'skipped';\n refreshed: string[];\n marks: string[];\n joined: boolean;\n warnings: string[];\n /** informational notices other efforts left for this area */\n notices: Notice[];\n}\n\nexport const worktreePathFor = (ctx: Ctx, area: string, task?: string) =>\n task\n ? join(ctx.repoRoot, ctx.manifest.worktreeRoot, '_tasks', `${area}--${task}`)\n : join(ctx.repoRoot, ctx.manifest.worktreeRoot, area);\nexport const branchFor = (type: string, area: string, task?: string) =>\n task ? `${type}/${area}--${task}` : `${type}/${area}`;\nconst effortLabel = (area: string, task?: string) => (task ? `${area}--${task}` : area);\nconst now = () => new Date().toISOString();\nconst STARTING_GRACE_MS = 30 * 60_000;\nconst JOIN_WAIT_MS = 60_000;\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nconst realpathOr = (p: string) => {\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n};\n\nfunction fetchBaseOnce(ctx: Ctx): void {\n new Git(ctx.repoRoot).tryRun(['fetch', '-q', 'origin', ctx.manifest.baseBranch]);\n}\n\nfunction hoursFor(m: Manifest, kind: Lease['kind']): number {\n return {\n slot: m.expiry.slotHours,\n storybook: m.expiry.storybookHours,\n commons: m.expiry.commonsHours,\n }[kind];\n}\n\nfunction modeCovers(existing: Mode, requested: Mode): boolean {\n if (existing === 'fullstack') return true;\n return existing === requested;\n}\n\nconst STORYBROKR_TOUCH_THROTTLE_MS = 60_000;\n\n/** Activity on an effort extends every lease it holds (spec §8.4: idle is measured from the last touch). */\nexport function touchEffort(ctx: Ctx, effort: Effort): void {\n const prevMs = Date.parse(effort.lastActivity);\n const shouldTouchStorybrokr =\n Number.isNaN(prevMs) || Date.now() - prevMs >= STORYBROKR_TOUCH_THROTTLE_MS;\n for (const l of ctx.registry.leases({ effort: effort.id })) {\n ctx.registry.touch(l.id, hoursFor(ctx.manifest, l.kind));\n if (l.kind === 'storybook' && shouldTouchStorybrokr) {\n void Promise.resolve(ctx.storybrokr.touch?.(String(l.value))).catch(() => {});\n }\n }\n ctx.registry.updateEffort(effort.id, { lastActivity: now() });\n}\n\n// ── ports ────────────────────────────────────────────────────────────────────\n\n/** True when binding `port` on `host` fails with EADDRINUSE; other failures (no IPv6, etc.) read as free. */\nfunction bindFails(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const srv = createServer();\n srv.once('error', (err: NodeJS.ErrnoException) => resolve(err.code === 'EADDRINUSE'));\n srv.listen(port, host, () => srv.close(() => resolve(false)));\n });\n}\n\n/**\n * A port is busy when any of the loopback, IPv4 wildcard or IPv6 wildcard binds\n * fails: on macOS a 127.0.0.1 bind succeeds while 0.0.0.0 or :: is held (Docker\n * publishes on 0.0.0.0, Storybook and Next listen on ::), which handed a running\n * stack's slot out a second time.\n */\nasync function portBusy(port: number): Promise<boolean> {\n for (const host of ['127.0.0.1', '0.0.0.0', '::']) if (await bindFails(port, host)) return true;\n return false;\n}\n\nasync function busyPorts(ports: Record<string, number>): Promise<string[]> {\n const out: string[] = [];\n for (const [service, port] of Object.entries(ports))\n if (await portBusy(port)) out.push(`${service}=${port}`);\n return out;\n}\n\nfunction portAnswersOn(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const sock = connect({ port, host });\n const done = (v: boolean) => {\n sock.destroy();\n resolve(v);\n };\n sock.setTimeout(300, () => done(false));\n sock.once('connect', () => done(true));\n sock.once('error', () => done(false));\n });\n}\n\n/** Something accepts on the port over IPv4 loopback or IPv6 loopback. */\nasync function portAnswers(port: number): Promise<boolean> {\n return (await portAnswersOn(port, '127.0.0.1')) || (await portAnswersOn(port, '::1'));\n}\n\nasync function anyPortAnswers(ports: Record<string, number> | undefined): Promise<boolean> {\n for (const port of Object.values(ports ?? {})) if (await portAnswers(port)) return true;\n return false;\n}\n\nasync function claimFreeSlot(ctx: Ctx, effortId: string, warnings: string[]): Promise<Lease> {\n const m = ctx.manifest;\n const exclude = new Set<number>();\n const busyNotes: string[] = [];\n for (;;) {\n const candidate = ctx.registry.allocateSlot(m.project, m, ctx.owner, effortId, exclude);\n const busy = await busyPorts(candidate.ports ?? {});\n if (busy.length === 0) {\n if (busyNotes.length) warnings.push(...busyNotes);\n return candidate;\n }\n ctx.registry.release(candidate.id);\n exclude.add(candidate.value as number);\n busyNotes.push(`slot ${candidate.value}: ${busy.join(', ')} already in use`);\n ctx.log(busyNotes[busyNotes.length - 1]);\n }\n}\n\n// ── start ────────────────────────────────────────────────────────────────────\n\nfunction guardStart(\n ctx: Ctx,\n o: StartOptions,\n): { branch: string; scopes: string[]; commons: string[]; warnings: string[] } {\n const m = ctx.manifest;\n const spec = m.areas[o.area];\n if (!spec)\n throw new WorkkitError(\n 'AREA_UNKNOWN',\n `unknown area \"${o.area}\" (known: ${Object.keys(m.areas).join(', ')})`,\n { area: o.area },\n );\n if (o.task !== undefined && !TASK_SLUG.test(o.task))\n throw new WorkkitError(\n 'TASK_INVALID',\n `invalid task slug \"${o.task}\" (must match /^[a-z0-9][a-z0-9_-]{0,47}$/ with no \"--\")`,\n { task: o.task },\n );\n if (!m.branch.types.includes(o.type))\n throw new WorkkitError(\n 'TYPE_UNKNOWN',\n `unknown type \"${o.type}\" (allowed: ${m.branch.types.join(', ')})`,\n { type: o.type },\n );\n if (o.mode !== 'frontend' && o.mode !== 'backend' && o.mode !== 'fullstack')\n throw new WorkkitError(\n 'MODE_UNKNOWN',\n `unknown mode \"${o.mode}\" (frontend | backend | fullstack)`,\n );\n const branch = branchFor(o.type, o.area, o.task);\n assertNotProtected(m, branch);\n const scopes = expandScopes(m, o.area, o.mode, o.scopes, Boolean(o.task));\n const commons = spec.commons ?? [];\n const warnings: string[] = [];\n if (commons.length > 0) {\n for (const e of ctx.registry.efforts({ project: m.project })) {\n if (\n (e.area === o.area && (e.task ?? undefined) === (o.task ?? undefined)) ||\n (e.state !== 'active' && e.state !== 'starting') ||\n !existsSync(e.worktree)\n )\n continue;\n const changed = new Git(e.worktree)\n .tryRun(['diff', '--name-only', '--no-renames', `origin/${m.baseBranch}...HEAD`])\n .out.split('\\n')\n .filter(Boolean);\n const hit = commonsTouched(m, changed).filter((c) => commons.includes(c));\n if (hit.length > 0)\n warnings.push(\n `${effortLabel(e.area, e.task)} (${e.branch}, ${e.owner.session}) already has commits under commons ${hit.join(', ')}: coordinate or wait for its merge`,\n );\n }\n }\n return { branch, scopes, commons, warnings };\n}\n\n/** One registry transaction: nobody else may be open on the same (area, task) or hold an overlapping scope; the effort is written as `starting`. */\nfunction reserveEffort(\n ctx: Ctx,\n o: StartOptions,\n branch: string,\n scopes: string[],\n commons: string[],\n): Effort {\n const m = ctx.manifest;\n const effort: Effort = {\n id: newId('eff'),\n project: m.project,\n area: o.area,\n ...(o.task ? { task: o.task } : {}),\n type: o.type,\n mode: o.mode,\n branch,\n worktree: worktreePathFor(ctx, o.area, o.task),\n owner: ctx.owner,\n state: 'starting',\n scopes,\n commons,\n leases: [],\n notices: [],\n started: now(),\n lastActivity: now(),\n };\n ctx.registry.update((r) => {\n const open = r.efforts.filter(\n (e) => e.project === m.project && (e.state === 'active' || e.state === 'starting'),\n );\n const onTarget = open.find(\n (e) => e.area === o.area && (e.task ?? undefined) === (o.task ?? undefined),\n );\n if (onTarget) {\n const label = effortLabel(o.area, o.task);\n throw new WorkkitError(\n 'EFFORT_OPEN',\n `an effort is open on ${label} (${onTarget.branch}, ${onTarget.mode}) owned by ${onTarget.owner.session} since ${onTarget.started}; finish it, or pass --join to work in the same checkout`,\n { owner: onTarget.owner.session, effort: onTarget.id, branch: onTarget.branch },\n );\n }\n for (const e of open) {\n const pairs = globsOverlap(scopes, e.scopes);\n if (pairs.length > 0) {\n const otherLabel = effortLabel(e.area, e.task);\n throw new WorkkitError(\n 'SCOPE_CONFLICT',\n `scope overlaps the open effort on ${otherLabel} (${e.branch}, owner ${e.owner.session}): ${pairs.join('; ')}`,\n { with: otherLabel, owner: e.owner.session, effort: e.id, pairs },\n );\n }\n }\n r.efforts.push(effort);\n });\n return effort;\n}\n\n/** The area branch a task converges into: the one that exists (locally or on origin), the task's own type first; a new area gets the task's type. */\nfunction areaBranchFor(ctx: Ctx, area: string, preferredType: string): string {\n const main = new Git(ctx.repoRoot);\n const types = [preferredType, ...ctx.manifest.branch.types.filter((t) => t !== preferredType)];\n for (const type of types) {\n const b = branchFor(type, area);\n if (main.branchExists(b) || main.remoteRef(b)) return b;\n }\n return branchFor(preferredType, area);\n}\n\n/** The directory at the worktree path must be THIS repo's registered worktree, never the main checkout seen through a bare directory. */\nfunction ensureWorktree(\n ctx: Ctx,\n area: string,\n branch: string,\n task?: string,\n): { wg: Git; created: boolean } {\n const m = ctx.manifest;\n const path = worktreePathFor(ctx, area, task);\n const main = new Git(ctx.repoRoot);\n if (!existsSync(path)) {\n main.worktreeAdd(path, branch, `origin/${m.baseBranch}`);\n const wg = new Git(path);\n wg.repairSubmodules(ctx.repoRoot, ctx.log);\n return { wg, created: true };\n }\n const registered = main\n .run(['worktree', 'list', '--porcelain'])\n .split('\\n')\n .filter((l) => l.startsWith('worktree '))\n .map((l) => realpathOr(l.slice(9)));\n const real = realpathOr(path);\n const wg = new Git(path);\n const topLevel = wg.tryRun(['rev-parse', '--show-toplevel']);\n if (\n !registered.includes(real) ||\n topLevel.code !== 0 ||\n realpathOr(topLevel.out.trim()) !== real ||\n wg.isMainCheckout()\n ) {\n throw new WorkkitError(\n 'WORKTREE_INVALID',\n `${path} exists but is not this repository's worktree for ${effortLabel(area, task)} (a leftover directory?); move it away, or \\`git worktree prune\\` and retry`,\n { worktree: path },\n );\n }\n wg.repairSubmodules(ctx.repoRoot, ctx.log);\n const current = wg.currentBranch();\n if (current !== branch) {\n if (wg.isDirty())\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `${path} has uncommitted changes on ${current}; commit or park them before switching to ${branch}`,\n { worktree: path },\n );\n const unshipped = wg.commitsNotOn(m.baseBranch);\n if (unshipped.length > 0 && !wg.isEquivalentToBase(m.baseBranch)) {\n throw new WorkkitError(\n 'EFFORT_OPEN',\n `${current} holds ${unshipped.length} commit(s) not yet on ${m.baseBranch}: ship or finish it first, or --join it`,\n { branch: current, area },\n );\n }\n wg.checkout(branch, `origin/${m.baseBranch}`);\n if (\n !wg.isDirty() &&\n wg.commitsNotOn(m.baseBranch).length > 0 &&\n wg.isEquivalentToBase(m.baseBranch)\n ) {\n wg.run(['reset', '--hard', `origin/${m.baseBranch}`]);\n }\n } else if (\n !wg.isDirty() &&\n wg.commitsNotOn(m.baseBranch).length > 0 &&\n wg.isEquivalentToBase(m.baseBranch)\n ) {\n wg.run(['reset', '--hard', `origin/${m.baseBranch}`]);\n }\n return { wg, created: false };\n}\n\nfunction appendLog(file: string, line: string): void {\n appendFileSync(file, `${new Date().toISOString()} ${line}\\n`);\n}\n\n/** Refresh marks (e.g. db-reset) a start saw but could not act on, per worktree, until one can (spec §8.1 step 5). */\nconst PENDING_MARKS = '.pending-marks.json';\nfunction readPendingMarks(logDir: string): string[] {\n try {\n const raw = JSON.parse(readFileSync(join(logDir, PENDING_MARKS), 'utf8')) as unknown;\n return Array.isArray(raw) ? raw.filter((x): x is string => typeof x === 'string') : [];\n } catch {\n return [];\n }\n}\nfunction writePendingMarks(logDir: string, marks: string[]): void {\n mkdirSync(logDir, { recursive: true });\n writeFileSync(join(logDir, PENDING_MARKS), `${JSON.stringify(marks)}\\n`);\n}\n\nexport async function startEffort(ctx: Ctx, o: StartOptions): Promise<StartResult> {\n const m = ctx.manifest;\n // pre-flight (spec §8.4): expired leases and dead starts must not hold slots or areas\n await reapLeases(ctx).catch((err) =>\n ctx.log(`pre-flight reap: ${err instanceof Error ? err.message : String(err)}`),\n );\n fetchBaseOnce(ctx);\n const { branch, scopes, commons, warnings } = guardStart(ctx, o);\n const notices = ctx.registry.notices(m.project, o.area);\n\n let open = ctx.registry.openEffortFor(m.project, o.area, o.task);\n if (open && o.join) {\n const deadline = Date.now() + JOIN_WAIT_MS;\n while (open && open.state === 'starting' && Date.now() < deadline) {\n await sleep(200);\n open = ctx.registry.openEffortFor(m.project, o.area, o.task);\n }\n if (!open || open.state !== 'active') {\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `effort on ${effortLabel(o.area, o.task)} did not become active in time to join`,\n { area: o.area, task: o.task },\n );\n }\n if (!modeCovers(open.mode, o.mode)) {\n const label = effortLabel(o.area, o.task);\n throw new WorkkitError(\n 'MODE_MISMATCH',\n `open effort on ${label} is in ${open.mode} mode, which does not cover ${o.mode}; run \\`work promote --area ${o.area}${o.task ? ` --task ${o.task}` : ''} --mode fullstack\\` first`,\n { area: o.area, task: o.task, openMode: open.mode, requestedMode: o.mode },\n );\n }\n const currentLeases = ctx.registry.leases({ effort: open.id });\n if (o.story && !currentLeases.some((l) => l.kind === 'storybook')) {\n const hostRoot = storybookHostFor(m, open.worktree);\n const inst = await ctx.storybrokr.up(o.story, hostRoot, {\n ttlMinutes: Math.ceil(m.expiry.storybookHours * 60),\n });\n const sbLease = ctx.registry.addLease(\n 'storybook',\n m.project,\n inst.id,\n ctx.owner,\n open.id,\n m.expiry.storybookHours,\n { ports: { storybook: inst.port } },\n );\n open = ctx.registry.updateEffort(open.id, {\n leases: [...open.leases, sbLease.id],\n });\n }\n const existingParticipants = open.participants ?? [];\n const isAlreadyMember =\n open.owner.session === ctx.owner.session ||\n existingParticipants.some((p) => p.session === ctx.owner.session);\n if (!isAlreadyMember) {\n open = ctx.registry.updateEffort(open.id, {\n participants: [...existingParticipants, ctx.owner],\n });\n }\n touchEffort(ctx, open);\n return {\n effort: open,\n leases: ctx.registry.leases({ effort: open.id }),\n sync: 'skipped',\n refreshed: [],\n marks: [],\n joined: true,\n warnings,\n notices,\n };\n }\n\n const effort = reserveEffort(ctx, o, branch, scopes, commons);\n const leases: Lease[] = [];\n const abandon = async (stopPids: boolean) => {\n for (const l of ctx.registry.leases({ effort: effort.id })) {\n if (stopPids && l.kind === 'slot' && l.pids && Object.keys(l.pids).length > 0) {\n await ctx.runner\n .stop({\n m,\n cwd: effort.worktree,\n env: process.env,\n pids: l.pids,\n signatures: l.signatures,\n onLog: ctx.log,\n })\n .catch(() => undefined);\n } else if (stopPids && l.kind === 'storybook') {\n await ctx.storybrokr.down(String(l.value)).catch(() => undefined);\n }\n ctx.registry.release(l.id);\n }\n ctx.registry.removeEfforts((e) => e.id === effort.id);\n };\n const onSignal = () => {\n abandon(true).finally(() => process.exit(130));\n };\n process.once('SIGINT', onSignal);\n process.once('SIGTERM', onSignal);\n\n try {\n const { wg, created } = ensureWorktree(ctx, o.area, branch, o.task);\n const worktree = wg.root();\n ctx.registry.updateEffort(effort.id, { worktree });\n effort.worktree = worktree;\n const logDir = join(worktree, m.logs.dir);\n mkdirSync(logDir, { recursive: true });\n const refreshLog = join(logDir, 'refresh.log');\n const stampFile = join(logDir, '.refresh-stamps.json');\n\n if (created && m.seed && m.seed.length > 0) {\n runRefresh(\n m.seed,\n worktree,\n (l) => {\n appendLog(refreshLog, l);\n ctx.log(l);\n },\n { ...process.env, WORKTREE: worktree, MAIN_ROOT: ctx.repoRoot },\n );\n }\n\n let sync: StartResult['sync'] = 'skipped';\n let changed: string[] = [];\n if (o.sync !== false) {\n const r = wg.syncFrom(m.baseBranch);\n if (r.kind === 'conflict') {\n throw new WorkkitError(\n 'SYNC_CONFLICT',\n `merging origin/${m.baseBranch} into ${branch} conflicts in ${r.conflicted.join(', ')}; resolve in ${worktree}, commit, then rerun with --no-sync`,\n { conflicted: r.conflicted, worktree },\n );\n }\n sync = r.kind;\n if (r.kind === 'ff' || r.kind === 'merge') changed = wg.changedPaths(r.before, r.after);\n ctx.registry.pruneNoticesWhere(\n m.project,\n o.area,\n (n) => wg.isAncestor(`origin/${n.from}`, 'HEAD') || wg.isAncestor(n.from, 'HEAD'),\n );\n }\n const sel = selectRefresh(m.refresh, changed, { worktree, stampFile });\n runRefresh(\n sel.runs,\n worktree,\n (l) => {\n appendLog(refreshLog, l);\n ctx.log(l);\n },\n process.env,\n {\n stampFile,\n pendingStamps: sel.pendingStamps,\n restoreFiles: sel.cleanWhenFiles,\n },\n );\n\n const baseSha = wg.rev('HEAD');\n if (o.mode === 'frontend' && sel.marks.length > 0) {\n // no database in this mode: the marks stay owed until a start or promote that has one\n writePendingMarks(logDir, [...new Set([...readPendingMarks(logDir), ...sel.marks])]);\n }\n\n for (const name of commons)\n leases.push(\n ctx.registry.addLease(\n 'commons',\n m.project,\n name,\n ctx.owner,\n effort.id,\n m.expiry.commonsHours,\n ),\n );\n\n if (o.mode === 'fullstack' || o.mode === 'backend') {\n const slot = await claimFreeSlot(ctx, effort.id, warnings);\n leases.push(slot);\n const cfg = emitWorktreeConfig({\n m,\n worktree,\n slot: slot.value as number,\n ports: slot.ports ?? {},\n area: o.area,\n branch,\n });\n const env = { ...process.env, ...cfg.vars };\n const owedMarks = [...new Set([...sel.marks, ...readPendingMarks(logDir)])];\n if (owedMarks.includes('db-reset') && m.services.postgres?.reset) {\n runRefresh([m.services.postgres.reset], worktree, (l) => appendLog(refreshLog, l), env);\n writePendingMarks(\n logDir,\n owedMarks.filter((x) => x !== 'db-reset'),\n );\n }\n const pids: Record<string, number> = {};\n const signatures: Record<string, string> = {};\n const result = await ctx.runner.start({\n m,\n cwd: worktree,\n env,\n logDir,\n mode: o.mode,\n onLog: ctx.log,\n onSpawn: (service, pid, signature) => {\n pids[service] = pid;\n signatures[service] = signature;\n ctx.registry.patchLease(slot.id, { pids: { ...pids }, signatures: { ...signatures } });\n },\n });\n ctx.registry.patchLease(slot.id, {\n pids: result.pids,\n signatures: result.signatures ?? signatures,\n });\n } else {\n let storybookPort: number | undefined;\n if (o.story) {\n const hostRoot = storybookHostFor(m, worktree);\n const inst = await ctx.storybrokr.up(o.story, hostRoot, {\n ttlMinutes: Math.ceil(m.expiry.storybookHours * 60),\n });\n storybookPort = inst.port;\n leases.push(\n ctx.registry.addLease(\n 'storybook',\n m.project,\n inst.id,\n ctx.owner,\n effort.id,\n m.expiry.storybookHours,\n { ports: { storybook: inst.port } },\n ),\n );\n }\n emitWorktreeConfig({ m, worktree, ports: {}, storybookPort, area: o.area, branch });\n }\n\n const active = ctx.registry.updateEffort(effort.id, {\n state: 'active',\n baseSha,\n leases: leases.map((l) => l.id),\n lastActivity: now(),\n });\n return {\n effort: active,\n leases: ctx.registry.leases({ effort: effort.id }),\n sync,\n refreshed: sel.runs,\n marks: sel.marks,\n joined: false,\n warnings,\n notices,\n };\n } catch (err) {\n await abandon(true);\n throw err;\n } finally {\n process.off('SIGINT', onSignal);\n process.off('SIGTERM', onSignal);\n }\n}\n\n// ── promote ──────────────────────────────────────────────────────────────────\n\nexport interface PromoteOptions {\n area: string;\n task?: string;\n mode: 'backend' | 'fullstack';\n}\n\nexport interface PromoteResult {\n effort: Effort;\n leases: Lease[];\n startedServices: string[];\n warnings: string[];\n}\n\nexport async function promoteEffort(ctx: Ctx, o: PromoteOptions): Promise<PromoteResult> {\n const m = ctx.manifest;\n if (o.mode !== 'backend' && o.mode !== 'fullstack') {\n throw new WorkkitError('MODE_UNKNOWN', `promote target mode must be backend or fullstack`);\n }\n const open = ctx.registry.openEffortFor(m.project, o.area, o.task);\n if (!open) {\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `no open effort on ${effortLabel(o.area, o.task)} to promote`,\n { area: o.area, task: o.task },\n );\n }\n if (\n (open.mode === 'fullstack' && o.mode === 'backend') ||\n (open.mode === 'frontend' && o.mode === 'backend')\n ) {\n throw new WorkkitError(\n 'MODE_MISMATCH',\n `cannot transition effort on ${effortLabel(o.area, o.task)} from ${open.mode} to ${o.mode}`,\n { from: open.mode, to: o.mode },\n );\n }\n const modeScopes = expandScopes(m, o.area, o.mode);\n const nextScopes = open.task ? [...new Set([...open.scopes, ...modeScopes])] : modeScopes;\n const refuseOverlap = (r: { efforts: Effort[] }): void => {\n const others = r.efforts.filter(\n (e) =>\n e.project === m.project &&\n e.id !== open.id &&\n (e.state === 'active' || e.state === 'starting'),\n );\n for (const e of others) {\n const pairs = globsOverlap(nextScopes, e.scopes);\n if (pairs.length > 0) {\n const otherLabel = effortLabel(e.area, e.task);\n throw new WorkkitError(\n 'SCOPE_CONFLICT',\n `promoting ${effortLabel(o.area, o.task)} to ${o.mode} overlaps ${otherLabel} (${e.branch}): ${pairs.join('; ')}`,\n { with: otherLabel, owner: e.owner.session, effort: e.id, pairs },\n );\n }\n }\n };\n ctx.registry.update(refuseOverlap);\n\n // Claim the slot BEFORE the effort changes mode: a failed claim leaves it exactly as it was.\n const warnings: string[] = [];\n let slot = ctx.registry.leases({ effort: open.id, kind: 'slot' })[0];\n const sb = ctx.registry.leases({ effort: open.id, kind: 'storybook' })[0];\n const claimed = !slot;\n if (!slot) slot = await claimFreeSlot(ctx, open.id, warnings);\n try {\n ctx.registry.update((r) => {\n refuseOverlap(r);\n const idx = r.efforts.findIndex((e) => e.id === open.id);\n if (idx >= 0) {\n r.efforts[idx] = {\n ...r.efforts[idx],\n mode: o.mode,\n scopes: nextScopes,\n leases: claimed ? [...open.leases, slot.id] : r.efforts[idx].leases,\n lastActivity: now(),\n };\n }\n });\n } catch (err) {\n if (claimed) ctx.registry.release(slot.id);\n throw err;\n }\n // a database reset owed since a start without a database (W10)\n const owed = readPendingMarks(join(open.worktree, m.logs.dir));\n if (owed.includes('db-reset') && m.services.postgres?.reset) {\n const cfgForReset = emitWorktreeConfig({\n m,\n worktree: open.worktree,\n slot: slot.value as number,\n ports: slot.ports ?? {},\n area: o.area,\n branch: open.branch,\n });\n runRefresh([m.services.postgres.reset], open.worktree, ctx.log, {\n ...process.env,\n ...cfgForReset.vars,\n });\n writePendingMarks(\n join(open.worktree, m.logs.dir),\n owed.filter((x) => x !== 'db-reset'),\n );\n }\n const cfg = emitWorktreeConfig({\n m,\n worktree: open.worktree,\n slot: slot.value as number,\n ports: slot.ports ?? {},\n storybookPort: sb?.ports?.storybook,\n area: o.area,\n branch: open.branch,\n });\n const env = { ...process.env, ...cfg.vars };\n const logDir = join(open.worktree, m.logs.dir);\n mkdirSync(logDir, { recursive: true });\n\n const existingPids = { ...(slot.pids ?? {}) };\n const existingSigs = { ...(slot.signatures ?? {}) };\n const missingServices = Object.entries(m.services)\n .filter(([name, spec]) => serviceModes(name, spec).includes(o.mode) && !existingPids[name])\n .map(([name]) => name);\n\n if (missingServices.length > 0) {\n const result = await ctx.runner.start({\n m,\n cwd: open.worktree,\n env,\n logDir,\n mode: o.mode,\n onlyServices: missingServices,\n onLog: ctx.log,\n onSpawn: (service, pid, signature) => {\n existingPids[service] = pid;\n existingSigs[service] = signature;\n ctx.registry.patchLease(slot.id, {\n pids: { ...existingPids },\n signatures: { ...existingSigs },\n });\n },\n });\n ctx.registry.patchLease(slot.id, {\n pids: { ...existingPids, ...result.pids },\n signatures: { ...existingSigs, ...(result.signatures ?? {}) },\n });\n }\n\n const updated = ctx.registry.updateEffort(open.id, { lastActivity: now() });\n touchEffort(ctx, updated);\n return {\n effort: updated,\n leases: ctx.registry.leases({ effort: open.id }),\n startedServices: missingServices,\n warnings,\n };\n}\n\n// ── status / env ─────────────────────────────────────────────────────────────\n\nexport interface AreaStatus {\n area: string;\n effort?: Effort;\n leases: Lease[];\n /** commits on origin/<base> the area's branch does not have (0 without a worktree) */\n behindBase: number;\n notices: Notice[];\n worktree?: string;\n}\n\nexport interface StatusReport {\n project: string;\n areas: AreaStatus[];\n leases: Lease[];\n}\n\nfunction behindBase(ctx: Ctx, worktree: string): number {\n if (!existsSync(worktree)) return 0;\n return new Git(worktree).behindCount(ctx.manifest.baseBranch);\n}\n\n/** Every area of the project (or one), with its open effort, leases, drift from the base branch and notices. Asking about one area counts as activity on it. */\nexport function statusFor(ctx: Ctx, area?: string, task?: string): StatusReport {\n const m = ctx.manifest;\n fetchBaseOnce(ctx);\n const names = (area ? [area] : Object.keys(m.areas)).sort();\n const areas: AreaStatus[] = names.map((name) => {\n const effort = ctx.registry.openEffortFor(m.project, name, area ? task : undefined);\n if (effort && area) touchEffort(ctx, effort);\n const worktree = worktreePathFor(ctx, name, area ? task : undefined);\n const out: AreaStatus = {\n area: area && task ? `${name}--${task}` : name,\n leases: effort ? ctx.registry.leases({ effort: effort.id }) : [],\n behindBase: behindBase(ctx, worktree),\n notices: ctx.registry.notices(m.project, name),\n };\n if (effort) out.effort = effort;\n if (existsSync(worktree)) out.worktree = worktree;\n return out;\n });\n return { project: m.project, areas, leases: ctx.registry.leases({ project: m.project }) };\n}\n\n/** The slot-derived variables for a slot number alone: what a Makefile asks before any effort exists. */\nexport function slotEnv(m: Manifest, slot: number): Record<string, string> {\n return slotVars(m, { slot, ports: portsForSlot(m, slot) });\n}\n\n/** The variables the open effort's config was emitted with, plus MODE. Counts as activity. */\nexport function effortEnv(ctx: Ctx, area: string, task?: string): Record<string, string> {\n const m = ctx.manifest;\n const effort = ctx.registry.openEffortFor(m.project, area, task);\n if (!effort)\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `no open effort on ${effortLabel(area, task)}; \\`work start --area ${area} …\\` first`,\n { area, task },\n );\n touchEffort(ctx, effort);\n const slot = ctx.registry.leases({ effort: effort.id, kind: 'slot' })[0];\n const sb = ctx.registry.leases({ effort: effort.id, kind: 'storybook' })[0];\n const vars = slotVars(m, {\n slot: slot ? (slot.value as number) : undefined,\n ports: slot?.ports ?? {},\n storybookPort: sb?.ports?.storybook,\n area,\n branch: effort.branch,\n worktree: effort.worktree,\n logDir: join(effort.worktree, m.logs.dir),\n });\n return { ...vars, MODE: effort.mode };\n}\n\n// ── finish / reap ────────────────────────────────────────────────────────────\n\nfunction leaseEnv(ctx: Ctx, effort: Effort, lease: Lease): NodeJS.ProcessEnv {\n const vars = slotVars(ctx.manifest, {\n slot: lease.kind === 'slot' ? (lease.value as number) : undefined,\n ports: lease.ports ?? {},\n area: effort.area,\n branch: effort.branch,\n worktree: effort.worktree,\n logDir: join(effort.worktree, ctx.manifest.logs.dir),\n });\n return { ...process.env, ...vars };\n}\n\n/** Stop what a lease started (and only that), bring its Storybook down, release it. Without the worktree the stop commands are skipped but the pids are still signalled. */\nasync function releaseLease(ctx: Ctx, effort: Effort | undefined, lease: Lease): Promise<void> {\n try {\n if (lease.kind === 'slot' && lease.pids && Object.keys(lease.pids).length > 0) {\n const hasWorktree = effort !== undefined && existsSync(effort.worktree);\n await ctx.runner.stop({\n m: ctx.manifest,\n cwd: hasWorktree && effort ? effort.worktree : ctx.repoRoot,\n env: effort ? leaseEnv(ctx, effort, lease) : process.env,\n pids: lease.pids,\n signatures: lease.signatures,\n skipStopCommands: !hasWorktree,\n onLog: ctx.log,\n });\n } else if (lease.kind === 'storybook') {\n await ctx.storybrokr.down(String(lease.value));\n }\n } catch (err) {\n ctx.log(\n `while releasing ${lease.kind} ${lease.value}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n ctx.registry.release(lease.id);\n}\n\n/** Bring every storybrokr instance of the worktree's host down: never for a backend effort (no Storybook, and the CLI would start a daemon), and a failure is logged, not swallowed. */\nasync function sweepStorybook(ctx: Ctx, effort: Pick<Effort, 'worktree' | 'mode'>): Promise<void> {\n if (effort.mode === 'backend' || !ctx.storybrokr.downHost) return;\n try {\n const stopped = await ctx.storybrokr.downHost(storybookHostFor(ctx.manifest, effort.worktree));\n if (stopped.length > 0) ctx.log(`storybrokr: stopped ${stopped.join(', ')}`);\n } catch (err) {\n ctx.log(`storybrokr sweep failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n/** Tell every other area that a commons set changed on this branch (informational only, kept until the area is retired or synced). */\nfunction leaveNotices(ctx: Ctx, effort: Effort, commons: string[]): number {\n if (commons.length === 0) return 0;\n const notice: Notice = {\n from: effort.branch,\n text: `commons ${commons.join(', ')} changed on ${effort.branch}: sync and re-verify`,\n at: now(),\n };\n let count = 0;\n for (const area of Object.keys(ctx.manifest.areas)) {\n if (area === effort.area) continue;\n ctx.registry.addNotice(ctx.manifest.project, area, notice);\n count++;\n }\n return count;\n}\n\nexport interface FinishOptions {\n area: string;\n task?: string;\n park?: boolean;\n intoArea?: boolean;\n force?: boolean;\n}\n\nexport interface FinishResult {\n effort: Effort;\n pushed: boolean;\n parked: boolean;\n mergedIntoArea?: boolean;\n left?: boolean;\n notices: number;\n}\n\n/** Stop the runner, release every lease, push the branch (or merge --into-area), leave notices; area worktrees stay, task worktrees are cleaned up. */\nexport async function finishEffort(ctx: Ctx, o: FinishOptions): Promise<FinishResult> {\n const m = ctx.manifest;\n const effort =\n ctx.registry.openEffortFor(m.project, o.area, o.task) ??\n ctx.registry\n .efforts({ project: m.project, area: o.area, state: 'parked' })\n .filter((e) => (e.task ?? undefined) === (o.task ?? undefined))\n .sort((a, b) => b.started.localeCompare(a.started))[0];\n if (!effort)\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n `no open or parked effort on ${effortLabel(o.area, o.task)}`,\n { area: o.area, task: o.task },\n );\n\n if (!o.force && effort.participants && effort.participants.length > 0) {\n if (ctx.owner.session === effort.owner.session) {\n const [nextOwner, ...rest] = effort.participants;\n const updated = ctx.registry.updateEffort(effort.id, {\n owner: nextOwner,\n participants: rest,\n lastActivity: now(),\n });\n touchEffort(ctx, updated);\n return { effort: updated, pushed: false, parked: false, left: true, notices: 0 };\n }\n if (effort.participants.some((p) => p.session === ctx.owner.session)) {\n const updated = ctx.registry.updateEffort(effort.id, {\n participants: effort.participants.filter((p) => p.session !== ctx.owner.session),\n lastActivity: now(),\n });\n touchEffort(ctx, updated);\n return { effort: updated, pushed: false, parked: false, left: true, notices: 0 };\n }\n }\n\n const label = effortLabel(effort.area, effort.task);\n const g = new Git(effort.worktree);\n let parked = false;\n if (g.isDirty()) {\n if (!o.park) {\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `${effort.worktree} has uncommitted changes: commit them, or \\`work finish --park\\` to commit them as wip(${label}) and push`,\n { worktree: effort.worktree },\n );\n }\n g.run(['add', '-A']);\n g.run(['commit', '-q', '-m', `wip(${label}): parked ${now()}`]);\n parked = true;\n }\n\n if (o.intoArea) {\n if (!effort.task) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n '--into-area requires a task sub-effort (--task <slug>)',\n { area: effort.area },\n );\n }\n fetchBaseOnce(ctx);\n const parentBranch = areaBranchFor(ctx, effort.area, effort.type);\n const { wg: areaGit } = ensureWorktree(ctx, effort.area, parentBranch);\n if (areaGit.isDirty()) {\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `parent area worktree ${areaGit.cwd} has uncommitted changes; commit or clean it before merging task ${effort.branch} --into-area`,\n { worktree: areaGit.cwd },\n );\n }\n const merged = areaGit.tryRun(['merge', '--no-edit', '-q', effort.branch]);\n if (merged.code !== 0) {\n const conflicted = areaGit\n .tryRun(['diff', '--name-only', '--diff-filter=U'])\n .out.split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n areaGit.tryRun(['merge', '--abort']);\n throw new WorkkitError(\n 'SYNC_CONFLICT',\n `merging ${effort.branch} into ${parentBranch} conflicts in ${conflicted.join(', ')}; resolve in ${effort.worktree} before retrying \\`work finish --into-area\\``,\n { conflicted, worktree: areaGit.cwd },\n );\n }\n }\n\n // Push first: a rejected push must leave the services running and the leases held,\n // so the effort can be synced and finished again instead of standing active with nothing.\n // A branch with no commits of its own that is not on origin yet is not pushed: an empty\n // remote branch is noise for GitHub and for the next retire.\n fetchBaseOnce(ctx);\n const shouldPush =\n !o.intoArea && (g.ownCommitCount(m.baseBranch) > 0 || g.remoteBranchExists(effort.branch));\n if (shouldPush) {\n try {\n g.push(effort.branch);\n } catch (err) {\n throw new WorkkitError(\n 'PUSH_REJECTED',\n `push of ${effort.branch} was rejected (${err instanceof Error ? err.message : String(err)}); nothing was stopped or released. Merge origin/${effort.branch} into the worktree and run \\`work finish\\` again.`,\n { branch: effort.branch, worktree: effort.worktree },\n );\n }\n }\n\n for (const lease of ctx.registry.leases({ effort: effort.id }))\n await releaseLease(ctx, effort, lease);\n await sweepStorybook(ctx, effort);\n\n let notices = 0;\n if (!o.intoArea) {\n if (g.commitsNotOn(m.baseBranch).length > 0 && !g.isEquivalentToBase(m.baseBranch)) {\n const since = g.changedSince(m.baseBranch);\n const sinceSet = new Set(since);\n const changed = effort.baseSha\n ? g.changedPaths(effort.baseSha, 'HEAD').filter((p) => sinceSet.has(p))\n : since;\n notices = leaveNotices(ctx, effort, commonsTouched(m, changed));\n }\n }\n\n if (effort.task) {\n archiveWorktree(ctx, label, effort.worktree);\n const main = new Git(ctx.repoRoot);\n main.worktreeRemove(effort.worktree);\n if (o.intoArea) {\n main.deleteLocalBranch(effort.branch);\n }\n const finished: Effort = { ...effort, state: 'finished', lastActivity: now() };\n ctx.registry.removeEfforts((e) => e.id === effort.id);\n return {\n effort: finished,\n pushed: shouldPush,\n parked,\n mergedIntoArea: Boolean(o.intoArea),\n notices,\n };\n }\n\n const finished = ctx.registry.updateEffort(effort.id, { state: 'finished', lastActivity: now() });\n return { effort: finished, pushed: shouldPush, parked, notices };\n}\n\n/** Expire idle efforts as a whole: when any lease is expired (or garbage) every lease of that effort is released and the effort parked. */\nexport async function reapLeases(\n ctx: Ctx,\n o: { dryRun?: boolean; now?: Date } = {},\n): Promise<{ reaped: Lease[] }> {\n const m = ctx.manifest;\n const at = o.now ?? new Date();\n const efforts = new Map(ctx.registry.efforts({ project: m.project }).map((e) => [e.id, e]));\n const leases = ctx.registry.leases({ project: m.project });\n const doomed = new Set<string>();\n for (const l of leases) {\n const effort = efforts.get(l.effort);\n // a start in progress is never reaped; a start that died is, once real time has moved on\n if (effort?.state === 'starting' && Date.now() - Date.parse(effort.started) < STARTING_GRACE_MS)\n continue;\n const expired = Date.parse(l.expires) < at.getTime();\n const orphaned = !effort || !existsSync(effort.worktree);\n const garbage = orphaned && !(await anyPortAnswers(l.ports));\n if (expired || garbage) doomed.add(l.effort);\n }\n // A start that died before its first lease leaves a `starting` effort nothing\n // above can reach (reap walks leases); past the grace period it is parked too.\n for (const e of efforts.values()) {\n if (e.state !== 'starting' || doomed.has(e.id)) continue;\n if (leases.some((l) => l.effort === e.id)) continue;\n if (Date.now() - Date.parse(e.started) < STARTING_GRACE_MS) continue;\n doomed.add(e.id);\n }\n const reaped = leases.filter((l) => doomed.has(l.effort));\n if (o.dryRun) return { reaped };\n for (const lease of reaped) await releaseLease(ctx, efforts.get(lease.effort), lease);\n for (const id of doomed) {\n const effort = efforts.get(id);\n if (effort) {\n await sweepStorybook(ctx, effort);\n if (effort.state === 'active' || effort.state === 'starting') {\n const hadLease = leases.some((l) => l.effort === effort.id);\n ctx.registry.updateEffort(effort.id, {\n state: 'parked',\n parkedReason: hadLease\n ? `idle: a lease expired by ${at.toISOString()}`\n : `start died before its first lease (started ${effort.started})`,\n lastActivity: now(),\n });\n }\n }\n }\n return { reaped };\n}\n\n// ── retire / audit ───────────────────────────────────────────────────────────\n\nexport const ARCHIVE_DIR = '.slot-archive';\n\nfunction dirSize(path: string): number {\n if (!existsSync(path)) return 0;\n let total = 0;\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n const p = join(path, entry.name);\n total += entry.isDirectory() ? dirSize(p) : statSync(p).size;\n }\n return total;\n}\n\n/** `.slot-archive/<area>/<UTC to the second>/<path>`; retention runs only inside the area's own directory. */\nfunction archiveWorktree(ctx: Ctx, area: string, worktree: string): string[] {\n const m = ctx.manifest;\n const areaRoot = join(ctx.repoRoot, ARCHIVE_DIR, area);\n const stamp = now().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);\n const target = join(areaRoot, stamp);\n const archived: string[] = [];\n for (const rel of m.archive.paths) {\n const src = join(worktree, rel);\n if (!existsSync(src)) continue;\n const dst = join(target, rel);\n mkdirSync(dirname(dst), { recursive: true });\n cpSync(src, dst, { recursive: true });\n archived.push(dst);\n }\n if (archived.length > 0) ensureExcluded(ctx.repoRoot, [`${ARCHIVE_DIR}/`]);\n if (existsSync(areaRoot)) {\n const stamps = readdirSync(areaRoot, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort()\n .reverse();\n const cutoff = Date.now() - m.archive.keepDays * 86_400_000;\n stamps.forEach((d, i) => {\n const t = statSync(join(areaRoot, d)).mtimeMs;\n if (i >= m.archive.keepPerArea || t < cutoff)\n rmSync(join(areaRoot, d), { recursive: true, force: true });\n });\n }\n return archived;\n}\n\nexport interface RetireResult {\n archived: string[];\n removed: string;\n branchesDeleted: string[];\n branchesKept: string[];\n}\n\n/** The only destructive verb: archive, remove the worktree, delete the local branches that are fully on origin or already in the base. */\nexport async function retireArea(ctx: Ctx, o: { area: string }): Promise<RetireResult> {\n const m = ctx.manifest;\n if (!m.areas[o.area])\n throw new WorkkitError('AREA_UNKNOWN', `unknown area \"${o.area}\"`, { area: o.area });\n const open = ctx.registry\n .efforts({ project: m.project, area: o.area })\n .find((e) => e.state === 'starting' || e.state === 'active');\n if (open)\n throw new WorkkitError(\n 'EFFORT_OPEN',\n `an effort is open on ${effortLabel(open.area, open.task)} (${open.owner.session}); \\`work finish\\` it first`,\n { owner: open.owner.session },\n );\n const worktree = realpathOr(worktreePathFor(ctx, o.area));\n const main = new Git(ctx.repoRoot);\n let archived: string[] = [];\n if (existsSync(worktree)) {\n const g = new Git(worktree);\n if (g.isDirty())\n throw new WorkkitError(\n 'UNPUSHED',\n `${worktree} has uncommitted changes; commit and push them (or \\`work finish --park\\`) before retiring`,\n { worktree },\n );\n const unpushed = g.unpushedCount(m.baseBranch);\n if (unpushed > 0)\n throw new WorkkitError(\n 'UNPUSHED',\n `${g.currentBranch()} has ${unpushed} commit(s) not on origin; push before retiring`,\n { worktree, unpushed },\n );\n // only now, after every refusal: sweep Storybook if any effort of the area could have had one\n const hadStorybook = ctx.registry\n .efforts({ project: m.project, area: o.area })\n .some((e) => e.mode !== 'backend');\n if (hadStorybook) await sweepStorybook(ctx, { worktree, mode: 'frontend' });\n archived = archiveWorktree(ctx, o.area, worktree);\n main.worktreeRemove(worktree);\n }\n const branchesDeleted: string[] = [];\n const branchesKept: string[] = [];\n const allAreaBranches = m.branch.types.map((type) => `${type}/${o.area}`);\n fetchBaseOnce(ctx);\n for (const branch of allAreaBranches) {\n if (!main.branchExists(branch)) continue;\n // safe to drop when origin has every commit, or when the base already contains the work\n // (merged, squash-merged, or no work at all) and GitHub has removed the remote branch\n const onOrigin =\n main.remoteBranchExists(branch) &&\n main.tryRun(['rev-list', '--count', `origin/${branch}..${branch}`]).out.trim() === '0';\n const mergedIntoBase = !onOrigin && main.branchMergedInto(branch, m.baseBranch);\n if (onOrigin || mergedIntoBase) {\n main.deleteLocalBranch(branch);\n branchesDeleted.push(branch);\n } else branchesKept.push(branch);\n }\n ctx.registry.removeEfforts((e) => e.project === m.project && e.area === o.area);\n ctx.registry.clearNotices(m.project, o.area);\n ctx.registry.clearNoticesFrom(m.project, allAreaBranches);\n return { archived, removed: worktree, branchesDeleted, branchesKept };\n}\n\n// ── pr ───────────────────────────────────────────────────────────────────────\n\nexport interface PrOptions {\n area?: string;\n task?: string;\n /** Used when no area is given: the effort whose worktree contains this directory. */\n cwd?: string;\n draft?: boolean;\n title?: string;\n body?: string;\n bodyFile?: string;\n /** Open a new PR when the stored one is no longer open. */\n force?: boolean;\n}\n\nexport interface PrResult {\n effort: Effort;\n pr: PrRecord;\n created: boolean;\n behindBase: number;\n warnings: string[];\n}\n\n/** The open or parked effort whose worktree contains `cwd` (never the main checkout). */\nfunction effortAt(ctx: Ctx, cwd: string): Effort | undefined {\n const top = new Git(cwd).tryRun(['rev-parse', '--show-toplevel']);\n if (top.code !== 0) return undefined;\n const root = realpathOr(top.out.trim());\n return ctx.registry\n .efforts({ project: ctx.manifest.project })\n .filter((e) => e.state === 'active' || e.state === 'starting' || e.state === 'parked')\n .sort((a, b) => b.lastActivity.localeCompare(a.lastActivity))\n .find((e) => realpathOr(e.worktree) === root);\n}\n\n/**\n * Open (or adopt) the effort's pull request through pritty (spec §18.3): push first so the\n * branch is on origin whatever pritty does next, reuse a stored PR that is still open, refuse\n * when it was closed unless --force, store the result on the effort.\n */\nexport async function prEffort(ctx: Ctx, o: PrOptions): Promise<PrResult> {\n const m = ctx.manifest;\n assertPrittyVersion(ctx.pritty);\n const effort = o.area\n ? (ctx.registry.openEffortFor(m.project, o.area, o.task) ??\n ctx.registry\n .efforts({ project: m.project, area: o.area, state: 'parked' })\n .filter((e) => (e.task ?? undefined) === (o.task ?? undefined))\n .sort((a, b) => b.started.localeCompare(a.started))[0])\n : effortAt(ctx, o.cwd ?? process.cwd());\n if (!effort) {\n throw new WorkkitError(\n 'EFFORT_NOT_FOUND',\n o.area\n ? `no open or parked effort on ${effortLabel(o.area, o.task)}`\n : `${o.cwd ?? process.cwd()} is not inside an effort's worktree; pass the area`,\n { area: o.area, task: o.task },\n );\n }\n const label = effortLabel(effort.area, effort.task);\n const g = new Git(effort.worktree);\n if (g.isDirty()) {\n throw new WorkkitError(\n 'DIRTY_WORKTREE',\n `${effort.worktree} has uncommitted changes: commit them, or \\`work finish --park\\` to commit them as wip(${label}) and push`,\n { worktree: effort.worktree },\n );\n }\n fetchBaseOnce(ctx);\n const warnings: string[] = [];\n if (!g.hasUpstream() || g.unpushedCount(m.baseBranch) > 0) {\n try {\n g.push(effort.branch);\n } catch (err) {\n throw new WorkkitError(\n 'PUSH_REJECTED',\n `push of ${effort.branch} was rejected (${err instanceof Error ? err.message : String(err)}); merge origin/${effort.branch} into the worktree and run \\`work pr\\` again`,\n { branch: effort.branch, worktree: effort.worktree },\n );\n }\n }\n const behind = g.behindCount(m.baseBranch);\n if (behind > BEHIND_LIMIT) {\n warnings.push(\n `${effort.branch} is ${behind} commits behind ${m.baseBranch}; consider merging origin/${m.baseBranch} before review`,\n );\n }\n const given = o.title !== undefined || o.body !== undefined || o.bodyFile !== undefined;\n const store = (pr: PrRecord): Effort => {\n const updated = ctx.registry.updateEffort(effort.id, { pr, lastActivity: now() });\n touchEffort(ctx, updated);\n return updated;\n };\n\n if (effort.pr) {\n const { open, last } = await ctx.pritty.check({ cwd: effort.worktree, base: m.baseBranch });\n if (open) {\n if (!given) {\n return { effort: store(open), pr: open, created: false, behindBase: behind, warnings };\n }\n const updated = await ctx.pritty.pr({\n cwd: effort.worktree,\n base: m.baseBranch,\n draft: o.draft,\n title: o.title,\n body: o.body,\n bodyFile: o.bodyFile,\n });\n const pr = { number: updated.number, url: updated.url, draft: updated.draft };\n return { effort: store(pr), pr, created: false, behindBase: behind, warnings };\n }\n if (!o.force) {\n const fate =\n last?.number === effort.pr.number\n ? last.state === 'MERGED'\n ? 'was merged'\n : 'was closed without merging'\n : 'is no longer open';\n throw new WorkkitError(\n 'PR_CLOSED',\n `PR #${effort.pr.number} for ${label} ${fate} (${effort.pr.url}); pass --force to open a new one`,\n { pr: effort.pr, state: last?.state },\n );\n }\n }\n\n const res = await ctx.pritty.pr({\n cwd: effort.worktree,\n base: m.baseBranch,\n draft: o.draft,\n title: o.title,\n body: o.body,\n bodyFile: o.bodyFile,\n });\n const pr = { number: res.number, url: res.url, draft: res.draft };\n return { effort: store(pr), pr, created: res.created, behindBase: behind, warnings };\n}\n\nexport type FindingKind =\n | 'dirty'\n | 'unpushed'\n | 'foreign-branch'\n | 'lease-aging'\n | 'behind-base'\n | 'notice-stale'\n | 'archive-size';\nexport interface Finding {\n kind: FindingKind;\n area?: string;\n detail: string;\n}\n\nconst BEHIND_LIMIT = 20;\nconst NOTICE_STALE_MS = 7 * 86_400_000;\nconst ARCHIVE_LIMIT_BYTES = 5 * 1024 ** 3;\n\nfunction registeredWorktrees(ctx: Ctx): { path: string; branch: string }[] {\n const out: { path: string; branch: string }[] = [];\n const porcelain = new Git(ctx.repoRoot).run(['worktree', 'list', '--porcelain']);\n let current: { path: string; branch: string } | null = null;\n for (const line of porcelain.split('\\n')) {\n if (line.startsWith('worktree ')) current = { path: line.slice(9), branch: '' };\n else if (line.startsWith('branch ') && current)\n current.branch = line.slice(7).replace(/^refs\\/heads\\//, '');\n else if (line === '' && current) {\n out.push(current);\n current = null;\n }\n }\n if (current) out.push(current);\n const wtRoot = join(realpathOr(ctx.repoRoot), ctx.manifest.worktreeRoot);\n return out.filter((w) => existsSync(w.path) && realpathOr(w.path).startsWith(wtRoot));\n}\n\n/** What would otherwise be forgotten: unsaved work, stray checkouts, aging leases, drift, stale notices, archive bulk. */\nexport async function auditProject(ctx: Ctx): Promise<Finding[]> {\n const m = ctx.manifest;\n fetchBaseOnce(ctx);\n const findings: Finding[] = [];\n const types = m.branch.types.join('|');\n const areaOf = (branch: string): string | null => {\n const match = new RegExp(`^(${types})/(.+?)(?:--([a-z0-9][a-z0-9_-]*))?$`).exec(branch);\n return match && m.areas[match[2]] ? match[2] : null;\n };\n for (const w of registeredWorktrees(ctx)) {\n const area = areaOf(w.branch);\n if (!area) {\n findings.push({\n kind: 'foreign-branch',\n detail: `${w.path} is on \"${w.branch || 'detached HEAD'}\", not a <type>/<area> branch of a declared area`,\n });\n continue;\n }\n const g = new Git(w.path);\n if (g.isDirty())\n findings.push({\n kind: 'dirty',\n area,\n detail: `${w.path} has uncommitted changes on ${w.branch}`,\n });\n const unpushed = g.unpushedCount(m.baseBranch);\n if (unpushed > 0)\n findings.push({\n kind: 'unpushed',\n area,\n detail: `${w.branch} has ${unpushed} commit(s) not on origin`,\n });\n const behind = behindBase(ctx, w.path);\n if (behind > BEHIND_LIMIT)\n findings.push({\n kind: 'behind-base',\n area,\n detail: `${w.branch} is ${behind} commits behind ${m.baseBranch}`,\n });\n }\n const nowMs = Date.now();\n for (const l of ctx.registry.leases({ project: m.project })) {\n const half = (Date.parse(l.touched) + Date.parse(l.expires)) / 2;\n if (nowMs > half)\n findings.push({\n kind: 'lease-aging',\n detail: `${l.kind} ${l.value} held by ${l.owner.session}, last used ${l.touched}, expires ${l.expires}`,\n });\n }\n for (const area of Object.keys(m.areas)) {\n for (const n of ctx.registry.notices(m.project, area)) {\n if (nowMs - Date.parse(n.at) > NOTICE_STALE_MS)\n findings.push({ kind: 'notice-stale', area, detail: `${n.text} (since ${n.at})` });\n }\n }\n const bytes = dirSize(join(ctx.repoRoot, ARCHIVE_DIR));\n if (bytes > ARCHIVE_LIMIT_BYTES)\n findings.push({\n kind: 'archive-size',\n detail: `${ARCHIVE_DIR} holds ${(bytes / 1024 ** 3).toFixed(1)} GB`,\n });\n return findings;\n}\n","import chalk from 'chalk';\nimport { exitCodeFor, toErrorBody } from '../../core/index.js';\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\n/** Print a failure the way every surface agrees on, then exit 2 (refused) or 1 (broken). */\nexport function fail(err: unknown, json: boolean): never {\n const body = toErrorBody(err);\n if (json) console.error(JSON.stringify(body));\n else {\n console.error(chalk.red(`${body.code}: ${body.message}`));\n if (body.details) console.error(chalk.gray(` ${JSON.stringify(body.details)}`));\n }\n process.exit(exitCodeFor(body.code));\n}\n\nexport function warn(line: string): void {\n console.error(chalk.yellow(`! ${line}`));\n}\n","import type { Command } from 'commander';\nimport { WorkkitError } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport { effortEnv, slotEnv } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerEnv(program: Command): void {\n program\n .command('env')\n .description(\"The slot-derived variables of an area's open effort, or of a slot number alone\")\n .option('--area <area>', 'the area whose open effort to read')\n .option('--task <slug>', 'intra-area task slug')\n .option(\n '--slot <n>',\n 'compute the variables for this slot from the manifest alone',\n (v: string) => Number(v),\n )\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print as JSON (default: KEY=value lines)')\n .option('--sh', 'print KEY=value lines (the default)')\n .action(\n async (o: {\n area?: string;\n task?: string;\n slot?: number;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: true });\n let vars: Record<string, string>;\n if (o.area) vars = effortEnv(ctx, o.area, o.task);\n else if (o.slot !== undefined && Number.isInteger(o.slot))\n vars = slotEnv(ctx.manifest, o.slot);\n else throw new WorkkitError('EFFORT_NOT_FOUND', 'pass --area <area> or --slot <n>');\n if (o.json) printJson(vars);\n else for (const [k, v] of Object.entries(vars)) console.log(`${k}=${v}`);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { finishEffort } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerFinish(program: Command): void {\n program\n .command('finish')\n .description(\n \"Stop the effort's runner, release its leases, push its branch (or merge --into-area); area worktrees stay, task worktrees are cleaned up\",\n )\n .requiredOption('--area <area>', 'the area whose open effort to finish')\n .option('--task <slug>', 'finish an intra-area task sub-effort')\n .option('--park', 'commit uncommitted changes as wip(<area>) instead of refusing')\n .option('--into-area', 'merge task branch into <type>/<area> instead of pushing to origin')\n .option('--force', 'stop and finish even if other joined participants remain')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (o: {\n area: string;\n task?: string;\n park?: boolean;\n intoArea?: boolean;\n force?: boolean;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await finishEffort(ctx, {\n area: o.area,\n task: o.task,\n park: o.park,\n intoArea: o.intoArea,\n force: o.force,\n });\n if (o.json) printJson(r);\n else {\n const label = r.effort.task ? `${r.effort.area}--${r.effort.task}` : r.effort.area;\n if (r.left) {\n console.log(`${chalk.bold(label)}: left shared effort (other participants remain)`);\n } else if (r.mergedIntoArea) {\n console.log(\n `${chalk.bold(label)} finished: ${r.effort.branch} merged into ${r.effort.type}/${r.effort.area}`,\n );\n } else {\n console.log(\n `${chalk.bold(label)} finished: ${r.effort.branch} pushed${r.parked ? ' (uncommitted changes parked as wip)' : ''}`,\n );\n }\n if (r.notices) console.log(` ${r.notices} area(s) told about commons changes`);\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import { readFileSync, realpathSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport {\n checkCommit,\n checkPush,\n currentOwner,\n Git,\n homeDir,\n installHooks,\n loadManifest,\n Registry,\n WorkkitError,\n} from '../core/index.js';\nimport { fail, printJson } from './_shared/output.js';\n\nconst ZEROS = /^0+$/;\n\n/** A hook must never break a repo that stopped using the tool: no manifest → nothing to check. */\nasync function hookContext(cwd: string) {\n const git = new Git(cwd);\n const repoRoot = git.mainRoot();\n try {\n const manifest = await loadManifest(repoRoot);\n return { git, repoRoot, manifest, registry: Registry.open(homeDir()) };\n } catch (err) {\n if (err instanceof WorkkitError && err.code === 'MANIFEST_NOT_FOUND') return null;\n throw err;\n }\n}\n\nexport async function runPreCommit(cwd: string): Promise<number> {\n const c = await hookContext(cwd);\n if (!c) return 0;\n const root = c.git.root();\n touchByWorktree(c.registry, c.manifest, root);\n const { refusals, warnings } = checkCommit({\n m: c.manifest,\n registry: c.registry,\n git: c.git,\n project: c.manifest.project,\n branch: c.git.currentBranch(),\n stagedPaths: c.git.changedPathsStaged(),\n ownerSession: currentOwner().session,\n checkoutRoot: root,\n });\n for (const w of warnings) console.error(chalk.yellow(`work: ${w}`));\n for (const r of refusals) console.error(chalk.red(`work: ${r}`));\n return refusals.length ? 2 : 0;\n}\n\n/** stdin carries `<local ref> <local sha> <remote ref> <remote sha>` per ref being pushed. */\nexport async function runPrePush(cwd: string, stdin: string): Promise<number> {\n const c = await hookContext(cwd);\n if (!c) return 0;\n touchByWorktree(c.registry, c.manifest, c.git.root());\n let code = 0;\n for (const line of stdin.split('\\n').filter(Boolean)) {\n const [localRef, localSha, remoteRef, remoteSha] = line.split(/\\s+/);\n if (!localRef || !localSha || !remoteRef) continue;\n const isDelete = ZEROS.test(localSha);\n const branch = isDelete ? '' : localRef.replace(/^refs\\/heads\\//, '');\n let changed: string[] = [];\n if (!isDelete) {\n const from =\n remoteSha && !ZEROS.test(remoteSha) ? remoteSha : `origin/${c.manifest.baseBranch}`;\n const range =\n remoteSha && !ZEROS.test(remoteSha) ? `${from}..${localSha}` : `${from}...${localSha}`;\n changed = c.git\n .tryRun(['diff', '--name-only', '--no-renames', range])\n .out.split('\\n')\n .filter(Boolean);\n }\n const { refusals, warnings } = checkPush({\n m: c.manifest,\n registry: c.registry,\n git: c.git,\n project: c.manifest.project,\n branch,\n remoteRef,\n isDelete,\n changedPaths: changed,\n });\n for (const w of warnings) console.error(chalk.yellow(`work: ${w}`));\n for (const r of refusals) console.error(chalk.red(`work: ${r}`));\n if (refusals.length) code = 2;\n }\n return code;\n}\n\n/** A commit or push from an effort's worktree is activity on that effort. */\nfunction touchByWorktree(\n registry: Registry,\n m: {\n project: string;\n expiry: { slotHours: number; commonsHours: number; storybookHours: number };\n },\n root: string,\n): void {\n const same = (p: string) => {\n try {\n return realpathSync(p) === realpathSync(root);\n } catch {\n return false;\n }\n };\n const hours = {\n slot: m.expiry.slotHours,\n storybook: m.expiry.storybookHours,\n commons: m.expiry.commonsHours,\n };\n for (const e of registry.efforts({ project: m.project })) {\n if ((e.state !== 'active' && e.state !== 'starting') || !same(e.worktree)) continue;\n for (const l of registry.leases({ effort: e.id })) registry.touch(l.id, hours[l.kind]);\n registry.updateEffort(e.id, { lastActivity: new Date().toISOString() });\n }\n}\n\nexport function registerHook(program: Command): void {\n const hook = program.command('hook').description('Entry points the installed git hooks call');\n hook\n .command('pre-commit')\n .description('Refuse commits on protected branches and writes under write-locked commons')\n .action(async () => {\n try {\n process.exit(await runPreCommit(process.cwd()));\n } catch (err) {\n fail(err, false);\n }\n });\n hook\n .command('pre-push')\n .description(\n 'Refuse pushes to protected branches; warn when paths leave the effort scope or touch commons',\n )\n .argument('[remote]', 'passed by git, unused')\n .argument('[url]', 'passed by git, unused')\n .action(async () => {\n try {\n const stdin = process.stdin.isTTY ? '' : readFileSync(0, 'utf8');\n process.exit(await runPrePush(process.cwd(), stdin));\n } catch (err) {\n fail(err, false);\n }\n });\n\n const hooks = program.command('hooks').description('Manage the git hooks in a clone');\n hooks\n .command('install')\n .description(\n \"Write .helmsmith/hooks and point this clone's core.hooksPath at them (for a repo whose manifest already exists)\",\n )\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(async (o: { projectRoot?: string; json?: boolean }) => {\n try {\n const repoRoot = o.projectRoot ? resolve(o.projectRoot) : new Git(process.cwd()).mainRoot();\n const manifest = await loadManifest(repoRoot);\n const out = installHooks(repoRoot, { protectedBranches: manifest.protectedBranches });\n if (o.json) printJson(out);\n else for (const f of out.files) console.log(`installed ${f}`);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import { existsSync, writeFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport {\n claimRanges,\n Git,\n homeDir,\n installHooks,\n MANIFEST_FILES,\n Registry,\n validateManifest,\n WorkkitError,\n} from '../core/index.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport interface InitOptions {\n repoRoot: string;\n home: string;\n project: string;\n baseBranch: string;\n /** `name=port`, repeatable */\n services: string[];\n storybookHost?: string;\n worktreeRoot?: string;\n hooks: boolean;\n force: boolean;\n}\n\nconst STORYBOOK_BASE = 6100;\n\nfunction defaultService(name: string): Record<string, unknown> {\n const PORT = `\\${PORT_${name.toUpperCase()}}`;\n if (name === 'postgres' || name === 'db') {\n return {\n start: `docker compose up -d ${name}`,\n stop: `docker compose stop ${name}`,\n health: `pg_isready -h 127.0.0.1 -p ${PORT} -q`,\n healthTimeoutMs: 120000,\n };\n }\n return {\n start: `make -C ${name} dev`,\n stop: `make -C ${name} dev-stop`,\n health: `curl -sf -o /dev/null http://127.0.0.1:${PORT}/health`,\n healthTimeoutMs: 300000,\n };\n}\n\n/** The starter manifest: real, loadable, with every project-specific line marked for editing. */\nexport function buildStarterManifest(o: InitOptions): Record<string, unknown> {\n const ports: Record<string, { base: number }> = {};\n const services: Record<string, unknown> = {};\n for (const spec of o.services) {\n const m = /^([a-z][a-z0-9_-]*)=(\\d{4,5})$/.exec(spec);\n if (!m)\n throw new WorkkitError('MANIFEST_INVALID', `--service expects name=port, got \"${spec}\"`);\n ports[m[1]] = { base: Number(m[2]) };\n services[m[1]] = defaultService(m[1]);\n }\n if (o.storybookHost) ports.storybook = { base: STORYBOOK_BASE };\n const manifest: Record<string, unknown> = {\n project: o.project,\n baseBranch: o.baseBranch,\n protectedBranches: [o.baseBranch],\n worktreeRoot: o.worktreeRoot ?? '.claude/worktrees',\n branch: { types: ['feature', 'chore', 'fix'] },\n slots: { count: 10, reserved: [0] },\n ports: { services: ports },\n services,\n ...(o.storybookHost ? { storybook: { hostRoot: o.storybookHost } } : {}),\n logs: { dir: '.logs' },\n refresh: [],\n scopes: {\n frontend: [\n 'app/{group}/{section}/**',\n 'components/{group}/{section}/**',\n 'app/api/{section}/**',\n ],\n backend: ['services/{module}/**'],\n },\n areas: {},\n commons: {},\n expiry: { slotHours: 12, commonsHours: 4, storybookHours: 2 },\n archive: { paths: [], keepDays: 30, keepPerArea: 5 },\n };\n validateManifest(manifest);\n return manifest;\n}\n\nconst HEADER = `// biome-ignore-all lint/suspicious/noTemplateCurlyInString: \\${PORT_*} are the manifest's own placeholders\n// helmsmith.config.mjs — read by \\`work\\` (@helmsmith/workbrokr). Written by \\`work init\\`.\n// Edit: the services' start/stop/health commands, the scope templates, the areas (leaves only,\n// each with its backend module) and the commons. Nothing here is read by the application.\n`;\n\nexport function runInit(o: InitOptions): { manifestPath: string; hooks: string[] } {\n const repoRoot = resolve(o.repoRoot);\n for (const name of MANIFEST_FILES) {\n if (existsSync(join(repoRoot, name)) && !o.force) {\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n `${name} already exists in ${repoRoot}; pass --force to overwrite`,\n );\n }\n }\n const manifest = buildStarterManifest(o);\n const manifestPath = join(repoRoot, 'helmsmith.config.mjs');\n writeFileSync(manifestPath, `${HEADER}export default ${JSON.stringify(manifest, null, 2)};\\n`);\n claimRanges(Registry.open(o.home), validateManifest(manifest), repoRoot);\n const hooks = o.hooks ? installHooks(repoRoot, { protectedBranches: [o.baseBranch] }).files : [];\n return { manifestPath, hooks };\n}\n\nfunction defaultRepoRoot(): string {\n try {\n return new Git(process.cwd()).mainRoot();\n } catch {\n return process.cwd();\n }\n}\n\nfunction defaultBaseBranch(repoRoot: string): string {\n const g = new Git(repoRoot);\n const head = g.tryRun(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);\n if (head.code === 0) return head.out.trim().replace(/^origin\\//, '');\n return 'main';\n}\n\nexport function registerInit(program: Command): void {\n program\n .command('init')\n .description(\n 'Write helmsmith.config.mjs for this repo, claim its port ranges, install the git hooks',\n )\n .requiredOption('--project <name>', 'project name (lowercase, digits, dashes)')\n .option('--base-branch <branch>', \"base branch (default: origin's HEAD, else main)\")\n .option(\n '--service <name=port>',\n 'a service and its slot-0 port; repeat per service',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .option('--storybook-host <dir>', 'the package whose .storybook storybrokr boots from')\n .option('--worktree-root <dir>', 'where area worktrees live (default .claude/worktrees)')\n .option('--repo-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--no-hooks', 'do not install the git hooks')\n .option('--force', 'overwrite an existing manifest')\n .option('--json', 'print the result as JSON')\n .action(\n (o: {\n project: string;\n baseBranch?: string;\n service: string[];\n storybookHost?: string;\n worktreeRoot?: string;\n repoRoot?: string;\n hooks: boolean;\n force?: boolean;\n json?: boolean;\n }) => {\n try {\n const repoRoot = o.repoRoot ? resolve(o.repoRoot) : defaultRepoRoot();\n if (o.service.length === 0)\n throw new WorkkitError(\n 'MANIFEST_INVALID',\n 'at least one --service name=port is required',\n );\n const out = runInit({\n repoRoot,\n home: homeDir(),\n project: o.project,\n baseBranch: o.baseBranch ?? defaultBaseBranch(repoRoot),\n services: o.service,\n storybookHost: o.storybookHost,\n worktreeRoot: o.worktreeRoot,\n hooks: o.hooks,\n force: o.force === true,\n });\n if (o.json) printJson(out);\n else {\n console.log(`wrote ${out.manifestPath}`);\n for (const h of out.hooks) console.log(`installed ${h}`);\n console.log(\n 'next: edit the services and areas, commit helmsmith.config.mjs and .helmsmith/hooks, then `work start`',\n );\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { toErrorBody } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport {\n auditProject,\n type Ctx,\n effortEnv,\n finishEffort,\n prEffort,\n promoteEffort,\n reapLeases,\n startEffort,\n statusFor,\n} from '../lib/effort.js';\nimport { VERSION } from '../version.js';\n\ntype ToolResult = { content: { type: 'text'; text: string }[]; isError?: boolean };\n\nconst ok = (value: unknown): ToolResult => ({\n content: [{ type: 'text', text: JSON.stringify(value, null, 2) }],\n});\nconst failed = (err: unknown): ToolResult => ({\n content: [{ type: 'text', text: JSON.stringify(toErrorBody(err)) }],\n isError: true,\n});\n\nasync function guard(fn: () => Promise<unknown>): Promise<ToolResult> {\n try {\n return ok(await fn());\n } catch (err) {\n return failed(err);\n }\n}\n\n/** The same verbs as the CLI, with the same JSON the CLI's --json prints; refusals carry code + details. */\nexport function buildMcpServer(ctxFactory: (projectRoot?: string) => Promise<Ctx>): McpServer {\n const server = new McpServer({ name: 'work', version: VERSION });\n\n server.registerTool(\n 'work_start',\n {\n description:\n 'Start an effort on an area (or intra-area task): its worktree on <type>/<area> (or <type>/<area>--<task>), synced from the base branch, refreshed, leased (a slot for fullstack/backend, a storybrokr instance for frontend with a story) and running. Refuses with EFFORT_OPEN (another effort is open; join=true to share it), SCOPE_CONFLICT, SYNC_CONFLICT (resolve in the worktree, rerun with sync=false).',\n inputSchema: {\n area: z.string().describe('a leaf area from helmsmith.config (e.g. org/applications)'),\n task: z\n .string()\n .optional()\n .describe(\n 'optional intra-area task slug for parallel sub-efforts (<type>/<area>--<task>)',\n ),\n type: z.string().describe('feature | chore | fix'),\n mode: z.enum(['frontend', 'backend', 'fullstack']),\n scopes: z\n .array(z.string())\n .optional()\n .describe('optional narrowed scope globs for a task sub-effort'),\n story: z\n .string()\n .optional()\n .describe(\n 'frontend: story file or component folder for storybrokr, relative to its host',\n ),\n join: z\n .boolean()\n .optional()\n .describe('work in the already-open effort instead of refusing'),\n sync: z\n .boolean()\n .optional()\n .describe('fetch and merge the base branch first (default true)'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, type, mode, scopes, story, join, sync, projectRoot }) =>\n guard(async () =>\n startEffort(await ctxFactory(projectRoot), {\n area,\n task,\n type,\n mode,\n scopes,\n story,\n join,\n sync,\n }),\n ),\n );\n\n server.registerTool(\n 'work_promote',\n {\n description:\n 'Promote an open effort in place to backend or fullstack mode, claiming a slot if needed and starting only newly required services.',\n inputSchema: {\n area: z.string().describe('the area of the open effort'),\n task: z.string().optional().describe('optional intra-area task slug'),\n mode: z.enum(['backend', 'fullstack']).describe('target mode to promote into'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, mode, projectRoot }) =>\n guard(async () => promoteEffort(await ctxFactory(projectRoot), { area, task, mode })),\n );\n\n server.registerTool(\n 'work_pr',\n {\n description:\n \"Open the effort's pull request through pritty: pushes the branch first, reuses a stored PR that is still open (updating its title/body when given), refuses with PR_CLOSED when it was merged or closed unless force, and stores { number, url, draft } on the effort. Pass title and body: the agent writes the words, pritty's AI path is only the fallback.\",\n inputSchema: {\n area: z\n .string()\n .optional()\n .describe('the area of the effort (default: the effort of the cwd worktree)'),\n task: z.string().optional().describe('optional intra-area task slug'),\n draft: z.boolean().optional().describe('open a draft PR'),\n title: z.string().optional().describe('PR title'),\n // body text only: a file path here would let any MCP caller have pritty read an\n // arbitrary file and publish it as a PR body; read the file yourself and pass the text\n body: z\n .string()\n .optional()\n .describe('PR body text (read your body file and pass its text)'),\n force: z.boolean().optional().describe('open a new PR when the stored one was closed'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, draft, title, body, force, projectRoot }) =>\n guard(async () =>\n prEffort(await ctxFactory(projectRoot), {\n area,\n task,\n cwd: process.cwd(),\n draft,\n title,\n body,\n force,\n }),\n ),\n );\n\n server.registerTool(\n 'work_status',\n {\n description:\n 'Per area: the open effort, its leases, how far behind the base branch it is, pending notices; plus every lease of the project.',\n inputSchema: {\n area: z.string().optional(),\n task: z.string().optional(),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, projectRoot }) =>\n guard(async () => statusFor(await ctxFactory(projectRoot), area, task)),\n );\n\n server.registerTool(\n 'work_finish',\n {\n description:\n \"Stop the effort's runner, release its leases, push its branch (or merge --into-area for task sub-efforts), leave commons notices. Refuses DIRTY_WORKTREE unless park=true (commits as wip).\",\n inputSchema: {\n area: z.string(),\n task: z.string().optional().describe('optional intra-area task slug'),\n park: z.boolean().optional(),\n intoArea: z\n .boolean()\n .optional()\n .describe('merge task branch into <type>/<area> instead of pushing to origin'),\n force: z\n .boolean()\n .optional()\n .describe('stop and finish even if other joined participants remain'),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, park, intoArea, force, projectRoot }) =>\n guard(async () =>\n finishEffort(await ctxFactory(projectRoot), { area, task, park, intoArea, force }),\n ),\n );\n\n server.registerTool(\n 'work_reap',\n {\n description:\n 'Expire idle leases: stop only what they started, release them, park their efforts. dryRun lists without touching.',\n inputSchema: {\n dryRun: z.boolean().optional(),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ dryRun, projectRoot }) =>\n guard(async () => reapLeases(await ctxFactory(projectRoot), { dryRun })),\n );\n\n server.registerTool(\n 'work_audit',\n {\n description:\n 'Findings: dirty or unpushed area worktrees, foreign worktrees, aging leases, drift from the base branch, stale notices, archive size.',\n inputSchema: {\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ projectRoot }) => guard(async () => auditProject(await ctxFactory(projectRoot))),\n );\n\n server.registerTool(\n 'work_env',\n {\n description:\n \"The slot-derived variables of an area's open effort (PORT_*, SLOT, LOG_DIR, WORKTREE, BRANCH, MODE).\",\n inputSchema: {\n area: z.string(),\n task: z.string().optional(),\n projectRoot: z.string().optional().describe('optional repository root path override'),\n },\n },\n async ({ area, task, projectRoot }) =>\n guard(async () => effortEnv(await ctxFactory(projectRoot), area, task)),\n );\n\n return server;\n}\n\nexport async function runStdio(): Promise<void> {\n const server = buildMcpServer((projectRoot) => buildCtx({ projectRoot, quiet: true }));\n await server.connect(new StdioServerTransport());\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// tsup builds this module into two separate entry bundles that sit at different depths under\n// the package root — dist/cli.js (one level down) and, via server/daemon.ts, dist/server/\n// start.js (two levels down) — so a single relative '../package.json' can't reach it from\n// both. Walk upward from this module's own file instead; that also covers `tsx src/cli.ts` /\n// dev imports, since no package.json sits between src/ (or src/server/) and the package root.\nfunction findPackageJson(startDir: string): string {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, 'package.json');\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) throw new Error(`package.json not found above ${startDir}`);\n dir = parent;\n }\n}\n\nconst pkgFile = findPackageJson(dirname(fileURLToPath(import.meta.url)));\nexport const VERSION: string = (JSON.parse(readFileSync(pkgFile, 'utf8')) as { version: string })\n .version;\n","import type { Command } from 'commander';\nimport { runStdio } from '../mcp/server.js';\n\nexport function registerMcp(program: Command): void {\n program\n .command('mcp')\n .description('Serve the MCP stdio interface (the same verbs as the CLI)')\n .action(async () => {\n await runStdio();\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { prEffort } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerPr(program: Command): void {\n program\n .command('pr [area]')\n .description(\n \"Open the effort's pull request through pritty (push first, reuse an open PR, store it on the effort). No area: the effort of the cwd's worktree.\",\n )\n .option('--task <slug>', 'intra-area task slug')\n .option('--draft', 'open a draft PR')\n .option('--title <title>', 'PR title (with --body or --body-file: no AI involved)')\n .option('--body <text>', 'PR body text')\n .option('--body-file <path>', 'PR body from a file')\n .option('--force', 'open a new PR when the stored one was merged or closed')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (\n area: string | undefined,\n o: {\n task?: string;\n draft?: boolean;\n title?: string;\n body?: string;\n bodyFile?: string;\n force?: boolean;\n projectRoot?: string;\n json?: boolean;\n },\n ) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await prEffort(ctx, {\n area,\n task: o.task,\n cwd: process.cwd(),\n draft: o.draft,\n title: o.title,\n body: o.body,\n bodyFile: o.bodyFile,\n force: o.force,\n });\n if (o.json) printJson(r);\n else {\n for (const w of r.warnings) console.error(chalk.yellow(w));\n console.log(\n `${r.created ? 'opened' : 'open'} PR #${r.pr.number}${r.pr.draft ? ' (draft)' : ''} for ${r.effort.branch}: ${r.pr.url}`,\n );\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { promoteEffort } from '../lib/effort.js';\nimport { fail, printJson, warn } from './_shared/output.js';\n\nexport function registerPromote(program: Command): void {\n program\n .command('promote')\n .description('Promote an open effort in place to backend or fullstack mode')\n .requiredOption('--area <area>', 'the area of the open effort')\n .option('--task <slug>', 'intra-area task slug if promoting a task sub-effort')\n .requiredOption('--mode <mode>', 'target mode: backend | fullstack')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (o: {\n area: string;\n task?: string;\n mode: 'backend' | 'fullstack';\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await promoteEffort(ctx, {\n area: o.area,\n task: o.task,\n mode: o.mode,\n });\n if (o.json) printJson(r);\n else {\n const label = r.effort.task ? `${r.effort.area}--${r.effort.task}` : r.effort.area;\n console.log(\n `${chalk.bold(label)} promoted to ${r.effort.mode}${r.startedServices.length ? ` (started: ${r.startedServices.join(', ')})` : ''}`,\n );\n for (const w of r.warnings) warn(w);\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { reapLeases } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerReap(program: Command): void {\n program\n .command('reap')\n .description(\n 'Expire idle leases: stop only what they started, release them, park their efforts',\n )\n .option('--dry-run', 'list what would be reaped without touching anything')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(async (o: { dryRun?: boolean; projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await reapLeases(ctx, { dryRun: o.dryRun });\n if (o.json) printJson(r);\n else if (r.reaped.length === 0) console.log(chalk.gray('nothing to reap'));\n else\n for (const l of r.reaped)\n console.log(\n `${o.dryRun ? 'would reap' : 'reaped'} ${l.kind} ${l.value} (${l.owner.session}, expired ${l.expires})`,\n );\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { buildCtx } from '../lib/context.js';\nimport { retireArea } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nexport function registerRetire(program: Command): void {\n program\n .command('retire')\n .description(\n \"Archive an area's evidence, remove its worktree and its local branches that are on origin (the only destructive verb)\",\n )\n .requiredOption('--area <area>', 'the area to retire')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(async (o: { area: string; projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await retireArea(ctx, { area: o.area });\n if (o.json) printJson(r);\n else {\n console.log(`${chalk.bold(o.area)} retired: removed ${r.removed}`);\n for (const a of r.archived) console.log(` archived ${a}`);\n for (const b of r.branchesDeleted) console.log(` deleted local branch ${b}`);\n for (const b of r.branchesKept)\n console.log(chalk.yellow(` kept ${b}: not fully on origin`));\n }\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport type { Mode } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport { type StartResult, startEffort } from '../lib/effort.js';\nimport { fail, printJson, warn } from './_shared/output.js';\n\nexport function printStart(r: StartResult): void {\n const e = r.effort;\n const label = e.task ? `${e.area}--${e.task}` : e.area;\n console.log(\n `${chalk.bold(label)} ${e.type}/${e.mode} ${e.branch}${r.joined ? chalk.yellow(' (joined)') : ''}`,\n );\n console.log(` worktree ${e.worktree}`);\n console.log(\n ` sync ${r.sync}${r.refreshed.length ? ` refreshed: ${r.refreshed.join('; ')}` : ''}`,\n );\n for (const l of r.leases) {\n const ports = l.ports\n ? ` ${Object.entries(l.ports)\n .map(([k, v]) => `${k}=${v}`)\n .join(' ')}`\n : '';\n console.log(` lease ${l.kind} ${l.value}${ports} expires ${l.expires}`);\n }\n for (const w of r.warnings) warn(w);\n for (const n of r.notices) console.log(chalk.yellow(` notice ${n.text} (${n.at})`));\n}\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description(\n \"Start an effort: the area's worktree on <type>/<area> (or <type>/<area>--<task>), synced from the base branch, leased and running\",\n )\n .requiredOption('--area <area>', 'a leaf area from helmsmith.config (e.g. org/applications)')\n .option('--task <slug>', 'intra-area task slug for parallel sub-efforts (<type>/<area>--<slug>)')\n .requiredOption('--type <type>', 'feature | chore | fix (as the manifest allows)')\n .requiredOption('--mode <mode>', 'fullstack | backend (a slot) | frontend (storybrokr)')\n .option('--scope <glob...>', 'narrow exclusive scope globs for this task sub-effort')\n .option(\n '--story <path>',\n 'frontend: the story file or component folder storybrokr boots, relative to the Storybook host',\n )\n .option('--join', 'work in the already-open effort on this area instead of refusing')\n .option('--no-sync', 'skip the fetch and merge from the base branch (reproducing something)')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the result as JSON')\n .action(\n async (o: {\n area: string;\n task?: string;\n type: string;\n mode: string;\n scope?: string[];\n story?: string;\n join?: boolean;\n sync: boolean;\n projectRoot?: string;\n json?: boolean;\n }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: Boolean(o.json) });\n const r = await startEffort(ctx, {\n area: o.area,\n task: o.task,\n type: o.type,\n mode: o.mode as Mode,\n scopes: o.scope,\n story: o.story,\n join: o.join,\n sync: o.sync,\n });\n if (o.json) printJson(r);\n else printStart(r);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport type { Command } from 'commander';\nimport type { Lease } from '../core/index.js';\nimport { buildCtx } from '../lib/context.js';\nimport { type StatusReport, statusFor } from '../lib/effort.js';\nimport { fail, printJson } from './_shared/output.js';\n\nconst age = (iso: string) => {\n const mins = Math.max(0, Math.round((Date.now() - Date.parse(iso)) / 60_000));\n return mins < 60\n ? `${mins}m`\n : mins < 1440\n ? `${Math.round(mins / 60)}h`\n : `${Math.round(mins / 1440)}d`;\n};\nconst expiresIn = (iso: string) => {\n const mins = Math.round((Date.parse(iso) - Date.now()) / 60_000);\n return mins <= 0 ? chalk.red('expired') : mins < 60 ? `${mins}m` : `${Math.round(mins / 60)}h`;\n};\n\nexport function printStatus(r: StatusReport): void {\n console.log(chalk.bold(`${r.project}`));\n const cols = [\n 'AREA',\n 'TYPE/MODE',\n 'BRANCH',\n 'OWNER',\n 'STARTED',\n 'LEASES',\n 'PR',\n 'BEHIND',\n 'NOTICES',\n ];\n const rows = r.areas.map((a) => [\n a.area,\n a.effort ? `${a.effort.type}/${a.effort.mode}` : chalk.gray('-'),\n a.effort?.branch ?? chalk.gray('-'),\n a.effort?.owner.session ?? chalk.gray('-'),\n a.effort ? age(a.effort.started) : chalk.gray('-'),\n a.leases.length ? a.leases.map((l) => `${l.kind}:${l.value}`).join(',') : chalk.gray('-'),\n a.effort?.pr ? `#${a.effort.pr.number}${a.effort.pr.draft ? ' draft' : ''}` : chalk.gray('-'),\n a.behindBase > 0 ? chalk.yellow(String(a.behindBase)) : '0',\n a.notices.length ? chalk.yellow(String(a.notices.length)) : '0',\n ]);\n // biome-ignore lint/suspicious/noControlCharactersInRegex: strips chalk's ANSI colour codes for width math\n const plain = (s: string) => s.replace(/\\u001b\\[[0-9;]*m/g, '');\n const widths = cols.map((c, i) => Math.max(c.length, ...rows.map((row) => plain(row[i]).length)));\n const line = (cells: string[]) =>\n cells.map((c, i) => c + ' '.repeat(widths[i] - plain(c).length)).join(' ');\n console.log(chalk.bold(line(cols)));\n for (const row of rows) console.log(line(row));\n if (r.leases.length) {\n console.log('');\n console.log(chalk.bold('KIND VALUE OWNER AGE EXPIRES-IN'));\n for (const l of r.leases as Lease[]) {\n console.log(\n `${l.kind.padEnd(10)} ${String(l.value).padEnd(12)} ${l.owner.session.padEnd(21)} ${age(l.created).padEnd(5)} ${expiresIn(l.expires)}`,\n );\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Open efforts, leases, drift from the base branch and notices, per area')\n .option('--area <area>', 'one area only')\n .option('--task <slug>', 'intra-area task slug')\n .option('--project-root <dir>', 'repository root (default: the main checkout of the cwd)')\n .option('--json', 'print the report as JSON')\n .action(async (o: { area?: string; task?: string; projectRoot?: string; json?: boolean }) => {\n try {\n const ctx = await buildCtx({ projectRoot: o.projectRoot, quiet: true });\n const r = statusFor(ctx, o.area, o.task);\n if (o.json) printJson(r);\n else printStatus(r);\n } catch (err) {\n fail(err, Boolean(o.json));\n }\n });\n}\n","import { createCli } from '@helmsmith/cli-kit';\nimport { registerAudit } from './commands/audit.js';\nimport { registerEnv } from './commands/env.js';\nimport { registerFinish } from './commands/finish.js';\nimport { registerHook } from './commands/hook.js';\nimport { registerInit } from './commands/init.js';\nimport { registerMcp } from './commands/mcp.js';\nimport { registerPr } from './commands/pr.js';\nimport { registerPromote } from './commands/promote.js';\nimport { registerReap } from './commands/reap.js';\nimport { registerRetire } from './commands/retire.js';\nimport { registerStart } from './commands/start.js';\nimport { registerStatus } from './commands/status.js';\nimport { VERSION } from './version.js';\n\nconst { program } = createCli({\n name: 'work',\n version: VERSION,\n description: 'Area-based work: start, promote, status, pr, finish, reap, retire, audit.',\n});\n\nregisterInit(program);\nregisterStart(program);\nregisterPromote(program);\nregisterStatus(program);\nregisterEnv(program);\nregisterPr(program);\nregisterFinish(program);\nregisterReap(program);\nregisterRetire(program);\nregisterAudit(program);\nregisterHook(program);\nregisterMcp(program);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":["program","chalk","existsSync","mkdirSync","realpathSync","join","join","realpathSync","mkdirSync","existsSync","existsSync","realpathSync","realpathSync","existsSync","mkdirSync","writeFileSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","join","mkdirSync","writeFileSync","join","spawnSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","picomatch","picomatch","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","join","spawnSync","existsSync","mkdirSync","readFileSync","rmSync","statSync","writeFileSync","now","mkdirSync","existsSync","readFileSync","statSync","rmSync","writeFileSync","spawnSync","join","sleep","spawnSync","join","spawnSync","spawnSync","spawnSync","run","spawnSync","versionFound","appendFileSync","existsSync","mkdirSync","readFileSync","realpathSync","rmSync","statSync","writeFileSync","dirname","join","join","effortLabel","sleep","realpathOr","realpathSync","resolve","existsSync","wg","appendFileSync","readFileSync","mkdirSync","writeFileSync","finished","statSync","dirname","rmSync","pr","chalk","chalk","program","chalk","program","chalk","program","chalk","readFileSync","realpathSync","resolve","chalk","chalk","same","realpathSync","program","readFileSync","resolve","existsSync","writeFileSync","join","resolve","resolve","existsSync","join","writeFileSync","program","z","existsSync","readFileSync","dirname","join","z","join","program","chalk","program","chalk","chalk","program","chalk","chalk","program","chalk","chalk","program","chalk","chalk","chalk","program","chalk","chalk","program"]}