claude-ralph 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/index.ts","../src/core/config.ts","../src/core/prd.ts","../src/core/progress.ts","../src/utils/shell.ts","../src/core/claude.ts","../src/core/git.ts","../src/utils/logger.ts","../src/commands/init.ts","../src/templates/embedded/prompt.ts","../src/templates/embedded/skills-ralph.ts","../src/commands/plan.ts","../src/commands/prd.ts","../src/commands/run.ts","../src/commands/status.ts"],"names":["path","fs","execa","chalk","descMatch"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n// Repository configuration schema\nexport const RepositoryConfigSchema = z.object({\n path: z.string(),\n defaultBranch: z.string().default(\"main\"),\n checks: z.array(z.string()).default([]),\n});\n\nexport type RepositoryConfig = z.infer<typeof RepositoryConfigSchema>;\n\n// Agent configuration schema\nexport const AgentConfigSchema = z.object({\n maxIterations: z.number().default(50),\n timeout: z.number().default(600),\n});\n\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\n// Ralph configuration schema\nexport const RalphConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string().optional(),\n project: z.string(),\n description: z.string().optional(),\n repositories: z.record(z.string(), RepositoryConfigSchema),\n agent: AgentConfigSchema.optional().default({}),\n});\n\nexport type RalphConfig = z.infer<typeof RalphConfigSchema>;\n\n// PRD Repository branch info\nexport const PrdRepositorySchema = z.object({\n branchName: z.string(),\n activeBranch: z.string().optional(),\n});\n\nexport type PrdRepository = z.infer<typeof PrdRepositorySchema>;\n\n// User Story schema\nexport const UserStorySchema = z.object({\n id: z.string(),\n title: z.string(),\n repo: z.string(),\n description: z.string(),\n acceptanceCriteria: z.array(z.string()),\n priority: z.number(),\n passes: z.boolean().default(false),\n fork: z.boolean().default(false),\n notes: z.string().default(\"\"),\n});\n\nexport type UserStory = z.infer<typeof UserStorySchema>;\n\n// PRD schema\nexport const PrdSchema = z.object({\n project: z.string(),\n description: z.string().optional(),\n repositories: z.record(z.string(), PrdRepositorySchema),\n userStories: z.array(UserStorySchema),\n});\n\nexport type Prd = z.infer<typeof PrdSchema>;\n\n// Command options\nexport interface InitOptions {\n force?: boolean;\n}\n\nexport interface PlanOptions {\n output?: string;\n}\n\nexport interface PrdOptions {\n input?: string;\n output?: string;\n}\n\nexport interface RunOptions {\n maxIterations?: number;\n}\n\nexport interface StatusOptions {\n verbose?: boolean;\n}\n","import { cosmiconfig } from \"cosmiconfig\";\nimport { RalphConfigSchema, type RalphConfig } from \"../types/index.js\";\n\nconst MODULE_NAME = \"ralph\";\n\nconst explorer = cosmiconfig(MODULE_NAME, {\n searchPlaces: [\n \"ralph.config.json\",\n \".ralphrc\",\n \".ralphrc.json\",\n \".ralphrc.yaml\",\n \".ralphrc.yml\",\n \"package.json\",\n ],\n});\n\nexport class ConfigNotFoundError extends Error {\n constructor(searchPath: string) {\n super(\n `No Ralph configuration found. Run 'ralph init' to create one, or create ralph.config.json manually.\\nSearched from: ${searchPath}`\n );\n this.name = \"ConfigNotFoundError\";\n }\n}\n\nexport class ConfigValidationError extends Error {\n constructor(message: string) {\n super(`Invalid configuration: ${message}`);\n this.name = \"ConfigValidationError\";\n }\n}\n\nexport async function loadConfig(cwd: string = process.cwd()): Promise<RalphConfig> {\n const result = await explorer.search(cwd);\n\n if (!result || !result.config) {\n throw new ConfigNotFoundError(cwd);\n }\n\n const parsed = RalphConfigSchema.safeParse(result.config);\n\n if (!parsed.success) {\n throw new ConfigValidationError(parsed.error.message);\n }\n\n return parsed.data;\n}\n\nexport async function configExists(cwd: string = process.cwd()): Promise<boolean> {\n const result = await explorer.search(cwd);\n return result !== null && result.config !== undefined;\n}\n\nexport function getDefaultConfig(projectName: string): RalphConfig {\n return {\n version: \"1.0\",\n project: projectName,\n description: \"Project description\",\n repositories: {\n main: {\n path: \".\",\n defaultBranch: \"main\",\n checks: [\"npm run build\", \"npm run lint\", \"npm test\"],\n },\n },\n agent: {\n maxIterations: 50,\n timeout: 600,\n },\n };\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { PrdSchema, type Prd, type UserStory } from \"../types/index.js\";\n\nexport class PrdNotFoundError extends Error {\n constructor(filePath: string) {\n super(\n `PRD file not found: ${filePath}\\nRun 'ralph plan <feature>' and 'ralph prd' to generate one.`\n );\n this.name = \"PrdNotFoundError\";\n }\n}\n\nexport class PrdValidationError extends Error {\n constructor(message: string) {\n super(`Invalid PRD: ${message}`);\n this.name = \"PrdValidationError\";\n }\n}\n\nexport async function loadPrd(cwd: string = process.cwd()): Promise<Prd> {\n const prdPath = path.join(cwd, \"prd.json\");\n\n if (!(await fs.pathExists(prdPath))) {\n throw new PrdNotFoundError(prdPath);\n }\n\n const content = await fs.readJSON(prdPath);\n const parsed = PrdSchema.safeParse(content);\n\n if (!parsed.success) {\n throw new PrdValidationError(parsed.error.message);\n }\n\n return parsed.data;\n}\n\nexport async function savePrd(prd: Prd, cwd: string = process.cwd()): Promise<void> {\n const prdPath = path.join(cwd, \"prd.json\");\n await fs.writeJSON(prdPath, prd, { spaces: 2 });\n}\n\nexport async function prdExists(cwd: string = process.cwd()): Promise<boolean> {\n const prdPath = path.join(cwd, \"prd.json\");\n return fs.pathExists(prdPath);\n}\n\nexport function getPendingStories(prd: Prd): UserStory[] {\n return prd.userStories\n .filter((story) => !story.passes)\n .sort((a, b) => a.priority - b.priority);\n}\n\nexport function getCompletedStories(prd: Prd): UserStory[] {\n return prd.userStories.filter((story) => story.passes);\n}\n\nexport function getNextStory(prd: Prd): UserStory | undefined {\n const pending = getPendingStories(prd);\n return pending[0];\n}\n\nexport function isAllComplete(prd: Prd): boolean {\n return prd.userStories.every((story) => story.passes);\n}\n\nexport function getStoriesByRepo(prd: Prd): Record<string, UserStory[]> {\n const byRepo: Record<string, UserStory[]> = {};\n\n for (const story of prd.userStories) {\n if (!byRepo[story.repo]) {\n byRepo[story.repo] = [];\n }\n byRepo[story.repo].push(story);\n }\n\n return byRepo;\n}\n\nexport function getCompletionStats(prd: Prd): {\n total: number;\n completed: number;\n pending: number;\n percentage: number;\n} {\n const total = prd.userStories.length;\n const completed = prd.userStories.filter((s) => s.passes).length;\n const pending = total - completed;\n const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;\n\n return { total, completed, pending, percentage };\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\n\nconst PROGRESS_FILE = \"progress.txt\";\n\nexport async function initProgressFile(\n projectName: string,\n cwd: string = process.cwd()\n): Promise<void> {\n const progressPath = path.join(cwd, PROGRESS_FILE);\n\n if (await fs.pathExists(progressPath)) {\n return;\n }\n\n const content = `# Ralph Progress Log\n\nProject: ${projectName}\nStarted: ${new Date().toISOString()}\n\n## Codebase Patterns\n\n(Add discovered patterns here as you work)\n\n---\n\n`;\n\n await fs.writeFile(progressPath, content);\n}\n\nexport async function progressExists(cwd: string = process.cwd()): Promise<boolean> {\n const progressPath = path.join(cwd, PROGRESS_FILE);\n return fs.pathExists(progressPath);\n}\n\nexport async function appendProgress(\n entry: string,\n cwd: string = process.cwd()\n): Promise<void> {\n const progressPath = path.join(cwd, PROGRESS_FILE);\n await fs.appendFile(progressPath, entry + \"\\n\");\n}\n\nexport async function readProgress(cwd: string = process.cwd()): Promise<string> {\n const progressPath = path.join(cwd, PROGRESS_FILE);\n\n if (!(await fs.pathExists(progressPath))) {\n return \"\";\n }\n\n return fs.readFile(progressPath, \"utf-8\");\n}\n\nexport async function getRecentProgress(\n lines: number = 50,\n cwd: string = process.cwd()\n): Promise<string> {\n const content = await readProgress(cwd);\n const allLines = content.split(\"\\n\");\n return allLines.slice(-lines).join(\"\\n\");\n}\n","import { execa, execaSync, type Options as ExecaOptions } from \"execa\";\n\nexport interface ShellResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport async function run(\n command: string,\n args: string[] = [],\n options: ExecaOptions = {}\n): Promise<ShellResult> {\n const result = await execa(command, args, {\n reject: false,\n ...options,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 1,\n };\n}\n\nexport async function runCommand(\n command: string,\n options: ExecaOptions = {}\n): Promise<ShellResult> {\n const result = await execa(command, {\n shell: true,\n reject: false,\n ...options,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 1,\n };\n}\n\nexport function isCommandAvailable(command: string): boolean {\n try {\n const result = execaSync(\"which\", [command], { reject: false });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n","import { execa } from \"execa\";\nimport { isCommandAvailable } from \"../utils/shell.js\";\n\nexport class ClaudeNotFoundError extends Error {\n constructor() {\n super(\n \"Claude Code CLI not found. Install it from: https://claude.ai/code\"\n );\n this.name = \"ClaudeNotFoundError\";\n }\n}\n\nexport interface ClaudeOptions {\n print?: boolean;\n skipPermissions?: boolean;\n ultrathink?: boolean;\n cwd?: string;\n timeout?: number;\n}\n\nexport function isClaudeInstalled(): boolean {\n return isCommandAvailable(\"claude\");\n}\n\nexport function checkClaudeInstalled(): void {\n if (!isClaudeInstalled()) {\n throw new ClaudeNotFoundError();\n }\n}\n\nexport async function invokeClaude(\n prompt: string,\n options: ClaudeOptions = {}\n): Promise<string> {\n checkClaudeInstalled();\n\n const args: string[] = [];\n\n if (options.print) {\n args.push(\"--print\");\n }\n\n if (options.skipPermissions) {\n args.push(\"--dangerously-skip-permissions\");\n }\n\n // Prefix prompt with \"ultrathink\" keyword to enable extended thinking mode\n const finalPrompt = options.ultrathink ? `ultrathink ${prompt}` : prompt;\n args.push(finalPrompt);\n\n const result = await execa(\"claude\", args, {\n cwd: options.cwd,\n timeout: options.timeout ? options.timeout * 1000 : undefined,\n stdout: \"pipe\",\n stderr: \"inherit\",\n reject: false,\n });\n\n return result.stdout;\n}\n\nexport async function invokeClaudeStreaming(\n prompt: string,\n options: ClaudeOptions = {}\n): Promise<string> {\n checkClaudeInstalled();\n\n const args: string[] = [];\n\n // --print only prints output without executing tools\n // For autonomous mode, we need to pass prompt via stdin without --print\n if (options.print) {\n args.push(\"--print\");\n }\n\n if (options.skipPermissions) {\n args.push(\"--dangerously-skip-permissions\");\n }\n\n // Prefix prompt with \"ultrathink\" keyword to enable extended thinking mode\n const finalPrompt = options.ultrathink ? `ultrathink ${prompt}` : prompt;\n\n // If not in print mode, pass prompt via stdin to allow tool execution\n // If in print mode, pass as argument (text-only response)\n if (options.print) {\n args.push(finalPrompt);\n }\n\n // Stream output to stderr while capturing stdout\n const subprocess = execa(\"claude\", args, {\n cwd: options.cwd,\n timeout: options.timeout ? options.timeout * 1000 : undefined,\n reject: false,\n input: options.print ? undefined : finalPrompt,\n });\n\n // Pipe stderr to process stderr for real-time output\n subprocess.stderr?.pipe(process.stderr);\n\n const result = await subprocess;\n return result.stdout;\n}\n","import { run } from \"../utils/shell.js\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nexport async function isGitRepo(dir: string): Promise<boolean> {\n const gitDir = path.join(dir, \".git\");\n return fs.pathExists(gitDir);\n}\n\nexport async function getCurrentBranch(cwd: string): Promise<string | null> {\n if (!(await isGitRepo(cwd))) {\n return null;\n }\n\n const result = await run(\"git\", [\"branch\", \"--show-current\"], { cwd });\n\n if (result.exitCode !== 0) {\n return null;\n }\n\n return result.stdout.trim() || \"detached\";\n}\n\nexport async function branchExists(\n branchName: string,\n cwd: string\n): Promise<boolean> {\n const result = await run(\"git\", [\"branch\", \"--list\", branchName], { cwd });\n return result.stdout.trim().length > 0;\n}\n\nexport async function checkout(\n branchName: string,\n cwd: string,\n create = false\n): Promise<boolean> {\n const args = create\n ? [\"checkout\", \"-b\", branchName]\n : [\"checkout\", branchName];\n\n const result = await run(\"git\", args, { cwd });\n return result.exitCode === 0;\n}\n\nexport async function getExistingForkBranches(\n baseBranch: string,\n cwd: string\n): Promise<string[]> {\n const result = await run(\"git\", [\"branch\", \"--list\", `${baseBranch}-*`], {\n cwd,\n });\n\n if (result.exitCode !== 0 || !result.stdout.trim()) {\n return [];\n }\n\n return result.stdout\n .split(\"\\n\")\n .map((b) => b.trim().replace(/^\\*?\\s*/, \"\"))\n .filter((b) => b.length > 0);\n}\n\nexport async function getNextForkBranch(\n baseBranch: string,\n cwd: string\n): Promise<string> {\n const existing = await getExistingForkBranches(baseBranch, cwd);\n\n if (existing.length === 0) {\n return `${baseBranch}-1`;\n }\n\n const numbers = existing\n .map((b) => {\n const match = b.match(/-(\\d+)$/);\n return match ? parseInt(match[1], 10) : 0;\n })\n .filter((n) => n > 0);\n\n const maxNumber = Math.max(0, ...numbers);\n return `${baseBranch}-${maxNumber + 1}`;\n}\n\nexport async function getRepoStatus(cwd: string): Promise<{\n isRepo: boolean;\n branch: string | null;\n hasChanges: boolean;\n}> {\n const isRepo = await isGitRepo(cwd);\n\n if (!isRepo) {\n return { isRepo: false, branch: null, hasChanges: false };\n }\n\n const branch = await getCurrentBranch(cwd);\n const statusResult = await run(\"git\", [\"status\", \"--porcelain\"], { cwd });\n const hasChanges = statusResult.stdout.trim().length > 0;\n\n return { isRepo, branch, hasChanges };\n}\n","import chalk from \"chalk\";\n\nexport const logger = {\n info(message: string): void {\n console.log(chalk.blue(\"[INFO]\"), message);\n },\n\n success(message: string): void {\n console.log(chalk.green(\"[SUCCESS]\"), message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow(\"[WARNING]\"), message);\n },\n\n error(message: string): void {\n console.log(chalk.red(\"[ERROR]\"), message);\n },\n\n log(message: string): void {\n console.log(message);\n },\n\n header(title: string): void {\n console.log(\"\");\n console.log(chalk.bold(\"========================================\"));\n console.log(chalk.bold(` ${title}`));\n console.log(chalk.bold(\"========================================\"));\n console.log(\"\");\n },\n\n divider(): void {\n console.log(chalk.gray(\"----------------------------------------\"));\n },\n\n list(items: string[], indent = 2): void {\n const prefix = \" \".repeat(indent) + \"- \";\n for (const item of items) {\n console.log(prefix + item);\n }\n },\n\n keyValue(key: string, value: string): void {\n console.log(` ${chalk.cyan(key)}: ${value}`);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { logger } from \"../utils/logger.js\";\nimport { configExists, getDefaultConfig } from \"../core/config.js\";\nimport type { InitOptions } from \"../types/index.js\";\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const cwd = process.cwd();\n const configPath = path.join(cwd, \"ralph.config.json\");\n\n // Check if config already exists\n if (await configExists(cwd)) {\n if (!options.force) {\n logger.warning(\"Configuration already exists. Use --force to overwrite.\");\n return;\n }\n logger.info(\"Overwriting existing configuration...\");\n }\n\n // Detect project name from package.json or directory name\n let projectName = path.basename(cwd);\n\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (await fs.pathExists(packageJsonPath)) {\n try {\n const pkg = await fs.readJSON(packageJsonPath);\n if (pkg.name) {\n projectName = pkg.name;\n }\n } catch {\n // Ignore errors reading package.json\n }\n }\n\n // Generate default config\n const config = getDefaultConfig(projectName);\n\n // Write config file\n await fs.writeJSON(configPath, config, { spaces: 2 });\n\n logger.success(`Created ralph.config.json`);\n logger.log(\"\");\n logger.log(\"Next steps:\");\n logger.log(\" 1. Edit ralph.config.json to configure your repositories\");\n logger.log(\" 2. Run: ralph plan <feature>\");\n logger.log(\" 3. Run: ralph prd\");\n logger.log(\" 4. Run: ralph run\");\n\n // Update .gitignore if it exists\n const gitignorePath = path.join(cwd, \".gitignore\");\n if (await fs.pathExists(gitignorePath)) {\n const gitignore = await fs.readFile(gitignorePath, \"utf-8\");\n const entries = [\"plan.md\", \"prd.json\", \"progress.txt\", \"archive/\", \".last-project\"];\n const toAdd = entries.filter((e) => !gitignore.includes(e));\n\n if (toAdd.length > 0) {\n const addition = `\\n# Ralph\\n${toAdd.join(\"\\n\")}\\n`;\n await fs.appendFile(gitignorePath, addition);\n logger.info(`Added ${toAdd.length} entries to .gitignore`);\n }\n }\n}\n","// Auto-generated - DO NOT EDIT\n// Source: templates/prompt.md\n\nexport const PROMPT_TEMPLATE = \"# Ralph Agent Instructions\\n\\nYou are an autonomous coding agent executing user stories from a PRD.\\n\\n## Your Task\\n\\n1. Read the PRD at `prd.json`\\n2. Read the progress log at `progress.txt` (check Codebase Patterns section first)\\n3. Read `ralph.config.json` to understand the project structure\\n4. Pick the **highest priority** user story where `passes: false`\\n5. Note which `repo` the story targets\\n6. Ensure you're on the correct branch in that repo\\n7. Implement that single user story\\n8. Run quality checks for the target repo\\n9. If checks pass, commit changes with message: `feat: [Story ID] - [Story Title]`\\n10. Update `prd.json` to set `passes: true` for the completed story\\n11. Append your progress to `progress.txt`\\n\\n## Configuration\\n\\nRead `ralph.config.json` to understand:\\n- Available repositories and their paths\\n- Quality checks to run for each repo\\n- Project structure\\n\\nExample configuration:\\n```json\\n{\\n \\\"repositories\\\": {\\n \\\"backend\\\": {\\n \\\"path\\\": \\\"./backend\\\",\\n \\\"checks\\\": [\\\"pytest\\\", \\\"mypy .\\\"]\\n },\\n \\\"frontend\\\": {\\n \\\"path\\\": \\\"./frontend\\\",\\n \\\"checks\\\": [\\\"npm run build\\\", \\\"npm run lint\\\"]\\n }\\n }\\n}\\n```\\n\\n## Branch Management\\n\\nEach story specifies a `repo` field. Before implementing:\\n\\n1. **Check the story's `repo` field** (e.g., `\\\"repo\\\": \\\"backend\\\"`)\\n2. **Get the repo path** from `ralph.config.json`\\n3. **Navigate to that repo** and check/create the branch:\\n ```bash\\n cd <repo-path>\\n git checkout -b feature/my-feature # or checkout existing branch\\n ```\\n4. **After implementing, commit in that repo:**\\n ```bash\\n cd <repo-path>\\n git add .\\n git commit -m \\\"feat: US-001 - Add status field\\\"\\n ```\\n\\nThe PRD contains a `repositories` section with branch names for each repo:\\n```json\\n{\\n \\\"repositories\\\": {\\n \\\"backend\\\": { \\\"branchName\\\": \\\"feature/task-status\\\" },\\n \\\"frontend\\\": { \\\"branchName\\\": \\\"feature/task-status\\\" }\\n }\\n}\\n```\\n\\n## Branch Forking\\n\\nSome stories may request a \\\"fork\\\" - creating a new branch from the current one.\\n\\n### When to Fork\\n\\nCheck the story's `fork` field:\\n- `\\\"fork\\\": true` - Create a new branch before implementing\\n- `\\\"fork\\\": false` or not specified - Use the existing branch\\n\\n### Fork Algorithm\\n\\nIf `fork: true` for the current story:\\n\\n1. **Check if already forked**:\\n - If `repositories[repo].activeBranch` exists and differs from `branchName`, the fork already happened\\n - Just checkout `activeBranch` and continue\\n\\n2. **Detect next branch number:**\\n ```bash\\n cd <repo-path>\\n BASE_BRANCH=$(jq -r '.repositories[\\\"<repo>\\\"].branchName' prd.json)\\n EXISTING=$(git branch --list \\\"${BASE_BRANCH}-*\\\" | tr -d ' *')\\n # Find max number and increment\\n NEW_BRANCH=\\\"${BASE_BRANCH}-${NEXT_NUM}\\\"\\n ```\\n\\n3. **Create and checkout new branch:**\\n ```bash\\n git checkout -b \\\"$NEW_BRANCH\\\"\\n ```\\n\\n4. **Update PRD** to reflect the new active branch\\n\\n## Quality Requirements\\n\\nBefore committing, run the quality checks from `ralph.config.json`:\\n\\n```bash\\ncd <repo-path>\\n# Run each check from config\\n<check-command-1>\\n<check-command-2>\\n```\\n\\n**General Rules:**\\n- ALL commits must pass quality checks\\n- Do NOT commit broken code\\n- Keep changes focused and minimal\\n- Follow existing code patterns\\n\\n## Progress Report Format\\n\\nAPPEND to `progress.txt` (never replace, always append):\\n```\\n## [Date/Time] - [Story ID] ([repo])\\n- What was implemented\\n- Files changed\\n- Commit: [commit hash]\\n- **Learnings for future iterations:**\\n - Patterns discovered\\n - Gotchas encountered\\n---\\n```\\n\\n## Consolidate Patterns\\n\\nIf you discover a **reusable pattern**, add it to the `## Codebase Patterns` section at the TOP of `progress.txt`:\\n\\n```\\n## Codebase Patterns\\n\\n### [repo-name]\\n- Example: Use Pydantic models for request/response\\n- Example: Routes are in `routers/` directory\\n```\\n\\n## Update CLAUDE.md Files\\n\\nBefore committing, check if learnings should be added to the target repo's `CLAUDE.md` file.\\n\\n## Browser Testing (For Frontend Stories)\\n\\nFor any story that changes UI:\\n\\n1. Start the dev server\\n2. Navigate to the relevant page\\n3. Verify the UI changes work as expected\\n4. A frontend story is NOT complete until browser verification passes\\n\\n## Stop Condition\\n\\nAfter completing a user story, check if ALL stories have `passes: true`.\\n\\nIf ALL stories are complete and passing, reply with:\\n<promise>COMPLETE</promise>\\n\\nIf there are still stories with `passes: false`, end your response normally (another iteration will pick up the next story).\\n\\n## Important\\n\\n- Work on ONE story per iteration\\n- Each story targets ONE repository\\n- Read the story's `repo` field to know which repo to work in\\n- Use the correct branch for each repo (from PRD `repositories` section)\\n- Read the Codebase Patterns section in `progress.txt` before starting\\n- Read the relevant CLAUDE.md for the target repo if it exists\\n\";\n","// Auto-generated - DO NOT EDIT\n// Source: templates/skills/ralph.md\n\nexport const RALPH_SKILL = \"# Ralph - Plan Generator\\n\\nGenerate a structured implementation plan from a feature description.\\n\\n---\\n\\n## The Job\\n\\n1. Read the project configuration from `ralph.config.json`\\n2. Analyze the user's feature request\\n3. Ask 3-5 clarifying questions to understand scope\\n4. Generate a detailed plan in `plan.md`\\n5. Offer to validate or modify the plan\\n\\n---\\n\\n## Step 1: Read Configuration\\n\\nFirst, read `ralph.config.json` to understand:\\n- Project name and description\\n- Available repositories and their paths\\n- Quality checks for each repository\\n\\nIf `ralph.config.json` doesn't exist, ask the user to create one or offer to generate a default configuration.\\n\\n---\\n\\n## Step 2: Clarifying Questions\\n\\nAsk 3-5 essential questions to understand the feature. Format questions with lettered options:\\n\\n```\\n1. What is the primary goal of this feature?\\n A) Add new functionality\\n B) Improve existing functionality\\n C) Fix a bug\\n D) Refactor/cleanup\\n\\n2. Which parts of the codebase will be affected?\\n A) Backend only\\n B) Frontend only\\n C) Both backend and frontend\\n D) Other (specify)\\n\\n3. Are there any external dependencies required?\\n A) No new dependencies\\n B) Yes (specify which)\\n```\\n\\nWait for the user to respond with format like \\\"1A, 2C, 3A\\\" before proceeding.\\n\\n---\\n\\n## Step 3: Generate Plan\\n\\nBased on the answers, generate `plan.md` with this structure:\\n\\n```markdown\\n# [Project Name] - [Feature Name]\\n\\n[Brief description of the feature]\\n\\n---\\n\\n## Summary\\n\\n[2-3 sentences explaining what this plan accomplishes]\\n\\n---\\n\\n## User Stories\\n\\n### [Repository 1] Stories\\n\\n#### US-001: [Title]\\n**Repository:** `repo-name`\\n**Description:** As a [role], I want [feature] so that [benefit].\\n\\n**Acceptance Criteria:**\\n- [ ] Specific, verifiable criterion\\n- [ ] Another criterion\\n- [ ] Tests pass (pytest/npm test/etc.)\\n\\n[Repeat for each story...]\\n\\n---\\n\\n## Technical Considerations\\n\\n- [Architecture decisions]\\n- [Dependencies]\\n- [Breaking changes]\\n\\n---\\n\\n## Open Questions\\n\\n- [Any unresolved questions]\\n```\\n\\n---\\n\\n## Step 4: Story Guidelines\\n\\n### Story Size\\n- Each story must be completable in ONE Claude Code iteration\\n- If it can't be described in 2-3 sentences, split it\\n- Rule: One story = One focused change in ONE repository\\n\\n### Story Order\\nStories should be ordered by dependency:\\n1. Database/schema changes first\\n2. API/backend logic second\\n3. Frontend components third\\n4. Integration/polish last\\n\\n### Acceptance Criteria Rules\\n- Must be objectively verifiable (not \\\"works well\\\" or \\\"good UX\\\")\\n- Backend stories MUST include: \\\"Tests pass\\\"\\n- Frontend stories MUST include: \\\"Build passes\\\" AND \\\"Verify in browser\\\"\\n- Include specific checks relevant to the change\\n\\n---\\n\\n## Step 5: Validation\\n\\nAfter generating the plan, present it to the user and ask:\\n\\n```\\nPlan generated and saved to `plan.md`.\\n\\nWould you like to:\\nA) Validate and proceed to PRD generation (/prd)\\nB) Make modifications (describe what to change)\\nC) Start over with different requirements\\n```\\n\\nIf user chooses B, make the requested modifications and re-validate.\\n\\n---\\n\\n## Output\\n\\n**File:** `plan.md`\\n\\nThe plan file will be used by the `/prd` command to generate the executable `prd.json`.\\n\\n---\\n\\n## Example Usage\\n\\nUser: `/ralph Add user authentication with OAuth`\\n\";\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { logger } from \"../utils/logger.js\";\nimport { loadConfig, ConfigNotFoundError } from \"../core/config.js\";\nimport { checkClaudeInstalled } from \"../core/claude.js\";\nimport { RALPH_SKILL } from \"../templates/embedded/index.js\";\nimport type { PlanOptions } from \"../types/index.js\";\n\nexport async function planCommand(\n feature: string,\n options: PlanOptions = {}\n): Promise<void> {\n const cwd = process.cwd();\n const outputPath = options.output ?? path.join(cwd, \"plan.md\");\n\n // Check prerequisites\n checkClaudeInstalled();\n\n // Load config\n let config;\n try {\n config = await loadConfig(cwd);\n } catch (error) {\n if (error instanceof ConfigNotFoundError) {\n logger.warning(\"No configuration found. Run 'ralph init' first, or create ralph.config.json manually.\");\n logger.info(\"Continuing without configuration...\");\n config = null;\n } else {\n throw error;\n }\n }\n\n logger.header(\"Ralph - Plan Generator\");\n logger.keyValue(\"Feature\", feature);\n if (config) {\n logger.keyValue(\"Project\", config.project);\n }\n logger.log(\"\");\n\n // Build prompt\n let prompt = RALPH_SKILL;\n\n if (config) {\n prompt += `\\n\\n## Current Configuration\\n\\n\\`\\`\\`json\\n${JSON.stringify(config, null, 2)}\\n\\`\\`\\``;\n }\n\n prompt += `\\n\\n## Feature Request\\n\\n${feature}`;\n\n logger.info(\"Starting interactive plan generation...\");\n logger.info(\"Claude will ask clarifying questions. Please respond in the terminal.\");\n logger.log(\"\");\n\n // Invoke Claude interactively (without --print to allow interaction)\n // Note: This runs claude in interactive mode for Q&A with ultrathink enabled for better planning\n const { execa } = await import(\"execa\");\n\n // Prefix prompt with \"ultrathink\" keyword to enable extended thinking mode\n const subprocess = execa(\"claude\", [`ultrathink ${prompt}`], {\n cwd,\n stdio: \"inherit\",\n reject: false,\n });\n\n await subprocess;\n\n // Check if plan.md was created\n if (await fs.pathExists(outputPath)) {\n logger.log(\"\");\n logger.success(`Plan generated: ${outputPath}`);\n logger.log(\"\");\n logger.log(\"Next steps:\");\n logger.log(\" 1. Review and edit plan.md if needed\");\n logger.log(\" 2. Run: ralph prd\");\n logger.log(\" 3. Run: ralph run\");\n } else {\n logger.warning(\"Plan file was not created. You may need to re-run the command.\");\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../utils/logger.js\";\nimport { loadConfig, ConfigNotFoundError } from \"../core/config.js\";\nimport { savePrd, getStoriesByRepo } from \"../core/prd.js\";\nimport type { PrdOptions, Prd, UserStory } from \"../types/index.js\";\n\nexport async function prdCommand(options: PrdOptions = {}): Promise<void> {\n const cwd = process.cwd();\n const inputPath = options.input ?? path.join(cwd, \"plan.md\");\n const outputDir = options.output ? path.dirname(options.output) : cwd;\n\n // Check plan.md exists\n if (!(await fs.pathExists(inputPath))) {\n logger.error(`Plan file not found: ${inputPath}`);\n logger.info(\"Run 'ralph plan <feature>' to generate a plan first.\");\n process.exit(1);\n }\n\n // Load config\n let config;\n try {\n config = await loadConfig(cwd);\n } catch (error) {\n if (error instanceof ConfigNotFoundError) {\n logger.error(\"No configuration found. Run 'ralph init' first.\");\n process.exit(1);\n }\n throw error;\n }\n\n logger.header(\"Ralph - PRD Generator\");\n\n // Read and parse plan.md\n const planContent = await fs.readFile(inputPath, \"utf-8\");\n\n logger.info(\"Parsing plan.md...\");\n\n const prd = parsePlanToPrd(planContent, config);\n\n // Save PRD\n await savePrd(prd, outputDir);\n\n // Display summary\n logger.log(\"\");\n logger.success(\"PRD Generated Successfully!\");\n logger.log(\"\");\n logger.keyValue(\"Project\", prd.project);\n logger.keyValue(\"Stories\", prd.userStories.length.toString());\n\n const byRepo = getStoriesByRepo(prd);\n for (const [repo, stories] of Object.entries(byRepo)) {\n logger.log(` - ${repo}: ${stories.length} stories`);\n }\n\n logger.log(\"\");\n logger.log(\"Repositories:\");\n for (const [repo, info] of Object.entries(prd.repositories)) {\n logger.log(` - ${repo}: ${chalk.cyan(info.branchName)}`);\n }\n\n logger.log(\"\");\n logger.log(\"Next steps:\");\n logger.log(\" 1. Review prd.json if needed\");\n logger.log(\" 2. Run: ralph run\");\n}\n\nfunction parsePlanToPrd(\n content: string,\n config: Awaited<ReturnType<typeof loadConfig>>\n): Prd {\n // Extract project name from H1\n const h1Match = content.match(/^#\\s+(.+)$/m);\n const projectName = h1Match ? h1Match[1].trim() : config.project;\n\n // Extract description (first paragraph after H1)\n const descMatch = content.match(/^#\\s+.+\\n\\n(.+?)(?:\\n\\n|---)/s);\n const description = descMatch ? descMatch[1].trim() : \"\";\n\n // Generate branch name from project\n const branchSlug = projectName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .substring(0, 50);\n const branchName = `feature/${branchSlug}`;\n\n // Parse user stories\n const stories: UserStory[] = [];\n const storyRegex = /####\\s+(US-\\d+):\\s*(.+?)(?:\\n|$)/g;\n let match;\n let priority = 1;\n\n while ((match = storyRegex.exec(content)) !== null) {\n const id = match[1];\n const title = match[2].trim();\n\n // Find story details\n const storyStart = match.index;\n const nextStoryMatch = content.slice(storyStart + match[0].length).match(/####\\s+US-\\d+/);\n const storyEnd = nextStoryMatch\n ? storyStart + match[0].length + nextStoryMatch.index!\n : content.length;\n const storyContent = content.slice(storyStart, storyEnd);\n\n // Extract repository\n const repoMatch = storyContent.match(/\\*\\*Repository:\\*\\*\\s*`?(\\w+)`?/);\n const repo = repoMatch ? repoMatch[1] : \"main\";\n\n // Extract description\n const descMatch = storyContent.match(/\\*\\*Description:\\*\\*\\s*(.+?)(?:\\n\\n|\\*\\*)/s);\n const storyDesc = descMatch ? descMatch[1].trim() : title;\n\n // Extract acceptance criteria\n const criteriaMatch = storyContent.match(/\\*\\*Acceptance Criteria:\\*\\*\\s*([\\s\\S]*?)(?:\\n\\n---|\\n\\n####|$)/);\n const criteria: string[] = [];\n\n if (criteriaMatch) {\n const criteriaLines = criteriaMatch[1].split(\"\\n\");\n for (const line of criteriaLines) {\n const item = line.replace(/^-\\s*\\[.\\]\\s*/, \"\").replace(/^-\\s*/, \"\").trim();\n if (item) {\n criteria.push(item);\n }\n }\n }\n\n // Check if it's a fork story\n const isFork = storyContent.toLowerCase().includes(\"experimental\") ||\n storyContent.toLowerCase().includes(\"fork\");\n\n stories.push({\n id,\n title,\n repo,\n description: storyDesc,\n acceptanceCriteria: criteria.length > 0 ? criteria : [\"Implementation complete\"],\n priority: priority++,\n passes: false,\n fork: isFork,\n notes: \"\",\n });\n }\n\n // Build repositories map\n const repositories: Prd[\"repositories\"] = {};\n const repoKeys = new Set(stories.map((s) => s.repo));\n\n for (const repoKey of repoKeys) {\n repositories[repoKey] = { branchName };\n }\n\n // Ensure all config repos are included\n for (const repoKey of Object.keys(config.repositories)) {\n if (!repositories[repoKey]) {\n repositories[repoKey] = { branchName };\n }\n }\n\n return {\n project: projectName,\n description,\n repositories,\n userStories: stories,\n };\n}\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { logger } from \"../utils/logger.js\";\nimport { loadConfig, ConfigNotFoundError } from \"../core/config.js\";\nimport { loadPrd, prdExists, isAllComplete, getPendingStories } from \"../core/prd.js\";\nimport { initProgressFile } from \"../core/progress.js\";\nimport { checkClaudeInstalled, invokeClaudeStreaming } from \"../core/claude.js\";\nimport { getCurrentBranch } from \"../core/git.js\";\nimport { PROMPT_TEMPLATE } from \"../templates/embedded/index.js\";\nimport type { RunOptions } from \"../types/index.js\";\n\nconst COMPLETE_SIGNAL = \"<promise>COMPLETE</promise>\";\nconst ARCHIVE_DIR = \"archive\";\nconst LAST_PROJECT_FILE = \".last-project\";\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const cwd = process.cwd();\n\n // Check prerequisites\n checkClaudeInstalled();\n\n // Load config\n let config;\n try {\n config = await loadConfig(cwd);\n } catch (error) {\n if (error instanceof ConfigNotFoundError) {\n logger.error(\"No configuration found. Run 'ralph init' first.\");\n process.exit(1);\n }\n throw error;\n }\n\n // Check PRD exists\n if (!(await prdExists(cwd))) {\n logger.error(\"PRD file not found.\");\n logger.info(\"Run 'ralph plan <feature>' and 'ralph prd' to generate one.\");\n process.exit(1);\n }\n\n const prd = await loadPrd(cwd);\n const maxIterations = options.maxIterations ?? config.agent?.maxIterations ?? 50;\n\n // Handle project change archiving\n await handleProjectArchive(cwd, prd.project);\n\n // Initialize progress file\n await initProgressFile(prd.project, cwd);\n\n // Show status\n showStatus(config, prd, maxIterations, cwd);\n\n // Check if already complete\n if (isAllComplete(prd)) {\n logger.success(\"All stories already completed!\");\n return;\n }\n\n // Run main loop\n await runLoop(maxIterations, cwd);\n}\n\nasync function handleProjectArchive(cwd: string, currentProject: string): Promise<void> {\n const lastProjectPath = path.join(cwd, LAST_PROJECT_FILE);\n const prdPath = path.join(cwd, \"prd.json\");\n const progressPath = path.join(cwd, \"progress.txt\");\n\n if (await fs.pathExists(lastProjectPath)) {\n const lastProject = (await fs.readFile(lastProjectPath, \"utf-8\")).trim();\n\n if (lastProject && lastProject !== currentProject) {\n // Archive previous project\n const date = new Date().toISOString().split(\"T\")[0];\n const folderName = lastProject.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\");\n const archivePath = path.join(cwd, ARCHIVE_DIR, `${date}-${folderName}`);\n\n logger.info(`Archiving previous run: ${lastProject}`);\n await fs.ensureDir(archivePath);\n\n if (await fs.pathExists(prdPath)) {\n await fs.copy(prdPath, path.join(archivePath, \"prd.json\"));\n }\n if (await fs.pathExists(progressPath)) {\n await fs.copy(progressPath, path.join(archivePath, \"progress.txt\"));\n // Reset progress file\n await fs.remove(progressPath);\n }\n\n logger.success(`Archived to: ${archivePath}`);\n }\n }\n\n // Track current project\n await fs.writeFile(lastProjectPath, currentProject);\n}\n\nasync function showStatus(\n config: Awaited<ReturnType<typeof loadConfig>>,\n prd: Awaited<ReturnType<typeof loadPrd>>,\n maxIterations: number,\n cwd: string\n): Promise<void> {\n logger.header(\"Ralph - Autonomous Agent Loop\");\n\n logger.keyValue(\"Project\", prd.project);\n logger.keyValue(\"Max iterations\", maxIterations.toString());\n logger.log(\"\");\n\n // Show repositories\n logger.log(\"Repositories:\");\n for (const [repoKey, repoConfig] of Object.entries(config.repositories)) {\n const repoPath = path.resolve(cwd, repoConfig.path);\n const branch = await getCurrentBranch(repoPath);\n const branchInfo = branch ?? \"(not a git repo)\";\n logger.log(` - ${repoKey}: ${repoConfig.path} (${branchInfo})`);\n }\n logger.log(\"\");\n\n // Show pending stories\n const pending = getPendingStories(prd);\n if (pending.length > 0) {\n logger.log(\"Pending stories:\");\n for (const story of pending) {\n const forkTag = story.fork ? \" (FORK)\" : \"\";\n logger.log(` - ${story.id} [${story.repo}]${forkTag}: ${story.title}`);\n }\n logger.log(\"\");\n }\n}\n\nasync function runLoop(maxIterations: number, cwd: string): Promise<void> {\n for (let i = 1; i <= maxIterations; i++) {\n logger.log(\"\");\n logger.log(chalk.bold(\"========================================\"));\n logger.log(chalk.bold(` Iteration ${i} of ${maxIterations}`));\n logger.log(chalk.bold(\"========================================\"));\n\n // Run Claude Code with the prompt\n logger.info(\"Starting Claude Code iteration...\");\n\n const output = await invokeClaudeStreaming(PROMPT_TEMPLATE, {\n print: false, // Must be false to allow Claude to execute tools\n skipPermissions: true,\n cwd,\n });\n\n // Check for completion signal\n if (output.includes(COMPLETE_SIGNAL)) {\n logger.log(\"\");\n logger.log(chalk.bold(\"========================================\"));\n logger.success(\"Ralph completed all tasks!\");\n logger.log(` Completed at iteration ${i} of ${maxIterations}`);\n logger.log(chalk.bold(\"========================================\"));\n logger.log(\"\");\n\n await showFinalBranchStatus(cwd);\n return;\n }\n\n logger.info(`Iteration ${i} complete. Continuing...`);\n await sleep(2000);\n }\n\n // Max iterations reached\n logger.log(\"\");\n logger.warning(`Ralph reached max iterations (${maxIterations}) without completing all tasks.`);\n logger.info(\"Check progress.txt for status.\");\n\n // Show remaining stories\n const prd = await loadPrd(cwd);\n const pending = getPendingStories(prd);\n if (pending.length > 0) {\n logger.log(\"\");\n logger.log(\"Remaining stories:\");\n for (const story of pending) {\n const forkTag = story.fork ? \" (FORK)\" : \"\";\n logger.log(` - ${story.id} [${story.repo}]${forkTag}: ${story.title}`);\n }\n }\n\n process.exit(1);\n}\n\nasync function showFinalBranchStatus(cwd: string): Promise<void> {\n try {\n const config = await loadConfig(cwd);\n logger.log(\"Final branch status:\");\n\n for (const [repoKey, repoConfig] of Object.entries(config.repositories)) {\n const repoPath = path.resolve(cwd, repoConfig.path);\n const branch = await getCurrentBranch(repoPath);\n if (branch) {\n logger.log(` - ${repoKey}: ${branch}`);\n }\n }\n } catch {\n // Ignore errors\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport { logger } from \"../utils/logger.js\";\nimport { loadConfig, ConfigNotFoundError } from \"../core/config.js\";\nimport { loadPrd, prdExists, getCompletionStats, getPendingStories, getStoriesByRepo } from \"../core/prd.js\";\nimport { getCurrentBranch } from \"../core/git.js\";\nimport { progressExists, getRecentProgress } from \"../core/progress.js\";\nimport type { StatusOptions } from \"../types/index.js\";\n\nexport async function statusCommand(options: StatusOptions = {}): Promise<void> {\n const cwd = process.cwd();\n\n logger.header(\"Ralph - Status\");\n\n // Load config\n let config;\n try {\n config = await loadConfig(cwd);\n logger.keyValue(\"Project\", config.project);\n } catch (error) {\n if (error instanceof ConfigNotFoundError) {\n logger.warning(\"No configuration found. Run 'ralph init' first.\");\n return;\n }\n throw error;\n }\n\n // Check PRD\n if (!(await prdExists(cwd))) {\n logger.warning(\"No PRD found. Run 'ralph plan <feature>' and 'ralph prd' first.\");\n return;\n }\n\n const prd = await loadPrd(cwd);\n\n // Show completion stats\n const stats = getCompletionStats(prd);\n logger.log(\"\");\n logger.log(chalk.bold(\"Progress:\"));\n\n const progressBar = createProgressBar(stats.percentage);\n logger.log(` ${progressBar} ${stats.percentage}%`);\n logger.log(` ${chalk.green(stats.completed.toString())} completed / ${chalk.yellow(stats.pending.toString())} pending / ${stats.total} total`);\n\n // Show repositories\n logger.log(\"\");\n logger.log(chalk.bold(\"Repositories:\"));\n\n for (const [repoKey, repoConfig] of Object.entries(config.repositories)) {\n const repoPath = path.resolve(cwd, repoConfig.path);\n const branch = await getCurrentBranch(repoPath);\n const branchInfo = branch ? chalk.cyan(branch) : chalk.gray(\"(not a git repo)\");\n const prdBranch = prd.repositories[repoKey]?.branchName;\n\n let branchDisplay = branchInfo;\n if (prdBranch && branch && branch !== prdBranch) {\n branchDisplay = `${branchInfo} ${chalk.yellow(`(expected: ${prdBranch})`)}`;\n }\n\n logger.log(` ${chalk.bold(repoKey)}: ${repoConfig.path} [${branchDisplay}]`);\n }\n\n // Show pending stories\n const pending = getPendingStories(prd);\n if (pending.length > 0) {\n logger.log(\"\");\n logger.log(chalk.bold(\"Pending Stories:\"));\n\n for (const story of pending) {\n const forkTag = story.fork ? chalk.magenta(\" [FORK]\") : \"\";\n logger.log(` ${chalk.yellow(story.id)} [${story.repo}]${forkTag}: ${story.title}`);\n }\n } else {\n logger.log(\"\");\n logger.success(\"All stories completed!\");\n }\n\n // Show stories by repo\n if (options.verbose) {\n const byRepo = getStoriesByRepo(prd);\n logger.log(\"\");\n logger.log(chalk.bold(\"Stories by Repository:\"));\n\n for (const [repo, stories] of Object.entries(byRepo)) {\n const completed = stories.filter((s) => s.passes).length;\n logger.log(` ${chalk.bold(repo)}: ${completed}/${stories.length} completed`);\n\n for (const story of stories) {\n const status = story.passes ? chalk.green(\"✓\") : chalk.yellow(\"○\");\n logger.log(` ${status} ${story.id}: ${story.title}`);\n }\n }\n }\n\n // Show recent progress\n if (options.verbose && (await progressExists(cwd))) {\n const recent = await getRecentProgress(10, cwd);\n if (recent.trim()) {\n logger.log(\"\");\n logger.log(chalk.bold(\"Recent Progress:\"));\n logger.log(chalk.gray(recent));\n }\n }\n}\n\nfunction createProgressBar(percentage: number, width = 20): string {\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n const bar = chalk.green(\"█\".repeat(filled)) + chalk.gray(\"░\".repeat(empty));\n return `[${bar}]`;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "claude-ralph",
3
+ "version": "1.0.0",
4
+ "description": "Autonomous AI agent loop for Claude Code - Execute PRD user stories automatically",
5
+ "type": "module",
6
+ "bin": {
7
+ "ralph": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "module": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "scripts": {
25
+ "prebuild": "tsx scripts/embed-templates.ts",
26
+ "build": "tsup",
27
+ "dev": "tsup --watch",
28
+ "test": "vitest",
29
+ "test:run": "vitest run",
30
+ "lint": "tsc --noEmit",
31
+ "prepublishOnly": "npm run build"
32
+ },
33
+ "keywords": [
34
+ "claude",
35
+ "ai",
36
+ "agent",
37
+ "prd",
38
+ "automation",
39
+ "cli"
40
+ ],
41
+ "author": "Argile",
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/argile-ai/claude-ralph-mode.git"
46
+ },
47
+ "homepage": "https://github.com/argile-ai/claude-ralph-mode#readme",
48
+ "bugs": {
49
+ "url": "https://github.com/argile-ai/claude-ralph-mode/issues"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "registry": "https://registry.npmjs.org/"
54
+ },
55
+ "dependencies": {
56
+ "chalk": "^5.3.0",
57
+ "commander": "^12.1.0",
58
+ "cosmiconfig": "^9.0.0",
59
+ "execa": "^9.5.2",
60
+ "fs-extra": "^11.2.0",
61
+ "ora": "^8.1.1",
62
+ "zod": "^3.24.1"
63
+ },
64
+ "devDependencies": {
65
+ "@types/fs-extra": "^11.0.4",
66
+ "@types/node": "^22.10.5",
67
+ "tsup": "^8.3.5",
68
+ "tsx": "^4.19.2",
69
+ "typescript": "^5.7.3",
70
+ "vitest": "^2.1.8"
71
+ }
72
+ }