@sduck/sduck-cli 0.1.7 → 0.1.8
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 +2 -0
- package/README.md +21 -0
- package/dist/cli.js +16 -4
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
|
@@ -84,6 +84,8 @@
|
|
|
84
84
|
- `PENDING_SPEC_APPROVAL` 상태에서는 spec.md 작성/수정만 가능하고 코드 작성은 금지한다
|
|
85
85
|
- `PENDING_PLAN_APPROVAL` 상태에서는 plan.md 작성/수정만 가능하고 코드 작성은 금지한다
|
|
86
86
|
- `IN_PROGRESS` 상태에서만 구현과 step 완료 기록을 진행한다
|
|
87
|
+
- `sduck reopen [target]`으로 다시 열린 task는 `IN_PROGRESS` 기준으로 이어서 작업한다
|
|
88
|
+
- reopen은 작은 후속 수정에 사용하고, 요구사항 변경이나 범위 확장은 새 task로 분리한다
|
|
87
89
|
- Do not mark a task `DONE` until all completion criteria are satisfied.
|
|
88
90
|
|
|
89
91
|
## 평가 규칙
|
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ sduck은 아래의 엄격한 절차를 지향하며, 각 단계는 CLI를 통해
|
|
|
30
30
|
7. **Approve Plan:** 사용자가 계획을 검토하고 `sduck plan approve` 실행
|
|
31
31
|
8. **Implementation:** 승인된 계획의 Step에 따라 AI가 실제 코드 구현
|
|
32
32
|
9. **Done:** spec 체크리스트와 task eval 기준을 확인한 뒤 `sduck done` 실행
|
|
33
|
+
10. **Reopen (optional):** 완료된 작업을 다시 열어 후속 수정 사이클을 진행
|
|
33
34
|
|
|
34
35
|
## 🛠 설치 및 초기화
|
|
35
36
|
|
|
@@ -99,6 +100,9 @@ sduck fast-track fix copy-bug
|
|
|
99
100
|
|
|
100
101
|
# 4) 구현 완료 후
|
|
101
102
|
sduck done login-system
|
|
103
|
+
|
|
104
|
+
# 5) 완료된 작업을 다시 열 때
|
|
105
|
+
sduck reopen login-system
|
|
102
106
|
```
|
|
103
107
|
|
|
104
108
|
### 1. 작업 시작 (Start)
|
|
@@ -156,18 +160,35 @@ sduck plan approve [slug]
|
|
|
156
160
|
sduck done [slug]
|
|
157
161
|
```
|
|
158
162
|
|
|
163
|
+
### 6. 작업 다시 열기 (Reopen)
|
|
164
|
+
|
|
165
|
+
완료된 작업에 작은 후속 수정이 필요하면 `DONE` 상태 task를 다시 열 수 있습니다.
|
|
166
|
+
|
|
167
|
+
- `reopen`은 완료된 task를 새 작업 사이클로 되돌립니다
|
|
168
|
+
- target을 지정할 때는 정확한 `slug` 또는 전체 task `id`만 허용됩니다
|
|
169
|
+
- 큰 요구사항 변경이나 범위 확장은 기존 task를 reopen하기보다 새 task를 만드는 편이 더 적합합니다
|
|
170
|
+
- 방금 끝낸 작업의 누락 수정, 작은 보완, 후속 검증 보강 같은 경우에 적합합니다
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
sduck reopen [slug]
|
|
174
|
+
```
|
|
175
|
+
|
|
159
176
|
## ✅ 상태 전이
|
|
160
177
|
|
|
161
178
|
```text
|
|
162
179
|
PENDING_SPEC_APPROVAL -> SPEC_APPROVED -> IN_PROGRESS -> DONE
|
|
180
|
+
DONE -> IN_PROGRESS (reopen)
|
|
163
181
|
```
|
|
164
182
|
|
|
165
183
|
- `start`: `PENDING_SPEC_APPROVAL`
|
|
166
184
|
- `spec approve`: `SPEC_APPROVED`
|
|
167
185
|
- `plan approve`: `IN_PROGRESS`
|
|
168
186
|
- `done`: `DONE`
|
|
187
|
+
- `reopen`: `DONE`인 task를 다시 열어 `IN_PROGRESS`로 되돌림
|
|
169
188
|
- `fast-track`: minimal spec/plan을 생성하고, 환경에 따라 `PENDING_SPEC_APPROVAL` 또는 `IN_PROGRESS`까지 진행
|
|
170
189
|
|
|
190
|
+
`reopen`은 기존 task의 연속 수정에 사용하고, 요구사항이 바뀌거나 범위가 커지면 새 task를 만드는 것을 권장합니다.
|
|
191
|
+
|
|
171
192
|
## 🧭 일반 흐름 vs fast-track
|
|
172
193
|
|
|
173
194
|
| 구분 | 일반 흐름 | fast-track |
|
package/dist/cli.js
CHANGED
|
@@ -1714,7 +1714,11 @@ function resolveReopenTarget(tasks, target) {
|
|
|
1714
1714
|
}
|
|
1715
1715
|
if (target === void 0 || target.trim() === "") {
|
|
1716
1716
|
if (candidates.length === 1) {
|
|
1717
|
-
|
|
1717
|
+
const [candidate] = candidates;
|
|
1718
|
+
if (candidate === void 0) {
|
|
1719
|
+
throw new Error("No DONE tasks found to reopen.");
|
|
1720
|
+
}
|
|
1721
|
+
return candidate;
|
|
1718
1722
|
}
|
|
1719
1723
|
throw new Error(
|
|
1720
1724
|
`Multiple DONE tasks found. Specify a target:
|
|
@@ -1724,11 +1728,19 @@ ${formatCandidateList(candidates)}`
|
|
|
1724
1728
|
const trimmedTarget = target.trim();
|
|
1725
1729
|
const idMatch = candidates.filter((task) => task.id === trimmedTarget);
|
|
1726
1730
|
if (idMatch.length === 1) {
|
|
1727
|
-
|
|
1731
|
+
const [match] = idMatch;
|
|
1732
|
+
if (match === void 0) {
|
|
1733
|
+
throw new Error(`No DONE task found matching '${trimmedTarget}'.`);
|
|
1734
|
+
}
|
|
1735
|
+
return match;
|
|
1728
1736
|
}
|
|
1729
1737
|
const slugMatch = candidates.filter((task) => task.slug === trimmedTarget);
|
|
1730
1738
|
if (slugMatch.length === 1) {
|
|
1731
|
-
|
|
1739
|
+
const [match] = slugMatch;
|
|
1740
|
+
if (match === void 0) {
|
|
1741
|
+
throw new Error(`No DONE task found matching '${trimmedTarget}'.`);
|
|
1742
|
+
}
|
|
1743
|
+
return match;
|
|
1732
1744
|
}
|
|
1733
1745
|
if (slugMatch.length > 1) {
|
|
1734
1746
|
throw new Error(
|
|
@@ -1920,7 +1932,7 @@ async function runStartCommand(type, slug, projectRoot) {
|
|
|
1920
1932
|
// package.json
|
|
1921
1933
|
var package_default = {
|
|
1922
1934
|
name: "@sduck/sduck-cli",
|
|
1923
|
-
version: "0.1.
|
|
1935
|
+
version: "0.1.8",
|
|
1924
1936
|
description: "Spec-Driven Development CLI bootstrap",
|
|
1925
1937
|
type: "module",
|
|
1926
1938
|
bin: {
|
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('Plan does not contain any valid `## Step N. 제목` or `### Step N. 제목` headers.');\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 return candidates[0]!;\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 return idMatch[0]!;\n }\n\n // slug exact match\n const slugMatch = candidates.filter((task) => task.slug === trimmedTarget);\n\n if (slugMatch.length === 1) {\n return slugMatch[0]!;\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.7\",\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/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"]}
|