@titan-design/active-work 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/paths.ts","../src/registry/json-envelope.ts","../src/registry/types.ts","../src/registry/index.ts","../src/errors.ts","../src/commands/open.ts","../src/schemas/brief.ts","../src/bootstrap/prompt.ts","../src/schemas/task.ts","../src/schemas/session.ts","../src/schemas/artifacts.ts","../src/utils/yaml-io.ts","../src/utils/fs-atomic.ts","../src/utils/coerce-dates.ts","../src/utils/git-gh.ts","../src/utils/today.ts","../src/bootstrap/archive-tasks.ts","../src/commands/_open-helpers.ts","../src/utils/color.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport envPaths from 'env-paths';\n\nconst PROJECT_NAME = 'active-work';\n\nfunction paths(): ReturnType<typeof envPaths> {\n return envPaths(PROJECT_NAME, { suffix: '' });\n}\n\n/**\n * Replace a leading `~` with the user's home directory.\n *\n * Returns the input unchanged when it does not start with `~`.\n */\nexport function expandTilde(p: string): string {\n if (p === '~') return os.homedir();\n if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));\n return p;\n}\n\n/**\n * Resolve the root directory for initiative data.\n *\n * Honors `ACTIVE_ROOT` (with `~` expansion) when set; otherwise falls back to\n * the XDG data path provided by `env-paths`.\n */\nexport function getActiveRoot(): string {\n const override = process.env.ACTIVE_ROOT;\n if (override && override.length > 0) {\n return path.resolve(expandTilde(override));\n }\n return paths().data;\n}\n\n/** Resolve the XDG state directory used for ephemeral runtime state. */\nexport function getStateRoot(): string {\n return paths().log;\n}\n\n/** Resolve the XDG config directory used for user-level config files. */\nexport function getConfigRoot(): string {\n return paths().config;\n}\n\n/** Resolve the XDG cache directory. */\nexport function getCacheRoot(): string {\n return paths().cache;\n}\n\n/** Resolve the directory for a single initiative by slug. */\nexport function getInitiativeDir(slug: string): string {\n return path.join(getActiveRoot(), slug);\n}\n\n/** Resolve the path of the advisory lockfile for an initiative. */\nexport function getLockPath(slug: string): string {\n return path.join(getInitiativeDir(slug), '.lock');\n}\n","export type JsonEnvelope<T> =\n | { ok: true; data: T; warnings?: string[] }\n | { ok: false; error: string; code: number };\n\nexport function successEnvelope<T>(\n data: T,\n warnings?: string[],\n): JsonEnvelope<T> {\n if (warnings && warnings.length > 0) {\n return { ok: true, data, warnings };\n }\n return { ok: true, data };\n}\n\nexport function errorEnvelope(error: string, code: number): JsonEnvelope<never> {\n return { ok: false, error, code };\n}\n","import type { ZodSchema } from 'zod';\n\nexport interface CommandContext {\n activeRoot: string;\n warnings: string[];\n format: 'human' | 'json';\n // The user's shell working directory, populated by interactive surfaces\n // (the CLI dispatcher and `aw` launcher). Left undefined by the daemon /\n // MCP server, whose process cwd is not the user's — those callers must pass\n // an explicit `cwd` arg to opt into cwd-based resolution.\n cwd?: string;\n}\n\nexport interface CliOption {\n long: string;\n short?: string;\n description: string;\n required?: boolean;\n}\n\nexport interface CliMeta {\n positional?: string[];\n options?: Record<string, CliOption>;\n usage?: string;\n}\n\nexport interface Command<Args = unknown, Result = unknown> {\n name: string;\n description: string;\n args: ZodSchema<Args>;\n result: ZodSchema<Result>;\n cli?: CliMeta;\n run(args: Args, ctx: CommandContext): Promise<Result>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyCommand = Command<any, any>;\nexport type CommandRegistry = Map<string, AnyCommand>;\n\nexport function defineCommand<Args, Result>(\n cmd: Command<Args, Result>,\n): Command<Args, Result> {\n return cmd;\n}\n","import type { AnyCommand, CommandRegistry } from './types.js';\n\nexport const registry: CommandRegistry = new Map();\n\nexport function register(cmd: AnyCommand): void {\n if (registry.has(cmd.name)) {\n throw new Error(`Command already registered: ${cmd.name}`);\n }\n registry.set(cmd.name, cmd);\n}\n\nexport type {\n Command,\n AnyCommand,\n CommandRegistry,\n CommandContext,\n CliMeta,\n CliOption,\n} from './types.js';\nexport type { JsonEnvelope } from './json-envelope.js';\nexport { defineCommand } from './types.js';\nexport { successEnvelope, errorEnvelope } from './json-envelope.js';\n","/**\n * Typed error hierarchy + sysexits exit codes.\n *\n * EXIT codes follow BSD `sysexits.h` so the CLI dispatcher and JSON envelope\n * surface a consistent, machine-readable status across human and tooling output.\n */\n\nexport const EXIT = {\n OK: 0,\n GENERIC: 1,\n USAGE: 64, // EX_USAGE\n DATAERR: 65, // EX_DATAERR — invalid input data / validation\n NOINPUT: 66, // EX_NOINPUT — file/initiative not found\n UNAVAILABLE: 69, // EX_UNAVAILABLE — daemon unreachable\n SOFTWARE: 70, // EX_SOFTWARE — internal bug\n CONFIG: 78, // EX_CONFIG — bad config\n} as const;\n\nexport class ActiveWorkError extends Error {\n readonly code: number = EXIT.GENERIC;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'ActiveWorkError';\n }\n}\n\nexport class ValidationError extends ActiveWorkError {\n override readonly code: number = EXIT.DATAERR;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'ValidationError';\n }\n}\n\nexport class NotFoundError extends ActiveWorkError {\n override readonly code: number = EXIT.NOINPUT;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'NotFoundError';\n }\n}\n\nexport class UsageError extends ActiveWorkError {\n override readonly code: number = EXIT.USAGE;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'UsageError';\n }\n}\n\nexport class DaemonError extends ActiveWorkError {\n override readonly code: number = EXIT.UNAVAILABLE;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'DaemonError';\n }\n}\n\nexport class ConfigError extends ActiveWorkError {\n override readonly code: number = EXIT.CONFIG;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'ConfigError';\n }\n}\n\nexport class SoftwareError extends ActiveWorkError {\n override readonly code: number = EXIT.SOFTWARE;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'SoftwareError';\n }\n}\n\nexport function isActiveWorkError(err: unknown): err is ActiveWorkError {\n return err instanceof ActiveWorkError;\n}\n\nexport function formatError(err: unknown): { message: string; code: number } {\n if (err instanceof ActiveWorkError) {\n return { message: err.message, code: err.code };\n }\n if (err instanceof Error) {\n return { message: err.message, code: EXIT.GENERIC };\n }\n return { message: String(err), code: EXIT.GENERIC };\n}\n","import path from 'node:path';\nimport { z } from 'zod';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { getActiveRoot, expandTilde } from '../utils/paths.js';\nimport { defineCommand } from '../registry/index.js';\nimport {\n assembleBootstrap,\n readMarkdownWithSchema,\n type BootstrapMetadata,\n} from '../bootstrap/prompt.js';\nimport { archiveStaleTasks } from '../bootstrap/archive-tasks.js';\nimport {\n listInitiativeSlugs,\n resolveSlug,\n resolveSlugFromCwd,\n} from './_open-helpers.js';\n\n/** Done tasks older than this are auto-archived on bootstrap (AW-8). */\nconst ARCHIVE_DONE_AFTER_DAYS = 30;\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1).optional(),\n offline: z.boolean().optional(),\n // Directory used to auto-resolve an initiative when no slug is given.\n // Defaults to the process cwd; callers that do not share the user's shell\n // cwd (the daemon / MCP server) must pass this explicitly.\n cwd: z.string().min(1).optional(),\n // Force the picker even when the cwd matches an initiative's worktree.\n pick: z.boolean().optional(),\n // Frame the bootstrap prompt as ad-hoc work related to the workstream rather\n // than a continuation of its handoff / top task.\n adhoc: z.boolean().optional(),\n});\n\nconst InitiativeSummarySchema = z.object({\n slug: z.string(),\n title: z.string(),\n state: z.enum(['focused', 'backburner', 'paused', 'done']),\n rank: z.number().int().positive().optional(),\n});\n\nconst PickerResultSchema = z.object({\n picker: z.literal(true),\n initiatives: z.array(InitiativeSummarySchema),\n});\n\nconst OpenResultSchema = z.object({\n slug: z.string(),\n prompt: z.string(),\n cwd_hint: z.string(),\n channels: z.array(z.string()).optional(),\n metadata: z.object({\n slug: z.string(),\n brief_title: z.string(),\n last_session: z\n .object({ filename: z.string(), ended: z.string() })\n .optional(),\n time_since_last_session_human: z.string().optional(),\n open_task_count: z.number().int().nonnegative(),\n recently_done_count: z.number().int().nonnegative(),\n bootstrap_at: z.string(),\n }),\n // How the initiative was selected: an explicit/prefix slug, or a match\n // between the caller's cwd and one of the initiative's worktrees.\n resolved_from: z.enum(['slug', 'cwd']).optional(),\n});\n\nconst ResultSchema = z.union([OpenResultSchema, PickerResultSchema]);\n\ntype OpenArgs = z.infer<typeof ArgsSchema>;\ntype OpenResult = z.infer<typeof ResultSchema>;\n\ninterface InitiativeSummary {\n slug: string;\n title: string;\n state: BriefFrontmatter['state'];\n rank?: number;\n}\n\nconst STATE_ORDER: Record<BriefFrontmatter['state'], number> = {\n focused: 0,\n backburner: 1,\n paused: 2,\n done: 3,\n};\n\nasync function loadInitiativeSummary(\n activeRoot: string,\n slug: string,\n): Promise<InitiativeSummary | null> {\n const briefPath = path.join(activeRoot, slug, 'brief.md');\n try {\n const { frontmatter } = await readMarkdownWithSchema(\n briefPath,\n BriefFrontmatterSchema,\n );\n return {\n slug,\n title: frontmatter.title,\n state: frontmatter.state,\n rank: frontmatter.rank,\n };\n } catch {\n return null;\n }\n}\n\nfunction compareInitiatives(a: InitiativeSummary, b: InitiativeSummary): number {\n const stateDiff = STATE_ORDER[a.state] - STATE_ORDER[b.state];\n if (stateDiff !== 0) return stateDiff;\n if (a.rank !== undefined && b.rank !== undefined && a.rank !== b.rank) {\n return a.rank - b.rank;\n }\n if (a.rank !== undefined && b.rank === undefined) return -1;\n if (a.rank === undefined && b.rank !== undefined) return 1;\n return a.slug.localeCompare(b.slug);\n}\n\nasync function collectInitiatives(\n activeRoot: string,\n): Promise<InitiativeSummary[]> {\n const slugs = await listInitiativeSlugs(activeRoot);\n const summaries: InitiativeSummary[] = [];\n for (const slug of slugs) {\n const summary = await loadInitiativeSummary(activeRoot, slug);\n if (summary) summaries.push(summary);\n }\n summaries.sort(compareInitiatives);\n return summaries;\n}\n\nfunction resolveCwdHint(\n activeRoot: string,\n slug: string,\n brief: BriefFrontmatter,\n): string {\n const worktrees = brief.worktrees ?? {};\n for (const entry of Object.values(worktrees)) {\n if (entry.default) return expandTilde(entry.path);\n }\n const entries = Object.values(worktrees);\n if (entries.length === 1) return expandTilde(entries[0]!.path);\n return path.join(activeRoot, slug);\n}\n\nasync function bootstrapInitiative(\n activeRoot: string,\n slug: string,\n opts: {\n offline?: boolean;\n resolvedFrom: 'slug' | 'cwd';\n cwdHintOverride?: string;\n adhoc?: boolean;\n },\n): Promise<OpenResult & { metadata: BootstrapMetadata }> {\n const briefPath = path.join(activeRoot, slug, 'brief.md');\n const { frontmatter: brief } = await readMarkdownWithSchema(\n briefPath,\n BriefFrontmatterSchema,\n );\n // When we resolved via cwd, launch in the worktree the user was standing in,\n // not the brief's default worktree.\n const cwdHint = opts.cwdHintOverride ?? resolveCwdHint(activeRoot, slug, brief);\n const archivedTaskIds = await archiveStaleTasks(\n path.join(activeRoot, slug),\n { retentionDays: ARCHIVE_DONE_AFTER_DAYS, now: new Date() },\n );\n const { prompt, metadata } = await assembleBootstrap({\n activeRoot,\n slug,\n includeLiveStatus: !opts.offline,\n archivedTaskIds,\n adhoc: opts.adhoc,\n });\n return {\n slug,\n prompt,\n cwd_hint: cwdHint,\n ...(brief.channels && brief.channels.length > 0\n ? { channels: brief.channels }\n : {}),\n metadata,\n resolved_from: opts.resolvedFrom,\n };\n}\n\nconst openCommand = defineCommand<OpenArgs, OpenResult>({\n name: 'open',\n description:\n \"Bootstrap a Claude session for an initiative. Without a slug, resolves the initiative whose worktree contains the caller's cwd; falls back to the picker list when nothing matches.\",\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n offline: {\n long: '--offline',\n description: 'Skip the live `gh`/`git` artifact lookup; render artifacts statically.',\n },\n cwd: {\n long: '--cwd',\n description:\n 'Directory to resolve the initiative from when no slug is given (default: current directory).',\n },\n pick: {\n long: '--pick',\n description:\n 'Always return the picker list; skip resolving the initiative from the current directory.',\n },\n adhoc: {\n long: '--adhoc',\n description:\n 'Frame the prompt as ad-hoc work on the workstream (awaiting the user’s task), not a continuation of the handoff / top task.',\n },\n },\n usage: 'active-work open [slug] [--offline] [--cwd <dir>] [--pick] [--adhoc]',\n },\n async run(args, ctx) {\n const activeRoot = ctx.activeRoot ?? getActiveRoot();\n\n if (args.slug) {\n const slug = await resolveSlug(activeRoot, args.slug);\n return bootstrapInitiative(activeRoot, slug, {\n offline: args.offline,\n resolvedFrom: 'slug',\n adhoc: args.adhoc,\n });\n }\n\n // No slug: infer the initiative from the caller's working directory,\n // unless the caller explicitly asked for the picker. The cwd comes from\n // the caller's args or the interactive-surface context; when neither is\n // set (e.g. a daemon/MCP caller) we skip resolution and show the picker.\n const cwd = args.cwd ?? ctx.cwd;\n if (!args.pick && cwd) {\n const matched = await resolveSlugFromCwd(activeRoot, cwd);\n if (matched) {\n return bootstrapInitiative(activeRoot, matched.slug, {\n offline: args.offline,\n resolvedFrom: 'cwd',\n cwdHintOverride: matched.worktreePath,\n adhoc: args.adhoc,\n });\n }\n }\n\n const initiatives = await collectInitiatives(activeRoot);\n return { picker: true, initiatives };\n },\n});\n\nexport default openCommand;\n","import { z } from 'zod';\n\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst isValidIsoDate = (value: string): boolean => {\n if (!ISO_DATE_REGEX.test(value)) return false;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return false;\n // Reject dates like 2026-02-30 that JS happily rolls forward.\n return parsed.toISOString().slice(0, 10) === value;\n};\n\nconst isoDate = z\n .string()\n .refine(isValidIsoDate, { message: 'Must be a valid zero-padded YYYY-MM-DD date' });\n\nconst positiveInt = z.number().int().positive();\n\nconst worktreeEntry = z.object({\n path: z.string().min(1),\n default: z.boolean().optional(),\n});\n\n// An MCP push-channel target enabled at `aw`/`open` launch via\n// `claude --dangerously-load-development-channels <target>`. Accepts an\n// explicit `server:<name>` / `plugin:<name>@<marketplace>` target, or a bare\n// server name that is normalized to `server:<name>` by the launcher.\nconst channelTarget = z\n .string()\n .min(1)\n .regex(/^(?:(?:server|plugin):.+|[A-Za-z0-9_-]+)$/, {\n message:\n 'channel must be a target like \"server:voltras\", \"plugin:name@marketplace\", or a bare server name',\n });\n\nexport const BriefFrontmatterSchema = z\n .object({\n schema_version: positiveInt,\n title: z.string().min(1),\n updated: isoDate,\n state: z.enum(['focused', 'backburner', 'paused', 'done']),\n rank: positiveInt.optional(),\n paused_since: isoDate.optional(),\n restart_trigger: z.string().min(1).optional(),\n ship_target: z.string().optional(),\n owner: z.string().optional(),\n task_prefix: z\n .string()\n .min(1)\n .regex(/^[A-Z][A-Z0-9]*$/, {\n message: 'task_prefix must be uppercase letters/digits starting with a letter',\n }),\n worktrees: z.record(z.string(), worktreeEntry).optional(),\n channels: z.array(channelTarget).optional(),\n })\n .superRefine((value, ctx) => {\n if (value.state === 'focused' && value.rank === undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['rank'],\n message: 'rank is required when state is \"focused\"',\n });\n }\n if (value.state === 'paused') {\n if (value.paused_since === undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['paused_since'],\n message: 'paused_since is required when state is \"paused\"',\n });\n }\n if (value.restart_trigger === undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['restart_trigger'],\n message: 'restart_trigger is required when state is \"paused\"',\n });\n }\n }\n });\n\nexport type BriefFrontmatter = z.infer<typeof BriefFrontmatterSchema>;\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { TaskSchema, type Task } from '../schemas/task.js';\nimport {\n SessionFrontmatterSchema,\n type SessionFrontmatter,\n} from '../schemas/session.js';\nimport {\n ArtifactsSchema,\n type Artifacts,\n type BranchEntry,\n} from '../schemas/artifacts.js';\nimport { readYaml } from '../utils/yaml-io.js';\nimport {\n getGhRunner,\n getGitRunner,\n resolveLocalRepoPath,\n resolveOrgRepo,\n} from '../utils/git-gh.js';\nimport { today, nowIso } from '../utils/today.js';\nimport { NotFoundError } from '../errors.js';\nimport YAML from 'yaml';\nimport type { ZodType } from 'zod';\n\nconst BRIEF_BODY_MAX_LINES = 40;\nconst SESSION_BODY_MAX_LINES = 25;\nconst DEFAULT_TOP_N_TASKS = 5;\nconst DEFAULT_RECENTLY_DONE_DAYS = 14;\n\nconst RECENT_THRESHOLD_DAYS = 14;\nconst MS_PER_HOUR = 1000 * 60 * 60;\nconst MS_PER_DAY = MS_PER_HOUR * 24;\n\nexport interface LiveBranchStatus {\n repo: string;\n name: string;\n note?: string;\n present: boolean;\n last_commit_iso: string | null;\n ahead: number | null;\n behind: number | null;\n pr: {\n number: number;\n state: string;\n title: string;\n url: string;\n checks?: string;\n } | null;\n}\n\nexport type LiveStatusFetcher = (\n branches: BranchEntry[],\n) => Promise<LiveBranchStatus[]>;\n\nexport interface BootstrapInput {\n /** Active root directory. Used to resolve the initiative dir. */\n activeRoot: string;\n slug: string;\n /** Injectable \"now\" for deterministic tests. Defaults to `new Date()`. */\n now?: Date;\n /** Cap for top open tasks shown. Defaults to 5. */\n topNTasks?: number;\n /** Window for the \"recently done\" section. Defaults to 14 days. */\n recentlyDoneDays?: number;\n /**\n * When `true` (default), the bootstrap pulls live branch/PR state via\n * `git` + `gh`. When `false`, only the static `artifacts.yml` data is\n * rendered — useful for offline contexts and fast-path test runs.\n */\n includeLiveStatus?: boolean;\n /**\n * Optional fetcher override (DI). Defaults to a built-in walker that\n * shells out via the shared `git`/`gh` runners. The walker is bounded\n * (~10 branches) and swallows per-branch errors; render falls back to\n * static when the whole fetch throws.\n */\n liveStatusFetcher?: LiveStatusFetcher;\n /**\n * Task ids the caller archived just before this bootstrap (AW-8). Rendered as\n * a short housekeeping note so the session knows they left the active list;\n * the actual file moves happen in the `open` command, not here.\n */\n archivedTaskIds?: string[];\n /**\n * When `true`, frame the session as ad-hoc work related to the workstream\n * rather than a continuation of its handoff / top task. The same context is\n * rendered, but the opening and closing directives tell the session to treat\n * it as background and await the user's specific ad-hoc task (AW-20).\n */\n adhoc?: boolean;\n}\n\nexport interface BootstrapMetadata {\n slug: string;\n brief_title: string;\n last_session?: { filename: string; ended: string };\n time_since_last_session_human?: string;\n open_task_count: number;\n recently_done_count: number;\n bootstrap_at: string;\n}\n\nexport interface BootstrapOutput {\n prompt: string;\n metadata: BootstrapMetadata;\n}\n\ninterface LoadedSession {\n filename: string;\n frontmatter: SessionFrontmatter;\n body: string;\n}\n\nconst FRONTMATTER_DELIM = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/;\n\n/**\n * Read a markdown file with YAML frontmatter and validate the frontmatter\n * against `schema`.\n *\n * We parse the YAML block using the `yaml` package (eemeli/yaml) rather than\n * relying on gray-matter, because gray-matter's js-yaml backend converts\n * bare YAML dates (e.g. `updated: 2026-05-10`) into JavaScript `Date`\n * instances. Our schemas validate `YYYY-MM-DD` strings, so we want the raw\n * lexical form preserved.\n */\nexport async function readMarkdownWithSchema<T>(\n filePath: string,\n schema: ZodType<T>,\n): Promise<{ frontmatter: T; body: string }> {\n const raw = await fs.readFile(filePath, 'utf8');\n const match = FRONTMATTER_DELIM.exec(raw);\n let frontmatterText = '';\n let body = raw;\n if (match) {\n frontmatterText = match[1] ?? '';\n body = match[2] ?? '';\n }\n const parsed = frontmatterText ? YAML.parse(frontmatterText) : {};\n const result = schema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Frontmatter validation failed for ${filePath}: ${result.error.message}`,\n );\n }\n return { frontmatter: result.data, body };\n}\n\n/**\n * Read all canonical sessions for an initiative, newest-`ended` first.\n *\n * Sidecar tracks and files that fail to parse are skipped silently — the\n * bootstrap is best-effort and must never crash on a malformed session.\n */\nasync function loadCanonicalSessions(\n initiativeDir: string,\n): Promise<LoadedSession[]> {\n const sessionsDir = path.join(initiativeDir, 'sessions');\n let entries: string[];\n try {\n entries = await fs.readdir(sessionsDir);\n } catch {\n return [];\n }\n const mdFiles = entries.filter((n) => n.endsWith('.md'));\n const loaded: LoadedSession[] = [];\n for (const filename of mdFiles) {\n const fullPath = path.join(sessionsDir, filename);\n try {\n const { frontmatter, body } = await readMarkdownWithSchema(\n fullPath,\n SessionFrontmatterSchema,\n );\n if (frontmatter.track === 'canonical') {\n loaded.push({ filename, frontmatter, body });\n }\n } catch {\n // Skip malformed sessions; bootstrap should remain best-effort.\n }\n }\n loaded.sort(\n (a, b) =>\n new Date(b.frontmatter.ended).getTime() -\n new Date(a.frontmatter.ended).getTime(),\n );\n return loaded;\n}\n\nasync function loadTasks(initiativeDir: string): Promise<Task[]> {\n const tasksDir = path.join(initiativeDir, 'tasks');\n let entries: string[];\n try {\n entries = await fs.readdir(tasksDir);\n } catch {\n return [];\n }\n const ymlFiles = entries.filter(\n (n) => n.endsWith('.yml') || n.endsWith('.yaml'),\n );\n const tasks: Task[] = [];\n for (const filename of ymlFiles) {\n const fullPath = path.join(tasksDir, filename);\n try {\n tasks.push(await readYaml(fullPath, TaskSchema));\n } catch {\n // Skip malformed task files.\n }\n }\n return tasks;\n}\n\nasync function loadArtifacts(initiativeDir: string): Promise<Artifacts> {\n const artifactsPath = path.join(initiativeDir, 'artifacts.yml');\n try {\n return await readYaml(artifactsPath, ArtifactsSchema);\n } catch {\n return { branches: [], stashes: [] };\n }\n}\n\nfunction truncateLines(body: string, max: number): string {\n const lines = body.split('\\n');\n const trimmed: string[] = [];\n let count = 0;\n for (const line of lines) {\n if (count >= max) break;\n trimmed.push(line);\n if (line.trim().length > 0) count++;\n }\n return trimmed.join('\\n').replace(/\\s+$/, '');\n}\n\n/**\n * Format the time between `from` and `now` as a human string.\n *\n * Thresholds:\n * - < 1h → \"just now\"\n * - < 24h → \"X hours ago\"\n * - < 14d → \"X days ago\"\n * - >= 14d → \"X days ago — likely needs context refresher\"\n */\nexport function formatTimeSince(from: Date, now: Date): string {\n const diffMs = now.getTime() - from.getTime();\n if (diffMs < MS_PER_HOUR) return 'just now';\n if (diffMs < MS_PER_DAY) {\n const hours = Math.floor(diffMs / MS_PER_HOUR);\n return `${hours} hour${hours === 1 ? '' : 's'} ago`;\n }\n const days = Math.floor(diffMs / MS_PER_DAY);\n const base = `${days} day${days === 1 ? '' : 's'} ago`;\n if (days >= RECENT_THRESHOLD_DAYS) {\n return `${base} — likely needs context refresher`;\n }\n return base;\n}\n\nfunction compareTasksByPriority(a: Task, b: Task): number {\n if (a.priority !== b.priority) return a.priority - b.priority;\n return a.id.localeCompare(b.id);\n}\n\nfunction firstLine(text: string | undefined): string | undefined {\n if (!text) return undefined;\n for (const line of text.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.length > 0) return trimmed;\n }\n return undefined;\n}\n\nfunction renderTaskLine(idx: number, task: Task): string {\n const meta: string[] = [`priority ${task.priority}`];\n if (task.severity) meta.push(`severity ${task.severity}`);\n if (task.estimate !== undefined) meta.push(`est ${task.estimate}`);\n let line = `${idx}. [${task.id}] (${meta.join(', ')}) ${task.title}`;\n const note = firstLine(task.notes);\n if (note) line += `\\n ${note}`;\n return line;\n}\n\nfunction renderTopTasks(tasks: Task[], topN: number): { body: string; count: number } {\n const openTasks = tasks\n .filter((t) => t.status === 'open')\n .sort(compareTasksByPriority);\n if (openTasks.length === 0) {\n return { body: '_No open tasks._', count: 0 };\n }\n const shown = openTasks.slice(0, topN);\n return {\n body: shown.map((task, i) => renderTaskLine(i + 1, task)).join('\\n'),\n count: openTasks.length,\n };\n}\n\nfunction renderRecentlyDone(\n tasks: Task[],\n windowDays: number,\n now: Date,\n): { body: string | null; count: number } {\n const cutoff = now.getTime() - windowDays * MS_PER_DAY;\n const done = tasks\n .filter((t) => t.status === 'done' && t.done_at)\n .filter((t) => {\n const ts = new Date(t.done_at as string).getTime();\n return Number.isFinite(ts) && ts >= cutoff;\n })\n .sort((a, b) => (a.done_at! < b.done_at! ? 1 : -1));\n if (done.length === 0) return { body: null, count: 0 };\n const body = done.map((t) => `- [${t.id}] ${t.title} — done ${t.done_at}`).join('\\n');\n return { body, count: done.length };\n}\n\nconst LIVE_RENDER_LIMIT = 10;\n\nfunction renderStaticBranchLine(branch: BranchEntry): string {\n const head = `- ${branch.name} (${branch.repo})`;\n return branch.note ? `${head} — ${branch.note}` : head;\n}\n\nfunction renderLiveBranchLine(status: LiveBranchStatus): string {\n const parts: string[] = [`- ${status.name} (${status.repo})`];\n if (!status.present) {\n parts.push('[missing locally]');\n } else if (status.ahead !== null && status.behind !== null) {\n parts.push(`+${status.ahead}/-${status.behind}`);\n }\n if (status.pr) {\n const checks = status.pr.checks ? ` ${status.pr.checks}` : '';\n parts.push(`PR #${status.pr.number} ${status.pr.state}${checks}`);\n }\n let line = parts.join(' ');\n if (status.note) line += ` — ${status.note}`;\n return line;\n}\n\nfunction renderStashes(artifacts: Artifacts): string | null {\n if (artifacts.stashes.length === 0) return null;\n return artifacts.stashes\n .map((s) => `- ${s.repo}: ${s.label}${s.sha ? ` (${s.sha.slice(0, 12)})` : ''}`)\n .join('\\n');\n}\n\nfunction renderStaticArtifacts(artifacts: Artifacts): string | null {\n const sections: string[] = [];\n if (artifacts.branches.length > 0) {\n const branchLines = artifacts.branches.map(renderStaticBranchLine).join('\\n');\n sections.push(`Branches:\\n${branchLines}`);\n }\n const stashBody = renderStashes(artifacts);\n if (stashBody) sections.push(`Stashes:\\n${stashBody}`);\n return sections.length > 0 ? sections.join('\\n\\n') : null;\n}\n\nfunction renderLiveArtifacts(\n artifacts: Artifacts,\n statuses: LiveBranchStatus[],\n): string | null {\n const sections: string[] = [];\n if (statuses.length > 0) {\n const shown = statuses.slice(0, LIVE_RENDER_LIMIT);\n const lines = shown.map(renderLiveBranchLine).join('\\n');\n const overflow = statuses.length - shown.length;\n const suffix = overflow > 0 ? `\\n(+${overflow} more)` : '';\n sections.push(`Branches (live):\\n${lines}${suffix}`);\n } else if (artifacts.branches.length > 0) {\n const branchLines = artifacts.branches.map(renderStaticBranchLine).join('\\n');\n sections.push(`Branches:\\n${branchLines}`);\n }\n const stashBody = renderStashes(artifacts);\n if (stashBody) sections.push(`Stashes:\\n${stashBody}`);\n return sections.length > 0 ? sections.join('\\n\\n') : null;\n}\n\n/**\n * Default fetcher used when the caller doesn't supply one. Mirrors the\n * read logic in `artifact.status` but is bounded in parallelism and\n * swallows per-branch errors silently — bootstrap never throws on artifact\n * issues.\n */\nasync function defaultLiveStatusFetcher(\n branches: BranchEntry[],\n): Promise<LiveBranchStatus[]> {\n const results: LiveBranchStatus[] = [];\n const limit = Math.min(branches.length, LIVE_RENDER_LIMIT);\n for (let i = 0; i < limit; i++) {\n results.push(await fetchOne(branches[i]!));\n }\n return results;\n}\n\nasync function fetchOne(branch: BranchEntry): Promise<LiveBranchStatus> {\n const out: LiveBranchStatus = {\n repo: branch.repo,\n name: branch.name,\n ...(branch.note ? { note: branch.note } : {}),\n present: false,\n last_commit_iso: null,\n ahead: null,\n behind: null,\n pr: null,\n };\n const repoPath = resolveLocalRepoPath(branch.repo);\n const git = getGitRunner();\n const gh = getGhRunner();\n\n if (repoPath) {\n try {\n const exists = await git('git', [\n '-C',\n repoPath,\n 'rev-parse',\n '--verify',\n `refs/heads/${branch.name}`,\n ]);\n out.present = exists.code === 0;\n } catch {\n // leave present=false\n }\n if (out.present) {\n try {\n const lc = await git('git', [\n '-C',\n repoPath,\n 'log',\n '-1',\n '--format=%cI',\n branch.name,\n ]);\n if (lc.code === 0) {\n const s = lc.stdout.trim();\n out.last_commit_iso = s.length > 0 ? s : null;\n }\n } catch {\n // skip\n }\n for (const base of ['main', 'master']) {\n try {\n const verify = await git('git', [\n '-C',\n repoPath,\n 'rev-parse',\n '--verify',\n `refs/remotes/origin/${base}`,\n ]);\n if (verify.code !== 0) continue;\n const counts = await git('git', [\n '-C',\n repoPath,\n 'rev-list',\n '--left-right',\n '--count',\n `origin/${base}...${branch.name}`,\n ]);\n if (counts.code === 0) {\n const parts = counts.stdout.trim().split(/\\s+/);\n if (parts.length === 2) {\n const b = Number(parts[0]);\n const a = Number(parts[1]);\n if (Number.isFinite(a) && Number.isFinite(b)) {\n out.ahead = a;\n out.behind = b;\n }\n }\n }\n break;\n } catch {\n // continue / give up\n }\n }\n }\n }\n\n try {\n const orgRepo = await resolveOrgRepo(branch.repo);\n if (orgRepo) {\n const res = await gh('gh', [\n 'pr',\n 'list',\n '--head',\n branch.name,\n '--repo',\n orgRepo,\n '--json',\n 'number,state,title,url,statusCheckRollup',\n '--limit',\n '1',\n ]);\n if (res.code === 0) {\n const parsed = JSON.parse(res.stdout) as Array<{\n number?: number;\n state?: string;\n title?: string;\n url?: string;\n statusCheckRollup?: Array<{ conclusion?: string; state?: string }>;\n }>;\n if (Array.isArray(parsed) && parsed.length > 0) {\n const first = parsed[0]!;\n if (\n typeof first.number === 'number' &&\n typeof first.state === 'string' &&\n typeof first.title === 'string' &&\n typeof first.url === 'string'\n ) {\n const rollup = first.statusCheckRollup ?? [];\n let pass = 0;\n let fail = 0;\n let pending = 0;\n for (const entry of rollup) {\n const tag = (entry.conclusion ?? entry.state ?? '').toUpperCase();\n if (tag === 'SUCCESS') pass++;\n else if (\n tag === 'FAILURE' ||\n tag === 'CANCELLED' ||\n tag === 'TIMED_OUT'\n )\n fail++;\n else pending++;\n }\n let checks: string | undefined;\n if (rollup.length > 0) {\n if (fail > 0) checks = `fail (${fail}/${rollup.length})`;\n else if (pending > 0) checks = `pending (${pending}/${rollup.length})`;\n else checks = `pass (${pass}/${rollup.length})`;\n }\n out.pr = {\n number: first.number,\n state: first.state,\n title: first.title,\n url: first.url,\n ...(checks ? { checks } : {}),\n };\n }\n }\n }\n }\n } catch {\n // PR lookup is best-effort; leave out.pr as null.\n }\n\n return out;\n}\n\nfunction endedDate(iso: string): string {\n return iso.slice(0, 10);\n}\n\nasync function loadBrief(\n initiativeDir: string,\n slug: string,\n): Promise<{ frontmatter: BriefFrontmatter; body: string }> {\n const briefPath = path.join(initiativeDir, 'brief.md');\n try {\n return await readMarkdownWithSchema(briefPath, BriefFrontmatterSchema);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new NotFoundError(\n `Initiative '${slug}' has no readable brief.md (${reason})`,\n );\n }\n}\n\n/**\n * Build the bootstrap prompt for `slug`.\n *\n * The prompt is composed entirely from files under the initiative directory;\n * missing artifacts (no sessions yet, no open tasks, no PRs) degrade\n * gracefully to omitted or \"none\" sections.\n */\nexport async function assembleBootstrap(\n input: BootstrapInput,\n): Promise<BootstrapOutput> {\n const {\n activeRoot,\n slug,\n now = new Date(),\n topNTasks = DEFAULT_TOP_N_TASKS,\n recentlyDoneDays = DEFAULT_RECENTLY_DONE_DAYS,\n includeLiveStatus = true,\n liveStatusFetcher,\n archivedTaskIds,\n adhoc = false,\n } = input;\n\n const initiativeDir = path.join(activeRoot, slug);\n const { frontmatter: brief, body: briefBody } = await loadBrief(\n initiativeDir,\n slug,\n );\n\n const [sessions, tasks, artifacts] = await Promise.all([\n loadCanonicalSessions(initiativeDir),\n loadTasks(initiativeDir),\n loadArtifacts(initiativeDir),\n ]);\n\n const latestSession = sessions[0];\n const briefExcerpt = truncateLines(briefBody, BRIEF_BODY_MAX_LINES) || '_(no brief body)_';\n const { body: tasksBody, count: openTaskCount } = renderTopTasks(tasks, topNTasks);\n const { body: recentlyDoneBody, count: recentlyDoneCount } = renderRecentlyDone(\n tasks,\n recentlyDoneDays,\n now,\n );\n let artifactsBody: string | null = null;\n if (!includeLiveStatus || artifacts.branches.length === 0) {\n artifactsBody = renderStaticArtifacts(artifacts);\n } else {\n const fetcher = liveStatusFetcher ?? defaultLiveStatusFetcher;\n try {\n const statuses = await fetcher(artifacts.branches);\n artifactsBody = renderLiveArtifacts(artifacts, statuses);\n } catch {\n // Live fetch failed entirely — degrade to static rendering.\n artifactsBody = renderStaticArtifacts(artifacts);\n }\n }\n\n const timeSinceHuman = latestSession\n ? formatTimeSince(new Date(latestSession.frontmatter.ended), now)\n : undefined;\n\n const sections: string[] = [];\n sections.push(\n adhoc\n ? `Starting an ad-hoc session on \\`${slug}\\` (${brief.title}). This session is scoped to ad-hoc work related to this workstream — not necessarily its handoff or current top task. The context below is background so you're oriented; wait for the user to describe the specific ad-hoc task before acting.`\n : `Starting a session on \\`${slug}\\` (${brief.title}).`,\n );\n sections.push(`# Why we're doing this\\n${briefExcerpt}`);\n\n if (latestSession) {\n const sessionExcerpt =\n truncateLines(latestSession.body, SESSION_BODY_MAX_LINES) ||\n '_(empty session body)_';\n const ended = endedDate(latestSession.frontmatter.ended);\n sections.push(\n `# Last session (${ended}, ${latestSession.frontmatter.session_id}) — ${timeSinceHuman}\\n${sessionExcerpt}`,\n );\n } else {\n sections.push(`# Last session\\nNo previous sessions recorded.`);\n }\n\n sections.push(`# Tasks (top ${topNTasks} open by priority)\\n${tasksBody}`);\n\n if (recentlyDoneBody) {\n sections.push(\n `# Recently done (last ${recentlyDoneDays} days)\\n${recentlyDoneBody}`,\n );\n }\n\n if (archivedTaskIds && archivedTaskIds.length > 0) {\n sections.push(\n `# Archived (housekeeping)\\nMoved ${archivedTaskIds.length} stale done task(s) to tasks/archive/: ${archivedTaskIds.join(', ')}`,\n );\n }\n\n if (artifactsBody) {\n sections.push(`# Open artifacts\\n${artifactsBody}`);\n }\n\n const bootstrapAt = nowIso();\n const todayStr = today();\n const contextLines = [`- Today: ${todayStr}`, `- Bootstrap: ${bootstrapAt}`];\n if (timeSinceHuman) {\n contextLines.push(`- Time since last session: ${timeSinceHuman}`);\n }\n sections.push(`# Context\\n${contextLines.join('\\n')}`);\n\n sections.push(\n adhoc\n ? `This is an ad-hoc session: treat the context above as background, not a directive. Do not assume we're continuing the top task or the handoff — the user will describe the specific ad-hoc task. Once they do, work it with the workstream context in mind. If it turns out to be substantive, still capture it via \\`active-work task add\\` / \\`active-work session record\\`.`\n : `Work the top task unless redirected. Update tasks via \\`active-work task done\\` and capture the session via \\`active-work session record\\` when wrapping up.`,\n );\n\n const prompt = sections.join('\\n\\n') + '\\n';\n\n const metadata: BootstrapMetadata = {\n slug,\n brief_title: brief.title,\n open_task_count: openTaskCount,\n recently_done_count: recentlyDoneCount,\n bootstrap_at: bootstrapAt,\n };\n if (latestSession) {\n metadata.last_session = {\n filename: latestSession.filename,\n ended: latestSession.frontmatter.ended,\n };\n }\n if (timeSinceHuman) {\n metadata.time_since_last_session_human = timeSinceHuman;\n }\n\n return { prompt, metadata };\n}\n","import { z } from 'zod';\n\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst isValidIsoDate = (value: string): boolean => {\n if (!ISO_DATE_REGEX.test(value)) return false;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return false;\n return parsed.toISOString().slice(0, 10) === value;\n};\n\nconst isoDate = z\n .string()\n .refine(isValidIsoDate, { message: 'Must be a valid zero-padded YYYY-MM-DD date' });\n\nconst isoDateOrNull = z.union([isoDate, z.null()]);\n\nexport const TaskSchema = z.object({\n id: z.string().regex(/^[A-Z][A-Z0-9]*-\\d+$/, {\n message: 'id must match /^[A-Z][A-Z0-9]*-\\\\d+$/ (e.g. EC-1)',\n }),\n title: z.string().min(1),\n priority: z.number().int().positive(),\n severity: z.enum(['critical', 'high', 'medium', 'low']).optional(),\n estimate: z.number().positive().optional(),\n done_when: z.string().min(1).optional(),\n status: z.enum(['open', 'done']),\n tags: z.array(z.string()).optional(),\n notes: z.string().optional(),\n created: isoDate,\n updated: isoDate,\n done_at: isoDateOrNull,\n});\n\nexport type Task = z.infer<typeof TaskSchema>;\n","import { z } from 'zod';\n\n// Accepts standard ISO 8601 datetimes with timezone (Z or ±HH:MM), optional fractional seconds.\nconst ISO_8601_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\nconst isValidIso8601 = (value: string): boolean => {\n if (!ISO_8601_REGEX.test(value)) return false;\n const parsed = new Date(value);\n return !Number.isNaN(parsed.getTime());\n};\n\nconst iso8601 = z\n .string()\n .refine(isValidIso8601, { message: 'Must be a valid ISO 8601 datetime with timezone' });\n\nexport const SessionFrontmatterSchema = z\n .object({\n session_id: z.string().min(1),\n started: iso8601,\n ended: iso8601,\n track: z.enum(['canonical', 'sidecar']),\n })\n .superRefine((value, ctx) => {\n const started = new Date(value.started).getTime();\n const ended = new Date(value.ended).getTime();\n if (Number.isFinite(started) && Number.isFinite(ended) && ended < started) {\n ctx.addIssue({\n code: 'custom',\n path: ['ended'],\n message: 'ended must be greater than or equal to started',\n });\n }\n });\n\nexport type SessionFrontmatter = z.infer<typeof SessionFrontmatterSchema>;\n","import { z } from 'zod';\n\n/**\n * Schema v2 (AW-15): `artifacts.yml` carries only durable identifiers.\n *\n * - `prs[]` was dropped. PR state is derived live via `gh pr list --head <branch>`\n * in `artifact.status` (see `src/commands/artifact-status.ts`); persisting it\n * only led to stale snapshots that agents kept hand-editing.\n * - `branches[]` gained an optional `note` for \"why this branch is worth\n * tracking\" context. The `last_commit` field is gone — it's derivable from\n * git at read time.\n * - `stashes[].message` was renamed to `label` for consistency, `created` was\n * dropped (stashes are ephemeral and the data lived in git anyway), and\n * `sha` was added so callers can record it if known.\n */\n\nexport const BranchEntrySchema = z.object({\n repo: z.string().min(1),\n name: z.string().min(1),\n note: z.string().optional(),\n});\n\nexport const StashEntrySchema = z.object({\n repo: z.string().min(1),\n label: z.string().min(1),\n sha: z.string().optional(),\n});\n\nexport const ArtifactsSchema = z.object({\n branches: z.array(BranchEntrySchema).default([]),\n stashes: z.array(StashEntrySchema).default([]),\n});\n\nexport type BranchEntry = z.infer<typeof BranchEntrySchema>;\nexport type StashEntry = z.infer<typeof StashEntrySchema>;\nexport type Artifacts = z.infer<typeof ArtifactsSchema>;\n","import { promises as fs } from 'node:fs';\nimport YAML from 'yaml';\nimport type { ZodType } from 'zod';\nimport { atomicWrite } from './fs-atomic.js';\nimport { coerceDates } from './coerce-dates.js';\n\n/**\n * Read and parse a YAML file, validating its contents against `schema`.\n *\n * Throws when the file is unreadable, the YAML is malformed, or the parsed\n * value does not satisfy `schema`. Validation errors include the file path\n * to help locate the offending file.\n */\nexport async function readYaml<T>(filePath: string, schema: ZodType<T>): Promise<T> {\n const raw = await fs.readFile(filePath, 'utf8');\n let parsed: unknown;\n try {\n parsed = YAML.parse(raw);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to parse YAML at ${filePath}: ${reason}`);\n }\n const coerced = coerceDates(parsed);\n const result = schema.safeParse(coerced);\n if (!result.success) {\n throw new Error(`Schema validation failed for ${filePath}: ${result.error.message}`);\n }\n return result.data;\n}\n\n/**\n * Write `data` as YAML to `filePath` atomically after validating `schema`.\n *\n * Validation runs before any disk write so an invalid object never lands on\n * disk.\n */\nexport async function writeYaml<T>(\n filePath: string,\n data: T,\n schema: ZodType<T>,\n): Promise<void> {\n const result = schema.safeParse(data);\n if (!result.success) {\n throw new Error(`Schema validation failed for ${filePath}: ${result.error.message}`);\n }\n const yaml = YAML.stringify(result.data);\n await atomicWrite(filePath, yaml);\n}\n","import { randomBytes } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport lockfile from 'proper-lockfile';\n\n/**\n * Write `content` to `targetPath` atomically.\n *\n * Strategy: write to a sibling temp file, `fsync` the file, then `rename` to\n * the destination. The temp file lives in the same directory so the rename\n * stays within one filesystem (a requirement for atomic rename on POSIX).\n */\nexport async function atomicWrite(\n targetPath: string,\n content: string | Buffer,\n): Promise<void> {\n const dir = path.dirname(targetPath);\n const base = path.basename(targetPath);\n const suffix = `${process.pid}.${randomBytes(6).toString('hex')}`;\n const tempPath = path.join(dir, `${base}.tmp.${suffix}`);\n\n let handle: fs.FileHandle | undefined;\n try {\n handle = await fs.open(tempPath, 'wx');\n await handle.writeFile(content);\n await handle.sync();\n } finally {\n if (handle) await handle.close();\n }\n\n try {\n await fs.rename(tempPath, targetPath);\n } catch (err) {\n await fs.rm(tempPath, { force: true });\n throw err;\n }\n}\n\n/**\n * Run `fn` while holding an advisory lock on `lockTarget`.\n *\n * Uses `proper-lockfile` with `realpath: false` so the target need not exist.\n * The lock is always released, even when `fn` rejects.\n */\nexport async function withFileLock<T>(\n lockTarget: string,\n fn: () => Promise<T>,\n): Promise<T> {\n await fs.mkdir(path.dirname(lockTarget), { recursive: true });\n const release = await lockfile.lock(lockTarget, {\n realpath: false,\n retries: { retries: 5, factor: 1.5, minTimeout: 50 },\n });\n try {\n return await fn();\n } finally {\n await release();\n }\n}\n","/**\n * YAML parsers (js-yaml inside gray-matter; the `yaml` package) parse bare\n * ISO 8601 timestamps into JavaScript Date instances by default. Our zod\n * schemas validate dates as YYYY-MM-DD or ISO 8601 STRINGS — so we re-coerce\n * any Date we find back into the appropriate string form before validation.\n *\n * A midnight-UTC Date round-trips as YYYY-MM-DD; any non-midnight Date\n * round-trips as the full ISO 8601 string. The heuristic matches the two\n * schema shapes we have (date-only fields like `updated`, ISO fields like\n * `started`/`ended`/`last_checked`).\n */\n\nfunction dateToString(d: Date): string {\n if (\n d.getUTCHours() === 0 &&\n d.getUTCMinutes() === 0 &&\n d.getUTCSeconds() === 0 &&\n d.getUTCMilliseconds() === 0\n ) {\n return d.toISOString().slice(0, 10);\n }\n return d.toISOString();\n}\n\nexport function coerceDates(value: unknown): unknown {\n if (value instanceof Date) {\n return dateToString(value);\n }\n if (Array.isArray(value)) {\n return value.map(coerceDates);\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = coerceDates(v);\n }\n return out;\n }\n return value;\n}\n","import { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport { expandTilde } from './paths.js';\n\n/**\n * Live-pull helpers for AW-15 `artifact.status` / `artifact.prune`.\n *\n * Everything in this module is failure-tolerant: callers want partial data\n * with per-branch error strings, not a single thrown exception that aborts\n * the entire status sweep. The runners are exposed as injectable DI hooks so\n * tests can stub them without spawning subprocesses.\n */\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport interface CommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\nexport type CommandRunner = (\n bin: string,\n args: string[],\n opts?: { cwd?: string; timeoutMs?: number },\n) => Promise<CommandResult>;\n\nconst defaultRunner: CommandRunner = (bin, args, opts = {}) =>\n new Promise<CommandResult>((resolve, reject) => {\n const child = spawn(bin, args, {\n cwd: opts.cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n child.kill('SIGKILL');\n reject(new Error(`${bin} timed out after ${opts.timeoutMs ?? DEFAULT_TIMEOUT_MS}ms`));\n }, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n child.stdout?.on('data', (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr?.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(err);\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({\n code,\n stdout: Buffer.concat(stdoutChunks).toString('utf8'),\n stderr: Buffer.concat(stderrChunks).toString('utf8'),\n });\n });\n });\n\nlet gitRunner: CommandRunner = defaultRunner;\nlet ghRunner: CommandRunner = defaultRunner;\n\nexport function setGitRunner(next: CommandRunner): void {\n gitRunner = next;\n}\n\nexport function setGhRunner(next: CommandRunner): void {\n ghRunner = next;\n}\n\nexport function resetRunners(): void {\n gitRunner = defaultRunner;\n ghRunner = defaultRunner;\n}\n\nexport function getGitRunner(): CommandRunner {\n return gitRunner;\n}\n\nexport function getGhRunner(): CommandRunner {\n return ghRunner;\n}\n\n/**\n * True when `repo` looks like a bare `org/repo` GitHub spec rather than a\n * filesystem path.\n *\n * Heuristic: exactly one slash, no leading `/`, `~`, or `.`, and no whitespace.\n * `~/code/sample` has a tilde, `./foo/bar` has a dot, `/abs/path` starts with\n * `/` — all of those are treated as paths.\n */\nexport function looksLikeOrgRepo(repo: string): boolean {\n if (!repo) return false;\n if (repo.startsWith('/') || repo.startsWith('~') || repo.startsWith('.')) return false;\n if (/\\s/.test(repo)) return false;\n const slashCount = (repo.match(/\\//g) ?? []).length;\n return slashCount === 1;\n}\n\n/**\n * Resolve a `branches[].repo` value (which may be a local path or `org/repo`)\n * to an absolute filesystem path. Returns `null` when the value looks like\n * an `org/repo` spec (no local clone to operate on).\n */\nexport function resolveLocalRepoPath(repo: string): string | null {\n if (looksLikeOrgRepo(repo)) return null;\n return path.resolve(expandTilde(repo));\n}\n\n/**\n * Run `git -C <repoPath> remote get-url origin` and derive `org/repo` from\n * the URL. Supports https, ssh, and git:// URLs. Returns null if the URL\n * can't be parsed or the call fails.\n */\nexport async function deriveOrgRepoFromPath(repoPath: string): Promise<string | null> {\n try {\n const res = await gitRunner('git', ['-C', repoPath, 'remote', 'get-url', 'origin']);\n if (res.code !== 0) return null;\n return parseOrgRepoFromRemoteUrl(res.stdout.trim());\n } catch {\n return null;\n }\n}\n\n/** Parse `org/repo` out of a git remote URL. Exported for testing. */\nexport function parseOrgRepoFromRemoteUrl(url: string): string | null {\n // https://github.com/org/repo(.git)?\n // git@github.com:org/repo(.git)?\n // ssh://git@github.com/org/repo(.git)?\n const trimmed = url.trim().replace(/\\.git$/, '');\n const sshMatch = /^[^@]+@[^:]+:([^/]+)\\/(.+)$/.exec(trimmed);\n if (sshMatch) return `${sshMatch[1]}/${sshMatch[2]}`;\n try {\n const u = new URL(trimmed);\n const parts = u.pathname.replace(/^\\//, '').split('/');\n if (parts.length >= 2 && parts[0] && parts[1]) {\n return `${parts[0]}/${parts[1]}`;\n }\n } catch {\n // not a parseable URL\n }\n return null;\n}\n\n/**\n * Resolve `repo` to an `org/repo` string suitable for `gh`. If `repo` already\n * looks like `org/repo`, return it unchanged. Otherwise treat it as a local\n * path and derive from `git remote`. Returns null when neither route works.\n */\nexport async function resolveOrgRepo(repo: string): Promise<string | null> {\n if (looksLikeOrgRepo(repo)) return repo;\n const localPath = resolveLocalRepoPath(repo);\n if (!localPath) return null;\n return deriveOrgRepoFromPath(localPath);\n}\n","/** Return today's local date as `YYYY-MM-DD`. */\nexport function today(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/** Return the current instant as an ISO 8601 string with millisecond precision. */\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n","/**\n * Auto-archive stale done tasks during bootstrap (AW-8).\n *\n * A `done` task whose `done_at` is older than `retentionDays` is moved from\n * `tasks/<id>.yml` into `tasks/archive/<id>.yml`. Every task reader filters by\n * the `.yml`/`.yaml` extension, so the `archive/` subdirectory is naturally\n * excluded from the active list while the file is preserved for recovery.\n *\n * Best-effort: unreadable/malformed task files and per-file move failures are\n * skipped rather than aborting the bootstrap.\n */\nimport { promises as fsp } from 'node:fs';\nimport path from 'node:path';\nimport { readYaml } from '../utils/yaml-io.js';\nimport { TaskSchema } from '../schemas/task.js';\n\nconst MS_PER_DAY = 86_400_000;\n\nexport interface ArchiveStaleTasksOptions {\n /** Done tasks whose `done_at` is older than this many days are archived. */\n retentionDays: number;\n /** Reference time (injectable for tests). */\n now: Date;\n}\n\n/**\n * Move stale done tasks into `tasks/archive/`. Returns the archived task ids\n * (sorted). A non-positive `retentionDays` disables archiving.\n */\nexport async function archiveStaleTasks(\n initiativeDir: string,\n opts: ArchiveStaleTasksOptions,\n): Promise<string[]> {\n if (!(opts.retentionDays > 0)) return [];\n const tasksDir = path.join(initiativeDir, 'tasks');\n let entries: string[];\n try {\n entries = await fsp.readdir(tasksDir);\n } catch {\n return [];\n }\n const ymlFiles = entries.filter(\n (n) => n.endsWith('.yml') || n.endsWith('.yaml'),\n );\n const cutoffMs = opts.now.getTime() - opts.retentionDays * MS_PER_DAY;\n const archiveDir = path.join(tasksDir, 'archive');\n const archived: string[] = [];\n\n for (const filename of ymlFiles) {\n const fullPath = path.join(tasksDir, filename);\n let doneAt: string | null;\n let id: string;\n try {\n const task = await readYaml(fullPath, TaskSchema);\n if (task.status !== 'done' || !task.done_at) continue;\n doneAt = task.done_at;\n id = task.id;\n } catch {\n continue; // malformed / unreadable — leave it in place\n }\n const doneMs = new Date(doneAt).getTime();\n if (Number.isNaN(doneMs) || doneMs > cutoffMs) continue;\n try {\n await fsp.mkdir(archiveDir, { recursive: true });\n await fsp.rename(fullPath, path.join(archiveDir, filename));\n archived.push(id);\n } catch {\n // best-effort: skip files we can't move\n }\n }\n return archived.sort();\n}\n","import { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport { BriefFrontmatterSchema, type BriefFrontmatter } from '../schemas/brief.js';\nimport { expandTilde } from '../utils/paths.js';\nimport { NotFoundError } from '../errors.js';\nimport { readMarkdownWithSchema } from '../bootstrap/prompt.js';\n\n/** List initiative slugs (immediate, non-dotfile subdirectories of the root). */\nexport async function listInitiativeSlugs(\n activeRoot: string,\n): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(activeRoot, { withFileTypes: true });\n } catch {\n return [];\n }\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith('.'))\n .map((e) => e.name)\n .sort();\n}\n\n/**\n * Resolve a user-supplied slug (exact or unique prefix) to a full slug.\n * Throws NotFoundError on no match, and on an ambiguous prefix.\n */\nexport async function resolveSlug(\n activeRoot: string,\n input: string,\n): Promise<string> {\n const slugs = await listInitiativeSlugs(activeRoot);\n if (slugs.includes(input)) return input;\n const matches = slugs.filter((s) => s.startsWith(input));\n if (matches.length === 1) return matches[0]!;\n if (matches.length > 1) {\n throw new NotFoundError(\n `Ambiguous slug '${input}'. Candidates: ${matches.join(', ')}`,\n );\n }\n if (slugs.length === 0) {\n throw new NotFoundError(`No initiatives found under ${activeRoot}`);\n }\n throw new NotFoundError(\n `No initiative matches '${input}'. Known: ${slugs.join(', ')}`,\n );\n}\n\n/** True when `child` is `parent` itself or nested beneath it. */\nfunction isInside(child: string, parent: string): boolean {\n const rel = path.relative(parent, child);\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n\n/**\n * Canonicalize a path via `realpath`, falling back to a lexical resolve when\n * the path doesn't exist yet. Needed because `process.cwd()` returns the\n * symlink-resolved path on macOS (e.g. `/var` → `/private/var`) while a brief\n * may store the un-resolved form — matching them requires both canonicalized.\n */\nasync function canonicalize(p: string): Promise<string> {\n try {\n return await fs.realpath(p);\n } catch {\n return path.resolve(p);\n }\n}\n\nexport interface CwdMatch {\n slug: string;\n worktreePath: string;\n}\n\n/**\n * Resolve an initiative from a working directory by matching it against every\n * initiative's worktree paths. When `cwd` sits inside more than one worktree\n * (e.g. nested checkouts) the deepest — longest — worktree path wins. Returns\n * the matched slug and (display-form) worktree path, or null when nothing\n * matches or two initiatives tie at the same depth (ambiguous → fall back to\n * the picker).\n *\n * Both sides are canonicalized with `realpath` so symlinked paths still match.\n * Relative worktree paths are skipped, since they cannot be compared against\n * an absolute cwd deterministically.\n */\nexport async function resolveSlugFromCwd(\n activeRoot: string,\n cwd: string,\n): Promise<CwdMatch | null> {\n const resolvedCwd = await canonicalize(cwd);\n const slugs = await listInitiativeSlugs(activeRoot);\n let best: { slug: string; worktreePath: string; depth: number } | null = null;\n let tiedAtBest = false;\n\n for (const slug of slugs) {\n const briefPath = path.join(activeRoot, slug, 'brief.md');\n let brief: BriefFrontmatter;\n try {\n ({ frontmatter: brief } = await readMarkdownWithSchema(\n briefPath,\n BriefFrontmatterSchema,\n ));\n } catch {\n continue;\n }\n for (const entry of Object.values(brief.worktrees ?? {})) {\n const displayPath = expandTilde(entry.path);\n if (!path.isAbsolute(displayPath)) continue;\n const canonical = await canonicalize(displayPath);\n if (!isInside(resolvedCwd, canonical)) continue;\n const depth = canonical.length;\n if (best === null || depth > best.depth) {\n best = { slug, worktreePath: displayPath, depth };\n tiedAtBest = false;\n } else if (depth === best.depth && slug !== best.slug) {\n tiedAtBest = true;\n }\n }\n }\n\n if (best === null || tiedAtBest) return null;\n return { slug: best.slug, worktreePath: best.worktreePath };\n}\n","import pc from 'picocolors';\n\n/**\n * Lightweight color wrapper that respects `NO_COLOR` and TTY detection.\n *\n * If `NO_COLOR` is set or stdout is not a TTY (e.g. piped output or test\n * runners), every helper returns its input unchanged so JSON and human\n * output stay free of escape codes when they would only add noise.\n */\nconst enabled =\n !('NO_COLOR' in process.env) && process.stdout.isTTY === true;\n\nconst identity = (s: string): string => s;\n\nexport const color = {\n enabled,\n bold: enabled ? pc.bold : identity,\n dim: enabled ? pc.dim : identity,\n green: enabled ? pc.green : identity,\n yellow: enabled ? pc.yellow : identity,\n red: enabled ? pc.red : identity,\n cyan: enabled ? pc.cyan : identity,\n gray: enabled ? pc.gray : identity,\n};\n"],"mappings":"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","names":["path","z","fs","path","z","ISO_DATE_REGEX","isValidIsoDate","isoDate","z","z","fs","path","fs","path","path","YAML","fs","path","path","MS_PER_DAY","path","fs","path","fs","path","z","path"]}