@p10i/rundown 1.0.0-rc.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/application/run-task.ts","../src/domain/defaults.ts","../src/domain/checkbox.ts","../src/domain/run-options.ts","../src/domain/template.ts","../src/domain/template-vars.ts","../src/application/plan-task.ts","../src/domain/planner.ts","../src/domain/parser.ts","../src/domain/task-selection.ts","../src/domain/sorting.ts","../src/application/list-tasks.ts","../src/application/next-task.ts","../src/application/init-project.ts","../src/application/manage-artifacts.ts","../src/infrastructure/adapters/fs-file-system.ts","../src/infrastructure/adapters/crossspawn-process-runner.ts","../src/infrastructure/adapters/execfile-git-client.ts","../src/infrastructure/adapters/fs-template-loader.ts","../src/infrastructure/adapters/fs-validation-sidecar.ts","../src/infrastructure/runtime-artifacts.ts","../src/infrastructure/adapters/fs-artifact-store.ts","../src/infrastructure/adapters/system-clock.ts","../src/infrastructure/sources.ts","../src/infrastructure/adapters/source-resolver-adapter.ts","../src/infrastructure/selector.ts","../src/infrastructure/file-birthtime.ts","../src/infrastructure/adapters/task-selector-adapter.ts","../src/infrastructure/inline-cli.ts","../src/infrastructure/runner.ts","../src/infrastructure/adapters/worker-executor-adapter.ts","../src/infrastructure/validation.ts","../src/infrastructure/adapters/task-validation-adapter.ts","../src/infrastructure/correction.ts","../src/infrastructure/adapters/task-correction-adapter.ts","../src/infrastructure/adapters/working-directory-adapter.ts","../src/infrastructure/open-directory.ts","../src/infrastructure/adapters/directory-opener-adapter.ts","../src/create-app.ts"],"sourcesContent":["import path from \"node:path\";\nimport {\n DEFAULT_CORRECT_TEMPLATE,\n DEFAULT_PLAN_TEMPLATE,\n DEFAULT_TASK_TEMPLATE,\n DEFAULT_VALIDATE_TEMPLATE,\n} from \"../domain/defaults.js\";\nimport { markChecked } from \"../domain/checkbox.js\";\nimport type { Task } from \"../domain/parser.js\";\nimport type { SortMode } from \"../domain/sorting.js\";\nimport { requiresWorkerCommand, resolveRunBehavior } from \"../domain/run-options.js\";\nimport { renderTemplate, type TemplateVars } from \"../domain/template.js\";\nimport {\n parseCliTemplateVars,\n resolveTemplateVarsFilePath,\n type ExtraTemplateVars,\n} from \"../domain/template-vars.js\";\nimport type {\n ArtifactStore,\n FileSystem,\n GitClient,\n ProcessRunMode,\n ProcessRunner,\n PromptTransport as PortPromptTransport,\n SourceResolverPort,\n TaskCorrectionPort,\n TaskSelectionResult as PortTaskSelectionResult,\n TaskSelectorPort,\n TaskValidationPort,\n TemplateLoader,\n ValidationSidecar,\n WorkerExecutorPort,\n WorkingDirectoryPort,\n} from \"../domain/ports/index.js\";\nimport type { ApplicationOutputPort } from \"../domain/ports/output-port.js\";\n\nexport type RunnerMode = ProcessRunMode;\nexport type PromptTransport = PortPromptTransport;\ntype ArtifactContext = any;\n\ninterface ProjectTemplates {\n task: string;\n validate: string;\n correct: string;\n plan: string;\n}\n\nexport type TaskSelectionResult = PortTaskSelectionResult;\n\nexport interface RuntimeTaskMetadata {\n text: string;\n file: string;\n line: number;\n index: number;\n source: string;\n}\n\nexport interface RunTaskDependencies {\n sourceResolver: SourceResolverPort;\n taskSelector: TaskSelectorPort;\n workerExecutor: WorkerExecutorPort;\n taskValidation: TaskValidationPort;\n taskCorrection: TaskCorrectionPort;\n workingDirectory: WorkingDirectoryPort;\n fileSystem: FileSystem;\n templateLoader: TemplateLoader;\n validationSidecar: ValidationSidecar;\n artifactStore: ArtifactStore;\n gitClient: GitClient;\n processRunner: ProcessRunner;\n output: ApplicationOutputPort;\n}\n\nexport interface RunTaskOptions {\n source: string;\n mode: RunnerMode;\n transport: PromptTransport;\n sortMode: SortMode;\n verify: boolean;\n onlyVerify: boolean;\n noRepair: boolean;\n retries: number;\n dryRun: boolean;\n printPrompt: boolean;\n keepArtifacts: boolean;\n varsFileOption: string | boolean | undefined;\n cliTemplateVarArgs: string[];\n workerCommand: string[];\n commitAfterComplete: boolean;\n commitMessageTemplate?: string;\n onCompleteCommand?: string;\n}\n\nexport function createRunTask(\n dependencies: RunTaskDependencies,\n): (options: RunTaskOptions) => Promise<number> {\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n return async function runTask(options: RunTaskOptions): Promise<number> {\n const {\n source,\n mode,\n transport,\n sortMode,\n verify,\n onlyVerify,\n noRepair,\n retries,\n dryRun,\n printPrompt,\n keepArtifacts,\n varsFileOption,\n cliTemplateVarArgs,\n workerCommand,\n commitAfterComplete,\n commitMessageTemplate,\n onCompleteCommand,\n } = options;\n\n const runBehavior = resolveRunBehavior({\n validate: verify,\n onlyValidate: onlyVerify,\n noCorrect: noRepair,\n retries,\n });\n const shouldValidate = runBehavior.shouldValidate;\n const onlyValidate = runBehavior.onlyValidate;\n const allowCorrection = runBehavior.allowCorrection;\n const maxRetries = runBehavior.maxRetries;\n\n const varsFilePath = resolveTemplateVarsFilePath(varsFileOption);\n const fileTemplateVars = varsFilePath\n ? loadTemplateVarsFileFromPorts(varsFilePath, dependencies.workingDirectory.cwd(), dependencies.fileSystem)\n : {};\n const cliTemplateVars = parseCliTemplateVars(cliTemplateVarArgs);\n const extraTemplateVars: ExtraTemplateVars = {\n ...fileTemplateVars,\n ...cliTemplateVars,\n };\n\n let artifactContext: ArtifactContext | null = null;\n let artifactsFinalized = false;\n\n const finalizeArtifacts = (status: string, preserve: boolean = keepArtifacts): void => {\n if (!artifactContext || artifactsFinalized) {\n return;\n }\n\n finalizeRunArtifacts(dependencies.artifactStore, artifactContext, preserve, status, emit);\n artifactsFinalized = true;\n };\n\n const finishRun = (code: number, status: string, preserve: boolean = keepArtifacts): number => {\n finalizeArtifacts(status, preserve);\n return code;\n };\n\n try {\n const files = await dependencies.sourceResolver.resolveSources(source);\n if (files.length === 0) {\n emit({ kind: \"warn\", message: \"No Markdown files found matching: \" + source });\n return 3;\n }\n\n const result = dependencies.taskSelector.selectNextTask(files, sortMode);\n if (!result) {\n emit({ kind: \"info\", message: \"No unchecked tasks found.\" });\n return 3;\n }\n\n const { task, source: fileSource, contextBefore } = result;\n emit({ kind: \"info\", message: \"Next task: \" + formatTaskLabel(task) });\n const automationCommand = getAutomationWorkerCommand(workerCommand, mode);\n\n const templates = loadProjectTemplatesFromPorts(\n dependencies.workingDirectory.cwd(),\n dependencies.templateLoader,\n );\n const vars: TemplateVars = {\n ...extraTemplateVars,\n task: task.text,\n file: task.file,\n context: contextBefore,\n taskIndex: task.index,\n taskLine: task.line,\n source: fileSource,\n };\n\n const prompt = renderTemplate(templates.task, vars);\n const validationPrompt = shouldValidate\n ? renderTemplate(templates.validate, vars)\n : \"\";\n\n if (printPrompt && onlyValidate) {\n emit({ kind: \"text\", text: validationPrompt });\n return 0;\n }\n\n if (dryRun && onlyValidate) {\n emit({ kind: \"info\", message: \"Dry run — would run verification with: \" + automationCommand.join(\" \") });\n emit({ kind: \"info\", message: \"Prompt length: \" + validationPrompt.length + \" chars\" });\n return 0;\n }\n\n if (requiresWorkerCommand({\n workerCommand,\n isInlineCli: task.isInlineCli,\n shouldValidate,\n onlyValidate,\n })) {\n emit({ kind: \"error\", message: \"No worker command specified. Use --worker <command...> or -- <command>.\" });\n return 1;\n }\n\n if (!onlyValidate && !task.isInlineCli) {\n if (printPrompt) {\n emit({ kind: \"text\", text: prompt });\n return 0;\n }\n\n if (dryRun) {\n emit({ kind: \"info\", message: \"Dry run — would run: \" + workerCommand.join(\" \") });\n emit({ kind: \"info\", message: \"Prompt length: \" + prompt.length + \" chars\" });\n return 0;\n }\n }\n\n if (!onlyValidate && task.isInlineCli && dryRun) {\n emit({ kind: \"info\", message: \"Dry run — would execute inline CLI: \" + task.cliCommand! });\n return 0;\n }\n\n artifactContext = dependencies.artifactStore.createContext({\n cwd: dependencies.workingDirectory.cwd(),\n commandName: \"run\",\n workerCommand: onlyValidate ? automationCommand : workerCommand,\n mode,\n transport,\n source,\n task: toRuntimeTaskMetadata(task, fileSource),\n keepArtifacts,\n });\n\n if (onlyValidate) {\n emit({ kind: \"info\", message: \"Only verify mode — skipping task execution.\" });\n\n const valid = await runValidation(\n dependencies,\n task,\n fileSource,\n contextBefore,\n templates,\n automationCommand,\n transport,\n maxRetries,\n allowCorrection,\n extraTemplateVars,\n artifactContext,\n );\n if (!valid) {\n emit({ kind: \"error\", message: \"Verification failed after all retries. Task not checked.\" });\n return finishRun(2, \"verification-failed\");\n }\n\n checkTaskUsingFileSystem(task, dependencies.fileSystem);\n emit({ kind: \"success\", message: \"Task checked: \" + task.text });\n await afterTaskComplete(\n dependencies,\n task,\n source,\n commitAfterComplete,\n commitMessageTemplate,\n onCompleteCommand,\n );\n return finishRun(0, \"completed\");\n }\n\n if (task.isInlineCli) {\n const inlineCliCwd = path.dirname(path.resolve(task.file));\n emit({ kind: \"info\", message: \"Executing inline CLI: \" + task.cliCommand! + \" [cwd=\" + inlineCliCwd + \"]\" });\n const cliResult = await dependencies.workerExecutor.executeInlineCli(task.cliCommand!, inlineCliCwd, {\n artifactContext,\n keepArtifacts,\n artifactExtra: { taskType: \"inline-cli\" },\n });\n\n if (cliResult.stdout) emit({ kind: \"text\", text: cliResult.stdout });\n if (cliResult.stderr) emit({ kind: \"stderr\", text: cliResult.stderr });\n\n if (cliResult.exitCode !== 0) {\n emit({ kind: \"error\", message: \"Inline CLI exited with code \" + cliResult.exitCode });\n return finishRun(1, \"execution-failed\");\n }\n\n if (shouldValidate) {\n const valid = await runValidation(\n dependencies,\n task,\n fileSource,\n contextBefore,\n templates,\n automationCommand,\n transport,\n maxRetries,\n allowCorrection,\n extraTemplateVars,\n artifactContext,\n );\n if (!valid) {\n emit({ kind: \"error\", message: \"Verification failed. Task not checked.\" });\n return finishRun(2, \"verification-failed\");\n }\n }\n\n checkTaskUsingFileSystem(task, dependencies.fileSystem);\n emit({ kind: \"success\", message: \"Task checked: \" + task.text });\n await afterTaskComplete(\n dependencies,\n task,\n source,\n commitAfterComplete,\n commitMessageTemplate,\n onCompleteCommand,\n );\n return finishRun(0, \"completed\");\n }\n\n emit({ kind: \"info\", message: \"Running: \" + workerCommand.join(\" \") + \" [mode=\" + mode + \", transport=\" + transport + \"]\" });\n const runResult = await dependencies.workerExecutor.runWorker({\n command: workerCommand,\n prompt,\n mode,\n transport,\n cwd: dependencies.workingDirectory.cwd(),\n artifactContext,\n artifactPhase: \"execute\",\n });\n\n if (mode === \"wait\") {\n if (runResult.stdout) emit({ kind: \"text\", text: runResult.stdout });\n if (runResult.stderr) emit({ kind: \"stderr\", text: runResult.stderr });\n }\n\n if (mode !== \"detached\" && runResult.exitCode !== 0 && runResult.exitCode !== null) {\n emit({ kind: \"error\", message: \"Worker exited with code \" + runResult.exitCode + \".\" });\n return finishRun(1, \"execution-failed\");\n }\n\n if (mode === \"detached\") {\n emit({ kind: \"info\", message: \"Detached mode — skipping immediate verification and leaving the task unchecked.\" });\n return finishRun(0, \"detached\", true);\n }\n\n if (shouldValidate) {\n const valid = await runValidation(\n dependencies,\n task,\n fileSource,\n contextBefore,\n templates,\n automationCommand,\n transport,\n maxRetries,\n allowCorrection,\n extraTemplateVars,\n artifactContext,\n );\n if (!valid) {\n emit({ kind: \"error\", message: \"Verification failed after all retries. Task not checked.\" });\n return finishRun(2, \"verification-failed\");\n }\n }\n\n checkTaskUsingFileSystem(task, dependencies.fileSystem);\n emit({ kind: \"success\", message: \"Task checked: \" + task.text });\n await afterTaskComplete(\n dependencies,\n task,\n source,\n commitAfterComplete,\n commitMessageTemplate,\n onCompleteCommand,\n );\n return finishRun(0, \"completed\");\n } catch (error) {\n finalizeArtifacts(\"failed\", keepArtifacts || mode === \"detached\");\n throw error;\n }\n };\n}\n\nasync function runValidation(\n dependencies: RunTaskDependencies,\n task: Task,\n fileSource: string,\n contextBefore: string,\n templates: { validate: string; correct: string },\n workerCommand: string[],\n transport: PromptTransport,\n maxRetries: number,\n allowCorrection: boolean,\n extraTemplateVars: ExtraTemplateVars,\n artifactContext: ArtifactContext,\n): Promise<boolean> {\n const emit = dependencies.output.emit.bind(dependencies.output);\n emit({ kind: \"info\", message: \"Running verification...\" });\n\n const valid = await dependencies.taskValidation.validate({\n task,\n source: fileSource,\n contextBefore,\n template: templates.validate,\n command: workerCommand,\n mode: \"wait\",\n transport,\n templateVars: extraTemplateVars,\n artifactContext,\n });\n\n if (valid) {\n dependencies.validationSidecar.remove(task);\n emit({ kind: \"success\", message: \"Verification passed.\" });\n return true;\n }\n\n if (allowCorrection) {\n emit({ kind: \"warn\", message: \"Verification failed. Running repair (\" + maxRetries + \" retries)...\" });\n const result = await dependencies.taskCorrection.correct({\n task,\n source: fileSource,\n contextBefore,\n correctTemplate: templates.correct,\n validateTemplate: templates.validate,\n command: workerCommand,\n maxRetries,\n mode: \"wait\",\n transport,\n templateVars: extraTemplateVars,\n artifactContext,\n });\n\n if (result.valid) {\n dependencies.validationSidecar.remove(task);\n emit({ kind: \"success\", message: \"Repair succeeded after \" + result.attempts + \" attempt(s).\" });\n return true;\n }\n }\n\n return false;\n}\n\nasync function afterTaskComplete(\n dependencies: RunTaskDependencies,\n task: Task,\n source: string,\n commit: boolean,\n commitMessageTemplate: string | undefined,\n onCompleteCommand: string | undefined,\n): Promise<void> {\n const cwd = dependencies.workingDirectory.cwd();\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n if (commit) {\n try {\n const inGitRepo = await isGitRepoWithGitClient(dependencies.gitClient, cwd);\n if (!inGitRepo) {\n emit({ kind: \"warn\", message: \"--commit: not inside a git repository, skipping.\" });\n } else {\n const message = buildCommitMessage(task, cwd, commitMessageTemplate);\n await commitCheckedTaskWithGitClient(dependencies.gitClient, task, cwd, message);\n emit({ kind: \"success\", message: \"Committed: \" + message });\n }\n } catch (error) {\n emit({ kind: \"warn\", message: \"--commit failed: \" + String(error) });\n }\n }\n\n if (onCompleteCommand) {\n try {\n const result = await runOnCompleteHookWithProcessRunner(\n dependencies.processRunner,\n onCompleteCommand,\n task,\n source,\n cwd,\n );\n\n if (result.stdout) emit({ kind: \"text\", text: result.stdout });\n if (result.stderr) emit({ kind: \"stderr\", text: result.stderr });\n\n if (!result.success) {\n emit({ kind: \"warn\", message: \"--on-complete hook exited with code \" + result.exitCode });\n }\n } catch (error) {\n emit({ kind: \"warn\", message: \"--on-complete hook failed: \" + String(error) });\n }\n }\n}\n\nexport function getAutomationWorkerCommand(\n workerCommand: string[],\n mode: RunnerMode,\n): string[] {\n if (mode !== \"tui\") {\n return workerCommand;\n }\n\n if (!isOpenCodeWorkerCommand(workerCommand)) {\n return workerCommand;\n }\n\n return workerCommand.length > 1\n ? workerCommand\n : [workerCommand[0], \"run\"];\n}\n\nexport function finalizeRunArtifacts(\n artifactStore: ArtifactStore,\n artifactContext: ArtifactContext,\n preserve: boolean,\n status: string,\n emit: ApplicationOutputPort[\"emit\"],\n): void {\n artifactStore.finalize(artifactContext, { status, preserve });\n\n if (preserve) {\n emit({ kind: \"info\", message: \"Runtime artifacts saved at \" + artifactStore.displayPath(artifactContext) + \".\" });\n }\n}\n\nconst TEMPLATE_VAR_KEY = /^[A-Za-z_]\\w*$/;\nconst DEFAULT_COMMIT_MESSAGE_TEMPLATE = \"rundown: complete \\\"{{task}}\\\" in {{file}}\";\n\nfunction loadTemplateVarsFileFromPorts(\n filePath: string,\n cwd: string,\n fileSystem: FileSystem,\n): ExtraTemplateVars {\n const resolvedPath = path.resolve(cwd, filePath);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(fileSystem.readText(resolvedPath));\n } catch (error) {\n throw new Error(`Failed to read template vars file \\\"${filePath}\\\": ${String(error)}`);\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Template vars file \\\"${filePath}\\\" must contain a JSON object.`);\n }\n\n const vars: ExtraTemplateVars = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!TEMPLATE_VAR_KEY.test(key)) {\n throw new Error(`Invalid template variable name \\\"${key}\\\" in \\\"${filePath}\\\". Use letters, numbers, and underscores only.`);\n }\n\n if (value === null || value === undefined) {\n vars[key] = \"\";\n continue;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n vars[key] = String(value);\n continue;\n }\n\n throw new Error(`Template variable \\\"${key}\\\" in \\\"${filePath}\\\" must be a string, number, boolean, or null.`);\n }\n\n return vars;\n}\n\nfunction loadProjectTemplatesFromPorts(cwd: string, templateLoader: TemplateLoader): ProjectTemplates {\n const dir = path.join(cwd, \".rundown\");\n return {\n task: templateLoader.load(path.join(dir, \"execute.md\")) ?? DEFAULT_TASK_TEMPLATE,\n validate: templateLoader.load(path.join(dir, \"verify.md\")) ?? DEFAULT_VALIDATE_TEMPLATE,\n correct: templateLoader.load(path.join(dir, \"repair.md\")) ?? DEFAULT_CORRECT_TEMPLATE,\n plan: templateLoader.load(path.join(dir, \"plan.md\")) ?? DEFAULT_PLAN_TEMPLATE,\n };\n}\n\nfunction checkTaskUsingFileSystem(task: Task, fileSystem: FileSystem): void {\n const source = fileSystem.readText(task.file);\n const updated = markChecked(source, task);\n fileSystem.writeText(task.file, updated);\n}\n\nasync function isGitRepoWithGitClient(gitClient: GitClient, cwd: string): Promise<boolean> {\n try {\n await gitClient.run([\"rev-parse\", \"--is-inside-work-tree\"], cwd);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function commitCheckedTaskWithGitClient(\n gitClient: GitClient,\n task: Task,\n cwd: string,\n message: string,\n): Promise<void> {\n const relativePath = path.relative(cwd, task.file).replace(/\\\\/g, \"/\");\n await gitClient.run([\"add\", \"--\", relativePath], cwd);\n await gitClient.run([\"commit\", \"-m\", message], cwd);\n}\n\nfunction buildCommitMessage(\n task: Task,\n cwd: string,\n messageTemplate: string | undefined,\n): string {\n const relativePath = path.relative(cwd, task.file).replace(/\\\\/g, \"/\");\n return renderTemplate(messageTemplate ?? DEFAULT_COMMIT_MESSAGE_TEMPLATE, {\n task: task.text,\n file: relativePath,\n context: \"\",\n taskIndex: task.index,\n taskLine: task.line,\n source: \"\",\n });\n}\n\nasync function runOnCompleteHookWithProcessRunner(\n processRunner: ProcessRunner,\n command: string,\n task: Task,\n source: string,\n cwd: string,\n): Promise<{ success: boolean; exitCode: number | null; stdout: string; stderr: string }> {\n try {\n const result = await processRunner.run({\n command,\n args: [],\n cwd,\n mode: \"wait\",\n shell: true,\n timeoutMs: 60_000,\n env: {\n ...process.env,\n RUNDOWN_TASK: task.text,\n RUNDOWN_FILE: path.resolve(task.file),\n RUNDOWN_LINE: String(task.line),\n RUNDOWN_INDEX: String(task.index),\n RUNDOWN_SOURCE: source,\n },\n });\n\n return {\n success: result.exitCode === 0,\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: null,\n stdout: \"\",\n stderr: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction formatTaskLabel(task: Task): string {\n return `${task.file}:${task.line} [#${task.index}] ${task.text}`;\n}\n\nexport function toRuntimeTaskMetadata(\n task: Task,\n source: string,\n): RuntimeTaskMetadata {\n return {\n text: task.text,\n file: task.file,\n line: task.line,\n index: task.index,\n source,\n };\n}\n\nexport function isOpenCodeWorkerCommand(workerCommand: string[]): boolean {\n if (workerCommand.length === 0) {\n return false;\n }\n\n const command = workerCommand[0].toLowerCase();\n return command === \"opencode\"\n || command.endsWith(\"/opencode\")\n || command.endsWith(\"\\\\opencode\")\n || command.endsWith(\"/opencode.cmd\")\n || command.endsWith(\"\\\\opencode.cmd\")\n || command.endsWith(\"/opencode.exe\")\n || command.endsWith(\"\\\\opencode.exe\")\n || command.endsWith(\"/opencode.ps1\")\n || command.endsWith(\"\\\\opencode.ps1\");\n}\n\nexport const runTask = createRunTask;\n","/**\r\n * Built-in default templates.\r\n *\r\n * Used when a project does not provide .rundown/ templates.\r\n *\r\n * Layout principle: templates are structured for KV-cache efficiency.\r\n * Every default template starts with the exact same prefix.\r\n * The raw document context appears first with no phase-specific text before it.\r\n * That allows execute, verify, repair, and plan prompts for the same task\r\n * to reuse the same cache prefix before diverging.\r\n */\r\n\r\nconst DEFAULT_TEMPLATE_SHARED_PREFIX = `\\\r\n{{context}}\r\n\r\n---\r\n\r\nThe Markdown above is the source document up to but not including the selected unchecked task.\r\n\r\n## Source file\r\n\r\n\\`{{file}}\\` (line {{taskLine}})\r\n\r\n## Selected task\r\n\r\n{{task}}\r\n`;\r\n\r\nexport const DEFAULT_TASK_TEMPLATE = `\\\r\n${DEFAULT_TEMPLATE_SHARED_PREFIX}\r\n\r\n## Phase\r\n\r\nExecute the selected task.\r\n\r\nComplete the task described above. Make the necessary changes to the project, but do not edit the source Markdown task file as part of completion tracking.\r\n\r\n- Do not change the checkbox in the source Markdown file.\r\n- Do not rewrite the task item to make it look completed.\r\n- Do not treat editing the TODO file itself as evidence that the task is done unless the task explicitly requires documentation changes in that file.\r\n- rundown is responsible for marking the task complete after validation succeeds.\r\n`;\r\n\r\nexport const DEFAULT_VALIDATE_TEMPLATE = `\\\r\n${DEFAULT_TEMPLATE_SHARED_PREFIX}\r\n\r\n## Phase\r\n\r\nVerify whether the selected task is complete.\r\n\r\nEvaluate whether the task above has been completed.\r\n\r\nWrite your result to a file named \\`{{file}}.{{taskIndex}}.validation\\` next to the source file.\r\n\r\n- If the task is complete, write exactly: OK\r\n- If the task is not complete, write a short explanation of what is still missing.\r\n\r\nDo not modify the source Markdown task file or change its checkbox state. Validation is determined only by the actual project state and the sidecar file above.\r\n\r\nDo not write anything else.\r\n`;\r\n\r\nexport const DEFAULT_CORRECT_TEMPLATE = `\\\r\n${DEFAULT_TEMPLATE_SHARED_PREFIX}\r\n\r\n## Phase\r\n\r\nRepair the selected task after a failed verification pass.\r\n\r\n## Previous validation result\r\n\r\n{{validationResult}}\r\n\r\nPlease fix what is missing or incorrect. The validation above explains what still needs to be done.\r\n\r\n- Do not change the checkbox in the source Markdown file.\r\n- Do not mark the task complete yourself.\r\n- rundown will update task completion only after validation succeeds.\r\n\r\nAfter making corrections, the task will be validated again.\r\n`;\r\n\r\nexport const DEFAULT_VARS_FILE_CONTENT = `{\r\n\t\"branch\": \"main\",\r\n\t\"ticket\": \"ENG-42\"\r\n}\r\n`;\r\n\r\nexport const DEFAULT_PLAN_TEMPLATE = `\\\r\n${DEFAULT_TEMPLATE_SHARED_PREFIX}\r\n\r\n## Phase\r\n\r\nPlan the selected task by decomposing it into concrete subtasks.\r\n\r\nBreak this task into smaller, actionable subtasks.\r\n\r\nReturn ONLY a Markdown list of unchecked task items using \\`- [ ]\\` syntax, one per subtask.\r\n\r\nRules:\r\n- Each subtask should be a single clear action.\r\n- Together the subtasks should fully cover the parent task.\r\n- Do not include the parent task itself.\r\n- Do not include any other text, headings, or explanation.\r\n- Do not modify the source Markdown file.\r\n\r\nExample output format:\r\n\r\n- [ ] First concrete step\r\n- [ ] Second concrete step\r\n- [ ] Third concrete step\r\n`;\r\n","import type { Task } from \"./parser.js\";\r\n\r\nexport type { Task } from \"./parser.js\";\r\n\r\n/**\r\n * Replace the first `[ ]` on the task's line with `[x]`.\r\n *\r\n * Uses the task's line number for safety.\r\n */\r\nexport function markChecked(source: string, task: Task): string {\r\n const eol = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\r\n const lines = source.split(/\\r?\\n/);\r\n const lineIndex = task.line - 1;\r\n\r\n if (lineIndex < 0 || lineIndex >= lines.length) {\r\n throw new Error(`Task line ${task.line} is out of range in ${task.file}`);\r\n }\r\n\r\n const line = lines[lineIndex]!;\r\n const updated = line.replace(/\\[ \\]/, \"[x]\");\r\n\r\n if (updated === line) {\r\n throw new Error(`Could not find unchecked checkbox on line ${task.line} in ${task.file}`);\r\n }\r\n\r\n lines[lineIndex] = updated;\r\n return lines.join(eol);\r\n}\r\n","export interface RunBehaviorInput {\r\n validate: boolean;\r\n onlyValidate: boolean;\r\n noCorrect: boolean;\r\n retries: number;\r\n}\r\n\r\nexport interface RunBehavior {\r\n shouldValidate: boolean;\r\n onlyValidate: boolean;\r\n allowCorrection: boolean;\r\n maxRetries: number;\r\n}\r\n\r\nexport interface WorkerRequirementInput {\r\n workerCommand: string[];\r\n isInlineCli: boolean;\r\n shouldValidate: boolean;\r\n onlyValidate: boolean;\r\n}\r\n\r\nexport function resolveRunBehavior(input: RunBehaviorInput): RunBehavior {\r\n const maxRetries = Number.isFinite(input.retries) && input.retries > 0\r\n ? Math.floor(input.retries)\r\n : 0;\r\n const onlyValidate = input.onlyValidate;\r\n const shouldValidate = input.validate || onlyValidate;\r\n const allowCorrection = !input.noCorrect && maxRetries > 0;\r\n\r\n return {\r\n shouldValidate,\r\n onlyValidate,\r\n allowCorrection,\r\n maxRetries,\r\n };\r\n}\r\n\r\nexport function requiresWorkerCommand(input: WorkerRequirementInput): boolean {\r\n if (input.workerCommand.length > 0) {\r\n return false;\r\n }\r\n\r\n if (input.onlyValidate) {\r\n return true;\r\n }\r\n\r\n if (!input.isInlineCli) {\r\n return true;\r\n }\r\n\r\n return input.shouldValidate;\r\n}\r\n","/**\r\n * Template renderer.\r\n *\r\n * Renders a Markdown template by replacing placeholders with actual values.\r\n * Placeholders use the form {{variable}}.\r\n */\r\n\r\n/** Variables available inside templates. */\r\nexport interface TemplateVars {\r\n [key: string]: string | number | undefined;\r\n /** The full text of the selected task. */\r\n task: string;\r\n /** The source file path. */\r\n file: string;\r\n /** Markdown content of the file up to the task position. */\r\n context: string;\r\n /** The zero-based task index in the document. */\r\n taskIndex: number;\r\n /** The 1-based line number of the task. */\r\n taskLine: number;\r\n /** Full source file content. */\r\n source: string;\r\n /** Content of the validation sidecar file (available during correction). */\r\n validationResult?: string;\r\n /** Command output from the previous run (if captured). */\r\n commandOutput?: string;\r\n}\r\n\r\n/**\r\n * Render a Markdown template string with the given variables.\r\n *\r\n * Supports placeholders like {{task}}, {{file}}, {{context}}, etc.\r\n * Unknown placeholders are left as-is.\r\n */\r\nexport function renderTemplate(template: string, vars: TemplateVars): string {\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\r\n if (key in vars) {\r\n return String(vars[key as keyof TemplateVars] ?? \"\");\r\n }\r\n return `{{${key}}}`;\r\n });\r\n}\r\n","export type ExtraTemplateVars = Record<string, string>;\r\nexport const DEFAULT_TEMPLATE_VARS_FILE = \".rundown/vars.json\";\r\n\r\nconst TEMPLATE_VAR_KEY = /^[A-Za-z_]\\w*$/;\r\n\r\nexport function parseCliTemplateVars(entries: string[]): ExtraTemplateVars {\r\n const vars: ExtraTemplateVars = {};\r\n\r\n for (const entry of entries) {\r\n const equalsIndex = entry.indexOf(\"=\");\r\n if (equalsIndex <= 0) {\r\n throw new Error(`Invalid template variable \\\"${entry}\\\". Use key=value.`);\r\n }\r\n\r\n const key = entry.slice(0, equalsIndex).trim();\r\n const value = entry.slice(equalsIndex + 1);\r\n\r\n if (!TEMPLATE_VAR_KEY.test(key)) {\r\n throw new Error(`Invalid template variable name \\\"${key}\\\". Use letters, numbers, and underscores only.`);\r\n }\r\n\r\n vars[key] = value;\r\n }\r\n\r\n return vars;\r\n}\r\n\r\nexport function resolveTemplateVarsFilePath(option: string | boolean | undefined): string | undefined {\r\n if (option === true) {\r\n return DEFAULT_TEMPLATE_VARS_FILE;\r\n }\r\n\r\n return typeof option === \"string\" ? option : undefined;\r\n}\r\n","import path from \"node:path\";\nimport { DEFAULT_PLAN_TEMPLATE } from \"../domain/defaults.js\";\nimport { insertSubitems, parsePlannerOutput } from \"../domain/planner.js\";\nimport type { Task } from \"../domain/parser.js\";\nimport type { SortMode } from \"../domain/sorting.js\";\nimport { renderTemplate, type TemplateVars } from \"../domain/template.js\";\nimport {\n parseCliTemplateVars,\n resolveTemplateVarsFilePath,\n type ExtraTemplateVars,\n} from \"../domain/template-vars.js\";\nimport type {\n ArtifactRunContext,\n ArtifactStore,\n FileSystem,\n ProcessRunMode,\n SourceResolverPort,\n TaskSelectionResult as PortTaskSelectionResult,\n TaskSelectorPort,\n TemplateLoader,\n WorkerExecutorPort,\n WorkingDirectoryPort,\n} from \"../domain/ports/index.js\";\nimport type { ApplicationOutputPort } from \"../domain/ports/output-port.js\";\n\nexport type RunnerMode = ProcessRunMode;\nexport type PromptTransport = \"file\" | \"arg\";\ntype ArtifactContext = ArtifactRunContext;\n\nexport type TaskSelectionResult = PortTaskSelectionResult;\n\nexport interface PlanTaskDependencies {\n sourceResolver: SourceResolverPort;\n taskSelector: TaskSelectorPort;\n workerExecutor: WorkerExecutorPort;\n workingDirectory: WorkingDirectoryPort;\n fileSystem: FileSystem;\n templateLoader: TemplateLoader;\n artifactStore: ArtifactStore;\n output: ApplicationOutputPort;\n}\n\nexport interface PlanTaskOptions {\n source: string;\n at?: string;\n mode: RunnerMode;\n transport: PromptTransport;\n sortMode: SortMode;\n dryRun: boolean;\n printPrompt: boolean;\n keepArtifacts: boolean;\n varsFileOption: string | boolean | undefined;\n cliTemplateVarArgs: string[];\n workerCommand: string[];\n}\n\nexport function createPlanTask(\n dependencies: PlanTaskDependencies,\n): (options: PlanTaskOptions) => Promise<number> {\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n return async function planTask(options: PlanTaskOptions): Promise<number> {\n const {\n source,\n at,\n mode,\n transport,\n sortMode,\n dryRun,\n printPrompt,\n keepArtifacts,\n varsFileOption,\n cliTemplateVarArgs,\n workerCommand,\n } = options;\n\n const varsFilePath = resolveTemplateVarsFilePath(varsFileOption);\n const cwd = dependencies.workingDirectory.cwd();\n const fileTemplateVars = varsFilePath\n ? loadTemplateVarsFileFromPorts(varsFilePath, cwd, dependencies.fileSystem)\n : {};\n const cliTemplateVars = parseCliTemplateVars(cliTemplateVarArgs);\n const extraTemplateVars: ExtraTemplateVars = {\n ...fileTemplateVars,\n ...cliTemplateVars,\n };\n\n const selection = await selectPlanTask(source, at, sortMode, dependencies, emit);\n if (!selection.result) {\n return selection.exitCode;\n }\n\n const { task, source: fileSource, contextBefore } = selection.result;\n emit({\n kind: \"info\",\n message: \"Planning task: \" + formatTaskLabel(task),\n });\n\n if (workerCommand.length === 0) {\n emit({\n kind: \"error\",\n message: \"No worker command specified. Use --worker <command...> or -- <command>.\",\n });\n return 1;\n }\n\n const planTemplate = loadPlanTemplateFromPorts(cwd, dependencies.templateLoader);\n\n const vars: TemplateVars = {\n ...extraTemplateVars,\n task: task.text,\n file: task.file,\n context: contextBefore,\n taskIndex: task.index,\n taskLine: task.line,\n source: fileSource,\n };\n\n const prompt = renderTemplate(planTemplate, vars);\n\n if (printPrompt) {\n emit({ kind: \"text\", text: prompt });\n return 0;\n }\n\n if (dryRun) {\n emit({ kind: \"info\", message: \"Dry run — would plan: \" + workerCommand.join(\" \") });\n emit({ kind: \"info\", message: \"Prompt length: \" + prompt.length + \" chars\" });\n return 0;\n }\n\n const artifactContext = dependencies.artifactStore.createContext({\n cwd,\n commandName: \"plan\",\n workerCommand,\n mode,\n transport,\n source,\n task: {\n text: task.text,\n file: task.file,\n line: task.line,\n index: task.index,\n source: fileSource,\n },\n keepArtifacts,\n });\n let artifactsFinalized = false;\n let artifactStatus = \"running\";\n\n const finishPlan = (code: number, status: string): number => {\n artifactStatus = status;\n finalizePlanArtifacts(dependencies.artifactStore, artifactContext, keepArtifacts, artifactStatus, emit);\n artifactsFinalized = true;\n return code;\n };\n\n try {\n emit({\n kind: \"info\",\n message: \"Running planner: \" + workerCommand.join(\" \") + \" [mode=\" + mode + \", transport=\" + transport + \"]\",\n });\n const runResult = await dependencies.workerExecutor.runWorker({\n command: workerCommand,\n prompt,\n mode,\n transport,\n cwd,\n artifactContext,\n artifactPhase: \"plan\",\n });\n\n if (mode === \"wait\" && runResult.stderr) {\n emit({ kind: \"stderr\", text: runResult.stderr });\n }\n\n if (runResult.exitCode !== 0 && runResult.exitCode !== null) {\n emit({ kind: \"error\", message: \"Planner worker exited with code \" + runResult.exitCode + \".\" });\n return finishPlan(1, \"execution-failed\");\n }\n\n if (!runResult.stdout || runResult.stdout.trim().length === 0) {\n emit({ kind: \"warn\", message: \"Planner produced no output. No subtasks created.\" });\n return finishPlan(0, \"completed\");\n }\n\n const count = applyPlannerOutputWithFileSystem(task, runResult.stdout, dependencies.fileSystem);\n if (count === 0) {\n emit({ kind: \"warn\", message: \"Planner output contained no valid task items. No subtasks created.\" });\n return finishPlan(0, \"completed\");\n }\n\n emit({\n kind: \"success\",\n message: \"Inserted \" + count + \" subtask\" + (count === 1 ? \"\" : \"s\") + \" under: \" + task.text,\n });\n return finishPlan(0, \"completed\");\n } finally {\n if (!artifactsFinalized) {\n finalizePlanArtifacts(dependencies.artifactStore, artifactContext, keepArtifacts, artifactStatus, emit);\n artifactsFinalized = true;\n }\n }\n };\n}\n\nasync function selectPlanTask(\n source: string,\n at: string | undefined,\n sortMode: SortMode,\n dependencies: PlanTaskDependencies,\n emit: ApplicationOutputPort[\"emit\"],\n): Promise<{ result: TaskSelectionResult | null; exitCode: number }> {\n if (at) {\n const parsed = parseTaskLocation(at);\n if (parsed.kind === \"invalid-format\") {\n emit({ kind: \"error\", message: \"Invalid --at format. Expected file:line (e.g. roadmap.md:12).\" });\n return { result: null, exitCode: 1 };\n }\n\n if (parsed.kind === \"invalid-line\") {\n emit({ kind: \"error\", message: \"Invalid line number in --at: \" + parsed.lineRaw });\n return { result: null, exitCode: 1 };\n }\n\n const { filePath, lineNum } = parsed;\n const selected = dependencies.taskSelector.selectTaskByLocation(filePath, lineNum);\n if (!selected) {\n emit({ kind: \"error\", message: \"No task found at \" + filePath + \":\" + lineNum });\n return { result: null, exitCode: 3 };\n }\n\n return { result: selected, exitCode: 0 };\n }\n\n const files = await dependencies.sourceResolver.resolveSources(source);\n if (files.length === 0) {\n emit({ kind: \"warn\", message: \"No Markdown files found matching: \" + source });\n return { result: null, exitCode: 3 };\n }\n\n const selected = dependencies.taskSelector.selectNextTask(files, sortMode);\n if (!selected) {\n emit({ kind: \"info\", message: \"No unchecked tasks found.\" });\n return { result: null, exitCode: 3 };\n }\n\n return { result: selected, exitCode: 0 };\n}\n\nfunction formatTaskLabel(task: Task): string {\n return `${task.file}:${task.line} [#${task.index}] ${task.text}`;\n}\n\nfunction parseTaskLocation(\n value: string,\n):\n | { kind: \"ok\"; filePath: string; lineNum: number }\n | { kind: \"invalid-format\" }\n | { kind: \"invalid-line\"; lineRaw: string } {\n const colonIdx = value.lastIndexOf(\":\");\n if (colonIdx === -1) {\n return { kind: \"invalid-format\" };\n }\n\n const filePath = value.slice(0, colonIdx);\n const lineRaw = value.slice(colonIdx + 1);\n const lineNum = Number.parseInt(lineRaw, 10);\n if (!Number.isFinite(lineNum) || lineNum < 1) {\n return { kind: \"invalid-line\", lineRaw };\n }\n\n return { kind: \"ok\", filePath, lineNum };\n}\n\nexport const planTask = createPlanTask;\n\nfunction finalizePlanArtifacts(\n artifactStore: ArtifactStore,\n artifactContext: ArtifactContext,\n preserve: boolean,\n status: string,\n emit: ApplicationOutputPort[\"emit\"],\n): void {\n artifactStore.finalize(artifactContext, {\n status,\n preserve,\n });\n\n if (preserve) {\n emit({\n kind: \"info\",\n message: \"Runtime artifacts saved at \"\n + artifactStore.displayPath(artifactContext)\n + \".\",\n });\n }\n}\n\nconst TEMPLATE_VAR_KEY = /^[A-Za-z_]\\w*$/;\n\nfunction loadTemplateVarsFileFromPorts(\n filePath: string,\n cwd: string,\n fileSystem: FileSystem,\n): ExtraTemplateVars {\n const resolvedPath = path.resolve(cwd, filePath);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(fileSystem.readText(resolvedPath));\n } catch (error) {\n throw new Error(`Failed to read template vars file \\\"${filePath}\\\": ${String(error)}`);\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`Template vars file \\\"${filePath}\\\" must contain a JSON object.`);\n }\n\n const vars: ExtraTemplateVars = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!TEMPLATE_VAR_KEY.test(key)) {\n throw new Error(`Invalid template variable name \\\"${key}\\\" in \\\"${filePath}\\\". Use letters, numbers, and underscores only.`);\n }\n\n if (value === null || value === undefined) {\n vars[key] = \"\";\n continue;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n vars[key] = String(value);\n continue;\n }\n\n throw new Error(`Template variable \\\"${key}\\\" in \\\"${filePath}\\\" must be a string, number, boolean, or null.`);\n }\n\n return vars;\n}\n\nfunction loadPlanTemplateFromPorts(cwd: string, templateLoader: TemplateLoader): string {\n return templateLoader.load(path.join(cwd, \".rundown\", \"plan.md\")) ?? DEFAULT_PLAN_TEMPLATE;\n}\n\nfunction applyPlannerOutputWithFileSystem(\n task: Task,\n plannerOutput: string,\n fileSystem: FileSystem,\n): number {\n const subitemLines = parsePlannerOutput(plannerOutput);\n if (subitemLines.length === 0) {\n return 0;\n }\n\n const source = fileSystem.readText(task.file);\n const updated = insertSubitems(source, task, subitemLines);\n fileSystem.writeText(task.file, updated);\n\n return subitemLines.length;\n}\n","import type { Task } from \"./parser.js\";\r\n\r\nexport type { Task } from \"./parser.js\";\r\n\r\nexport type PlannerSubitemLine = string;\r\n\r\nexport function parsePlannerOutput(output: string): PlannerSubitemLine[] {\r\n const lines = output.split(/\\r?\\n/);\r\n const taskPattern = /^\\s*[-*+]\\s+\\[ \\]\\s+\\S/;\r\n\r\n return lines\r\n .filter((line) => taskPattern.test(line))\r\n .map((line) => line.replace(/^\\s+/, \"\"));\r\n}\r\n\r\nexport function computeChildIndent(parentLine: string): string {\r\n const leadingWhitespace = parentLine.match(/^(\\s*)/)?.[1] ?? \"\";\r\n const indentUnit = \" \";\r\n return leadingWhitespace + indentUnit;\r\n}\r\n\r\nexport function insertSubitems(\r\n source: string,\r\n task: Task,\r\n subitemLines: PlannerSubitemLine[],\r\n): string {\r\n if (subitemLines.length === 0) return source;\r\n\r\n const eol = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\r\n const lines = source.split(/\\r?\\n/);\r\n const parentLineIndex = task.line - 1;\r\n\r\n if (parentLineIndex < 0 || parentLineIndex >= lines.length) {\r\n throw new Error(`Task line ${task.line} is out of range.`);\r\n }\r\n\r\n const parentLine = lines[parentLineIndex]!;\r\n const indent = computeChildIndent(parentLine);\r\n\r\n const indented = subitemLines.map((item) => {\r\n const text = item.replace(/^[-*+]\\s+/, \"\");\r\n return `${indent}- ${text}`;\r\n });\r\n\r\n lines.splice(parentLineIndex + 1, 0, ...indented);\r\n\r\n return lines.join(eol);\r\n}\r\n","/**\r\n * Markdown AST-based task parser.\r\n *\r\n * Uses mdast to walk the parsed Markdown tree and extract task list items.\r\n * Fenced code blocks and other non-task structures are naturally excluded\r\n * by the AST — no regex guessing required.\r\n */\r\n\r\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\r\nimport {\r\n gfmTaskListItem,\r\n} from \"micromark-extension-gfm-task-list-item\";\r\nimport {\r\n gfmTaskListItemFromMarkdown,\r\n} from \"mdast-util-gfm-task-list-item\";\r\nimport type { ListItem, Parent, RootContent } from \"mdast\";\r\n\r\n/** Represents a single task extracted from a Markdown document. */\r\nexport interface Task {\r\n /** The text content of the task item. */\r\n text: string;\r\n /** Whether the checkbox is checked. */\r\n checked: boolean;\r\n /** Zero-based index among all tasks in the document. */\r\n index: number;\r\n /** 1-based line number in the source file. */\r\n line: number;\r\n /** Column offset of the checkbox in the source line. */\r\n column: number;\r\n /** Byte offset of the start of this node in the source. */\r\n offsetStart: number;\r\n /** Byte offset of the end of this node in the source. */\r\n offsetEnd: number;\r\n /** The source file path (set later by the caller). */\r\n file: string;\r\n /** Whether this is an inline CLI task (starts with \"cli: \"). */\r\n isInlineCli: boolean;\r\n /** If inline CLI, the command string. */\r\n cliCommand?: string;\r\n /** Nesting depth (0 = top-level list item). */\r\n depth: number;\r\n}\r\n\r\nconst CLI_PREFIX = /^cli:\\s*/i;\r\n\r\n/**\r\n * Parse a Markdown source string and return all task list items found.\r\n *\r\n * Tasks inside fenced code blocks are naturally excluded because the\r\n * AST parser treats code blocks as opaque content nodes.\r\n */\r\nexport function parseTasks(source: string, file: string = \"\"): Task[] {\r\n const tree = fromMarkdown(source, {\r\n extensions: [gfmTaskListItem()],\r\n mdastExtensions: [gfmTaskListItemFromMarkdown()],\r\n });\r\n\r\n const tasks: Task[] = [];\r\n walkForTasks(tree, tasks, file, 0);\r\n return tasks;\r\n}\r\n\r\nfunction walkForTasks(\r\n node: Parent | RootContent,\r\n tasks: Task[],\r\n file: string,\r\n depth: number,\r\n): void {\r\n if (isListItem(node) && node.checked !== null && node.checked !== undefined) {\r\n const text = extractText(node);\r\n const pos = node.position;\r\n const isInlineCli = CLI_PREFIX.test(text);\r\n\r\n const task: Task = {\r\n text,\r\n checked: node.checked === true,\r\n index: tasks.length,\r\n line: pos?.start.line ?? 0,\r\n column: pos?.start.column ?? 0,\r\n offsetStart: pos?.start.offset ?? 0,\r\n offsetEnd: pos?.end?.offset ?? 0,\r\n file,\r\n isInlineCli,\r\n depth,\r\n };\r\n\r\n if (isInlineCli) {\r\n task.cliCommand = text.replace(CLI_PREFIX, \"\").trim();\r\n }\r\n\r\n tasks.push(task);\r\n }\r\n\r\n if (\"children\" in node) {\r\n const nextDepth = isListItem(node) ? depth + 1 : depth;\r\n for (const child of (node as Parent).children) {\r\n walkForTasks(child, tasks, file, nextDepth);\r\n }\r\n }\r\n}\r\n\r\nfunction isListItem(node: unknown): node is ListItem {\r\n return (node as ListItem).type === \"listItem\";\r\n}\r\n\r\n/**\r\n * Extract plain text content from a list item node.\r\n *\r\n * Only collects text from the item's direct paragraph children,\r\n * not from nested lists (which are separate tasks).\r\n */\r\nfunction extractText(node: ListItem): string {\r\n const parts: string[] = [];\r\n for (const child of node.children) {\r\n // Only extract text from paragraphs, not nested lists\r\n if (child.type === \"paragraph\") {\r\n collectText(child, parts);\r\n }\r\n }\r\n return parts.join(\"\").trim();\r\n}\r\n\r\nfunction collectText(node: Parent | RootContent, parts: string[]): void {\r\n if (node.type === \"text\" || node.type === \"inlineCode\") {\r\n parts.push((node as { value: string }).value);\r\n }\r\n if (\"children\" in node) {\r\n for (const child of (node as Parent).children) {\r\n collectText(child, parts);\r\n }\r\n }\r\n}\r\n","import type { Task } from \"./parser.js\";\n\n/**\n * Determine whether a task has unchecked descendants.\n *\n * Descendants are tasks that appear after the given task in document\n * order and have a strictly greater depth, up to the next task at the\n * same or shallower depth.\n */\nexport function hasUncheckedDescendants(task: Task, allTasks: Task[]): boolean {\n const startIdx = allTasks.indexOf(task);\n if (startIdx === -1) return false;\n\n for (let i = startIdx + 1; i < allTasks.length; i++) {\n const candidate = allTasks[i]!;\n if (candidate.depth <= task.depth) break;\n if (!candidate.checked) return true;\n }\n\n return false;\n}\n\n/**\n * Filter a list of tasks to only those that are runnable.\n *\n * An unchecked task is runnable if it has no unchecked descendants.\n * Checked tasks are excluded entirely.\n */\nexport function filterRunnable(tasks: Task[]): Task[] {\n return tasks.filter((task) => !task.checked && !hasUncheckedDescendants(task, tasks));\n}\n","/**\r\n * File sorting.\r\n *\r\n * Provides sorting strategies for resolved Markdown file paths.\r\n */\r\n\r\nimport path from \"node:path\";\n\nexport type SortMode = \"name-sort\" | \"none\" | \"old-first\" | \"new-first\";\n\nexport interface SortFilesOptions {\n getBirthtimeMs?: (filePath: string) => number;\n}\n\r\n/**\r\n * Sort file paths according to the chosen sort mode.\r\n *\r\n * - `name-sort` (default): human-friendly natural sort so \"2. X.md\" < \"10. Y.md\"\r\n * - `none`: leave order as-is from the file matcher\r\n * - `old-first`: oldest by creation time first\r\n * - `new-first`: newest by creation time first\r\n */\r\nexport function sortFiles(\n files: string[],\n mode: SortMode = \"name-sort\",\n options: SortFilesOptions = {},\n): string[] {\n switch (mode) {\r\n case \"none\":\r\n return files;\r\n\r\n case \"name-sort\":\r\n return [...files].sort((a, b) => naturalCompare(path.basename(a), path.basename(b)));\r\n\r\n case \"old-first\":\n return [...files].sort((a, b) => getBirthtime(a, options) - getBirthtime(b, options));\n\n case \"new-first\":\n return [...files].sort((a, b) => getBirthtime(b, options) - getBirthtime(a, options));\n\r\n default:\r\n return files;\r\n }\r\n}\r\n\r\n/**\r\n * Natural comparison — numbers inside strings are compared numerically.\r\n *\r\n * \"2. Plan.md\" comes before \"10. Plan.md\".\r\n */\r\nfunction naturalCompare(a: string, b: string): number {\r\n const ax = tokenize(a);\r\n const bx = tokenize(b);\r\n\r\n for (let i = 0; i < Math.max(ax.length, bx.length); i++) {\r\n const ai = ax[i];\r\n const bi = bx[i];\r\n if (ai === undefined) return -1;\r\n if (bi === undefined) return 1;\r\n\r\n const an = typeof ai === \"number\";\r\n const bn = typeof bi === \"number\";\r\n\r\n if (an && bn) {\r\n if (ai !== bi) return (ai as number) - (bi as number);\r\n } else if (an) {\r\n return -1;\r\n } else if (bn) {\r\n return 1;\r\n } else {\r\n const cmp = (ai as string).localeCompare(bi as string, undefined, { sensitivity: \"base\" });\r\n if (cmp !== 0) return cmp;\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction tokenize(s: string): (string | number)[] {\r\n const tokens: (string | number)[] = [];\r\n const re = /(\\d+)|(\\D+)/g;\r\n let m: RegExpExecArray | null;\r\n while ((m = re.exec(s)) !== null) {\r\n if (m[1] !== undefined) {\r\n tokens.push(parseInt(m[1], 10));\r\n } else {\r\n tokens.push(m[2]!);\r\n }\r\n }\r\n return tokens;\r\n}\r\n\r\nfunction getBirthtime(filePath: string, options: SortFilesOptions): number {\n if (!options.getBirthtimeMs) return 0;\n return options.getBirthtimeMs(filePath);\n}\n","import { parseTasks } from \"../domain/parser.js\";\nimport { hasUncheckedDescendants } from \"../domain/task-selection.js\";\nimport type { SortMode } from \"../domain/sorting.js\";\nimport { sortFiles } from \"../domain/sorting.js\";\nimport type { FileSystem } from \"../domain/ports/file-system.js\";\nimport type { SourceResolverPort } from \"../domain/ports/source-resolver-port.js\";\nimport type { ApplicationOutputPort } from \"../domain/ports/output-port.js\";\n\nexport interface ListTasksDependencies {\n fileSystem: FileSystem;\n sourceResolver: SourceResolverPort;\n output: ApplicationOutputPort;\n}\n\r\nexport interface ListTasksOptions {\r\n source: string;\r\n sortMode: SortMode;\r\n includeAll: boolean;\r\n}\r\n\r\nexport function createListTasks(\n dependencies: ListTasksDependencies,\n): (options: ListTasksOptions) => Promise<number> {\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n return async function listTasks(options: ListTasksOptions): Promise<number> {\n const { source, sortMode, includeAll } = options;\n\n const files = await dependencies.sourceResolver.resolveSources(source);\n if (files.length === 0) {\n emit({ kind: \"warn\", message: \"No Markdown files found matching: \" + source });\n return 3;\n }\n\n const sorted = sortFiles(files, sortMode, {\n getBirthtimeMs: (filePath) => {\n const stats = dependencies.fileSystem.stat(filePath);\n if (!stats) {\n throw new Error(`ENOENT: no such file or directory, stat '${filePath}'`);\n }\n\n if (stats.birthtimeMs !== undefined && Number.isFinite(stats.birthtimeMs)) {\n return stats.birthtimeMs;\n }\n\n if (stats.mtimeMs !== undefined && Number.isFinite(stats.mtimeMs)) {\n return stats.mtimeMs;\n }\n\n throw new Error(`birthtime unavailable for '${filePath}'`);\n },\n });\n let count = 0;\n\n for (const file of sorted) {\n const content = dependencies.fileSystem.readText(file);\n const tasks = parseTasks(content, file);\n const filtered = includeAll ? tasks : tasks.filter((task) => !task.checked);\n\n for (const task of filtered) {\n const blocked = !task.checked && hasUncheckedDescendants(task, tasks);\n emit({ kind: \"task\", task, blocked });\n count++;\n }\n }\n\n if (count === 0) {\n emit({ kind: \"info\", message: \"No tasks found.\" });\n }\n\n return 0;\n };\n}\n\nexport const listTasks = createListTasks;\n","import type { SortMode } from \"../domain/sorting.js\";\nimport type { Task } from \"../domain/parser.js\";\nimport type {\n SourceResolverPort,\n TaskSelectionResult as PortTaskSelectionResult,\n TaskSelectorPort,\n} from \"../domain/ports/index.js\";\nimport type { ApplicationOutputPort } from \"../domain/ports/output-port.js\";\n\nexport type TaskSelectionResult = PortTaskSelectionResult;\n\nexport interface NextTaskDependencies {\n sourceResolver: SourceResolverPort;\n taskSelector: TaskSelectorPort;\n output: ApplicationOutputPort;\n}\n\r\nexport interface NextTaskOptions {\r\n source: string;\r\n sortMode: SortMode;\r\n}\r\n\r\nexport function createNextTask(\n dependencies: NextTaskDependencies,\n): (options: NextTaskOptions) => Promise<number> {\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n return async function nextTask(options: NextTaskOptions): Promise<number> {\n const { source, sortMode } = options;\n\n const files = await dependencies.sourceResolver.resolveSources(source);\n if (files.length === 0) {\n emit({ kind: \"warn\", message: \"No Markdown files found matching: \" + source });\n return 3;\n }\n\n const result = dependencies.taskSelector.selectNextTask(files, sortMode);\n if (!result) {\n emit({ kind: \"info\", message: \"No unchecked tasks found.\" });\n return 3;\n }\n\n emit({ kind: \"task\", task: result.task });\n return 0;\n };\n}\n\nexport const nextTask = createNextTask;\n","import {\n DEFAULT_CORRECT_TEMPLATE,\n DEFAULT_PLAN_TEMPLATE,\n DEFAULT_TASK_TEMPLATE,\n DEFAULT_VALIDATE_TEMPLATE,\n DEFAULT_VARS_FILE_CONTENT,\n} from \"../domain/defaults.js\";\nimport type { FileSystem } from \"../domain/ports/file-system.js\";\nimport type { ApplicationOutputPort } from \"../domain/ports/output-port.js\";\n\nconst CONFIG_DIR = \".rundown\";\n\nexport interface InitProjectDependencies {\n fileSystem: FileSystem;\n output: ApplicationOutputPort;\n}\n\nexport function createInitProject(\n dependencies: InitProjectDependencies,\n): () => Promise<number> {\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n return async function initProject(): Promise<number> {\n if (!dependencies.fileSystem.exists(CONFIG_DIR)) {\n dependencies.fileSystem.mkdir(CONFIG_DIR, { recursive: true });\n }\n\n const write = (name: string, content: string) => {\n const filePath = `${CONFIG_DIR}/${name}`;\n if (dependencies.fileSystem.exists(filePath)) {\n emit({ kind: \"warn\", message: `${filePath} already exists, skipping.` });\n return;\n }\n\n dependencies.fileSystem.writeText(filePath, content);\n emit({ kind: \"success\", message: `Created ${filePath}` });\n };\n\n write(\"execute.md\", DEFAULT_TASK_TEMPLATE);\n write(\"verify.md\", DEFAULT_VALIDATE_TEMPLATE);\n write(\"repair.md\", DEFAULT_CORRECT_TEMPLATE);\n write(\"plan.md\", DEFAULT_PLAN_TEMPLATE);\n write(\"vars.json\", DEFAULT_VARS_FILE_CONTENT);\n\n emit({ kind: \"success\", message: \"Initialized .rundown/ with default templates.\" });\n return 0;\n };\n}\n\nexport const initProject = createInitProject;\n","import type { ApplicationOutputPort } from \"../domain/ports/output-port.js\";\nimport type {\n ArtifactStore,\n DirectoryOpenerPort,\n WorkingDirectoryPort,\n} from \"../domain/ports/index.js\";\n\nexport interface SavedRuntimeArtifactRun {\n runId: string;\n rootDir: string;\n relativePath: string;\n commandName: string;\n workerCommand?: string[];\n mode?: string;\n transport?: string;\n source?: string;\n keepArtifacts?: boolean;\n completedAt?: string;\n task?: {\n text: string;\n file: string;\n line: number;\n index?: number;\n source?: string;\n };\n startedAt: string;\n status?: string;\n}\n\nexport interface ManageArtifactsDependencies {\n artifactStore: ArtifactStore;\n directoryOpener: DirectoryOpenerPort;\n workingDirectory: WorkingDirectoryPort;\n output: ApplicationOutputPort;\n}\n\r\nexport interface ManageArtifactsOptions {\r\n clean: boolean;\r\n json: boolean;\r\n failed: boolean;\r\n open: string;\r\n cwd?: string;\r\n}\r\n\r\nexport function createManageArtifacts(\n dependencies: ManageArtifactsDependencies,\n): (options: ManageArtifactsOptions) => number {\n const emit = dependencies.output.emit.bind(dependencies.output);\n\n return function manageArtifacts(options: ManageArtifactsOptions): number {\n const shouldClean = options.clean;\n const shouldPrintJson = options.json;\n const onlyFailed = options.failed;\n const runToOpen = options.open;\n const cwd = options.cwd ?? dependencies.workingDirectory.cwd();\n\r\n if (shouldClean && (shouldPrintJson || runToOpen)) {\n emit({ kind: \"error\", message: \"--clean cannot be combined with --json or --open.\" });\n return 1;\n }\n\n if (runToOpen && (shouldPrintJson || onlyFailed)) {\n emit({ kind: \"error\", message: \"--open cannot be combined with --json or --failed.\" });\n return 1;\n }\n\n if (runToOpen) {\n const run = runToOpen === \"latest\"\n ? dependencies.artifactStore.latest(cwd)\n : dependencies.artifactStore.find(runToOpen, cwd);\n if (!run) {\n emit({ kind: \"error\", message: \"No saved runtime artifact run found for: \" + runToOpen });\n return 3;\n }\n\n dependencies.directoryOpener.openDirectory(run.rootDir);\n emit({ kind: \"success\", message: \"Opened runtime artifacts: \" + run.relativePath });\n return 0;\n }\n\n if (shouldClean) {\n const removed = onlyFailed\n ? dependencies.artifactStore.removeFailed(cwd)\n : dependencies.artifactStore.removeSaved(cwd);\n if (removed === 0) {\n emit({ kind: \"info\", message: onlyFailed ? \"No failed runtime artifacts found.\" : \"No saved runtime artifacts found.\" });\n return 0;\n }\n\n emit({\n kind: \"success\",\n message: \"Removed \" + removed + \" \"\n + (onlyFailed ? \"failed \" : \"\")\n + \"runtime artifact run\"\n + (removed === 1 ? \"\" : \"s\")\n + \".\",\n });\n return 0;\n }\n\r\n const runs = onlyFailed\n ? dependencies.artifactStore.listFailed(cwd)\n : dependencies.artifactStore.listSaved(cwd);\n\r\n if (runs.length === 0) {\n emit({ kind: \"info\", message: onlyFailed ? \"No failed runtime artifacts found.\" : \"No saved runtime artifacts found.\" });\n return 0;\n }\n\n if (shouldPrintJson) {\n emit({ kind: \"text\", text: JSON.stringify(runs, null, 2) });\n return 0;\n }\n\r\n for (const run of runs) {\n const worker = run.workerCommand?.join(\" \") ?? run.commandName;\n const summary = [\n run.runId,\n `[status=${run.status ?? \"unknown\"}]`,\n `[command=${run.commandName}]`,\n `[mode=${run.mode ?? \"n/a\"}]`,\n `[transport=${run.transport ?? \"n/a\"}]`,\n run.relativePath,\n ].join(\" \");\n\r\n emit({ kind: \"text\", text: summary });\n if (run.task) {\n emit({ kind: \"text\", text: \" task: \" + run.task.text + \" — \" + run.task.file + \":\" + run.task.line });\n }\n emit({ kind: \"text\", text: \" worker: \" + worker });\n emit({ kind: \"text\", text: \" started: \" + run.startedAt });\n }\n\n return 0;\n };\n}\n\nexport const manageArtifacts = createManageArtifacts;\n","import fs from \"node:fs\";\nimport type { FileSystem, FileSystemDirent, FileSystemStat } from \"../../domain/ports/file-system.js\";\n\nexport function createNodeFileSystem(): FileSystem {\n return {\n exists(filePath) {\n return fs.existsSync(filePath);\n },\n readText(filePath) {\n return fs.readFileSync(filePath, \"utf-8\");\n },\n writeText(filePath, content) {\n fs.writeFileSync(filePath, content, \"utf-8\");\n },\n mkdir(dirPath, options) {\n fs.mkdirSync(dirPath, options);\n },\n readdir(dirPath) {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n return entries.map((entry): FileSystemDirent => ({\n name: entry.name,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n }));\n },\n stat(filePath) {\n try {\n const stats = fs.statSync(filePath);\n const value: FileSystemStat = {\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n birthtimeMs: stats.birthtimeMs,\n mtimeMs: stats.mtimeMs,\n };\n return value;\n } catch {\n return null;\n }\n },\n unlink(filePath) {\n fs.unlinkSync(filePath);\n },\n rm(filePath, options) {\n fs.rmSync(filePath, options);\n },\n };\n}\n","import spawn from \"cross-spawn\";\nimport type {\n ProcessRunner,\n ProcessRunOptions,\n ProcessRunResult,\n} from \"../../domain/ports/process-runner.js\";\n\nexport function createCrossSpawnProcessRunner(): ProcessRunner {\n return {\n run(options) {\n return runWithCrossSpawn(options);\n },\n };\n}\n\nfunction runWithCrossSpawn(options: ProcessRunOptions): Promise<ProcessRunResult> {\n return new Promise((resolve, reject) => {\n const { command, args, cwd, mode, shell, env, timeoutMs } = options;\n\n if (mode === \"detached\") {\n const child = spawn(command, args, {\n cwd,\n shell: shell ?? false,\n env,\n stdio: \"ignore\",\n detached: true,\n });\n child.on(\"error\", reject);\n child.unref();\n resolve({ exitCode: null, stdout: \"\", stderr: \"\" });\n return;\n }\n\n if (mode === \"tui\") {\n const child = spawn(command, args, {\n cwd,\n shell: shell ?? false,\n env,\n stdio: \"inherit\",\n });\n child.on(\"close\", (exitCode) => {\n resolve({ exitCode, stdout: \"\", stderr: \"\" });\n });\n child.on(\"error\", reject);\n return;\n }\n\n const child = spawn(command, args, {\n cwd,\n shell: shell ?? false,\n env,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let timeoutHandle: NodeJS.Timeout | null = null;\n\n if (typeof timeoutMs === \"number\" && timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n child.kill(\"SIGTERM\");\n }, timeoutMs);\n }\n\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n\n resolve({\n exitCode,\n stdout: Buffer.concat(stdout).toString(\"utf-8\"),\n stderr: Buffer.concat(stderr).toString(\"utf-8\"),\n });\n });\n });\n}\n","import { execFile } from \"node:child_process\";\nimport type { GitClient } from \"../../domain/ports/git-client.js\";\n\nexport function createExecFileGitClient(): GitClient {\n return {\n run(args, cwd, options) {\n return runGit(args, cwd, options?.timeoutMs);\n },\n };\n}\n\nfunction runGit(args: string[], cwd: string, timeoutMs: number = 30_000): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(\"git\", args, { cwd, timeout: timeoutMs }, (error, stdout, stderr) => {\n if (error) {\n const message = stderr?.trim() || stdout?.trim() || error.message;\n reject(new Error(`git ${args[0]}: ${message}`));\n return;\n }\n\n resolve(stdout.trim());\n });\n });\n}\n","import fs from \"node:fs\";\nimport type { TemplateLoader } from \"../../domain/ports/template-loader.js\";\n\nexport function createFsTemplateLoader(): TemplateLoader {\n return {\n load(filePath) {\n try {\n return fs.readFileSync(filePath, \"utf-8\");\n } catch {\n return null;\n }\n },\n };\n}\n","import fs from \"node:fs\";\nimport type { Task } from \"../../domain/parser.js\";\nimport type { ValidationSidecar } from \"../../domain/ports/validation-sidecar.js\";\n\nexport function createFsValidationSidecar(): ValidationSidecar {\n return {\n filePath(task) {\n return validationFilePath(task);\n },\n read(task) {\n const filePath = validationFilePath(task);\n try {\n return fs.readFileSync(filePath, \"utf-8\").trim();\n } catch {\n return null;\n }\n },\n remove(task) {\n const filePath = validationFilePath(task);\n try {\n fs.unlinkSync(filePath);\n } catch {\n // Ignore missing sidecar files.\n }\n },\n };\n}\n\nfunction validationFilePath(task: Task): string {\n return `${task.file}.${task.index}.validation`;\n}\n","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { randomBytes } from \"node:crypto\";\r\n\r\nexport type RuntimePhase = \"execute\" | \"verify\" | \"repair\" | \"plan\" | \"inline-cli\" | \"worker\";\r\n\r\nexport interface RuntimeTaskMetadata {\r\n text: string;\r\n file: string;\r\n line: number;\r\n index: number;\r\n source: string;\r\n}\r\n\r\nexport interface RuntimeArtifactsContext {\r\n readonly runId: string;\r\n readonly rootDir: string;\r\n readonly cwd: string;\r\n readonly keepArtifacts: boolean;\r\n readonly commandName: string;\r\n readonly workerCommand?: string[];\r\n readonly mode?: string;\r\n readonly transport?: string;\r\n readonly task?: RuntimeTaskMetadata;\r\n sequence: number;\r\n}\r\n\r\ninterface RuntimeArtifactsMetadata {\r\n runId: string;\r\n commandName: string;\r\n workerCommand?: string[];\r\n mode?: string;\r\n transport?: string;\r\n source?: string;\r\n task?: RuntimeTaskMetadata;\r\n keepArtifacts: boolean;\r\n startedAt: string;\r\n completedAt?: string;\r\n status?: string;\r\n}\r\n\r\nexport interface SavedRuntimeArtifactRun {\r\n runId: string;\r\n rootDir: string;\r\n relativePath: string;\r\n commandName: string;\r\n workerCommand?: string[];\r\n mode?: string;\r\n transport?: string;\r\n source?: string;\r\n task?: RuntimeTaskMetadata;\r\n keepArtifacts: boolean;\r\n startedAt: string;\r\n completedAt?: string;\r\n status?: string;\r\n}\r\n\r\ninterface PhaseMetadata {\r\n runId: string;\r\n sequence: number;\r\n phase: RuntimePhase;\r\n command?: string[];\r\n mode?: string;\r\n transport?: string;\r\n task?: RuntimeTaskMetadata;\r\n promptFile?: string | null;\r\n stdoutFile?: string | null;\r\n stderrFile?: string | null;\r\n exitCode?: number | null;\r\n outputCaptured: boolean;\r\n startedAt: string;\r\n completedAt?: string;\r\n notes?: string;\r\n extra?: Record<string, unknown>;\r\n}\r\n\r\nexport interface BeginRuntimePhaseOptions {\r\n phase: RuntimePhase;\r\n prompt?: string;\r\n command?: string[];\r\n mode?: string;\r\n transport?: string;\r\n notes?: string;\r\n extra?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RuntimePhaseHandle {\r\n readonly context: RuntimeArtifactsContext;\r\n readonly phase: RuntimePhase;\r\n readonly sequence: number;\r\n readonly dir: string;\r\n readonly promptFile: string | null;\r\n readonly metadataFile: string;\r\n metadata: PhaseMetadata;\r\n}\r\n\r\nexport interface CompleteRuntimePhaseOptions {\r\n exitCode: number | null;\r\n stdout?: string;\r\n stderr?: string;\r\n outputCaptured: boolean;\r\n notes?: string;\r\n extra?: Record<string, unknown>;\r\n}\r\n\r\nexport interface FinalizeRuntimeArtifactsOptions {\r\n status: string;\r\n preserve?: boolean;\r\n}\r\n\r\nexport function createRuntimeArtifactsContext(options: {\r\n cwd?: string;\r\n commandName: string;\r\n workerCommand?: string[];\r\n mode?: string;\r\n transport?: string;\r\n source?: string;\r\n task?: RuntimeTaskMetadata;\r\n keepArtifacts?: boolean;\r\n}): RuntimeArtifactsContext {\r\n const cwd = options.cwd ?? process.cwd();\r\n const rootBase = path.join(cwd, \".rundown\", \"runs\");\r\n fs.mkdirSync(rootBase, { recursive: true });\r\n\r\n const runId = buildRunId();\r\n const rootDir = path.join(rootBase, runId);\r\n fs.mkdirSync(rootDir, { recursive: true });\r\n\r\n const context: RuntimeArtifactsContext = {\r\n runId,\r\n rootDir,\r\n cwd,\r\n keepArtifacts: options.keepArtifacts ?? false,\r\n commandName: options.commandName,\r\n workerCommand: options.workerCommand,\r\n mode: options.mode,\r\n transport: options.transport,\r\n task: options.task,\r\n sequence: 0,\r\n };\r\n\r\n const metadata: RuntimeArtifactsMetadata = {\r\n runId,\r\n commandName: options.commandName,\r\n workerCommand: options.workerCommand,\r\n mode: options.mode,\r\n transport: options.transport,\r\n source: options.source,\r\n task: options.task,\r\n keepArtifacts: context.keepArtifacts,\r\n startedAt: new Date().toISOString(),\r\n };\r\n\r\n writeJson(path.join(rootDir, \"run.json\"), metadata);\r\n return context;\r\n}\r\n\r\nexport function runtimeArtifactsRootDir(cwd: string = process.cwd()): string {\r\n return path.join(cwd, \".rundown\", \"runs\");\r\n}\r\n\r\nexport function listSavedRuntimeArtifacts(cwd: string = process.cwd()): SavedRuntimeArtifactRun[] {\r\n const rootDir = runtimeArtifactsRootDir(cwd);\r\n if (!fs.existsSync(rootDir)) {\r\n return [];\r\n }\r\n\r\n const runs: SavedRuntimeArtifactRun[] = [];\r\n\r\n for (const entry of fs.readdirSync(rootDir, { withFileTypes: true })) {\r\n if (!entry.isDirectory()) {\r\n continue;\r\n }\r\n\r\n const runDir = path.join(rootDir, entry.name);\r\n const metadata = readJson<RuntimeArtifactsMetadata>(path.join(runDir, \"run.json\"));\r\n if (!metadata) {\r\n continue;\r\n }\r\n\r\n runs.push({\r\n runId: metadata.runId,\r\n rootDir: runDir,\r\n relativePath: path.relative(cwd, runDir).split(path.sep).join(\"/\"),\r\n commandName: metadata.commandName,\r\n workerCommand: metadata.workerCommand,\r\n mode: metadata.mode,\r\n transport: metadata.transport,\r\n source: metadata.source,\r\n task: metadata.task,\r\n keepArtifacts: metadata.keepArtifacts,\r\n startedAt: metadata.startedAt,\r\n completedAt: metadata.completedAt,\r\n status: metadata.status,\r\n });\r\n }\r\n\r\n runs.sort((a, b) => b.startedAt.localeCompare(a.startedAt));\r\n return runs;\r\n}\r\n\r\nexport function listFailedRuntimeArtifacts(cwd: string = process.cwd()): SavedRuntimeArtifactRun[] {\r\n return listSavedRuntimeArtifacts(cwd).filter((run) => isFailedRuntimeArtifactStatus(run.status));\r\n}\r\n\r\nexport function latestSavedRuntimeArtifact(cwd: string = process.cwd()): SavedRuntimeArtifactRun | null {\r\n return listSavedRuntimeArtifacts(cwd)[0] ?? null;\r\n}\r\n\r\nexport function findSavedRuntimeArtifact(\r\n runId: string,\r\n cwd: string = process.cwd(),\r\n): SavedRuntimeArtifactRun | null {\r\n const runs = listSavedRuntimeArtifacts(cwd);\r\n const exact = runs.find((run) => run.runId === runId);\r\n if (exact) {\r\n return exact;\r\n }\r\n\r\n const prefixMatches = runs.filter((run) => run.runId.startsWith(runId));\r\n if (prefixMatches.length === 1) {\r\n return prefixMatches[0] ?? null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function removeSavedRuntimeArtifacts(cwd: string = process.cwd()): number {\r\n return removeRuntimeArtifactsMatching(() => true, cwd);\r\n}\r\n\r\nexport function removeFailedRuntimeArtifacts(cwd: string = process.cwd()): number {\r\n return removeRuntimeArtifactsMatching((run) => isFailedRuntimeArtifactStatus(run.status), cwd);\r\n}\r\n\r\nfunction removeRuntimeArtifactsMatching(\r\n predicate: (run: SavedRuntimeArtifactRun) => boolean,\r\n cwd: string,\r\n): number {\r\n const rootDir = runtimeArtifactsRootDir(cwd);\r\n if (!fs.existsSync(rootDir)) {\r\n return 0;\r\n }\r\n\r\n const runs = listSavedRuntimeArtifacts(cwd);\r\n let removed = 0;\r\n for (const run of runs) {\r\n if (!predicate(run)) {\r\n continue;\r\n }\r\n\r\n fs.rmSync(run.rootDir, { recursive: true, force: true });\r\n removed += 1;\r\n }\r\n\r\n return removed;\r\n}\r\n\r\nexport function isFailedRuntimeArtifactStatus(status: string | undefined): boolean {\r\n if (!status) {\r\n return false;\r\n }\r\n\r\n return status.includes(\"failed\");\r\n}\r\n\r\nexport function beginRuntimePhase(\r\n context: RuntimeArtifactsContext,\r\n options: BeginRuntimePhaseOptions,\r\n): RuntimePhaseHandle {\r\n context.sequence += 1;\r\n const sequence = context.sequence;\r\n const dirName = `${String(sequence).padStart(2, \"0\")}-${options.phase}`;\r\n const dir = path.join(context.rootDir, dirName);\r\n fs.mkdirSync(dir, { recursive: true });\r\n\r\n const promptFile = options.prompt === undefined\r\n ? null\r\n : path.join(dir, \"prompt.md\");\r\n\r\n if (promptFile) {\r\n fs.writeFileSync(promptFile, options.prompt ?? \"\", \"utf-8\");\r\n }\r\n\r\n const metadata: PhaseMetadata = {\r\n runId: context.runId,\r\n sequence,\r\n phase: options.phase,\r\n command: options.command,\r\n mode: options.mode,\r\n transport: options.transport,\r\n task: context.task,\r\n promptFile: promptFile ? \"prompt.md\" : null,\r\n stdoutFile: null,\r\n stderrFile: null,\r\n outputCaptured: false,\r\n startedAt: new Date().toISOString(),\r\n notes: options.notes,\r\n extra: options.extra,\r\n };\r\n\r\n const metadataFile = path.join(dir, \"metadata.json\");\r\n writeJson(metadataFile, metadata);\r\n\r\n return {\r\n context,\r\n phase: options.phase,\r\n sequence,\r\n dir,\r\n promptFile,\r\n metadataFile,\r\n metadata,\r\n };\r\n}\r\n\r\nexport function completeRuntimePhase(\r\n handle: RuntimePhaseHandle,\r\n options: CompleteRuntimePhaseOptions,\r\n): void {\r\n handle.metadata.exitCode = options.exitCode;\r\n handle.metadata.outputCaptured = options.outputCaptured;\r\n handle.metadata.completedAt = new Date().toISOString();\r\n\r\n if (options.stdout !== undefined && options.stdout.length > 0) {\r\n fs.writeFileSync(path.join(handle.dir, \"stdout.log\"), options.stdout, \"utf-8\");\r\n handle.metadata.stdoutFile = \"stdout.log\";\r\n }\r\n\r\n if (options.stderr !== undefined && options.stderr.length > 0) {\r\n fs.writeFileSync(path.join(handle.dir, \"stderr.log\"), options.stderr, \"utf-8\");\r\n handle.metadata.stderrFile = \"stderr.log\";\r\n }\r\n\r\n if (options.notes !== undefined) {\r\n handle.metadata.notes = options.notes;\r\n }\r\n\r\n if (options.extra !== undefined) {\r\n handle.metadata.extra = {\r\n ...(handle.metadata.extra ?? {}),\r\n ...options.extra,\r\n };\r\n }\r\n\r\n writeJson(handle.metadataFile, handle.metadata);\r\n}\r\n\r\nexport function finalizeRuntimeArtifacts(\r\n context: RuntimeArtifactsContext,\r\n options: FinalizeRuntimeArtifactsOptions,\r\n): void {\r\n const metadataFile = path.join(context.rootDir, \"run.json\");\r\n const metadata = readJson<RuntimeArtifactsMetadata>(metadataFile) ?? {\r\n runId: context.runId,\r\n commandName: context.commandName,\r\n workerCommand: context.workerCommand,\r\n mode: context.mode,\r\n transport: context.transport,\r\n task: context.task,\r\n keepArtifacts: context.keepArtifacts,\r\n startedAt: new Date().toISOString(),\r\n };\r\n\r\n metadata.completedAt = new Date().toISOString();\r\n metadata.status = options.status;\r\n writeJson(metadataFile, metadata);\r\n\r\n if (!options.preserve) {\r\n fs.rmSync(context.rootDir, { recursive: true, force: true });\r\n }\r\n}\r\n\r\nexport function displayArtifactsPath(context: RuntimeArtifactsContext): string {\r\n const relative = path.relative(context.cwd, context.rootDir);\r\n return relative === \"\" ? path.basename(context.rootDir) : relative.split(path.sep).join(\"/\");\r\n}\r\n\r\nfunction buildRunId(): string {\r\n const timestamp = new Date().toISOString().replace(/[-:.]/g, \"\").replace(\"Z\", \"Z\");\r\n const suffix = randomBytes(4).toString(\"hex\");\r\n return `run-${timestamp}-${suffix}`;\r\n}\r\n\r\nfunction writeJson(filePath: string, value: unknown): void {\r\n fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, \"utf-8\");\r\n}\r\n\r\nfunction readJson<T>(filePath: string): T | null {\r\n try {\r\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as T;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import type {\n ArtifactStore,\n ArtifactRunContext,\n ArtifactPhaseHandle,\n ArtifactRunMetadata,\n ArtifactStorePhase,\n} from \"../../domain/ports/artifact-store.js\";\nimport {\n beginRuntimePhase,\n completeRuntimePhase,\n createRuntimeArtifactsContext,\n displayArtifactsPath,\n findSavedRuntimeArtifact,\n finalizeRuntimeArtifacts,\n isFailedRuntimeArtifactStatus,\n latestSavedRuntimeArtifact,\n listFailedRuntimeArtifacts,\n listSavedRuntimeArtifacts,\n removeFailedRuntimeArtifacts,\n removeSavedRuntimeArtifacts,\n runtimeArtifactsRootDir,\n type BeginRuntimePhaseOptions,\n type CompleteRuntimePhaseOptions,\n type RuntimeArtifactsContext,\n type RuntimePhaseHandle,\n type RuntimePhase,\n} from \"../runtime-artifacts.js\";\n\nconst toRuntimePhase = (phase: ArtifactStorePhase): RuntimePhase => phase;\n\nexport function createFsArtifactStore(): ArtifactStore {\n return {\n createContext(options): ArtifactRunContext {\n return createRuntimeArtifactsContext(options);\n },\n beginPhase(context, options): ArtifactPhaseHandle {\n const runtimeOptions: BeginRuntimePhaseOptions = {\n ...options,\n phase: toRuntimePhase(options.phase),\n };\n return beginRuntimePhase(context as RuntimeArtifactsContext, runtimeOptions);\n },\n completePhase(handle, options): void {\n const runtimeOptions: CompleteRuntimePhaseOptions = options;\n completeRuntimePhase(handle as RuntimePhaseHandle, runtimeOptions);\n },\n finalize(context, options): void {\n finalizeRuntimeArtifacts(context as RuntimeArtifactsContext, {\n status: options.status,\n preserve: options.preserve,\n });\n },\n displayPath(context): string {\n return displayArtifactsPath(context as RuntimeArtifactsContext);\n },\n rootDir(cwd): string {\n return runtimeArtifactsRootDir(cwd);\n },\n listSaved(cwd): ArtifactRunMetadata[] {\n return listSavedRuntimeArtifacts(cwd);\n },\n listFailed(cwd): ArtifactRunMetadata[] {\n return listFailedRuntimeArtifacts(cwd);\n },\n latest(cwd): ArtifactRunMetadata | null {\n return latestSavedRuntimeArtifact(cwd);\n },\n find(runId, cwd): ArtifactRunMetadata | null {\n return findSavedRuntimeArtifact(runId, cwd);\n },\n removeSaved(cwd): number {\n return removeSavedRuntimeArtifacts(cwd);\n },\n removeFailed(cwd): number {\n return removeFailedRuntimeArtifacts(cwd);\n },\n isFailedStatus(status: string | undefined): boolean {\n return isFailedRuntimeArtifactStatus(status);\n },\n };\n}\n","import type { Clock } from \"../../domain/ports/clock.js\";\n\nexport function createSystemClock(): Clock {\n return {\n now() {\n return new Date();\n },\n nowIsoString() {\n return new Date().toISOString();\n },\n };\n}\n","/**\r\n * Source resolution.\r\n *\r\n * Resolves a user-provided source (file path, directory, or glob)\r\n * into a list of Markdown file paths ready for scanning.\r\n */\r\n\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport fg from \"fast-glob\";\r\n\r\n/**\r\n * Resolve a source string into a sorted list of Markdown file paths.\r\n *\r\n * Supports:\r\n * - single file path\r\n * - directory (scans recursively for *.md)\r\n * - glob pattern\r\n */\r\nexport async function resolveSources(source: string): Promise<string[]> {\r\n const resolved = path.resolve(source);\r\n\r\n // Single file\r\n if (isFile(resolved)) {\r\n return [resolved];\r\n }\r\n\r\n // Directory\r\n if (isDirectory(resolved)) {\r\n const pattern = path.join(resolved, \"**/*.md\").replace(/\\\\/g, \"/\");\r\n return await fg(pattern, { absolute: true, onlyFiles: true });\r\n }\r\n\r\n // Glob\r\n const files = await fg(source.replace(/\\\\/g, \"/\"), {\r\n absolute: true,\r\n onlyFiles: true,\r\n });\r\n\r\n // Filter to only .md files\r\n return files.filter((f) => f.endsWith(\".md\"));\r\n}\r\n\r\nfunction isFile(p: string): boolean {\r\n try {\r\n return fs.statSync(p).isFile();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction isDirectory(p: string): boolean {\r\n try {\r\n return fs.statSync(p).isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import type { SourceResolverPort } from \"../../domain/ports/source-resolver-port.js\";\nimport { resolveSources } from \"../sources.js\";\n\nexport function createSourceResolverAdapter(): SourceResolverPort {\n return {\n resolveSources(source) {\n return resolveSources(source);\n },\n };\n}\n","/**\r\n * Task selector.\r\n *\r\n * Given a list of sorted Markdown file paths, scans each file in order\r\n * and selects the first runnable unchecked task.\r\n *\r\n * A task is runnable only when it is unchecked and has no unchecked\r\n * descendants. This ensures child tasks are completed before their\r\n * parent becomes eligible for execution.\r\n */\r\n\r\nimport fs from \"node:fs\";\nimport { parseTasks, type Task } from \"../domain/parser.js\";\nimport { filterRunnable } from \"../domain/task-selection.js\";\nimport { sortFiles, type SortMode } from \"../domain/sorting.js\";\nimport { getFileBirthtimeMs } from \"./file-birthtime.js\";\n\nconst selectorFileSystem = {\n stat(filePath: string) {\n const stats = fs.statSync(filePath);\n return {\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n birthtimeMs: stats.birthtimeMs,\n mtimeMs: stats.mtimeMs,\n };\n },\n};\n\r\nexport interface SelectionResult {\r\n /** The selected task. */\r\n task: Task;\r\n /** Full source content of the file containing the task. */\r\n source: string;\r\n /** Content of the file up to (but not including) the task line. */\r\n contextBefore: string;\r\n}\r\n\r\n/**\r\n * Find the next runnable unchecked task across all given files.\r\n *\r\n * Files are sorted according to `sortMode` before scanning.\r\n * Inside each file, tasks are scanned in document order.\r\n *\r\n * A task is runnable when it is unchecked and has no unchecked\r\n * descendants (children at a greater depth that follow it in\r\n * document order before the next sibling or shallower task).\r\n */\r\nexport function selectNextTask(\n files: string[],\n sortMode: SortMode = \"name-sort\",\n): SelectionResult | null {\n const sorted = sortFiles(files, sortMode, {\n getBirthtimeMs: (filePath) => getFileBirthtimeMs(filePath, selectorFileSystem),\n });\n\r\n for (const file of sorted) {\r\n const source = fs.readFileSync(file, \"utf-8\");\r\n const tasks = parseTasks(source, file);\r\n const runnable = filterRunnable(tasks);\r\n\r\n for (const task of runnable) {\r\n const lines = source.split(\"\\n\");\r\n const contextBefore = lines.slice(0, task.line - 1).join(\"\\n\");\r\n\r\n return { task, source, contextBefore };\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Select a specific task by file path and 1-based line number.\r\n *\r\n * Returns the task at the given line along with contextBefore,\r\n * or null if no task exists at that line.\r\n */\r\nexport function selectTaskByLocation(\r\n file: string,\r\n line: number,\r\n): SelectionResult | null {\r\n const source = fs.readFileSync(file, \"utf-8\");\r\n const tasks = parseTasks(source, file);\r\n const task = tasks.find((t) => t.line === line);\r\n\r\n if (!task) {\r\n return null;\r\n }\r\n\r\n const lines = source.split(\"\\n\");\r\n const contextBefore = lines.slice(0, task.line - 1).join(\"\\n\");\r\n\n return { task, source, contextBefore };\n}\n","import type { FileSystem } from \"../domain/ports/file-system.js\";\n\nexport function getFileBirthtimeMs(\n filePath: string,\n fileSystem: Pick<FileSystem, \"stat\">,\n): number {\n try {\n return fileSystem.stat(filePath)?.birthtimeMs ?? 0;\n } catch {\n return 0;\n }\n}\n","import type { TaskSelectorPort } from \"../../domain/ports/task-selector-port.js\";\nimport { selectNextTask, selectTaskByLocation } from \"../selector.js\";\n\nexport function createTaskSelectorAdapter(): TaskSelectorPort {\n return {\n selectNextTask(files, sortMode) {\n return selectNextTask(files, sortMode);\n },\n selectTaskByLocation(filePath, line) {\n return selectTaskByLocation(filePath, line);\n },\n };\n}\n","/**\r\n * Inline CLI task executor.\r\n *\r\n * Handles tasks that begin with \"cli: \" by executing the command directly\r\n * in a shell, without going through an external worker.\r\n */\r\n\r\nimport { spawn } from \"node:child_process\";\r\nimport {\r\n beginRuntimePhase,\r\n completeRuntimePhase,\r\n createRuntimeArtifactsContext,\r\n finalizeRuntimeArtifacts,\r\n type RuntimeArtifactsContext,\r\n} from \"./runtime-artifacts.js\";\r\n\r\nexport interface InlineCliResult {\r\n exitCode: number | null;\r\n stdout: string;\r\n stderr: string;\r\n}\r\n\r\n/**\r\n * Execute an inline CLI command from a task.\r\n *\r\n * The command is run through the system shell.\r\n */\r\nexport async function executeInlineCli(\r\n command: string,\r\n cwd: string = process.cwd(),\r\n options?: {\r\n artifactContext?: RuntimeArtifactsContext;\r\n keepArtifacts?: boolean;\r\n artifactExtra?: Record<string, unknown>;\r\n },\r\n): Promise<InlineCliResult> {\r\n let ownedArtifactContext: RuntimeArtifactsContext | null = null;\r\n let artifactContext: RuntimeArtifactsContext;\r\n\r\n if (options?.artifactContext) {\r\n artifactContext = options.artifactContext;\r\n } else {\r\n ownedArtifactContext = createRuntimeArtifactsContext({\r\n cwd,\r\n commandName: \"inline-cli\",\r\n workerCommand: [command],\r\n mode: \"wait\",\r\n transport: \"inline-cli\",\r\n keepArtifacts: options?.keepArtifacts ?? false,\r\n });\r\n artifactContext = ownedArtifactContext;\r\n }\r\n\r\n const phase = beginRuntimePhase(artifactContext, {\r\n phase: \"inline-cli\",\r\n command: [command],\r\n mode: \"wait\",\r\n transport: \"inline-cli\",\r\n extra: options?.artifactExtra,\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n const child = spawn(command, {\r\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\r\n cwd,\r\n shell: true,\r\n });\r\n\r\n const stdout: Buffer[] = [];\r\n const stderr: Buffer[] = [];\r\n\r\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\r\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\r\n\r\n child.on(\"close\", (code) => {\r\n const result = {\r\n exitCode: code,\r\n stdout: Buffer.concat(stdout).toString(\"utf-8\"),\r\n stderr: Buffer.concat(stderr).toString(\"utf-8\"),\r\n };\r\n\r\n completeRuntimePhase(phase, {\r\n exitCode: code,\r\n stdout: result.stdout,\r\n stderr: result.stderr,\r\n outputCaptured: true,\r\n });\r\n\r\n if (ownedArtifactContext) {\r\n finalizeRuntimeArtifacts(ownedArtifactContext, {\r\n status: code === 0 ? \"completed\" : \"failed\",\r\n preserve: options?.keepArtifacts ?? false,\r\n });\r\n }\r\n\r\n resolve(result);\r\n });\r\n\r\n child.on(\"error\", (error) => {\r\n completeRuntimePhase(phase, {\r\n exitCode: null,\r\n outputCaptured: true,\r\n notes: error.message,\r\n extra: { error: true },\r\n });\r\n\r\n if (ownedArtifactContext) {\r\n finalizeRuntimeArtifacts(ownedArtifactContext, {\r\n status: \"failed\",\r\n preserve: options?.keepArtifacts ?? false,\r\n });\r\n }\r\n\r\n reject(error);\r\n });\r\n });\r\n}\r\n","/**\r\n * Runner - executes an external command with the rendered prompt.\r\n *\r\n * Supports three execution modes:\r\n * - wait: spawn the command and block until it exits\r\n * - tui: spawn the command with inherited stdio (interactive)\r\n * - detached: spawn the command and return immediately\r\n *\r\n * Supports two prompt transport mechanisms:\r\n * - file: write prompt to a .rundown runtime file and append the path as an argument\r\n * - arg: append the prompt text directly as a trailing argument\r\n */\r\n\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport spawn from \"cross-spawn\";\r\nimport type {\r\n ProcessRunMode as RunnerMode,\r\n PromptTransport,\r\n} from \"../domain/ports/index.js\";\r\nimport {\r\n beginRuntimePhase,\r\n completeRuntimePhase,\r\n createRuntimeArtifactsContext,\r\n finalizeRuntimeArtifacts,\r\n type RuntimeArtifactsContext,\r\n type RuntimePhase,\r\n} from \"./runtime-artifacts.js\";\r\n\r\nexport type { RunnerMode, PromptTransport };\r\n\r\nexport interface RunnerOptions {\r\n /** The command and its base arguments (everything after --). */\r\n command: string[];\r\n /** The rendered prompt to deliver to the command. */\r\n prompt: string;\r\n /** Execution mode. Default: \"wait\". */\r\n mode?: RunnerMode;\r\n /** How to pass the prompt. Default: \"file\". */\r\n transport?: PromptTransport;\r\n /** Working directory for the command. */\r\n cwd?: string;\r\n /** Optional shared runtime artifact context. */\r\n artifactContext?: RuntimeArtifactsContext;\r\n /** The phase name for persisted runtime artifacts. */\r\n artifactPhase?: RuntimePhase;\r\n /** Extra metadata to attach to the artifact phase. */\r\n artifactExtra?: Record<string, unknown>;\r\n /** Preserve artifacts after completion. */\r\n keepArtifacts?: boolean;\r\n}\r\n\r\nexport interface RunnerResult {\r\n /** Exit code of the process (null if detached or killed). */\r\n exitCode: number | null;\r\n /** Captured stdout (wait mode only). */\r\n stdout: string;\r\n /** Captured stderr (wait mode only). */\r\n stderr: string;\r\n}\r\n\r\n/**\r\n * Run the worker command with the rendered prompt.\r\n */\r\nexport async function runWorker(options: RunnerOptions): Promise<RunnerResult> {\r\n const mode = options.mode ?? \"wait\";\r\n const transport = options.transport ?? \"file\";\r\n const cwd = options.cwd ?? process.cwd();\r\n let ownedArtifactContext: RuntimeArtifactsContext | null = null;\r\n let artifactContext: RuntimeArtifactsContext;\r\n\r\n if (options.artifactContext) {\r\n artifactContext = options.artifactContext;\r\n } else {\r\n ownedArtifactContext = createRuntimeArtifactsContext({\r\n cwd,\r\n commandName: \"worker\",\r\n workerCommand: options.command,\r\n mode,\r\n transport,\r\n keepArtifacts: options.keepArtifacts ?? false,\r\n });\r\n artifactContext = ownedArtifactContext;\r\n }\r\n\r\n const phase = beginRuntimePhase(artifactContext, {\r\n phase: options.artifactPhase ?? \"worker\",\r\n prompt: options.prompt,\r\n command: options.command,\r\n mode,\r\n transport,\r\n notes: buildCaptureNotes(mode),\r\n extra: options.artifactExtra,\r\n });\r\n\r\n const transportPromptFile = transport === \"file\" ? phase.promptFile : null;\r\n const args = buildWorkerArgs(options.command, options.prompt, transport, transportPromptFile, cwd);\r\n\r\n const [cmd, ...cmdArgs] = args;\r\n\r\n if (!cmd) {\r\n throw new Error(\"No command specified after --\");\r\n }\r\n\r\n try {\r\n const result = await executeCommand(cmd, cmdArgs, mode, cwd);\r\n completeRuntimePhase(phase, {\r\n exitCode: result.exitCode,\r\n stdout: result.stdout,\r\n stderr: result.stderr,\r\n outputCaptured: mode === \"wait\",\r\n });\r\n return result;\r\n } catch (error) {\r\n completeRuntimePhase(phase, {\r\n exitCode: null,\r\n outputCaptured: mode === \"wait\",\r\n notes: error instanceof Error ? error.message : String(error),\r\n extra: { error: true },\r\n });\r\n throw error;\r\n } finally {\r\n if (ownedArtifactContext) {\r\n finalizeRuntimeArtifacts(ownedArtifactContext, {\r\n status: mode === \"detached\" ? \"detached\" : \"completed\",\r\n preserve: (options.keepArtifacts ?? false) || mode === \"detached\",\r\n });\r\n }\r\n }\r\n}\r\n\r\nfunction buildWorkerArgs(\r\n command: string[],\r\n prompt: string,\r\n transport: PromptTransport,\r\n promptFile: string | null,\r\n cwd: string,\r\n): string[] {\r\n if (command.length === 0) {\r\n return [];\r\n }\r\n\r\n if (isOpenCodeCommand(command[0])) {\r\n return buildOpenCodeArgs(command, prompt, promptFile, cwd);\r\n }\r\n\r\n const args = [...command];\r\n if (transport === \"file\") {\r\n if (!promptFile) {\r\n throw new Error(\"Prompt file transport requested but no prompt file was created.\");\r\n }\r\n args.push(promptFile);\r\n } else {\r\n args.push(prompt);\r\n }\r\n\r\n return args;\r\n}\r\n\r\nfunction isOpenCodeCommand(command: string): boolean {\r\n const normalized = path.basename(command).toLowerCase();\r\n return normalized === \"opencode\"\r\n || normalized === \"opencode.cmd\"\r\n || normalized === \"opencode.exe\"\r\n || normalized === \"opencode.ps1\";\r\n}\r\n\r\nfunction buildOpenCodeArgs(\r\n command: string[],\r\n prompt: string,\r\n promptFile: string | null,\r\n cwd: string,\r\n): string[] {\r\n const [cmd, ...rest] = command;\r\n\r\n if (rest[0] === \"run\") {\r\n const args = [cmd, ...rest];\r\n\r\n if (promptFile) {\r\n args.push(buildOpenCodeRunBootstrapPrompt());\r\n args.push(\"--file\", promptFile);\r\n return args;\r\n }\r\n\r\n args.push(prompt);\r\n return args;\r\n }\r\n\r\n if (promptFile) {\r\n return [cmd, ...rest, buildOpenCodeTuiPromptArg(buildOpenCodeTuiBootstrapPrompt(promptFile, cwd))];\r\n }\r\n\r\n return [cmd, ...rest, buildOpenCodeTuiPromptArg(prompt)];\r\n}\r\n\r\nfunction buildOpenCodeRunBootstrapPrompt(): string {\r\n return \"Read the attached Markdown file first. It contains the full task instructions and context for this run.\";\r\n}\r\n\r\nfunction buildOpenCodeTuiBootstrapPrompt(tempFile: string, cwd: string): string {\r\n const displayPath = path.relative(cwd, tempFile) || path.basename(tempFile);\r\n const normalizedPath = displayPath.split(path.sep).join(\"/\");\r\n\r\n return `The full rendered rundown task prompt is staged in ${normalizedPath}. Open and read that file completely before taking any action, then continue the work in this session.`;\r\n}\r\n\r\nfunction buildOpenCodeTuiPromptArg(prompt: string): string {\r\n return `--prompt=${prompt}`;\r\n}\r\n\r\nfunction executeCommand(\r\n cmd: string,\r\n args: string[],\r\n mode: RunnerMode,\r\n cwd: string,\r\n): Promise<RunnerResult> {\r\n return new Promise((resolve, reject) => {\r\n if (mode === \"tui\") {\r\n // On Windows, launch TUI in a new terminal window to avoid\r\n // input-buffer issues with the parent console.\r\n if (os.platform() === \"win32\") {\r\n const child = spawn(\r\n \"cmd\",\r\n [\"/c\", \"start\", \"/wait\", '\"\"', cmd, ...args],\r\n { stdio: \"ignore\", cwd, shell: false },\r\n );\r\n child.on(\"close\", (code: number | null) => {\r\n resolve({ exitCode: code, stdout: \"\", stderr: \"\" });\r\n });\r\n child.on(\"error\", reject);\r\n return;\r\n }\r\n\r\n // Non-Windows: inherit all stdio (interactive in same terminal)\r\n const child = spawn(cmd, args, {\r\n stdio: \"inherit\",\r\n cwd,\r\n shell: false,\r\n });\r\n\r\n child.on(\"close\", (code: number | null) => {\r\n resolve({ exitCode: code, stdout: \"\", stderr: \"\" });\r\n });\r\n child.on(\"error\", reject);\r\n return;\r\n }\r\n\r\n if (mode === \"detached\") {\r\n const child = spawn(cmd, args, {\r\n stdio: \"ignore\",\r\n cwd,\r\n shell: false,\r\n detached: true,\r\n });\r\n child.unref();\r\n resolve({ exitCode: null, stdout: \"\", stderr: \"\" });\r\n return;\r\n }\r\n\r\n // wait mode: capture output\r\n const child = spawn(cmd, args, {\r\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\r\n cwd,\r\n shell: false,\r\n });\r\n\r\n const stdout: Buffer[] = [];\r\n const stderr: Buffer[] = [];\r\n\r\n child.stdout?.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\r\n child.stderr?.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\r\n\r\n child.on(\"close\", (code: number | null) => {\r\n resolve({\r\n exitCode: code,\r\n stdout: Buffer.concat(stdout).toString(\"utf-8\"),\r\n stderr: Buffer.concat(stderr).toString(\"utf-8\"),\r\n });\r\n });\r\n\r\n child.on(\"error\", reject);\r\n });\r\n}\r\n\r\nfunction buildCaptureNotes(mode: RunnerMode): string | undefined {\r\n if (mode === \"wait\") {\r\n return undefined;\r\n }\r\n\r\n if (mode === \"tui\") {\r\n return \"Interactive TUI mode does not capture worker stdout/stderr transcripts.\";\r\n }\r\n\r\n return \"Detached mode does not capture worker stdout/stderr and leaves runtime artifacts in place.\";\r\n}\r\n","import type {\n WorkerExecutionOptions,\n WorkerExecutorPort,\n WorkerRunResult,\n} from \"../../domain/ports/worker-executor-port.js\";\nimport type { RuntimeArtifactsContext } from \"../runtime-artifacts.js\";\nimport { executeInlineCli } from \"../inline-cli.js\";\nimport { runWorker } from \"../runner.js\";\n\nexport function createWorkerExecutorAdapter(): WorkerExecutorPort {\n return {\n async runWorker(options: WorkerExecutionOptions): Promise<WorkerRunResult> {\n return runWorker({\n command: options.command,\n prompt: options.prompt,\n mode: options.mode,\n transport: options.transport,\n cwd: options.cwd,\n artifactContext: options.artifactContext as RuntimeArtifactsContext | undefined,\n artifactPhase: options.artifactPhase,\n artifactExtra: options.artifactExtra,\n });\n },\n async executeInlineCli(\n command,\n cwd,\n options,\n ): Promise<WorkerRunResult> {\n return executeInlineCli(command, cwd, {\n artifactContext: options?.artifactContext as RuntimeArtifactsContext | undefined,\n keepArtifacts: options?.keepArtifacts,\n artifactExtra: options?.artifactExtra,\n });\n },\n };\n}\n","/**\r\n * Validation system.\r\n *\r\n * Manages task-specific validation sidecar files and evaluates results.\r\n */\r\n\r\nimport fs from \"node:fs\";\r\nimport type { Task } from \"../domain/parser.js\";\r\nimport { renderTemplate, type TemplateVars } from \"../domain/template.js\";\r\nimport type { ExtraTemplateVars } from \"../domain/template-vars.js\";\r\nimport { runWorker, type RunnerMode, type PromptTransport } from \"./runner.js\";\r\nimport type { RuntimeArtifactsContext } from \"./runtime-artifacts.js\";\r\n\r\n/**\r\n * Build the validation sidecar file path for a given task.\r\n *\r\n * Format: <source-file>.<task-index>.validation\r\n * Example: Tasks.md.3.validation\r\n */\r\nexport function validationFilePath(task: Task): string {\r\n return `${task.file}.${task.index}.validation`;\r\n}\r\n\r\n/**\r\n * Read the validation sidecar file content.\r\n * Returns null if the file does not exist.\r\n */\r\nexport function readValidationFile(task: Task): string | null {\r\n const p = validationFilePath(task);\r\n try {\r\n return fs.readFileSync(p, \"utf-8\").trim();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Remove the validation sidecar file.\r\n */\r\nexport function removeValidationFile(task: Task): void {\r\n const p = validationFilePath(task);\r\n try {\r\n fs.unlinkSync(p);\r\n } catch {\r\n // Ignore if already gone\r\n }\r\n}\r\n\r\n/**\r\n * Check whether the validation file indicates success.\r\n */\r\nexport function isValidationOk(task: Task): boolean {\r\n const content = readValidationFile(task);\r\n return content !== null && content.toUpperCase() === \"OK\";\r\n}\r\n\r\nexport interface ValidateOptions {\r\n task: Task;\r\n source: string;\r\n contextBefore: string;\r\n template: string;\r\n command: string[];\r\n mode?: RunnerMode;\r\n transport?: PromptTransport;\r\n cwd?: string;\r\n templateVars?: ExtraTemplateVars;\r\n artifactContext?: RuntimeArtifactsContext;\r\n}\r\n\r\n/**\r\n * Run the validation step:\r\n * render the validate template, execute the validator command,\r\n * then check the sidecar file.\r\n */\r\nexport async function validate(options: ValidateOptions): Promise<boolean> {\r\n const vars: TemplateVars = {\r\n ...options.templateVars,\r\n task: options.task.text,\r\n file: options.task.file,\r\n context: options.contextBefore,\r\n taskIndex: options.task.index,\r\n taskLine: options.task.line,\r\n source: options.source,\r\n };\r\n\r\n const prompt = renderTemplate(options.template, vars);\r\n\r\n removeValidationFile(options.task);\r\n\r\n const runResult = await runWorker({\r\n command: options.command,\r\n prompt,\r\n mode: options.mode ?? \"wait\",\r\n transport: options.transport ?? \"file\",\r\n cwd: options.cwd,\r\n artifactContext: options.artifactContext,\r\n artifactPhase: \"verify\",\r\n });\r\n\r\n if (runResult.exitCode !== 0) {\r\n return false;\r\n }\r\n\r\n return isValidationOk(options.task);\r\n}\r\n","import type {\n TaskValidationOptions,\n TaskValidationPort,\n} from \"../../domain/ports/task-validation-port.js\";\nimport type { ExtraTemplateVars } from \"../../domain/template-vars.js\";\nimport type { RuntimeArtifactsContext } from \"../runtime-artifacts.js\";\nimport { validate } from \"../validation.js\";\n\nexport function createTaskValidationAdapter(): TaskValidationPort {\n return {\n validate(options: TaskValidationOptions) {\n return validate({\n ...options,\n templateVars: options.templateVars as ExtraTemplateVars | undefined,\n artifactContext: options.artifactContext as RuntimeArtifactsContext | undefined,\n });\n },\n };\n}\n","/**\r\n * Auto-correction loop.\r\n *\r\n * Runs the corrector, then re-validates. Repeats up to a maximum number of attempts.\r\n */\r\n\r\nimport type { Task } from \"../domain/parser.js\";\r\nimport { renderTemplate, type TemplateVars } from \"../domain/template.js\";\r\nimport type { ExtraTemplateVars } from \"../domain/template-vars.js\";\r\nimport { runWorker, type RunnerMode, type PromptTransport } from \"./runner.js\";\r\nimport { validate, readValidationFile } from \"./validation.js\";\r\nimport type { RuntimeArtifactsContext } from \"./runtime-artifacts.js\";\r\n\r\nexport interface CorrectionOptions {\r\n task: Task;\r\n source: string;\r\n contextBefore: string;\r\n correctTemplate: string;\r\n validateTemplate: string;\r\n command: string[];\r\n maxRetries: number;\r\n mode?: RunnerMode;\r\n transport?: PromptTransport;\r\n cwd?: string;\r\n templateVars?: ExtraTemplateVars;\r\n artifactContext?: RuntimeArtifactsContext;\r\n}\r\n\r\nexport interface CorrectionResult {\r\n /** Whether validation eventually passed. */\r\n valid: boolean;\r\n /** How many correction attempts were made. */\r\n attempts: number;\r\n}\r\n\r\n/**\r\n * Run the correction loop.\r\n *\r\n * For each attempt:\r\n * 1. Render the correction template (including previous validation result).\r\n * 2. Run the corrector command.\r\n * 3. Re-validate.\r\n * 4. If valid, stop. Otherwise, retry up to maxRetries.\r\n */\r\nexport async function correct(options: CorrectionOptions): Promise<CorrectionResult> {\r\n let attempts = 0;\r\n\r\n for (let i = 0; i < options.maxRetries; i++) {\r\n attempts++;\r\n\r\n // Read current validation failure reason\r\n const validationResult = readValidationFile(options.task) ?? \"Validation failed (no details).\";\r\n\r\n const vars: TemplateVars = {\r\n ...options.templateVars,\r\n task: options.task.text,\r\n file: options.task.file,\r\n context: options.contextBefore,\r\n taskIndex: options.task.index,\r\n taskLine: options.task.line,\r\n source: options.source,\r\n validationResult,\r\n };\r\n\r\n const prompt = renderTemplate(options.correctTemplate, vars);\r\n\r\n // Run corrector\r\n await runWorker({\r\n command: options.command,\r\n prompt,\r\n mode: options.mode ?? \"wait\",\r\n transport: options.transport ?? \"file\",\r\n cwd: options.cwd,\r\n artifactContext: options.artifactContext,\r\n artifactPhase: \"repair\",\r\n artifactExtra: { attempt: attempts },\r\n });\r\n\r\n // Re-validate\r\n const valid = await validate({\r\n task: options.task,\r\n source: options.source,\r\n contextBefore: options.contextBefore,\r\n template: options.validateTemplate,\r\n command: options.command,\r\n mode: options.mode,\r\n transport: options.transport,\r\n cwd: options.cwd,\r\n templateVars: options.templateVars,\r\n artifactContext: options.artifactContext,\r\n });\r\n\r\n if (valid) {\r\n return { valid: true, attempts };\r\n }\r\n }\r\n\r\n return { valid: false, attempts };\r\n}\r\n","import type {\n TaskCorrectionOptions,\n TaskCorrectionPort,\n TaskCorrectionResult,\n} from \"../../domain/ports/task-correction-port.js\";\nimport type { ExtraTemplateVars } from \"../../domain/template-vars.js\";\nimport type { RuntimeArtifactsContext } from \"../runtime-artifacts.js\";\nimport { correct } from \"../correction.js\";\n\nexport function createTaskCorrectionAdapter(): TaskCorrectionPort {\n return {\n correct(options: TaskCorrectionOptions): Promise<TaskCorrectionResult> {\n return correct({\n ...options,\n templateVars: options.templateVars as ExtraTemplateVars | undefined,\n artifactContext: options.artifactContext as RuntimeArtifactsContext | undefined,\n });\n },\n };\n}\n","import type { WorkingDirectoryPort } from \"../../domain/ports/working-directory-port.js\";\n\nexport function createWorkingDirectoryAdapter(): WorkingDirectoryPort {\n return {\n cwd() {\n return process.cwd();\n },\n };\n}\n","import { spawn } from \"node:child_process\";\r\n\r\nexport function openDirectory(dirPath: string): void {\r\n if (process.platform === \"win32\") {\r\n const child = spawn(\"explorer\", [dirPath], {\r\n detached: true,\r\n stdio: \"ignore\",\r\n shell: false,\r\n });\r\n child.unref();\r\n return;\r\n }\r\n\r\n if (process.platform === \"darwin\") {\r\n const child = spawn(\"open\", [dirPath], {\r\n detached: true,\r\n stdio: \"ignore\",\r\n shell: false,\r\n });\r\n child.unref();\r\n return;\r\n }\r\n\r\n const child = spawn(\"xdg-open\", [dirPath], {\r\n detached: true,\r\n stdio: \"ignore\",\r\n shell: false,\r\n });\r\n child.unref();\r\n}\r\n","import type { DirectoryOpenerPort } from \"../../domain/ports/directory-opener-port.js\";\nimport { openDirectory } from \"../open-directory.js\";\n\nexport function createDirectoryOpenerAdapter(): DirectoryOpenerPort {\n return {\n openDirectory,\n };\n}\n","import { createRunTask, type RunTaskOptions } from \"./application/run-task.js\";\nimport { createPlanTask, type PlanTaskOptions } from \"./application/plan-task.js\";\nimport { createListTasks, type ListTasksOptions } from \"./application/list-tasks.js\";\nimport { createNextTask, type NextTaskOptions } from \"./application/next-task.js\";\nimport { createInitProject } from \"./application/init-project.js\";\nimport {\n createManageArtifacts,\n type ManageArtifactsOptions,\n} from \"./application/manage-artifacts.js\";\nimport type { ApplicationOutputPort } from \"./domain/ports/output-port.js\";\nimport type {\n ArtifactStore,\n Clock,\n DirectoryOpenerPort,\n FileSystem,\n GitClient,\n ProcessRunner,\n SourceResolverPort,\n TaskCorrectionPort,\n TaskSelectorPort,\n TaskValidationPort,\n TemplateLoader,\n ValidationSidecar,\n WorkerExecutorPort,\n WorkingDirectoryPort,\n} from \"./domain/ports/index.js\";\nimport {\n createCrossSpawnProcessRunner,\n createDirectoryOpenerAdapter,\n createExecFileGitClient,\n createFsArtifactStore,\n createFsTemplateLoader,\n createFsValidationSidecar,\n createNodeFileSystem,\n createSourceResolverAdapter,\n createSystemClock,\n createTaskCorrectionAdapter,\n createTaskSelectorAdapter,\n createTaskValidationAdapter,\n createWorkerExecutorAdapter,\n createWorkingDirectoryAdapter,\n} from \"./infrastructure/adapters/index.js\";\n\r\nexport type App = {\n runTask: (options: RunTaskOptions) => Promise<number>;\n planTask: (options: PlanTaskOptions) => Promise<number>;\n listTasks: (options: ListTasksOptions) => Promise<number>;\n nextTask: (options: NextTaskOptions) => Promise<number>;\n initProject: () => Promise<number>;\n manageArtifacts: (options: ManageArtifactsOptions) => number;\n};\n\nexport type AppUseCaseFactories = {\n [Key in keyof App]: (ports: AppPorts) => App[Key];\n};\n\nexport interface AppPorts {\n fileSystem: FileSystem;\n processRunner: ProcessRunner;\n gitClient: GitClient;\n templateLoader: TemplateLoader;\n validationSidecar: ValidationSidecar;\n artifactStore: ArtifactStore;\n clock: Clock;\n directoryOpener: DirectoryOpenerPort;\n sourceResolver: SourceResolverPort;\n taskSelector: TaskSelectorPort;\n workerExecutor: WorkerExecutorPort;\n taskValidation: TaskValidationPort;\n taskCorrection: TaskCorrectionPort;\n workingDirectory: WorkingDirectoryPort;\n output: ApplicationOutputPort;\n}\n\nexport interface CreateAppDependencies {\n ports?: Partial<AppPorts>;\n useCaseFactories?: Partial<AppUseCaseFactories>;\n}\n\nfunction createAppPorts(overrides: Partial<AppPorts> = {}): AppPorts {\n return {\n fileSystem: overrides.fileSystem ?? createNodeFileSystem(),\n processRunner: overrides.processRunner ?? createCrossSpawnProcessRunner(),\n gitClient: overrides.gitClient ?? createExecFileGitClient(),\n templateLoader: overrides.templateLoader ?? createFsTemplateLoader(),\n validationSidecar: overrides.validationSidecar ?? createFsValidationSidecar(),\n artifactStore: overrides.artifactStore ?? createFsArtifactStore(),\n clock: overrides.clock ?? createSystemClock(),\n directoryOpener: overrides.directoryOpener ?? createDirectoryOpenerAdapter(),\n sourceResolver: overrides.sourceResolver ?? createSourceResolverAdapter(),\n taskSelector: overrides.taskSelector ?? createTaskSelectorAdapter(),\n workerExecutor: overrides.workerExecutor ?? createWorkerExecutorAdapter(),\n taskValidation: overrides.taskValidation ?? createTaskValidationAdapter(),\n taskCorrection: overrides.taskCorrection ?? createTaskCorrectionAdapter(),\n workingDirectory: overrides.workingDirectory ?? createWorkingDirectoryAdapter(),\n output: overrides.output ?? createNoopOutputPort(),\n };\n}\n\nfunction createNoopOutputPort(): ApplicationOutputPort {\n return {\n emit() {},\n };\n}\n\nfunction createDefaultUseCaseFactories(): AppUseCaseFactories {\n return {\n runTask: (ports) => createRunTask({\n sourceResolver: ports.sourceResolver,\n taskSelector: ports.taskSelector,\n workerExecutor: ports.workerExecutor,\n taskValidation: ports.taskValidation,\n taskCorrection: ports.taskCorrection,\n workingDirectory: ports.workingDirectory,\n fileSystem: ports.fileSystem,\n templateLoader: ports.templateLoader,\n validationSidecar: ports.validationSidecar,\n artifactStore: ports.artifactStore,\n gitClient: ports.gitClient,\n processRunner: ports.processRunner,\n output: ports.output,\n }),\n planTask: (ports) => createPlanTask({\n sourceResolver: ports.sourceResolver,\n taskSelector: ports.taskSelector,\n workerExecutor: ports.workerExecutor,\n workingDirectory: ports.workingDirectory,\n fileSystem: ports.fileSystem,\n templateLoader: ports.templateLoader,\n artifactStore: ports.artifactStore,\n output: ports.output,\n }),\n listTasks: (ports) => createListTasks({\n fileSystem: ports.fileSystem,\n sourceResolver: ports.sourceResolver,\n output: ports.output,\n }),\n nextTask: (ports) => createNextTask({\n sourceResolver: ports.sourceResolver,\n taskSelector: ports.taskSelector,\n output: ports.output,\n }),\n initProject: (ports) => createInitProject({\n fileSystem: ports.fileSystem,\n output: ports.output,\n }),\n manageArtifacts: (ports) => createManageArtifacts({\n artifactStore: ports.artifactStore,\n directoryOpener: ports.directoryOpener,\n workingDirectory: ports.workingDirectory,\n output: ports.output,\n }),\n };\n}\n\nfunction createAppFromFactories(\n ports: AppPorts,\n factoryOverrides: Partial<AppUseCaseFactories> = {},\n): App {\n const factories: AppUseCaseFactories = {\n ...createDefaultUseCaseFactories(),\n ...factoryOverrides,\n };\n\n return {\n runTask: factories.runTask(ports),\n planTask: factories.planTask(ports),\n listTasks: factories.listTasks(ports),\n nextTask: factories.nextTask(ports),\n initProject: factories.initProject(ports),\n manageArtifacts: factories.manageArtifacts(ports),\n };\n}\n\nexport function createApp(\n dependencies: CreateAppDependencies = {},\n): App {\n const portOverrides = dependencies.ports ?? {};\n const useCaseFactoryOverrides = dependencies.useCaseFactories ?? {};\n const ports = createAppPorts(portOverrides);\n\n return createAppFromFactories(ports, useCaseFactoryOverrides);\n}\n"],"mappings":"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","names":["TEMPLATE_VAR_KEY","path","loadTemplateVarsFileFromPorts","formatTaskLabel","selected","TEMPLATE_VAR_KEY","loadTemplateVarsFileFromPorts","path","path","child","fs","fs","fs","path","fs","path","fs","fs","spawn","spawn","path","spawn","path","child","spawn","fs","validationFilePath","fs","spawn","child"]}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@p10i/rundown",
3
+ "version": "1.0.0-rc.12",
4
+ "description": "A Markdown-native task runtime for agentic workflows. Execute, validate, and correct work directly from Markdown TODOs.",
5
+ "type": "module",
6
+ "bin": {
7
+ "rundown": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "dev": "tsup --watch",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "lint": "tsc --noEmit",
28
+ "release:check": "npm run lint && npm run test && npm run build",
29
+ "prepublishOnly": "npm run release:check"
30
+ },
31
+ "keywords": [
32
+ "markdown",
33
+ "todo",
34
+ "task-runner",
35
+ "agentic",
36
+ "cli",
37
+ "automation",
38
+ "opencode",
39
+ "ai-agent",
40
+ "workflow"
41
+ ],
42
+ "author": "Piontkovskii Andrei",
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/piontkovsk11andre1/rundown.git"
47
+ },
48
+ "homepage": "https://github.com/piontkovsk11andre1/rundown#readme",
49
+ "bugs": {
50
+ "url": "https://github.com/piontkovsk11andre1/rundown/issues"
51
+ },
52
+ "engines": {
53
+ "node": ">=18"
54
+ },
55
+ "dependencies": {
56
+ "commander": "^13.1.0",
57
+ "cross-spawn": "^7.0.6",
58
+ "fast-glob": "^3.3.3",
59
+ "mdast-util-from-markdown": "^2.0.2",
60
+ "mdast-util-gfm-task-list-item": "^2.0.0",
61
+ "micromark-extension-gfm-task-list-item": "^2.1.0",
62
+ "picocolors": "^1.1.1"
63
+ },
64
+ "devDependencies": {
65
+ "@types/cross-spawn": "^6.0.6",
66
+ "@types/node": "^22.0.0",
67
+ "tsup": "^8.4.0",
68
+ "typescript": "^5.7.0",
69
+ "vitest": "^3.1.0"
70
+ }
71
+ }