@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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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"],"sourcesContent":["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"],"mappings":"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","names":["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","mkdirSync","existsSync","readFileSync","statSync","rmSync","writeFileSync","spawnSync","join","sleep","spawnSync","join"]}
1
+ {"version":3,"sources":["../../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"],"sourcesContent":["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"],"mappings":"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","names":["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","mkdirSync","existsSync","readFileSync","statSync","rmSync","writeFileSync","spawnSync","join","sleep","spawnSync","join"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helmsmith/workbrokr",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Start, run, finish, reap and audit area-based work: one worktree per area, <type>/<area> branches, slots and leases from one registry, storybrokr for frontend work. CLI, MCP server and skill.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",