@sduck/sduck-cli 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sduck/sduck-assets/agent-rules/core.md +18 -9
- package/README.md +136 -34
- package/dist/cli.js +986 -198
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/core/archive.ts","../src/core/fs.ts","../src/core/project-paths.ts","../src/core/workspace.ts","../src/commands/archive.ts","../src/core/done.ts","../src/utils/utc-date.ts","../src/commands/done.ts","../src/commands/fast-track.ts","../src/core/fast-track.ts","../src/core/assets.ts","../src/core/plan-approve.ts","../src/core/spec-approve.ts","../src/core/start.ts","../src/commands/init.ts","../src/core/agent-rules.ts","../src/core/init.ts","../src/commands/plan-approve.ts","../src/core/reopen.ts","../src/commands/reopen.ts","../src/commands/spec-approve.ts","../src/commands/start.ts","../package.json","../src/core/command-metadata.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\n\nimport { runArchiveCommand } from './commands/archive.js';\nimport { runDoneCommand } from './commands/done.js';\nimport { runFastTrackCommand } from './commands/fast-track.js';\nimport { runInitCommand } from './commands/init.js';\nimport { runPlanApproveCommand } from './commands/plan-approve.js';\nimport { runReopenCommand } from './commands/reopen.js';\nimport { runSpecApproveCommand } from './commands/spec-approve.js';\nimport { runStartCommand } from './commands/start.js';\nimport {\n CLI_DESCRIPTION,\n CLI_NAME,\n CLI_VERSION,\n PLACEHOLDER_MESSAGE,\n normalizeCommandName,\n} from './core/command-metadata.js';\n\nconst program = new Command();\n\nprogram.name(CLI_NAME).description(CLI_DESCRIPTION).version(CLI_VERSION);\n\nprogram\n .command('init')\n .description('Initialize the current repository for the SDD workflow')\n .option('--force', 'Regenerate the bundled assets in .sduck/sduck-assets')\n .option(\n '--agents <agents>',\n 'Comma-separated agents (claude-code,codex,opencode,gemini-cli,cursor,antigravity)',\n )\n .action(async (options: { agents?: string; force?: boolean }) => {\n const initOptions =\n options.agents === undefined\n ? { force: options.force ?? false }\n : { agents: options.agents, force: options.force ?? false };\n const result = await runInitCommand(initOptions, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('preview <name>')\n .description('Print the normalized command name for bootstrap verification')\n .action((name: string) => {\n console.log(normalizeCommandName(name));\n });\n\nprogram\n .command('start <type> <slug>')\n .description('Create a new task workspace from a type template')\n .action(async (type: string, slug: string) => {\n const result = await runStartCommand(type, slug, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('fast-track <type> <slug>')\n .description('Create a minimal spec/plan task with optional bundled approval')\n .action(async (type: string, slug: string) => {\n const result = await runFastTrackCommand({ slug, type }, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('spec')\n .description('Manage spec workflow state')\n .command('approve [target]')\n .description('Approve a task spec and move it to plan writing')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runSpecApproveCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('plan')\n .description('Manage plan workflow state')\n .command('approve [target]')\n .description('Approve a task plan and move it to implementation')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runPlanApproveCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('done [target]')\n .description('Complete an in-progress task after validation')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runDoneCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('reopen [target]')\n .description('Reopen a completed task for a new cycle')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runReopenCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('archive')\n .description('Archive completed tasks into monthly directories')\n .option('--keep <n>', 'Keep the N most recently completed tasks in workspace', '0')\n .action(async (options: { keep: string }) => {\n const keep = Number(options.keep);\n const result = await runArchiveCommand({ keep }, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('roadmap')\n .description('Show the current bootstrap status')\n .action(() => {\n console.log(PLACEHOLDER_MESSAGE);\n });\n\nawait program.parseAsync(process.argv);\n","import { readFile, rename } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { ensureDirectory, getFsEntryKind } from './fs.js';\nimport { getProjectSduckArchivePath } from './project-paths.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\n\nexport interface ArchiveCommandInput {\n keep?: number;\n}\n\nexport interface ArchiveTarget {\n completedAt: string;\n id: string;\n month: string;\n path: string;\n slug?: string | undefined;\n}\n\nexport interface ArchiveSuccessRow {\n month: string;\n taskId: string;\n}\n\nexport interface ArchiveSkipRow {\n reason: string;\n taskId: string;\n}\n\nexport interface ArchiveResult {\n archived: ArchiveSuccessRow[];\n skipped: ArchiveSkipRow[];\n}\n\nexport function extractCompletedAt(metaContent: string): string | null {\n const match = /^completed_at:\\s+(.+)$/m.exec(metaContent);\n const value = match?.[1]?.trim();\n\n if (value === undefined || value === 'null') {\n return null;\n }\n\n return value;\n}\n\nexport function deriveArchiveMonth(completedAt: string): string {\n return completedAt.slice(0, 7);\n}\n\nexport function filterArchiveCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): WorkspaceTaskSummary[] {\n return tasks.filter((task) => task.status === 'DONE');\n}\n\nexport async function isAlreadyArchived(\n archivePath: string,\n taskDirName: string,\n): Promise<boolean> {\n const targetPath = join(archivePath, taskDirName);\n return (await getFsEntryKind(targetPath)) === 'directory';\n}\n\nexport async function loadArchiveTargets(\n projectRoot: string,\n input: ArchiveCommandInput,\n): Promise<ArchiveTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n const doneTasks = filterArchiveCandidates(tasks);\n const targets: ArchiveTarget[] = [];\n\n for (const task of doneTasks) {\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n const metaContent = await readFile(metaPath, 'utf8');\n const completedAt = extractCompletedAt(metaContent);\n\n if (completedAt === null) {\n continue;\n }\n\n targets.push({\n completedAt,\n id: task.id,\n month: deriveArchiveMonth(completedAt),\n path: task.path,\n slug: task.slug,\n });\n }\n\n targets.sort((a, b) => a.completedAt.localeCompare(b.completedAt));\n\n const keep = input.keep ?? 0;\n\n if (keep > 0 && targets.length > keep) {\n return targets.slice(0, targets.length - keep);\n }\n\n return targets;\n}\n\nexport async function runArchiveWorkflow(\n projectRoot: string,\n targets: readonly ArchiveTarget[],\n): Promise<ArchiveResult> {\n const archiveRoot = getProjectSduckArchivePath(projectRoot);\n const archived: ArchiveSuccessRow[] = [];\n const skipped: ArchiveSkipRow[] = [];\n\n for (const target of targets) {\n const monthDir = join(archiveRoot, target.month);\n await ensureDirectory(monthDir);\n\n const segments = target.path.split('/');\n const taskDirName = segments.at(-1) ?? target.id;\n\n if (await isAlreadyArchived(monthDir, taskDirName)) {\n skipped.push({ reason: 'already archived', taskId: target.id });\n continue;\n }\n\n const sourcePath = join(projectRoot, target.path);\n const destPath = join(monthDir, taskDirName);\n\n await rename(sourcePath, destPath);\n archived.push({ month: target.month, taskId: target.id });\n }\n\n return { archived, skipped };\n}\n","import { constants } from 'node:fs';\nimport { access, copyFile, mkdir, stat } from 'node:fs/promises';\n\nexport type FsEntryKind = 'missing' | 'file' | 'directory';\n\nexport async function getFsEntryKind(targetPath: string): Promise<FsEntryKind> {\n try {\n const stats = await stat(targetPath);\n\n if (stats.isDirectory()) {\n return 'directory';\n }\n\n if (stats.isFile()) {\n return 'file';\n }\n\n return 'file';\n } catch {\n return 'missing';\n }\n}\n\nexport async function ensureDirectory(targetPath: string): Promise<void> {\n await mkdir(targetPath, { recursive: true });\n}\n\nexport async function ensureReadableFile(targetPath: string): Promise<void> {\n await access(targetPath, constants.R_OK);\n}\n\nexport async function copyFileIntoPlace(sourcePath: string, targetPath: string): Promise<void> {\n await copyFile(sourcePath, targetPath);\n}\n","import { join, relative } from 'node:path';\n\nexport const SDUCK_HOME_DIR = '.sduck';\nexport const SDUCK_ASSETS_DIR = 'sduck-assets';\nexport const SDUCK_WORKSPACE_DIR = 'sduck-workspace';\nexport const SDUCK_ARCHIVE_DIR = 'sduck-archive';\n\nexport const PROJECT_SDUCK_HOME_RELATIVE_PATH = SDUCK_HOME_DIR;\nexport const PROJECT_SDUCK_ASSETS_RELATIVE_PATH = join(SDUCK_HOME_DIR, SDUCK_ASSETS_DIR);\nexport const PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH = join(SDUCK_HOME_DIR, SDUCK_WORKSPACE_DIR);\nexport const PROJECT_SDUCK_ARCHIVE_RELATIVE_PATH = join(SDUCK_HOME_DIR, SDUCK_ARCHIVE_DIR);\n\nexport function getProjectSduckHomePath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_HOME_RELATIVE_PATH);\n}\n\nexport function getProjectSduckAssetsPath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_ASSETS_RELATIVE_PATH);\n}\n\nexport function getProjectSduckWorkspacePath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH);\n}\n\nexport function getProjectSduckArchivePath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_ARCHIVE_RELATIVE_PATH);\n}\n\nexport function getProjectRelativeSduckAssetPath(...segments: string[]): string {\n return join(PROJECT_SDUCK_ASSETS_RELATIVE_PATH, ...segments);\n}\n\nexport function getProjectRelativeSduckWorkspacePath(...segments: string[]): string {\n return join(PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH, ...segments);\n}\n\nexport function toBundledAssetRelativePath(projectRelativeAssetPath: string): string {\n return relative(PROJECT_SDUCK_ASSETS_RELATIVE_PATH, projectRelativeAssetPath);\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport {\n getProjectRelativeSduckWorkspacePath,\n getProjectSduckWorkspacePath,\n} from './project-paths.js';\n\nexport interface ActiveTaskSummary {\n id: string;\n path: string;\n status: string;\n}\n\nexport interface WorkspaceTaskSummary {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nconst ACTIVE_STATUSES = new Set(['IN_PROGRESS', 'PENDING_SPEC_APPROVAL', 'PENDING_PLAN_APPROVAL']);\n\ninterface ParsedMeta {\n createdAt?: string;\n id?: string;\n slug?: string;\n status?: string;\n}\n\nfunction parseMetaText(content: string): ParsedMeta {\n const createdAtMatch = /^created_at:\\s+(.+)$/m.exec(content);\n const idMatch = /^id:\\s+(.+)$/m.exec(content);\n const slugMatch = /^slug:\\s+(.+)$/m.exec(content);\n const statusMatch = /^status:\\s+(.+)$/m.exec(content);\n const parsedMeta: ParsedMeta = {};\n\n if (createdAtMatch?.[1] !== undefined) {\n parsedMeta.createdAt = createdAtMatch[1].trim();\n }\n\n if (idMatch?.[1] !== undefined) {\n parsedMeta.id = idMatch[1].trim();\n }\n\n if (slugMatch?.[1] !== undefined) {\n parsedMeta.slug = slugMatch[1].trim();\n }\n\n if (statusMatch?.[1] !== undefined) {\n parsedMeta.status = statusMatch[1].trim();\n }\n\n return parsedMeta;\n}\n\nexport function sortTasksByRecency(tasks: readonly WorkspaceTaskSummary[]): WorkspaceTaskSummary[] {\n return [...tasks].sort((left, right) => {\n const leftValue = left.createdAt ?? '';\n const rightValue = right.createdAt ?? '';\n\n return rightValue.localeCompare(leftValue);\n });\n}\n\nexport async function listWorkspaceTasks(projectRoot: string): Promise<WorkspaceTaskSummary[]> {\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n\n if ((await getFsEntryKind(workspaceRoot)) !== 'directory') {\n return [];\n }\n\n const { readdir } = await import('node:fs/promises');\n const entries = await readdir(workspaceRoot, { withFileTypes: true });\n const tasks: WorkspaceTaskSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const relativePath = getProjectRelativeSduckWorkspacePath(entry.name);\n const metaPath = join(projectRoot, relativePath, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n continue;\n }\n\n const parsedMeta = parseMetaText(await readFile(metaPath, 'utf8'));\n\n if (parsedMeta.id !== undefined && parsedMeta.status !== undefined) {\n const task: WorkspaceTaskSummary = {\n id: parsedMeta.id,\n path: relativePath,\n status: parsedMeta.status,\n };\n\n if (parsedMeta.createdAt !== undefined) {\n task.createdAt = parsedMeta.createdAt;\n }\n\n if (parsedMeta.slug !== undefined) {\n task.slug = parsedMeta.slug;\n }\n\n tasks.push(task);\n }\n }\n\n return sortTasksByRecency(tasks);\n}\n\nexport async function findActiveTask(projectRoot: string): Promise<ActiveTaskSummary | null> {\n const tasks = await listWorkspaceTasks(projectRoot);\n\n for (const task of tasks) {\n if (ACTIVE_STATUSES.has(task.status)) {\n return {\n id: task.id,\n path: task.path,\n status: task.status,\n };\n }\n }\n\n return null;\n}\n","import {\n loadArchiveTargets,\n runArchiveWorkflow,\n type ArchiveCommandInput,\n type ArchiveResult,\n type ArchiveSkipRow,\n type ArchiveSuccessRow,\n} from '../core/archive.js';\n\nexport interface ArchiveCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildResultTable(result: ArchiveResult): string {\n const rows: { month: string; result: string; task: string }[] = [\n ...result.archived.map((row: ArchiveSuccessRow) => ({\n month: row.month,\n result: 'archived',\n task: row.taskId,\n })),\n ...result.skipped.map((row: ArchiveSkipRow) => ({\n month: '',\n result: 'skipped',\n task: row.taskId,\n })),\n ];\n\n const resultWidth = Math.max('Result'.length, ...rows.map((row) => row.result.length));\n const taskWidth = Math.max('Task'.length, ...rows.map((row) => row.task.length));\n const monthWidth = Math.max('Month'.length, ...rows.map((row) => row.month.length));\n const border = `+-${'-'.repeat(resultWidth)}-+-${'-'.repeat(taskWidth)}-+-${'-'.repeat(monthWidth)}-+`;\n const header = `| ${padCell('Result', resultWidth)} | ${padCell('Task', taskWidth)} | ${padCell('Month', monthWidth)} |`;\n const body = rows.map(\n (row) =>\n `| ${padCell(row.result, resultWidth)} | ${padCell(row.task, taskWidth)} | ${padCell(row.month, monthWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nexport async function runArchiveCommand(\n input: ArchiveCommandInput,\n projectRoot: string,\n): Promise<ArchiveCommandResult> {\n try {\n const targets = await loadArchiveTargets(projectRoot, input);\n\n if (targets.length === 0) {\n return {\n exitCode: 0,\n stderr: '',\n stdout: '아카이브 대상이 없습니다.',\n };\n }\n\n const result = await runArchiveWorkflow(projectRoot, targets);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: buildResultTable(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown archive failure.',\n stdout: '',\n };\n }\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { getProjectRelativeSduckAssetPath } from './project-paths.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface DoneCommandInput {\n target?: string;\n}\n\nexport interface DoneTarget {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nexport interface DoneSuccessRow {\n completedAt: string;\n note: string;\n taskEvalCriteria: string[];\n taskId: string;\n}\n\nexport interface DoneFailureRow {\n note: string;\n pendingChecklistItems: string[];\n taskId: string;\n}\n\nexport interface DoneResult {\n completedAt: string;\n failed: DoneFailureRow[];\n nextStatus: 'DONE';\n succeeded: DoneSuccessRow[];\n}\n\ninterface MetaValidationSummary {\n completedSteps: number[];\n totalSteps: number;\n}\n\nconst TASK_EVAL_ASSET_PATH = getProjectRelativeSduckAssetPath('eval', 'task.yml');\n\nexport function filterDoneCandidates(tasks: readonly WorkspaceTaskSummary[]): DoneTarget[] {\n return tasks.filter((task) => task.status === 'IN_PROGRESS');\n}\n\nexport function resolveDoneTargetMatches(\n tasks: readonly WorkspaceTaskSummary[],\n target: string | undefined,\n): DoneTarget[] {\n if (target === undefined || target.trim() === '') {\n return filterDoneCandidates(tasks);\n }\n\n const trimmedTarget = target.trim();\n\n return tasks.filter((task) => task.id === trimmedTarget || task.slug === trimmedTarget);\n}\n\nexport function extractUncheckedChecklistItems(specContent: string): string[] {\n const uncheckedMatches = specContent.matchAll(/^\\s*- \\[ \\] (.+)$/gm);\n return [...uncheckedMatches]\n .map((match) => match[1])\n .filter((item): item is string => item !== undefined)\n .map((item) => item.trim());\n}\n\nexport function extractTaskEvalCriteriaLabels(taskEvalContent: string): string[] {\n const labels = [...taskEvalContent.matchAll(/^\\s{6}label:\\s+(.+)$/gm)]\n .map((match) => match[1])\n .filter((item): item is string => item !== undefined)\n .map((item) => item.trim());\n\n return [...new Set(labels)];\n}\n\nexport function parseCompletedStepNumbers(value: string): number[] {\n const trimmedValue = value.trim();\n\n if (trimmedValue === '') {\n return [];\n }\n\n return trimmedValue.split(',').map((segment) => {\n const parsedValue = Number.parseInt(segment.trim(), 10);\n\n if (!Number.isInteger(parsedValue)) {\n throw new Error(`Invalid completed step value: ${segment.trim()}`);\n }\n\n return parsedValue;\n });\n}\n\nexport function validateDoneMetaContent(metaContent: string): MetaValidationSummary {\n const totalMatch = /^ {2}total:\\s+(.+)$/m.exec(metaContent);\n const completedMatch = /^ {2}completed:\\s+\\[(.*)\\]$/m.exec(metaContent);\n\n if (totalMatch?.[1] === undefined || completedMatch?.[1] === undefined) {\n throw new Error('Task meta is missing a valid steps block.');\n }\n\n if (totalMatch[1].trim() === 'null') {\n throw new Error('Task steps are not initialized yet (steps.total is null).');\n }\n\n const totalSteps = Number.parseInt(totalMatch[1].trim(), 10);\n\n if (!Number.isInteger(totalSteps) || totalSteps <= 0) {\n throw new Error(`Task has an invalid steps.total value: ${totalMatch[1].trim()}`);\n }\n\n const completedSteps = parseCompletedStepNumbers(completedMatch[1]);\n const uniqueSteps = new Set(completedSteps);\n\n if (uniqueSteps.size !== completedSteps.length) {\n throw new Error('Task has duplicate completed step numbers.');\n }\n\n const invalidStep = completedSteps.find((step) => step < 1 || step > totalSteps);\n\n if (invalidStep !== undefined) {\n throw new Error(`Task has an out-of-range completed step number: ${String(invalidStep)}`);\n }\n\n if (completedSteps.length !== totalSteps) {\n const missingSteps: number[] = [];\n\n for (let step = 1; step <= totalSteps; step += 1) {\n if (!uniqueSteps.has(step)) {\n missingSteps.push(step);\n }\n }\n\n throw new Error(`Task steps are incomplete. Missing steps: ${missingSteps.join(', ')}`);\n }\n\n return {\n completedSteps,\n totalSteps,\n };\n}\n\nfunction updateDoneBlock(metaContent: string, completedAt: string): string {\n const withStatus = metaContent.replace(/^status:\\s+.+$/m, 'status: DONE');\n\n return withStatus.replace(/^completed_at:\\s+.+$/m, `completed_at: ${completedAt}`);\n}\n\nfunction validateDoneTarget(task: DoneTarget): void {\n if (task.status === 'DONE') {\n throw new Error(`Task ${task.id} is already DONE.`);\n }\n\n if (task.status !== 'IN_PROGRESS') {\n throw new Error(`Task ${task.id} is not in progress (${task.status}).`);\n }\n}\n\nasync function loadTaskEvalCriteria(projectRoot: string): Promise<string[]> {\n const taskEvalPath = join(projectRoot, TASK_EVAL_ASSET_PATH);\n\n if ((await getFsEntryKind(taskEvalPath)) !== 'file') {\n throw new Error(`Missing task evaluation asset at ${TASK_EVAL_ASSET_PATH}.`);\n }\n\n const taskEvalContent = await readFile(taskEvalPath, 'utf8');\n const labels = extractTaskEvalCriteriaLabels(taskEvalContent);\n\n if (labels.length === 0) {\n throw new Error(`Task evaluation asset has no criteria labels: ${TASK_EVAL_ASSET_PATH}.`);\n }\n\n return labels;\n}\n\nasync function completeTask(\n projectRoot: string,\n task: DoneTarget,\n completedAt: string,\n taskEvalCriteria: readonly string[],\n): Promise<DoneSuccessRow> {\n validateDoneTarget(task);\n\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n const specPath = join(projectRoot, task.path, 'spec.md');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for task ${task.id}.`);\n }\n\n if ((await getFsEntryKind(specPath)) !== 'file') {\n throw new Error(`Missing spec.md for task ${task.id}.`);\n }\n\n const metaContent = await readFile(metaPath, 'utf8');\n validateDoneMetaContent(metaContent);\n\n const specContent = await readFile(specPath, 'utf8');\n const uncheckedItems = extractUncheckedChecklistItems(specContent);\n\n if (uncheckedItems.length > 0) {\n throw new Error(`Spec checklist is incomplete: ${uncheckedItems.join('; ')}`);\n }\n\n await writeFile(metaPath, updateDoneBlock(metaContent, completedAt), 'utf8');\n\n return {\n completedAt,\n note: `task eval checked (${String(taskEvalCriteria.length)} criteria)`,\n taskEvalCriteria: [...taskEvalCriteria],\n taskId: task.id,\n };\n}\n\nexport async function runDoneWorkflow(\n projectRoot: string,\n tasks: readonly DoneTarget[],\n completedAt: string,\n): Promise<DoneResult> {\n const taskEvalCriteria = await loadTaskEvalCriteria(projectRoot);\n const succeeded: DoneSuccessRow[] = [];\n const failed: DoneFailureRow[] = [];\n\n for (const task of tasks) {\n try {\n succeeded.push(await completeTask(projectRoot, task, completedAt, taskEvalCriteria));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown done failure.';\n const pendingChecklistItems = message.startsWith('Spec checklist is incomplete: ')\n ? message\n .replace('Spec checklist is incomplete: ', '')\n .split('; ')\n .filter((item) => item !== '')\n : [];\n\n failed.push({\n note: message,\n pendingChecklistItems,\n taskId: task.id,\n });\n }\n }\n\n return {\n completedAt,\n failed,\n nextStatus: 'DONE',\n succeeded,\n };\n}\n\nexport async function loadDoneTargets(\n projectRoot: string,\n input: DoneCommandInput,\n): Promise<DoneTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n const matches = resolveDoneTargetMatches(tasks, input.target);\n\n if (input.target === undefined || input.target.trim() === '') {\n if (matches.length === 0) {\n throw new Error('No IN_PROGRESS task found. Run `sduck done <slug>` after choosing a task.');\n }\n\n if (matches.length > 1) {\n const labels = matches.map((task) => task.slug ?? task.id).join(', ');\n throw new Error(\n `Multiple IN_PROGRESS tasks found: ${labels}. Rerun with \\`sduck done <slug>\\` or \\`sduck done <id>\\`.`,\n );\n }\n\n return matches;\n }\n\n if (matches.length === 0) {\n throw new Error(`No task matches target '${input.target.trim()}'.`);\n }\n\n if (matches.length > 1) {\n const ids = matches.map((task) => task.id).join(', ');\n throw new Error(`Multiple tasks match '${input.target.trim()}': ${ids}. Use an exact task id.`);\n }\n\n return matches;\n}\n\nexport function createTaskCompletedAt(date = new Date()): string {\n return formatUtcTimestamp(date);\n}\n","function pad2(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nexport function formatUtcDate(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = pad2(date.getUTCMonth() + 1);\n const day = pad2(date.getUTCDate());\n\n return `${year}-${month}-${day}`;\n}\n\nexport function formatUtcTimestamp(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = pad2(date.getUTCMonth() + 1);\n const day = pad2(date.getUTCDate());\n const hour = pad2(date.getUTCHours());\n const minute = pad2(date.getUTCMinutes());\n const second = pad2(date.getUTCSeconds());\n\n return `${year}-${month}-${day}T${hour}:${minute}:${second}Z`;\n}\n","import {\n createTaskCompletedAt,\n loadDoneTargets,\n runDoneWorkflow,\n type DoneCommandInput,\n type DoneFailureRow,\n type DoneResult,\n} from '../core/done.js';\n\nexport interface DoneCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildResultTable(result: DoneResult): string {\n const rows = [\n ...result.succeeded.map((row) => ({\n note: row.note,\n result: 'success',\n task: row.taskId,\n })),\n ...result.failed.map((row) => ({\n note: row.note,\n result: 'failed',\n task: row.taskId,\n })),\n ];\n\n const resultWidth = Math.max('Result'.length, ...rows.map((row) => row.result.length));\n const taskWidth = Math.max('Task'.length, ...rows.map((row) => row.task.length));\n const noteWidth = Math.max('Note'.length, ...rows.map((row) => row.note.length));\n const border = `+-${'-'.repeat(resultWidth)}-+-${'-'.repeat(taskWidth)}-+-${'-'.repeat(noteWidth)}-+`;\n const header = `| ${padCell('Result', resultWidth)} | ${padCell('Task', taskWidth)} | ${padCell('Note', noteWidth)} |`;\n const body = rows.map(\n (row) =>\n `| ${padCell(row.result, resultWidth)} | ${padCell(row.task, taskWidth)} | ${padCell(row.note, noteWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nfunction formatFailureDetails(failed: readonly DoneFailureRow[]): string[] {\n const lines: string[] = [];\n\n for (const row of failed) {\n if (row.pendingChecklistItems.length === 0) {\n continue;\n }\n\n lines.push('', `미완료 체크리스트 (${row.taskId})`);\n\n for (const item of row.pendingChecklistItems) {\n lines.push(`- [ ] ${item}`);\n }\n }\n\n return lines;\n}\n\nfunction formatSuccess(result: DoneResult): string {\n const lines = [buildResultTable(result)];\n\n if (result.succeeded.length > 0) {\n const criteriaLabels = result.succeeded[0]?.taskEvalCriteria ?? [];\n\n lines.push('', '상태: DONE');\n\n if (criteriaLabels.length > 0) {\n lines.push(`task eval 기준: ${criteriaLabels.join(', ')}`);\n }\n }\n\n lines.push(...formatFailureDetails(result.failed));\n\n return lines.join('\\n');\n}\n\nexport async function runDoneCommand(\n input: DoneCommandInput,\n projectRoot: string,\n): Promise<DoneCommandResult> {\n try {\n const tasks = await loadDoneTargets(projectRoot, input);\n const result = await runDoneWorkflow(projectRoot, tasks, createTaskCompletedAt());\n\n if (result.succeeded.length === 0) {\n return {\n exitCode: 1,\n stderr: formatSuccess(result),\n stdout: '',\n };\n }\n\n return {\n exitCode: result.failed.length > 0 ? 1 : 0,\n stderr: '',\n stdout: formatSuccess(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown done failure.',\n stdout: '',\n };\n }\n}\n","import { confirm } from '@inquirer/prompts';\n\nimport {\n approveFastTrackTask,\n createFastTrackTask,\n isInteractiveApprovalAvailable,\n type FastTrackCommandInput,\n type FastTrackFailureRow,\n} from '../core/fast-track.js';\n\nexport interface FastTrackCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction formatFailures(rows: readonly FastTrackFailureRow[]): string[] {\n return rows.map((row) => `- ${row.taskId}: ${row.note}`);\n}\n\nexport async function runFastTrackCommand(\n input: FastTrackCommandInput,\n projectRoot: string,\n): Promise<FastTrackCommandResult> {\n try {\n const createdTask = await createFastTrackTask(input, projectRoot);\n const lines = [\n 'fast-track task created',\n `경로: ${createdTask.path}/`,\n 'minimal spec: created',\n 'minimal plan: created',\n ];\n\n if (!isInteractiveApprovalAvailable()) {\n lines.push(\n '상태: PENDING_SPEC_APPROVAL',\n '다음 단계: `sduck spec approve <slug>` 후 `sduck plan approve <slug>`를 실행하세요.',\n );\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n }\n\n const shouldApprove = await confirm({\n default: true,\n message: 'Approve the minimal spec and minimal plan now?',\n });\n\n if (!shouldApprove) {\n lines.push(\n '상태: PENDING_SPEC_APPROVAL',\n '다음 단계: `sduck spec approve <slug>` 후 `sduck plan approve <slug>`를 실행하세요.',\n );\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n }\n\n const approvalResult = await approveFastTrackTask(\n {\n id: createdTask.taskId,\n path: createdTask.path,\n slug: input.slug,\n status: 'PENDING_SPEC_APPROVAL',\n },\n projectRoot,\n );\n\n lines.push(`상태: ${approvalResult.nextStatus}`);\n\n if (approvalResult.failed.length > 0) {\n lines.push('승인 결과:', ...formatFailures(approvalResult.failed));\n }\n\n if (approvalResult.approved) {\n lines.push('fast-track 승인 완료 → 바로 작업을 시작할 수 있습니다.');\n } else {\n lines.push('일부 승인 단계가 완료되지 않았습니다. 일반 승인 명령으로 이어서 진행하세요.');\n }\n\n return {\n exitCode: approvalResult.failed.length > 0 ? 1 : 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown fast-track failure.',\n stdout: '',\n };\n }\n}\n","import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { isSupportedTaskType, type SupportedTaskType } from './assets.js';\nimport { getFsEntryKind } from './fs.js';\nimport {\n approvePlans,\n createPlanApprovedAt,\n type PlanApproveFailureRow,\n type PlanApproveSuccessRow,\n type PlanApproveTarget,\n} from './plan-approve.js';\nimport { approveSpecs, createSpecApprovedAt, type SpecApproveTarget } from './spec-approve.js';\nimport { startTask } from './start.js';\n\nexport interface FastTrackCommandInput {\n slug: string;\n type: string;\n}\n\nexport interface FastTrackTarget {\n id: string;\n path: string;\n slug: string;\n status: 'PENDING_SPEC_APPROVAL';\n}\n\nexport interface FastTrackSuccessRow {\n note: string;\n taskId: string;\n}\n\nexport interface FastTrackFailureRow {\n note: string;\n taskId: string;\n}\n\nexport interface FastTrackResult {\n failed: FastTrackFailureRow[];\n nextStatus: 'IN_PROGRESS' | 'PENDING_SPEC_APPROVAL';\n path: string;\n planCreated: boolean;\n specCreated: boolean;\n succeeded: FastTrackSuccessRow[];\n taskId: string;\n}\n\nexport interface FastTrackApprovalResult {\n approved: boolean;\n failed: FastTrackFailureRow[];\n nextStatus: 'IN_PROGRESS' | 'PENDING_SPEC_APPROVAL' | 'SPEC_APPROVED';\n succeeded: FastTrackSuccessRow[];\n taskId: string;\n}\n\nfunction toSpecApprovalTarget(target: FastTrackTarget): SpecApproveTarget {\n return target;\n}\n\nfunction toPlanApprovalTarget(target: FastTrackTarget): PlanApproveTarget {\n return {\n ...target,\n status: 'SPEC_APPROVED',\n };\n}\n\nexport function renderMinimalSpec(type: SupportedTaskType, slug: string): string {\n const displayName = slug.replace(/-/g, ' ');\n\n return [\n `# [${type}] ${displayName}`,\n '',\n '## 목표',\n '',\n `- ${displayName} 작업을 빠르게 시작할 수 있는 최소 스펙을 정의한다`,\n '',\n '## 범위',\n '',\n `- ${displayName} 구현에 필요한 핵심 변경만 포함한다`,\n '',\n '## 제외 범위',\n '',\n '- 요구사항과 직접 관련 없는 리팩터링은 포함하지 않는다',\n '',\n '## 완료 조건',\n '',\n '- [ ] 핵심 동작이 구현된다',\n '- [ ] 관련 테스트가 통과한다',\n '- [ ] 문서 또는 워크플로우 영향이 반영된다',\n '',\n ].join('\\n');\n}\n\nexport function renderMinimalPlan(slug: string): string {\n const displayName = slug.replace(/-/g, ' ');\n\n return [\n '# Plan',\n '',\n `## Step 1. ${displayName} 요구사항 반영`,\n '',\n '- 핵심 구현 파일을 수정해 요구사항을 반영한다.',\n '',\n '## Step 2. 검증과 마무리',\n '',\n '- 관련 테스트와 문서를 업데이트한다.',\n '- `npm run lint`, `npm run typecheck`, `npm test`, `npm run build`로 검증한다.',\n '',\n ].join('\\n');\n}\n\nexport function isInteractiveApprovalAvailable(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nexport async function createFastTrackTask(\n input: FastTrackCommandInput,\n projectRoot: string,\n): Promise<FastTrackResult> {\n if (!isSupportedTaskType(input.type)) {\n throw new Error(`Unsupported type: ${input.type}`);\n }\n\n const startedTask = await startTask(input.type, input.slug, projectRoot);\n const taskPath = join(projectRoot, startedTask.workspacePath);\n const specPath = join(taskPath, 'spec.md');\n const planPath = join(taskPath, 'plan.md');\n\n if ((await getFsEntryKind(specPath)) !== 'file') {\n throw new Error(`Missing spec.md for fast-track task ${startedTask.workspaceId}.`);\n }\n\n if ((await getFsEntryKind(planPath)) !== 'file') {\n throw new Error(`Missing plan.md for fast-track task ${startedTask.workspaceId}.`);\n }\n\n await writeFile(specPath, renderMinimalSpec(input.type, input.slug), 'utf8');\n await writeFile(planPath, renderMinimalPlan(input.slug), 'utf8');\n\n return {\n failed: [],\n nextStatus: 'PENDING_SPEC_APPROVAL',\n path: startedTask.workspacePath,\n planCreated: true,\n specCreated: true,\n succeeded: [{ note: 'created minimal spec and plan', taskId: startedTask.workspaceId }],\n taskId: startedTask.workspaceId,\n };\n}\n\nfunction buildFailureRows(\n taskId: string,\n failedRows: readonly PlanApproveFailureRow[],\n fallbackNote: string,\n): FastTrackFailureRow[] {\n if (failedRows.length === 0) {\n if (fallbackNote === '') {\n return [];\n }\n\n return [{ note: fallbackNote, taskId }];\n }\n\n return failedRows.map((row) => ({ note: row.note, taskId: row.taskId }));\n}\n\nfunction buildSuccessRows(succeededRows: readonly PlanApproveSuccessRow[]): FastTrackSuccessRow[] {\n return succeededRows.map((row) => ({\n note: `${row.note} (${String(row.steps)} steps)`,\n taskId: row.taskId,\n }));\n}\n\nexport async function approveFastTrackTask(\n target: FastTrackTarget,\n projectRoot: string,\n): Promise<FastTrackApprovalResult> {\n await approveSpecs(projectRoot, [toSpecApprovalTarget(target)], createSpecApprovedAt());\n\n const planResult = await approvePlans(\n projectRoot,\n [toPlanApprovalTarget(target)],\n createPlanApprovedAt(),\n );\n\n if (planResult.succeeded.length === 0) {\n return {\n approved: false,\n failed: buildFailureRows(target.id, planResult.failed, 'plan approval failed'),\n nextStatus: 'SPEC_APPROVED',\n succeeded: [{ note: 'approved minimal spec', taskId: target.id }],\n taskId: target.id,\n };\n }\n\n return {\n approved: true,\n failed: buildFailureRows(target.id, planResult.failed, ''),\n nextStatus: 'IN_PROGRESS',\n succeeded: [\n { note: 'approved minimal spec', taskId: target.id },\n ...buildSuccessRows(planResult.succeeded),\n ],\n taskId: target.id,\n };\n}\n","import { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { getFsEntryKind } from './fs.js';\n\nexport type SupportedTaskType = 'build' | 'feature' | 'fix' | 'refactor' | 'chore';\n\nexport const SUPPORTED_TASK_TYPES: readonly SupportedTaskType[] = [\n 'build',\n 'feature',\n 'fix',\n 'refactor',\n 'chore',\n];\n\nexport const EVAL_ASSET_RELATIVE_PATHS = {\n task: join('eval', 'task.yml'),\n plan: join('eval', 'plan.yml'),\n spec: join('eval', 'spec.yml'),\n} as const;\n\nexport const SPEC_TEMPLATE_RELATIVE_PATHS: Record<SupportedTaskType, string> = {\n build: join('types', 'build.md'),\n feature: join('types', 'feature.md'),\n fix: join('types', 'fix.md'),\n refactor: join('types', 'refactor.md'),\n chore: join('types', 'chore.md'),\n};\n\nexport const INIT_ASSET_RELATIVE_PATHS = [\n EVAL_ASSET_RELATIVE_PATHS.spec,\n EVAL_ASSET_RELATIVE_PATHS.plan,\n EVAL_ASSET_RELATIVE_PATHS.task,\n ...Object.values(SPEC_TEMPLATE_RELATIVE_PATHS),\n] as const;\n\nexport async function getBundledAssetsRoot(): Promise<string> {\n const currentDirectoryPath = dirname(fileURLToPath(import.meta.url));\n const candidatePaths = [\n join(currentDirectoryPath, '..', '..', '.sduck', 'sduck-assets'),\n join(currentDirectoryPath, '..', '.sduck', 'sduck-assets'),\n ];\n\n for (const candidatePath of candidatePaths) {\n if ((await getFsEntryKind(candidatePath)) === 'directory') {\n return candidatePath;\n }\n }\n\n throw new Error('Unable to locate bundled .sduck/sduck-assets directory.');\n}\n\nexport function isSupportedTaskType(value: string): value is SupportedTaskType {\n return SUPPORTED_TASK_TYPES.includes(value as SupportedTaskType);\n}\n\nexport function resolveSpecTemplateRelativePath(type: SupportedTaskType): string {\n return SPEC_TEMPLATE_RELATIVE_PATHS[type];\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface PlanApproveCommandInput {\n target?: string;\n}\n\nexport interface PlanApproveTarget {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nexport interface PlanApproveSuccessRow {\n note: string;\n steps: number;\n taskId: string;\n}\n\nexport interface PlanApproveFailureRow {\n note: string;\n taskId: string;\n}\n\nexport interface PlanApproveResult {\n approvedAt: string;\n failed: PlanApproveFailureRow[];\n nextStatus: 'IN_PROGRESS';\n succeeded: PlanApproveSuccessRow[];\n}\n\nexport function filterPlanApprovalCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): PlanApproveTarget[] {\n return tasks.filter((task) => task.status === 'SPEC_APPROVED');\n}\n\nexport function resolvePlanApprovalCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n target: string | undefined,\n): PlanApproveTarget[] {\n const candidates = filterPlanApprovalCandidates(tasks);\n\n if (target === undefined || target.trim() === '') {\n return candidates;\n }\n\n const trimmedTarget = target.trim();\n\n return candidates.filter((task) => task.id === trimmedTarget || task.slug === trimmedTarget);\n}\n\nexport function countPlanSteps(planContent: string): number {\n const matches = planContent.match(/^#{2,3} Step \\d+\\. .+$/gm);\n return matches?.length ?? 0;\n}\n\nexport function validatePlanHasSteps(planContent: string): void {\n if (countPlanSteps(planContent) === 0) {\n throw new Error(\n 'Plan does not contain any valid `## Step N. 제목` or `### Step N. 제목` headers.',\n );\n }\n}\n\nfunction updatePlanApprovalBlock(\n metaContent: string,\n approvedAt: string,\n totalSteps: number,\n): string {\n const withStatus = metaContent.replace(/^status:\\s+.+$/m, 'status: IN_PROGRESS');\n const withPlan = withStatus.replace(\n /plan:\\n {2}approved:\\s+false\\n {2}approved_at:\\s+null/m,\n `plan:\\n approved: true\\n approved_at: ${approvedAt}`,\n );\n\n return withPlan.replace(\n /steps:\\n {2}total:\\s+null\\n {2}completed:\\s+\\[\\]/m,\n `steps:\\n total: ${String(totalSteps)}\\n completed: []`,\n );\n}\n\nexport async function approvePlans(\n projectRoot: string,\n tasks: readonly PlanApproveTarget[],\n approvedAt: string,\n): Promise<PlanApproveResult> {\n const succeeded: PlanApproveSuccessRow[] = [];\n const failed: PlanApproveFailureRow[] = [];\n\n for (const task of tasks) {\n if (task.status !== 'SPEC_APPROVED') {\n failed.push({\n note: `task is not awaiting plan approval (${task.status})`,\n taskId: task.id,\n });\n continue;\n }\n\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n const planPath = join(projectRoot, task.path, 'plan.md');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n failed.push({ note: 'missing meta.yml', taskId: task.id });\n continue;\n }\n\n if ((await getFsEntryKind(planPath)) !== 'file') {\n failed.push({ note: 'missing plan.md', taskId: task.id });\n continue;\n }\n\n const planContent = await readFile(planPath, 'utf8');\n const totalSteps = countPlanSteps(planContent);\n\n if (totalSteps === 0) {\n failed.push({ note: 'missing valid Step headers', taskId: task.id });\n continue;\n }\n\n const updatedMeta = updatePlanApprovalBlock(\n await readFile(metaPath, 'utf8'),\n approvedAt,\n totalSteps,\n );\n await writeFile(metaPath, updatedMeta, 'utf8');\n\n succeeded.push({ note: 'moved to IN_PROGRESS', steps: totalSteps, taskId: task.id });\n }\n\n return {\n approvedAt,\n failed,\n nextStatus: 'IN_PROGRESS',\n succeeded,\n };\n}\n\nexport async function loadPlanApprovalCandidates(\n projectRoot: string,\n input: PlanApproveCommandInput,\n): Promise<PlanApproveTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n return resolvePlanApprovalCandidates(tasks, input.target);\n}\n\nexport function createPlanApprovedAt(date = new Date()): string {\n return formatUtcTimestamp(date);\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface SpecApproveCommandInput {\n target?: string;\n}\n\nexport interface SpecApproveTarget {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nexport interface SpecApproveResult {\n approvedAt: string;\n approvedTaskIds: string[];\n nextStatus: 'SPEC_APPROVED';\n}\n\nexport function filterApprovalCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): SpecApproveTarget[] {\n return tasks.filter((task) => task.status === 'PENDING_SPEC_APPROVAL');\n}\n\nexport function resolveTargetCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n target: string | undefined,\n): SpecApproveTarget[] {\n const candidates = filterApprovalCandidates(tasks);\n\n if (target === undefined || target.trim() === '') {\n return candidates;\n }\n\n const trimmedTarget = target.trim();\n\n return candidates.filter((task) => task.id === trimmedTarget || task.slug === trimmedTarget);\n}\n\nexport function validateSpecApprovalTargets(tasks: readonly SpecApproveTarget[]): void {\n if (tasks.length === 0) {\n throw new Error('No approvable spec tasks found.');\n }\n\n const invalidTask = tasks.find((task) => task.status !== 'PENDING_SPEC_APPROVAL');\n\n if (invalidTask !== undefined) {\n throw new Error(\n `Task ${invalidTask.id} is not awaiting spec approval (${invalidTask.status}).`,\n );\n }\n}\n\nfunction updateSpecApprovalBlock(metaContent: string, approvedAt: string): string {\n const withStatus = metaContent.replace(/^status:\\s+.+$/m, 'status: SPEC_APPROVED');\n\n return withStatus.replace(\n /spec:\\n {2}approved:\\s+false\\n {2}approved_at:\\s+null/m,\n `spec:\\n approved: true\\n approved_at: ${approvedAt}`,\n );\n}\n\nexport async function approveSpecs(\n projectRoot: string,\n tasks: readonly SpecApproveTarget[],\n approvedAt: string,\n): Promise<SpecApproveResult> {\n validateSpecApprovalTargets(tasks);\n\n for (const task of tasks) {\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for task ${task.id}.`);\n }\n\n const updatedContent = updateSpecApprovalBlock(await readFile(metaPath, 'utf8'), approvedAt);\n await writeFile(metaPath, updatedContent, 'utf8');\n }\n\n return {\n approvedAt,\n approvedTaskIds: tasks.map((task) => task.id),\n nextStatus: 'SPEC_APPROVED',\n };\n}\n\nexport async function loadSpecApprovalCandidates(\n projectRoot: string,\n input: SpecApproveCommandInput,\n): Promise<SpecApproveTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n return resolveTargetCandidates(tasks, input.target);\n}\n\nexport function createSpecApprovedAt(date = new Date()): string {\n return formatUtcTimestamp(date);\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport {\n getBundledAssetsRoot,\n isSupportedTaskType,\n resolveSpecTemplateRelativePath,\n type SupportedTaskType,\n} from './assets.js';\nimport { getFsEntryKind } from './fs.js';\nimport {\n getProjectRelativeSduckWorkspacePath,\n getProjectSduckWorkspacePath,\n} from './project-paths.js';\nimport { findActiveTask, type ActiveTaskSummary } from './workspace.js';\nimport { formatUtcDate, formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface StartCommandInput {\n type: SupportedTaskType;\n slug: string;\n}\n\nexport interface StartExecutionResult {\n workspaceId: string;\n workspacePath: string;\n status: 'PENDING_SPEC_APPROVAL';\n}\n\nexport function normalizeSlug(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[_\\s]+/g, '-')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nexport function validateSlug(slug: string): void {\n if (slug === '') {\n throw new Error('Invalid slug: slug cannot be empty after normalization.');\n }\n\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {\n throw new Error('Invalid slug: use lowercase kebab-case only.');\n }\n}\n\nexport function createWorkspaceId(date: Date, type: SupportedTaskType, slug: string): string {\n const year = String(date.getUTCFullYear());\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n const hour = String(date.getUTCHours()).padStart(2, '0');\n const minute = String(date.getUTCMinutes()).padStart(2, '0');\n\n return `${year}${month}${day}-${hour}${minute}-${type}-${slug}`;\n}\n\nexport function renderInitialMeta(input: {\n createdAt: string;\n id: string;\n slug: string;\n type: SupportedTaskType;\n}): string {\n return [\n `id: ${input.id}`,\n `type: ${input.type}`,\n `slug: ${input.slug}`,\n `created_at: ${input.createdAt}`,\n '',\n 'status: PENDING_SPEC_APPROVAL',\n '',\n 'spec:',\n ' approved: false',\n ' approved_at: null',\n '',\n 'plan:',\n ' approved: false',\n ' approved_at: null',\n '',\n 'steps:',\n ' total: null',\n ' completed: []',\n '',\n 'completed_at: null',\n '',\n ].join('\\n');\n}\n\nexport async function resolveSpecTemplatePath(type: SupportedTaskType): Promise<string> {\n const assetsRoot = await getBundledAssetsRoot();\n return join(assetsRoot, resolveSpecTemplateRelativePath(type));\n}\n\nfunction applyTemplateDefaults(\n template: string,\n type: SupportedTaskType,\n slug: string,\n currentDate: Date,\n): string {\n const displayName = slug.replace(/-/g, ' ');\n\n return template\n .replace(/\\{기능명\\}/g, displayName)\n .replace(/\\{버그 요약 한 줄\\}/g, displayName)\n .replace(/YYYY-MM-DD/g, formatUtcDate(currentDate))\n .replace(/> \\*\\*작성자:\\*\\*\\s*$/m, '> **작성자:** taehee')\n .replace(/> \\*\\*연관 티켓:\\*\\*\\s*$/m, '> **연관 티켓:** -')\n .replace(/^# \\[(feature|fix|refactor|chore|build)\\] .*/m, `# [${type}] ${displayName}`);\n}\n\nexport async function startTask(\n rawType: string,\n rawSlug: string,\n projectRoot: string,\n currentDate = new Date(),\n): Promise<StartExecutionResult> {\n if (!isSupportedTaskType(rawType)) {\n throw new Error(`Unsupported type: ${rawType}`);\n }\n\n const slug = normalizeSlug(rawSlug);\n validateSlug(slug);\n\n const activeTask = await findActiveTask(projectRoot);\n\n if (activeTask !== null) {\n throw new Error(\n `Active task exists: ${activeTask.id} (${activeTask.status}) at ${activeTask.path}. Finish or approve it before starting a new task.`,\n );\n }\n\n const workspaceId = createWorkspaceId(currentDate, rawType, slug);\n const workspacePath = getProjectRelativeSduckWorkspacePath(workspaceId);\n const absoluteWorkspacePath = join(projectRoot, workspacePath);\n\n if ((await getFsEntryKind(absoluteWorkspacePath)) !== 'missing') {\n throw new Error(`Workspace already exists: ${workspacePath}`);\n }\n\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n await mkdir(workspaceRoot, { recursive: true });\n await mkdir(absoluteWorkspacePath, { recursive: false });\n\n const templatePath = await resolveSpecTemplatePath(rawType);\n if ((await getFsEntryKind(templatePath)) !== 'file') {\n throw new Error(`Missing spec template for type '${rawType}' at ${templatePath}`);\n }\n\n const specTemplate = await readFile(templatePath, 'utf8');\n const specContent = applyTemplateDefaults(specTemplate, rawType, slug, currentDate);\n const metaContent = renderInitialMeta({\n createdAt: formatUtcTimestamp(currentDate),\n id: workspaceId,\n slug,\n type: rawType,\n });\n\n await writeFile(join(absoluteWorkspacePath, 'meta.yml'), metaContent, 'utf8');\n await writeFile(join(absoluteWorkspacePath, 'spec.md'), specContent, 'utf8');\n await writeFile(join(absoluteWorkspacePath, 'plan.md'), '', 'utf8');\n\n return {\n workspaceId,\n workspacePath,\n status: 'PENDING_SPEC_APPROVAL',\n };\n}\n\nexport type { ActiveTaskSummary };\n","import { checkbox } from '@inquirer/prompts';\n\nimport { SUPPORTED_AGENTS, parseAgentsOption, type SupportedAgentId } from '../core/agent-rules.js';\nimport { type InitCommandOptions, type InitSummaryRow, initProject } from '../core/init.js';\n\nconst AGENT_PROMPT_MESSAGE = 'Select AI agents to generate repository rule files for';\nconst AGENT_PROMPT_INSTRUCTIONS =\n 'Use space to toggle agents, arrow keys to move, and enter to submit.';\nconst AGENT_PROMPT_REQUIRED_MESSAGE =\n 'Select at least one agent. Use space to toggle and enter to submit.';\n\nexport interface CommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport interface InitCliOptions {\n agents?: string;\n force: boolean;\n}\n\ninterface FormattableInitResult {\n didChange: boolean;\n agents: readonly SupportedAgentId[];\n summary: {\n rows: InitSummaryRow[];\n warnings: string[];\n };\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildSummaryTable(rows: InitSummaryRow[]): string {\n const statusWidth = Math.max('Status'.length, ...rows.map((row) => row.status.length));\n const pathWidth = Math.max('Path'.length, ...rows.map((row) => row.path.length));\n\n const border = `+-${'-'.repeat(statusWidth)}-+-${'-'.repeat(pathWidth)}-+`;\n const header = `| ${padCell('Status', statusWidth)} | ${padCell('Path', pathWidth)} |`;\n const body = rows.map(\n (row) => `| ${padCell(row.status, statusWidth)} | ${padCell(row.path, pathWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nfunction formatResult(result: FormattableInitResult): string {\n const lines = [\n result.didChange ? 'sduck init completed.' : 'sduck init completed with no file changes.',\n ];\n\n if (result.agents.length > 0) {\n lines.push(`Selected agents: ${result.agents.join(', ')}`);\n }\n\n lines.push('', buildSummaryTable(result.summary.rows));\n\n if (result.summary.warnings.length > 0) {\n lines.push('', 'Warnings:');\n lines.push(...result.summary.warnings.map((warning) => `- ${warning}`));\n }\n\n return lines.join('\\n');\n}\n\nfunction normalizeSelectedAgents(agentIds: readonly SupportedAgentId[]): SupportedAgentId[] {\n const selectedAgentSet = new Set(agentIds);\n\n return SUPPORTED_AGENTS.map((agent) => agent.id).filter((agentId) =>\n selectedAgentSet.has(agentId),\n );\n}\n\nexport function createAgentCheckboxConfig() {\n return {\n message: AGENT_PROMPT_MESSAGE,\n instructions: AGENT_PROMPT_INSTRUCTIONS,\n required: true,\n validate: (choices: readonly { value: SupportedAgentId }[]) =>\n choices.length > 0 || AGENT_PROMPT_REQUIRED_MESSAGE,\n choices: SUPPORTED_AGENTS.map((agent) => ({\n name: agent.label,\n value: agent.id,\n })),\n };\n}\n\nasync function resolveSelectedAgents(options: InitCliOptions): Promise<SupportedAgentId[]> {\n const parsedAgents = parseAgentsOption(options.agents);\n\n if (parsedAgents.length > 0 || !process.stdin.isTTY || !process.stdout.isTTY) {\n return normalizeSelectedAgents(parsedAgents);\n }\n\n return normalizeSelectedAgents(await checkbox<SupportedAgentId>(createAgentCheckboxConfig()));\n}\n\nexport async function runInitCommand(\n options: InitCliOptions,\n projectRoot: string,\n): Promise<CommandResult> {\n try {\n const resolvedOptions: InitCommandOptions = {\n force: options.force,\n agents: await resolveSelectedAgents(options),\n };\n const result = await initProject(resolvedOptions, projectRoot);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatResult(result),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown init failure.';\n\n return {\n exitCode: 1,\n stderr: message,\n stdout: '',\n };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { getFsEntryKind, type FsEntryKind } from './fs.js';\n\nexport const CLAUDE_CODE_HOOK_SETTINGS_PATH = join('.claude', 'settings.json');\nexport const CLAUDE_CODE_HOOK_SCRIPT_PATH = join('.claude', 'hooks', 'sdd-guard.sh');\nexport const CLAUDE_CODE_HOOK_SOURCE_PATH = join('hooks', 'sdd-guard.sh');\n\nexport function needsClaudeCodeHook(agents: readonly SupportedAgentId[]): boolean {\n return agents.includes('claude-code');\n}\n\nexport type SupportedAgentId =\n | 'claude-code'\n | 'codex'\n | 'opencode'\n | 'gemini-cli'\n | 'cursor'\n | 'antigravity';\n\nexport type AgentRuleTargetKind = 'root-file' | 'managed-file';\n\nexport interface AgentRuleTarget {\n agentId: SupportedAgentId;\n outputPath: string;\n kind: AgentRuleTargetKind;\n}\n\nexport type AgentRuleMergeMode = 'create' | 'prepend' | 'keep' | 'replace-block' | 'overwrite';\n\nexport interface PlannedAgentRuleAction {\n agentId: SupportedAgentId;\n outputPath: string;\n kind: AgentRuleTargetKind;\n mergeMode: AgentRuleMergeMode;\n currentKind: FsEntryKind;\n}\n\nexport const SDD_RULES_BEGIN = '<!-- sduck:begin -->';\nexport const SDD_RULES_END = '<!-- sduck:end -->';\n\nexport const SUPPORTED_AGENTS: readonly { id: SupportedAgentId; label: string }[] = [\n { id: 'claude-code', label: 'Claude Code' },\n { id: 'codex', label: 'Codex' },\n { id: 'opencode', label: 'OpenCode' },\n { id: 'gemini-cli', label: 'Gemini CLI' },\n { id: 'cursor', label: 'Cursor' },\n { id: 'antigravity', label: 'Antigravity' },\n];\n\nconst AGENT_RULE_TARGETS: readonly AgentRuleTarget[] = [\n { agentId: 'claude-code', outputPath: 'CLAUDE.md', kind: 'root-file' },\n { agentId: 'codex', outputPath: 'AGENT.md', kind: 'root-file' },\n { agentId: 'opencode', outputPath: 'AGENT.md', kind: 'root-file' },\n { agentId: 'gemini-cli', outputPath: 'GEMINI.md', kind: 'root-file' },\n {\n agentId: 'cursor',\n outputPath: join('.cursor', 'rules', 'sduck-core.mdc'),\n kind: 'managed-file',\n },\n {\n agentId: 'antigravity',\n outputPath: join('.agents', 'rules', 'sduck-core.md'),\n kind: 'managed-file',\n },\n];\n\nconst AGENT_TEMPLATE_FILES: Record<SupportedAgentId, string> = {\n 'claude-code': 'claude-code.md',\n codex: 'codex.md',\n opencode: 'opencode.md',\n 'gemini-cli': 'gemini-cli.md',\n cursor: 'cursor.mdc',\n antigravity: 'antigravity.md',\n};\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nexport function parseAgentsOption(rawAgents: string | undefined): SupportedAgentId[] {\n if (rawAgents === undefined || rawAgents.trim() === '') {\n return [];\n }\n\n const requestedAgents = unique(\n rawAgents\n .split(',')\n .map((value) => value.trim())\n .filter((value) => value !== ''),\n );\n\n const validAgents = new Set(SUPPORTED_AGENTS.map((agent) => agent.id));\n const invalidAgent = requestedAgents.find((agent) => !validAgents.has(agent as SupportedAgentId));\n\n if (invalidAgent !== undefined) {\n throw new Error(`Unsupported agent: ${invalidAgent}`);\n }\n\n return requestedAgents as SupportedAgentId[];\n}\n\nexport function listAgentRuleTargets(selectedAgents: SupportedAgentId[]): AgentRuleTarget[] {\n const selectedAgentSet = new Set(selectedAgents);\n\n return AGENT_RULE_TARGETS.filter((target) => selectedAgentSet.has(target.agentId)).filter(\n (target, index, allTargets) =>\n index === allTargets.findIndex((candidate) => candidate.outputPath === target.outputPath),\n );\n}\n\nexport function hasManagedBlock(content: string): boolean {\n return content.includes(SDD_RULES_BEGIN) && content.includes(SDD_RULES_END);\n}\n\nexport function prependManagedBlock(existingContent: string, blockContent: string): string {\n const normalizedExistingContent = existingContent.trimStart();\n\n if (normalizedExistingContent === '') {\n return `${blockContent}\\n`;\n }\n\n return `${blockContent}\\n\\n${normalizedExistingContent}`;\n}\n\nexport function replaceManagedBlock(existingContent: string, blockContent: string): string {\n const blockPattern = new RegExp(`${SDD_RULES_BEGIN}[\\\\s\\\\S]*?${SDD_RULES_END}`);\n\n if (!blockPattern.test(existingContent)) {\n return prependManagedBlock(existingContent, blockContent);\n }\n\n return existingContent.replace(blockPattern, blockContent);\n}\n\nfunction renderManagedBlock(lines: string[]): string {\n return [SDD_RULES_BEGIN, ...lines, SDD_RULES_END].join('\\n');\n}\n\nasync function getAgentRulesAssetRoot(): Promise<string> {\n const currentDirectoryPath = dirname(fileURLToPath(import.meta.url));\n const candidatePaths = [\n join(currentDirectoryPath, '..', '..', '.sduck', 'sduck-assets', 'agent-rules'),\n join(currentDirectoryPath, '..', '.sduck', 'sduck-assets', 'agent-rules'),\n ];\n\n for (const candidatePath of candidatePaths) {\n if ((await getFsEntryKind(candidatePath)) === 'directory') {\n return candidatePath;\n }\n }\n\n throw new Error('Unable to locate bundled sduck agent rule assets.');\n}\n\nasync function readAssetFile(assetRoot: string, fileName: string): Promise<string> {\n return await readFile(join(assetRoot, fileName), 'utf8');\n}\n\nfunction buildRootFileLines(\n agentIds: SupportedAgentId[],\n agentSpecificContent: string[],\n): string[] {\n const labels = SUPPORTED_AGENTS.filter((agent) => agentIds.includes(agent.id)).map(\n (agent) => agent.label,\n );\n\n return [\n '# sduck managed rules',\n '',\n `Selected agents: ${labels.join(', ')}`,\n '',\n ...agentSpecificContent,\n ];\n}\n\nexport async function renderAgentRuleContent(\n target: AgentRuleTarget,\n selectedAgents: SupportedAgentId[],\n): Promise<string> {\n const assetRoot = await getAgentRulesAssetRoot();\n const coreContent = await readAssetFile(assetRoot, 'core.md');\n\n if (target.kind === 'managed-file') {\n const templateFileName = AGENT_TEMPLATE_FILES[target.agentId];\n const specificContent = await readAssetFile(assetRoot, templateFileName);\n\n return `${specificContent.trim()}\\n\\n${coreContent.trim()}\\n`;\n }\n\n const relatedAgents = AGENT_RULE_TARGETS.filter(\n (candidate) =>\n candidate.outputPath === target.outputPath && selectedAgents.includes(candidate.agentId),\n ).map((candidate) => candidate.agentId);\n\n const specificSections: string[] = [];\n\n for (const agentId of relatedAgents) {\n const templateFileName = AGENT_TEMPLATE_FILES[agentId];\n specificSections.push((await readAssetFile(assetRoot, templateFileName)).trim());\n }\n\n const lines = buildRootFileLines(relatedAgents, [...specificSections, coreContent.trim()]);\n\n return `${renderManagedBlock(lines)}\\n`;\n}\n\nexport function planAgentRuleActions(\n mode: 'safe' | 'force',\n targets: readonly AgentRuleTarget[],\n existingEntries: Map<string, FsEntryKind>,\n existingContents: Map<string, string>,\n): PlannedAgentRuleAction[] {\n return targets.map((target) => {\n const currentKind = existingEntries.get(target.outputPath) ?? 'missing';\n\n if (currentKind === 'missing') {\n return { ...target, mergeMode: 'create', currentKind };\n }\n\n if (currentKind !== 'file') {\n return { ...target, mergeMode: 'overwrite', currentKind };\n }\n\n if (target.kind === 'managed-file') {\n return { ...target, mergeMode: mode === 'force' ? 'overwrite' : 'keep', currentKind };\n }\n\n const content = existingContents.get(target.outputPath) ?? '';\n\n if (mode === 'safe') {\n return { ...target, mergeMode: hasManagedBlock(content) ? 'keep' : 'prepend', currentKind };\n }\n\n return {\n ...target,\n mergeMode: hasManagedBlock(content) ? 'replace-block' : 'prepend',\n currentKind,\n };\n });\n}\n","import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport {\n type AgentRuleTarget,\n listAgentRuleTargets,\n planAgentRuleActions,\n prependManagedBlock,\n renderAgentRuleContent,\n replaceManagedBlock,\n type PlannedAgentRuleAction,\n type SupportedAgentId,\n needsClaudeCodeHook,\n CLAUDE_CODE_HOOK_SETTINGS_PATH,\n CLAUDE_CODE_HOOK_SCRIPT_PATH,\n CLAUDE_CODE_HOOK_SOURCE_PATH,\n} from './agent-rules.js';\nimport { EVAL_ASSET_RELATIVE_PATHS, getBundledAssetsRoot } from './assets.js';\nimport {\n copyFileIntoPlace,\n ensureDirectory,\n ensureReadableFile,\n getFsEntryKind,\n type FsEntryKind,\n} from './fs.js';\nimport {\n getProjectRelativeSduckAssetPath,\n getProjectSduckAssetsPath,\n getProjectSduckHomePath,\n getProjectSduckWorkspacePath,\n PROJECT_SDUCK_ASSETS_RELATIVE_PATH,\n PROJECT_SDUCK_HOME_RELATIVE_PATH,\n PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH,\n toBundledAssetRelativePath,\n} from './project-paths.js';\n\nimport type { InitCommandOptions, InitMode, ResolvedInitOptions } from './init-types.js';\n\nexport type { FsEntryKind } from './fs.js';\nexport type { InitCommandOptions, InitMode, ResolvedInitOptions } from './init-types.js';\n\nexport type AssetTemplateKey =\n | 'eval-spec'\n | 'eval-plan'\n | 'eval-task'\n | 'type-build'\n | 'type-feature'\n | 'type-fix'\n | 'type-refactor'\n | 'type-chore';\n\nexport interface AssetTemplateDefinition {\n key: AssetTemplateKey;\n relativePath: string;\n}\n\nexport type AssetTemplateMap = Record<AssetTemplateKey, AssetTemplateDefinition>;\n\nexport type AssetActionKind = 'create' | 'keep' | 'overwrite' | 'error';\n\nexport type AssetCollisionKind =\n | 'none'\n | 'file-directory-mismatch'\n | 'directory-file-mismatch'\n | 'unknown';\n\nexport interface PlannedAssetAction {\n key: AssetTemplateKey;\n targetPath: string;\n currentKind: FsEntryKind;\n action: AssetActionKind;\n collision: AssetCollisionKind;\n}\n\nexport type InitWarningCode =\n | 'kept-existing-asset'\n | 'kept-existing-rule'\n | 'type-conflict'\n | 'force-recommended';\n\nexport type InitErrorCode =\n | 'asset-root-conflict'\n | 'workspace-root-conflict'\n | 'asset-write-failed'\n | 'unknown-fs-error';\n\nexport interface InitSummaryRow {\n path: string;\n status: 'created' | 'prepended' | 'kept' | 'overwritten';\n}\n\nexport interface InitExecutionSummary {\n created: string[];\n prepended: string[];\n kept: string[];\n overwritten: string[];\n warnings: string[];\n errors: string[];\n rows: InitSummaryRow[];\n}\n\nexport interface InitExecutionResult {\n mode: InitMode;\n agents: SupportedAgentId[];\n summary: InitExecutionSummary;\n didChange: boolean;\n}\n\nconst ASSET_TEMPLATE_DEFINITIONS = [\n {\n key: 'eval-spec',\n relativePath: getProjectRelativeSduckAssetPath(EVAL_ASSET_RELATIVE_PATHS.spec),\n },\n {\n key: 'eval-plan',\n relativePath: getProjectRelativeSduckAssetPath(EVAL_ASSET_RELATIVE_PATHS.plan),\n },\n {\n key: 'eval-task',\n relativePath: getProjectRelativeSduckAssetPath(EVAL_ASSET_RELATIVE_PATHS.task),\n },\n {\n key: 'type-build',\n relativePath: getProjectRelativeSduckAssetPath('types', 'build.md'),\n },\n {\n key: 'type-feature',\n relativePath: getProjectRelativeSduckAssetPath('types', 'feature.md'),\n },\n { key: 'type-fix', relativePath: getProjectRelativeSduckAssetPath('types', 'fix.md') },\n {\n key: 'type-refactor',\n relativePath: getProjectRelativeSduckAssetPath('types', 'refactor.md'),\n },\n {\n key: 'type-chore',\n relativePath: getProjectRelativeSduckAssetPath('types', 'chore.md'),\n },\n] as const satisfies readonly AssetTemplateDefinition[];\n\nexport const ASSET_TEMPLATE_MAP = Object.fromEntries(\n ASSET_TEMPLATE_DEFINITIONS.map((definition) => [definition.key, definition]),\n) as AssetTemplateMap;\n\nexport function planInitActions(\n mode: InitMode,\n existingEntries: Map<string, FsEntryKind>,\n): PlannedAssetAction[] {\n return ASSET_TEMPLATE_DEFINITIONS.map((definition) => {\n const currentKind = existingEntries.get(definition.relativePath) ?? 'missing';\n\n if (currentKind === 'missing') {\n return {\n key: definition.key,\n targetPath: definition.relativePath,\n currentKind,\n action: 'create',\n collision: 'none',\n } satisfies PlannedAssetAction;\n }\n\n if (currentKind === 'file') {\n return {\n key: definition.key,\n targetPath: definition.relativePath,\n currentKind,\n action: mode === 'force' ? 'overwrite' : 'keep',\n collision: 'none',\n } satisfies PlannedAssetAction;\n }\n\n return {\n key: definition.key,\n targetPath: definition.relativePath,\n currentKind,\n action: 'error',\n collision: 'directory-file-mismatch',\n } satisfies PlannedAssetAction;\n });\n}\n\nexport function summarizeInitActions(actions: PlannedAssetAction[]): InitExecutionSummary {\n const summary: InitExecutionSummary = {\n created: [],\n prepended: [],\n kept: [],\n overwritten: [],\n warnings: [],\n errors: [],\n rows: [],\n };\n\n for (const action of actions) {\n if (action.action === 'create') {\n summary.created.push(action.targetPath);\n summary.rows.push({ path: action.targetPath, status: 'created' });\n continue;\n }\n\n if (action.action === 'keep') {\n summary.kept.push(action.targetPath);\n summary.rows.push({ path: action.targetPath, status: 'kept' });\n summary.warnings.push(`Kept existing asset: ${action.targetPath}`);\n continue;\n }\n\n if (action.action === 'overwrite') {\n summary.overwritten.push(action.targetPath);\n summary.rows.push({ path: action.targetPath, status: 'overwritten' });\n continue;\n }\n\n summary.errors.push(`Path conflict for ${action.targetPath}: ${action.collision}`);\n }\n\n if (summary.kept.length > 0) {\n summary.warnings.push('Run `sduck init --force` if you want to regenerate bundled assets.');\n }\n\n return summary;\n}\n\nfunction getInitMode(options: InitCommandOptions): InitMode {\n return options.force ? 'force' : 'safe';\n}\n\nfunction resolveInitOptions(options: InitCommandOptions): ResolvedInitOptions {\n return {\n mode: getInitMode(options),\n agents: [...new Set(options.agents)],\n };\n}\n\nasync function collectExistingEntries(projectRoot: string): Promise<Map<string, FsEntryKind>> {\n const existingEntries = new Map<string, FsEntryKind>();\n\n for (const definition of ASSET_TEMPLATE_DEFINITIONS) {\n existingEntries.set(\n definition.relativePath,\n await getFsEntryKind(join(projectRoot, definition.relativePath)),\n );\n }\n\n return existingEntries;\n}\n\nasync function collectExistingFileContents(\n projectRoot: string,\n targets: readonly AgentRuleTarget[],\n): Promise<Map<string, string>> {\n const contents = new Map<string, string>();\n\n for (const target of targets) {\n const targetPath = join(projectRoot, target.outputPath);\n\n if ((await getFsEntryKind(targetPath)) === 'file') {\n contents.set(target.outputPath, await readFile(targetPath, 'utf8'));\n }\n }\n\n return contents;\n}\n\nasync function ensureRootDirectory(\n targetPath: string,\n errorCode: InitErrorCode,\n): Promise<'created' | 'kept' | 'overwritten'> {\n const kind = await getFsEntryKind(targetPath);\n\n if (kind === 'missing') {\n await ensureDirectory(targetPath);\n return 'created';\n }\n\n if (kind === 'directory') {\n return 'kept';\n }\n\n throw new Error(`${errorCode}: expected a directory at ${targetPath}.`);\n}\n\nexport async function initProject(\n options: InitCommandOptions,\n projectRoot: string,\n): Promise<InitExecutionResult> {\n const resolvedOptions = resolveInitOptions(options);\n const { mode } = resolvedOptions;\n const assetSourceRoot = await getBundledAssetsRoot();\n const sduckHomeRoot = getProjectSduckHomePath(projectRoot);\n const assetsRoot = getProjectSduckAssetsPath(projectRoot);\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n\n const summary: InitExecutionSummary = {\n created: [],\n prepended: [],\n kept: [],\n overwritten: [],\n warnings: [],\n errors: [],\n rows: [],\n };\n\n const sduckHomeStatus = await ensureRootDirectory(sduckHomeRoot, 'asset-root-conflict');\n summary[sduckHomeStatus].push(`${PROJECT_SDUCK_HOME_RELATIVE_PATH}/`);\n summary.rows.push({ path: `${PROJECT_SDUCK_HOME_RELATIVE_PATH}/`, status: sduckHomeStatus });\n\n const assetsRootStatus = await ensureRootDirectory(assetsRoot, 'asset-root-conflict');\n summary[assetsRootStatus].push(`${PROJECT_SDUCK_ASSETS_RELATIVE_PATH}/`);\n summary.rows.push({ path: `${PROJECT_SDUCK_ASSETS_RELATIVE_PATH}/`, status: assetsRootStatus });\n\n const workspaceRootStatus = await ensureRootDirectory(workspaceRoot, 'workspace-root-conflict');\n summary[workspaceRootStatus].push(`${PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH}/`);\n summary.rows.push({\n path: `${PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH}/`,\n status: workspaceRootStatus,\n });\n\n const actions = planInitActions(mode, await collectExistingEntries(projectRoot));\n const actionSummary = summarizeInitActions(actions);\n\n summary.created.push(...actionSummary.created);\n summary.kept.push(...actionSummary.kept);\n summary.overwritten.push(...actionSummary.overwritten);\n summary.warnings.push(...actionSummary.warnings);\n summary.errors.push(...actionSummary.errors);\n summary.rows.push(...actionSummary.rows);\n\n const conflict = actions.find((action) => action.action === 'error');\n\n if (conflict !== undefined) {\n throw new Error(\n `type-conflict: expected a file but found a directory at ${conflict.targetPath}. ` +\n 'Resolve it manually or move the conflicting path before retrying.',\n );\n }\n\n for (const action of actions) {\n if (action.action === 'keep') {\n continue;\n }\n\n const definition = ASSET_TEMPLATE_MAP[action.key];\n const sourcePath = join(assetSourceRoot, toBundledAssetRelativePath(definition.relativePath));\n const targetPath = join(projectRoot, definition.relativePath);\n\n await ensureReadableFile(sourcePath);\n await mkdir(dirname(targetPath), { recursive: true });\n await copyFileIntoPlace(sourcePath, targetPath);\n }\n\n const agentTargets = listAgentRuleTargets(resolvedOptions.agents);\n const agentEntryKinds = new Map<string, FsEntryKind>();\n\n for (const target of agentTargets) {\n agentEntryKinds.set(\n target.outputPath,\n await getFsEntryKind(join(projectRoot, target.outputPath)),\n );\n }\n\n const existingContents = await collectExistingFileContents(projectRoot, agentTargets);\n const agentActions = planAgentRuleActions(mode, agentTargets, agentEntryKinds, existingContents);\n\n await applyAgentRuleActions(\n projectRoot,\n agentActions,\n existingContents,\n summary,\n resolvedOptions.agents,\n );\n\n if (needsClaudeCodeHook(resolvedOptions.agents)) {\n await installClaudeCodeHook(projectRoot, summary);\n }\n\n return {\n mode,\n agents: resolvedOptions.agents,\n summary,\n didChange:\n summary.created.length > 0 || summary.prepended.length > 0 || summary.overwritten.length > 0,\n };\n}\n\nasync function installClaudeCodeHook(\n projectRoot: string,\n summary: InitExecutionSummary,\n): Promise<void> {\n const assetRoot = await getBundledAssetsRoot();\n const hookSourcePath = join(assetRoot, 'agent-rules', CLAUDE_CODE_HOOK_SOURCE_PATH);\n const hookTargetPath = join(projectRoot, CLAUDE_CODE_HOOK_SCRIPT_PATH);\n const settingsPath = join(projectRoot, CLAUDE_CODE_HOOK_SETTINGS_PATH);\n\n // Copy hook script\n await mkdir(dirname(hookTargetPath), { recursive: true });\n await copyFileIntoPlace(hookSourcePath, hookTargetPath);\n await chmod(hookTargetPath, 0o755);\n summary.created.push(CLAUDE_CODE_HOOK_SCRIPT_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SCRIPT_PATH, status: 'created' });\n\n // Create or merge settings.json\n const hookConfig = {\n hooks: {\n PreToolUse: [\n {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: '\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/sdd-guard.sh',\n },\n ],\n },\n ],\n },\n };\n\n if ((await getFsEntryKind(settingsPath)) === 'file') {\n const existingContent = await readFile(settingsPath, 'utf8');\n\n try {\n const existing = JSON.parse(existingContent) as Record<string, unknown>;\n existing['hooks'] = hookConfig.hooks;\n await writeFile(settingsPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n summary.overwritten.push(CLAUDE_CODE_HOOK_SETTINGS_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SETTINGS_PATH, status: 'overwritten' });\n } catch {\n await writeFile(settingsPath, JSON.stringify(hookConfig, null, 2) + '\\n', 'utf8');\n summary.overwritten.push(CLAUDE_CODE_HOOK_SETTINGS_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SETTINGS_PATH, status: 'overwritten' });\n }\n } else {\n await mkdir(dirname(settingsPath), { recursive: true });\n await writeFile(settingsPath, JSON.stringify(hookConfig, null, 2) + '\\n', 'utf8');\n summary.created.push(CLAUDE_CODE_HOOK_SETTINGS_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SETTINGS_PATH, status: 'created' });\n }\n}\n\nasync function applyAgentRuleActions(\n projectRoot: string,\n actions: readonly PlannedAgentRuleAction[],\n existingContents: Map<string, string>,\n summary: InitExecutionSummary,\n selectedAgents: SupportedAgentId[],\n): Promise<void> {\n for (const action of actions) {\n const targetPath = join(projectRoot, action.outputPath);\n const content = await renderAgentRuleContent(action, selectedAgents);\n\n if (action.mergeMode === 'create') {\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(targetPath, content, 'utf8');\n summary.created.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'created' });\n continue;\n }\n\n if (action.mergeMode === 'keep') {\n summary.kept.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'kept' });\n summary.warnings.push(`Kept existing rule file: ${action.outputPath}`);\n continue;\n }\n\n await mkdir(dirname(targetPath), { recursive: true });\n\n if (action.mergeMode === 'prepend') {\n const currentContent = existingContents.get(action.outputPath) ?? '';\n await writeFile(targetPath, prependManagedBlock(currentContent, content.trimEnd()), 'utf8');\n summary.prepended.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'prepended' });\n continue;\n }\n\n if (action.mergeMode === 'replace-block') {\n const currentContent = existingContents.get(action.outputPath) ?? '';\n await writeFile(targetPath, replaceManagedBlock(currentContent, content.trimEnd()), 'utf8');\n summary.overwritten.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'overwritten' });\n continue;\n }\n\n await writeFile(targetPath, content, 'utf8');\n summary.overwritten.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'overwritten' });\n }\n\n if (summary.kept.some((path) => path.endsWith('.md') || path.endsWith('.mdc'))) {\n summary.warnings.push(\n 'Run `sduck init --force` to refresh managed rule content for selected agents.',\n );\n }\n}\n","import { checkbox } from '@inquirer/prompts';\n\nimport {\n approvePlans,\n createPlanApprovedAt,\n loadPlanApprovalCandidates,\n type PlanApproveCommandInput,\n type PlanApproveResult,\n type PlanApproveTarget,\n} from '../core/plan-approve.js';\n\nexport interface PlanApproveCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildResultTable(result: PlanApproveResult): string {\n const rows = [\n ...result.succeeded.map((row) => ({\n note: row.note,\n result: 'success',\n steps: String(row.steps),\n task: row.taskId,\n })),\n ...result.failed.map((row) => ({\n note: row.note,\n result: 'failed',\n steps: '-',\n task: row.taskId,\n })),\n ];\n\n const resultWidth = Math.max('Result'.length, ...rows.map((row) => row.result.length));\n const taskWidth = Math.max('Task'.length, ...rows.map((row) => row.task.length));\n const stepsWidth = Math.max('Steps'.length, ...rows.map((row) => row.steps.length));\n const noteWidth = Math.max('Note'.length, ...rows.map((row) => row.note.length));\n\n const border = `+-${'-'.repeat(resultWidth)}-+-${'-'.repeat(taskWidth)}-+-${'-'.repeat(stepsWidth)}-+-${'-'.repeat(noteWidth)}-+`;\n const header = `| ${padCell('Result', resultWidth)} | ${padCell('Task', taskWidth)} | ${padCell('Steps', stepsWidth)} | ${padCell('Note', noteWidth)} |`;\n const body = rows.map(\n (row) =>\n `| ${padCell(row.result, resultWidth)} | ${padCell(row.task, taskWidth)} | ${padCell(row.steps, stepsWidth)} | ${padCell(row.note, noteWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nfunction formatTaskLabel(task: PlanApproveTarget): string {\n return `${task.id} (${task.status})`;\n}\n\nfunction formatSuccess(result: PlanApproveResult): string {\n const lines = [buildResultTable(result)];\n\n if (result.succeeded.length > 0) {\n lines.push('', '상태: IN_PROGRESS → 작업을 시작합니다.');\n }\n\n return lines.join('\\n');\n}\n\nasync function selectTargets(tasks: readonly PlanApproveTarget[]): Promise<PlanApproveTarget[]> {\n if (tasks.length <= 1 || !process.stdin.isTTY || !process.stdout.isTTY) {\n return [...tasks];\n }\n\n const selectedIds = await checkbox<string>({\n message: 'Select tasks to approve plan for',\n choices: tasks.map((task) => ({ checked: true, name: formatTaskLabel(task), value: task.id })),\n });\n\n return tasks.filter((task) => selectedIds.includes(task.id));\n}\n\nexport async function runPlanApproveCommand(\n input: PlanApproveCommandInput,\n projectRoot: string,\n): Promise<PlanApproveCommandResult> {\n try {\n const candidates = await loadPlanApprovalCandidates(projectRoot, input);\n\n if (candidates.length === 0) {\n throw new Error('No matching tasks awaiting plan approval.');\n }\n\n if (\n input.target !== undefined &&\n candidates.length > 1 &&\n (!process.stdin.isTTY || !process.stdout.isTTY)\n ) {\n throw new Error(\n 'Multiple matching tasks found; rerun interactively to choose approval targets.',\n );\n }\n\n const selectedTasks = await selectTargets(candidates);\n\n if (selectedTasks.length === 0) {\n throw new Error('No tasks selected for plan approval.');\n }\n\n const result = await approvePlans(projectRoot, selectedTasks, createPlanApprovedAt());\n\n if (result.succeeded.length === 0) {\n return {\n exitCode: 1,\n stderr: buildResultTable(result),\n stdout: '',\n };\n }\n\n return {\n exitCode: result.failed.length > 0 ? 1 : 0,\n stderr: result.failed.length > 0 ? '' : '',\n stdout: formatSuccess(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown plan approval failure.',\n stdout: '',\n };\n }\n}\n","import { copyFile, readFile, unlink, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { ensureDirectory, getFsEntryKind } from './fs.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\n\nexport interface ReopenCommandInput {\n target?: string;\n}\n\nexport interface ReopenResult {\n newCycle: number;\n previousCycle: number;\n snapshots: string[];\n taskId: string;\n}\n\nexport function getCurrentCycle(metaContent: string): number {\n const match = /^cycle:\\s+(\\d+)$/m.exec(metaContent);\n\n if (match?.[1] === undefined) {\n return 1;\n }\n\n return Number(match[1]);\n}\n\nexport function buildReopenedMeta(metaContent: string, newCycle: number): string {\n let result = metaContent;\n\n // Update or insert cycle field\n if (/^cycle:\\s+/m.test(result)) {\n result = result.replace(/^cycle:\\s+.+$/m, `cycle: ${String(newCycle)}`);\n } else {\n result = result.replace(/^(status:\\s+.+)$/m, `cycle: ${String(newCycle)}\\n\\n$1`);\n }\n\n // Reset status\n result = result.replace(/^status:\\s+.+$/m, 'status: PENDING_SPEC_APPROVAL');\n\n // Reset spec approval\n result = result.replace(\n /spec:\\n {2}approved:\\s+.+\\n {2}approved_at:\\s+.+/m,\n 'spec:\\n approved: false\\n approved_at: null',\n );\n\n // Reset plan approval\n result = result.replace(\n /plan:\\n {2}approved:\\s+.+\\n {2}approved_at:\\s+.+/m,\n 'plan:\\n approved: false\\n approved_at: null',\n );\n\n // Reset steps\n result = result.replace(\n /steps:\\n {2}total:\\s+.+\\n {2}completed:\\s+.+/m,\n 'steps:\\n total: null\\n completed: []',\n );\n\n // Reset completed_at\n result = result.replace(/^completed_at:\\s+.+$/m, 'completed_at: null');\n\n return result;\n}\n\nexport function filterReopenCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): WorkspaceTaskSummary[] {\n return tasks.filter((task) => task.status === 'DONE');\n}\n\nfunction formatCandidateList(candidates: readonly WorkspaceTaskSummary[]): string {\n return candidates\n .map((task) => ` - ${task.id}${task.slug !== undefined ? ` (${task.slug})` : ''}`)\n .join('\\n');\n}\n\nexport function resolveReopenTarget(\n tasks: readonly WorkspaceTaskSummary[],\n target?: string,\n): WorkspaceTaskSummary {\n const candidates = filterReopenCandidates(tasks);\n\n if (candidates.length === 0) {\n throw new Error('No DONE tasks found to reopen.');\n }\n\n if (target === undefined || target.trim() === '') {\n if (candidates.length === 1) {\n const [candidate] = candidates;\n\n if (candidate === undefined) {\n throw new Error('No DONE tasks found to reopen.');\n }\n\n return candidate;\n }\n\n throw new Error(\n `Multiple DONE tasks found. Specify a target:\\n${formatCandidateList(candidates)}`,\n );\n }\n\n const trimmedTarget = target.trim();\n\n // id exact match first\n const idMatch = candidates.filter((task) => task.id === trimmedTarget);\n\n if (idMatch.length === 1) {\n const [match] = idMatch;\n\n if (match === undefined) {\n throw new Error(`No DONE task found matching '${trimmedTarget}'.`);\n }\n\n return match;\n }\n\n // slug exact match\n const slugMatch = candidates.filter((task) => task.slug === trimmedTarget);\n\n if (slugMatch.length === 1) {\n const [match] = slugMatch;\n\n if (match === undefined) {\n throw new Error(`No DONE task found matching '${trimmedTarget}'.`);\n }\n\n return match;\n }\n\n if (slugMatch.length > 1) {\n throw new Error(\n `Multiple DONE tasks match slug '${trimmedTarget}':\\n${formatCandidateList(slugMatch)}`,\n );\n }\n\n throw new Error(`No DONE task found matching '${trimmedTarget}'.`);\n}\n\nexport async function snapshotHistoryFiles(\n taskDir: string,\n currentCycle: number,\n): Promise<string[]> {\n const historyDir = join(taskDir, 'history');\n const created: string[] = [];\n\n const filesToSnapshot = ['spec.md', 'plan.md'];\n const snapshotPaths: { dest: string; source: string }[] = [];\n\n // Check for conflicts and determine which files to snapshot\n for (const fileName of filesToSnapshot) {\n const sourcePath = join(taskDir, fileName);\n\n if ((await getFsEntryKind(sourcePath)) !== 'file') {\n continue;\n }\n\n const destName = `${String(currentCycle)}_${fileName}`;\n const destPath = join(historyDir, destName);\n\n if ((await getFsEntryKind(destPath)) !== 'missing') {\n throw new Error(`History snapshot already exists: ${destPath}`);\n }\n\n snapshotPaths.push({ dest: destPath, source: sourcePath });\n }\n\n if (snapshotPaths.length === 0) {\n return [];\n }\n\n // Create history directory\n await ensureDirectory(historyDir);\n\n // Copy files with rollback on failure\n try {\n for (const { dest, source } of snapshotPaths) {\n await copyFile(source, dest);\n created.push(dest);\n }\n } catch (error) {\n // Rollback: delete any files we created\n for (const path of created) {\n try {\n await unlink(path);\n } catch {\n // Best effort rollback\n }\n }\n\n throw error;\n }\n\n return created;\n}\n\nexport async function runReopenWorkflow(\n projectRoot: string,\n task: WorkspaceTaskSummary,\n): Promise<ReopenResult> {\n const taskDir = join(projectRoot, task.path);\n const metaPath = join(taskDir, 'meta.yml');\n\n const metaContent = await readFile(metaPath, 'utf8');\n const currentCycle = getCurrentCycle(metaContent);\n const newCycle = currentCycle + 1;\n\n // Snapshot history files (handles its own rollback on failure)\n const snapshots = await snapshotHistoryFiles(taskDir, currentCycle);\n\n // Update meta (rollback snapshots if meta write fails)\n const updatedMeta = buildReopenedMeta(metaContent, newCycle);\n\n try {\n await writeFile(metaPath, updatedMeta, 'utf8');\n } catch (error) {\n // Rollback snapshots\n for (const path of snapshots) {\n try {\n await unlink(path);\n } catch {\n // Best effort rollback\n }\n }\n\n throw error;\n }\n\n return {\n newCycle,\n previousCycle: currentCycle,\n snapshots,\n taskId: task.id,\n };\n}\n\nexport async function loadReopenTarget(\n projectRoot: string,\n input: ReopenCommandInput,\n): Promise<WorkspaceTaskSummary> {\n const tasks = await listWorkspaceTasks(projectRoot);\n return resolveReopenTarget(tasks, input.target);\n}\n","import {\n loadReopenTarget,\n runReopenWorkflow,\n type ReopenCommandInput,\n type ReopenResult,\n} from '../core/reopen.js';\n\nexport interface ReopenCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction formatSuccess(result: ReopenResult): string {\n const lines = [\n `Reopened ${result.taskId} → cycle ${String(result.newCycle)} (PENDING_SPEC_APPROVAL)`,\n ];\n\n if (result.snapshots.length > 0) {\n lines.push('');\n lines.push('Snapshots:');\n\n for (const snapshot of result.snapshots) {\n lines.push(` - ${snapshot}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport async function runReopenCommand(\n input: ReopenCommandInput,\n projectRoot: string,\n): Promise<ReopenCommandResult> {\n try {\n const task = await loadReopenTarget(projectRoot, input);\n const result = await runReopenWorkflow(projectRoot, task);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatSuccess(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown reopen failure.',\n stdout: '',\n };\n }\n}\n","import { checkbox } from '@inquirer/prompts';\n\nimport {\n approveSpecs,\n createSpecApprovedAt,\n loadSpecApprovalCandidates,\n type SpecApproveCommandInput,\n type SpecApproveResult,\n type SpecApproveTarget,\n} from '../core/spec-approve.js';\n\nexport interface SpecApproveCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction formatTaskLabel(task: SpecApproveTarget): string {\n return `${task.id} (${task.status})`;\n}\n\nfunction formatSuccess(result: SpecApproveResult, tasks: readonly SpecApproveTarget[]): string {\n const lines = ['스펙 승인됨'];\n\n for (const task of tasks) {\n lines.push(`- ${task.path} -> ${result.nextStatus}`);\n }\n\n lines.push('상태: SPEC_APPROVED → 플랜 작성을 시작합니다.');\n\n return lines.join('\\n');\n}\n\nasync function selectTargets(tasks: readonly SpecApproveTarget[]): Promise<SpecApproveTarget[]> {\n if (tasks.length <= 1 || !process.stdin.isTTY || !process.stdout.isTTY) {\n return [...tasks];\n }\n\n const selectedIds = await checkbox<string>({\n message: 'Select tasks to approve',\n choices: tasks.map((task) => ({\n checked: true,\n name: formatTaskLabel(task),\n value: task.id,\n })),\n });\n\n return tasks.filter((task) => selectedIds.includes(task.id));\n}\n\nexport async function runSpecApproveCommand(\n input: SpecApproveCommandInput,\n projectRoot: string,\n): Promise<SpecApproveCommandResult> {\n try {\n const candidates = await loadSpecApprovalCandidates(projectRoot, input);\n\n if (candidates.length === 0) {\n throw new Error('No matching tasks awaiting spec approval.');\n }\n\n if (\n input.target !== undefined &&\n candidates.length > 1 &&\n (!process.stdin.isTTY || !process.stdout.isTTY)\n ) {\n throw new Error(\n 'Multiple matching tasks found; rerun interactively to choose approval targets.',\n );\n }\n\n const selectedTasks = await selectTargets(candidates);\n\n if (selectedTasks.length === 0) {\n throw new Error('No tasks selected for spec approval.');\n }\n\n const result = await approveSpecs(projectRoot, selectedTasks, createSpecApprovedAt());\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatSuccess(result, selectedTasks),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown spec approval failure.',\n stdout: '',\n };\n }\n}\n","import { startTask } from '../core/start.js';\n\nexport interface StartCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runStartCommand(\n type: string,\n slug: string,\n projectRoot: string,\n): Promise<StartCommandResult> {\n try {\n const result = await startTask(type, slug, projectRoot);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: [\n '작업 디렉토리 생성됨',\n `경로: ${result.workspacePath}/`,\n `상태: ${result.status}`,\n ].join('\\n'),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown start failure.',\n stdout: '',\n };\n }\n}\n","{\n \"name\": \"@sduck/sduck-cli\",\n \"version\": \"0.1.8\",\n \"description\": \"Spec-Driven Development CLI bootstrap\",\n \"type\": \"module\",\n \"bin\": {\n \"sduck\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \".sduck/sduck-assets\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"dev\": \"tsx src/cli.ts\",\n \"build\": \"tsup src/cli.ts --config tsup.config.ts\",\n \"lint\": \"eslint . --max-warnings=0\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"typecheck\": \"tsc --project tsconfig.json --noEmit\",\n \"test:unit\": \"vitest run tests/unit\",\n \"test:e2e\": \"vitest run tests/e2e\",\n \"test\": \"npm run test:unit && npm run test:e2e\",\n \"prepare\": \"husky\"\n },\n \"lint-staged\": {\n \"*.{js,mjs,cjs,ts,mts,cts}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.8.6\",\n \"commander\": \"^14.0.1\",\n \"js-yaml\": \"^4.1.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.23.0\",\n \"@types/node\": \"^22.13.14\",\n \"eslint\": \"^9.23.0\",\n \"eslint-config-prettier\": \"^10.1.1\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-import-resolver-typescript\": \"^4.3.5\",\n \"eslint-plugin-n\": \"^17.16.2\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^15.5.0\",\n \"prettier\": \"^3.5.3\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.3\",\n \"typescript\": \"^5.8.2\",\n \"typescript-eslint\": \"^8.28.0\",\n \"vitest\": \"^3.0.8\"\n }\n}\n","import packageMetadata from '../../package.json' with { type: 'json' };\n\nexport const CLI_NAME = 'sduck';\n\nexport const CLI_VERSION = packageMetadata.version;\n\nexport const CLI_DESCRIPTION = 'Spec-Driven Development workflow bootstrap CLI';\n\nexport const PLACEHOLDER_MESSAGE =\n 'Core workflow commands are planned but not implemented in this bootstrap yet.';\n\nexport function normalizeCommandName(input: string): string {\n return input.trim().toLowerCase().replace(/\\s+/g, '-');\n}\n"],"mappings":"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","names":["readFile","join","join","join","join","readFile","readFile","join","join","readFile","padCell","buildResultTable","writeFile","join","join","join","readFile","writeFile","join","join","readFile","writeFile","readFile","writeFile","join","join","readFile","writeFile","mkdir","readFile","writeFile","join","join","mkdir","readFile","writeFile","join","writeFile","readFile","dirname","join","fileURLToPath","join","dirname","fileURLToPath","readFile","mkdir","readFile","writeFile","dirname","join","join","readFile","mkdir","dirname","writeFile","padCell","checkbox","padCell","buildResultTable","formatSuccess","checkbox","copyFile","readFile","writeFile","join","join","copyFile","readFile","writeFile","formatSuccess","checkbox","formatTaskLabel","formatSuccess","selectTargets","checkbox"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/core/abandon.ts","../src/core/fs.ts","../src/core/state.ts","../src/core/project-paths.ts","../src/utils/utc-date.ts","../src/core/workspace.ts","../src/commands/abandon.ts","../src/core/archive.ts","../src/commands/archive.ts","../src/core/clean.ts","../src/core/git.ts","../src/commands/clean.ts","../src/core/done.ts","../src/commands/done.ts","../src/commands/fast-track.ts","../src/core/fast-track.ts","../src/core/assets.ts","../src/core/plan-approve.ts","../src/core/spec-approve.ts","../src/core/start.ts","../src/core/gitignore.ts","../src/core/implement.ts","../src/commands/implement.ts","../src/commands/init.ts","../src/core/agent-rules.ts","../src/core/init.ts","../src/commands/plan-approve.ts","../src/core/reopen.ts","../src/commands/reopen.ts","../src/core/review-ready.ts","../src/commands/review.ts","../src/commands/spec-approve.ts","../src/commands/start.ts","../src/core/use.ts","../src/commands/use.ts","../package.json","../src/core/command-metadata.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\n\nimport { runAbandonCommand } from './commands/abandon.js';\nimport { runArchiveCommand } from './commands/archive.js';\nimport { runCleanCommand } from './commands/clean.js';\nimport { runDoneCommand } from './commands/done.js';\nimport { runFastTrackCommand } from './commands/fast-track.js';\nimport { runImplementCommand } from './commands/implement.js';\nimport { runInitCommand } from './commands/init.js';\nimport { runPlanApproveCommand } from './commands/plan-approve.js';\nimport { runReopenCommand } from './commands/reopen.js';\nimport { runReviewReadyCommand } from './commands/review.js';\nimport { runSpecApproveCommand } from './commands/spec-approve.js';\nimport { runStartCommand } from './commands/start.js';\nimport { runUseCommand } from './commands/use.js';\nimport {\n CLI_DESCRIPTION,\n CLI_NAME,\n CLI_VERSION,\n PLACEHOLDER_MESSAGE,\n normalizeCommandName,\n} from './core/command-metadata.js';\n\nconst program = new Command();\n\nprogram.name(CLI_NAME).description(CLI_DESCRIPTION).version(CLI_VERSION);\n\nprogram\n .command('init')\n .description('Initialize the current repository for the SDD workflow')\n .option('--force', 'Regenerate the bundled assets in .sduck/sduck-assets')\n .option(\n '--agents <agents>',\n 'Comma-separated agents (claude-code,codex,opencode,gemini-cli,cursor,antigravity)',\n )\n .action(async (options: { agents?: string; force?: boolean }) => {\n const initOptions =\n options.agents === undefined\n ? { force: options.force ?? false }\n : { agents: options.agents, force: options.force ?? false };\n const result = await runInitCommand(initOptions, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('preview <name>')\n .description('Print the normalized command name for bootstrap verification')\n .action((name: string) => {\n console.log(normalizeCommandName(name));\n });\n\nprogram\n .command('start <type> <slug>')\n .description('Create a new task workspace from a type template')\n .option('--no-git', 'Skip git worktree creation')\n .action(async (type: string, slug: string, options: { git: boolean }) => {\n const startOptions = options.git ? undefined : { noGit: true };\n const result = await runStartCommand(type, slug, process.cwd(), startOptions);\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('fast-track <type> <slug>')\n .description('Create a minimal spec/plan task with optional bundled approval')\n .option('--no-git', 'Skip git worktree creation')\n .action(async (type: string, slug: string, options: { git: boolean }) => {\n const startOptions = options.git ? undefined : { noGit: true };\n const result = await runFastTrackCommand({ slug, type }, process.cwd(), startOptions);\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('spec')\n .description('Manage spec workflow state')\n .command('approve [target]')\n .description('Approve a task spec and move it to plan writing')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runSpecApproveCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('plan')\n .description('Manage plan workflow state')\n .command('approve [target]')\n .description('Approve a task plan and move it to implementation')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runPlanApproveCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('done [target]')\n .description('Complete an in-progress task after validation')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runDoneCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('reopen [target]')\n .description('Reopen a completed task for a new cycle')\n .action(async (target?: string) => {\n const input = target === undefined ? {} : { target };\n const result = await runReopenCommand(input, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('archive')\n .description('Archive completed tasks into monthly directories')\n .option('--keep <n>', 'Keep the N most recently completed tasks in workspace', '0')\n .action(async (options: { keep: string }) => {\n const keep = Number(options.keep);\n const result = await runArchiveCommand({ keep }, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('use <target>')\n .description('Switch the current active work')\n .action(async (target: string) => {\n const result = await runUseCommand(target, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('implement')\n .description('Show implementation context for the current work')\n .action(async () => {\n const result = await runImplementCommand(process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('abandon <target>')\n .description('Abandon an active work')\n .action(async (target: string) => {\n const result = await runAbandonCommand(target, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nconst reviewCmd = program.command('review').description('Manage review workflow state');\n\nreviewCmd\n .command('ready [target]')\n .description('Mark a work as review ready')\n .action(async (target?: string) => {\n const result = await runReviewReadyCommand(target, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('clean [target]')\n .description('Clean up completed or abandoned works')\n .option('--force', 'Force delete unmerged branches')\n .action(async (target: string | undefined, options: { force?: boolean }) => {\n const result = await runCleanCommand({ force: options.force, target }, process.cwd());\n\n if (result.stdout !== '') {\n console.log(result.stdout);\n }\n\n if (result.stderr !== '') {\n console.error(result.stderr);\n }\n\n if (result.exitCode !== 0) {\n process.exitCode = result.exitCode;\n }\n });\n\nprogram\n .command('roadmap')\n .description('Show the current bootstrap status')\n .action(() => {\n console.log(PLACEHOLDER_MESSAGE);\n });\n\nawait program.parseAsync(process.argv);\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { readCurrentWorkId, writeCurrentWorkId } from './state.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nconst ABANDONABLE_STATUSES = new Set([\n 'PENDING_SPEC_APPROVAL',\n 'PENDING_PLAN_APPROVAL',\n 'IN_PROGRESS',\n 'REVIEW_READY',\n 'SPEC_APPROVED',\n]);\n\nexport async function resolveAbandonTarget(\n projectRoot: string,\n target: string,\n): Promise<WorkspaceTaskSummary> {\n const tasks = await listWorkspaceTasks(projectRoot);\n const trimmed = target.trim();\n\n // id exact match first\n const idMatch = tasks.find((task) => task.id === trimmed);\n\n if (idMatch !== undefined) {\n if (!ABANDONABLE_STATUSES.has(idMatch.status)) {\n throw new Error(\n `Cannot abandon work ${idMatch.id}: status is ${idMatch.status}. Only active works can be abandoned.`,\n );\n }\n\n return idMatch;\n }\n\n // slug exact match\n const slugMatches = tasks.filter((task) => task.slug === trimmed);\n\n if (slugMatches.length === 1) {\n const match = slugMatches[0];\n\n if (match === undefined) {\n throw new Error(`No work matches '${trimmed}'.`);\n }\n\n if (!ABANDONABLE_STATUSES.has(match.status)) {\n throw new Error(\n `Cannot abandon work ${match.id}: status is ${match.status}. Only active works can be abandoned.`,\n );\n }\n\n return match;\n }\n\n if (slugMatches.length > 1) {\n const candidates = slugMatches.map((task) => task.id).join(', ');\n throw new Error(\n `Multiple works match slug '${trimmed}': ${candidates}. Use \\`sduck abandon <id>\\` to specify.`,\n );\n }\n\n throw new Error(`No work matches '${trimmed}'.`);\n}\n\nexport async function runAbandonWorkflow(\n projectRoot: string,\n target: string,\n date = new Date(),\n): Promise<{ workId: string }> {\n const work = await resolveAbandonTarget(projectRoot, target);\n const metaPath = join(projectRoot, work.path, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for work ${work.id}.`);\n }\n\n const metaContent = await readFile(metaPath, 'utf8');\n const updatedContent = metaContent\n .replace(/^status:\\s+.+$/m, 'status: ABANDONED')\n .replace(/^updated_at:\\s+.+$/m, `updated_at: ${formatUtcTimestamp(date)}`);\n\n await writeFile(metaPath, updatedContent, 'utf8');\n\n // Clear current work if this was the current one\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId === work.id) {\n await writeCurrentWorkId(projectRoot, null, date);\n }\n\n return { workId: work.id };\n}\n","import { constants } from 'node:fs';\nimport { access, copyFile, mkdir, stat } from 'node:fs/promises';\n\nexport type FsEntryKind = 'missing' | 'file' | 'directory';\n\nexport async function getFsEntryKind(targetPath: string): Promise<FsEntryKind> {\n try {\n const stats = await stat(targetPath);\n\n if (stats.isDirectory()) {\n return 'directory';\n }\n\n if (stats.isFile()) {\n return 'file';\n }\n\n return 'file';\n } catch {\n return 'missing';\n }\n}\n\nexport async function ensureDirectory(targetPath: string): Promise<void> {\n await mkdir(targetPath, { recursive: true });\n}\n\nexport async function ensureReadableFile(targetPath: string): Promise<void> {\n await access(targetPath, constants.R_OK);\n}\n\nexport async function copyFileIntoPlace(sourcePath: string, targetPath: string): Promise<void> {\n await copyFile(sourcePath, targetPath);\n}\n","import { readFile, writeFile } from 'node:fs/promises';\n\nimport { getFsEntryKind } from './fs.js';\nimport { getProjectSduckStatePath } from './project-paths.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport async function readCurrentWorkId(projectRoot: string): Promise<string | null> {\n const statePath = getProjectSduckStatePath(projectRoot);\n\n if ((await getFsEntryKind(statePath)) !== 'file') {\n return null;\n }\n\n const content = await readFile(statePath, 'utf8');\n const match = /^current_work_id:[ \\t]+(.+)$/m.exec(content);\n const value = match?.[1]?.trim();\n\n if (value === undefined || value === 'null') {\n return null;\n }\n\n return value;\n}\n\nexport async function writeCurrentWorkId(\n projectRoot: string,\n workId: string | null,\n date = new Date(),\n): Promise<void> {\n const statePath = getProjectSduckStatePath(projectRoot);\n const idValue = workId ?? 'null';\n const content = `current_work_id: ${idValue}\\nupdated_at: ${formatUtcTimestamp(date)}\\n`;\n\n await writeFile(statePath, content, 'utf8');\n}\n\nexport function throwNoCurrentWorkError(command: string): never {\n throw new Error(`No current work set. Run \\`sduck ${command} <target>\\` with explicit target.`);\n}\n","import { join, relative } from 'node:path';\n\nexport const SDUCK_HOME_DIR = '.sduck';\nexport const SDUCK_ASSETS_DIR = 'sduck-assets';\nexport const SDUCK_WORKSPACE_DIR = 'sduck-workspace';\nexport const SDUCK_ARCHIVE_DIR = 'sduck-archive';\nexport const SDUCK_STATE_FILE = 'sduck-state.yml';\nexport const SDUCK_WORKTREES_DIR = '.sduck-worktrees';\n\nexport const PROJECT_SDUCK_HOME_RELATIVE_PATH = SDUCK_HOME_DIR;\nexport const PROJECT_SDUCK_ASSETS_RELATIVE_PATH = join(SDUCK_HOME_DIR, SDUCK_ASSETS_DIR);\nexport const PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH = join(SDUCK_HOME_DIR, SDUCK_WORKSPACE_DIR);\nexport const PROJECT_SDUCK_ARCHIVE_RELATIVE_PATH = join(SDUCK_HOME_DIR, SDUCK_ARCHIVE_DIR);\n\nexport function getProjectSduckHomePath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_HOME_RELATIVE_PATH);\n}\n\nexport function getProjectSduckAssetsPath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_ASSETS_RELATIVE_PATH);\n}\n\nexport function getProjectSduckWorkspacePath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH);\n}\n\nexport function getProjectSduckArchivePath(projectRoot: string): string {\n return join(projectRoot, PROJECT_SDUCK_ARCHIVE_RELATIVE_PATH);\n}\n\nexport function getProjectRelativeSduckAssetPath(...segments: string[]): string {\n return join(PROJECT_SDUCK_ASSETS_RELATIVE_PATH, ...segments);\n}\n\nexport function getProjectRelativeSduckWorkspacePath(...segments: string[]): string {\n return join(PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH, ...segments);\n}\n\nexport function getProjectSduckStatePath(projectRoot: string): string {\n return join(projectRoot, SDUCK_HOME_DIR, SDUCK_STATE_FILE);\n}\n\nexport function getProjectWorktreesPath(projectRoot: string): string {\n return join(projectRoot, SDUCK_WORKTREES_DIR);\n}\n\nexport function getProjectWorktreePath(projectRoot: string, workId: string): string {\n return join(projectRoot, SDUCK_WORKTREES_DIR, workId);\n}\n\nexport function toBundledAssetRelativePath(projectRelativeAssetPath: string): string {\n return relative(PROJECT_SDUCK_ASSETS_RELATIVE_PATH, projectRelativeAssetPath);\n}\n","function pad2(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nexport function formatUtcDate(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = pad2(date.getUTCMonth() + 1);\n const day = pad2(date.getUTCDate());\n\n return `${year}-${month}-${day}`;\n}\n\nexport function formatUtcTimestamp(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = pad2(date.getUTCMonth() + 1);\n const day = pad2(date.getUTCDate());\n const hour = pad2(date.getUTCHours());\n const minute = pad2(date.getUTCMinutes());\n const second = pad2(date.getUTCSeconds());\n\n return `${year}-${month}-${day}T${hour}:${minute}:${second}Z`;\n}\n","import { readFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport {\n getProjectRelativeSduckWorkspacePath,\n getProjectSduckWorkspacePath,\n} from './project-paths.js';\n\nexport interface ActiveTaskSummary {\n id: string;\n path: string;\n status: string;\n}\n\nexport interface WorkspaceTaskSummary {\n baseBranch?: string;\n branch?: string;\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n updatedAt?: string;\n worktreePath?: string;\n}\n\nconst ACTIVE_STATUSES = new Set([\n 'IN_PROGRESS',\n 'PENDING_SPEC_APPROVAL',\n 'PENDING_PLAN_APPROVAL',\n 'REVIEW_READY',\n]);\n\ninterface ParsedMeta {\n baseBranch?: string;\n branch?: string;\n createdAt?: string;\n id?: string;\n slug?: string;\n status?: string;\n updatedAt?: string;\n worktreePath?: string;\n}\n\nfunction setIfNotNull(meta: ParsedMeta, key: keyof ParsedMeta, value: string | undefined): void {\n if (value !== undefined) {\n const trimmed = value.trim();\n\n if (trimmed !== 'null') {\n meta[key] = trimmed;\n }\n }\n}\n\nexport function parseMetaText(content: string): ParsedMeta {\n const createdAtMatch = /^created_at:[ \\t]+(.+)$/m.exec(content);\n const idMatch = /^id:[ \\t]+(.+)$/m.exec(content);\n const slugMatch = /^slug:[ \\t]+(.+)$/m.exec(content);\n const statusMatch = /^status:[ \\t]+(.+)$/m.exec(content);\n const branchMatch = /^branch:[ \\t]+(.+)$/m.exec(content);\n const baseBranchMatch = /^base_branch:[ \\t]+(.+)$/m.exec(content);\n const worktreePathMatch = /^worktree_path:[ \\t]+(.+)$/m.exec(content);\n const updatedAtMatch = /^updated_at:[ \\t]+(.+)$/m.exec(content);\n const parsedMeta: ParsedMeta = {};\n\n if (createdAtMatch?.[1] !== undefined) {\n parsedMeta.createdAt = createdAtMatch[1].trim();\n }\n\n if (idMatch?.[1] !== undefined) {\n parsedMeta.id = idMatch[1].trim();\n }\n\n if (slugMatch?.[1] !== undefined) {\n parsedMeta.slug = slugMatch[1].trim();\n }\n\n if (statusMatch?.[1] !== undefined) {\n parsedMeta.status = statusMatch[1].trim();\n }\n\n setIfNotNull(parsedMeta, 'branch', branchMatch?.[1]);\n setIfNotNull(parsedMeta, 'baseBranch', baseBranchMatch?.[1]);\n setIfNotNull(parsedMeta, 'worktreePath', worktreePathMatch?.[1]);\n setIfNotNull(parsedMeta, 'updatedAt', updatedAtMatch?.[1]);\n\n return parsedMeta;\n}\n\nexport function sortTasksByRecency(tasks: readonly WorkspaceTaskSummary[]): WorkspaceTaskSummary[] {\n return [...tasks].sort((left, right) => {\n const leftValue = left.createdAt ?? '';\n const rightValue = right.createdAt ?? '';\n\n return rightValue.localeCompare(leftValue);\n });\n}\n\nasync function readTaskFromEntry(\n projectRoot: string,\n dirName: string,\n): Promise<WorkspaceTaskSummary | null> {\n const relativePath = getProjectRelativeSduckWorkspacePath(dirName);\n const metaPath = join(projectRoot, relativePath, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n return null;\n }\n\n const parsedMeta = parseMetaText(await readFile(metaPath, 'utf8'));\n\n if (parsedMeta.id === undefined || parsedMeta.status === undefined) {\n return null;\n }\n\n const task: WorkspaceTaskSummary = {\n id: parsedMeta.id,\n path: relativePath,\n status: parsedMeta.status,\n };\n\n if (parsedMeta.createdAt !== undefined) {\n task.createdAt = parsedMeta.createdAt;\n }\n\n if (parsedMeta.slug !== undefined) {\n task.slug = parsedMeta.slug;\n }\n\n if (parsedMeta.branch !== undefined) {\n task.branch = parsedMeta.branch;\n }\n\n if (parsedMeta.baseBranch !== undefined) {\n task.baseBranch = parsedMeta.baseBranch;\n }\n\n if (parsedMeta.worktreePath !== undefined) {\n task.worktreePath = parsedMeta.worktreePath;\n }\n\n if (parsedMeta.updatedAt !== undefined) {\n task.updatedAt = parsedMeta.updatedAt;\n }\n\n return task;\n}\n\nexport async function listWorkspaceTasks(projectRoot: string): Promise<WorkspaceTaskSummary[]> {\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n\n if ((await getFsEntryKind(workspaceRoot)) !== 'directory') {\n return [];\n }\n\n const entries = await readdir(workspaceRoot, { withFileTypes: true });\n const dirNames = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);\n\n const results = await Promise.allSettled(\n dirNames.map((dirName) => readTaskFromEntry(projectRoot, dirName)),\n );\n\n const tasks: WorkspaceTaskSummary[] = [];\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value !== null) {\n tasks.push(result.value);\n }\n }\n\n return sortTasksByRecency(tasks);\n}\n\n/** @deprecated Use readCurrentWorkId() + listWorkspaceTasks() instead. */\nexport async function findActiveTask(projectRoot: string): Promise<ActiveTaskSummary | null> {\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n\n if ((await getFsEntryKind(workspaceRoot)) !== 'directory') {\n return null;\n }\n\n const entries = await readdir(workspaceRoot, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const relativePath = getProjectRelativeSduckWorkspacePath(entry.name);\n const metaPath = join(projectRoot, relativePath, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n continue;\n }\n\n const content = await readFile(metaPath, 'utf8');\n const statusMatch = /^status:[ \\t]+(.+)$/m.exec(content);\n const status = statusMatch?.[1]?.trim();\n\n if (status !== undefined && ACTIVE_STATUSES.has(status)) {\n const idMatch = /^id:[ \\t]+(.+)$/m.exec(content);\n\n return {\n id: idMatch?.[1]?.trim() ?? entry.name,\n path: relativePath,\n status,\n };\n }\n }\n\n return null;\n}\n","import { runAbandonWorkflow } from '../core/abandon.js';\n\nexport interface AbandonCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runAbandonCommand(\n target: string,\n projectRoot: string,\n): Promise<AbandonCommandResult> {\n try {\n const { workId } = await runAbandonWorkflow(projectRoot, target);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: `작업 중단됨: ${workId}`,\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown abandon failure.',\n stdout: '',\n };\n }\n}\n","import { readFile, rename } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { ensureDirectory, getFsEntryKind } from './fs.js';\nimport { getProjectSduckArchivePath } from './project-paths.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\n\nexport interface ArchiveCommandInput {\n keep?: number;\n}\n\nexport interface ArchiveTarget {\n completedAt: string;\n id: string;\n month: string;\n path: string;\n slug?: string | undefined;\n}\n\nexport interface ArchiveSuccessRow {\n month: string;\n taskId: string;\n}\n\nexport interface ArchiveSkipRow {\n reason: string;\n taskId: string;\n}\n\nexport interface ArchiveResult {\n archived: ArchiveSuccessRow[];\n skipped: ArchiveSkipRow[];\n}\n\nexport function extractCompletedAt(metaContent: string): string | null {\n const match = /^completed_at:[ \\t]+(.+)$/m.exec(metaContent);\n const value = match?.[1]?.trim();\n\n if (value === undefined || value === 'null') {\n return null;\n }\n\n return value;\n}\n\nexport function deriveArchiveMonth(completedAt: string): string {\n return completedAt.slice(0, 7);\n}\n\nexport function filterArchiveCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): WorkspaceTaskSummary[] {\n return tasks.filter((task) => task.status === 'DONE');\n}\n\nexport async function isAlreadyArchived(\n archivePath: string,\n taskDirName: string,\n): Promise<boolean> {\n const targetPath = join(archivePath, taskDirName);\n return (await getFsEntryKind(targetPath)) === 'directory';\n}\n\nexport async function loadArchiveTargets(\n projectRoot: string,\n input: ArchiveCommandInput,\n): Promise<ArchiveTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n const doneTasks = filterArchiveCandidates(tasks);\n const targets: ArchiveTarget[] = [];\n\n for (const task of doneTasks) {\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n const metaContent = await readFile(metaPath, 'utf8');\n const completedAt = extractCompletedAt(metaContent);\n\n if (completedAt === null) {\n continue;\n }\n\n targets.push({\n completedAt,\n id: task.id,\n month: deriveArchiveMonth(completedAt),\n path: task.path,\n slug: task.slug,\n });\n }\n\n targets.sort((a, b) => a.completedAt.localeCompare(b.completedAt));\n\n const keep = input.keep ?? 0;\n\n if (keep > 0 && targets.length > keep) {\n return targets.slice(0, targets.length - keep);\n }\n\n return targets;\n}\n\nexport async function runArchiveWorkflow(\n projectRoot: string,\n targets: readonly ArchiveTarget[],\n): Promise<ArchiveResult> {\n const archiveRoot = getProjectSduckArchivePath(projectRoot);\n const archived: ArchiveSuccessRow[] = [];\n const skipped: ArchiveSkipRow[] = [];\n\n for (const target of targets) {\n const monthDir = join(archiveRoot, target.month);\n await ensureDirectory(monthDir);\n\n const segments = target.path.split('/');\n const taskDirName = segments.at(-1) ?? target.id;\n\n if (await isAlreadyArchived(monthDir, taskDirName)) {\n skipped.push({ reason: 'already archived', taskId: target.id });\n continue;\n }\n\n const sourcePath = join(projectRoot, target.path);\n const destPath = join(monthDir, taskDirName);\n\n await rename(sourcePath, destPath);\n archived.push({ month: target.month, taskId: target.id });\n }\n\n return { archived, skipped };\n}\n","import {\n loadArchiveTargets,\n runArchiveWorkflow,\n type ArchiveCommandInput,\n type ArchiveResult,\n type ArchiveSkipRow,\n type ArchiveSuccessRow,\n} from '../core/archive.js';\n\nexport interface ArchiveCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildResultTable(result: ArchiveResult): string {\n const rows: { month: string; result: string; task: string }[] = [\n ...result.archived.map((row: ArchiveSuccessRow) => ({\n month: row.month,\n result: 'archived',\n task: row.taskId,\n })),\n ...result.skipped.map((row: ArchiveSkipRow) => ({\n month: '',\n result: 'skipped',\n task: row.taskId,\n })),\n ];\n\n const resultWidth = Math.max('Result'.length, ...rows.map((row) => row.result.length));\n const taskWidth = Math.max('Task'.length, ...rows.map((row) => row.task.length));\n const monthWidth = Math.max('Month'.length, ...rows.map((row) => row.month.length));\n const border = `+-${'-'.repeat(resultWidth)}-+-${'-'.repeat(taskWidth)}-+-${'-'.repeat(monthWidth)}-+`;\n const header = `| ${padCell('Result', resultWidth)} | ${padCell('Task', taskWidth)} | ${padCell('Month', monthWidth)} |`;\n const body = rows.map(\n (row) =>\n `| ${padCell(row.result, resultWidth)} | ${padCell(row.task, taskWidth)} | ${padCell(row.month, monthWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nexport async function runArchiveCommand(\n input: ArchiveCommandInput,\n projectRoot: string,\n): Promise<ArchiveCommandResult> {\n try {\n const targets = await loadArchiveTargets(projectRoot, input);\n\n if (targets.length === 0) {\n return {\n exitCode: 0,\n stderr: '',\n stdout: '아카이브 대상이 없습니다.',\n };\n }\n\n const result = await runArchiveWorkflow(projectRoot, targets);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: buildResultTable(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown archive failure.',\n stdout: '',\n };\n }\n}\n","import { readFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { deleteBranch, isBranchMerged, removeWorktree } from './git.js';\nimport { getProjectSduckArchivePath, getProjectSduckWorkspacePath } from './project-paths.js';\nimport { parseMetaText, type WorkspaceTaskSummary } from './workspace.js';\n\nexport interface CleanCandidate {\n baseBranch: string | null;\n branch: string | null;\n id: string;\n path: string;\n worktreePath: string | null;\n}\n\nexport interface CleanSuccessRow {\n branchDeleted: boolean;\n note: string;\n workId: string;\n worktreeRemoved: boolean;\n}\n\nexport interface CleanResult {\n cleaned: CleanSuccessRow[];\n}\n\nconst CLEANABLE_STATUSES = new Set(['DONE', 'ABANDONED']);\n\nasync function readTasksFromDirectory(\n _projectRoot: string,\n dirPath: string,\n relativeDirPath: string,\n): Promise<WorkspaceTaskSummary[]> {\n if ((await getFsEntryKind(dirPath)) !== 'directory') {\n return [];\n }\n\n const entries = await readdir(dirPath, { withFileTypes: true });\n const tasks: WorkspaceTaskSummary[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const metaPath = join(dirPath, entry.name, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n continue;\n }\n\n const content = await readFile(metaPath, 'utf8');\n const meta = parseMetaText(content);\n\n if (meta.id !== undefined && meta.status !== undefined) {\n const task: WorkspaceTaskSummary = {\n id: meta.id,\n path: join(relativeDirPath, entry.name),\n status: meta.status,\n };\n\n if (meta.baseBranch !== undefined) task.baseBranch = meta.baseBranch;\n if (meta.branch !== undefined) task.branch = meta.branch;\n if (meta.slug !== undefined) task.slug = meta.slug;\n if (meta.worktreePath !== undefined) task.worktreePath = meta.worktreePath;\n\n tasks.push(task);\n }\n }\n\n return tasks;\n}\n\nasync function readArchiveTasks(projectRoot: string): Promise<WorkspaceTaskSummary[]> {\n const archivePath = getProjectSduckArchivePath(projectRoot);\n\n if ((await getFsEntryKind(archivePath)) !== 'directory') {\n return [];\n }\n\n const months = await readdir(archivePath, { withFileTypes: true });\n const tasks: WorkspaceTaskSummary[] = [];\n\n for (const month of months) {\n if (!month.isDirectory()) {\n continue;\n }\n\n const monthPath = join(archivePath, month.name);\n const relativePath = join('.sduck/sduck-archive', month.name);\n const monthTasks = await readTasksFromDirectory(projectRoot, monthPath, relativePath);\n tasks.push(...monthTasks);\n }\n\n return tasks;\n}\n\nexport async function resolveCleanCandidates(\n projectRoot: string,\n target?: string,\n): Promise<CleanCandidate[]> {\n if (target !== undefined && target.trim() !== '') {\n const trimmed = target.trim();\n const workspacePath = getProjectSduckWorkspacePath(projectRoot);\n const workspaceTasks = await readTasksFromDirectory(\n projectRoot,\n workspacePath,\n '.sduck/sduck-workspace',\n );\n const archiveTasks = await readArchiveTasks(projectRoot);\n const allTasks = [...workspaceTasks, ...archiveTasks];\n\n // id exact match first\n const idMatch = allTasks.find((task) => task.id === trimmed);\n\n if (idMatch !== undefined) {\n if (!CLEANABLE_STATUSES.has(idMatch.status)) {\n throw new Error(\n `Cannot clean work ${idMatch.id}: status is ${idMatch.status}. Only DONE or ABANDONED works can be cleaned.`,\n );\n }\n\n return [toCleanCandidate(idMatch)];\n }\n\n // slug exact match across workspace + archive\n const slugMatches = allTasks.filter((task) => task.slug === trimmed);\n\n if (slugMatches.length === 1) {\n const match = slugMatches[0];\n\n if (match === undefined) {\n throw new Error(`No work matches '${trimmed}'.`);\n }\n\n if (!CLEANABLE_STATUSES.has(match.status)) {\n throw new Error(\n `Cannot clean work ${match.id}: status is ${match.status}. Only DONE or ABANDONED works can be cleaned.`,\n );\n }\n\n return [toCleanCandidate(match)];\n }\n\n if (slugMatches.length > 1) {\n const candidates = slugMatches.map((task) => task.id).join(', ');\n throw new Error(\n `Multiple works match slug '${trimmed}': ${candidates}. Use \\`sduck clean <id>\\` to specify.`,\n );\n }\n\n throw new Error(`No work matches '${trimmed}'.`);\n }\n\n // No target: workspace DONE/ABANDONED only\n const workspacePath = getProjectSduckWorkspacePath(projectRoot);\n const tasks = await readTasksFromDirectory(projectRoot, workspacePath, '.sduck/sduck-workspace');\n\n return tasks.filter((task) => CLEANABLE_STATUSES.has(task.status)).map(toCleanCandidate);\n}\n\nfunction toCleanCandidate(task: WorkspaceTaskSummary): CleanCandidate {\n return {\n baseBranch: task.baseBranch ?? null,\n branch: task.branch ?? null,\n id: task.id,\n path: task.path,\n worktreePath: task.worktreePath ?? null,\n };\n}\n\nexport async function runCleanWorkflow(\n projectRoot: string,\n target?: string,\n force = false,\n): Promise<CleanResult> {\n const candidates = await resolveCleanCandidates(projectRoot, target);\n const cleaned: CleanSuccessRow[] = [];\n\n for (const candidate of candidates) {\n // 1. branch/baseBranch null → skip all git steps\n if (candidate.branch === null || candidate.baseBranch === null) {\n cleaned.push({\n branchDeleted: false,\n note: 'no git resources to clean (--no-git work)',\n workId: candidate.id,\n worktreeRemoved: false,\n });\n continue;\n }\n\n // 2. merge check\n const merged = await isBranchMerged(candidate.branch, candidate.baseBranch, projectRoot);\n\n // 3. worktree removal\n let worktreeRemoved = false;\n\n if (candidate.worktreePath !== null) {\n const absoluteWorktreePath = join(projectRoot, candidate.worktreePath);\n\n if ((await getFsEntryKind(absoluteWorktreePath)) === 'missing') {\n // Warn but continue to branch deletion\n // eslint-disable-next-line no-console\n console.warn(\n `Warning: worktree path ${candidate.worktreePath} does not exist for work ${candidate.id}.`,\n );\n } else {\n // Fail-fast: if removal fails, abort entire clean\n await removeWorktree(absoluteWorktreePath, projectRoot);\n worktreeRemoved = true;\n }\n }\n\n // 4. branch deletion\n let branchDeleted = false;\n\n if (merged) {\n await deleteBranch(candidate.branch, false, projectRoot);\n branchDeleted = true;\n } else if (force) {\n await deleteBranch(candidate.branch, true, projectRoot);\n branchDeleted = true;\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `Warning: branch ${candidate.branch} is not merged into ${candidate.baseBranch}. Use --force to delete.`,\n );\n }\n\n cleaned.push({\n branchDeleted,\n note: merged\n ? 'cleaned (merged)'\n : force\n ? 'cleaned (forced)'\n : 'worktree removed, branch kept',\n workId: candidate.id,\n worktreeRemoved,\n });\n }\n\n return { cleaned };\n}\n","import { execFile } from 'node:child_process';\n\nfunction execGit(args: readonly string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('git', [...args], { cwd }, (error, stdout, stderr) => {\n if (error !== null) {\n const command = args[0] ?? 'unknown';\n reject(new Error(`git ${command} failed: ${stderr.trim() || error.message}`));\n return;\n }\n\n resolve(stdout.trim());\n });\n });\n}\n\nexport async function getCurrentBranch(cwd: string): Promise<string> {\n const branch = await execGit(['rev-parse', '--abbrev-ref', 'HEAD'], cwd);\n\n if (branch === 'HEAD') {\n throw new Error(\n 'Detached HEAD state. Cannot determine base branch. Use --no-git to skip worktree creation.',\n );\n }\n\n return branch;\n}\n\nexport async function addWorktree(\n worktreePath: string,\n branch: string,\n baseBranch: string,\n cwd: string,\n): Promise<void> {\n await execGit(['worktree', 'add', worktreePath, '-b', branch, baseBranch], cwd);\n}\n\nexport async function removeWorktree(worktreePath: string, cwd: string): Promise<void> {\n await execGit(['worktree', 'remove', worktreePath], cwd);\n}\n\nexport async function isBranchMerged(\n branch: string,\n baseBranch: string,\n cwd: string,\n): Promise<boolean> {\n const output = await execGit(['branch', '--merged', baseBranch], cwd);\n const branches = output.split('\\n').map((line) => line.replace(/^\\*?\\s*/, '').trim());\n\n return branches.includes(branch);\n}\n\nexport async function deleteBranch(branch: string, force: boolean, cwd: string): Promise<void> {\n const flag = force ? '-D' : '-d';\n\n await execGit(['branch', flag, branch], cwd);\n}\n","import { runCleanWorkflow } from '../core/clean.js';\n\nexport interface CleanCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runCleanCommand(\n options: { force: boolean | undefined; target: string | undefined },\n projectRoot: string,\n): Promise<CleanCommandResult> {\n try {\n const result = await runCleanWorkflow(projectRoot, options.target, options.force ?? false);\n\n if (result.cleaned.length === 0) {\n return {\n exitCode: 0,\n stderr: '',\n stdout: '정리할 작업이 없습니다.',\n };\n }\n\n const lines = result.cleaned.map(\n (row) =>\n `${row.workId}: ${row.note}` +\n (row.worktreeRemoved ? ' (worktree 제거됨)' : '') +\n (row.branchDeleted ? ' (브랜치 삭제됨)' : ''),\n );\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown clean failure.',\n stdout: '',\n };\n }\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { getProjectRelativeSduckAssetPath } from './project-paths.js';\nimport { readCurrentWorkId, throwNoCurrentWorkError, writeCurrentWorkId } from './state.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface DoneCommandInput {\n target?: string;\n}\n\nexport interface DoneTarget {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nexport interface DoneSuccessRow {\n completedAt: string;\n note: string;\n reviewWarning: string | undefined;\n taskEvalCriteria: string[];\n taskId: string;\n}\n\nexport interface DoneFailureRow {\n note: string;\n pendingChecklistItems: string[];\n taskId: string;\n}\n\nexport interface DoneResult {\n completedAt: string;\n failed: DoneFailureRow[];\n nextStatus: 'DONE';\n succeeded: DoneSuccessRow[];\n}\n\ninterface MetaValidationSummary {\n completedSteps: number[];\n totalSteps: number;\n}\n\nconst TASK_EVAL_ASSET_PATH = getProjectRelativeSduckAssetPath('eval', 'task.yml');\n\nexport function filterDoneCandidates(tasks: readonly WorkspaceTaskSummary[]): DoneTarget[] {\n return tasks.filter((task) => task.status === 'REVIEW_READY');\n}\n\nexport function resolveDoneTargetMatches(\n tasks: readonly WorkspaceTaskSummary[],\n target: string | undefined,\n): DoneTarget[] {\n if (target === undefined || target.trim() === '') {\n return filterDoneCandidates(tasks);\n }\n\n const trimmedTarget = target.trim();\n\n return tasks.filter((task) => task.id === trimmedTarget || task.slug === trimmedTarget);\n}\n\nexport function extractUncheckedChecklistItems(specContent: string): string[] {\n const uncheckedMatches = specContent.matchAll(/^\\s*- \\[ \\] (.+)$/gm);\n return [...uncheckedMatches]\n .map((match) => match[1])\n .filter((item): item is string => item !== undefined)\n .map((item) => item.trim());\n}\n\nexport function extractTaskEvalCriteriaLabels(taskEvalContent: string): string[] {\n const labels = [...taskEvalContent.matchAll(/^\\s{6}label:\\s+(.+)$/gm)]\n .map((match) => match[1])\n .filter((item): item is string => item !== undefined)\n .map((item) => item.trim());\n\n return [...new Set(labels)];\n}\n\nexport function parseCompletedStepNumbers(value: string): number[] {\n const trimmedValue = value.trim();\n\n if (trimmedValue === '') {\n return [];\n }\n\n return trimmedValue.split(',').map((segment) => {\n const parsedValue = Number.parseInt(segment.trim(), 10);\n\n if (!Number.isInteger(parsedValue)) {\n throw new Error(`Invalid completed step value: ${segment.trim()}`);\n }\n\n return parsedValue;\n });\n}\n\nexport function validateDoneMetaContent(metaContent: string): MetaValidationSummary {\n const totalMatch = /^ {2}total:[ \\t]+(.+)$/m.exec(metaContent);\n const completedMatch = /^ {2}completed:[ \\t]+\\[(.*)\\]$/m.exec(metaContent);\n\n if (totalMatch?.[1] === undefined || completedMatch?.[1] === undefined) {\n throw new Error('Task meta is missing a valid steps block.');\n }\n\n if (totalMatch[1].trim() === 'null') {\n throw new Error('Task steps are not initialized yet (steps.total is null).');\n }\n\n const totalSteps = Number.parseInt(totalMatch[1].trim(), 10);\n\n if (!Number.isInteger(totalSteps) || totalSteps <= 0) {\n throw new Error(`Task has an invalid steps.total value: ${totalMatch[1].trim()}`);\n }\n\n const completedSteps = parseCompletedStepNumbers(completedMatch[1]);\n const uniqueSteps = new Set(completedSteps);\n\n if (uniqueSteps.size !== completedSteps.length) {\n throw new Error('Task has duplicate completed step numbers.');\n }\n\n const invalidStep = completedSteps.find((step) => step < 1 || step > totalSteps);\n\n if (invalidStep !== undefined) {\n throw new Error(`Task has an out-of-range completed step number: ${String(invalidStep)}`);\n }\n\n if (completedSteps.length !== totalSteps) {\n const missingSteps: number[] = [];\n\n for (let step = 1; step <= totalSteps; step += 1) {\n if (!uniqueSteps.has(step)) {\n missingSteps.push(step);\n }\n }\n\n throw new Error(`Task steps are incomplete. Missing steps: ${missingSteps.join(', ')}`);\n }\n\n return {\n completedSteps,\n totalSteps,\n };\n}\n\nfunction updateDoneBlock(metaContent: string, completedAt: string): string {\n const withStatus = metaContent.replace(/^status:\\s+.+$/m, 'status: DONE');\n\n return withStatus.replace(/^completed_at:\\s+.+$/m, `completed_at: ${completedAt}`);\n}\n\nfunction validateDoneTarget(task: DoneTarget): void {\n if (task.status === 'DONE') {\n throw new Error(`Task ${task.id} is already DONE.`);\n }\n\n if (task.status !== 'REVIEW_READY') {\n throw new Error(\n `Task ${task.id} is not in REVIEW_READY state (${task.status}). Run \\`sduck review ready\\` first.`,\n );\n }\n}\n\nasync function checkReviewWarning(\n projectRoot: string,\n task: DoneTarget,\n): Promise<string | undefined> {\n const reviewPath = join(projectRoot, task.path, 'review.md');\n\n if ((await getFsEntryKind(reviewPath)) !== 'file') {\n return `review.md is missing for task ${task.id}. Consider running \\`sduck review ready\\` to create it.`;\n }\n\n const content = await readFile(reviewPath, 'utf8');\n\n if (content.trim().length === 0) {\n return `review.md is empty for task ${task.id}.`;\n }\n\n return undefined;\n}\n\nasync function loadTaskEvalCriteria(projectRoot: string): Promise<string[]> {\n const taskEvalPath = join(projectRoot, TASK_EVAL_ASSET_PATH);\n\n if ((await getFsEntryKind(taskEvalPath)) !== 'file') {\n throw new Error(`Missing task evaluation asset at ${TASK_EVAL_ASSET_PATH}.`);\n }\n\n const taskEvalContent = await readFile(taskEvalPath, 'utf8');\n const labels = extractTaskEvalCriteriaLabels(taskEvalContent);\n\n if (labels.length === 0) {\n throw new Error(`Task evaluation asset has no criteria labels: ${TASK_EVAL_ASSET_PATH}.`);\n }\n\n return labels;\n}\n\nasync function completeTask(\n projectRoot: string,\n task: DoneTarget,\n completedAt: string,\n taskEvalCriteria: readonly string[],\n): Promise<DoneSuccessRow> {\n validateDoneTarget(task);\n\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n const specPath = join(projectRoot, task.path, 'spec.md');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for task ${task.id}.`);\n }\n\n if ((await getFsEntryKind(specPath)) !== 'file') {\n throw new Error(`Missing spec.md for task ${task.id}.`);\n }\n\n const reviewWarning = await checkReviewWarning(projectRoot, task);\n\n const metaContent = await readFile(metaPath, 'utf8');\n validateDoneMetaContent(metaContent);\n\n const specContent = await readFile(specPath, 'utf8');\n const uncheckedItems = extractUncheckedChecklistItems(specContent);\n\n if (uncheckedItems.length > 0) {\n throw new Error(`Spec checklist is incomplete: ${uncheckedItems.join('; ')}`);\n }\n\n await writeFile(metaPath, updateDoneBlock(metaContent, completedAt), 'utf8');\n\n // Clear current work if this task was the current one\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId === task.id) {\n await writeCurrentWorkId(projectRoot, null);\n }\n\n return {\n completedAt,\n note: `task eval checked (${String(taskEvalCriteria.length)} criteria)`,\n reviewWarning,\n taskEvalCriteria: [...taskEvalCriteria],\n taskId: task.id,\n };\n}\n\nexport async function runDoneWorkflow(\n projectRoot: string,\n tasks: readonly DoneTarget[],\n completedAt: string,\n): Promise<DoneResult> {\n const taskEvalCriteria = await loadTaskEvalCriteria(projectRoot);\n const succeeded: DoneSuccessRow[] = [];\n const failed: DoneFailureRow[] = [];\n\n for (const task of tasks) {\n try {\n succeeded.push(await completeTask(projectRoot, task, completedAt, taskEvalCriteria));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown done failure.';\n const pendingChecklistItems = message.startsWith('Spec checklist is incomplete: ')\n ? message\n .replace('Spec checklist is incomplete: ', '')\n .split('; ')\n .filter((item) => item !== '')\n : [];\n\n failed.push({\n note: message,\n pendingChecklistItems,\n taskId: task.id,\n });\n }\n }\n\n return {\n completedAt,\n failed,\n nextStatus: 'DONE',\n succeeded,\n };\n}\n\nexport async function loadDoneTargets(\n projectRoot: string,\n input: DoneCommandInput,\n): Promise<DoneTarget[]> {\n if (input.target === undefined || input.target.trim() === '') {\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId === null) {\n throwNoCurrentWorkError('done');\n }\n\n const tasks = await listWorkspaceTasks(projectRoot);\n const match = tasks.find((task) => task.id === currentWorkId);\n\n if (match === undefined) {\n throw new Error(`Current work ${currentWorkId} not found in workspace.`);\n }\n\n return [match];\n }\n\n const tasks = await listWorkspaceTasks(projectRoot);\n const matches = resolveDoneTargetMatches(tasks, input.target);\n\n if (matches.length === 0) {\n throw new Error(`No task matches target '${input.target.trim()}'.`);\n }\n\n if (matches.length > 1) {\n const ids = matches.map((task) => task.id).join(', ');\n throw new Error(`Multiple tasks match '${input.target.trim()}': ${ids}. Use an exact task id.`);\n }\n\n return matches;\n}\n\nexport function createTaskCompletedAt(date = new Date()): string {\n return formatUtcTimestamp(date);\n}\n","import {\n createTaskCompletedAt,\n loadDoneTargets,\n runDoneWorkflow,\n type DoneCommandInput,\n type DoneFailureRow,\n type DoneResult,\n} from '../core/done.js';\n\nexport interface DoneCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildResultTable(result: DoneResult): string {\n const rows = [\n ...result.succeeded.map((row) => ({\n note: row.note,\n result: 'success',\n task: row.taskId,\n })),\n ...result.failed.map((row) => ({\n note: row.note,\n result: 'failed',\n task: row.taskId,\n })),\n ];\n\n const resultWidth = Math.max('Result'.length, ...rows.map((row) => row.result.length));\n const taskWidth = Math.max('Task'.length, ...rows.map((row) => row.task.length));\n const noteWidth = Math.max('Note'.length, ...rows.map((row) => row.note.length));\n const border = `+-${'-'.repeat(resultWidth)}-+-${'-'.repeat(taskWidth)}-+-${'-'.repeat(noteWidth)}-+`;\n const header = `| ${padCell('Result', resultWidth)} | ${padCell('Task', taskWidth)} | ${padCell('Note', noteWidth)} |`;\n const body = rows.map(\n (row) =>\n `| ${padCell(row.result, resultWidth)} | ${padCell(row.task, taskWidth)} | ${padCell(row.note, noteWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nfunction formatFailureDetails(failed: readonly DoneFailureRow[]): string[] {\n const lines: string[] = [];\n\n for (const row of failed) {\n if (row.pendingChecklistItems.length === 0) {\n continue;\n }\n\n lines.push('', `미완료 체크리스트 (${row.taskId})`);\n\n for (const item of row.pendingChecklistItems) {\n lines.push(`- [ ] ${item}`);\n }\n }\n\n return lines;\n}\n\nfunction formatSuccess(result: DoneResult): string {\n const lines = [buildResultTable(result)];\n\n if (result.succeeded.length > 0) {\n const criteriaLabels = result.succeeded[0]?.taskEvalCriteria ?? [];\n\n lines.push('', '상태: DONE');\n\n if (criteriaLabels.length > 0) {\n lines.push(`task eval 기준: ${criteriaLabels.join(', ')}`);\n }\n }\n\n for (const row of result.succeeded) {\n if (row.reviewWarning !== undefined) {\n lines.push(`경고: ${row.reviewWarning}`);\n }\n }\n\n lines.push(...formatFailureDetails(result.failed));\n\n return lines.join('\\n');\n}\n\nexport async function runDoneCommand(\n input: DoneCommandInput,\n projectRoot: string,\n): Promise<DoneCommandResult> {\n try {\n const tasks = await loadDoneTargets(projectRoot, input);\n const result = await runDoneWorkflow(projectRoot, tasks, createTaskCompletedAt());\n\n if (result.succeeded.length === 0) {\n return {\n exitCode: 1,\n stderr: formatSuccess(result),\n stdout: '',\n };\n }\n\n return {\n exitCode: result.failed.length > 0 ? 1 : 0,\n stderr: '',\n stdout: formatSuccess(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown done failure.',\n stdout: '',\n };\n }\n}\n","import { confirm } from '@inquirer/prompts';\n\nimport {\n approveFastTrackTask,\n createFastTrackTask,\n isInteractiveApprovalAvailable,\n type FastTrackCommandInput,\n type FastTrackFailureRow,\n} from '../core/fast-track.js';\nimport { type StartTaskOptions } from '../core/start.js';\n\nexport interface FastTrackCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction formatFailures(rows: readonly FastTrackFailureRow[]): string[] {\n return rows.map((row) => `- ${row.taskId}: ${row.note}`);\n}\n\nexport async function runFastTrackCommand(\n input: FastTrackCommandInput,\n projectRoot: string,\n startOptions?: StartTaskOptions,\n): Promise<FastTrackCommandResult> {\n try {\n const createdTask = await createFastTrackTask(input, projectRoot, startOptions);\n const lines = [\n 'fast-track task created',\n `경로: ${createdTask.path}/`,\n 'minimal spec: created',\n 'minimal plan: created',\n ];\n\n if (!isInteractiveApprovalAvailable()) {\n lines.push(\n '상태: PENDING_SPEC_APPROVAL',\n '다음 단계: `sduck spec approve <slug>` 후 `sduck plan approve <slug>`를 실행하세요.',\n );\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n }\n\n const shouldApprove = await confirm({\n default: true,\n message: 'Approve the minimal spec and minimal plan now?',\n });\n\n if (!shouldApprove) {\n lines.push(\n '상태: PENDING_SPEC_APPROVAL',\n '다음 단계: `sduck spec approve <slug>` 후 `sduck plan approve <slug>`를 실행하세요.',\n );\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n }\n\n const approvalResult = await approveFastTrackTask(\n {\n id: createdTask.taskId,\n path: createdTask.path,\n slug: input.slug,\n status: 'PENDING_SPEC_APPROVAL',\n },\n projectRoot,\n );\n\n lines.push(`상태: ${approvalResult.nextStatus}`);\n\n if (approvalResult.failed.length > 0) {\n lines.push('승인 결과:', ...formatFailures(approvalResult.failed));\n }\n\n if (approvalResult.approved) {\n lines.push('fast-track 승인 완료 → 바로 작업을 시작할 수 있습니다.');\n } else {\n lines.push('일부 승인 단계가 완료되지 않았습니다. 일반 승인 명령으로 이어서 진행하세요.');\n }\n\n return {\n exitCode: approvalResult.failed.length > 0 ? 1 : 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown fast-track failure.',\n stdout: '',\n };\n }\n}\n","import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { isSupportedTaskType, type SupportedTaskType } from './assets.js';\nimport { getFsEntryKind } from './fs.js';\nimport {\n approvePlans,\n createPlanApprovedAt,\n type PlanApproveFailureRow,\n type PlanApproveSuccessRow,\n type PlanApproveTarget,\n} from './plan-approve.js';\nimport { approveSpecs, createSpecApprovedAt, type SpecApproveTarget } from './spec-approve.js';\nimport { startTask, type StartTaskOptions } from './start.js';\n\nexport interface FastTrackCommandInput {\n slug: string;\n type: string;\n}\n\nexport interface FastTrackTarget {\n id: string;\n path: string;\n slug: string;\n status: 'PENDING_SPEC_APPROVAL';\n}\n\nexport interface FastTrackSuccessRow {\n note: string;\n taskId: string;\n}\n\nexport interface FastTrackFailureRow {\n note: string;\n taskId: string;\n}\n\nexport interface FastTrackResult {\n failed: FastTrackFailureRow[];\n nextStatus: 'IN_PROGRESS' | 'PENDING_SPEC_APPROVAL';\n path: string;\n planCreated: boolean;\n specCreated: boolean;\n succeeded: FastTrackSuccessRow[];\n taskId: string;\n}\n\nexport interface FastTrackApprovalResult {\n approved: boolean;\n failed: FastTrackFailureRow[];\n nextStatus: 'IN_PROGRESS' | 'PENDING_SPEC_APPROVAL' | 'SPEC_APPROVED';\n succeeded: FastTrackSuccessRow[];\n taskId: string;\n}\n\nfunction toSpecApprovalTarget(target: FastTrackTarget): SpecApproveTarget {\n return target;\n}\n\nfunction toPlanApprovalTarget(target: FastTrackTarget): PlanApproveTarget {\n return {\n ...target,\n status: 'SPEC_APPROVED',\n };\n}\n\nexport function renderMinimalSpec(type: SupportedTaskType, slug: string): string {\n const displayName = slug.replace(/-/g, ' ');\n\n return [\n `# [${type}] ${displayName}`,\n '',\n '## 목표',\n '',\n `- ${displayName} 작업을 빠르게 시작할 수 있는 최소 스펙을 정의한다`,\n '',\n '## 범위',\n '',\n `- ${displayName} 구현에 필요한 핵심 변경만 포함한다`,\n '',\n '## 제외 범위',\n '',\n '- 요구사항과 직접 관련 없는 리팩터링은 포함하지 않는다',\n '',\n '## 완료 조건',\n '',\n '- [ ] 핵심 동작이 구현된다',\n '- [ ] 관련 테스트가 통과한다',\n '- [ ] 문서 또는 워크플로우 영향이 반영된다',\n '',\n ].join('\\n');\n}\n\nexport function renderMinimalPlan(slug: string): string {\n const displayName = slug.replace(/-/g, ' ');\n\n return [\n '# Plan',\n '',\n `## Step 1. ${displayName} 요구사항 반영`,\n '',\n '- 핵심 구현 파일을 수정해 요구사항을 반영한다.',\n '',\n '## Step 2. 검증과 마무리',\n '',\n '- 관련 테스트와 문서를 업데이트한다.',\n '- `npm run lint`, `npm run typecheck`, `npm test`, `npm run build`로 검증한다.',\n '',\n ].join('\\n');\n}\n\nexport function isInteractiveApprovalAvailable(): boolean {\n return process.stdin.isTTY && process.stdout.isTTY;\n}\n\nexport async function createFastTrackTask(\n input: FastTrackCommandInput,\n projectRoot: string,\n startOptions?: StartTaskOptions,\n): Promise<FastTrackResult> {\n if (!isSupportedTaskType(input.type)) {\n throw new Error(`Unsupported type: ${input.type}`);\n }\n\n const startedTask = await startTask(\n input.type,\n input.slug,\n projectRoot,\n new Date(),\n startOptions,\n );\n const taskPath = join(projectRoot, startedTask.workspacePath);\n const specPath = join(taskPath, 'spec.md');\n const planPath = join(taskPath, 'plan.md');\n\n if ((await getFsEntryKind(specPath)) !== 'file') {\n throw new Error(`Missing spec.md for fast-track task ${startedTask.workspaceId}.`);\n }\n\n if ((await getFsEntryKind(planPath)) !== 'file') {\n throw new Error(`Missing plan.md for fast-track task ${startedTask.workspaceId}.`);\n }\n\n await writeFile(specPath, renderMinimalSpec(input.type, input.slug), 'utf8');\n await writeFile(planPath, renderMinimalPlan(input.slug), 'utf8');\n\n return {\n failed: [],\n nextStatus: 'PENDING_SPEC_APPROVAL',\n path: startedTask.workspacePath,\n planCreated: true,\n specCreated: true,\n succeeded: [{ note: 'created minimal spec and plan', taskId: startedTask.workspaceId }],\n taskId: startedTask.workspaceId,\n };\n}\n\nfunction buildFailureRows(\n taskId: string,\n failedRows: readonly PlanApproveFailureRow[],\n fallbackNote: string,\n): FastTrackFailureRow[] {\n if (failedRows.length === 0) {\n if (fallbackNote === '') {\n return [];\n }\n\n return [{ note: fallbackNote, taskId }];\n }\n\n return failedRows.map((row) => ({ note: row.note, taskId: row.taskId }));\n}\n\nfunction buildSuccessRows(succeededRows: readonly PlanApproveSuccessRow[]): FastTrackSuccessRow[] {\n return succeededRows.map((row) => ({\n note: `${row.note} (${String(row.steps)} steps)`,\n taskId: row.taskId,\n }));\n}\n\nexport async function approveFastTrackTask(\n target: FastTrackTarget,\n projectRoot: string,\n): Promise<FastTrackApprovalResult> {\n await approveSpecs(projectRoot, [toSpecApprovalTarget(target)], createSpecApprovedAt());\n\n const planResult = await approvePlans(\n projectRoot,\n [toPlanApprovalTarget(target)],\n createPlanApprovedAt(),\n );\n\n if (planResult.succeeded.length === 0) {\n return {\n approved: false,\n failed: buildFailureRows(target.id, planResult.failed, 'plan approval failed'),\n nextStatus: 'SPEC_APPROVED',\n succeeded: [{ note: 'approved minimal spec', taskId: target.id }],\n taskId: target.id,\n };\n }\n\n return {\n approved: true,\n failed: buildFailureRows(target.id, planResult.failed, ''),\n nextStatus: 'IN_PROGRESS',\n succeeded: [\n { note: 'approved minimal spec', taskId: target.id },\n ...buildSuccessRows(planResult.succeeded),\n ],\n taskId: target.id,\n };\n}\n","import { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { getFsEntryKind } from './fs.js';\n\nexport type SupportedTaskType = 'build' | 'feature' | 'fix' | 'refactor' | 'chore';\n\nexport const SUPPORTED_TASK_TYPES: readonly SupportedTaskType[] = [\n 'build',\n 'feature',\n 'fix',\n 'refactor',\n 'chore',\n];\n\nexport const EVAL_ASSET_RELATIVE_PATHS = {\n task: join('eval', 'task.yml'),\n plan: join('eval', 'plan.yml'),\n spec: join('eval', 'spec.yml'),\n} as const;\n\nexport const SPEC_TEMPLATE_RELATIVE_PATHS: Record<SupportedTaskType, string> = {\n build: join('types', 'build.md'),\n feature: join('types', 'feature.md'),\n fix: join('types', 'fix.md'),\n refactor: join('types', 'refactor.md'),\n chore: join('types', 'chore.md'),\n};\n\nexport const INIT_ASSET_RELATIVE_PATHS = [\n EVAL_ASSET_RELATIVE_PATHS.spec,\n EVAL_ASSET_RELATIVE_PATHS.plan,\n EVAL_ASSET_RELATIVE_PATHS.task,\n ...Object.values(SPEC_TEMPLATE_RELATIVE_PATHS),\n] as const;\n\nexport async function getBundledAssetsRoot(): Promise<string> {\n const currentDirectoryPath = dirname(fileURLToPath(import.meta.url));\n const candidatePaths = [\n join(currentDirectoryPath, '..', '..', '.sduck', 'sduck-assets'),\n join(currentDirectoryPath, '..', '.sduck', 'sduck-assets'),\n ];\n\n for (const candidatePath of candidatePaths) {\n if ((await getFsEntryKind(candidatePath)) === 'directory') {\n return candidatePath;\n }\n }\n\n throw new Error('Unable to locate bundled .sduck/sduck-assets directory.');\n}\n\nexport function isSupportedTaskType(value: string): value is SupportedTaskType {\n return SUPPORTED_TASK_TYPES.includes(value as SupportedTaskType);\n}\n\nexport function resolveSpecTemplateRelativePath(type: SupportedTaskType): string {\n return SPEC_TEMPLATE_RELATIVE_PATHS[type];\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { readCurrentWorkId } from './state.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface PlanApproveCommandInput {\n target?: string;\n}\n\nexport interface PlanApproveTarget {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nexport interface PlanApproveSuccessRow {\n note: string;\n steps: number;\n taskId: string;\n}\n\nexport interface PlanApproveFailureRow {\n note: string;\n taskId: string;\n}\n\nexport interface PlanApproveResult {\n approvedAt: string;\n failed: PlanApproveFailureRow[];\n nextStatus: 'IN_PROGRESS';\n succeeded: PlanApproveSuccessRow[];\n}\n\nexport function filterPlanApprovalCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): PlanApproveTarget[] {\n return tasks.filter((task) => task.status === 'SPEC_APPROVED');\n}\n\nexport function resolvePlanApprovalCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n target: string | undefined,\n): PlanApproveTarget[] {\n const candidates = filterPlanApprovalCandidates(tasks);\n\n if (target === undefined || target.trim() === '') {\n return candidates;\n }\n\n const trimmedTarget = target.trim();\n\n return candidates.filter((task) => task.id === trimmedTarget || task.slug === trimmedTarget);\n}\n\nexport function countPlanSteps(planContent: string): number {\n const matches = planContent.match(/^#{2,3} Step \\d+\\. .+$/gm);\n return matches?.length ?? 0;\n}\n\nexport function validatePlanHasSteps(planContent: string): void {\n if (countPlanSteps(planContent) === 0) {\n throw new Error(\n 'Plan does not contain any valid `## Step N. 제목` or `### Step N. 제목` headers.',\n );\n }\n}\n\nfunction updatePlanApprovalBlock(\n metaContent: string,\n approvedAt: string,\n totalSteps: number,\n): string {\n const withStatus = metaContent.replace(/^status:\\s+.+$/m, 'status: IN_PROGRESS');\n const withPlan = withStatus.replace(\n /plan:\\n {2}approved:\\s+false\\n {2}approved_at:\\s+null/m,\n `plan:\\n approved: true\\n approved_at: ${approvedAt}`,\n );\n\n return withPlan.replace(\n /steps:\\n {2}total:\\s+null\\n {2}completed:\\s+\\[\\]/m,\n `steps:\\n total: ${String(totalSteps)}\\n completed: []`,\n );\n}\n\nexport async function approvePlans(\n projectRoot: string,\n tasks: readonly PlanApproveTarget[],\n approvedAt: string,\n): Promise<PlanApproveResult> {\n const succeeded: PlanApproveSuccessRow[] = [];\n const failed: PlanApproveFailureRow[] = [];\n\n for (const task of tasks) {\n if (task.status !== 'SPEC_APPROVED') {\n failed.push({\n note: `task is not awaiting plan approval (${task.status})`,\n taskId: task.id,\n });\n continue;\n }\n\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n const planPath = join(projectRoot, task.path, 'plan.md');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n failed.push({ note: 'missing meta.yml', taskId: task.id });\n continue;\n }\n\n if ((await getFsEntryKind(planPath)) !== 'file') {\n failed.push({ note: 'missing plan.md', taskId: task.id });\n continue;\n }\n\n const planContent = await readFile(planPath, 'utf8');\n const totalSteps = countPlanSteps(planContent);\n\n if (totalSteps === 0) {\n failed.push({ note: 'missing valid Step headers', taskId: task.id });\n continue;\n }\n\n const updatedMeta = updatePlanApprovalBlock(\n await readFile(metaPath, 'utf8'),\n approvedAt,\n totalSteps,\n );\n await writeFile(metaPath, updatedMeta, 'utf8');\n\n succeeded.push({ note: 'moved to IN_PROGRESS', steps: totalSteps, taskId: task.id });\n }\n\n return {\n approvedAt,\n failed,\n nextStatus: 'IN_PROGRESS',\n succeeded,\n };\n}\n\nexport async function loadPlanApprovalCandidates(\n projectRoot: string,\n input: PlanApproveCommandInput,\n): Promise<PlanApproveTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n\n if (input.target !== undefined) {\n return resolvePlanApprovalCandidates(tasks, input.target);\n }\n\n // current work fallback\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId !== null) {\n return resolvePlanApprovalCandidates(tasks, currentWorkId);\n }\n\n // No current work: return all candidates (original behavior)\n return resolvePlanApprovalCandidates(tasks, undefined);\n}\n\nexport function createPlanApprovedAt(date = new Date()): string {\n return formatUtcTimestamp(date);\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { readCurrentWorkId } from './state.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface SpecApproveCommandInput {\n target?: string;\n}\n\nexport interface SpecApproveTarget {\n createdAt?: string;\n id: string;\n path: string;\n slug?: string;\n status: string;\n}\n\nexport interface SpecApproveResult {\n approvedAt: string;\n approvedTaskIds: string[];\n nextStatus: 'SPEC_APPROVED';\n}\n\nexport function filterApprovalCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): SpecApproveTarget[] {\n return tasks.filter((task) => task.status === 'PENDING_SPEC_APPROVAL');\n}\n\nexport function resolveTargetCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n target: string | undefined,\n): SpecApproveTarget[] {\n const candidates = filterApprovalCandidates(tasks);\n\n if (target === undefined || target.trim() === '') {\n return candidates;\n }\n\n const trimmedTarget = target.trim();\n\n return candidates.filter((task) => task.id === trimmedTarget || task.slug === trimmedTarget);\n}\n\nexport function validateSpecApprovalTargets(tasks: readonly SpecApproveTarget[]): void {\n if (tasks.length === 0) {\n throw new Error('No approvable spec tasks found.');\n }\n\n const invalidTask = tasks.find((task) => task.status !== 'PENDING_SPEC_APPROVAL');\n\n if (invalidTask !== undefined) {\n throw new Error(\n `Task ${invalidTask.id} is not awaiting spec approval (${invalidTask.status}).`,\n );\n }\n}\n\nfunction updateSpecApprovalBlock(metaContent: string, approvedAt: string): string {\n const withStatus = metaContent.replace(/^status:\\s+.+$/m, 'status: SPEC_APPROVED');\n\n return withStatus.replace(\n /spec:\\n {2}approved:\\s+false\\n {2}approved_at:\\s+null/m,\n `spec:\\n approved: true\\n approved_at: ${approvedAt}`,\n );\n}\n\nexport async function approveSpecs(\n projectRoot: string,\n tasks: readonly SpecApproveTarget[],\n approvedAt: string,\n): Promise<SpecApproveResult> {\n validateSpecApprovalTargets(tasks);\n\n for (const task of tasks) {\n const metaPath = join(projectRoot, task.path, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for task ${task.id}.`);\n }\n\n const updatedContent = updateSpecApprovalBlock(await readFile(metaPath, 'utf8'), approvedAt);\n await writeFile(metaPath, updatedContent, 'utf8');\n }\n\n return {\n approvedAt,\n approvedTaskIds: tasks.map((task) => task.id),\n nextStatus: 'SPEC_APPROVED',\n };\n}\n\nexport async function loadSpecApprovalCandidates(\n projectRoot: string,\n input: SpecApproveCommandInput,\n): Promise<SpecApproveTarget[]> {\n const tasks = await listWorkspaceTasks(projectRoot);\n\n if (input.target !== undefined) {\n return resolveTargetCandidates(tasks, input.target);\n }\n\n // current work fallback\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId !== null) {\n return resolveTargetCandidates(tasks, currentWorkId);\n }\n\n // No current work: return all candidates (original behavior)\n return resolveTargetCandidates(tasks, undefined);\n}\n\nexport function createSpecApprovedAt(date = new Date()): string {\n return formatUtcTimestamp(date);\n}\n","import { mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport {\n getBundledAssetsRoot,\n isSupportedTaskType,\n resolveSpecTemplateRelativePath,\n type SupportedTaskType,\n} from './assets.js';\nimport { getFsEntryKind } from './fs.js';\nimport { addWorktree, getCurrentBranch } from './git.js';\nimport { ensureGitignoreEntries } from './gitignore.js';\nimport {\n getProjectRelativeSduckWorkspacePath,\n getProjectSduckArchivePath,\n getProjectSduckHomePath,\n getProjectSduckWorkspacePath,\n getProjectWorktreePath,\n SDUCK_WORKTREES_DIR,\n} from './project-paths.js';\nimport { writeCurrentWorkId } from './state.js';\nimport { formatUtcDate, formatUtcTimestamp } from '../utils/utc-date.js';\n\nexport interface StartCommandInput {\n type: SupportedTaskType;\n slug: string;\n}\n\nexport interface StartExecutionResult {\n gitignoreWarning: string | undefined;\n workspaceId: string;\n workspacePath: string;\n status: 'PENDING_SPEC_APPROVAL';\n}\n\nexport function normalizeSlug(input: string): string {\n return input\n .trim()\n .toLowerCase()\n .replace(/[_\\s]+/g, '-')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nexport function validateSlug(slug: string): void {\n if (slug === '') {\n throw new Error('Invalid slug: slug cannot be empty after normalization.');\n }\n\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {\n throw new Error('Invalid slug: use lowercase kebab-case only.');\n }\n}\n\nexport function createWorkspaceId(date: Date, type: SupportedTaskType, slug: string): string {\n const year = String(date.getUTCFullYear());\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n const hour = String(date.getUTCHours()).padStart(2, '0');\n const minute = String(date.getUTCMinutes()).padStart(2, '0');\n\n return `${year}${month}${day}-${hour}${minute}-${type}-${slug}`;\n}\n\nasync function existsInArchive(projectRoot: string, id: string): Promise<boolean> {\n const archivePath = getProjectSduckArchivePath(projectRoot);\n\n if ((await getFsEntryKind(archivePath)) !== 'directory') {\n return false;\n }\n\n const months = await readdir(archivePath, { withFileTypes: true });\n\n for (const month of months) {\n if (!month.isDirectory()) {\n continue;\n }\n\n const candidatePath = join(archivePath, month.name, id);\n\n if ((await getFsEntryKind(candidatePath)) !== 'missing') {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveUniqueWorkspaceId(\n projectRoot: string,\n baseId: string,\n): Promise<string> {\n const workspacePath = getProjectRelativeSduckWorkspacePath(baseId);\n const absolutePath = join(projectRoot, workspacePath);\n\n if (\n (await getFsEntryKind(absolutePath)) === 'missing' &&\n !(await existsInArchive(projectRoot, baseId))\n ) {\n return baseId;\n }\n\n for (let suffix = 2; suffix <= 100; suffix += 1) {\n const candidateId = `${baseId}-${String(suffix)}`;\n const candidatePath = join(projectRoot, getProjectRelativeSduckWorkspacePath(candidateId));\n\n if (\n (await getFsEntryKind(candidatePath)) === 'missing' &&\n !(await existsInArchive(projectRoot, candidateId))\n ) {\n return candidateId;\n }\n }\n\n throw new Error(`Cannot resolve unique workspace id for ${baseId}: too many collisions.`);\n}\n\nexport function renderInitialMeta(input: {\n baseBranch: string | null;\n branch: string | null;\n createdAt: string;\n id: string;\n slug: string;\n type: SupportedTaskType;\n updatedAt: string;\n worktreePath: string | null;\n}): string {\n return [\n `id: ${input.id}`,\n `type: ${input.type}`,\n `slug: ${input.slug}`,\n `created_at: ${input.createdAt}`,\n `updated_at: ${input.updatedAt}`,\n '',\n `branch: ${input.branch ?? 'null'}`,\n `base_branch: ${input.baseBranch ?? 'null'}`,\n `worktree_path: ${input.worktreePath ?? 'null'}`,\n '',\n 'status: PENDING_SPEC_APPROVAL',\n '',\n 'spec:',\n ' approved: false',\n ' approved_at: null',\n '',\n 'plan:',\n ' approved: false',\n ' approved_at: null',\n '',\n 'steps:',\n ' total: null',\n ' completed: []',\n '',\n 'completed_at: null',\n '',\n ].join('\\n');\n}\n\nexport async function resolveSpecTemplatePath(type: SupportedTaskType): Promise<string> {\n const assetsRoot = await getBundledAssetsRoot();\n return join(assetsRoot, resolveSpecTemplateRelativePath(type));\n}\n\nfunction applyTemplateDefaults(\n template: string,\n type: SupportedTaskType,\n slug: string,\n currentDate: Date,\n): string {\n const displayName = slug.replace(/-/g, ' ');\n\n return template\n .replace(/\\{기능명\\}/g, displayName)\n .replace(/\\{버그 요약 한 줄\\}/g, displayName)\n .replace(/YYYY-MM-DD/g, formatUtcDate(currentDate))\n .replace(/> \\*\\*작성자:\\*\\*\\s*$/m, '> **작성자:** taehee')\n .replace(/> \\*\\*연관 티켓:\\*\\*\\s*$/m, '> **연관 티켓:** -')\n .replace(/^# \\[(feature|fix|refactor|chore|build)\\] .*/m, `# [${type}] ${displayName}`);\n}\n\nexport interface StartTaskOptions {\n noGit?: boolean;\n}\n\nexport async function startTask(\n rawType: string,\n rawSlug: string,\n projectRoot: string,\n currentDate = new Date(),\n options?: StartTaskOptions,\n): Promise<StartExecutionResult> {\n if (!isSupportedTaskType(rawType)) {\n throw new Error(`Unsupported type: ${rawType}`);\n }\n\n const slug = normalizeSlug(rawSlug);\n validateSlug(slug);\n\n const baseId = createWorkspaceId(currentDate, rawType, slug);\n const workspaceId = await resolveUniqueWorkspaceId(projectRoot, baseId);\n const workspacePath = getProjectRelativeSduckWorkspacePath(workspaceId);\n const absoluteWorkspacePath = join(projectRoot, workspacePath);\n\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n await mkdir(workspaceRoot, { recursive: true });\n await mkdir(absoluteWorkspacePath, { recursive: false });\n\n let branch: string | null = null;\n let baseBranch: string | null = null;\n let worktreePath: string | null = null;\n\n if (options?.noGit !== true) {\n try {\n baseBranch = await getCurrentBranch(projectRoot);\n branch = `work/${rawType}/${slug}`;\n const absoluteWorktreePath = getProjectWorktreePath(projectRoot, workspaceId);\n worktreePath = `${SDUCK_WORKTREES_DIR}/${workspaceId}`;\n\n await addWorktree(absoluteWorktreePath, branch, baseBranch, projectRoot);\n } catch (error) {\n await rm(absoluteWorkspacePath, { recursive: true, force: true });\n throw error;\n }\n }\n\n const templatePath = await resolveSpecTemplatePath(rawType);\n if ((await getFsEntryKind(templatePath)) !== 'file') {\n throw new Error(`Missing spec template for type '${rawType}' at ${templatePath}`);\n }\n\n const specTemplate = await readFile(templatePath, 'utf8');\n const specContent = applyTemplateDefaults(specTemplate, rawType, slug, currentDate);\n const timestamp = formatUtcTimestamp(currentDate);\n const metaContent = renderInitialMeta({\n baseBranch,\n branch,\n createdAt: timestamp,\n id: workspaceId,\n slug,\n type: rawType,\n updatedAt: timestamp,\n worktreePath,\n });\n\n await writeFile(join(absoluteWorkspacePath, 'meta.yml'), metaContent, 'utf8');\n await writeFile(join(absoluteWorkspacePath, 'spec.md'), specContent, 'utf8');\n await writeFile(join(absoluteWorkspacePath, 'plan.md'), '', 'utf8');\n\n // Ensure .sduck/ exists and update state\n const sduckHome = getProjectSduckHomePath(projectRoot);\n await mkdir(sduckHome, { recursive: true });\n await writeCurrentWorkId(projectRoot, workspaceId, currentDate);\n\n // Update .gitignore (non-fatal)\n const gitignoreResult = await ensureGitignoreEntries(projectRoot, [\n `${SDUCK_WORKTREES_DIR}/`,\n '.sduck/sduck-state.yml',\n ]);\n\n return {\n gitignoreWarning: gitignoreResult.warning,\n workspaceId,\n workspacePath,\n status: 'PENDING_SPEC_APPROVAL',\n };\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\n\nexport interface GitignoreUpdateResult {\n added: string[];\n skipped: string[];\n warning?: string;\n}\n\nexport async function ensureGitignoreEntries(\n projectRoot: string,\n entries: readonly string[],\n): Promise<GitignoreUpdateResult> {\n const gitignorePath = join(projectRoot, '.gitignore');\n const added: string[] = [];\n const skipped: string[] = [];\n\n try {\n let content = '';\n\n if ((await getFsEntryKind(gitignorePath)) === 'file') {\n content = await readFile(gitignorePath, 'utf8');\n }\n\n const existingLines = new Set(content.split('\\n').map((line) => line.trim()));\n const toAdd: string[] = [];\n\n for (const entry of entries) {\n if (existingLines.has(entry)) {\n skipped.push(entry);\n } else {\n toAdd.push(entry);\n added.push(entry);\n }\n }\n\n if (toAdd.length > 0) {\n const suffix = content.endsWith('\\n') || content === '' ? '' : '\\n';\n const newContent = content + suffix + toAdd.join('\\n') + '\\n';\n\n await writeFile(gitignorePath, newContent, 'utf8');\n }\n\n return { added, skipped };\n } catch {\n const manualEntries = entries.join('\\n');\n\n return {\n added: [],\n skipped: [],\n warning: `Failed to update .gitignore. Please add the following entries manually:\\n${manualEntries}`,\n };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { getProjectRelativeSduckWorkspacePath } from './project-paths.js';\nimport { readCurrentWorkId, throwNoCurrentWorkError } from './state.js';\nimport { parseMetaText } from './workspace.js';\n\nexport interface ImplementContext {\n baseBranch: string | null;\n branch: string | null;\n id: string;\n planPath: string;\n specPath: string;\n status: string;\n worktreePath: string | null;\n}\n\nexport async function resolveImplementContext(projectRoot: string): Promise<ImplementContext> {\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId === null) {\n throwNoCurrentWorkError('implement');\n }\n\n const workspacePath = getProjectRelativeSduckWorkspacePath(currentWorkId);\n const absolutePath = join(projectRoot, workspacePath);\n\n if ((await getFsEntryKind(absolutePath)) !== 'directory') {\n throw new Error(\n `Current work ${currentWorkId} not found in workspace. It may have been archived or removed.`,\n );\n }\n\n const metaPath = join(absolutePath, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for work ${currentWorkId}.`);\n }\n\n const metaContent = await readFile(metaPath, 'utf8');\n const meta = parseMetaText(metaContent);\n\n return {\n baseBranch: meta.baseBranch ?? null,\n branch: meta.branch ?? null,\n id: currentWorkId,\n planPath: join(workspacePath, 'plan.md'),\n specPath: join(workspacePath, 'spec.md'),\n status: meta.status ?? 'UNKNOWN',\n worktreePath: meta.worktreePath ?? null,\n };\n}\n\nexport function formatImplementOutput(context: ImplementContext): string {\n const branchDisplay = context.branch ?? '(none)';\n const worktreeDisplay = context.worktreePath ?? '(none)';\n const lines = [\n `Work ID: ${context.id}`,\n `Branch: ${branchDisplay}`,\n `Worktree: ${worktreeDisplay}`,\n `Spec: ${context.specPath}`,\n `Plan: ${context.planPath}`,\n '',\n ];\n\n if (context.worktreePath !== null) {\n lines.push(\n '다음 명령으로 코딩 에이전트를 시작하세요:',\n ` cd ${context.worktreePath}`,\n ' claude # 또는 opencode / codex',\n );\n }\n\n return lines.join('\\n');\n}\n","import { formatImplementOutput, resolveImplementContext } from '../core/implement.js';\n\nexport interface ImplementCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runImplementCommand(projectRoot: string): Promise<ImplementCommandResult> {\n try {\n const context = await resolveImplementContext(projectRoot);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatImplementOutput(context),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown implement failure.',\n stdout: '',\n };\n }\n}\n","import { checkbox } from '@inquirer/prompts';\n\nimport { SUPPORTED_AGENTS, parseAgentsOption, type SupportedAgentId } from '../core/agent-rules.js';\nimport { type InitCommandOptions, type InitSummaryRow, initProject } from '../core/init.js';\n\nconst AGENT_PROMPT_MESSAGE = 'Select AI agents to generate repository rule files for';\nconst AGENT_PROMPT_INSTRUCTIONS =\n 'Use space to toggle agents, arrow keys to move, and enter to submit.';\nconst AGENT_PROMPT_REQUIRED_MESSAGE =\n 'Select at least one agent. Use space to toggle and enter to submit.';\n\nexport interface CommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport interface InitCliOptions {\n agents?: string;\n force: boolean;\n}\n\ninterface FormattableInitResult {\n didChange: boolean;\n agents: readonly SupportedAgentId[];\n summary: {\n rows: InitSummaryRow[];\n warnings: string[];\n };\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildSummaryTable(rows: InitSummaryRow[]): string {\n const statusWidth = Math.max('Status'.length, ...rows.map((row) => row.status.length));\n const pathWidth = Math.max('Path'.length, ...rows.map((row) => row.path.length));\n\n const border = `+-${'-'.repeat(statusWidth)}-+-${'-'.repeat(pathWidth)}-+`;\n const header = `| ${padCell('Status', statusWidth)} | ${padCell('Path', pathWidth)} |`;\n const body = rows.map(\n (row) => `| ${padCell(row.status, statusWidth)} | ${padCell(row.path, pathWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nfunction formatResult(result: FormattableInitResult): string {\n const lines = [\n result.didChange ? 'sduck init completed.' : 'sduck init completed with no file changes.',\n ];\n\n if (result.agents.length > 0) {\n lines.push(`Selected agents: ${result.agents.join(', ')}`);\n }\n\n lines.push('', buildSummaryTable(result.summary.rows));\n\n if (result.summary.warnings.length > 0) {\n lines.push('', 'Warnings:');\n lines.push(...result.summary.warnings.map((warning) => `- ${warning}`));\n }\n\n return lines.join('\\n');\n}\n\nfunction normalizeSelectedAgents(agentIds: readonly SupportedAgentId[]): SupportedAgentId[] {\n const selectedAgentSet = new Set(agentIds);\n\n return SUPPORTED_AGENTS.map((agent) => agent.id).filter((agentId) =>\n selectedAgentSet.has(agentId),\n );\n}\n\nexport function createAgentCheckboxConfig() {\n return {\n message: AGENT_PROMPT_MESSAGE,\n instructions: AGENT_PROMPT_INSTRUCTIONS,\n required: true,\n validate: (choices: readonly { value: SupportedAgentId }[]) =>\n choices.length > 0 || AGENT_PROMPT_REQUIRED_MESSAGE,\n choices: SUPPORTED_AGENTS.map((agent) => ({\n name: agent.label,\n value: agent.id,\n })),\n };\n}\n\nasync function resolveSelectedAgents(options: InitCliOptions): Promise<SupportedAgentId[]> {\n const parsedAgents = parseAgentsOption(options.agents);\n\n if (parsedAgents.length > 0 || !process.stdin.isTTY || !process.stdout.isTTY) {\n return normalizeSelectedAgents(parsedAgents);\n }\n\n return normalizeSelectedAgents(await checkbox<SupportedAgentId>(createAgentCheckboxConfig()));\n}\n\nexport async function runInitCommand(\n options: InitCliOptions,\n projectRoot: string,\n): Promise<CommandResult> {\n try {\n const resolvedOptions: InitCommandOptions = {\n force: options.force,\n agents: await resolveSelectedAgents(options),\n };\n const result = await initProject(resolvedOptions, projectRoot);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatResult(result),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown init failure.';\n\n return {\n exitCode: 1,\n stderr: message,\n stdout: '',\n };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { getFsEntryKind, type FsEntryKind } from './fs.js';\n\nexport const CLAUDE_CODE_HOOK_SETTINGS_PATH = join('.claude', 'settings.json');\nexport const CLAUDE_CODE_HOOK_SCRIPT_PATH = join('.claude', 'hooks', 'sdd-guard.sh');\nexport const CLAUDE_CODE_HOOK_SOURCE_PATH = join('hooks', 'sdd-guard.sh');\n\nexport function needsClaudeCodeHook(agents: readonly SupportedAgentId[]): boolean {\n return agents.includes('claude-code');\n}\n\nexport type SupportedAgentId =\n | 'claude-code'\n | 'codex'\n | 'opencode'\n | 'gemini-cli'\n | 'cursor'\n | 'antigravity';\n\nexport type AgentRuleTargetKind = 'root-file' | 'managed-file';\n\nexport interface AgentRuleTarget {\n agentId: SupportedAgentId;\n outputPath: string;\n kind: AgentRuleTargetKind;\n}\n\nexport type AgentRuleMergeMode = 'create' | 'prepend' | 'keep' | 'replace-block' | 'overwrite';\n\nexport interface PlannedAgentRuleAction {\n agentId: SupportedAgentId;\n outputPath: string;\n kind: AgentRuleTargetKind;\n mergeMode: AgentRuleMergeMode;\n currentKind: FsEntryKind;\n}\n\nexport const SDD_RULES_BEGIN = '<!-- sduck:begin -->';\nexport const SDD_RULES_END = '<!-- sduck:end -->';\n\nexport const SUPPORTED_AGENTS: readonly { id: SupportedAgentId; label: string }[] = [\n { id: 'claude-code', label: 'Claude Code' },\n { id: 'codex', label: 'Codex' },\n { id: 'opencode', label: 'OpenCode' },\n { id: 'gemini-cli', label: 'Gemini CLI' },\n { id: 'cursor', label: 'Cursor' },\n { id: 'antigravity', label: 'Antigravity' },\n];\n\nconst AGENT_RULE_TARGETS: readonly AgentRuleTarget[] = [\n { agentId: 'claude-code', outputPath: 'CLAUDE.md', kind: 'root-file' },\n { agentId: 'codex', outputPath: 'AGENT.md', kind: 'root-file' },\n { agentId: 'opencode', outputPath: 'AGENT.md', kind: 'root-file' },\n { agentId: 'gemini-cli', outputPath: 'GEMINI.md', kind: 'root-file' },\n {\n agentId: 'cursor',\n outputPath: join('.cursor', 'rules', 'sduck-core.mdc'),\n kind: 'managed-file',\n },\n {\n agentId: 'antigravity',\n outputPath: join('.agents', 'rules', 'sduck-core.md'),\n kind: 'managed-file',\n },\n];\n\nconst AGENT_TEMPLATE_FILES: Record<SupportedAgentId, string> = {\n 'claude-code': 'claude-code.md',\n codex: 'codex.md',\n opencode: 'opencode.md',\n 'gemini-cli': 'gemini-cli.md',\n cursor: 'cursor.mdc',\n antigravity: 'antigravity.md',\n};\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nexport function parseAgentsOption(rawAgents: string | undefined): SupportedAgentId[] {\n if (rawAgents === undefined || rawAgents.trim() === '') {\n return [];\n }\n\n const requestedAgents = unique(\n rawAgents\n .split(',')\n .map((value) => value.trim())\n .filter((value) => value !== ''),\n );\n\n const validAgents = new Set(SUPPORTED_AGENTS.map((agent) => agent.id));\n const invalidAgent = requestedAgents.find((agent) => !validAgents.has(agent as SupportedAgentId));\n\n if (invalidAgent !== undefined) {\n throw new Error(`Unsupported agent: ${invalidAgent}`);\n }\n\n return requestedAgents as SupportedAgentId[];\n}\n\nexport function listAgentRuleTargets(selectedAgents: SupportedAgentId[]): AgentRuleTarget[] {\n const selectedAgentSet = new Set(selectedAgents);\n\n return AGENT_RULE_TARGETS.filter((target) => selectedAgentSet.has(target.agentId)).filter(\n (target, index, allTargets) =>\n index === allTargets.findIndex((candidate) => candidate.outputPath === target.outputPath),\n );\n}\n\nexport function hasManagedBlock(content: string): boolean {\n return content.includes(SDD_RULES_BEGIN) && content.includes(SDD_RULES_END);\n}\n\nexport function prependManagedBlock(existingContent: string, blockContent: string): string {\n const normalizedExistingContent = existingContent.trimStart();\n\n if (normalizedExistingContent === '') {\n return `${blockContent}\\n`;\n }\n\n return `${blockContent}\\n\\n${normalizedExistingContent}`;\n}\n\nexport function replaceManagedBlock(existingContent: string, blockContent: string): string {\n const blockPattern = new RegExp(`${SDD_RULES_BEGIN}[\\\\s\\\\S]*?${SDD_RULES_END}`);\n\n if (!blockPattern.test(existingContent)) {\n return prependManagedBlock(existingContent, blockContent);\n }\n\n return existingContent.replace(blockPattern, blockContent);\n}\n\nfunction renderManagedBlock(lines: string[]): string {\n return [SDD_RULES_BEGIN, ...lines, SDD_RULES_END].join('\\n');\n}\n\nasync function getAgentRulesAssetRoot(): Promise<string> {\n const currentDirectoryPath = dirname(fileURLToPath(import.meta.url));\n const candidatePaths = [\n join(currentDirectoryPath, '..', '..', '.sduck', 'sduck-assets', 'agent-rules'),\n join(currentDirectoryPath, '..', '.sduck', 'sduck-assets', 'agent-rules'),\n ];\n\n for (const candidatePath of candidatePaths) {\n if ((await getFsEntryKind(candidatePath)) === 'directory') {\n return candidatePath;\n }\n }\n\n throw new Error('Unable to locate bundled sduck agent rule assets.');\n}\n\nasync function readAssetFile(assetRoot: string, fileName: string): Promise<string> {\n return await readFile(join(assetRoot, fileName), 'utf8');\n}\n\nfunction buildRootFileLines(\n agentIds: SupportedAgentId[],\n agentSpecificContent: string[],\n): string[] {\n const labels = SUPPORTED_AGENTS.filter((agent) => agentIds.includes(agent.id)).map(\n (agent) => agent.label,\n );\n\n return [\n '# sduck managed rules',\n '',\n `Selected agents: ${labels.join(', ')}`,\n '',\n ...agentSpecificContent,\n ];\n}\n\nexport async function renderAgentRuleContent(\n target: AgentRuleTarget,\n selectedAgents: SupportedAgentId[],\n): Promise<string> {\n const assetRoot = await getAgentRulesAssetRoot();\n const coreContent = await readAssetFile(assetRoot, 'core.md');\n\n if (target.kind === 'managed-file') {\n const templateFileName = AGENT_TEMPLATE_FILES[target.agentId];\n const specificContent = await readAssetFile(assetRoot, templateFileName);\n\n return `${specificContent.trim()}\\n\\n${coreContent.trim()}\\n`;\n }\n\n const relatedAgents = AGENT_RULE_TARGETS.filter(\n (candidate) =>\n candidate.outputPath === target.outputPath && selectedAgents.includes(candidate.agentId),\n ).map((candidate) => candidate.agentId);\n\n const specificSections: string[] = [];\n\n for (const agentId of relatedAgents) {\n const templateFileName = AGENT_TEMPLATE_FILES[agentId];\n specificSections.push((await readAssetFile(assetRoot, templateFileName)).trim());\n }\n\n const lines = buildRootFileLines(relatedAgents, [...specificSections, coreContent.trim()]);\n\n return `${renderManagedBlock(lines)}\\n`;\n}\n\nexport function planAgentRuleActions(\n mode: 'safe' | 'force',\n targets: readonly AgentRuleTarget[],\n existingEntries: Map<string, FsEntryKind>,\n existingContents: Map<string, string>,\n): PlannedAgentRuleAction[] {\n return targets.map((target) => {\n const currentKind = existingEntries.get(target.outputPath) ?? 'missing';\n\n if (currentKind === 'missing') {\n return { ...target, mergeMode: 'create', currentKind };\n }\n\n if (currentKind !== 'file') {\n return { ...target, mergeMode: 'overwrite', currentKind };\n }\n\n if (target.kind === 'managed-file') {\n return { ...target, mergeMode: mode === 'force' ? 'overwrite' : 'keep', currentKind };\n }\n\n const content = existingContents.get(target.outputPath) ?? '';\n\n if (mode === 'safe') {\n return { ...target, mergeMode: hasManagedBlock(content) ? 'keep' : 'prepend', currentKind };\n }\n\n return {\n ...target,\n mergeMode: hasManagedBlock(content) ? 'replace-block' : 'prepend',\n currentKind,\n };\n });\n}\n","import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport {\n type AgentRuleTarget,\n listAgentRuleTargets,\n planAgentRuleActions,\n prependManagedBlock,\n renderAgentRuleContent,\n replaceManagedBlock,\n type PlannedAgentRuleAction,\n type SupportedAgentId,\n needsClaudeCodeHook,\n CLAUDE_CODE_HOOK_SETTINGS_PATH,\n CLAUDE_CODE_HOOK_SCRIPT_PATH,\n CLAUDE_CODE_HOOK_SOURCE_PATH,\n} from './agent-rules.js';\nimport { EVAL_ASSET_RELATIVE_PATHS, getBundledAssetsRoot } from './assets.js';\nimport {\n copyFileIntoPlace,\n ensureDirectory,\n ensureReadableFile,\n getFsEntryKind,\n type FsEntryKind,\n} from './fs.js';\nimport {\n getProjectRelativeSduckAssetPath,\n getProjectSduckAssetsPath,\n getProjectSduckHomePath,\n getProjectSduckWorkspacePath,\n PROJECT_SDUCK_ASSETS_RELATIVE_PATH,\n PROJECT_SDUCK_HOME_RELATIVE_PATH,\n PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH,\n toBundledAssetRelativePath,\n} from './project-paths.js';\n\nimport type { InitCommandOptions, InitMode, ResolvedInitOptions } from './init-types.js';\n\nexport type { FsEntryKind } from './fs.js';\nexport type { InitCommandOptions, InitMode, ResolvedInitOptions } from './init-types.js';\n\nexport type AssetTemplateKey =\n | 'eval-spec'\n | 'eval-plan'\n | 'eval-task'\n | 'type-build'\n | 'type-feature'\n | 'type-fix'\n | 'type-refactor'\n | 'type-chore';\n\nexport interface AssetTemplateDefinition {\n key: AssetTemplateKey;\n relativePath: string;\n}\n\nexport type AssetTemplateMap = Record<AssetTemplateKey, AssetTemplateDefinition>;\n\nexport type AssetActionKind = 'create' | 'keep' | 'overwrite' | 'error';\n\nexport type AssetCollisionKind =\n | 'none'\n | 'file-directory-mismatch'\n | 'directory-file-mismatch'\n | 'unknown';\n\nexport interface PlannedAssetAction {\n key: AssetTemplateKey;\n targetPath: string;\n currentKind: FsEntryKind;\n action: AssetActionKind;\n collision: AssetCollisionKind;\n}\n\nexport type InitWarningCode =\n | 'kept-existing-asset'\n | 'kept-existing-rule'\n | 'type-conflict'\n | 'force-recommended';\n\nexport type InitErrorCode =\n | 'asset-root-conflict'\n | 'workspace-root-conflict'\n | 'asset-write-failed'\n | 'unknown-fs-error';\n\nexport interface InitSummaryRow {\n path: string;\n status: 'created' | 'prepended' | 'kept' | 'overwritten';\n}\n\nexport interface InitExecutionSummary {\n created: string[];\n prepended: string[];\n kept: string[];\n overwritten: string[];\n warnings: string[];\n errors: string[];\n rows: InitSummaryRow[];\n}\n\nexport interface InitExecutionResult {\n mode: InitMode;\n agents: SupportedAgentId[];\n summary: InitExecutionSummary;\n didChange: boolean;\n}\n\nconst ASSET_TEMPLATE_DEFINITIONS = [\n {\n key: 'eval-spec',\n relativePath: getProjectRelativeSduckAssetPath(EVAL_ASSET_RELATIVE_PATHS.spec),\n },\n {\n key: 'eval-plan',\n relativePath: getProjectRelativeSduckAssetPath(EVAL_ASSET_RELATIVE_PATHS.plan),\n },\n {\n key: 'eval-task',\n relativePath: getProjectRelativeSduckAssetPath(EVAL_ASSET_RELATIVE_PATHS.task),\n },\n {\n key: 'type-build',\n relativePath: getProjectRelativeSduckAssetPath('types', 'build.md'),\n },\n {\n key: 'type-feature',\n relativePath: getProjectRelativeSduckAssetPath('types', 'feature.md'),\n },\n { key: 'type-fix', relativePath: getProjectRelativeSduckAssetPath('types', 'fix.md') },\n {\n key: 'type-refactor',\n relativePath: getProjectRelativeSduckAssetPath('types', 'refactor.md'),\n },\n {\n key: 'type-chore',\n relativePath: getProjectRelativeSduckAssetPath('types', 'chore.md'),\n },\n] as const satisfies readonly AssetTemplateDefinition[];\n\nexport const ASSET_TEMPLATE_MAP = Object.fromEntries(\n ASSET_TEMPLATE_DEFINITIONS.map((definition) => [definition.key, definition]),\n) as AssetTemplateMap;\n\nexport function planInitActions(\n mode: InitMode,\n existingEntries: Map<string, FsEntryKind>,\n): PlannedAssetAction[] {\n return ASSET_TEMPLATE_DEFINITIONS.map((definition) => {\n const currentKind = existingEntries.get(definition.relativePath) ?? 'missing';\n\n if (currentKind === 'missing') {\n return {\n key: definition.key,\n targetPath: definition.relativePath,\n currentKind,\n action: 'create',\n collision: 'none',\n } satisfies PlannedAssetAction;\n }\n\n if (currentKind === 'file') {\n return {\n key: definition.key,\n targetPath: definition.relativePath,\n currentKind,\n action: mode === 'force' ? 'overwrite' : 'keep',\n collision: 'none',\n } satisfies PlannedAssetAction;\n }\n\n return {\n key: definition.key,\n targetPath: definition.relativePath,\n currentKind,\n action: 'error',\n collision: 'directory-file-mismatch',\n } satisfies PlannedAssetAction;\n });\n}\n\nexport function summarizeInitActions(actions: PlannedAssetAction[]): InitExecutionSummary {\n const summary: InitExecutionSummary = {\n created: [],\n prepended: [],\n kept: [],\n overwritten: [],\n warnings: [],\n errors: [],\n rows: [],\n };\n\n for (const action of actions) {\n if (action.action === 'create') {\n summary.created.push(action.targetPath);\n summary.rows.push({ path: action.targetPath, status: 'created' });\n continue;\n }\n\n if (action.action === 'keep') {\n summary.kept.push(action.targetPath);\n summary.rows.push({ path: action.targetPath, status: 'kept' });\n summary.warnings.push(`Kept existing asset: ${action.targetPath}`);\n continue;\n }\n\n if (action.action === 'overwrite') {\n summary.overwritten.push(action.targetPath);\n summary.rows.push({ path: action.targetPath, status: 'overwritten' });\n continue;\n }\n\n summary.errors.push(`Path conflict for ${action.targetPath}: ${action.collision}`);\n }\n\n if (summary.kept.length > 0) {\n summary.warnings.push('Run `sduck init --force` if you want to regenerate bundled assets.');\n }\n\n return summary;\n}\n\nfunction getInitMode(options: InitCommandOptions): InitMode {\n return options.force ? 'force' : 'safe';\n}\n\nfunction resolveInitOptions(options: InitCommandOptions): ResolvedInitOptions {\n return {\n mode: getInitMode(options),\n agents: [...new Set(options.agents)],\n };\n}\n\nasync function collectExistingEntries(projectRoot: string): Promise<Map<string, FsEntryKind>> {\n const existingEntries = new Map<string, FsEntryKind>();\n\n for (const definition of ASSET_TEMPLATE_DEFINITIONS) {\n existingEntries.set(\n definition.relativePath,\n await getFsEntryKind(join(projectRoot, definition.relativePath)),\n );\n }\n\n return existingEntries;\n}\n\nasync function collectExistingFileContents(\n projectRoot: string,\n targets: readonly AgentRuleTarget[],\n): Promise<Map<string, string>> {\n const contents = new Map<string, string>();\n\n for (const target of targets) {\n const targetPath = join(projectRoot, target.outputPath);\n\n if ((await getFsEntryKind(targetPath)) === 'file') {\n contents.set(target.outputPath, await readFile(targetPath, 'utf8'));\n }\n }\n\n return contents;\n}\n\nasync function ensureRootDirectory(\n targetPath: string,\n errorCode: InitErrorCode,\n): Promise<'created' | 'kept' | 'overwritten'> {\n const kind = await getFsEntryKind(targetPath);\n\n if (kind === 'missing') {\n await ensureDirectory(targetPath);\n return 'created';\n }\n\n if (kind === 'directory') {\n return 'kept';\n }\n\n throw new Error(`${errorCode}: expected a directory at ${targetPath}.`);\n}\n\nexport async function initProject(\n options: InitCommandOptions,\n projectRoot: string,\n): Promise<InitExecutionResult> {\n const resolvedOptions = resolveInitOptions(options);\n const { mode } = resolvedOptions;\n const assetSourceRoot = await getBundledAssetsRoot();\n const sduckHomeRoot = getProjectSduckHomePath(projectRoot);\n const assetsRoot = getProjectSduckAssetsPath(projectRoot);\n const workspaceRoot = getProjectSduckWorkspacePath(projectRoot);\n\n const summary: InitExecutionSummary = {\n created: [],\n prepended: [],\n kept: [],\n overwritten: [],\n warnings: [],\n errors: [],\n rows: [],\n };\n\n const sduckHomeStatus = await ensureRootDirectory(sduckHomeRoot, 'asset-root-conflict');\n summary[sduckHomeStatus].push(`${PROJECT_SDUCK_HOME_RELATIVE_PATH}/`);\n summary.rows.push({ path: `${PROJECT_SDUCK_HOME_RELATIVE_PATH}/`, status: sduckHomeStatus });\n\n const assetsRootStatus = await ensureRootDirectory(assetsRoot, 'asset-root-conflict');\n summary[assetsRootStatus].push(`${PROJECT_SDUCK_ASSETS_RELATIVE_PATH}/`);\n summary.rows.push({ path: `${PROJECT_SDUCK_ASSETS_RELATIVE_PATH}/`, status: assetsRootStatus });\n\n const workspaceRootStatus = await ensureRootDirectory(workspaceRoot, 'workspace-root-conflict');\n summary[workspaceRootStatus].push(`${PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH}/`);\n summary.rows.push({\n path: `${PROJECT_SDUCK_WORKSPACE_RELATIVE_PATH}/`,\n status: workspaceRootStatus,\n });\n\n const actions = planInitActions(mode, await collectExistingEntries(projectRoot));\n const actionSummary = summarizeInitActions(actions);\n\n summary.created.push(...actionSummary.created);\n summary.kept.push(...actionSummary.kept);\n summary.overwritten.push(...actionSummary.overwritten);\n summary.warnings.push(...actionSummary.warnings);\n summary.errors.push(...actionSummary.errors);\n summary.rows.push(...actionSummary.rows);\n\n const conflict = actions.find((action) => action.action === 'error');\n\n if (conflict !== undefined) {\n throw new Error(\n `type-conflict: expected a file but found a directory at ${conflict.targetPath}. ` +\n 'Resolve it manually or move the conflicting path before retrying.',\n );\n }\n\n for (const action of actions) {\n if (action.action === 'keep') {\n continue;\n }\n\n const definition = ASSET_TEMPLATE_MAP[action.key];\n const sourcePath = join(assetSourceRoot, toBundledAssetRelativePath(definition.relativePath));\n const targetPath = join(projectRoot, definition.relativePath);\n\n await ensureReadableFile(sourcePath);\n await mkdir(dirname(targetPath), { recursive: true });\n await copyFileIntoPlace(sourcePath, targetPath);\n }\n\n const agentTargets = listAgentRuleTargets(resolvedOptions.agents);\n const agentEntryKinds = new Map<string, FsEntryKind>();\n\n for (const target of agentTargets) {\n agentEntryKinds.set(\n target.outputPath,\n await getFsEntryKind(join(projectRoot, target.outputPath)),\n );\n }\n\n const existingContents = await collectExistingFileContents(projectRoot, agentTargets);\n const agentActions = planAgentRuleActions(mode, agentTargets, agentEntryKinds, existingContents);\n\n await applyAgentRuleActions(\n projectRoot,\n agentActions,\n existingContents,\n summary,\n resolvedOptions.agents,\n );\n\n if (needsClaudeCodeHook(resolvedOptions.agents)) {\n await installClaudeCodeHook(projectRoot, summary);\n }\n\n return {\n mode,\n agents: resolvedOptions.agents,\n summary,\n didChange:\n summary.created.length > 0 || summary.prepended.length > 0 || summary.overwritten.length > 0,\n };\n}\n\nasync function installClaudeCodeHook(\n projectRoot: string,\n summary: InitExecutionSummary,\n): Promise<void> {\n const assetRoot = await getBundledAssetsRoot();\n const hookSourcePath = join(assetRoot, 'agent-rules', CLAUDE_CODE_HOOK_SOURCE_PATH);\n const hookTargetPath = join(projectRoot, CLAUDE_CODE_HOOK_SCRIPT_PATH);\n const settingsPath = join(projectRoot, CLAUDE_CODE_HOOK_SETTINGS_PATH);\n\n // Copy hook script\n await mkdir(dirname(hookTargetPath), { recursive: true });\n await copyFileIntoPlace(hookSourcePath, hookTargetPath);\n await chmod(hookTargetPath, 0o755);\n summary.created.push(CLAUDE_CODE_HOOK_SCRIPT_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SCRIPT_PATH, status: 'created' });\n\n // Create or merge settings.json\n const hookConfig = {\n hooks: {\n PreToolUse: [\n {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: '\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/sdd-guard.sh',\n },\n ],\n },\n ],\n },\n };\n\n if ((await getFsEntryKind(settingsPath)) === 'file') {\n const existingContent = await readFile(settingsPath, 'utf8');\n\n try {\n const existing = JSON.parse(existingContent) as Record<string, unknown>;\n existing['hooks'] = hookConfig.hooks;\n await writeFile(settingsPath, JSON.stringify(existing, null, 2) + '\\n', 'utf8');\n summary.overwritten.push(CLAUDE_CODE_HOOK_SETTINGS_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SETTINGS_PATH, status: 'overwritten' });\n } catch {\n await writeFile(settingsPath, JSON.stringify(hookConfig, null, 2) + '\\n', 'utf8');\n summary.overwritten.push(CLAUDE_CODE_HOOK_SETTINGS_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SETTINGS_PATH, status: 'overwritten' });\n }\n } else {\n await mkdir(dirname(settingsPath), { recursive: true });\n await writeFile(settingsPath, JSON.stringify(hookConfig, null, 2) + '\\n', 'utf8');\n summary.created.push(CLAUDE_CODE_HOOK_SETTINGS_PATH);\n summary.rows.push({ path: CLAUDE_CODE_HOOK_SETTINGS_PATH, status: 'created' });\n }\n}\n\nasync function applyAgentRuleActions(\n projectRoot: string,\n actions: readonly PlannedAgentRuleAction[],\n existingContents: Map<string, string>,\n summary: InitExecutionSummary,\n selectedAgents: SupportedAgentId[],\n): Promise<void> {\n for (const action of actions) {\n const targetPath = join(projectRoot, action.outputPath);\n const content = await renderAgentRuleContent(action, selectedAgents);\n\n if (action.mergeMode === 'create') {\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(targetPath, content, 'utf8');\n summary.created.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'created' });\n continue;\n }\n\n if (action.mergeMode === 'keep') {\n summary.kept.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'kept' });\n summary.warnings.push(`Kept existing rule file: ${action.outputPath}`);\n continue;\n }\n\n await mkdir(dirname(targetPath), { recursive: true });\n\n if (action.mergeMode === 'prepend') {\n const currentContent = existingContents.get(action.outputPath) ?? '';\n await writeFile(targetPath, prependManagedBlock(currentContent, content.trimEnd()), 'utf8');\n summary.prepended.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'prepended' });\n continue;\n }\n\n if (action.mergeMode === 'replace-block') {\n const currentContent = existingContents.get(action.outputPath) ?? '';\n await writeFile(targetPath, replaceManagedBlock(currentContent, content.trimEnd()), 'utf8');\n summary.overwritten.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'overwritten' });\n continue;\n }\n\n await writeFile(targetPath, content, 'utf8');\n summary.overwritten.push(action.outputPath);\n summary.rows.push({ path: action.outputPath, status: 'overwritten' });\n }\n\n if (summary.kept.some((path) => path.endsWith('.md') || path.endsWith('.mdc'))) {\n summary.warnings.push(\n 'Run `sduck init --force` to refresh managed rule content for selected agents.',\n );\n }\n}\n","import { checkbox } from '@inquirer/prompts';\n\nimport {\n approvePlans,\n createPlanApprovedAt,\n loadPlanApprovalCandidates,\n type PlanApproveCommandInput,\n type PlanApproveResult,\n type PlanApproveTarget,\n} from '../core/plan-approve.js';\n\nexport interface PlanApproveCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction padCell(value: string, width: number): string {\n return value.padEnd(width, ' ');\n}\n\nfunction buildResultTable(result: PlanApproveResult): string {\n const rows = [\n ...result.succeeded.map((row) => ({\n note: row.note,\n result: 'success',\n steps: String(row.steps),\n task: row.taskId,\n })),\n ...result.failed.map((row) => ({\n note: row.note,\n result: 'failed',\n steps: '-',\n task: row.taskId,\n })),\n ];\n\n const resultWidth = Math.max('Result'.length, ...rows.map((row) => row.result.length));\n const taskWidth = Math.max('Task'.length, ...rows.map((row) => row.task.length));\n const stepsWidth = Math.max('Steps'.length, ...rows.map((row) => row.steps.length));\n const noteWidth = Math.max('Note'.length, ...rows.map((row) => row.note.length));\n\n const border = `+-${'-'.repeat(resultWidth)}-+-${'-'.repeat(taskWidth)}-+-${'-'.repeat(stepsWidth)}-+-${'-'.repeat(noteWidth)}-+`;\n const header = `| ${padCell('Result', resultWidth)} | ${padCell('Task', taskWidth)} | ${padCell('Steps', stepsWidth)} | ${padCell('Note', noteWidth)} |`;\n const body = rows.map(\n (row) =>\n `| ${padCell(row.result, resultWidth)} | ${padCell(row.task, taskWidth)} | ${padCell(row.steps, stepsWidth)} | ${padCell(row.note, noteWidth)} |`,\n );\n\n return [border, header, border, ...body, border].join('\\n');\n}\n\nfunction formatTaskLabel(task: PlanApproveTarget): string {\n return `${task.id} (${task.status})`;\n}\n\nfunction formatSuccess(result: PlanApproveResult): string {\n const lines = [buildResultTable(result)];\n\n if (result.succeeded.length > 0) {\n lines.push('', '상태: IN_PROGRESS → 작업을 시작합니다.');\n }\n\n return lines.join('\\n');\n}\n\nasync function selectTargets(tasks: readonly PlanApproveTarget[]): Promise<PlanApproveTarget[]> {\n if (tasks.length <= 1 || !process.stdin.isTTY || !process.stdout.isTTY) {\n return [...tasks];\n }\n\n const selectedIds = await checkbox<string>({\n message: 'Select tasks to approve plan for',\n choices: tasks.map((task) => ({ checked: true, name: formatTaskLabel(task), value: task.id })),\n });\n\n return tasks.filter((task) => selectedIds.includes(task.id));\n}\n\nexport async function runPlanApproveCommand(\n input: PlanApproveCommandInput,\n projectRoot: string,\n): Promise<PlanApproveCommandResult> {\n try {\n const candidates = await loadPlanApprovalCandidates(projectRoot, input);\n\n if (candidates.length === 0) {\n throw new Error('No matching tasks awaiting plan approval.');\n }\n\n if (\n input.target !== undefined &&\n candidates.length > 1 &&\n (!process.stdin.isTTY || !process.stdout.isTTY)\n ) {\n throw new Error(\n 'Multiple matching tasks found; rerun interactively to choose approval targets.',\n );\n }\n\n const selectedTasks = await selectTargets(candidates);\n\n if (selectedTasks.length === 0) {\n throw new Error('No tasks selected for plan approval.');\n }\n\n const result = await approvePlans(projectRoot, selectedTasks, createPlanApprovedAt());\n\n if (result.succeeded.length === 0) {\n return {\n exitCode: 1,\n stderr: buildResultTable(result),\n stdout: '',\n };\n }\n\n return {\n exitCode: result.failed.length > 0 ? 1 : 0,\n stderr: result.failed.length > 0 ? '' : '',\n stdout: formatSuccess(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown plan approval failure.',\n stdout: '',\n };\n }\n}\n","import { copyFile, readFile, unlink, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { ensureDirectory, getFsEntryKind } from './fs.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\n\nexport interface ReopenCommandInput {\n target?: string;\n}\n\nexport interface ReopenResult {\n newCycle: number;\n previousCycle: number;\n snapshots: string[];\n taskId: string;\n}\n\nexport function getCurrentCycle(metaContent: string): number {\n const match = /^cycle:[ \\t]+(\\d+)$/m.exec(metaContent);\n\n if (match?.[1] === undefined) {\n return 1;\n }\n\n return Number(match[1]);\n}\n\nexport function buildReopenedMeta(metaContent: string, newCycle: number): string {\n let result = metaContent;\n\n // Update or insert cycle field\n if (/^cycle:\\s+/m.test(result)) {\n result = result.replace(/^cycle:\\s+.+$/m, `cycle: ${String(newCycle)}`);\n } else {\n result = result.replace(/^(status:\\s+.+)$/m, `cycle: ${String(newCycle)}\\n\\n$1`);\n }\n\n // Reset status\n result = result.replace(/^status:\\s+.+$/m, 'status: PENDING_SPEC_APPROVAL');\n\n // Reset spec approval\n result = result.replace(\n /spec:\\n {2}approved:\\s+.+\\n {2}approved_at:\\s+.+/m,\n 'spec:\\n approved: false\\n approved_at: null',\n );\n\n // Reset plan approval\n result = result.replace(\n /plan:\\n {2}approved:\\s+.+\\n {2}approved_at:\\s+.+/m,\n 'plan:\\n approved: false\\n approved_at: null',\n );\n\n // Reset steps\n result = result.replace(\n /steps:\\n {2}total:\\s+.+\\n {2}completed:\\s+.+/m,\n 'steps:\\n total: null\\n completed: []',\n );\n\n // Reset completed_at\n result = result.replace(/^completed_at:\\s+.+$/m, 'completed_at: null');\n\n return result;\n}\n\nexport function filterReopenCandidates(\n tasks: readonly WorkspaceTaskSummary[],\n): WorkspaceTaskSummary[] {\n return tasks.filter((task) => task.status === 'DONE');\n}\n\nfunction formatCandidateList(candidates: readonly WorkspaceTaskSummary[]): string {\n return candidates\n .map((task) => ` - ${task.id}${task.slug !== undefined ? ` (${task.slug})` : ''}`)\n .join('\\n');\n}\n\nexport function resolveReopenTarget(\n tasks: readonly WorkspaceTaskSummary[],\n target?: string,\n): WorkspaceTaskSummary {\n const candidates = filterReopenCandidates(tasks);\n\n if (candidates.length === 0) {\n throw new Error('No DONE tasks found to reopen.');\n }\n\n if (target === undefined || target.trim() === '') {\n if (candidates.length === 1) {\n const [candidate] = candidates;\n\n if (candidate === undefined) {\n throw new Error('No DONE tasks found to reopen.');\n }\n\n return candidate;\n }\n\n throw new Error(\n `Multiple DONE tasks found. Specify a target:\\n${formatCandidateList(candidates)}`,\n );\n }\n\n const trimmedTarget = target.trim();\n\n // id exact match first\n const idMatch = candidates.filter((task) => task.id === trimmedTarget);\n\n if (idMatch.length === 1) {\n const [match] = idMatch;\n\n if (match === undefined) {\n throw new Error(`No DONE task found matching '${trimmedTarget}'.`);\n }\n\n return match;\n }\n\n // slug exact match\n const slugMatch = candidates.filter((task) => task.slug === trimmedTarget);\n\n if (slugMatch.length === 1) {\n const [match] = slugMatch;\n\n if (match === undefined) {\n throw new Error(`No DONE task found matching '${trimmedTarget}'.`);\n }\n\n return match;\n }\n\n if (slugMatch.length > 1) {\n throw new Error(\n `Multiple DONE tasks match slug '${trimmedTarget}':\\n${formatCandidateList(slugMatch)}`,\n );\n }\n\n throw new Error(`No DONE task found matching '${trimmedTarget}'.`);\n}\n\nexport async function snapshotHistoryFiles(\n taskDir: string,\n currentCycle: number,\n): Promise<string[]> {\n const historyDir = join(taskDir, 'history');\n const created: string[] = [];\n\n const filesToSnapshot = ['spec.md', 'plan.md'];\n const snapshotPaths: { dest: string; source: string }[] = [];\n\n // Check for conflicts and determine which files to snapshot\n for (const fileName of filesToSnapshot) {\n const sourcePath = join(taskDir, fileName);\n\n if ((await getFsEntryKind(sourcePath)) !== 'file') {\n continue;\n }\n\n const destName = `${String(currentCycle)}_${fileName}`;\n const destPath = join(historyDir, destName);\n\n if ((await getFsEntryKind(destPath)) !== 'missing') {\n throw new Error(`History snapshot already exists: ${destPath}`);\n }\n\n snapshotPaths.push({ dest: destPath, source: sourcePath });\n }\n\n if (snapshotPaths.length === 0) {\n return [];\n }\n\n // Create history directory\n await ensureDirectory(historyDir);\n\n // Copy files with rollback on failure\n try {\n for (const { dest, source } of snapshotPaths) {\n await copyFile(source, dest);\n created.push(dest);\n }\n } catch (error) {\n // Rollback: delete any files we created\n for (const path of created) {\n try {\n await unlink(path);\n } catch {\n // Best effort rollback\n }\n }\n\n throw error;\n }\n\n return created;\n}\n\nexport async function runReopenWorkflow(\n projectRoot: string,\n task: WorkspaceTaskSummary,\n): Promise<ReopenResult> {\n const taskDir = join(projectRoot, task.path);\n const metaPath = join(taskDir, 'meta.yml');\n\n const metaContent = await readFile(metaPath, 'utf8');\n const currentCycle = getCurrentCycle(metaContent);\n const newCycle = currentCycle + 1;\n\n // Snapshot history files (handles its own rollback on failure)\n const snapshots = await snapshotHistoryFiles(taskDir, currentCycle);\n\n // Update meta (rollback snapshots if meta write fails)\n const updatedMeta = buildReopenedMeta(metaContent, newCycle);\n\n try {\n await writeFile(metaPath, updatedMeta, 'utf8');\n } catch (error) {\n // Rollback snapshots\n for (const path of snapshots) {\n try {\n await unlink(path);\n } catch {\n // Best effort rollback\n }\n }\n\n throw error;\n }\n\n return {\n newCycle,\n previousCycle: currentCycle,\n snapshots,\n taskId: task.id,\n };\n}\n\nexport async function loadReopenTarget(\n projectRoot: string,\n input: ReopenCommandInput,\n): Promise<WorkspaceTaskSummary> {\n const tasks = await listWorkspaceTasks(projectRoot);\n return resolveReopenTarget(tasks, input.target);\n}\n","import {\n loadReopenTarget,\n runReopenWorkflow,\n type ReopenCommandInput,\n type ReopenResult,\n} from '../core/reopen.js';\n\nexport interface ReopenCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction formatSuccess(result: ReopenResult): string {\n const lines = [\n `Reopened ${result.taskId} → cycle ${String(result.newCycle)} (PENDING_SPEC_APPROVAL)`,\n ];\n\n if (result.snapshots.length > 0) {\n lines.push('');\n lines.push('Snapshots:');\n\n for (const snapshot of result.snapshots) {\n lines.push(` - ${snapshot}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport async function runReopenCommand(\n input: ReopenCommandInput,\n projectRoot: string,\n): Promise<ReopenCommandResult> {\n try {\n const task = await loadReopenTarget(projectRoot, input);\n const result = await runReopenWorkflow(projectRoot, task);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatSuccess(result),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown reopen failure.',\n stdout: '',\n };\n }\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getFsEntryKind } from './fs.js';\nimport { readCurrentWorkId, throwNoCurrentWorkError } from './state.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\nimport { formatUtcTimestamp } from '../utils/utc-date.js';\n\nfunction renderReviewTemplate(workId: string): string {\n return [\n `# Review: ${workId}`,\n '',\n '## 변경 요약',\n '',\n '- ',\n '',\n '## 테스트 결과',\n '',\n '- ',\n '',\n '## 리뷰 체크리스트',\n '',\n '- [ ] 코드 품질 확인',\n '- [ ] 테스트 통과 확인',\n '- [ ] 문서 업데이트 확인',\n '',\n ].join('\\n');\n}\n\nexport async function resolveReviewTarget(\n projectRoot: string,\n target?: string,\n): Promise<WorkspaceTaskSummary> {\n const tasks = await listWorkspaceTasks(projectRoot);\n\n if (target !== undefined && target.trim() !== '') {\n const trimmed = target.trim();\n\n // id exact match first\n const idMatch = tasks.find((task) => task.id === trimmed);\n\n if (idMatch !== undefined) {\n if (idMatch.status !== 'IN_PROGRESS') {\n throw new Error(\n `Cannot mark work ${idMatch.id} as review ready: status is ${idMatch.status}, expected IN_PROGRESS.`,\n );\n }\n\n return idMatch;\n }\n\n // slug exact match\n const slugMatches = tasks.filter((task) => task.slug === trimmed);\n\n if (slugMatches.length === 1) {\n const match = slugMatches[0];\n\n if (match === undefined) {\n throw new Error(`No work matches '${trimmed}'.`);\n }\n\n if (match.status !== 'IN_PROGRESS') {\n throw new Error(\n `Cannot mark work ${match.id} as review ready: status is ${match.status}, expected IN_PROGRESS.`,\n );\n }\n\n return match;\n }\n\n if (slugMatches.length > 1) {\n const candidates = slugMatches.map((task) => task.id).join(', ');\n throw new Error(\n `Multiple works match slug '${trimmed}': ${candidates}. Use \\`sduck review ready <id>\\` to specify.`,\n );\n }\n\n throw new Error(`No work matches '${trimmed}'.`);\n }\n\n // No target: use current work\n const currentWorkId = await readCurrentWorkId(projectRoot);\n\n if (currentWorkId === null) {\n throwNoCurrentWorkError('review ready');\n }\n\n const match = tasks.find((task) => task.id === currentWorkId);\n\n if (match === undefined) {\n throw new Error(`Current work ${currentWorkId} not found in workspace.`);\n }\n\n if (match.status !== 'IN_PROGRESS') {\n throw new Error(\n `Cannot mark work ${match.id} as review ready: status is ${match.status}, expected IN_PROGRESS.`,\n );\n }\n\n return match;\n}\n\nexport async function runReviewReadyWorkflow(\n projectRoot: string,\n target?: string,\n date = new Date(),\n): Promise<{ workId: string }> {\n const work = await resolveReviewTarget(projectRoot, target);\n const reviewPath = join(projectRoot, work.path, 'review.md');\n\n // Only create review.md if it doesn't exist\n if ((await getFsEntryKind(reviewPath)) !== 'file') {\n await writeFile(reviewPath, renderReviewTemplate(work.id), 'utf8');\n }\n\n // Update status after file creation succeeds\n const metaPath = join(projectRoot, work.path, 'meta.yml');\n\n if ((await getFsEntryKind(metaPath)) !== 'file') {\n throw new Error(`Missing meta.yml for work ${work.id}.`);\n }\n\n const metaContent = await readFile(metaPath, 'utf8');\n const updatedContent = metaContent\n .replace(/^status:\\s+.+$/m, 'status: REVIEW_READY')\n .replace(/^updated_at:\\s+.+$/m, `updated_at: ${formatUtcTimestamp(date)}`);\n\n await writeFile(metaPath, updatedContent, 'utf8');\n\n return { workId: work.id };\n}\n","import { runReviewReadyWorkflow } from '../core/review-ready.js';\n\nexport interface ReviewReadyCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runReviewReadyCommand(\n target: string | undefined,\n projectRoot: string,\n): Promise<ReviewReadyCommandResult> {\n try {\n const { workId } = await runReviewReadyWorkflow(projectRoot, target);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: `리뷰 준비 완료: ${workId}`,\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown review ready failure.',\n stdout: '',\n };\n }\n}\n","import { checkbox } from '@inquirer/prompts';\n\nimport {\n approveSpecs,\n createSpecApprovedAt,\n loadSpecApprovalCandidates,\n type SpecApproveCommandInput,\n type SpecApproveResult,\n type SpecApproveTarget,\n} from '../core/spec-approve.js';\n\nexport interface SpecApproveCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nfunction formatTaskLabel(task: SpecApproveTarget): string {\n return `${task.id} (${task.status})`;\n}\n\nfunction formatSuccess(result: SpecApproveResult, tasks: readonly SpecApproveTarget[]): string {\n const lines = ['스펙 승인됨'];\n\n for (const task of tasks) {\n lines.push(`- ${task.path} -> ${result.nextStatus}`);\n }\n\n lines.push('상태: SPEC_APPROVED → 플랜 작성을 시작합니다.');\n\n return lines.join('\\n');\n}\n\nasync function selectTargets(tasks: readonly SpecApproveTarget[]): Promise<SpecApproveTarget[]> {\n if (tasks.length <= 1 || !process.stdin.isTTY || !process.stdout.isTTY) {\n return [...tasks];\n }\n\n const selectedIds = await checkbox<string>({\n message: 'Select tasks to approve',\n choices: tasks.map((task) => ({\n checked: true,\n name: formatTaskLabel(task),\n value: task.id,\n })),\n });\n\n return tasks.filter((task) => selectedIds.includes(task.id));\n}\n\nexport async function runSpecApproveCommand(\n input: SpecApproveCommandInput,\n projectRoot: string,\n): Promise<SpecApproveCommandResult> {\n try {\n const candidates = await loadSpecApprovalCandidates(projectRoot, input);\n\n if (candidates.length === 0) {\n throw new Error('No matching tasks awaiting spec approval.');\n }\n\n if (\n input.target !== undefined &&\n candidates.length > 1 &&\n (!process.stdin.isTTY || !process.stdout.isTTY)\n ) {\n throw new Error(\n 'Multiple matching tasks found; rerun interactively to choose approval targets.',\n );\n }\n\n const selectedTasks = await selectTargets(candidates);\n\n if (selectedTasks.length === 0) {\n throw new Error('No tasks selected for spec approval.');\n }\n\n const result = await approveSpecs(projectRoot, selectedTasks, createSpecApprovedAt());\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: formatSuccess(result, selectedTasks),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown spec approval failure.',\n stdout: '',\n };\n }\n}\n","import { startTask, type StartTaskOptions } from '../core/start.js';\n\nexport interface StartCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runStartCommand(\n type: string,\n slug: string,\n projectRoot: string,\n options?: StartTaskOptions,\n): Promise<StartCommandResult> {\n try {\n const result = await startTask(type, slug, projectRoot, new Date(), options);\n const lines = [\n '작업 디렉토리 생성됨',\n `경로: ${result.workspacePath}/`,\n `상태: ${result.status}`,\n ];\n\n if (result.gitignoreWarning !== undefined) {\n lines.push('', result.gitignoreWarning);\n }\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: lines.join('\\n'),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown start failure.',\n stdout: '',\n };\n }\n}\n","import { writeCurrentWorkId } from './state.js';\nimport { listWorkspaceTasks, type WorkspaceTaskSummary } from './workspace.js';\n\nexport async function resolveUseTarget(\n projectRoot: string,\n target: string,\n): Promise<WorkspaceTaskSummary> {\n const tasks = await listWorkspaceTasks(projectRoot);\n const trimmed = target.trim();\n\n // id exact match first\n const idMatch = tasks.find((task) => task.id === trimmed);\n\n if (idMatch !== undefined) {\n return idMatch;\n }\n\n // slug exact match\n const slugMatches = tasks.filter((task) => task.slug === trimmed);\n\n if (slugMatches.length === 1) {\n const match = slugMatches[0];\n\n if (match !== undefined) {\n return match;\n }\n }\n\n if (slugMatches.length > 1) {\n const candidates = slugMatches.map((task) => task.id).join(', ');\n throw new Error(\n `Multiple works match slug '${trimmed}': ${candidates}. Use \\`sduck use <id>\\` to specify.`,\n );\n }\n\n throw new Error(`No work matches '${trimmed}'.`);\n}\n\nexport async function runUseWorkflow(\n projectRoot: string,\n target: string,\n): Promise<{ workId: string }> {\n const work = await resolveUseTarget(projectRoot, target);\n await writeCurrentWorkId(projectRoot, work.id);\n\n return { workId: work.id };\n}\n","import { runUseWorkflow } from '../core/use.js';\n\nexport interface UseCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport async function runUseCommand(\n target: string,\n projectRoot: string,\n): Promise<UseCommandResult> {\n try {\n const { workId } = await runUseWorkflow(projectRoot, target);\n\n return {\n exitCode: 0,\n stderr: '',\n stdout: `현재 작업 전환: ${workId}`,\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr: error instanceof Error ? error.message : 'Unknown use failure.',\n stdout: '',\n };\n }\n}\n","{\n \"name\": \"@sduck/sduck-cli\",\n \"version\": \"0.2.0\",\n \"description\": \"Spec-Driven Development CLI bootstrap\",\n \"type\": \"module\",\n \"bin\": {\n \"sduck\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \".sduck/sduck-assets\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"dev\": \"tsx src/cli.ts\",\n \"build\": \"tsup src/cli.ts --config tsup.config.ts\",\n \"lint\": \"eslint . --max-warnings=0\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"typecheck\": \"tsc --project tsconfig.json --noEmit\",\n \"test:unit\": \"vitest run tests/unit\",\n \"test:e2e\": \"vitest run tests/e2e\",\n \"test\": \"npm run test:unit && npm run test:e2e\",\n \"prepare\": \"husky\"\n },\n \"lint-staged\": {\n \"*.{js,mjs,cjs,ts,mts,cts}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.8.6\",\n \"commander\": \"^14.0.1\",\n \"js-yaml\": \"^4.1.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.23.0\",\n \"@types/node\": \"^22.13.14\",\n \"eslint\": \"^9.23.0\",\n \"eslint-config-prettier\": \"^10.1.1\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-import-resolver-typescript\": \"^4.3.5\",\n \"eslint-plugin-n\": \"^17.16.2\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^15.5.0\",\n \"prettier\": \"^3.5.3\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.3\",\n \"typescript\": \"^5.8.2\",\n \"typescript-eslint\": \"^8.28.0\",\n \"vitest\": \"^3.0.8\"\n }\n}\n","import packageMetadata from '../../package.json' with { type: 'json' };\n\nexport const CLI_NAME = 'sduck';\n\nexport const CLI_VERSION = packageMetadata.version;\n\nexport const CLI_DESCRIPTION = 'Spec-Driven Development workflow bootstrap CLI';\n\nexport const PLACEHOLDER_MESSAGE =\n 'Core workflow commands are planned but not implemented in this bootstrap yet.';\n\nexport function normalizeCommandName(input: string): string {\n return input.trim().toLowerCase().replace(/\\s+/g, '-');\n}\n"],"mappings":"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","names":["readFile","writeFile","join","readFile","join","join","readFile","join","readFile","writeFile","readFile","join","join","readFile","readFile","readdir","join","readdir","join","readFile","workspacePath","readFile","writeFile","join","join","readFile","writeFile","tasks","padCell","buildResultTable","writeFile","join","join","join","readFile","writeFile","join","join","readFile","writeFile","readFile","writeFile","join","join","readFile","writeFile","mkdir","readFile","readdir","writeFile","join","readFile","writeFile","join","join","readFile","writeFile","readdir","join","mkdir","readFile","writeFile","join","writeFile","readFile","join","join","readFile","readFile","dirname","join","fileURLToPath","join","dirname","fileURLToPath","readFile","mkdir","readFile","writeFile","dirname","join","join","readFile","mkdir","dirname","writeFile","padCell","checkbox","padCell","buildResultTable","formatSuccess","checkbox","copyFile","readFile","writeFile","join","join","copyFile","readFile","writeFile","formatSuccess","readFile","writeFile","join","match","join","writeFile","readFile","checkbox","formatTaskLabel","formatSuccess","selectTargets","checkbox"]}
|