@sanurb/ringi 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/config.ts","../src/cli/contracts.ts","../src/cli/commands.ts","../src/cli/parser.ts","../src/cli/runtime.ts","../src/cli/main.ts"],"names":["Layer","resolveReviewSelector","runReviewList","runReviewShow","runReviewExport","runSourceList","runSourceDiff","runReviewStatus","runTodoList","commandLabel","resolve","existsSync","Either2"],"mappings":"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","file":"cli.js","sourcesContent":["import * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\n\nexport type CliOutputMode = \"human\" | \"json\";\n\n/**\n * Captures the resolved CLI environment once so downstream layers do not each\n * read process state independently.\n */\nexport interface CliConfigShape {\n readonly color: boolean;\n readonly cwd: string;\n readonly dbPath: string;\n readonly outputMode: CliOutputMode;\n readonly quiet: boolean;\n readonly repoRoot: string;\n readonly verbose: boolean;\n}\n\nexport class CliConfig extends Context.Tag(\"@ringi/CliConfig\")<\n CliConfig,\n CliConfigShape\n>() {}\n\n/**\n * Wraps a concrete {@link CliConfigShape} in a layer for the Effect runtime.\n */\nexport const CliConfigLive = (config: CliConfigShape) =>\n Layer.succeed(CliConfig, config);\n","import * as Schema from \"effect/Schema\";\n\nimport type { ReviewSourceType, ReviewStatus } from \"@/api/schemas/review\";\n\nexport const ExitCode = {\n AuthFailure: 5,\n ResourceNotFound: 3,\n RuntimeFailure: 1,\n StateUnavailable: 4,\n Success: 0,\n UsageError: 2,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n// ---------------------------------------------------------------------------\n// Agent-first response envelope (RFC 9457-inspired)\n// ---------------------------------------------------------------------------\n\n/** Error family for agent routing logic — branch on category, not message text. */\nexport type ErrorCategory =\n | \"auth\"\n | \"config\"\n | \"conflict\"\n | \"connection\"\n | \"not_found\"\n | \"server\"\n | \"validation\";\n\n/** Machine-readable param descriptor for a HATEOAS next-action template. */\nexport interface NextActionParam {\n readonly default?: number | string;\n readonly description?: string;\n readonly enum?: readonly string[];\n readonly required?: boolean;\n readonly value?: number | string;\n}\n\n/**\n * A command the agent can run next. Literal commands omit `params`;\n * template commands use `<required>` / `[--flag <value>]` POSIX syntax\n * and include a `params` map so the agent knows what to fill.\n */\nexport interface NextAction {\n readonly command: string;\n readonly description: string;\n readonly params?: Readonly<Record<string, NextActionParam>>;\n}\n\n/** Structured error detail — stable fields agents can branch on. */\nexport interface CliErrorDetail {\n /** Error family for routing logic. */\n readonly category: ErrorCategory;\n /** Machine-readable error code, e.g. `REVIEW_NOT_FOUND`. */\n readonly code: string;\n /** Human-readable explanation of this occurrence. */\n readonly message: string;\n /** Whether a retry can succeed. */\n readonly retryable: boolean;\n /** Seconds to wait before retrying, when `retryable` is true. */\n readonly retry_after?: number;\n /** Documentation URI, e.g. `ringi://errors/REVIEW_NOT_FOUND`. */\n readonly type?: string;\n}\n\ninterface CliSuccessEnvelope<T> {\n readonly command: string;\n readonly next_actions: readonly NextAction[];\n readonly ok: true;\n readonly result: T;\n}\n\nexport interface CliErrorEnvelope {\n readonly command: string;\n readonly error: CliErrorDetail;\n /** Plain-language actionable guidance for the agent. */\n readonly fix: string;\n readonly next_actions: readonly NextAction[];\n readonly ok: false;\n}\n\n// --- Envelope factory helpers ------------------------------------------------\n\nexport const success = <T>(\n command: string,\n result: T,\n nextActions: readonly NextAction[] = []\n): CliSuccessEnvelope<T> => ({\n command,\n next_actions: nextActions,\n ok: true,\n result,\n});\n\nexport const failure = (\n command: string,\n error: CliErrorDetail,\n fix: string,\n nextActions: readonly NextAction[] = []\n): CliErrorEnvelope => ({\n command,\n error,\n fix,\n next_actions: nextActions,\n ok: false,\n});\n\nexport interface GlobalOptions {\n color: boolean;\n dbPath?: string;\n help: boolean;\n json: boolean;\n quiet: boolean;\n repo?: string;\n verbose: boolean;\n version: boolean;\n}\n\nexport interface CommandOutput<T> {\n readonly data: T;\n readonly human?: string;\n readonly nextActions?: readonly NextAction[];\n}\n\n/**\n * Carries an exit code and optional operator-facing details so callers can\n * present a short message without losing the underlying reason.\n */\nexport class CliFailure extends Schema.TaggedError<CliFailure>()(\"CliFailure\", {\n details: Schema.optional(Schema.String),\n exitCode: Schema.Number,\n message: Schema.String,\n}) {}\n\n/**\n * Normalized CLI intent shared by the parser and executors so command handlers\n * never have to reason about raw argv tokens.\n */\nexport type ParsedCommand =\n | { readonly kind: \"help\"; readonly topic: readonly string[] }\n | { readonly kind: \"version\" }\n | {\n readonly kind: \"review-list\";\n readonly limit: number;\n readonly page: number;\n readonly source?: ReviewSourceType;\n readonly status?: ReviewStatus;\n }\n | {\n readonly comments: boolean;\n readonly id: string;\n readonly kind: \"review-show\";\n readonly todos: boolean;\n }\n | {\n readonly id: string;\n readonly kind: \"review-export\";\n readonly noResolved: boolean;\n readonly noSnippets: boolean;\n readonly outputPath?: string;\n readonly stdout: boolean;\n }\n | {\n readonly branch?: string;\n readonly commits?: string;\n readonly kind: \"review-create\";\n readonly source: ReviewSourceType;\n readonly title?: string;\n }\n | {\n readonly kind: \"source-list\";\n }\n | {\n readonly branch?: string;\n readonly commits?: string;\n readonly kind: \"source-diff\";\n readonly source: ReviewSourceType;\n readonly stat: boolean;\n }\n | {\n readonly kind: \"todo-list\";\n readonly limit?: number;\n readonly offset: number;\n readonly reviewId?: string;\n readonly status: \"all\" | \"done\" | \"pending\";\n }\n | {\n readonly kind: \"todo-add\";\n readonly position?: number;\n readonly reviewId?: string;\n readonly text: string;\n }\n | {\n readonly id: string;\n readonly kind: \"todo-done\";\n }\n | {\n readonly id: string;\n readonly kind: \"todo-undone\";\n }\n | {\n readonly id: string;\n readonly kind: \"todo-move\";\n readonly position: number;\n }\n | {\n readonly id: string;\n readonly kind: \"todo-remove\";\n readonly yes: boolean;\n }\n | {\n readonly all: boolean;\n readonly doneOnly: boolean;\n readonly kind: \"todo-clear\";\n readonly reviewId?: string;\n readonly yes: boolean;\n }\n | {\n readonly kind: \"review-status\";\n readonly reviewId?: string;\n readonly source?: ReviewSourceType;\n }\n | {\n readonly allComments: boolean;\n readonly id: string;\n readonly kind: \"review-resolve\";\n readonly yes: boolean;\n }\n | {\n readonly auth: boolean;\n readonly cert?: string;\n readonly host: string;\n readonly https: boolean;\n readonly key?: string;\n readonly kind: \"serve\";\n readonly noOpen: boolean;\n readonly password?: string;\n readonly port: number;\n readonly username?: string;\n }\n | {\n readonly kind: \"mcp\";\n readonly logLevel: \"debug\" | \"error\" | \"info\" | \"silent\";\n readonly readonly: boolean;\n }\n | {\n readonly kind: \"doctor\";\n }\n | {\n readonly kind: \"data-migrate\";\n }\n | {\n readonly keepExports: boolean;\n readonly kind: \"data-reset\";\n readonly yes: boolean;\n }\n | {\n readonly kind: \"events\";\n readonly since?: number;\n readonly type?: \"comments\" | \"files\" | \"reviews\" | \"todos\";\n };\n","import { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport * as Effect from \"effect/Effect\";\n\nimport type { ReviewId } from \"@/api/schemas/review\";\nimport { CliConfig } from \"@/cli/config\";\nimport { CliFailure, ExitCode } from \"@/cli/contracts\";\nimport type { CommandOutput, NextAction, ParsedCommand } from \"@/cli/contracts\";\nimport { CommentService } from \"@/core/services/comment.service\";\nimport { getDiffSummary, parseDiff } from \"@/core/services/diff.service\";\nimport { ExportService } from \"@/core/services/export.service\";\nimport { GitService } from \"@/core/services/git.service\";\nimport { ReviewService } from \"@/core/services/review.service\";\nimport { TodoService } from \"@/core/services/todo.service\";\n\n// ---------------------------------------------------------------------------\n// View-model interfaces (decoupled from service response shapes)\n// ---------------------------------------------------------------------------\n\ninterface ReviewListRow {\n readonly createdAt: string;\n readonly fileCount: number;\n readonly id: string;\n readonly sourceType: string;\n readonly status: string;\n}\n\ninterface ReviewShowComment {\n readonly content: string;\n readonly filePath: string;\n readonly lineNumber: number | null;\n readonly resolved: boolean;\n}\n\ninterface ReviewShowFile {\n readonly additions: number;\n readonly deletions: number;\n readonly filePath: string;\n readonly status: string;\n}\n\ninterface ReviewShowSummary {\n readonly totalAdditions: number;\n readonly totalDeletions: number;\n readonly totalFiles: number;\n}\n\ninterface ReviewShowReview {\n readonly createdAt: string;\n readonly files: readonly ReviewShowFile[];\n readonly id: string;\n readonly sourceRef: string | null;\n readonly sourceType: string;\n readonly status: string;\n readonly summary: ReviewShowSummary;\n}\n\ninterface ReviewShowTodo {\n readonly completed: boolean;\n readonly content: string;\n readonly position: number;\n}\n\ninterface ReviewShowData {\n readonly comments?: readonly ReviewShowComment[];\n readonly review: ReviewShowReview;\n readonly todos?: readonly ReviewShowTodo[];\n}\n\ninterface TodoListItem {\n readonly completed: boolean;\n readonly content: string;\n readonly position: number;\n}\n\ninterface SourceListBranch {\n readonly current: boolean;\n readonly name: string;\n}\n\ninterface SourceListCommit {\n readonly author: string;\n readonly hash: string;\n readonly message: string;\n}\n\ninterface SourceListRepo {\n readonly branch: string;\n readonly name: string;\n readonly path: string;\n readonly remote: string | null;\n}\n\ninterface SourceListStagedFile {\n readonly path: string;\n readonly status: string;\n}\n\ninterface SourceListData {\n readonly branches: readonly SourceListBranch[];\n readonly commits: readonly SourceListCommit[];\n readonly repo: SourceListRepo;\n readonly stagedFiles: readonly SourceListStagedFile[];\n}\n\n// ---------------------------------------------------------------------------\n// Renderers (pure functions, no effects)\n// ---------------------------------------------------------------------------\n\nconst formatTable = (\n headers: readonly string[],\n rows: readonly (readonly string[])[]\n): string => {\n const widths = headers.map((header, index) => {\n const cellWidths = rows.map((row) => row[index]?.length ?? 0);\n return Math.max(header.length, ...cellWidths);\n });\n\n const renderRow = (row: readonly string[]) =>\n row\n .map((cell, index) => cell.padEnd(widths.at(index) ?? 0))\n .join(\" \")\n .trimEnd();\n\n return [\n renderRow(headers),\n renderRow(widths.map((width) => \"-\".repeat(width))),\n ...rows.map(renderRow),\n ].join(\"\\n\");\n};\n\nconst renderReviewList = (reviews: readonly ReviewListRow[]): string => {\n if (reviews.length === 0) {\n return \"No reviews found.\";\n }\n\n return formatTable(\n [\"ID\", \"STATUS\", \"SOURCE\", \"FILES\", \"CREATED\"],\n reviews.map((review) => [\n review.id,\n review.status,\n review.sourceType,\n String(review.fileCount),\n review.createdAt,\n ])\n );\n};\n\nconst renderReviewShow = (input: ReviewShowData): string => {\n const { comments, review, todos } = input;\n const lines = [\n `Review ${review.id}`,\n `Status: ${review.status}`,\n `Source: ${review.sourceType}${review.sourceRef ? ` (${review.sourceRef})` : \"\"}`,\n `Created: ${review.createdAt}`,\n `Files: ${review.summary.totalFiles}`,\n `Diff: +${review.summary.totalAdditions} / -${review.summary.totalDeletions}`,\n ];\n\n if (review.files.length > 0) {\n lines.push(\"\", \"Files:\");\n for (const file of review.files) {\n lines.push(\n `- ${file.status.toUpperCase()} ${file.filePath} (+${file.additions} -${file.deletions})`\n );\n }\n }\n\n if (comments && comments.length > 0) {\n lines.push(\"\", \"Comments:\");\n for (const comment of comments) {\n const location = `${comment.filePath}:${comment.lineNumber ?? \"-\"}`;\n const state = comment.resolved ? \"resolved\" : \"open\";\n lines.push(`- [${state}] ${location} ${comment.content}`);\n }\n }\n\n if (todos && todos.length > 0) {\n lines.push(\"\", \"Todos:\");\n for (const todo of todos) {\n const marker = todo.completed ? \"x\" : \" \";\n lines.push(`- [${marker}] (${todo.position + 1}) ${todo.content}`);\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderTodoList = (todos: readonly TodoListItem[]): string => {\n if (todos.length === 0) {\n return \"No todos found.\";\n }\n\n return todos\n .map(\n (todo) =>\n `- [${todo.completed ? \"x\" : \" \"}] (${todo.position + 1}) ${todo.content}`\n )\n .join(\"\\n\");\n};\n\nconst renderSourceList = (input: SourceListData): string => {\n const lines = [\n `Repository: ${input.repo.name}`,\n `Path: ${input.repo.path}`,\n `Current branch: ${input.repo.branch}`,\n `Staged files: ${input.stagedFiles.length}`,\n ];\n\n if (input.stagedFiles.length > 0) {\n lines.push(\"\", \"Staged:\");\n for (const file of input.stagedFiles) {\n lines.push(`- ${file.status} ${file.path}`);\n }\n }\n\n if (input.branches.length > 0) {\n lines.push(\"\", \"Branches:\");\n for (const branch of input.branches.slice(0, 10)) {\n lines.push(`- ${branch.current ? \"*\" : \" \"} ${branch.name}`);\n }\n }\n\n if (input.commits.length > 0) {\n lines.push(\"\", \"Recent commits:\");\n for (const commit of input.commits.slice(0, 5)) {\n lines.push(\n `- ${commit.hash.slice(0, 8)} ${commit.message} (${commit.author})`\n );\n }\n }\n\n return lines.join(\"\\n\");\n};\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the special \"last\" selector before show/export handlers ask the\n * shared services for a concrete review id.\n */\nconst resolveReviewSelector = Effect.fn(\"CLI.resolveReviewSelector\")(\n function* resolveReviewSelector(selector: string) {\n if (selector !== \"last\") {\n return selector as ReviewId;\n }\n\n const cliConfig = yield* CliConfig;\n const reviewService = yield* ReviewService;\n const result = yield* reviewService.list({\n page: 1,\n pageSize: 1,\n repositoryPath: cliConfig.repoRoot,\n });\n const [review] = result.reviews;\n\n if (!review) {\n return yield* new CliFailure({\n exitCode: ExitCode.ResourceNotFound,\n message: \"No review sessions exist for this repository yet.\",\n });\n }\n\n return review.id;\n }\n);\n\n/**\n * Mutating CLI commands stay server-backed so they share the same write path as\n * the other clients instead of growing a second local-only behavior surface.\n */\nconst requireServerMode = (label: string) =>\n Effect.fail(\n new CliFailure({\n details: \"Start 'ringi serve' and retry the command.\",\n exitCode: ExitCode.StateUnavailable,\n message: `${label} requires a running local Ringi server. Standalone local writes are intentionally unsupported.`,\n })\n );\n\n// ---------------------------------------------------------------------------\n// Diff source strategies (replaces switch in runSourceDiff)\n// ---------------------------------------------------------------------------\n\ntype DiffSourceStrategy = (\n git: GitService,\n command: Extract<ParsedCommand, { kind: \"source-diff\" }>\n) => Effect.Effect<string, unknown>;\n\nconst diffSourceStrategies: Readonly<Record<string, DiffSourceStrategy>> = {\n branch: (git, command) => git.getBranchDiff(command.branch ?? \"\"),\n commits: (git, command) =>\n git.getCommitDiff(\n (command.commits ?? \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n ),\n staged: (git) => git.getStagedDiff,\n};\n\n// ---------------------------------------------------------------------------\n// Command handlers (Effect.fn for tracing)\n// ---------------------------------------------------------------------------\n\nconst runReviewList = Effect.fn(\"CLI.reviewList\")(function* runReviewList(\n command: Extract<ParsedCommand, { kind: \"review-list\" }>\n) {\n const reviewService = yield* ReviewService;\n const cliConfig = yield* CliConfig;\n const result = yield* reviewService.list({\n page: command.page,\n pageSize: command.limit,\n repositoryPath: cliConfig.repoRoot,\n sourceType: command.source,\n status: command.status,\n });\n\n const nextActions: NextAction[] = [];\n for (const review of result.reviews.slice(0, 3)) {\n nextActions.push({\n command: `ringi review show ${review.id} --comments --todos`,\n description: `Inspect review ${review.id} (${review.status})`,\n });\n }\n if (result.reviews.length > 0) {\n nextActions.push({\n command: \"ringi review show <id> [--comments] [--todos]\",\n description: \"Show full review details\",\n params: {\n id: { description: \"Review ID or 'last'\", required: true },\n },\n });\n }\n nextActions.push({\n command: \"ringi review create [--source <source>]\",\n description: \"Create a new review session\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n });\n\n return {\n data: result,\n human: renderReviewList(result.reviews),\n nextActions,\n } satisfies CommandOutput<typeof result>;\n});\n\nconst runReviewShow = Effect.fn(\"CLI.reviewShow\")(function* runReviewShow(\n command: Extract<ParsedCommand, { kind: \"review-show\" }>\n) {\n const reviewService = yield* ReviewService;\n const todoService = yield* TodoService;\n const commentService = yield* CommentService;\n const reviewId = yield* resolveReviewSelector(command.id);\n const review = yield* reviewService.getById(reviewId);\n const comments = command.comments\n ? yield* commentService.getByReview(reviewId)\n : undefined;\n const todos = command.todos\n ? (yield* todoService.list({ reviewId })).data\n : undefined;\n\n const data = { comments, review, todos };\n const nextActions: NextAction[] = [\n {\n command: `ringi review export ${reviewId}`,\n description: \"Export this review as markdown\",\n },\n {\n command: `ringi review show ${reviewId} --comments --todos`,\n description: \"Show with comments and todos\",\n },\n {\n command: \"ringi todo list [--review <review-id>] [--status <status>]\",\n description: \"List todos for this review\",\n params: {\n \"review-id\": { value: reviewId },\n status: { default: \"pending\", enum: [\"pending\", \"done\", \"all\"] },\n },\n },\n {\n command: \"ringi review list\",\n description: \"Back to review list\",\n },\n ];\n\n return {\n data,\n human: renderReviewShow(data),\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runReviewExport = Effect.fn(\"CLI.reviewExport\")(function* runReviewExport(\n command: Extract<ParsedCommand, { kind: \"review-export\" }>\n) {\n if (command.noResolved || command.noSnippets) {\n yield* new CliFailure({\n exitCode: ExitCode.UsageError,\n message:\n \"--no-resolved and --no-snippets are documented, but the shared export service does not support adapter-level filtering yet.\",\n });\n }\n\n const exportService = yield* ExportService;\n const cliConfig = yield* CliConfig;\n const reviewId = yield* resolveReviewSelector(command.id);\n const markdown = yield* exportService.exportReview(reviewId);\n const outputPath = command.outputPath\n ? resolve(cliConfig.cwd, command.outputPath)\n : undefined;\n\n if (outputPath) {\n yield* Effect.tryPromise({\n catch: (error) =>\n new CliFailure({\n exitCode: ExitCode.RuntimeFailure,\n message: `Failed to write export to ${outputPath}: ${String(error)}`,\n }),\n try: () => writeFile(outputPath, markdown, \"utf8\"),\n });\n }\n\n const shouldPrintMarkdown = command.stdout || !outputPath;\n const data = { markdown, outputPath: outputPath ?? null, reviewId };\n\n const nextActions: NextAction[] = [\n {\n command: `ringi review show ${reviewId}`,\n description: \"View the exported review\",\n },\n {\n command: \"ringi review list\",\n description: \"Back to review list\",\n },\n ];\n\n return {\n data,\n human: shouldPrintMarkdown\n ? markdown\n : `Exported review ${reviewId} to ${outputPath}.`,\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runSourceList = Effect.fn(\"CLI.sourceList\")(function* runSourceList() {\n const gitService = yield* GitService;\n const repo = yield* gitService.getRepositoryInfo;\n const stagedFiles = yield* gitService.getStagedFiles;\n const branches = yield* gitService.getBranches;\n const commitsResult = yield* gitService.getCommits({\n limit: 10,\n offset: 0,\n });\n const data = {\n branches,\n commits: commitsResult.commits,\n repo,\n stagedFiles,\n };\n\n const nextActions: NextAction[] = [\n {\n command: \"ringi source diff <source> [--stat]\",\n description: \"View diff for a source\",\n params: {\n source: { enum: [\"staged\", \"branch\", \"commits\"] },\n },\n },\n {\n command: \"ringi review create [--source <source>]\",\n description: \"Create a review from a source\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n },\n {\n command: \"ringi review list\",\n description: \"List existing reviews\",\n },\n ];\n\n return {\n data,\n human: renderSourceList(data),\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runSourceDiff = Effect.fn(\"CLI.sourceDiff\")(function* runSourceDiff(\n command: Extract<ParsedCommand, { kind: \"source-diff\" }>\n) {\n const gitService = yield* GitService;\n const strategy = diffSourceStrategies[command.source];\n\n if (!strategy) {\n return yield* new CliFailure({\n exitCode: ExitCode.UsageError,\n message: \"Unsupported review source.\",\n });\n }\n\n const diffText = yield* strategy(gitService, command);\n\n if (!diffText.trim()) {\n yield* new CliFailure({\n exitCode: ExitCode.RuntimeFailure,\n message: \"No diff available for the requested source.\",\n });\n }\n\n const files = parseDiff(diffText);\n const data = {\n diff: diffText,\n source: command.source,\n summary: getDiffSummary(files),\n };\n\n const nextActions: NextAction[] = [\n {\n command: `ringi review create --source ${command.source}`,\n description: `Create a review from this ${command.source} diff`,\n },\n {\n command: \"ringi source list\",\n description: \"List repository sources\",\n },\n ];\n\n return {\n data,\n human: command.stat\n ? [\n `Source: ${command.source}`,\n `Files: ${data.summary.totalFiles}`,\n `Additions: ${data.summary.totalAdditions}`,\n `Deletions: ${data.summary.totalDeletions}`,\n ].join(\"\\n\")\n : diffText,\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runReviewStatus = Effect.fn(\"CLI.reviewStatus\")(function* runReviewStatus(\n command: Extract<ParsedCommand, { kind: \"review-status\" }>\n) {\n const reviewService = yield* ReviewService;\n const todoService = yield* TodoService;\n const commentService = yield* CommentService;\n const gitService = yield* GitService;\n const cliConfig = yield* CliConfig;\n\n const repo = yield* gitService.getRepositoryInfo;\n const stagedFiles = yield* gitService.getStagedFiles;\n\n // Resolve which review to show status for\n let reviewId: string | undefined;\n if (command.reviewId) {\n reviewId = yield* resolveReviewSelector(command.reviewId);\n }\n\n // Get the latest review if none specified\n const reviews = yield* reviewService.list({\n page: 1,\n pageSize: 1,\n repositoryPath: cliConfig.repoRoot,\n sourceType: command.source,\n });\n const latestReview = reviewId\n ? yield* reviewService.getById(reviewId as ReviewId)\n : reviews.reviews[0];\n\n let commentStats:\n | { resolved: number; total: number; unresolved: number }\n | undefined;\n let todoStats:\n | { completed: number; pending: number; total: number }\n | undefined;\n\n if (latestReview) {\n commentStats = yield* commentService.getStats(latestReview.id);\n todoStats = yield* todoService.getStats();\n }\n\n const data = {\n commentStats: commentStats ?? null,\n repository: {\n branch: repo.branch,\n name: repo.name,\n path: repo.path,\n stagedFileCount: stagedFiles.length,\n },\n review: latestReview\n ? {\n createdAt: latestReview.createdAt,\n id: latestReview.id,\n sourceType: latestReview.sourceType,\n status: latestReview.status,\n }\n : null,\n todoStats: todoStats ?? null,\n };\n\n const lines = [\n `Repository: ${repo.name}`,\n `Branch: ${repo.branch}`,\n `Staged files: ${stagedFiles.length}`,\n ];\n\n if (latestReview) {\n lines.push(\n \"\",\n `Review: ${latestReview.id}`,\n `Status: ${latestReview.status}`,\n `Source: ${latestReview.sourceType}`\n );\n if (commentStats) {\n lines.push(\n `Comments: ${commentStats.unresolved ?? 0} unresolved / ${commentStats.total} total`\n );\n }\n if (todoStats) {\n lines.push(\n `Todos: ${todoStats.pending} pending / ${todoStats.total} total`\n );\n }\n } else {\n lines.push(\"\", \"No review sessions found.\");\n }\n\n const nextActions: NextAction[] = [];\n if (latestReview) {\n nextActions.push(\n {\n command: `ringi review show ${latestReview.id} --comments --todos`,\n description: \"Inspect the latest review\",\n },\n {\n command: `ringi review export ${latestReview.id}`,\n description: \"Export the latest review\",\n }\n );\n }\n nextActions.push({\n command: \"ringi review create [--source <source>]\",\n description: \"Create a new review session\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n });\n\n return {\n data,\n human: lines.join(\"\\n\"),\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runTodoList = Effect.fn(\"CLI.todoList\")(function* runTodoList(\n command: Extract<ParsedCommand, { kind: \"todo-list\" }>\n) {\n const todoService = yield* TodoService;\n const result = yield* todoService.list({\n completed: command.status === \"all\" ? undefined : command.status === \"done\",\n limit: command.limit,\n offset: command.offset,\n reviewId: command.reviewId,\n });\n\n const nextActions: NextAction[] = [];\n if (command.reviewId) {\n nextActions.push({\n command: `ringi review show ${command.reviewId}`,\n description: \"View the associated review\",\n });\n }\n nextActions.push(\n {\n command: \"ringi todo add --text <text> [--review <review-id>]\",\n description: \"Add a new todo\",\n params: {\n text: { description: \"Todo text\", required: true },\n },\n },\n {\n command: \"ringi review list\",\n description: \"List reviews\",\n }\n );\n\n return {\n data: result,\n human: renderTodoList(result.data),\n nextActions,\n } satisfies CommandOutput<typeof result>;\n});\n\n// ---------------------------------------------------------------------------\n// Command registry (replaces switch-based dispatch)\n// ---------------------------------------------------------------------------\n\ntype CommandHandler = (\n command: ParsedCommand\n) => Effect.Effect<CommandOutput<unknown>, unknown, unknown>;\n\n/**\n * Data-driven command registry. Each command kind maps to its handler.\n * Adding a new command means adding one entry — no switch duplication.\n */\nconst COMMAND_HANDLERS: Readonly<Record<string, CommandHandler>> = {\n \"data-migrate\": () => requireServerMode(\"ringi data migrate\"),\n \"data-reset\": () => requireServerMode(\"ringi data reset\"),\n doctor: () =>\n Effect.succeed({\n data: { checks: [], ok: true },\n human: \"ringi doctor: not yet implemented.\",\n nextActions: [],\n } satisfies CommandOutput<unknown>),\n events: () => requireServerMode(\"ringi events\"),\n mcp: () =>\n Effect.fail(\n new CliFailure({\n exitCode: ExitCode.UsageError,\n message:\n \"ringi mcp is a runtime command. Use it directly, not through the command dispatcher.\",\n })\n ),\n \"review-create\": () => requireServerMode(\"ringi review create\"),\n \"review-export\": (c) =>\n runReviewExport(c as Extract<ParsedCommand, { kind: \"review-export\" }>),\n \"review-list\": (c) =>\n runReviewList(c as Extract<ParsedCommand, { kind: \"review-list\" }>),\n \"review-resolve\": () => requireServerMode(\"ringi review resolve\"),\n \"review-show\": (c) =>\n runReviewShow(c as Extract<ParsedCommand, { kind: \"review-show\" }>),\n \"review-status\": (c) =>\n runReviewStatus(c as Extract<ParsedCommand, { kind: \"review-status\" }>),\n serve: () =>\n Effect.fail(\n new CliFailure({\n exitCode: ExitCode.UsageError,\n message:\n \"ringi serve is a runtime command. Use it directly, not through the command dispatcher.\",\n })\n ),\n \"source-diff\": (c) =>\n runSourceDiff(c as Extract<ParsedCommand, { kind: \"source-diff\" }>),\n \"source-list\": () => runSourceList(),\n \"todo-add\": () => requireServerMode(\"ringi todo add\"),\n \"todo-clear\": () => requireServerMode(\"ringi todo clear\"),\n \"todo-done\": () => requireServerMode(\"ringi todo done\"),\n \"todo-list\": (c) =>\n runTodoList(c as Extract<ParsedCommand, { kind: \"todo-list\" }>),\n \"todo-move\": () => requireServerMode(\"ringi todo move\"),\n \"todo-remove\": () => requireServerMode(\"ringi todo remove\"),\n \"todo-undone\": () => requireServerMode(\"ringi todo undone\"),\n};\n\n/** Human-readable command label for the JSON envelope `command` field. */\nconst COMMAND_LABELS: Readonly<Record<string, string>> = {\n \"data-migrate\": \"ringi data migrate\",\n \"data-reset\": \"ringi data reset\",\n doctor: \"ringi doctor\",\n events: \"ringi events\",\n mcp: \"ringi mcp\",\n \"review-create\": \"ringi review create\",\n \"review-export\": \"ringi review export\",\n \"review-list\": \"ringi review list\",\n \"review-resolve\": \"ringi review resolve\",\n \"review-show\": \"ringi review show\",\n \"review-status\": \"ringi review status\",\n serve: \"ringi serve\",\n \"source-diff\": \"ringi source diff\",\n \"source-list\": \"ringi source list\",\n \"todo-add\": \"ringi todo add\",\n \"todo-clear\": \"ringi todo clear\",\n \"todo-done\": \"ringi todo done\",\n \"todo-list\": \"ringi todo list\",\n \"todo-move\": \"ringi todo move\",\n \"todo-remove\": \"ringi todo remove\",\n \"todo-undone\": \"ringi todo undone\",\n};\n\nexport const commandLabel = (command: ParsedCommand): string =>\n COMMAND_LABELS[command.kind] ?? `ringi ${command.kind}`;\n\nexport const runCommand = (command: ParsedCommand) => {\n const handler = COMMAND_HANDLERS[command.kind];\n if (!handler) {\n return Effect.fail(\n new CliFailure({\n exitCode: ExitCode.UsageError,\n message: `No executable handler exists for ${command.kind}.`,\n })\n );\n }\n return handler(command);\n};\n","import * as Either from \"effect/Either\";\nimport * as Option from \"effect/Option\";\n\nimport type { ReviewSourceType, ReviewStatus } from \"@/api/schemas/review\";\nimport { CliFailure, ExitCode } from \"@/cli/contracts\";\nimport type { GlobalOptions, ParsedCommand } from \"@/cli/contracts\";\n\n// ---------------------------------------------------------------------------\n// Shared validation sets\n// ---------------------------------------------------------------------------\n\nconst REVIEW_SOURCES = new Set<ReviewSourceType>([\n \"branch\",\n \"commits\",\n \"staged\",\n]);\nconst REVIEW_STATUSES = new Set<ReviewStatus>([\n \"approved\",\n \"changes_requested\",\n \"in_progress\",\n]);\nconst TODO_STATUSES = new Set<string>([\"all\", \"done\", \"pending\"]);\n\n// ---------------------------------------------------------------------------\n// Parse state\n// ---------------------------------------------------------------------------\n\ninterface ParseState {\n index: number;\n readonly options: GlobalOptions;\n readonly tokens: readonly string[];\n}\n\ntype ParseResult = Either.Either<ParsedCommand, CliFailure>;\n\nconst usageError = (message: string): CliFailure =>\n new CliFailure({ exitCode: ExitCode.UsageError, message });\n\n// ---------------------------------------------------------------------------\n// Reusable value extractors\n// ---------------------------------------------------------------------------\n\n/**\n * Consumes the next token as a flag value, advancing the cursor by 2.\n * Rejects another flag in the value slot so typos fail fast.\n */\nconst requireValue = (\n state: ParseState,\n flag: string\n): Option.Option<CliFailure> => {\n const value = state.tokens[state.index + 1];\n if (!value || value.startsWith(\"-\")) {\n return Option.some(usageError(`Missing value for ${flag}.`));\n }\n state.index += 2;\n return Option.none();\n};\n\n/** Peek at the value that {@link requireValue} would consume. */\nconst peekValue = (state: ParseState): string =>\n state.tokens[state.index + 1] ?? \"\";\n\nconst decodePositiveInt = (\n raw: string,\n flag: string\n): Either.Either<number, CliFailure> => {\n const value = Number.parseInt(raw, 10);\n if (!Number.isInteger(value) || value < 0) {\n return Either.left(usageError(`${flag} must be a non-negative integer.`));\n }\n return Either.right(value);\n};\n\nconst decodeEnum = <T extends string>(\n raw: string,\n valid: ReadonlySet<T>,\n label: string\n): Either.Either<T, CliFailure> => {\n if (!valid.has(raw as T)) {\n return Either.left(usageError(`Invalid ${label}: ${raw}.`));\n }\n return Either.right(raw as T);\n};\n\n// ---------------------------------------------------------------------------\n// Flag handler framework\n// ---------------------------------------------------------------------------\n\n/**\n * A flag handler receives the parse state and a mutable accumulator.\n * It returns `Option.some(CliFailure)` on error, `Option.none()` on success.\n * Cursor advancement is handled by the handler (1 for booleans, 2 for values\n * via {@link requireValue}).\n */\ntype FlagHandler<Acc> = (\n state: ParseState,\n acc: Acc\n) => Option.Option<CliFailure>;\n\n// -- Flag handler factories -------------------------------------------------\n\n/** Boolean flag: sets a key to `true`, advances cursor by 1. */\nconst boolFlag =\n <Acc>(key: keyof Acc & string): FlagHandler<Acc> =>\n (state, acc) => {\n (acc as Record<string, unknown>)[key] = true;\n state.index += 1;\n return Option.none();\n };\n\n/** String flag: consumes next token, assigns to key. */\nconst stringFlag =\n <Acc>(key: keyof Acc & string): FlagHandler<Acc> =>\n (state, acc) => {\n const flag = state.tokens[state.index] ?? \"\";\n const value = peekValue(state);\n const error = requireValue(state, flag);\n if (Option.isSome(error)) {\n return error;\n }\n (acc as Record<string, unknown>)[key] = value;\n return Option.none();\n };\n\n/** Positive integer flag with an optional minimum (exclusive). */\nconst positiveIntFlag =\n <Acc>(\n key: keyof Acc & string,\n opts?: { readonly min?: number }\n ): FlagHandler<Acc> =>\n (state, acc) => {\n const flag = state.tokens[state.index] ?? \"\";\n const raw = peekValue(state);\n const error = requireValue(state, flag);\n if (Option.isSome(error)) {\n return error;\n }\n const decoded = decodePositiveInt(raw, flag);\n if (Either.isLeft(decoded)) {\n return Option.some(decoded.left);\n }\n if (opts?.min !== undefined && decoded.right <= opts.min) {\n return Option.some(\n usageError(`${flag} must be greater than ${opts.min}.`)\n );\n }\n (acc as Record<string, unknown>)[key] = decoded.right;\n return Option.none();\n };\n\n/** Enum flag: consumes next token, validates membership, assigns to key. */\nconst enumFlag =\n <Acc>(\n key: keyof Acc & string,\n valid: ReadonlySet<string>,\n label: string\n ): FlagHandler<Acc> =>\n (state, acc) => {\n const flag = state.tokens[state.index] ?? \"\";\n const raw = peekValue(state);\n const error = requireValue(state, flag);\n if (Option.isSome(error)) {\n return error;\n }\n const decoded = decodeEnum(raw, valid, label);\n if (Either.isLeft(decoded)) {\n return Option.some(decoded.left);\n }\n (acc as Record<string, unknown>)[key] = decoded.right;\n return Option.none();\n };\n\n// ---------------------------------------------------------------------------\n// Global flags (must precede runFlagLoop which calls maybeParseGlobalFlag)\n// ---------------------------------------------------------------------------\n\nconst createDefaultOptions = (): GlobalOptions => ({\n color: true,\n dbPath: undefined,\n help: false,\n json: false,\n quiet: false,\n repo: undefined,\n verbose: false,\n version: false,\n});\n\n/**\n * Global flags are accepted before or after subcommands because wrappers often\n * prepend them without preserving the CLI's preferred ordering.\n */\nconst GLOBAL_FLAG_HANDLERS: Readonly<\n Record<string, FlagHandler<GlobalOptions>>\n> = {\n \"--db-path\": stringFlag(\"dbPath\"),\n \"--help\": boolFlag(\"help\"),\n \"--json\": boolFlag(\"json\"),\n \"--no-color\": (state, acc) => {\n acc.color = false;\n state.index += 1;\n return Option.none();\n },\n \"--quiet\": boolFlag(\"quiet\"),\n \"--repo\": stringFlag(\"repo\"),\n \"--verbose\": boolFlag(\"verbose\"),\n \"--version\": boolFlag(\"version\"),\n};\n\nconst maybeParseGlobalFlag = (state: ParseState): boolean => {\n const token = state.tokens[state.index];\n if (!token) {\n return false;\n }\n const handler = GLOBAL_FLAG_HANDLERS[token];\n if (!handler) {\n return false;\n }\n // Global flag handlers do not fail — they just set values.\n handler(state, state.options);\n return true;\n};\n\n// -- Generic flag loop runner -----------------------------------------------\n\n/**\n * Consumes all remaining tokens in {@link state} by dispatching to the matching\n * handler in {@link handlers}. Global flags are tried first. Unknown flags\n * produce a usage error naming the {@link commandLabel}.\n */\nconst runFlagLoop = <Acc>(\n state: ParseState,\n acc: Acc,\n handlers: Readonly<Record<string, FlagHandler<Acc>>>,\n commandLabel: string\n): Option.Option<CliFailure> => {\n while (state.index < state.tokens.length) {\n if (maybeParseGlobalFlag(state)) {\n continue;\n }\n const token = state.tokens[state.index] ?? \"\";\n const handler = handlers[token];\n if (!handler) {\n return Option.some(\n usageError(`Unknown flag for ${commandLabel}: ${token}.`)\n );\n }\n const error = handler(state, acc);\n if (Option.isSome(error)) {\n return error;\n }\n }\n return Option.none();\n};\n\n// ---------------------------------------------------------------------------\n// Command parsers (table-driven)\n// ---------------------------------------------------------------------------\n\n// -- review list ------------------------------------------------------------\n\ninterface ReviewListAcc {\n limit: number;\n page: number;\n source: ReviewSourceType | undefined;\n status: ReviewStatus | undefined;\n}\n\nconst REVIEW_LIST_FLAGS: Readonly<Record<string, FlagHandler<ReviewListAcc>>> =\n {\n \"--limit\": positiveIntFlag(\"limit\", { min: 0 }),\n \"--page\": positiveIntFlag(\"page\", { min: 0 }),\n \"--source\": enumFlag(\"source\", REVIEW_SOURCES, \"review source\"),\n \"--status\": enumFlag(\"status\", REVIEW_STATUSES, \"review status\"),\n };\n\nconst parseReviewList = (state: ParseState): ParseResult => {\n const acc: ReviewListAcc = {\n limit: 20,\n page: 1,\n source: undefined,\n status: undefined,\n };\n const error = runFlagLoop(state, acc, REVIEW_LIST_FLAGS, \"review list\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"review-list\" as const, ...acc });\n};\n\n// -- review show ------------------------------------------------------------\n\ninterface ReviewShowAcc {\n comments: boolean;\n todos: boolean;\n}\n\nconst REVIEW_SHOW_FLAGS: Readonly<Record<string, FlagHandler<ReviewShowAcc>>> =\n {\n \"--comments\": boolFlag(\"comments\"),\n \"--todos\": boolFlag(\"todos\"),\n };\n\nconst parseReviewShow = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"review show requires <id|last>.\"));\n }\n state.index += 1;\n\n const acc: ReviewShowAcc = { comments: false, todos: false };\n const error = runFlagLoop(state, acc, REVIEW_SHOW_FLAGS, \"review show\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"review-show\" as const, ...acc });\n};\n\n// -- review export ----------------------------------------------------------\n\ninterface ReviewExportAcc {\n noResolved: boolean;\n noSnippets: boolean;\n outputPath: string | undefined;\n stdout: boolean;\n}\n\nconst REVIEW_EXPORT_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewExportAcc>>\n> = {\n \"--no-resolved\": boolFlag(\"noResolved\"),\n \"--no-snippets\": boolFlag(\"noSnippets\"),\n \"--output\": stringFlag(\"outputPath\"),\n \"--stdout\": boolFlag(\"stdout\"),\n};\n\nconst parseReviewExport = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"review export requires <id|last>.\"));\n }\n state.index += 1;\n\n const acc: ReviewExportAcc = {\n noResolved: false,\n noSnippets: false,\n outputPath: undefined,\n stdout: false,\n };\n const error = runFlagLoop(state, acc, REVIEW_EXPORT_FLAGS, \"review export\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"review-export\" as const, ...acc });\n};\n\n// -- review create ----------------------------------------------------------\n\ninterface ReviewCreateAcc {\n branch: string | undefined;\n commits: string | undefined;\n source: ReviewSourceType;\n title: string | undefined;\n}\n\nconst REVIEW_CREATE_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewCreateAcc>>\n> = {\n \"--branch\": stringFlag(\"branch\"),\n \"--commits\": stringFlag(\"commits\"),\n \"--source\": enumFlag(\"source\", REVIEW_SOURCES, \"review source\"),\n \"--title\": stringFlag(\"title\"),\n};\n\nconst validateReviewCreate = (\n acc: ReviewCreateAcc\n): Option.Option<CliFailure> => {\n if (acc.source === \"branch\" && !acc.branch) {\n return Option.some(\n usageError(\"review create --source branch requires --branch.\")\n );\n }\n if (acc.source === \"commits\" && !acc.commits) {\n return Option.some(\n usageError(\"review create --source commits requires --commits.\")\n );\n }\n if (acc.source === \"staged\" && (acc.branch || acc.commits)) {\n return Option.some(\n usageError(\n \"review create --source staged does not accept --branch or --commits.\"\n )\n );\n }\n return Option.none();\n};\n\nconst parseReviewCreate = (state: ParseState): ParseResult => {\n const acc: ReviewCreateAcc = {\n branch: undefined,\n commits: undefined,\n source: \"staged\",\n title: undefined,\n };\n const error = runFlagLoop(state, acc, REVIEW_CREATE_FLAGS, \"review create\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n const validationError = validateReviewCreate(acc);\n if (Option.isSome(validationError)) {\n return Either.left(validationError.value);\n }\n return Either.right({ kind: \"review-create\" as const, ...acc });\n};\n\n// -- source diff ------------------------------------------------------------\n\ninterface SourceDiffAcc {\n branch: string | undefined;\n commits: string | undefined;\n stat: boolean;\n}\n\nconst SOURCE_DIFF_FLAGS: Readonly<Record<string, FlagHandler<SourceDiffAcc>>> =\n {\n \"--branch\": stringFlag(\"branch\"),\n \"--commits\": stringFlag(\"commits\"),\n \"--stat\": boolFlag(\"stat\"),\n };\n\nconst validateSourceDiff = (\n source: ReviewSourceType,\n acc: SourceDiffAcc\n): Option.Option<CliFailure> => {\n if (source === \"branch\" && !acc.branch) {\n return Option.some(usageError(\"source diff branch requires --branch.\"));\n }\n if (source === \"commits\" && !acc.commits) {\n return Option.some(usageError(\"source diff commits requires --commits.\"));\n }\n return Option.none();\n};\n\nconst parseSourceDiff = (state: ParseState): ParseResult => {\n const source = state.tokens[state.index] as ReviewSourceType | undefined;\n if (!source || !REVIEW_SOURCES.has(source)) {\n return Either.left(\n usageError(\"source diff requires <staged|branch|commits>.\")\n );\n }\n state.index += 1;\n\n const acc: SourceDiffAcc = {\n branch: undefined,\n commits: undefined,\n stat: false,\n };\n const error = runFlagLoop(state, acc, SOURCE_DIFF_FLAGS, \"source diff\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n const validationError = validateSourceDiff(source, acc);\n if (Option.isSome(validationError)) {\n return Either.left(validationError.value);\n }\n return Either.right({ kind: \"source-diff\" as const, source, ...acc });\n};\n\n// -- todo list --------------------------------------------------------------\n\ninterface TodoListAcc {\n limit: number | undefined;\n offset: number;\n reviewId: string | undefined;\n status: \"all\" | \"done\" | \"pending\";\n}\n\nconst TODO_LIST_FLAGS: Readonly<Record<string, FlagHandler<TodoListAcc>>> = {\n \"--limit\": positiveIntFlag(\"limit\"),\n \"--offset\": positiveIntFlag(\"offset\"),\n \"--review\": stringFlag(\"reviewId\"),\n \"--status\": enumFlag(\"status\", TODO_STATUSES, \"todo status\"),\n};\n\nconst parseTodoList = (state: ParseState): ParseResult => {\n const acc: TodoListAcc = {\n limit: undefined,\n offset: 0,\n reviewId: undefined,\n status: \"pending\",\n };\n const error = runFlagLoop(state, acc, TODO_LIST_FLAGS, \"todo list\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"todo-list\" as const, ...acc });\n};\n\n// -- positional-id-only commands (shared factory) ---------------------------\n\n/**\n * Factory for commands that take exactly one positional `<id>` and no\n * command-specific flags (only globals). Avoids duplication for done/undone.\n */\nconst positionalIdParser =\n <K extends string>(kind: K, label: string) =>\n (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(`${label} requires <id>.`));\n }\n state.index += 1;\n\n while (state.index < state.tokens.length) {\n if (!maybeParseGlobalFlag(state)) {\n return Either.left(\n usageError(`Unknown flag for ${label}: ${state.tokens[state.index]}.`)\n );\n }\n }\n return Either.right({ id, kind } as ParsedCommand);\n };\n\nconst parseTodoDone = positionalIdParser(\"todo-done\" as const, \"todo done\");\nconst parseTodoUndone = positionalIdParser(\n \"todo-undone\" as const,\n \"todo undone\"\n);\n\n// -- todo move --------------------------------------------------------------\n\ninterface TodoMoveAcc {\n position: number | undefined;\n}\n\nconst TODO_MOVE_FLAGS: Readonly<Record<string, FlagHandler<TodoMoveAcc>>> = {\n \"--position\": positiveIntFlag(\"position\"),\n};\n\nconst parseTodoMove = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"todo move requires <id>.\"));\n }\n state.index += 1;\n\n const acc: TodoMoveAcc = { position: undefined };\n const error = runFlagLoop(state, acc, TODO_MOVE_FLAGS, \"todo move\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n if (acc.position === undefined) {\n return Either.left(usageError(\"todo move requires --position.\"));\n }\n return Either.right({\n id,\n kind: \"todo-move\" as const,\n position: acc.position,\n });\n};\n\n// -- todo remove ------------------------------------------------------------\n\ninterface TodoRemoveAcc {\n yes: boolean;\n}\n\nconst TODO_REMOVE_FLAGS: Readonly<Record<string, FlagHandler<TodoRemoveAcc>>> =\n {\n \"--yes\": boolFlag(\"yes\"),\n };\n\nconst parseTodoRemove = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"todo remove requires <id>.\"));\n }\n state.index += 1;\n\n const acc: TodoRemoveAcc = { yes: false };\n const error = runFlagLoop(state, acc, TODO_REMOVE_FLAGS, \"todo remove\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"todo-remove\" as const, ...acc });\n};\n\n// -- todo clear -------------------------------------------------------------\n\ninterface TodoClearAcc {\n all: boolean;\n doneOnly: boolean;\n reviewId: string | undefined;\n yes: boolean;\n}\n\nconst TODO_CLEAR_FLAGS: Readonly<Record<string, FlagHandler<TodoClearAcc>>> = {\n \"--all\": boolFlag(\"all\"),\n \"--done-only\": boolFlag(\"doneOnly\"),\n \"--review\": stringFlag(\"reviewId\"),\n \"--yes\": boolFlag(\"yes\"),\n};\n\nconst parseTodoClear = (state: ParseState): ParseResult => {\n const acc: TodoClearAcc = {\n all: false,\n doneOnly: true,\n reviewId: undefined,\n yes: false,\n };\n const error = runFlagLoop(state, acc, TODO_CLEAR_FLAGS, \"todo clear\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"todo-clear\" as const, ...acc });\n};\n\n// -- review status ----------------------------------------------------------\n\ninterface ReviewStatusAcc {\n reviewId: string | undefined;\n source: ReviewSourceType | undefined;\n}\n\nconst REVIEW_STATUS_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewStatusAcc>>\n> = {\n \"--review\": stringFlag(\"reviewId\"),\n \"--source\": enumFlag(\"source\", REVIEW_SOURCES, \"review source\"),\n};\n\nconst parseReviewStatus = (state: ParseState): ParseResult => {\n const acc: ReviewStatusAcc = { reviewId: undefined, source: undefined };\n const error = runFlagLoop(state, acc, REVIEW_STATUS_FLAGS, \"review status\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"review-status\" as const, ...acc });\n};\n\n// -- review resolve ---------------------------------------------------------\n\ninterface ReviewResolveAcc {\n allComments: boolean;\n yes: boolean;\n}\n\nconst REVIEW_RESOLVE_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewResolveAcc>>\n> = {\n \"--all-comments\": boolFlag(\"allComments\"),\n \"--yes\": boolFlag(\"yes\"),\n};\n\nconst parseReviewResolve = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"review resolve requires <id|last>.\"));\n }\n state.index += 1;\n\n const acc: ReviewResolveAcc = { allComments: true, yes: false };\n const error = runFlagLoop(state, acc, REVIEW_RESOLVE_FLAGS, \"review resolve\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"review-resolve\" as const, ...acc });\n};\n\n// -- todo add ---------------------------------------------------------------\n\ninterface TodoAddAcc {\n position: number | undefined;\n reviewId: string | undefined;\n text: string;\n}\n\nconst TODO_ADD_FLAGS: Readonly<Record<string, FlagHandler<TodoAddAcc>>> = {\n \"--position\": positiveIntFlag(\"position\"),\n \"--review\": stringFlag(\"reviewId\"),\n \"--text\": stringFlag(\"text\"),\n};\n\nconst parseTodoAdd = (state: ParseState): ParseResult => {\n const acc: TodoAddAcc = {\n position: undefined,\n reviewId: undefined,\n text: \"\",\n };\n const error = runFlagLoop(state, acc, TODO_ADD_FLAGS, \"todo add\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n if (!acc.text.trim()) {\n return Either.left(usageError(\"todo add requires --text.\"));\n }\n return Either.right({ kind: \"todo-add\" as const, ...acc });\n};\n\n// -- serve ------------------------------------------------------------------\n\ninterface ServeAcc {\n auth: boolean;\n cert: string | undefined;\n host: string;\n https: boolean;\n key: string | undefined;\n noOpen: boolean;\n password: string | undefined;\n port: number;\n username: string | undefined;\n}\n\nconst SERVE_FLAGS: Readonly<Record<string, FlagHandler<ServeAcc>>> = {\n \"--auth\": boolFlag(\"auth\"),\n \"--cert\": stringFlag(\"cert\"),\n \"--host\": stringFlag(\"host\"),\n \"--https\": boolFlag(\"https\"),\n \"--key\": stringFlag(\"key\"),\n \"--no-open\": boolFlag(\"noOpen\"),\n \"--password\": stringFlag(\"password\"),\n \"--port\": positiveIntFlag(\"port\", { min: 0 }),\n \"--username\": stringFlag(\"username\"),\n};\n\nconst parseServe = (state: ParseState): ParseResult => {\n const acc: ServeAcc = {\n auth: false,\n cert: undefined,\n host: \"127.0.0.1\",\n https: false,\n key: undefined,\n noOpen: false,\n password: undefined,\n port: 3000,\n username: undefined,\n };\n const error = runFlagLoop(state, acc, SERVE_FLAGS, \"serve\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"serve\" as const, ...acc });\n};\n\n// -- mcp --------------------------------------------------------------------\n\nconst MCP_LOG_LEVELS = new Set<string>([\"debug\", \"error\", \"info\", \"silent\"]);\n\ninterface McpAcc {\n logLevel: \"debug\" | \"error\" | \"info\" | \"silent\";\n readonly: boolean;\n}\n\nconst MCP_FLAGS: Readonly<Record<string, FlagHandler<McpAcc>>> = {\n \"--log-level\": enumFlag(\"logLevel\", MCP_LOG_LEVELS, \"log level\"),\n \"--readonly\": boolFlag(\"readonly\"),\n};\n\nconst parseMcp = (state: ParseState): ParseResult => {\n const acc: McpAcc = { logLevel: \"error\", readonly: false };\n const error = runFlagLoop(state, acc, MCP_FLAGS, \"mcp\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"mcp\" as const, ...acc });\n};\n\n// -- events -----------------------------------------------------------------\n\nconst EVENT_TYPES = new Set<string>([\"comments\", \"files\", \"reviews\", \"todos\"]);\n\ninterface EventsAcc {\n since: number | undefined;\n type: \"comments\" | \"files\" | \"reviews\" | \"todos\" | undefined;\n}\n\nconst EVENTS_FLAGS: Readonly<Record<string, FlagHandler<EventsAcc>>> = {\n \"--since\": positiveIntFlag(\"since\"),\n \"--type\": enumFlag(\"type\", EVENT_TYPES, \"event type\"),\n};\n\nconst parseEvents = (state: ParseState): ParseResult => {\n const acc: EventsAcc = { since: undefined, type: undefined };\n const error = runFlagLoop(state, acc, EVENTS_FLAGS, \"events\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"events\" as const, ...acc });\n};\n\n// -- data reset -------------------------------------------------------------\n\ninterface DataResetAcc {\n keepExports: boolean;\n yes: boolean;\n}\n\nconst DATA_RESET_FLAGS: Readonly<Record<string, FlagHandler<DataResetAcc>>> = {\n \"--keep-exports\": boolFlag(\"keepExports\"),\n \"--yes\": boolFlag(\"yes\"),\n};\n\nconst parseDataReset = (state: ParseState): ParseResult => {\n const acc: DataResetAcc = { keepExports: false, yes: false };\n const error = runFlagLoop(state, acc, DATA_RESET_FLAGS, \"data reset\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"data-reset\" as const, ...acc });\n};\n\n// ---------------------------------------------------------------------------\n// Command family dispatch (lookup tables)\n// ---------------------------------------------------------------------------\n\nconst ensureNoExtraArgs = (\n state: ParseState,\n label: string\n): Option.Option<CliFailure> => {\n if (state.index < state.tokens.length) {\n return Option.some(\n usageError(\n `Unexpected argument for ${label}: ${state.tokens[state.index]}.`\n )\n );\n }\n return Option.none();\n};\n\n/** Review verb parsers keyed by verb name. */\nconst REVIEW_VERB_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n create: parseReviewCreate,\n export: parseReviewExport,\n list: parseReviewList,\n resolve: parseReviewResolve,\n show: parseReviewShow,\n status: parseReviewStatus,\n};\n\n/** Todo verb parsers keyed by verb name. */\nconst TODO_VERB_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n add: parseTodoAdd,\n clear: parseTodoClear,\n done: parseTodoDone,\n list: parseTodoList,\n move: parseTodoMove,\n remove: parseTodoRemove,\n undone: parseTodoUndone,\n};\n\n/** Subcommand family parsers keyed by family name. */\n/** Data verb parsers keyed by verb name. */\nconst DATA_VERB_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n migrate: (state) => {\n const error = ensureNoExtraArgs(state, \"data migrate\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"data-migrate\" as const });\n },\n reset: parseDataReset,\n};\n\n/** Subcommand family parsers keyed by family name. */\nconst FAMILY_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n data: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"data\"] as const,\n });\n }\n state.index += 1;\n const parser = DATA_VERB_PARSERS[verb];\n if (!parser) {\n return Either.left(usageError(`Unknown data command: ${verb}.`));\n }\n return parser(state);\n },\n doctor: (state) => {\n const error = ensureNoExtraArgs(state, \"doctor\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"doctor\" as const });\n },\n events: parseEvents,\n export: parseReviewExport,\n mcp: parseMcp,\n review: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"review\"] as const,\n });\n }\n state.index += 1;\n const parser = REVIEW_VERB_PARSERS[verb];\n if (!parser) {\n return Either.left(usageError(`Unknown review command: ${verb}.`));\n }\n return parser(state);\n },\n serve: parseServe,\n source: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"source\"] as const,\n });\n }\n state.index += 1;\n if (verb === \"list\") {\n const error = ensureNoExtraArgs(state, \"source list\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"source-list\" as const });\n }\n if (verb === \"diff\") {\n return parseSourceDiff(state);\n }\n return Either.left(usageError(`Unknown source command: ${verb}.`));\n },\n todo: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"todo\"] as const,\n });\n }\n state.index += 1;\n const parser = TODO_VERB_PARSERS[verb];\n if (!parser) {\n return Either.left(usageError(`Unknown todo command: ${verb}.`));\n }\n return parser(state);\n },\n};\n\n// ---------------------------------------------------------------------------\n// Top-level entry\n// ---------------------------------------------------------------------------\n\n/**\n * Strips any leading globals with {@link maybeParseGlobalFlag} before dispatching\n * into a command family so `--help` and `--version` behave consistently.\n */\nconst parseWithState = (state: ParseState): ParseResult => {\n while (state.index < state.tokens.length && maybeParseGlobalFlag(state)) {\n // Keep consuming top-level flags before the command token.\n }\n\n if (state.options.version) {\n return Either.right({ kind: \"version\" as const });\n }\n\n if (state.index >= state.tokens.length) {\n return Either.right({ kind: \"help\" as const, topic: [] });\n }\n\n const first = state.tokens[state.index];\n if (!first) {\n return Either.right({ kind: \"help\" as const, topic: [] });\n }\n if (first === \"help\") {\n const topic = state.tokens.slice(state.index + 1);\n state.index = state.tokens.length;\n return Either.right({ kind: \"help\" as const, topic });\n }\n\n if (state.options.help) {\n return Either.right({\n kind: \"help\" as const,\n topic: state.tokens.slice(state.index),\n });\n }\n\n state.index += 1;\n\n const familyParser = FAMILY_PARSERS[first];\n if (!familyParser) {\n return Either.left(usageError(`Unknown command: ${first}.`));\n }\n return familyParser(state);\n};\n\nexport const parseCliArgs = (\n argv: readonly string[]\n): Either.Either<\n { readonly command: ParsedCommand; readonly options: GlobalOptions },\n CliFailure\n> => {\n const options = createDefaultOptions();\n const state: ParseState = { index: 0, options, tokens: argv };\n const result = parseWithState(state);\n if (Either.isLeft(result)) {\n return Either.left(result.left);\n }\n return Either.right({ command: result.right, options });\n};\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport * as ConfigProvider from \"effect/ConfigProvider\";\nimport * as Layer from \"effect/Layer\";\nimport * as ManagedRuntime from \"effect/ManagedRuntime\";\n\nimport { CliConfigLive } from \"@/cli/config\";\nimport type { CliConfigShape } from \"@/cli/config\";\nimport { CliFailure, ExitCode } from \"@/cli/contracts\";\nimport type { ParsedCommand } from \"@/cli/contracts\";\nimport { CoreLive } from \"@/core/runtime\";\nimport { GitService } from \"@/core/services/git.service\";\n\n/**\n * Bundles the resolved config with the matching runtime so the CLI can share\n * one setup and disposal path.\n */\nexport interface CliRuntimeResources {\n readonly config: CliConfigShape;\n readonly runtime: ManagedRuntime.ManagedRuntime<any, any>;\n}\n\n/**\n * Resolves the repository root up front so every later git and database path is\n * anchored to the same directory, even when the user invoked the CLI elsewhere.\n *\n * NOTE: This uses execFileSync intentionally — it runs once at CLI startup\n * before the Effect runtime is constructed, so there is no fiber to block.\n * Moving this into the Effect runtime would create a circular dependency\n * (config → git → config).\n */\nconst resolveRepositoryRoot = (repoOverride?: string): CliFailure | string => {\n const cwd = repoOverride ? resolve(repoOverride) : process.cwd();\n\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n encoding: \"utf8\",\n }).trim();\n } catch {\n return new CliFailure({\n exitCode: ExitCode.StateUnavailable,\n message: repoOverride\n ? `Path ${cwd} is not a Git repository. Use --repo <path> with a valid repository root.`\n : `Could not resolve a Git repository from ${cwd}. Use --repo <path> with a valid repository root.`,\n });\n }\n};\n\nconst resolveDbPath = (repoRoot: string, dbPathOverride?: string): string =>\n dbPathOverride\n ? resolve(dbPathOverride)\n : resolve(repoRoot, \".ringi/reviews.db\");\n\nconst commandNeedsRepository = (command: ParsedCommand): boolean =>\n command.kind !== \"help\" &&\n command.kind !== \"version\" &&\n command.kind !== \"mcp\" &&\n command.kind !== \"serve\";\n\nexport const commandNeedsDatabase = (command: ParsedCommand): boolean =>\n command.kind === \"review-list\" ||\n command.kind === \"review-show\" ||\n command.kind === \"review-export\" ||\n command.kind === \"review-status\" ||\n command.kind === \"todo-list\" ||\n command.kind === \"doctor\";\n\nexport const commandUsesCoreRuntime = (command: ParsedCommand): boolean =>\n command.kind === \"review-list\" ||\n command.kind === \"review-show\" ||\n command.kind === \"review-export\" ||\n command.kind === \"review-status\" ||\n command.kind === \"todo-list\" ||\n command.kind === \"review-create\" ||\n command.kind === \"todo-add\" ||\n command.kind === \"doctor\";\n\nexport const resolveCliConfig = (args: {\n color: boolean;\n dbPath?: string;\n quiet: boolean;\n repo?: string;\n verbose: boolean;\n}): CliConfigShape | CliFailure => {\n const repoRootResult = resolveRepositoryRoot(args.repo);\n if (repoRootResult instanceof CliFailure) {\n return repoRootResult;\n }\n\n return {\n color: args.color,\n cwd: process.cwd(),\n dbPath: resolveDbPath(repoRootResult, args.dbPath),\n outputMode: \"human\",\n quiet: args.quiet,\n repoRoot: repoRootResult,\n verbose: args.verbose,\n };\n};\n\n/**\n * Read-only commands still depend on initialized local state because the shared\n * services use the same database-backed storage as the other clients.\n */\nexport const ensureLocalStateAvailable = (\n config: CliConfigShape\n): CliFailure | undefined => {\n if (!existsSync(config.dbPath)) {\n return new CliFailure({\n exitCode: ExitCode.StateUnavailable,\n message: `Local state is missing at ${config.dbPath}. Run 'ringi data migrate' or start 'ringi serve' once to initialize local state.`,\n });\n }\n return undefined;\n};\n\nconst makeConfigLayer = (config: CliConfigShape) =>\n Layer.setConfigProvider(\n ConfigProvider.fromMap(\n new Map([\n [\"DB_PATH\", config.dbPath],\n [\"REPOSITORY_PATH\", config.repoRoot],\n ])\n )\n );\n\nexport const createCoreCliRuntime = (config: CliConfigShape) =>\n ManagedRuntime.make(\n Layer.mergeAll(CoreLive, CliConfigLive(config)).pipe(\n Layer.provideMerge(makeConfigLayer(config))\n )\n );\n\nexport const createGitCliRuntime = (config: CliConfigShape) =>\n ManagedRuntime.make(\n Layer.mergeAll(GitService.Default, CliConfigLive(config)).pipe(\n Layer.provideMerge(makeConfigLayer(config))\n )\n );\n\n/**\n * Centralizes runtime selection. Returns either valid resources or a CliFailure.\n * Returns null for help/version commands that don't need a runtime.\n */\nexport const createCliRuntimeResources = (\n command: ParsedCommand,\n args: {\n color: boolean;\n dbPath?: string;\n quiet: boolean;\n repo?: string;\n verbose: boolean;\n }\n): CliFailure | CliRuntimeResources | null => {\n if (!commandNeedsRepository(command)) {\n return null;\n }\n\n const configResult = resolveCliConfig(args);\n if (configResult instanceof CliFailure) {\n return configResult;\n }\n\n if (commandNeedsDatabase(command)) {\n const stateError = ensureLocalStateAvailable(configResult);\n if (stateError) {\n return stateError;\n }\n }\n\n return {\n config: configResult,\n runtime: commandUsesCoreRuntime(command)\n ? createCoreCliRuntime(configResult)\n : createGitCliRuntime(configResult),\n };\n};\n","#!/usr/bin/env node\n\nimport { exec, fork } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport type * as Effect from \"effect/Effect\";\nimport * as Either from \"effect/Either\";\n\nimport { ReviewNotFound } from \"@/api/schemas/review\";\nimport { TodoNotFound } from \"@/api/schemas/todo\";\nimport { commandLabel, runCommand } from \"@/cli/commands\";\nimport { CliFailure, ExitCode, failure, success } from \"@/cli/contracts\";\nimport type {\n CliErrorDetail,\n CliErrorEnvelope,\n CommandOutput,\n ErrorCategory,\n ExitCode as ExitCodeType,\n NextAction,\n ParsedCommand,\n} from \"@/cli/contracts\";\nimport { parseCliArgs } from \"@/cli/parser\";\nimport { createCliRuntimeResources } from \"@/cli/runtime\";\n\nconst CLI_VERSION =\n process.env.RINGI_VERSION ?? process.env.npm_package_version ?? \"0.0.0-dev\";\n\n// ---------------------------------------------------------------------------\n// Self-documenting command tree (returned for `ringi --json` with no command)\n// ---------------------------------------------------------------------------\n\nconst COMMAND_TREE = {\n commands: [\n {\n description: \"List review sessions\",\n name: \"review list\",\n usage:\n \"ringi review list [--status <status>] [--source <type>] [--limit <n>] [--page <n>]\",\n },\n {\n description: \"Show review details\",\n name: \"review show\",\n usage: \"ringi review show <id|last> [--comments] [--todos]\",\n },\n {\n description: \"Create a review session\",\n name: \"review create\",\n usage:\n \"ringi review create [--source <staged|branch|commits>] [--branch <name>] [--commits <range>]\",\n },\n {\n description: \"Export review as markdown\",\n name: \"review export\",\n usage: \"ringi review export <id|last> [--output <path>] [--stdout]\",\n },\n {\n description: \"Resolve a review session\",\n name: \"review resolve\",\n usage: \"ringi review resolve <id|last> [--all-comments] [--yes]\",\n },\n {\n description: \"Show repository and review status\",\n name: \"review status\",\n usage: \"ringi review status [--review <id|last>] [--source <type>]\",\n },\n {\n description: \"List repository sources\",\n name: \"source list\",\n usage: \"ringi source list\",\n },\n {\n description: \"Show diff for a source\",\n name: \"source diff\",\n usage:\n \"ringi source diff <staged|branch|commits> [--branch <name>] [--commits <range>] [--stat]\",\n },\n {\n description: \"List todo items\",\n name: \"todo list\",\n usage:\n \"ringi todo list [--review <id>] [--status <pending|done|all>] [--limit <n>] [--offset <n>]\",\n },\n {\n description: \"Add a todo item\",\n name: \"todo add\",\n usage: \"ringi todo add --text <text> [--review <id>] [--position <n>]\",\n },\n {\n description: \"Mark a todo as done\",\n name: \"todo done\",\n usage: \"ringi todo done <id>\",\n },\n {\n description: \"Reopen a completed todo\",\n name: \"todo undone\",\n usage: \"ringi todo undone <id>\",\n },\n {\n description: \"Move a todo to a position\",\n name: \"todo move\",\n usage: \"ringi todo move <id> --position <n>\",\n },\n {\n description: \"Remove a todo\",\n name: \"todo remove\",\n usage: \"ringi todo remove <id> [--yes]\",\n },\n {\n description: \"Clear completed todos\",\n name: \"todo clear\",\n usage: \"ringi todo clear [--review <id>] [--done-only] [--all] [--yes]\",\n },\n {\n description: \"Start the local Ringi server\",\n name: \"serve\",\n usage:\n \"ringi serve [--host <host>] [--port <port>] [--https] [--auth] [--no-open]\",\n },\n {\n description: \"Start the MCP stdio server\",\n name: \"mcp\",\n usage: \"ringi mcp [--readonly] [--log-level <level>]\",\n },\n {\n description: \"Run local diagnostics\",\n name: \"doctor\",\n usage: \"ringi doctor\",\n },\n {\n description: \"Tail server events\",\n name: \"events\",\n usage: \"ringi events [--type <reviews|comments|todos|files>]\",\n },\n {\n description: \"Run database migrations\",\n name: \"data migrate\",\n usage: \"ringi data migrate\",\n },\n {\n description: \"Reset local data\",\n name: \"data reset\",\n usage: \"ringi data reset [--yes] [--keep-exports]\",\n },\n ],\n description: \"ringi — local-first code review CLI\",\n version: CLI_VERSION,\n};\n\nconst ROOT_NEXT_ACTIONS: NextAction[] = [\n {\n command: \"ringi review list [--status <status>] [--source <type>]\",\n description: \"List review sessions\",\n params: {\n source: { enum: [\"staged\", \"branch\", \"commits\"] },\n status: { enum: [\"in_progress\", \"approved\", \"changes_requested\"] },\n },\n },\n {\n command: \"ringi source list\",\n description: \"List repository sources\",\n },\n {\n command: \"ringi review create [--source <source>]\",\n description: \"Create a new review session\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n },\n {\n command: \"ringi todo list [--status <status>]\",\n description: \"List todos\",\n params: {\n status: { default: \"pending\", enum: [\"pending\", \"done\", \"all\"] },\n },\n },\n {\n command: \"ringi review status\",\n description: \"Show repository and review status\",\n },\n];\n\n// ---------------------------------------------------------------------------\n// Help text (lookup-table, not switch)\n// ---------------------------------------------------------------------------\n\nconst ROOT_HELP = `ringi — local-first review CLI\n\nUsage:\n ringi [global options] <command>\n\nGlobal options:\n --json Emit structured JSON envelope to stdout\n --repo <path> Use a specific Git repository root\n --db-path <path> Override the SQLite database path\n --quiet Suppress human-readable success output\n --verbose Include stack traces on failures\n --no-color Disable ANSI color output\n --help Show help\n --version Show version\n\nCommands:\n review list [--status <status>] [--source <type>] [--limit <n>] [--page <n>]\n review show <id|last> [--comments] [--todos]\n review create [--source <staged|branch|commits>] [--branch <name>] [--commits <range>]\n review export <id|last> [--output <path>] [--stdout]\n review resolve <id|last> [--all-comments] [--yes]\n review status [--review <id|last>] [--source <type>]\n source list\n source diff <staged|branch|commits> [--branch <name>] [--commits <range>] [--stat]\n todo list [--review <id>] [--status <pending|done|all>] [--limit <n>] [--offset <n>]\n todo add --text <text> [--review <id>]\n todo done <id>\n todo undone <id>\n todo move <id> --position <n>\n todo remove <id> [--yes]\n todo clear [--review <id>] [--done-only] [--all] [--yes]\n export <id|last> [--output <path>] [--stdout]\n`;\n\nconst HELP_TOPICS: Readonly<Record<string, string>> = {\n data: `ringi data\n\nUsage:\n ringi data migrate\n ringi data reset [--yes] [--keep-exports]\n`,\n review: `ringi review\n\nUsage:\n ringi review list [--status <status>] [--source <type>] [--limit <n>] [--page <n>]\n ringi review show <id|last> [--comments] [--todos]\n ringi review create [--source <staged|branch|commits>] [--branch <name>] [--commits <range>]\n ringi review export <id|last> [--output <path>] [--stdout]\n ringi review resolve <id|last> [--all-comments] [--yes]\n ringi review status [--review <id|last>] [--source <type>]\n`,\n source: `ringi source\n\nUsage:\n ringi source list\n ringi source diff <staged|branch|commits> [--branch <name>] [--commits <range>] [--stat]\n`,\n todo: `ringi todo\n\nUsage:\n ringi todo list [--review <id>] [--status <pending|done|all>] [--limit <n>] [--offset <n>]\n ringi todo add --text <text> [--review <id>] [--position <n>]\n ringi todo done <id>\n ringi todo undone <id>\n ringi todo move <id> --position <n>\n ringi todo remove <id> [--yes]\n ringi todo clear [--review <id>] [--done-only] [--all] [--yes]\n`,\n};\n\nconst renderHelp = (command: ParsedCommand): string => {\n if (command.kind !== \"help\") {\n return ROOT_HELP;\n }\n const [topic] = command.topic;\n return (topic && HELP_TOPICS[topic]) ?? ROOT_HELP;\n};\n\n// ---------------------------------------------------------------------------\n// Output helpers\n// ---------------------------------------------------------------------------\n\nconst writeJson = (payload: unknown): void => {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n};\n\nconst writeHuman = (text: string | undefined): void => {\n if (text && text.length > 0) {\n process.stdout.write(`${text}\\n`);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Error normalization (RFC 9457-inspired)\n// ---------------------------------------------------------------------------\n\ninterface NormalizedFailure {\n readonly category: ErrorCategory;\n readonly code: string;\n readonly exitCode: ExitCodeType;\n readonly message: string;\n readonly retryable: boolean;\n readonly verbose?: string;\n}\n\n/** Maps exit codes to error categories and retryable status. */\nconst EXIT_CODE_META: Readonly<\n Record<number, { category: ErrorCategory; code: string; retryable: boolean }>\n> = {\n [ExitCode.AuthFailure]: {\n category: \"auth\",\n code: \"AUTH_FAILURE\",\n retryable: false,\n },\n [ExitCode.ResourceNotFound]: {\n category: \"not_found\",\n code: \"RESOURCE_NOT_FOUND\",\n retryable: false,\n },\n [ExitCode.RuntimeFailure]: {\n category: \"server\",\n code: \"RUNTIME_FAILURE\",\n retryable: true,\n },\n [ExitCode.StateUnavailable]: {\n category: \"config\",\n code: \"STATE_UNAVAILABLE\",\n retryable: false,\n },\n [ExitCode.UsageError]: {\n category: \"validation\",\n code: \"USAGE_ERROR\",\n retryable: false,\n },\n};\n\nconst mapFailure = (error: unknown): NormalizedFailure => {\n if (error instanceof CliFailure) {\n const meta = EXIT_CODE_META[error.exitCode] ?? {\n category: \"server\" as const,\n code: \"UNKNOWN\",\n retryable: false,\n };\n return {\n category: meta.category,\n code: meta.code,\n exitCode: error.exitCode as ExitCodeType,\n message: error.message,\n retryable: meta.retryable,\n verbose: error.details,\n };\n }\n\n if (error instanceof ReviewNotFound || error instanceof TodoNotFound) {\n return {\n category: \"not_found\",\n code: \"RESOURCE_NOT_FOUND\",\n exitCode: ExitCode.ResourceNotFound,\n message: error.message,\n retryable: false,\n verbose: error.stack,\n };\n }\n\n if (error instanceof Error) {\n return {\n category: \"server\",\n code: \"RUNTIME_FAILURE\",\n exitCode: ExitCode.RuntimeFailure,\n message: error.message,\n retryable: true,\n verbose: error.stack,\n };\n }\n\n return {\n category: \"server\",\n code: \"UNKNOWN_FAILURE\",\n exitCode: ExitCode.RuntimeFailure,\n message: \"Unknown CLI failure.\",\n retryable: false,\n };\n};\n\n/** Actionable fix guidance based on error category. */\nconst FIX_GUIDANCE: Readonly<Record<ErrorCategory, string>> = {\n auth: \"Check authentication credentials or run 'ringi serve --auth' with valid credentials.\",\n config:\n \"Run 'ringi serve' once to initialize local state, or check --repo and --db-path flags.\",\n conflict: \"Resolve the conflict and retry the operation.\",\n connection: \"Ensure the Ringi server is running: ringi serve\",\n not_found:\n \"Verify the resource ID. Use 'ringi review list' or 'ringi todo list' to find valid IDs.\",\n server: \"Retry the command. If the error persists, check 'ringi serve' logs.\",\n validation:\n \"Check command usage with 'ringi --help'. Verify flag names and values.\",\n};\n\n/** Build recovery next_actions based on error category. */\nconst errorNextActions = (\n commandStr: string,\n normalized: NormalizedFailure\n): NextAction[] => {\n const actions: NextAction[] = [];\n\n if (normalized.retryable) {\n actions.push({\n command: commandStr,\n description: \"Retry the failed command\",\n });\n }\n\n if (\n normalized.category === \"config\" ||\n normalized.category === \"connection\"\n ) {\n actions.push({\n command: \"ringi serve\",\n description: \"Start the local Ringi server\",\n });\n }\n\n if (normalized.category === \"not_found\") {\n actions.push(\n {\n command: \"ringi review list\",\n description: \"List available reviews\",\n },\n {\n command: \"ringi todo list\",\n description: \"List available todos\",\n }\n );\n }\n\n if (normalized.category === \"validation\") {\n actions.push({\n command: `${commandStr.split(\" \").slice(0, 3).join(\" \")} --help`,\n description: \"Show command usage\",\n });\n }\n\n return actions;\n};\n\n/** Build a full error envelope from a normalized failure. */\nconst buildErrorEnvelope = (\n commandStr: string,\n normalized: NormalizedFailure\n): CliErrorEnvelope => {\n const errorDetail: CliErrorDetail = {\n category: normalized.category,\n code: normalized.code,\n message: normalized.message,\n retryable: normalized.retryable,\n type: `ringi://errors/${normalized.code}`,\n };\n\n return failure(\n commandStr,\n errorDetail,\n normalized.verbose ?? FIX_GUIDANCE[normalized.category],\n errorNextActions(commandStr, normalized)\n );\n};\n\n// ---------------------------------------------------------------------------\n// Signal handling\n// ---------------------------------------------------------------------------\n\nconst installSignalHandlers = (dispose: () => Promise<void>): (() => void) => {\n const shutdown = async () => {\n await dispose();\n process.exit(ExitCode.RuntimeFailure);\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n\n return () => {\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n };\n};\n\n// ---------------------------------------------------------------------------\n// Serve command (long-running process, bypasses Effect runtime)\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the built Nitro server entry point. Returns the absolute path to\n * `.output/server/index.mjs` relative to the package root (the directory\n * containing this CLI entry point after bundling).\n */\nconst resolveServerEntry = (): string | undefined => {\n // Try multiple locations: cwd (development), then relative to the built CLI\n // bundle (`dist/cli.js` → `../.output`).\n const candidates = [resolve(process.cwd(), \".output\", \"server\", \"index.mjs\")];\n\n if (import.meta.dirname) {\n candidates.push(\n resolve(import.meta.dirname, \"..\", \".output\", \"server\", \"index.mjs\")\n );\n }\n\n return candidates.find((candidate) => existsSync(candidate));\n};\n\nconst runServe = (command: Extract<ParsedCommand, { kind: \"serve\" }>): void => {\n const serverEntry = resolveServerEntry();\n\n if (!serverEntry) {\n process.stderr.write(\n \"No built server found. Run 'pnpm build' first, then retry 'ringi serve'.\\n\"\n );\n process.exit(ExitCode.RuntimeFailure);\n }\n\n const env: Record<string, string> = {\n ...process.env,\n NITRO_HOST: command.host,\n NITRO_PORT: String(command.port),\n };\n\n if (command.https && command.cert && command.key) {\n env.NITRO_SSL_CERT = command.cert;\n env.NITRO_SSL_KEY = command.key;\n }\n\n const protocol = command.https ? \"https\" : \"http\";\n const url = `${protocol}://${command.host === \"0.0.0.0\" ? \"localhost\" : command.host}:${command.port}`;\n process.stderr.write(`ringi server starting on ${url}\\n`);\n\n const child = fork(serverEntry, [], {\n env,\n // Clear execArgv so tsx/ts-node loaders from the parent don't interfere\n // with the built Nitro server (plain ESM).\n execArgv: [],\n stdio: \"inherit\",\n });\n\n if (!command.noOpen) {\n // Delay open slightly so the server has time to bind the port.\n setTimeout(() => {\n let openCmd = \"xdg-open\";\n if (process.platform === \"darwin\") {\n openCmd = \"open\";\n } else if (process.platform === \"win32\") {\n openCmd = \"start\";\n }\n exec(`${openCmd} ${url}`, () => {\n // Browser open is best-effort; swallow errors.\n });\n }, 1500);\n }\n\n const shutdown = () => {\n child.kill(\"SIGTERM\");\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n\n child.on(\"exit\", (code) => {\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n process.exit(code ?? ExitCode.Success);\n });\n};\n\n// ---------------------------------------------------------------------------\n// Shared error exit (eliminates 3× duplication)\n// ---------------------------------------------------------------------------\n\ninterface FailExitOptions {\n readonly cmdStr: string;\n readonly error: unknown;\n readonly json: boolean;\n readonly verbose: boolean;\n}\n\n/** Single path for all CLI error exits. */\nconst failAndExit = (opts: FailExitOptions): never => {\n const normalized = mapFailure(opts.error);\n\n if (opts.json) {\n writeJson(buildErrorEnvelope(opts.cmdStr, normalized));\n }\n\n process.stderr.write(`${normalized.message}\\n`);\n if (opts.verbose && normalized.verbose) {\n process.stderr.write(`${normalized.verbose}\\n`);\n }\n\n return process.exit(normalized.exitCode);\n};\n\n// ---------------------------------------------------------------------------\n// Main program\n// ---------------------------------------------------------------------------\n\nconst main = async (): Promise<void> => {\n const argv = process.argv.slice(2);\n const parseResult = parseCliArgs(argv);\n\n if (Either.isLeft(parseResult)) {\n return failAndExit({\n cmdStr: \"ringi\",\n error: parseResult.left,\n json: argv.includes(\"--json\"),\n verbose: false,\n });\n }\n\n const { command, options } = parseResult.right;\n\n if (command.kind === \"help\") {\n if (options.json) {\n writeJson(success(\"ringi\", COMMAND_TREE, ROOT_NEXT_ACTIONS));\n } else {\n writeHuman(renderHelp(command));\n }\n process.exit(ExitCode.Success);\n }\n\n if (command.kind === \"version\") {\n if (options.json) {\n writeJson(success(\"ringi --version\", { version: CLI_VERSION }));\n } else {\n writeHuman(CLI_VERSION);\n }\n process.exit(ExitCode.Success);\n }\n\n // Serve is a long-running process that bypasses the Effect runtime entirely.\n // It forks the built Nitro server as a child process and proxies signals.\n if (command.kind === \"serve\") {\n runServe(command);\n return;\n }\n\n const runtimeResources = createCliRuntimeResources(command, {\n color: options.color,\n dbPath: options.dbPath,\n quiet: options.quiet,\n repo: options.repo,\n verbose: options.verbose,\n });\n\n if (runtimeResources === null) {\n process.exit(ExitCode.Success);\n }\n\n const cmdStr = commandLabel(command);\n\n if (runtimeResources instanceof CliFailure) {\n return failAndExit({\n cmdStr,\n error: runtimeResources,\n json: options.json,\n verbose: options.verbose,\n });\n }\n\n const removeSignalHandlers = installSignalHandlers(() =>\n runtimeResources.runtime.dispose()\n );\n\n try {\n // The CommandHandler type uses `unknown` for the R (requirements) channel\n // because handlers depend on various service combinations. The managed\n // runtime provides all required services; the cast at this boundary is the\n // one place where we bridge the static Effect types to the dynamic runtime.\n const output = (await runtimeResources.runtime.runPromise(\n runCommand(command) as Effect.Effect<CommandOutput<unknown>>\n )) as CommandOutput<unknown>;\n\n if (options.json) {\n writeJson(success(cmdStr, output.data, output.nextActions ?? []));\n } else if (!options.quiet) {\n writeHuman(output.human);\n }\n\n await runtimeResources.runtime.dispose();\n removeSignalHandlers();\n process.exit(ExitCode.Success);\n } catch (error) {\n await runtimeResources.runtime.dispose();\n removeSignalHandlers();\n failAndExit({\n cmdStr,\n error,\n json: options.json,\n verbose: options.verbose,\n });\n }\n};\n\ntry {\n await main();\n} catch (error) {\n failAndExit({\n cmdStr: \"ringi\",\n error,\n json: process.argv.slice(2).includes(\"--json\"),\n verbose: false,\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/cli/config.ts","../src/cli/contracts.ts","../src/cli/commands.ts","../src/cli/parser.ts","../src/cli/runtime.ts","../src/cli/main.ts"],"names":["Layer","resolveReviewSelector","runReviewList","runReviewShow","runReviewExport","runSourceList","runSourceDiff","runReviewStatus","runTodoList","commandLabel","resolve","existsSync","Either2"],"mappings":"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","file":"cli.js","sourcesContent":["import * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\n\nexport type CliOutputMode = \"human\" | \"json\";\n\n/**\n * Captures the resolved CLI environment once so downstream layers do not each\n * read process state independently.\n */\nexport interface CliConfigShape {\n readonly color: boolean;\n readonly cwd: string;\n readonly dbPath: string;\n readonly outputMode: CliOutputMode;\n readonly quiet: boolean;\n readonly repoRoot: string;\n readonly verbose: boolean;\n}\n\nexport class CliConfig extends Context.Tag(\"@ringi/CliConfig\")<\n CliConfig,\n CliConfigShape\n>() {}\n\n/**\n * Wraps a concrete {@link CliConfigShape} in a layer for the Effect runtime.\n */\nexport const CliConfigLive = (config: CliConfigShape) =>\n Layer.succeed(CliConfig, config);\n","import type {\n ReviewSourceType,\n ReviewStatus,\n} from \"@ringi/core/schemas/review\";\nimport * as Schema from \"effect/Schema\";\n\nexport const ExitCode = {\n AuthFailure: 5,\n ResourceNotFound: 3,\n RuntimeFailure: 1,\n StateUnavailable: 4,\n Success: 0,\n UsageError: 2,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n// ---------------------------------------------------------------------------\n// Agent-first response envelope (RFC 9457-inspired)\n// ---------------------------------------------------------------------------\n\n/** Error family for agent routing logic — branch on category, not message text. */\nexport type ErrorCategory =\n | \"auth\"\n | \"config\"\n | \"conflict\"\n | \"connection\"\n | \"not_found\"\n | \"server\"\n | \"validation\";\n\n/** Machine-readable param descriptor for a HATEOAS next-action template. */\nexport interface NextActionParam {\n readonly default?: number | string;\n readonly description?: string;\n readonly enum?: readonly string[];\n readonly required?: boolean;\n readonly value?: number | string;\n}\n\n/**\n * A command the agent can run next. Literal commands omit `params`;\n * template commands use `<required>` / `[--flag <value>]` POSIX syntax\n * and include a `params` map so the agent knows what to fill.\n */\nexport interface NextAction {\n readonly command: string;\n readonly description: string;\n readonly params?: Readonly<Record<string, NextActionParam>>;\n}\n\n/** Structured error detail — stable fields agents can branch on. */\nexport interface CliErrorDetail {\n /** Error family for routing logic. */\n readonly category: ErrorCategory;\n /** Machine-readable error code, e.g. `REVIEW_NOT_FOUND`. */\n readonly code: string;\n /** Human-readable explanation of this occurrence. */\n readonly message: string;\n /** Whether a retry can succeed. */\n readonly retryable: boolean;\n /** Seconds to wait before retrying, when `retryable` is true. */\n readonly retry_after?: number;\n /** Documentation URI, e.g. `ringi://errors/REVIEW_NOT_FOUND`. */\n readonly type?: string;\n}\n\ninterface CliSuccessEnvelope<T> {\n readonly command: string;\n readonly next_actions: readonly NextAction[];\n readonly ok: true;\n readonly result: T;\n}\n\nexport interface CliErrorEnvelope {\n readonly command: string;\n readonly error: CliErrorDetail;\n /** Plain-language actionable guidance for the agent. */\n readonly fix: string;\n readonly next_actions: readonly NextAction[];\n readonly ok: false;\n}\n\n// --- Envelope factory helpers ------------------------------------------------\n\nexport const success = <T>(\n command: string,\n result: T,\n nextActions: readonly NextAction[] = []\n): CliSuccessEnvelope<T> => ({\n command,\n next_actions: nextActions,\n ok: true,\n result,\n});\n\nexport const failure = (\n command: string,\n error: CliErrorDetail,\n fix: string,\n nextActions: readonly NextAction[] = []\n): CliErrorEnvelope => ({\n command,\n error,\n fix,\n next_actions: nextActions,\n ok: false,\n});\n\nexport interface GlobalOptions {\n color: boolean;\n dbPath?: string;\n help: boolean;\n json: boolean;\n quiet: boolean;\n repo?: string;\n verbose: boolean;\n version: boolean;\n}\n\nexport interface CommandOutput<T> {\n readonly data: T;\n readonly human?: string;\n readonly nextActions?: readonly NextAction[];\n}\n\n/**\n * Carries an exit code and optional operator-facing details so callers can\n * present a short message without losing the underlying reason.\n */\nexport class CliFailure extends Schema.TaggedError<CliFailure>()(\"CliFailure\", {\n details: Schema.optional(Schema.String),\n exitCode: Schema.Number,\n message: Schema.String,\n}) {}\n\n/**\n * Normalized CLI intent shared by the parser and executors so command handlers\n * never have to reason about raw argv tokens.\n */\nexport type ParsedCommand =\n | { readonly kind: \"help\"; readonly topic: readonly string[] }\n | { readonly kind: \"version\" }\n | {\n readonly kind: \"review-list\";\n readonly limit: number;\n readonly page: number;\n readonly source?: ReviewSourceType;\n readonly status?: ReviewStatus;\n }\n | {\n readonly comments: boolean;\n readonly id: string;\n readonly kind: \"review-show\";\n readonly todos: boolean;\n }\n | {\n readonly id: string;\n readonly kind: \"review-export\";\n readonly noResolved: boolean;\n readonly noSnippets: boolean;\n readonly outputPath?: string;\n readonly stdout: boolean;\n }\n | {\n readonly branch?: string;\n readonly commits?: string;\n readonly kind: \"review-create\";\n readonly source: ReviewSourceType;\n readonly title?: string;\n }\n | {\n readonly kind: \"source-list\";\n }\n | {\n readonly branch?: string;\n readonly commits?: string;\n readonly kind: \"source-diff\";\n readonly source: ReviewSourceType;\n readonly stat: boolean;\n }\n | {\n readonly kind: \"todo-list\";\n readonly limit?: number;\n readonly offset: number;\n readonly reviewId?: string;\n readonly status: \"all\" | \"done\" | \"pending\";\n }\n | {\n readonly kind: \"todo-add\";\n readonly position?: number;\n readonly reviewId?: string;\n readonly text: string;\n }\n | {\n readonly id: string;\n readonly kind: \"todo-done\";\n }\n | {\n readonly id: string;\n readonly kind: \"todo-undone\";\n }\n | {\n readonly id: string;\n readonly kind: \"todo-move\";\n readonly position: number;\n }\n | {\n readonly id: string;\n readonly kind: \"todo-remove\";\n readonly yes: boolean;\n }\n | {\n readonly all: boolean;\n readonly doneOnly: boolean;\n readonly kind: \"todo-clear\";\n readonly reviewId?: string;\n readonly yes: boolean;\n }\n | {\n readonly kind: \"review-status\";\n readonly reviewId?: string;\n readonly source?: ReviewSourceType;\n }\n | {\n readonly allComments: boolean;\n readonly id: string;\n readonly kind: \"review-resolve\";\n readonly yes: boolean;\n }\n | {\n readonly auth: boolean;\n readonly cert?: string;\n readonly host: string;\n readonly https: boolean;\n readonly key?: string;\n readonly kind: \"serve\";\n readonly noOpen: boolean;\n readonly password?: string;\n readonly port: number;\n readonly username?: string;\n }\n | {\n readonly kind: \"mcp\";\n readonly logLevel: \"debug\" | \"error\" | \"info\" | \"silent\";\n readonly readonly: boolean;\n }\n | {\n readonly kind: \"doctor\";\n }\n | {\n readonly kind: \"data-migrate\";\n }\n | {\n readonly keepExports: boolean;\n readonly kind: \"data-reset\";\n readonly yes: boolean;\n }\n | {\n readonly kind: \"events\";\n readonly since?: number;\n readonly type?: \"comments\" | \"files\" | \"reviews\" | \"todos\";\n };\n","import { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { ReviewId } from \"@ringi/core/schemas/review\";\nimport { CommentService } from \"@ringi/core/services/comment.service\";\nimport { getDiffSummary, parseDiff } from \"@ringi/core/services/diff.service\";\nimport { ExportService } from \"@ringi/core/services/export.service\";\nimport { GitService } from \"@ringi/core/services/git.service\";\nimport { ReviewService } from \"@ringi/core/services/review.service\";\nimport { TodoService } from \"@ringi/core/services/todo.service\";\nimport * as Effect from \"effect/Effect\";\n\nimport { CliConfig } from \"@/cli/config\";\nimport { CliFailure, ExitCode } from \"@/cli/contracts\";\nimport type { CommandOutput, NextAction, ParsedCommand } from \"@/cli/contracts\";\n\n// ---------------------------------------------------------------------------\n// View-model interfaces (decoupled from service response shapes)\n// ---------------------------------------------------------------------------\n\ninterface ReviewListRow {\n readonly createdAt: string;\n readonly fileCount: number;\n readonly id: string;\n readonly sourceType: string;\n readonly status: string;\n}\n\ninterface ReviewShowComment {\n readonly content: string;\n readonly filePath: string;\n readonly lineNumber: number | null;\n readonly resolved: boolean;\n}\n\ninterface ReviewShowFile {\n readonly additions: number;\n readonly deletions: number;\n readonly filePath: string;\n readonly status: string;\n}\n\ninterface ReviewShowSummary {\n readonly totalAdditions: number;\n readonly totalDeletions: number;\n readonly totalFiles: number;\n}\n\ninterface ReviewShowReview {\n readonly createdAt: string;\n readonly files: readonly ReviewShowFile[];\n readonly id: string;\n readonly sourceRef: string | null;\n readonly sourceType: string;\n readonly status: string;\n readonly summary: ReviewShowSummary;\n}\n\ninterface ReviewShowTodo {\n readonly completed: boolean;\n readonly content: string;\n readonly position: number;\n}\n\ninterface ReviewShowData {\n readonly comments?: readonly ReviewShowComment[];\n readonly review: ReviewShowReview;\n readonly todos?: readonly ReviewShowTodo[];\n}\n\ninterface TodoListItem {\n readonly completed: boolean;\n readonly content: string;\n readonly position: number;\n}\n\ninterface SourceListBranch {\n readonly current: boolean;\n readonly name: string;\n}\n\ninterface SourceListCommit {\n readonly author: string;\n readonly hash: string;\n readonly message: string;\n}\n\ninterface SourceListRepo {\n readonly branch: string;\n readonly name: string;\n readonly path: string;\n readonly remote: string | null;\n}\n\ninterface SourceListStagedFile {\n readonly path: string;\n readonly status: string;\n}\n\ninterface SourceListData {\n readonly branches: readonly SourceListBranch[];\n readonly commits: readonly SourceListCommit[];\n readonly repo: SourceListRepo;\n readonly stagedFiles: readonly SourceListStagedFile[];\n}\n\n// ---------------------------------------------------------------------------\n// Renderers (pure functions, no effects)\n// ---------------------------------------------------------------------------\n\nconst formatTable = (\n headers: readonly string[],\n rows: readonly (readonly string[])[]\n): string => {\n const widths = headers.map((header, index) => {\n const cellWidths = rows.map((row) => row[index]?.length ?? 0);\n return Math.max(header.length, ...cellWidths);\n });\n\n const renderRow = (row: readonly string[]) =>\n row\n .map((cell, index) => cell.padEnd(widths.at(index) ?? 0))\n .join(\" \")\n .trimEnd();\n\n return [\n renderRow(headers),\n renderRow(widths.map((width) => \"-\".repeat(width))),\n ...rows.map(renderRow),\n ].join(\"\\n\");\n};\n\nconst renderReviewList = (reviews: readonly ReviewListRow[]): string => {\n if (reviews.length === 0) {\n return \"No reviews found.\";\n }\n\n return formatTable(\n [\"ID\", \"STATUS\", \"SOURCE\", \"FILES\", \"CREATED\"],\n reviews.map((review) => [\n review.id,\n review.status,\n review.sourceType,\n String(review.fileCount),\n review.createdAt,\n ])\n );\n};\n\nconst renderReviewShow = (input: ReviewShowData): string => {\n const { comments, review, todos } = input;\n const lines = [\n `Review ${review.id}`,\n `Status: ${review.status}`,\n `Source: ${review.sourceType}${review.sourceRef ? ` (${review.sourceRef})` : \"\"}`,\n `Created: ${review.createdAt}`,\n `Files: ${review.summary.totalFiles}`,\n `Diff: +${review.summary.totalAdditions} / -${review.summary.totalDeletions}`,\n ];\n\n if (review.files.length > 0) {\n lines.push(\"\", \"Files:\");\n for (const file of review.files) {\n lines.push(\n `- ${file.status.toUpperCase()} ${file.filePath} (+${file.additions} -${file.deletions})`\n );\n }\n }\n\n if (comments && comments.length > 0) {\n lines.push(\"\", \"Comments:\");\n for (const comment of comments) {\n const location = `${comment.filePath}:${comment.lineNumber ?? \"-\"}`;\n const state = comment.resolved ? \"resolved\" : \"open\";\n lines.push(`- [${state}] ${location} ${comment.content}`);\n }\n }\n\n if (todos && todos.length > 0) {\n lines.push(\"\", \"Todos:\");\n for (const todo of todos) {\n const marker = todo.completed ? \"x\" : \" \";\n lines.push(`- [${marker}] (${todo.position + 1}) ${todo.content}`);\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nconst renderTodoList = (todos: readonly TodoListItem[]): string => {\n if (todos.length === 0) {\n return \"No todos found.\";\n }\n\n return todos\n .map(\n (todo) =>\n `- [${todo.completed ? \"x\" : \" \"}] (${todo.position + 1}) ${todo.content}`\n )\n .join(\"\\n\");\n};\n\nconst renderSourceList = (input: SourceListData): string => {\n const lines = [\n `Repository: ${input.repo.name}`,\n `Path: ${input.repo.path}`,\n `Current branch: ${input.repo.branch}`,\n `Staged files: ${input.stagedFiles.length}`,\n ];\n\n if (input.stagedFiles.length > 0) {\n lines.push(\"\", \"Staged:\");\n for (const file of input.stagedFiles) {\n lines.push(`- ${file.status} ${file.path}`);\n }\n }\n\n if (input.branches.length > 0) {\n lines.push(\"\", \"Branches:\");\n for (const branch of input.branches.slice(0, 10)) {\n lines.push(`- ${branch.current ? \"*\" : \" \"} ${branch.name}`);\n }\n }\n\n if (input.commits.length > 0) {\n lines.push(\"\", \"Recent commits:\");\n for (const commit of input.commits.slice(0, 5)) {\n lines.push(\n `- ${commit.hash.slice(0, 8)} ${commit.message} (${commit.author})`\n );\n }\n }\n\n return lines.join(\"\\n\");\n};\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the special \"last\" selector before show/export handlers ask the\n * shared services for a concrete review id.\n */\nconst resolveReviewSelector = Effect.fn(\"CLI.resolveReviewSelector\")(\n function* resolveReviewSelector(selector: string) {\n if (selector !== \"last\") {\n return selector as ReviewId;\n }\n\n const cliConfig = yield* CliConfig;\n const reviewService = yield* ReviewService;\n const result = yield* reviewService.list({\n page: 1,\n pageSize: 1,\n repositoryPath: cliConfig.repoRoot,\n });\n const [review] = result.reviews;\n\n if (!review) {\n return yield* new CliFailure({\n exitCode: ExitCode.ResourceNotFound,\n message: \"No review sessions exist for this repository yet.\",\n });\n }\n\n return review.id;\n }\n);\n\n/**\n * Mutating CLI commands stay server-backed so they share the same write path as\n * the other clients instead of growing a second local-only behavior surface.\n */\nconst requireServerMode = (label: string) =>\n Effect.fail(\n new CliFailure({\n details: \"Start 'ringi serve' and retry the command.\",\n exitCode: ExitCode.StateUnavailable,\n message: `${label} requires a running local Ringi server. Standalone local writes are intentionally unsupported.`,\n })\n );\n\n// ---------------------------------------------------------------------------\n// Diff source strategies (replaces switch in runSourceDiff)\n// ---------------------------------------------------------------------------\n\ntype DiffSourceStrategy = (\n git: GitService,\n command: Extract<ParsedCommand, { kind: \"source-diff\" }>\n) => Effect.Effect<string, unknown>;\n\nconst diffSourceStrategies: Readonly<Record<string, DiffSourceStrategy>> = {\n branch: (git, command) => git.getBranchDiff(command.branch ?? \"\"),\n commits: (git, command) =>\n git.getCommitDiff(\n (command.commits ?? \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n ),\n staged: (git) => git.getStagedDiff,\n};\n\n// ---------------------------------------------------------------------------\n// Command handlers (Effect.fn for tracing)\n// ---------------------------------------------------------------------------\n\nconst runReviewList = Effect.fn(\"CLI.reviewList\")(function* runReviewList(\n command: Extract<ParsedCommand, { kind: \"review-list\" }>\n) {\n const reviewService = yield* ReviewService;\n const cliConfig = yield* CliConfig;\n const result = yield* reviewService.list({\n page: command.page,\n pageSize: command.limit,\n repositoryPath: cliConfig.repoRoot,\n sourceType: command.source,\n status: command.status,\n });\n\n const nextActions: NextAction[] = [];\n for (const review of result.reviews.slice(0, 3)) {\n nextActions.push({\n command: `ringi review show ${review.id} --comments --todos`,\n description: `Inspect review ${review.id} (${review.status})`,\n });\n }\n if (result.reviews.length > 0) {\n nextActions.push({\n command: \"ringi review show <id> [--comments] [--todos]\",\n description: \"Show full review details\",\n params: {\n id: { description: \"Review ID or 'last'\", required: true },\n },\n });\n }\n nextActions.push({\n command: \"ringi review create [--source <source>]\",\n description: \"Create a new review session\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n });\n\n return {\n data: result,\n human: renderReviewList(result.reviews),\n nextActions,\n } satisfies CommandOutput<typeof result>;\n});\n\nconst runReviewShow = Effect.fn(\"CLI.reviewShow\")(function* runReviewShow(\n command: Extract<ParsedCommand, { kind: \"review-show\" }>\n) {\n const reviewService = yield* ReviewService;\n const todoService = yield* TodoService;\n const commentService = yield* CommentService;\n const reviewId = yield* resolveReviewSelector(command.id);\n const review = yield* reviewService.getById(reviewId);\n const comments = command.comments\n ? yield* commentService.getByReview(reviewId)\n : undefined;\n const todos = command.todos\n ? (yield* todoService.list({ reviewId })).data\n : undefined;\n\n const data = { comments, review, todos };\n const nextActions: NextAction[] = [\n {\n command: `ringi review export ${reviewId}`,\n description: \"Export this review as markdown\",\n },\n {\n command: `ringi review show ${reviewId} --comments --todos`,\n description: \"Show with comments and todos\",\n },\n {\n command: \"ringi todo list [--review <review-id>] [--status <status>]\",\n description: \"List todos for this review\",\n params: {\n \"review-id\": { value: reviewId },\n status: { default: \"pending\", enum: [\"pending\", \"done\", \"all\"] },\n },\n },\n {\n command: \"ringi review list\",\n description: \"Back to review list\",\n },\n ];\n\n return {\n data,\n human: renderReviewShow(data),\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runReviewExport = Effect.fn(\"CLI.reviewExport\")(function* runReviewExport(\n command: Extract<ParsedCommand, { kind: \"review-export\" }>\n) {\n if (command.noResolved || command.noSnippets) {\n yield* new CliFailure({\n exitCode: ExitCode.UsageError,\n message:\n \"--no-resolved and --no-snippets are documented, but the shared export service does not support adapter-level filtering yet.\",\n });\n }\n\n const exportService = yield* ExportService;\n const cliConfig = yield* CliConfig;\n const reviewId = yield* resolveReviewSelector(command.id);\n const markdown = yield* exportService.exportReview(reviewId);\n const outputPath = command.outputPath\n ? resolve(cliConfig.cwd, command.outputPath)\n : undefined;\n\n if (outputPath) {\n yield* Effect.tryPromise({\n catch: (error) =>\n new CliFailure({\n exitCode: ExitCode.RuntimeFailure,\n message: `Failed to write export to ${outputPath}: ${String(error)}`,\n }),\n try: () => writeFile(outputPath, markdown, \"utf8\"),\n });\n }\n\n const shouldPrintMarkdown = command.stdout || !outputPath;\n const data = { markdown, outputPath: outputPath ?? null, reviewId };\n\n const nextActions: NextAction[] = [\n {\n command: `ringi review show ${reviewId}`,\n description: \"View the exported review\",\n },\n {\n command: \"ringi review list\",\n description: \"Back to review list\",\n },\n ];\n\n return {\n data,\n human: shouldPrintMarkdown\n ? markdown\n : `Exported review ${reviewId} to ${outputPath}.`,\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runSourceList = Effect.fn(\"CLI.sourceList\")(function* runSourceList() {\n const gitService = yield* GitService;\n const repo = yield* gitService.getRepositoryInfo;\n const stagedFiles = yield* gitService.getStagedFiles;\n const branches = yield* gitService.getBranches;\n const commitsResult = yield* gitService.getCommits({\n limit: 10,\n offset: 0,\n });\n const data = {\n branches,\n commits: commitsResult.commits,\n repo,\n stagedFiles,\n };\n\n const nextActions: NextAction[] = [\n {\n command: \"ringi source diff <source> [--stat]\",\n description: \"View diff for a source\",\n params: {\n source: { enum: [\"staged\", \"branch\", \"commits\"] },\n },\n },\n {\n command: \"ringi review create [--source <source>]\",\n description: \"Create a review from a source\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n },\n {\n command: \"ringi review list\",\n description: \"List existing reviews\",\n },\n ];\n\n return {\n data,\n human: renderSourceList(data),\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runSourceDiff = Effect.fn(\"CLI.sourceDiff\")(function* runSourceDiff(\n command: Extract<ParsedCommand, { kind: \"source-diff\" }>\n) {\n const gitService = yield* GitService;\n const strategy = diffSourceStrategies[command.source];\n\n if (!strategy) {\n return yield* new CliFailure({\n exitCode: ExitCode.UsageError,\n message: \"Unsupported review source.\",\n });\n }\n\n const diffText = yield* strategy(gitService, command);\n\n if (!diffText.trim()) {\n yield* new CliFailure({\n exitCode: ExitCode.RuntimeFailure,\n message: \"No diff available for the requested source.\",\n });\n }\n\n const files = parseDiff(diffText);\n const data = {\n diff: diffText,\n source: command.source,\n summary: getDiffSummary(files),\n };\n\n const nextActions: NextAction[] = [\n {\n command: `ringi review create --source ${command.source}`,\n description: `Create a review from this ${command.source} diff`,\n },\n {\n command: \"ringi source list\",\n description: \"List repository sources\",\n },\n ];\n\n return {\n data,\n human: command.stat\n ? [\n `Source: ${command.source}`,\n `Files: ${data.summary.totalFiles}`,\n `Additions: ${data.summary.totalAdditions}`,\n `Deletions: ${data.summary.totalDeletions}`,\n ].join(\"\\n\")\n : diffText,\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runReviewStatus = Effect.fn(\"CLI.reviewStatus\")(function* runReviewStatus(\n command: Extract<ParsedCommand, { kind: \"review-status\" }>\n) {\n const reviewService = yield* ReviewService;\n const todoService = yield* TodoService;\n const commentService = yield* CommentService;\n const gitService = yield* GitService;\n const cliConfig = yield* CliConfig;\n\n const repo = yield* gitService.getRepositoryInfo;\n const stagedFiles = yield* gitService.getStagedFiles;\n\n // Resolve which review to show status for\n let reviewId: string | undefined;\n if (command.reviewId) {\n reviewId = yield* resolveReviewSelector(command.reviewId);\n }\n\n // Get the latest review if none specified\n const reviews = yield* reviewService.list({\n page: 1,\n pageSize: 1,\n repositoryPath: cliConfig.repoRoot,\n sourceType: command.source,\n });\n const latestReview = reviewId\n ? yield* reviewService.getById(reviewId as ReviewId)\n : reviews.reviews[0];\n\n let commentStats:\n | { resolved: number; total: number; unresolved: number }\n | undefined;\n let todoStats:\n | { completed: number; pending: number; total: number }\n | undefined;\n\n if (latestReview) {\n commentStats = yield* commentService.getStats(latestReview.id);\n todoStats = yield* todoService.getStats();\n }\n\n const data = {\n commentStats: commentStats ?? null,\n repository: {\n branch: repo.branch,\n name: repo.name,\n path: repo.path,\n stagedFileCount: stagedFiles.length,\n },\n review: latestReview\n ? {\n createdAt: latestReview.createdAt,\n id: latestReview.id,\n sourceType: latestReview.sourceType,\n status: latestReview.status,\n }\n : null,\n todoStats: todoStats ?? null,\n };\n\n const lines = [\n `Repository: ${repo.name}`,\n `Branch: ${repo.branch}`,\n `Staged files: ${stagedFiles.length}`,\n ];\n\n if (latestReview) {\n lines.push(\n \"\",\n `Review: ${latestReview.id}`,\n `Status: ${latestReview.status}`,\n `Source: ${latestReview.sourceType}`\n );\n if (commentStats) {\n lines.push(\n `Comments: ${commentStats.unresolved ?? 0} unresolved / ${commentStats.total} total`\n );\n }\n if (todoStats) {\n lines.push(\n `Todos: ${todoStats.pending} pending / ${todoStats.total} total`\n );\n }\n } else {\n lines.push(\"\", \"No review sessions found.\");\n }\n\n const nextActions: NextAction[] = [];\n if (latestReview) {\n nextActions.push(\n {\n command: `ringi review show ${latestReview.id} --comments --todos`,\n description: \"Inspect the latest review\",\n },\n {\n command: `ringi review export ${latestReview.id}`,\n description: \"Export the latest review\",\n }\n );\n }\n nextActions.push({\n command: \"ringi review create [--source <source>]\",\n description: \"Create a new review session\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n });\n\n return {\n data,\n human: lines.join(\"\\n\"),\n nextActions,\n } satisfies CommandOutput<typeof data>;\n});\n\nconst runTodoList = Effect.fn(\"CLI.todoList\")(function* runTodoList(\n command: Extract<ParsedCommand, { kind: \"todo-list\" }>\n) {\n const todoService = yield* TodoService;\n const result = yield* todoService.list({\n completed: command.status === \"all\" ? undefined : command.status === \"done\",\n limit: command.limit,\n offset: command.offset,\n reviewId: command.reviewId,\n });\n\n const nextActions: NextAction[] = [];\n if (command.reviewId) {\n nextActions.push({\n command: `ringi review show ${command.reviewId}`,\n description: \"View the associated review\",\n });\n }\n nextActions.push(\n {\n command: \"ringi todo add --text <text> [--review <review-id>]\",\n description: \"Add a new todo\",\n params: {\n text: { description: \"Todo text\", required: true },\n },\n },\n {\n command: \"ringi review list\",\n description: \"List reviews\",\n }\n );\n\n return {\n data: result,\n human: renderTodoList(result.data),\n nextActions,\n } satisfies CommandOutput<typeof result>;\n});\n\n// ---------------------------------------------------------------------------\n// Command registry (replaces switch-based dispatch)\n// ---------------------------------------------------------------------------\n\ntype CommandHandler = (\n command: ParsedCommand\n) => Effect.Effect<CommandOutput<unknown>, unknown, unknown>;\n\n/**\n * Data-driven command registry. Each command kind maps to its handler.\n * Adding a new command means adding one entry — no switch duplication.\n */\nconst COMMAND_HANDLERS: Readonly<Record<string, CommandHandler>> = {\n \"data-migrate\": () => requireServerMode(\"ringi data migrate\"),\n \"data-reset\": () => requireServerMode(\"ringi data reset\"),\n doctor: () =>\n Effect.succeed({\n data: { checks: [], ok: true },\n human: \"ringi doctor: not yet implemented.\",\n nextActions: [],\n } satisfies CommandOutput<unknown>),\n events: () => requireServerMode(\"ringi events\"),\n mcp: () =>\n Effect.fail(\n new CliFailure({\n exitCode: ExitCode.UsageError,\n message:\n \"ringi mcp is a runtime command. Use it directly, not through the command dispatcher.\",\n })\n ),\n \"review-create\": () => requireServerMode(\"ringi review create\"),\n \"review-export\": (c) =>\n runReviewExport(c as Extract<ParsedCommand, { kind: \"review-export\" }>),\n \"review-list\": (c) =>\n runReviewList(c as Extract<ParsedCommand, { kind: \"review-list\" }>),\n \"review-resolve\": () => requireServerMode(\"ringi review resolve\"),\n \"review-show\": (c) =>\n runReviewShow(c as Extract<ParsedCommand, { kind: \"review-show\" }>),\n \"review-status\": (c) =>\n runReviewStatus(c as Extract<ParsedCommand, { kind: \"review-status\" }>),\n serve: () =>\n Effect.fail(\n new CliFailure({\n exitCode: ExitCode.UsageError,\n message:\n \"ringi serve is a runtime command. Use it directly, not through the command dispatcher.\",\n })\n ),\n \"source-diff\": (c) =>\n runSourceDiff(c as Extract<ParsedCommand, { kind: \"source-diff\" }>),\n \"source-list\": () => runSourceList(),\n \"todo-add\": () => requireServerMode(\"ringi todo add\"),\n \"todo-clear\": () => requireServerMode(\"ringi todo clear\"),\n \"todo-done\": () => requireServerMode(\"ringi todo done\"),\n \"todo-list\": (c) =>\n runTodoList(c as Extract<ParsedCommand, { kind: \"todo-list\" }>),\n \"todo-move\": () => requireServerMode(\"ringi todo move\"),\n \"todo-remove\": () => requireServerMode(\"ringi todo remove\"),\n \"todo-undone\": () => requireServerMode(\"ringi todo undone\"),\n};\n\n/** Human-readable command label for the JSON envelope `command` field. */\nconst COMMAND_LABELS: Readonly<Record<string, string>> = {\n \"data-migrate\": \"ringi data migrate\",\n \"data-reset\": \"ringi data reset\",\n doctor: \"ringi doctor\",\n events: \"ringi events\",\n mcp: \"ringi mcp\",\n \"review-create\": \"ringi review create\",\n \"review-export\": \"ringi review export\",\n \"review-list\": \"ringi review list\",\n \"review-resolve\": \"ringi review resolve\",\n \"review-show\": \"ringi review show\",\n \"review-status\": \"ringi review status\",\n serve: \"ringi serve\",\n \"source-diff\": \"ringi source diff\",\n \"source-list\": \"ringi source list\",\n \"todo-add\": \"ringi todo add\",\n \"todo-clear\": \"ringi todo clear\",\n \"todo-done\": \"ringi todo done\",\n \"todo-list\": \"ringi todo list\",\n \"todo-move\": \"ringi todo move\",\n \"todo-remove\": \"ringi todo remove\",\n \"todo-undone\": \"ringi todo undone\",\n};\n\nexport const commandLabel = (command: ParsedCommand): string =>\n COMMAND_LABELS[command.kind] ?? `ringi ${command.kind}`;\n\nexport const runCommand = (command: ParsedCommand) => {\n const handler = COMMAND_HANDLERS[command.kind];\n if (!handler) {\n return Effect.fail(\n new CliFailure({\n exitCode: ExitCode.UsageError,\n message: `No executable handler exists for ${command.kind}.`,\n })\n );\n }\n return handler(command);\n};\n","import type {\n ReviewSourceType,\n ReviewStatus,\n} from \"@ringi/core/schemas/review\";\nimport * as Either from \"effect/Either\";\nimport * as Option from \"effect/Option\";\n\nimport { CliFailure, ExitCode } from \"@/cli/contracts\";\nimport type { GlobalOptions, ParsedCommand } from \"@/cli/contracts\";\n\n// ---------------------------------------------------------------------------\n// Shared validation sets\n// ---------------------------------------------------------------------------\n\nconst REVIEW_SOURCES = new Set<ReviewSourceType>([\n \"branch\",\n \"commits\",\n \"staged\",\n]);\nconst REVIEW_STATUSES = new Set<ReviewStatus>([\n \"approved\",\n \"changes_requested\",\n \"in_progress\",\n]);\nconst TODO_STATUSES = new Set<string>([\"all\", \"done\", \"pending\"]);\n\n// ---------------------------------------------------------------------------\n// Parse state\n// ---------------------------------------------------------------------------\n\ninterface ParseState {\n index: number;\n readonly options: GlobalOptions;\n readonly tokens: readonly string[];\n}\n\ntype ParseResult = Either.Either<ParsedCommand, CliFailure>;\n\nconst usageError = (message: string): CliFailure =>\n new CliFailure({ exitCode: ExitCode.UsageError, message });\n\n// ---------------------------------------------------------------------------\n// Reusable value extractors\n// ---------------------------------------------------------------------------\n\n/**\n * Consumes the next token as a flag value, advancing the cursor by 2.\n * Rejects another flag in the value slot so typos fail fast.\n */\nconst requireValue = (\n state: ParseState,\n flag: string\n): Option.Option<CliFailure> => {\n const value = state.tokens[state.index + 1];\n if (!value || value.startsWith(\"-\")) {\n return Option.some(usageError(`Missing value for ${flag}.`));\n }\n state.index += 2;\n return Option.none();\n};\n\n/** Peek at the value that {@link requireValue} would consume. */\nconst peekValue = (state: ParseState): string =>\n state.tokens[state.index + 1] ?? \"\";\n\nconst decodePositiveInt = (\n raw: string,\n flag: string\n): Either.Either<number, CliFailure> => {\n const value = Number.parseInt(raw, 10);\n if (!Number.isInteger(value) || value < 0) {\n return Either.left(usageError(`${flag} must be a non-negative integer.`));\n }\n return Either.right(value);\n};\n\nconst decodeEnum = <T extends string>(\n raw: string,\n valid: ReadonlySet<T>,\n label: string\n): Either.Either<T, CliFailure> => {\n if (!valid.has(raw as T)) {\n return Either.left(usageError(`Invalid ${label}: ${raw}.`));\n }\n return Either.right(raw as T);\n};\n\n// ---------------------------------------------------------------------------\n// Flag handler framework\n// ---------------------------------------------------------------------------\n\n/**\n * A flag handler receives the parse state and a mutable accumulator.\n * It returns `Option.some(CliFailure)` on error, `Option.none()` on success.\n * Cursor advancement is handled by the handler (1 for booleans, 2 for values\n * via {@link requireValue}).\n */\ntype FlagHandler<Acc> = (\n state: ParseState,\n acc: Acc\n) => Option.Option<CliFailure>;\n\n// -- Flag handler factories -------------------------------------------------\n\n/** Boolean flag: sets a key to `true`, advances cursor by 1. */\nconst boolFlag =\n <Acc>(key: keyof Acc & string): FlagHandler<Acc> =>\n (state, acc) => {\n (acc as Record<string, unknown>)[key] = true;\n state.index += 1;\n return Option.none();\n };\n\n/** String flag: consumes next token, assigns to key. */\nconst stringFlag =\n <Acc>(key: keyof Acc & string): FlagHandler<Acc> =>\n (state, acc) => {\n const flag = state.tokens[state.index] ?? \"\";\n const value = peekValue(state);\n const error = requireValue(state, flag);\n if (Option.isSome(error)) {\n return error;\n }\n (acc as Record<string, unknown>)[key] = value;\n return Option.none();\n };\n\n/** Positive integer flag with an optional minimum (exclusive). */\nconst positiveIntFlag =\n <Acc>(\n key: keyof Acc & string,\n opts?: { readonly min?: number }\n ): FlagHandler<Acc> =>\n (state, acc) => {\n const flag = state.tokens[state.index] ?? \"\";\n const raw = peekValue(state);\n const error = requireValue(state, flag);\n if (Option.isSome(error)) {\n return error;\n }\n const decoded = decodePositiveInt(raw, flag);\n if (Either.isLeft(decoded)) {\n return Option.some(decoded.left);\n }\n if (opts?.min !== undefined && decoded.right <= opts.min) {\n return Option.some(\n usageError(`${flag} must be greater than ${opts.min}.`)\n );\n }\n (acc as Record<string, unknown>)[key] = decoded.right;\n return Option.none();\n };\n\n/** Enum flag: consumes next token, validates membership, assigns to key. */\nconst enumFlag =\n <Acc>(\n key: keyof Acc & string,\n valid: ReadonlySet<string>,\n label: string\n ): FlagHandler<Acc> =>\n (state, acc) => {\n const flag = state.tokens[state.index] ?? \"\";\n const raw = peekValue(state);\n const error = requireValue(state, flag);\n if (Option.isSome(error)) {\n return error;\n }\n const decoded = decodeEnum(raw, valid, label);\n if (Either.isLeft(decoded)) {\n return Option.some(decoded.left);\n }\n (acc as Record<string, unknown>)[key] = decoded.right;\n return Option.none();\n };\n\n// ---------------------------------------------------------------------------\n// Global flags (must precede runFlagLoop which calls maybeParseGlobalFlag)\n// ---------------------------------------------------------------------------\n\nconst createDefaultOptions = (): GlobalOptions => ({\n color: true,\n dbPath: undefined,\n help: false,\n json: false,\n quiet: false,\n repo: undefined,\n verbose: false,\n version: false,\n});\n\n/**\n * Global flags are accepted before or after subcommands because wrappers often\n * prepend them without preserving the CLI's preferred ordering.\n */\nconst GLOBAL_FLAG_HANDLERS: Readonly<\n Record<string, FlagHandler<GlobalOptions>>\n> = {\n \"--db-path\": stringFlag(\"dbPath\"),\n \"--help\": boolFlag(\"help\"),\n \"--json\": boolFlag(\"json\"),\n \"--no-color\": (state, acc) => {\n acc.color = false;\n state.index += 1;\n return Option.none();\n },\n \"--quiet\": boolFlag(\"quiet\"),\n \"--repo\": stringFlag(\"repo\"),\n \"--verbose\": boolFlag(\"verbose\"),\n \"--version\": boolFlag(\"version\"),\n};\n\nconst maybeParseGlobalFlag = (state: ParseState): boolean => {\n const token = state.tokens[state.index];\n if (!token) {\n return false;\n }\n const handler = GLOBAL_FLAG_HANDLERS[token];\n if (!handler) {\n return false;\n }\n // Global flag handlers do not fail — they just set values.\n handler(state, state.options);\n return true;\n};\n\n// -- Generic flag loop runner -----------------------------------------------\n\n/**\n * Consumes all remaining tokens in {@link state} by dispatching to the matching\n * handler in {@link handlers}. Global flags are tried first. Unknown flags\n * produce a usage error naming the {@link commandLabel}.\n */\nconst runFlagLoop = <Acc>(\n state: ParseState,\n acc: Acc,\n handlers: Readonly<Record<string, FlagHandler<Acc>>>,\n commandLabel: string\n): Option.Option<CliFailure> => {\n while (state.index < state.tokens.length) {\n if (maybeParseGlobalFlag(state)) {\n continue;\n }\n const token = state.tokens[state.index] ?? \"\";\n const handler = handlers[token];\n if (!handler) {\n return Option.some(\n usageError(`Unknown flag for ${commandLabel}: ${token}.`)\n );\n }\n const error = handler(state, acc);\n if (Option.isSome(error)) {\n return error;\n }\n }\n return Option.none();\n};\n\n// ---------------------------------------------------------------------------\n// Command parsers (table-driven)\n// ---------------------------------------------------------------------------\n\n// -- review list ------------------------------------------------------------\n\ninterface ReviewListAcc {\n limit: number;\n page: number;\n source: ReviewSourceType | undefined;\n status: ReviewStatus | undefined;\n}\n\nconst REVIEW_LIST_FLAGS: Readonly<Record<string, FlagHandler<ReviewListAcc>>> =\n {\n \"--limit\": positiveIntFlag(\"limit\", { min: 0 }),\n \"--page\": positiveIntFlag(\"page\", { min: 0 }),\n \"--source\": enumFlag(\"source\", REVIEW_SOURCES, \"review source\"),\n \"--status\": enumFlag(\"status\", REVIEW_STATUSES, \"review status\"),\n };\n\nconst parseReviewList = (state: ParseState): ParseResult => {\n const acc: ReviewListAcc = {\n limit: 20,\n page: 1,\n source: undefined,\n status: undefined,\n };\n const error = runFlagLoop(state, acc, REVIEW_LIST_FLAGS, \"review list\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"review-list\" as const, ...acc });\n};\n\n// -- review show ------------------------------------------------------------\n\ninterface ReviewShowAcc {\n comments: boolean;\n todos: boolean;\n}\n\nconst REVIEW_SHOW_FLAGS: Readonly<Record<string, FlagHandler<ReviewShowAcc>>> =\n {\n \"--comments\": boolFlag(\"comments\"),\n \"--todos\": boolFlag(\"todos\"),\n };\n\nconst parseReviewShow = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"review show requires <id|last>.\"));\n }\n state.index += 1;\n\n const acc: ReviewShowAcc = { comments: false, todos: false };\n const error = runFlagLoop(state, acc, REVIEW_SHOW_FLAGS, \"review show\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"review-show\" as const, ...acc });\n};\n\n// -- review export ----------------------------------------------------------\n\ninterface ReviewExportAcc {\n noResolved: boolean;\n noSnippets: boolean;\n outputPath: string | undefined;\n stdout: boolean;\n}\n\nconst REVIEW_EXPORT_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewExportAcc>>\n> = {\n \"--no-resolved\": boolFlag(\"noResolved\"),\n \"--no-snippets\": boolFlag(\"noSnippets\"),\n \"--output\": stringFlag(\"outputPath\"),\n \"--stdout\": boolFlag(\"stdout\"),\n};\n\nconst parseReviewExport = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"review export requires <id|last>.\"));\n }\n state.index += 1;\n\n const acc: ReviewExportAcc = {\n noResolved: false,\n noSnippets: false,\n outputPath: undefined,\n stdout: false,\n };\n const error = runFlagLoop(state, acc, REVIEW_EXPORT_FLAGS, \"review export\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"review-export\" as const, ...acc });\n};\n\n// -- review create ----------------------------------------------------------\n\ninterface ReviewCreateAcc {\n branch: string | undefined;\n commits: string | undefined;\n source: ReviewSourceType;\n title: string | undefined;\n}\n\nconst REVIEW_CREATE_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewCreateAcc>>\n> = {\n \"--branch\": stringFlag(\"branch\"),\n \"--commits\": stringFlag(\"commits\"),\n \"--source\": enumFlag(\"source\", REVIEW_SOURCES, \"review source\"),\n \"--title\": stringFlag(\"title\"),\n};\n\nconst validateReviewCreate = (\n acc: ReviewCreateAcc\n): Option.Option<CliFailure> => {\n if (acc.source === \"branch\" && !acc.branch) {\n return Option.some(\n usageError(\"review create --source branch requires --branch.\")\n );\n }\n if (acc.source === \"commits\" && !acc.commits) {\n return Option.some(\n usageError(\"review create --source commits requires --commits.\")\n );\n }\n if (acc.source === \"staged\" && (acc.branch || acc.commits)) {\n return Option.some(\n usageError(\n \"review create --source staged does not accept --branch or --commits.\"\n )\n );\n }\n return Option.none();\n};\n\nconst parseReviewCreate = (state: ParseState): ParseResult => {\n const acc: ReviewCreateAcc = {\n branch: undefined,\n commits: undefined,\n source: \"staged\",\n title: undefined,\n };\n const error = runFlagLoop(state, acc, REVIEW_CREATE_FLAGS, \"review create\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n const validationError = validateReviewCreate(acc);\n if (Option.isSome(validationError)) {\n return Either.left(validationError.value);\n }\n return Either.right({ kind: \"review-create\" as const, ...acc });\n};\n\n// -- source diff ------------------------------------------------------------\n\ninterface SourceDiffAcc {\n branch: string | undefined;\n commits: string | undefined;\n stat: boolean;\n}\n\nconst SOURCE_DIFF_FLAGS: Readonly<Record<string, FlagHandler<SourceDiffAcc>>> =\n {\n \"--branch\": stringFlag(\"branch\"),\n \"--commits\": stringFlag(\"commits\"),\n \"--stat\": boolFlag(\"stat\"),\n };\n\nconst validateSourceDiff = (\n source: ReviewSourceType,\n acc: SourceDiffAcc\n): Option.Option<CliFailure> => {\n if (source === \"branch\" && !acc.branch) {\n return Option.some(usageError(\"source diff branch requires --branch.\"));\n }\n if (source === \"commits\" && !acc.commits) {\n return Option.some(usageError(\"source diff commits requires --commits.\"));\n }\n return Option.none();\n};\n\nconst parseSourceDiff = (state: ParseState): ParseResult => {\n const source = state.tokens[state.index] as ReviewSourceType | undefined;\n if (!source || !REVIEW_SOURCES.has(source)) {\n return Either.left(\n usageError(\"source diff requires <staged|branch|commits>.\")\n );\n }\n state.index += 1;\n\n const acc: SourceDiffAcc = {\n branch: undefined,\n commits: undefined,\n stat: false,\n };\n const error = runFlagLoop(state, acc, SOURCE_DIFF_FLAGS, \"source diff\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n const validationError = validateSourceDiff(source, acc);\n if (Option.isSome(validationError)) {\n return Either.left(validationError.value);\n }\n return Either.right({ kind: \"source-diff\" as const, source, ...acc });\n};\n\n// -- todo list --------------------------------------------------------------\n\ninterface TodoListAcc {\n limit: number | undefined;\n offset: number;\n reviewId: string | undefined;\n status: \"all\" | \"done\" | \"pending\";\n}\n\nconst TODO_LIST_FLAGS: Readonly<Record<string, FlagHandler<TodoListAcc>>> = {\n \"--limit\": positiveIntFlag(\"limit\"),\n \"--offset\": positiveIntFlag(\"offset\"),\n \"--review\": stringFlag(\"reviewId\"),\n \"--status\": enumFlag(\"status\", TODO_STATUSES, \"todo status\"),\n};\n\nconst parseTodoList = (state: ParseState): ParseResult => {\n const acc: TodoListAcc = {\n limit: undefined,\n offset: 0,\n reviewId: undefined,\n status: \"pending\",\n };\n const error = runFlagLoop(state, acc, TODO_LIST_FLAGS, \"todo list\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"todo-list\" as const, ...acc });\n};\n\n// -- positional-id-only commands (shared factory) ---------------------------\n\n/**\n * Factory for commands that take exactly one positional `<id>` and no\n * command-specific flags (only globals). Avoids duplication for done/undone.\n */\nconst positionalIdParser =\n <K extends string>(kind: K, label: string) =>\n (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(`${label} requires <id>.`));\n }\n state.index += 1;\n\n while (state.index < state.tokens.length) {\n if (!maybeParseGlobalFlag(state)) {\n return Either.left(\n usageError(`Unknown flag for ${label}: ${state.tokens[state.index]}.`)\n );\n }\n }\n return Either.right({ id, kind } as ParsedCommand);\n };\n\nconst parseTodoDone = positionalIdParser(\"todo-done\" as const, \"todo done\");\nconst parseTodoUndone = positionalIdParser(\n \"todo-undone\" as const,\n \"todo undone\"\n);\n\n// -- todo move --------------------------------------------------------------\n\ninterface TodoMoveAcc {\n position: number | undefined;\n}\n\nconst TODO_MOVE_FLAGS: Readonly<Record<string, FlagHandler<TodoMoveAcc>>> = {\n \"--position\": positiveIntFlag(\"position\"),\n};\n\nconst parseTodoMove = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"todo move requires <id>.\"));\n }\n state.index += 1;\n\n const acc: TodoMoveAcc = { position: undefined };\n const error = runFlagLoop(state, acc, TODO_MOVE_FLAGS, \"todo move\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n if (acc.position === undefined) {\n return Either.left(usageError(\"todo move requires --position.\"));\n }\n return Either.right({\n id,\n kind: \"todo-move\" as const,\n position: acc.position,\n });\n};\n\n// -- todo remove ------------------------------------------------------------\n\ninterface TodoRemoveAcc {\n yes: boolean;\n}\n\nconst TODO_REMOVE_FLAGS: Readonly<Record<string, FlagHandler<TodoRemoveAcc>>> =\n {\n \"--yes\": boolFlag(\"yes\"),\n };\n\nconst parseTodoRemove = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"todo remove requires <id>.\"));\n }\n state.index += 1;\n\n const acc: TodoRemoveAcc = { yes: false };\n const error = runFlagLoop(state, acc, TODO_REMOVE_FLAGS, \"todo remove\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"todo-remove\" as const, ...acc });\n};\n\n// -- todo clear -------------------------------------------------------------\n\ninterface TodoClearAcc {\n all: boolean;\n doneOnly: boolean;\n reviewId: string | undefined;\n yes: boolean;\n}\n\nconst TODO_CLEAR_FLAGS: Readonly<Record<string, FlagHandler<TodoClearAcc>>> = {\n \"--all\": boolFlag(\"all\"),\n \"--done-only\": boolFlag(\"doneOnly\"),\n \"--review\": stringFlag(\"reviewId\"),\n \"--yes\": boolFlag(\"yes\"),\n};\n\nconst parseTodoClear = (state: ParseState): ParseResult => {\n const acc: TodoClearAcc = {\n all: false,\n doneOnly: true,\n reviewId: undefined,\n yes: false,\n };\n const error = runFlagLoop(state, acc, TODO_CLEAR_FLAGS, \"todo clear\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"todo-clear\" as const, ...acc });\n};\n\n// -- review status ----------------------------------------------------------\n\ninterface ReviewStatusAcc {\n reviewId: string | undefined;\n source: ReviewSourceType | undefined;\n}\n\nconst REVIEW_STATUS_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewStatusAcc>>\n> = {\n \"--review\": stringFlag(\"reviewId\"),\n \"--source\": enumFlag(\"source\", REVIEW_SOURCES, \"review source\"),\n};\n\nconst parseReviewStatus = (state: ParseState): ParseResult => {\n const acc: ReviewStatusAcc = { reviewId: undefined, source: undefined };\n const error = runFlagLoop(state, acc, REVIEW_STATUS_FLAGS, \"review status\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"review-status\" as const, ...acc });\n};\n\n// -- review resolve ---------------------------------------------------------\n\ninterface ReviewResolveAcc {\n allComments: boolean;\n yes: boolean;\n}\n\nconst REVIEW_RESOLVE_FLAGS: Readonly<\n Record<string, FlagHandler<ReviewResolveAcc>>\n> = {\n \"--all-comments\": boolFlag(\"allComments\"),\n \"--yes\": boolFlag(\"yes\"),\n};\n\nconst parseReviewResolve = (state: ParseState): ParseResult => {\n const id = state.tokens[state.index];\n if (!id) {\n return Either.left(usageError(\"review resolve requires <id|last>.\"));\n }\n state.index += 1;\n\n const acc: ReviewResolveAcc = { allComments: true, yes: false };\n const error = runFlagLoop(state, acc, REVIEW_RESOLVE_FLAGS, \"review resolve\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ id, kind: \"review-resolve\" as const, ...acc });\n};\n\n// -- todo add ---------------------------------------------------------------\n\ninterface TodoAddAcc {\n position: number | undefined;\n reviewId: string | undefined;\n text: string;\n}\n\nconst TODO_ADD_FLAGS: Readonly<Record<string, FlagHandler<TodoAddAcc>>> = {\n \"--position\": positiveIntFlag(\"position\"),\n \"--review\": stringFlag(\"reviewId\"),\n \"--text\": stringFlag(\"text\"),\n};\n\nconst parseTodoAdd = (state: ParseState): ParseResult => {\n const acc: TodoAddAcc = {\n position: undefined,\n reviewId: undefined,\n text: \"\",\n };\n const error = runFlagLoop(state, acc, TODO_ADD_FLAGS, \"todo add\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n if (!acc.text.trim()) {\n return Either.left(usageError(\"todo add requires --text.\"));\n }\n return Either.right({ kind: \"todo-add\" as const, ...acc });\n};\n\n// -- serve ------------------------------------------------------------------\n\ninterface ServeAcc {\n auth: boolean;\n cert: string | undefined;\n host: string;\n https: boolean;\n key: string | undefined;\n noOpen: boolean;\n password: string | undefined;\n port: number;\n username: string | undefined;\n}\n\nconst SERVE_FLAGS: Readonly<Record<string, FlagHandler<ServeAcc>>> = {\n \"--auth\": boolFlag(\"auth\"),\n \"--cert\": stringFlag(\"cert\"),\n \"--host\": stringFlag(\"host\"),\n \"--https\": boolFlag(\"https\"),\n \"--key\": stringFlag(\"key\"),\n \"--no-open\": boolFlag(\"noOpen\"),\n \"--password\": stringFlag(\"password\"),\n \"--port\": positiveIntFlag(\"port\", { min: 0 }),\n \"--username\": stringFlag(\"username\"),\n};\n\nconst parseServe = (state: ParseState): ParseResult => {\n const acc: ServeAcc = {\n auth: false,\n cert: undefined,\n host: \"127.0.0.1\",\n https: false,\n key: undefined,\n noOpen: false,\n password: undefined,\n port: 3000,\n username: undefined,\n };\n const error = runFlagLoop(state, acc, SERVE_FLAGS, \"serve\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"serve\" as const, ...acc });\n};\n\n// -- mcp --------------------------------------------------------------------\n\nconst MCP_LOG_LEVELS = new Set<string>([\"debug\", \"error\", \"info\", \"silent\"]);\n\ninterface McpAcc {\n logLevel: \"debug\" | \"error\" | \"info\" | \"silent\";\n readonly: boolean;\n}\n\nconst MCP_FLAGS: Readonly<Record<string, FlagHandler<McpAcc>>> = {\n \"--log-level\": enumFlag(\"logLevel\", MCP_LOG_LEVELS, \"log level\"),\n \"--readonly\": boolFlag(\"readonly\"),\n};\n\nconst parseMcp = (state: ParseState): ParseResult => {\n const acc: McpAcc = { logLevel: \"error\", readonly: false };\n const error = runFlagLoop(state, acc, MCP_FLAGS, \"mcp\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"mcp\" as const, ...acc });\n};\n\n// -- events -----------------------------------------------------------------\n\nconst EVENT_TYPES = new Set<string>([\"comments\", \"files\", \"reviews\", \"todos\"]);\n\ninterface EventsAcc {\n since: number | undefined;\n type: \"comments\" | \"files\" | \"reviews\" | \"todos\" | undefined;\n}\n\nconst EVENTS_FLAGS: Readonly<Record<string, FlagHandler<EventsAcc>>> = {\n \"--since\": positiveIntFlag(\"since\"),\n \"--type\": enumFlag(\"type\", EVENT_TYPES, \"event type\"),\n};\n\nconst parseEvents = (state: ParseState): ParseResult => {\n const acc: EventsAcc = { since: undefined, type: undefined };\n const error = runFlagLoop(state, acc, EVENTS_FLAGS, \"events\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"events\" as const, ...acc });\n};\n\n// -- data reset -------------------------------------------------------------\n\ninterface DataResetAcc {\n keepExports: boolean;\n yes: boolean;\n}\n\nconst DATA_RESET_FLAGS: Readonly<Record<string, FlagHandler<DataResetAcc>>> = {\n \"--keep-exports\": boolFlag(\"keepExports\"),\n \"--yes\": boolFlag(\"yes\"),\n};\n\nconst parseDataReset = (state: ParseState): ParseResult => {\n const acc: DataResetAcc = { keepExports: false, yes: false };\n const error = runFlagLoop(state, acc, DATA_RESET_FLAGS, \"data reset\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"data-reset\" as const, ...acc });\n};\n\n// ---------------------------------------------------------------------------\n// Command family dispatch (lookup tables)\n// ---------------------------------------------------------------------------\n\nconst ensureNoExtraArgs = (\n state: ParseState,\n label: string\n): Option.Option<CliFailure> => {\n if (state.index < state.tokens.length) {\n return Option.some(\n usageError(\n `Unexpected argument for ${label}: ${state.tokens[state.index]}.`\n )\n );\n }\n return Option.none();\n};\n\n/** Review verb parsers keyed by verb name. */\nconst REVIEW_VERB_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n create: parseReviewCreate,\n export: parseReviewExport,\n list: parseReviewList,\n resolve: parseReviewResolve,\n show: parseReviewShow,\n status: parseReviewStatus,\n};\n\n/** Todo verb parsers keyed by verb name. */\nconst TODO_VERB_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n add: parseTodoAdd,\n clear: parseTodoClear,\n done: parseTodoDone,\n list: parseTodoList,\n move: parseTodoMove,\n remove: parseTodoRemove,\n undone: parseTodoUndone,\n};\n\n/** Subcommand family parsers keyed by family name. */\n/** Data verb parsers keyed by verb name. */\nconst DATA_VERB_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n migrate: (state) => {\n const error = ensureNoExtraArgs(state, \"data migrate\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"data-migrate\" as const });\n },\n reset: parseDataReset,\n};\n\n/** Subcommand family parsers keyed by family name. */\nconst FAMILY_PARSERS: Readonly<\n Record<string, (state: ParseState) => ParseResult>\n> = {\n data: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"data\"] as const,\n });\n }\n state.index += 1;\n const parser = DATA_VERB_PARSERS[verb];\n if (!parser) {\n return Either.left(usageError(`Unknown data command: ${verb}.`));\n }\n return parser(state);\n },\n doctor: (state) => {\n const error = ensureNoExtraArgs(state, \"doctor\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"doctor\" as const });\n },\n events: parseEvents,\n export: parseReviewExport,\n mcp: parseMcp,\n review: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"review\"] as const,\n });\n }\n state.index += 1;\n const parser = REVIEW_VERB_PARSERS[verb];\n if (!parser) {\n return Either.left(usageError(`Unknown review command: ${verb}.`));\n }\n return parser(state);\n },\n serve: parseServe,\n source: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"source\"] as const,\n });\n }\n state.index += 1;\n if (verb === \"list\") {\n const error = ensureNoExtraArgs(state, \"source list\");\n if (Option.isSome(error)) {\n return Either.left(error.value);\n }\n return Either.right({ kind: \"source-list\" as const });\n }\n if (verb === \"diff\") {\n return parseSourceDiff(state);\n }\n return Either.left(usageError(`Unknown source command: ${verb}.`));\n },\n todo: (state) => {\n const verb = state.tokens[state.index];\n if (!verb) {\n return Either.right({\n kind: \"help\" as const,\n topic: [\"todo\"] as const,\n });\n }\n state.index += 1;\n const parser = TODO_VERB_PARSERS[verb];\n if (!parser) {\n return Either.left(usageError(`Unknown todo command: ${verb}.`));\n }\n return parser(state);\n },\n};\n\n// ---------------------------------------------------------------------------\n// Top-level entry\n// ---------------------------------------------------------------------------\n\n/**\n * Strips any leading globals with {@link maybeParseGlobalFlag} before dispatching\n * into a command family so `--help` and `--version` behave consistently.\n */\nconst parseWithState = (state: ParseState): ParseResult => {\n while (state.index < state.tokens.length && maybeParseGlobalFlag(state)) {\n // Keep consuming top-level flags before the command token.\n }\n\n if (state.options.version) {\n return Either.right({ kind: \"version\" as const });\n }\n\n if (state.index >= state.tokens.length) {\n return Either.right({ kind: \"help\" as const, topic: [] });\n }\n\n const first = state.tokens[state.index];\n if (!first) {\n return Either.right({ kind: \"help\" as const, topic: [] });\n }\n if (first === \"help\") {\n const topic = state.tokens.slice(state.index + 1);\n state.index = state.tokens.length;\n return Either.right({ kind: \"help\" as const, topic });\n }\n\n if (state.options.help) {\n return Either.right({\n kind: \"help\" as const,\n topic: state.tokens.slice(state.index),\n });\n }\n\n state.index += 1;\n\n const familyParser = FAMILY_PARSERS[first];\n if (!familyParser) {\n return Either.left(usageError(`Unknown command: ${first}.`));\n }\n return familyParser(state);\n};\n\nexport const parseCliArgs = (\n argv: readonly string[]\n): Either.Either<\n { readonly command: ParsedCommand; readonly options: GlobalOptions },\n CliFailure\n> => {\n const options = createDefaultOptions();\n const state: ParseState = { index: 0, options, tokens: argv };\n const result = parseWithState(state);\n if (Either.isLeft(result)) {\n return Either.left(result.left);\n }\n return Either.right({ command: result.right, options });\n};\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { CoreLive } from \"@ringi/core/runtime\";\nimport { GitService } from \"@ringi/core/services/git.service\";\nimport * as ConfigProvider from \"effect/ConfigProvider\";\nimport * as Layer from \"effect/Layer\";\nimport * as ManagedRuntime from \"effect/ManagedRuntime\";\n\nimport { CliConfigLive } from \"@/cli/config\";\nimport type { CliConfigShape } from \"@/cli/config\";\nimport { CliFailure, ExitCode } from \"@/cli/contracts\";\nimport type { ParsedCommand } from \"@/cli/contracts\";\n\n/**\n * Bundles the resolved config with the matching runtime so the CLI can share\n * one setup and disposal path.\n */\nexport interface CliRuntimeResources {\n readonly config: CliConfigShape;\n readonly runtime: ManagedRuntime.ManagedRuntime<any, any>;\n}\n\n/**\n * Resolves the repository root up front so every later git and database path is\n * anchored to the same directory, even when the user invoked the CLI elsewhere.\n *\n * NOTE: This uses execFileSync intentionally — it runs once at CLI startup\n * before the Effect runtime is constructed, so there is no fiber to block.\n * Moving this into the Effect runtime would create a circular dependency\n * (config → git → config).\n */\nconst resolveRepositoryRoot = (repoOverride?: string): CliFailure | string => {\n const cwd = repoOverride ? resolve(repoOverride) : process.cwd();\n\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n encoding: \"utf8\",\n }).trim();\n } catch {\n return new CliFailure({\n exitCode: ExitCode.StateUnavailable,\n message: repoOverride\n ? `Path ${cwd} is not a Git repository. Use --repo <path> with a valid repository root.`\n : `Could not resolve a Git repository from ${cwd}. Use --repo <path> with a valid repository root.`,\n });\n }\n};\n\nconst resolveDbPath = (repoRoot: string, dbPathOverride?: string): string =>\n dbPathOverride\n ? resolve(dbPathOverride)\n : resolve(repoRoot, \".ringi/reviews.db\");\n\nconst commandNeedsRepository = (command: ParsedCommand): boolean =>\n command.kind !== \"help\" &&\n command.kind !== \"version\" &&\n command.kind !== \"mcp\" &&\n command.kind !== \"serve\";\n\nexport const commandNeedsDatabase = (command: ParsedCommand): boolean =>\n command.kind === \"review-list\" ||\n command.kind === \"review-show\" ||\n command.kind === \"review-export\" ||\n command.kind === \"review-status\" ||\n command.kind === \"todo-list\" ||\n command.kind === \"doctor\";\n\nexport const commandUsesCoreRuntime = (command: ParsedCommand): boolean =>\n command.kind === \"review-list\" ||\n command.kind === \"review-show\" ||\n command.kind === \"review-export\" ||\n command.kind === \"review-status\" ||\n command.kind === \"todo-list\" ||\n command.kind === \"review-create\" ||\n command.kind === \"todo-add\" ||\n command.kind === \"doctor\";\n\nexport const resolveCliConfig = (args: {\n color: boolean;\n dbPath?: string;\n quiet: boolean;\n repo?: string;\n verbose: boolean;\n}): CliConfigShape | CliFailure => {\n const repoRootResult = resolveRepositoryRoot(args.repo);\n if (repoRootResult instanceof CliFailure) {\n return repoRootResult;\n }\n\n return {\n color: args.color,\n cwd: process.cwd(),\n dbPath: resolveDbPath(repoRootResult, args.dbPath),\n outputMode: \"human\",\n quiet: args.quiet,\n repoRoot: repoRootResult,\n verbose: args.verbose,\n };\n};\n\n/**\n * Read-only commands still depend on initialized local state because the shared\n * services use the same database-backed storage as the other clients.\n */\nexport const ensureLocalStateAvailable = (\n config: CliConfigShape\n): CliFailure | undefined => {\n if (!existsSync(config.dbPath)) {\n return new CliFailure({\n exitCode: ExitCode.StateUnavailable,\n message: `Local state is missing at ${config.dbPath}. Run 'ringi data migrate' or start 'ringi serve' once to initialize local state.`,\n });\n }\n return undefined;\n};\n\nconst makeConfigLayer = (config: CliConfigShape) =>\n Layer.setConfigProvider(\n ConfigProvider.fromMap(\n new Map([\n [\"DB_PATH\", config.dbPath],\n [\"REPOSITORY_PATH\", config.repoRoot],\n ])\n )\n );\n\nexport const createCoreCliRuntime = (config: CliConfigShape) =>\n ManagedRuntime.make(\n Layer.mergeAll(CoreLive, CliConfigLive(config)).pipe(\n Layer.provideMerge(makeConfigLayer(config))\n )\n );\n\nexport const createGitCliRuntime = (config: CliConfigShape) =>\n ManagedRuntime.make(\n Layer.mergeAll(GitService.Default, CliConfigLive(config)).pipe(\n Layer.provideMerge(makeConfigLayer(config))\n )\n );\n\n/**\n * Centralizes runtime selection. Returns either valid resources or a CliFailure.\n * Returns null for help/version commands that don't need a runtime.\n */\nexport const createCliRuntimeResources = (\n command: ParsedCommand,\n args: {\n color: boolean;\n dbPath?: string;\n quiet: boolean;\n repo?: string;\n verbose: boolean;\n }\n): CliFailure | CliRuntimeResources | null => {\n if (!commandNeedsRepository(command)) {\n return null;\n }\n\n const configResult = resolveCliConfig(args);\n if (configResult instanceof CliFailure) {\n return configResult;\n }\n\n if (commandNeedsDatabase(command)) {\n const stateError = ensureLocalStateAvailable(configResult);\n if (stateError) {\n return stateError;\n }\n }\n\n return {\n config: configResult,\n runtime: commandUsesCoreRuntime(command)\n ? createCoreCliRuntime(configResult)\n : createGitCliRuntime(configResult),\n };\n};\n","#!/usr/bin/env node\n\nimport { exec, fork } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { ReviewNotFound } from \"@ringi/core/schemas/review\";\nimport { TodoNotFound } from \"@ringi/core/schemas/todo\";\nimport type * as Effect from \"effect/Effect\";\nimport * as Either from \"effect/Either\";\n\nimport { commandLabel, runCommand } from \"@/cli/commands\";\nimport { CliFailure, ExitCode, failure, success } from \"@/cli/contracts\";\nimport type {\n CliErrorDetail,\n CliErrorEnvelope,\n CommandOutput,\n ErrorCategory,\n ExitCode as ExitCodeType,\n NextAction,\n ParsedCommand,\n} from \"@/cli/contracts\";\nimport { parseCliArgs } from \"@/cli/parser\";\nimport { createCliRuntimeResources } from \"@/cli/runtime\";\n\nconst CLI_VERSION =\n process.env.RINGI_VERSION ?? process.env.npm_package_version ?? \"0.0.0-dev\";\n\n// ---------------------------------------------------------------------------\n// Self-documenting command tree (returned for `ringi --json` with no command)\n// ---------------------------------------------------------------------------\n\nconst COMMAND_TREE = {\n commands: [\n {\n description: \"List review sessions\",\n name: \"review list\",\n usage:\n \"ringi review list [--status <status>] [--source <type>] [--limit <n>] [--page <n>]\",\n },\n {\n description: \"Show review details\",\n name: \"review show\",\n usage: \"ringi review show <id|last> [--comments] [--todos]\",\n },\n {\n description: \"Create a review session\",\n name: \"review create\",\n usage:\n \"ringi review create [--source <staged|branch|commits>] [--branch <name>] [--commits <range>]\",\n },\n {\n description: \"Export review as markdown\",\n name: \"review export\",\n usage: \"ringi review export <id|last> [--output <path>] [--stdout]\",\n },\n {\n description: \"Resolve a review session\",\n name: \"review resolve\",\n usage: \"ringi review resolve <id|last> [--all-comments] [--yes]\",\n },\n {\n description: \"Show repository and review status\",\n name: \"review status\",\n usage: \"ringi review status [--review <id|last>] [--source <type>]\",\n },\n {\n description: \"List repository sources\",\n name: \"source list\",\n usage: \"ringi source list\",\n },\n {\n description: \"Show diff for a source\",\n name: \"source diff\",\n usage:\n \"ringi source diff <staged|branch|commits> [--branch <name>] [--commits <range>] [--stat]\",\n },\n {\n description: \"List todo items\",\n name: \"todo list\",\n usage:\n \"ringi todo list [--review <id>] [--status <pending|done|all>] [--limit <n>] [--offset <n>]\",\n },\n {\n description: \"Add a todo item\",\n name: \"todo add\",\n usage: \"ringi todo add --text <text> [--review <id>] [--position <n>]\",\n },\n {\n description: \"Mark a todo as done\",\n name: \"todo done\",\n usage: \"ringi todo done <id>\",\n },\n {\n description: \"Reopen a completed todo\",\n name: \"todo undone\",\n usage: \"ringi todo undone <id>\",\n },\n {\n description: \"Move a todo to a position\",\n name: \"todo move\",\n usage: \"ringi todo move <id> --position <n>\",\n },\n {\n description: \"Remove a todo\",\n name: \"todo remove\",\n usage: \"ringi todo remove <id> [--yes]\",\n },\n {\n description: \"Clear completed todos\",\n name: \"todo clear\",\n usage: \"ringi todo clear [--review <id>] [--done-only] [--all] [--yes]\",\n },\n {\n description: \"Start the local Ringi server\",\n name: \"serve\",\n usage:\n \"ringi serve [--host <host>] [--port <port>] [--https] [--auth] [--no-open]\",\n },\n {\n description: \"Start the MCP stdio server\",\n name: \"mcp\",\n usage: \"ringi mcp [--readonly] [--log-level <level>]\",\n },\n {\n description: \"Run local diagnostics\",\n name: \"doctor\",\n usage: \"ringi doctor\",\n },\n {\n description: \"Tail server events\",\n name: \"events\",\n usage: \"ringi events [--type <reviews|comments|todos|files>]\",\n },\n {\n description: \"Run database migrations\",\n name: \"data migrate\",\n usage: \"ringi data migrate\",\n },\n {\n description: \"Reset local data\",\n name: \"data reset\",\n usage: \"ringi data reset [--yes] [--keep-exports]\",\n },\n ],\n description: \"ringi — local-first code review CLI\",\n version: CLI_VERSION,\n};\n\nconst ROOT_NEXT_ACTIONS: NextAction[] = [\n {\n command: \"ringi review list [--status <status>] [--source <type>]\",\n description: \"List review sessions\",\n params: {\n source: { enum: [\"staged\", \"branch\", \"commits\"] },\n status: { enum: [\"in_progress\", \"approved\", \"changes_requested\"] },\n },\n },\n {\n command: \"ringi source list\",\n description: \"List repository sources\",\n },\n {\n command: \"ringi review create [--source <source>]\",\n description: \"Create a new review session\",\n params: {\n source: { default: \"staged\", enum: [\"staged\", \"branch\", \"commits\"] },\n },\n },\n {\n command: \"ringi todo list [--status <status>]\",\n description: \"List todos\",\n params: {\n status: { default: \"pending\", enum: [\"pending\", \"done\", \"all\"] },\n },\n },\n {\n command: \"ringi review status\",\n description: \"Show repository and review status\",\n },\n];\n\n// ---------------------------------------------------------------------------\n// Help text (lookup-table, not switch)\n// ---------------------------------------------------------------------------\n\nconst ROOT_HELP = `ringi — local-first review CLI\n\nUsage:\n ringi [global options] <command>\n\nGlobal options:\n --json Emit structured JSON envelope to stdout\n --repo <path> Use a specific Git repository root\n --db-path <path> Override the SQLite database path\n --quiet Suppress human-readable success output\n --verbose Include stack traces on failures\n --no-color Disable ANSI color output\n --help Show help\n --version Show version\n\nCommands:\n review list [--status <status>] [--source <type>] [--limit <n>] [--page <n>]\n review show <id|last> [--comments] [--todos]\n review create [--source <staged|branch|commits>] [--branch <name>] [--commits <range>]\n review export <id|last> [--output <path>] [--stdout]\n review resolve <id|last> [--all-comments] [--yes]\n review status [--review <id|last>] [--source <type>]\n source list\n source diff <staged|branch|commits> [--branch <name>] [--commits <range>] [--stat]\n todo list [--review <id>] [--status <pending|done|all>] [--limit <n>] [--offset <n>]\n todo add --text <text> [--review <id>]\n todo done <id>\n todo undone <id>\n todo move <id> --position <n>\n todo remove <id> [--yes]\n todo clear [--review <id>] [--done-only] [--all] [--yes]\n export <id|last> [--output <path>] [--stdout]\n`;\n\nconst HELP_TOPICS: Readonly<Record<string, string>> = {\n data: `ringi data\n\nUsage:\n ringi data migrate\n ringi data reset [--yes] [--keep-exports]\n`,\n review: `ringi review\n\nUsage:\n ringi review list [--status <status>] [--source <type>] [--limit <n>] [--page <n>]\n ringi review show <id|last> [--comments] [--todos]\n ringi review create [--source <staged|branch|commits>] [--branch <name>] [--commits <range>]\n ringi review export <id|last> [--output <path>] [--stdout]\n ringi review resolve <id|last> [--all-comments] [--yes]\n ringi review status [--review <id|last>] [--source <type>]\n`,\n source: `ringi source\n\nUsage:\n ringi source list\n ringi source diff <staged|branch|commits> [--branch <name>] [--commits <range>] [--stat]\n`,\n todo: `ringi todo\n\nUsage:\n ringi todo list [--review <id>] [--status <pending|done|all>] [--limit <n>] [--offset <n>]\n ringi todo add --text <text> [--review <id>] [--position <n>]\n ringi todo done <id>\n ringi todo undone <id>\n ringi todo move <id> --position <n>\n ringi todo remove <id> [--yes]\n ringi todo clear [--review <id>] [--done-only] [--all] [--yes]\n`,\n};\n\nconst renderHelp = (command: ParsedCommand): string => {\n if (command.kind !== \"help\") {\n return ROOT_HELP;\n }\n const [topic] = command.topic;\n return (topic && HELP_TOPICS[topic]) ?? ROOT_HELP;\n};\n\n// ---------------------------------------------------------------------------\n// Output helpers\n// ---------------------------------------------------------------------------\n\nconst writeJson = (payload: unknown): void => {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n};\n\nconst writeHuman = (text: string | undefined): void => {\n if (text && text.length > 0) {\n process.stdout.write(`${text}\\n`);\n }\n};\n\n// ---------------------------------------------------------------------------\n// Error normalization (RFC 9457-inspired)\n// ---------------------------------------------------------------------------\n\ninterface NormalizedFailure {\n readonly category: ErrorCategory;\n readonly code: string;\n readonly exitCode: ExitCodeType;\n readonly message: string;\n readonly retryable: boolean;\n readonly verbose?: string;\n}\n\n/** Maps exit codes to error categories and retryable status. */\nconst EXIT_CODE_META: Readonly<\n Record<number, { category: ErrorCategory; code: string; retryable: boolean }>\n> = {\n [ExitCode.AuthFailure]: {\n category: \"auth\",\n code: \"AUTH_FAILURE\",\n retryable: false,\n },\n [ExitCode.ResourceNotFound]: {\n category: \"not_found\",\n code: \"RESOURCE_NOT_FOUND\",\n retryable: false,\n },\n [ExitCode.RuntimeFailure]: {\n category: \"server\",\n code: \"RUNTIME_FAILURE\",\n retryable: true,\n },\n [ExitCode.StateUnavailable]: {\n category: \"config\",\n code: \"STATE_UNAVAILABLE\",\n retryable: false,\n },\n [ExitCode.UsageError]: {\n category: \"validation\",\n code: \"USAGE_ERROR\",\n retryable: false,\n },\n};\n\nconst mapFailure = (error: unknown): NormalizedFailure => {\n if (error instanceof CliFailure) {\n const meta = EXIT_CODE_META[error.exitCode] ?? {\n category: \"server\" as const,\n code: \"UNKNOWN\",\n retryable: false,\n };\n return {\n category: meta.category,\n code: meta.code,\n exitCode: error.exitCode as ExitCodeType,\n message: error.message,\n retryable: meta.retryable,\n verbose: error.details,\n };\n }\n\n if (error instanceof ReviewNotFound || error instanceof TodoNotFound) {\n return {\n category: \"not_found\",\n code: \"RESOURCE_NOT_FOUND\",\n exitCode: ExitCode.ResourceNotFound,\n message: error.message,\n retryable: false,\n verbose: error.stack,\n };\n }\n\n if (error instanceof Error) {\n return {\n category: \"server\",\n code: \"RUNTIME_FAILURE\",\n exitCode: ExitCode.RuntimeFailure,\n message: error.message,\n retryable: true,\n verbose: error.stack,\n };\n }\n\n return {\n category: \"server\",\n code: \"UNKNOWN_FAILURE\",\n exitCode: ExitCode.RuntimeFailure,\n message: \"Unknown CLI failure.\",\n retryable: false,\n };\n};\n\n/** Actionable fix guidance based on error category. */\nconst FIX_GUIDANCE: Readonly<Record<ErrorCategory, string>> = {\n auth: \"Check authentication credentials or run 'ringi serve --auth' with valid credentials.\",\n config:\n \"Run 'ringi serve' once to initialize local state, or check --repo and --db-path flags.\",\n conflict: \"Resolve the conflict and retry the operation.\",\n connection: \"Ensure the Ringi server is running: ringi serve\",\n not_found:\n \"Verify the resource ID. Use 'ringi review list' or 'ringi todo list' to find valid IDs.\",\n server: \"Retry the command. If the error persists, check 'ringi serve' logs.\",\n validation:\n \"Check command usage with 'ringi --help'. Verify flag names and values.\",\n};\n\n/** Build recovery next_actions based on error category. */\nconst errorNextActions = (\n commandStr: string,\n normalized: NormalizedFailure\n): NextAction[] => {\n const actions: NextAction[] = [];\n\n if (normalized.retryable) {\n actions.push({\n command: commandStr,\n description: \"Retry the failed command\",\n });\n }\n\n if (\n normalized.category === \"config\" ||\n normalized.category === \"connection\"\n ) {\n actions.push({\n command: \"ringi serve\",\n description: \"Start the local Ringi server\",\n });\n }\n\n if (normalized.category === \"not_found\") {\n actions.push(\n {\n command: \"ringi review list\",\n description: \"List available reviews\",\n },\n {\n command: \"ringi todo list\",\n description: \"List available todos\",\n }\n );\n }\n\n if (normalized.category === \"validation\") {\n actions.push({\n command: `${commandStr.split(\" \").slice(0, 3).join(\" \")} --help`,\n description: \"Show command usage\",\n });\n }\n\n return actions;\n};\n\n/** Build a full error envelope from a normalized failure. */\nconst buildErrorEnvelope = (\n commandStr: string,\n normalized: NormalizedFailure\n): CliErrorEnvelope => {\n const errorDetail: CliErrorDetail = {\n category: normalized.category,\n code: normalized.code,\n message: normalized.message,\n retryable: normalized.retryable,\n type: `ringi://errors/${normalized.code}`,\n };\n\n return failure(\n commandStr,\n errorDetail,\n normalized.verbose ?? FIX_GUIDANCE[normalized.category],\n errorNextActions(commandStr, normalized)\n );\n};\n\n// ---------------------------------------------------------------------------\n// Signal handling\n// ---------------------------------------------------------------------------\n\nconst installSignalHandlers = (dispose: () => Promise<void>): (() => void) => {\n const shutdown = async () => {\n await dispose();\n process.exit(ExitCode.RuntimeFailure);\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n\n return () => {\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n };\n};\n\n// ---------------------------------------------------------------------------\n// Serve command (long-running process, bypasses Effect runtime)\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the built Nitro server entry point. Returns the absolute path to\n * `.output/server/index.mjs` relative to the package root (the directory\n * containing this CLI entry point after bundling).\n */\nconst resolveServerEntry = (): string | undefined => {\n // Try multiple locations: cwd (development), then relative to the built CLI\n // bundle (`dist/cli.js` → `../.output`).\n const candidates = [resolve(process.cwd(), \".output\", \"server\", \"index.mjs\")];\n\n if (import.meta.dirname) {\n candidates.push(\n resolve(import.meta.dirname, \"..\", \".output\", \"server\", \"index.mjs\")\n );\n }\n\n return candidates.find((candidate) => existsSync(candidate));\n};\n\nconst runServe = (command: Extract<ParsedCommand, { kind: \"serve\" }>): void => {\n const serverEntry = resolveServerEntry();\n\n if (!serverEntry) {\n process.stderr.write(\n \"No built server found. Run 'pnpm build' first, then retry 'ringi serve'.\\n\"\n );\n process.exit(ExitCode.RuntimeFailure);\n }\n\n const env: Record<string, string> = {\n ...process.env,\n NITRO_HOST: command.host,\n NITRO_PORT: String(command.port),\n };\n\n if (command.https && command.cert && command.key) {\n env.NITRO_SSL_CERT = command.cert;\n env.NITRO_SSL_KEY = command.key;\n }\n\n const protocol = command.https ? \"https\" : \"http\";\n const url = `${protocol}://${command.host === \"0.0.0.0\" ? \"localhost\" : command.host}:${command.port}`;\n process.stderr.write(`ringi server starting on ${url}\\n`);\n\n const child = fork(serverEntry, [], {\n env,\n // Clear execArgv so tsx/ts-node loaders from the parent don't interfere\n // with the built Nitro server (plain ESM).\n execArgv: [],\n stdio: \"inherit\",\n });\n\n if (!command.noOpen) {\n // Delay open slightly so the server has time to bind the port.\n setTimeout(() => {\n let openCmd = \"xdg-open\";\n if (process.platform === \"darwin\") {\n openCmd = \"open\";\n } else if (process.platform === \"win32\") {\n openCmd = \"start\";\n }\n exec(`${openCmd} ${url}`, () => {\n // Browser open is best-effort; swallow errors.\n });\n }, 1500);\n }\n\n const shutdown = () => {\n child.kill(\"SIGTERM\");\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n\n child.on(\"exit\", (code) => {\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n process.exit(code ?? ExitCode.Success);\n });\n};\n\n// ---------------------------------------------------------------------------\n// Shared error exit (eliminates 3× duplication)\n// ---------------------------------------------------------------------------\n\ninterface FailExitOptions {\n readonly cmdStr: string;\n readonly error: unknown;\n readonly json: boolean;\n readonly verbose: boolean;\n}\n\n/** Single path for all CLI error exits. */\nconst failAndExit = (opts: FailExitOptions): never => {\n const normalized = mapFailure(opts.error);\n\n if (opts.json) {\n writeJson(buildErrorEnvelope(opts.cmdStr, normalized));\n }\n\n process.stderr.write(`${normalized.message}\\n`);\n if (opts.verbose && normalized.verbose) {\n process.stderr.write(`${normalized.verbose}\\n`);\n }\n\n return process.exit(normalized.exitCode);\n};\n\n// ---------------------------------------------------------------------------\n// Main program\n// ---------------------------------------------------------------------------\n\nconst main = async (): Promise<void> => {\n const argv = process.argv.slice(2);\n const parseResult = parseCliArgs(argv);\n\n if (Either.isLeft(parseResult)) {\n return failAndExit({\n cmdStr: \"ringi\",\n error: parseResult.left,\n json: argv.includes(\"--json\"),\n verbose: false,\n });\n }\n\n const { command, options } = parseResult.right;\n\n if (command.kind === \"help\") {\n if (options.json) {\n writeJson(success(\"ringi\", COMMAND_TREE, ROOT_NEXT_ACTIONS));\n } else {\n writeHuman(renderHelp(command));\n }\n process.exit(ExitCode.Success);\n }\n\n if (command.kind === \"version\") {\n if (options.json) {\n writeJson(success(\"ringi --version\", { version: CLI_VERSION }));\n } else {\n writeHuman(CLI_VERSION);\n }\n process.exit(ExitCode.Success);\n }\n\n // Serve is a long-running process that bypasses the Effect runtime entirely.\n // It forks the built Nitro server as a child process and proxies signals.\n if (command.kind === \"serve\") {\n runServe(command);\n return;\n }\n\n const runtimeResources = createCliRuntimeResources(command, {\n color: options.color,\n dbPath: options.dbPath,\n quiet: options.quiet,\n repo: options.repo,\n verbose: options.verbose,\n });\n\n if (runtimeResources === null) {\n process.exit(ExitCode.Success);\n }\n\n const cmdStr = commandLabel(command);\n\n if (runtimeResources instanceof CliFailure) {\n return failAndExit({\n cmdStr,\n error: runtimeResources,\n json: options.json,\n verbose: options.verbose,\n });\n }\n\n const removeSignalHandlers = installSignalHandlers(() =>\n runtimeResources.runtime.dispose()\n );\n\n try {\n // The CommandHandler type uses `unknown` for the R (requirements) channel\n // because handlers depend on various service combinations. The managed\n // runtime provides all required services; the cast at this boundary is the\n // one place where we bridge the static Effect types to the dynamic runtime.\n const output = (await runtimeResources.runtime.runPromise(\n runCommand(command) as Effect.Effect<CommandOutput<unknown>>\n )) as CommandOutput<unknown>;\n\n if (options.json) {\n writeJson(success(cmdStr, output.data, output.nextActions ?? []));\n } else if (!options.quiet) {\n writeHuman(output.human);\n }\n\n await runtimeResources.runtime.dispose();\n removeSignalHandlers();\n process.exit(ExitCode.Success);\n } catch (error) {\n await runtimeResources.runtime.dispose();\n removeSignalHandlers();\n failAndExit({\n cmdStr,\n error,\n json: options.json,\n verbose: options.verbose,\n });\n }\n};\n\ntry {\n await main();\n} catch (error) {\n failAndExit({\n cmdStr: \"ringi\",\n error,\n json: process.argv.slice(2).includes(\"--json\"),\n verbose: false,\n });\n}\n"]}