rlph-cli 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prd-add.d.ts +1 -0
- package/dist/commands/prd-add.d.ts.map +1 -1
- package/dist/commands/prd-add.js +34 -11
- package/dist/commands/prd-add.js.map +1 -1
- package/dist/init/templates.d.ts +5 -7
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +19 -46
- package/dist/init/templates.js.map +1 -1
- package/dist/prd/manager.d.ts +8 -0
- package/dist/prd/manager.d.ts.map +1 -1
- package/dist/prd/manager.js +31 -0
- package/dist/prd/manager.js.map +1 -1
- package/package.json +5 -3
- package/templates/complete-next-task.md +75 -0
- package/templates/prd-md-to-json.md +61 -0
- package/templates/ralph-complete-next-task-command.md +150 -0
- package/templates/ralph-prd-skill.md +388 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAW5D,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,EAAE,OAAO,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CActE;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAUvE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAU/D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAmB1D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAOvD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DzD;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyC1C"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2,7 +2,7 @@ import chalk from 'chalk';
|
|
|
2
2
|
import { select, confirm } from '@inquirer/prompts';
|
|
3
3
|
import { access, mkdir, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import { getClaudeDir,
|
|
5
|
+
import { getClaudeDir, getTargetSkillDir, getTargetSkillPath, getTargetCommandPath, loadBundledSkill, loadBundledCommand, BundledTemplateNotFoundError, } from '../init/index.js';
|
|
6
6
|
export async function promptAgentSelection() {
|
|
7
7
|
try {
|
|
8
8
|
return await select({
|
|
@@ -135,43 +135,26 @@ export async function installClaudeSkills() {
|
|
|
135
135
|
console.error(chalk.red(`Failed to create Claude directories: ${error.message}`));
|
|
136
136
|
throw err;
|
|
137
137
|
}
|
|
138
|
-
//
|
|
138
|
+
// Load bundled templates
|
|
139
139
|
let skillContent;
|
|
140
|
-
try {
|
|
141
|
-
skillContent = await readSourceSkill();
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
if (err instanceof SourceFileNotFoundError) {
|
|
145
|
-
console.error(chalk.red(`Source skill not found: ${getSourceSkillPath()}`));
|
|
146
|
-
console.error(chalk.gray('Install the prd skill globally first:'));
|
|
147
|
-
console.error(chalk.gray(' mkdir -p ~/.claude/skills/prd'));
|
|
148
|
-
console.error(chalk.gray(' # Copy SKILL.md to ~/.claude/skills/prd/'));
|
|
149
|
-
throw err;
|
|
150
|
-
}
|
|
151
|
-
throw err;
|
|
152
|
-
}
|
|
153
|
-
const transformedSkill = transformSkillContent(skillContent);
|
|
154
|
-
// Read and transform command
|
|
155
140
|
let commandContent;
|
|
156
141
|
try {
|
|
157
|
-
|
|
142
|
+
skillContent = await loadBundledSkill();
|
|
143
|
+
commandContent = await loadBundledCommand();
|
|
158
144
|
}
|
|
159
145
|
catch (err) {
|
|
160
|
-
if (err instanceof
|
|
161
|
-
console.error(chalk.red(
|
|
162
|
-
console.error(chalk.gray('
|
|
163
|
-
console.error(chalk.gray(' # Copy complete-next-task.md to ~/.claude/commands/'));
|
|
164
|
-
throw err;
|
|
146
|
+
if (err instanceof BundledTemplateNotFoundError) {
|
|
147
|
+
console.error(chalk.red('Failed to load bundled templates'));
|
|
148
|
+
console.error(chalk.gray('This may indicate a corrupted installation. Try reinstalling ralph.'));
|
|
165
149
|
}
|
|
166
150
|
throw err;
|
|
167
151
|
}
|
|
168
|
-
|
|
169
|
-
// Write transformed skill
|
|
152
|
+
// Write skill
|
|
170
153
|
const targetSkillDir = getTargetSkillDir();
|
|
171
154
|
const targetSkillPath = getTargetSkillPath();
|
|
172
155
|
try {
|
|
173
156
|
await mkdir(targetSkillDir, { recursive: true });
|
|
174
|
-
await writeFile(targetSkillPath,
|
|
157
|
+
await writeFile(targetSkillPath, skillContent);
|
|
175
158
|
console.log(chalk.green(`✓ Installed skill: ${targetSkillPath}`));
|
|
176
159
|
}
|
|
177
160
|
catch (err) {
|
|
@@ -184,10 +167,10 @@ export async function installClaudeSkills() {
|
|
|
184
167
|
}
|
|
185
168
|
throw err;
|
|
186
169
|
}
|
|
187
|
-
// Write
|
|
170
|
+
// Write command
|
|
188
171
|
const targetCommandPath = getTargetCommandPath();
|
|
189
172
|
try {
|
|
190
|
-
await writeFile(targetCommandPath,
|
|
173
|
+
await writeFile(targetCommandPath, commandContent);
|
|
191
174
|
console.log(chalk.green(`✓ Installed command: ${targetCommandPath}`));
|
|
192
175
|
}
|
|
193
176
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface PrdAddOptions {
|
|
2
2
|
agent: string;
|
|
3
3
|
}
|
|
4
|
+
export declare function promptOverride(name: string, location: string): Promise<boolean>;
|
|
4
5
|
export declare function prdAdd(path: string, name: string, opts: PrdAddOptions): Promise<void>;
|
|
5
6
|
//# sourceMappingURL=prd-add.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd-add.d.ts","sourceRoot":"","sources":["../../src/commands/prd-add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prd-add.d.ts","sourceRoot":"","sources":["../../src/commands/prd-add.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAyFf"}
|
package/dist/commands/prd-add.js
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import { confirm } from '@inquirer/prompts';
|
|
2
3
|
import { access, writeFile } from 'node:fs/promises';
|
|
3
4
|
import { join } from 'node:path';
|
|
4
5
|
import { getAgent, isValidAgent } from '../agents/index.js';
|
|
5
|
-
import { createPrdFolder, copyMarkdown, getPrdDir,
|
|
6
|
+
import { createPrdFolder, copyMarkdown, getPrdDir, getPrdFileStatus, isProjectInitialized, } from '../prd/index.js';
|
|
6
7
|
import { ensureTemplates, loadTemplate, substituteVars } from '../templates/index.js';
|
|
8
|
+
export async function promptOverride(name, location) {
|
|
9
|
+
try {
|
|
10
|
+
return await confirm({
|
|
11
|
+
message: `PRD '${name}' already exists (${location}). Override?`,
|
|
12
|
+
default: false,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Ctrl+C
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
7
20
|
export async function prdAdd(path, name, opts) {
|
|
8
21
|
// Validate agent
|
|
9
22
|
if (!isValidAgent(opts.agent)) {
|
|
@@ -19,23 +32,33 @@ export async function prdAdd(path, name, opts) {
|
|
|
19
32
|
console.error(chalk.red(`File not found: ${path}`));
|
|
20
33
|
process.exit(1);
|
|
21
34
|
}
|
|
22
|
-
// Check
|
|
23
|
-
// For initialized projects, only check local; otherwise check global
|
|
35
|
+
// Check PRD file status in target location
|
|
24
36
|
const isInitialized = await isProjectInitialized();
|
|
25
37
|
const checkLocation = isInitialized ? 'local' : 'global';
|
|
26
|
-
|
|
27
|
-
const locationLabel = isInitialized ? 'local' : 'global';
|
|
28
|
-
console.error(chalk.red(`PRD already exists (${locationLabel}): ${name}`));
|
|
29
|
-
process.exit(1);
|
|
30
|
-
}
|
|
38
|
+
const fileStatus = await getPrdFileStatus(name, checkLocation);
|
|
31
39
|
const prdDir = await getPrdDir(name, 'write');
|
|
32
40
|
const prdJsonPath = join(prdDir, 'prd.json');
|
|
33
41
|
const progressPath = join(prdDir, 'progress.txt');
|
|
42
|
+
// Handle based on file status
|
|
43
|
+
if (fileStatus === 'complete') {
|
|
44
|
+
// Fully registered PRD exists - prompt for override
|
|
45
|
+
const locationLabel = isInitialized ? 'local' : 'global';
|
|
46
|
+
const shouldOverride = await promptOverride(name, locationLabel);
|
|
47
|
+
if (!shouldOverride) {
|
|
48
|
+
console.log(chalk.gray('PRD creation cancelled'));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
34
52
|
console.log(chalk.blue(`Creating PRD: ${name}`));
|
|
35
|
-
// Create folder and copy markdown
|
|
53
|
+
// Create folder and copy markdown (skip copy if partial - md already exists)
|
|
36
54
|
await createPrdFolder(name);
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
if (fileStatus !== 'partial') {
|
|
56
|
+
await copyMarkdown(path, name);
|
|
57
|
+
console.log(chalk.gray(` Copied ${path} → prd.md`));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(chalk.gray(` Using existing prd.md`));
|
|
61
|
+
}
|
|
39
62
|
// Ensure templates and load prd-md-to-json
|
|
40
63
|
await ensureTemplates();
|
|
41
64
|
const template = await loadTemplate('prd-md-to-json');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd-add.js","sourceRoot":"","sources":["../../src/commands/prd-add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"prd-add.js","sourceRoot":"","sources":["../../src/commands/prd-add.ts"],"names":[],"mappings":"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"}
|
package/dist/init/templates.d.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
export declare class
|
|
1
|
+
export declare class BundledTemplateNotFoundError extends Error {
|
|
2
2
|
readonly path: string;
|
|
3
3
|
constructor(path: string);
|
|
4
4
|
}
|
|
5
5
|
export declare function getClaudeDir(): string;
|
|
6
|
-
export declare function getSourceSkillPath(): string;
|
|
7
|
-
export declare function getSourceCommandPath(): string;
|
|
8
6
|
export declare function getTargetSkillDir(): string;
|
|
9
7
|
export declare function getTargetSkillPath(): string;
|
|
10
8
|
export declare function getTargetCommandPath(): string;
|
|
11
|
-
export declare function
|
|
12
|
-
export declare function
|
|
13
|
-
export declare function
|
|
14
|
-
export declare function
|
|
9
|
+
export declare function getBundledSkillPath(): string;
|
|
10
|
+
export declare function getBundledCommandPath(): string;
|
|
11
|
+
export declare function loadBundledSkill(): Promise<string>;
|
|
12
|
+
export declare function loadBundledCommand(): Promise<string>;
|
|
15
13
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAQA,qBAAa,4BAA6B,SAAQ,KAAK;aACzB,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAIzC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAOxD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAO1D"}
|
package/dist/init/templates.js
CHANGED
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
export class BundledTemplateNotFoundError extends Error {
|
|
5
8
|
path;
|
|
6
9
|
constructor(path) {
|
|
7
|
-
super(`
|
|
10
|
+
super(`Bundled template not found: ${path}. This is a packaging error.`);
|
|
8
11
|
this.path = path;
|
|
9
|
-
this.name = '
|
|
12
|
+
this.name = 'BundledTemplateNotFoundError';
|
|
10
13
|
}
|
|
11
14
|
}
|
|
12
15
|
export function getClaudeDir() {
|
|
13
16
|
return join(homedir(), '.claude');
|
|
14
17
|
}
|
|
15
|
-
export function getSourceSkillPath() {
|
|
16
|
-
return join(getClaudeDir(), 'skills', 'prd', 'SKILL.md');
|
|
17
|
-
}
|
|
18
|
-
export function getSourceCommandPath() {
|
|
19
|
-
return join(getClaudeDir(), 'commands', 'complete-next-task.md');
|
|
20
|
-
}
|
|
21
18
|
export function getTargetSkillDir() {
|
|
22
19
|
return join(getClaudeDir(), 'skills', 'ralph-prd');
|
|
23
20
|
}
|
|
@@ -27,52 +24,28 @@ export function getTargetSkillPath() {
|
|
|
27
24
|
export function getTargetCommandPath() {
|
|
28
25
|
return join(getClaudeDir(), 'commands', 'ralph-complete-next-task.md');
|
|
29
26
|
}
|
|
30
|
-
export
|
|
31
|
-
|
|
27
|
+
export function getBundledSkillPath() {
|
|
28
|
+
return join(__dirname, '../../templates/ralph-prd-skill.md');
|
|
29
|
+
}
|
|
30
|
+
export function getBundledCommandPath() {
|
|
31
|
+
return join(__dirname, '../../templates/ralph-complete-next-task-command.md');
|
|
32
|
+
}
|
|
33
|
+
export async function loadBundledSkill() {
|
|
34
|
+
const path = getBundledSkillPath();
|
|
32
35
|
try {
|
|
33
36
|
return await readFile(path, 'utf-8');
|
|
34
37
|
}
|
|
35
38
|
catch {
|
|
36
|
-
throw new
|
|
39
|
+
throw new BundledTemplateNotFoundError(path);
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
|
-
export async function
|
|
40
|
-
const path =
|
|
42
|
+
export async function loadBundledCommand() {
|
|
43
|
+
const path = getBundledCommandPath();
|
|
41
44
|
try {
|
|
42
45
|
return await readFile(path, 'utf-8');
|
|
43
46
|
}
|
|
44
47
|
catch {
|
|
45
|
-
throw new
|
|
48
|
+
throw new BundledTemplateNotFoundError(path);
|
|
46
49
|
}
|
|
47
50
|
}
|
|
48
|
-
export function transformSkillContent(content) {
|
|
49
|
-
// Transform skill to output PRDs to .ralph/prd/ instead of project root
|
|
50
|
-
let transformed = content;
|
|
51
|
-
// Update skill name and description
|
|
52
|
-
transformed = transformed.replace(/^---\nname: prd\n/m, '---\nname: ralph-prd\n');
|
|
53
|
-
// Update output path: prd-<feature-name>.md -> .ralph/prd/<name>/prd.md
|
|
54
|
-
transformed = transformed.replace(/`prd-<feature-name>\.md`/g, '`.ralph/prd/<feature-name>/prd.md`');
|
|
55
|
-
transformed = transformed.replace(/`prd-<name>\.md`/g, '`.ralph/prd/<name>/prd.md`');
|
|
56
|
-
// Update "Generate markdown PRD to..." instructions
|
|
57
|
-
transformed = transformed.replace(/Generate markdown PRD to `prd-<feature-name>\.md` in project root/g, 'Generate markdown PRD to `.ralph/prd/<feature-name>/prd.md`');
|
|
58
|
-
// Update "Save to" instructions
|
|
59
|
-
transformed = transformed.replace(/Save to `prd-<feature-name>\.md` \(project root\):/g, 'Save to `.ralph/prd/<feature-name>/prd.md`:');
|
|
60
|
-
// Update post-creation message
|
|
61
|
-
transformed = transformed.replace(/PRD saved to prd-<name>\.md/g, 'PRD saved to .ralph/prd/<name>/prd.md');
|
|
62
|
-
return transformed;
|
|
63
|
-
}
|
|
64
|
-
export function transformCommandContent(content) {
|
|
65
|
-
// Transform command to read from .ralph/ instead of .claude/state/
|
|
66
|
-
let transformed = content;
|
|
67
|
-
// Update command name in usage
|
|
68
|
-
transformed = transformed.replace(/\/complete-next-task/g, '/ralph-complete-next-task');
|
|
69
|
-
// Update state directory references
|
|
70
|
-
transformed = transformed.replace(/\.claude\/state\//g, '.ralph/prd/');
|
|
71
|
-
transformed = transformed.replace(/\.claude\/state/g, '.ralph/prd');
|
|
72
|
-
// Update the bash find function
|
|
73
|
-
transformed = transformed.replace(/find_claude_state/g, 'find_ralph_state');
|
|
74
|
-
// Update <state-dir> references
|
|
75
|
-
transformed = transformed.replace(/<state-dir>/g, '<ralph-dir>');
|
|
76
|
-
return transformed;
|
|
77
|
-
}
|
|
78
51
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACzB;IAA5B,YAA4B,IAAY;QACtC,KAAK,CAAC,+BAA+B,IAAI,8BAA8B,CAAC,CAAA;QAD9C,SAAI,GAAJ,IAAI,CAAQ;QAEtC,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,CAAC;CACF;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,6BAA6B,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,SAAS,EAAE,qDAAqD,CAAC,CAAA;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAA;IAClC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAA;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
|
package/dist/prd/manager.d.ts
CHANGED
|
@@ -4,6 +4,14 @@ export declare function getGlobalPrdsDir(): string;
|
|
|
4
4
|
export declare function getPrdsDir(): string;
|
|
5
5
|
export declare function getLocalPrdDir(name: string): string;
|
|
6
6
|
export declare function getGlobalPrdDir(name: string): string;
|
|
7
|
+
export type PrdFileStatus = 'none' | 'partial' | 'complete';
|
|
8
|
+
/**
|
|
9
|
+
* Check what PRD files exist in the target directory.
|
|
10
|
+
* - 'none': directory doesn't exist or is empty
|
|
11
|
+
* - 'partial': only prd.md exists (skill-created scenario)
|
|
12
|
+
* - 'complete': prd.md + prd.json + progress.txt all exist (fully registered)
|
|
13
|
+
*/
|
|
14
|
+
export declare function getPrdFileStatus(name: string, location: 'local' | 'global'): Promise<PrdFileStatus>;
|
|
7
15
|
export declare function isProjectInitialized(): Promise<boolean>;
|
|
8
16
|
export declare function getPrdDir(name: string, mode?: PrdDirMode): Promise<string>;
|
|
9
17
|
export declare function prdExists(name: string, location?: 'local' | 'global'): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/prd/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,OAAO,EACP,WAAW,EACX,SAAS,EAEV,MAAM,YAAY,CAAA;AAEnB,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/prd/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,OAAO,EACP,WAAW,EACX,SAAS,EAEV,MAAM,YAAY,CAAA;AAEnB,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAoBD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAE3D;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAC3B,OAAO,CAAC,aAAa,CAAC,CAoBxB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG7D;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAC5B,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,WAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3E;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB3D;AA8BD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAiDrD"}
|
package/dist/prd/manager.js
CHANGED
|
@@ -25,6 +25,37 @@ async function dirExists(path) {
|
|
|
25
25
|
return false;
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
async function fileExists(path) {
|
|
29
|
+
try {
|
|
30
|
+
await access(path);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check what PRD files exist in the target directory.
|
|
39
|
+
* - 'none': directory doesn't exist or is empty
|
|
40
|
+
* - 'partial': only prd.md exists (skill-created scenario)
|
|
41
|
+
* - 'complete': prd.md + prd.json + progress.txt all exist (fully registered)
|
|
42
|
+
*/
|
|
43
|
+
export async function getPrdFileStatus(name, location) {
|
|
44
|
+
const dir = location === 'local' ? getLocalPrdDir(name) : getGlobalPrdDir(name);
|
|
45
|
+
if (!(await dirExists(dir))) {
|
|
46
|
+
return 'none';
|
|
47
|
+
}
|
|
48
|
+
const hasMd = await fileExists(join(dir, 'prd.md'));
|
|
49
|
+
const hasJson = await fileExists(join(dir, 'prd.json'));
|
|
50
|
+
const hasProgress = await fileExists(join(dir, 'progress.txt'));
|
|
51
|
+
if (hasMd && hasJson && hasProgress) {
|
|
52
|
+
return 'complete';
|
|
53
|
+
}
|
|
54
|
+
if (hasMd) {
|
|
55
|
+
return 'partial';
|
|
56
|
+
}
|
|
57
|
+
return 'none';
|
|
58
|
+
}
|
|
28
59
|
export async function isProjectInitialized() {
|
|
29
60
|
const localRalphDir = join(process.cwd(), '.ralph');
|
|
30
61
|
return dirExists(localRalphDir);
|
package/dist/prd/manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/prd/manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/prd/manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rlph-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Loop coding agent CLI - run agents headlessly in a loop",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"ralph": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
|
-
"dist"
|
|
10
|
+
"dist",
|
|
11
|
+
"templates"
|
|
11
12
|
],
|
|
12
13
|
"engines": {
|
|
13
14
|
"node": ">=18"
|
|
@@ -19,7 +20,8 @@
|
|
|
19
20
|
"test:watch": "vitest",
|
|
20
21
|
"test:coverage": "vitest run --coverage",
|
|
21
22
|
"prepublishOnly": "bun run build",
|
|
22
|
-
"release": "semantic-release"
|
|
23
|
+
"release": "semantic-release",
|
|
24
|
+
"docker-test": "./scripts/docker-test.sh"
|
|
23
25
|
},
|
|
24
26
|
"keywords": [
|
|
25
27
|
"cli",
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Complete Next Task
|
|
2
|
+
|
|
3
|
+
Complete the next incomplete task from a PRD.
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
- PRD Name: `$PRD_NAME`
|
|
8
|
+
- PRD Path: `$PRD_PATH`
|
|
9
|
+
- PRD Markdown: `$PRD_MD_PATH`
|
|
10
|
+
- Working Directory: `$CWD`
|
|
11
|
+
|
|
12
|
+
## Process
|
|
13
|
+
|
|
14
|
+
### 1. Get Bearings
|
|
15
|
+
|
|
16
|
+
- Read progress file at `$PRD_PATH/../progress.txt` - check "Codebase Patterns" section first
|
|
17
|
+
- Read PRD markdown at `$PRD_MD_PATH` for full context and intent
|
|
18
|
+
- Read PRD JSON at `$PRD_PATH` - find next task with `passes: false`
|
|
19
|
+
- Check recent git history: `git log --oneline -10`
|
|
20
|
+
|
|
21
|
+
### 2. Branch Setup
|
|
22
|
+
|
|
23
|
+
If not on the `$PRD_NAME` branch:
|
|
24
|
+
- `git checkout $PRD_NAME` (or `git checkout -b $PRD_NAME` if new)
|
|
25
|
+
|
|
26
|
+
### 3. Implement Task
|
|
27
|
+
|
|
28
|
+
Work on the single task. Follow steps in the task definition.
|
|
29
|
+
|
|
30
|
+
### 4. Feedback Loops (REQUIRED)
|
|
31
|
+
|
|
32
|
+
Before committing, run ALL applicable:
|
|
33
|
+
- Type checking
|
|
34
|
+
- Tests
|
|
35
|
+
- Linting
|
|
36
|
+
- Formatting
|
|
37
|
+
|
|
38
|
+
Do NOT commit if any fail. Fix issues first.
|
|
39
|
+
|
|
40
|
+
### 5. Update PRD
|
|
41
|
+
|
|
42
|
+
Set the completed task's `passes` field to `true` in the PRD file.
|
|
43
|
+
|
|
44
|
+
### 6. Update Progress
|
|
45
|
+
|
|
46
|
+
Append to progress.txt:
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
## Task - [task.id]
|
|
50
|
+
- What was implemented
|
|
51
|
+
- Files changed
|
|
52
|
+
- **Learnings:** patterns, gotchas
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
If you discover a reusable pattern, also add to `## Codebase Patterns` at the top.
|
|
56
|
+
|
|
57
|
+
### 7. Commit
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
git add -A && git commit -m 'feat(<scope>): <description>'
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Completion
|
|
64
|
+
|
|
65
|
+
If all tasks have `passes: true`, output:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
<tasks>COMPLETE</tasks>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Philosophy
|
|
72
|
+
|
|
73
|
+
This codebase will outlive you. Every shortcut becomes someone else's burden. Patterns you establish will be copied. Corners you cut will be cut again.
|
|
74
|
+
|
|
75
|
+
Fight entropy. Leave the codebase better than you found it.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# PRD to JSON Conversion
|
|
2
|
+
|
|
3
|
+
Convert the PRD markdown file to structured JSON.
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
PRD markdown file: `$PRD_PATH`
|
|
8
|
+
|
|
9
|
+
## Output
|
|
10
|
+
|
|
11
|
+
Write JSON to: `$OUTPUT_PATH`
|
|
12
|
+
|
|
13
|
+
Output ONLY the JSON file. No explanations, no markdown, no code blocks.
|
|
14
|
+
|
|
15
|
+
## JSON Schema
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"prdName": "string - kebab-case identifier",
|
|
20
|
+
"tasks": [
|
|
21
|
+
{
|
|
22
|
+
"id": "string - category-number (e.g., types-1)",
|
|
23
|
+
"category": "string - logical grouping",
|
|
24
|
+
"description": "string - what this task accomplishes",
|
|
25
|
+
"steps": ["string - specific verification step"],
|
|
26
|
+
"passes": false
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"context": {
|
|
30
|
+
"patterns": ["string - codebase patterns to follow"],
|
|
31
|
+
"keyFiles": ["string - important file paths"],
|
|
32
|
+
"nonGoals": ["string - explicitly out of scope"]
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Conversion Rules
|
|
38
|
+
|
|
39
|
+
1. **Task Extraction**
|
|
40
|
+
- Each major feature/component = separate task
|
|
41
|
+
- Tasks must be independently completable
|
|
42
|
+
- Order by dependency: foundations first
|
|
43
|
+
|
|
44
|
+
2. **Task IDs**
|
|
45
|
+
- Format: `<category>-<number>`
|
|
46
|
+
- Categories: types, templates, manager, command, cli, testing, cleanup
|
|
47
|
+
- Number sequentially within category
|
|
48
|
+
|
|
49
|
+
3. **Steps**
|
|
50
|
+
- Concrete, verifiable outcomes
|
|
51
|
+
- Should be testable/checkable
|
|
52
|
+
- Include "tests pass" where applicable
|
|
53
|
+
|
|
54
|
+
4. **passes Field**
|
|
55
|
+
- Always set to `false` for new tasks
|
|
56
|
+
- Agent marks `true` after completing task
|
|
57
|
+
|
|
58
|
+
5. **Context**
|
|
59
|
+
- Extract patterns from PRD intro/overview
|
|
60
|
+
- List key files mentioned in PRD
|
|
61
|
+
- Extract non-goals/out-of-scope items
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Complete the next incomplete task from a PRD
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Complete one task from a PRD file. Implements the next task with `passes: false`, runs feedback loops, and commits.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
/ralph-complete-next-task <prd-name>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Where `<prd-name>` matches `.ralph/prd/<prd-name>/prd.json`
|
|
14
|
+
|
|
15
|
+
## Before Starting
|
|
16
|
+
|
|
17
|
+
First, invoke the skill tool to detect the VCS:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
skill({ name: 'vcs-detect' })
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Use the detected VCS (jj or git) for all version control operations.
|
|
24
|
+
|
|
25
|
+
## File Locations
|
|
26
|
+
|
|
27
|
+
**IMPORTANT**: The `.ralph/prd/` directory may not be at cwd. Search for it:
|
|
28
|
+
|
|
29
|
+
1. Start at cwd
|
|
30
|
+
2. Check if `.ralph/prd/<prd-name>/prd.json` exists
|
|
31
|
+
3. If not, go up one directory
|
|
32
|
+
4. Repeat until found or reaching filesystem root
|
|
33
|
+
|
|
34
|
+
Use this bash to find the state directory:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
find_ralph_state() {
|
|
38
|
+
local prd="$1"
|
|
39
|
+
local dir="$PWD"
|
|
40
|
+
while [[ "$dir" != "/" ]]; do
|
|
41
|
+
if [[ -f "$dir/.ralph/prd/$prd/prd.json" ]]; then
|
|
42
|
+
echo "$dir/.ralph/prd/$prd"
|
|
43
|
+
return 0
|
|
44
|
+
fi
|
|
45
|
+
dir="$(dirname "$dir")"
|
|
46
|
+
done
|
|
47
|
+
return 1
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Once found, use **absolute paths** for all file operations:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
<ralph-dir>/
|
|
55
|
+
├── prd.json # Task list with passes field
|
|
56
|
+
└── progress.txt # Cross-iteration memory
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Process
|
|
60
|
+
|
|
61
|
+
### 1. Get Bearings
|
|
62
|
+
|
|
63
|
+
- Read progress file - **CHECK 'Codebase Patterns' SECTION FIRST**
|
|
64
|
+
- Read PRD - find next task with `passes: false`
|
|
65
|
+
- **Task Priority** (highest to lowest):
|
|
66
|
+
1. Architecture/core abstractions
|
|
67
|
+
2. Integration points
|
|
68
|
+
3. Spikes/unknowns
|
|
69
|
+
4. Standard features
|
|
70
|
+
5. Polish/cleanup
|
|
71
|
+
- Check recent history (jj: `jj log --limit 10`, git: `git log --oneline -10`)
|
|
72
|
+
|
|
73
|
+
### 2. Initialize Progress (if needed)
|
|
74
|
+
|
|
75
|
+
If progress.txt doesn't exist, create it:
|
|
76
|
+
|
|
77
|
+
```markdown
|
|
78
|
+
# Progress Log
|
|
79
|
+
PRD: <prdName from PRD>
|
|
80
|
+
Started: <YYYY-MM-DD>
|
|
81
|
+
|
|
82
|
+
## Codebase Patterns
|
|
83
|
+
<!-- Consolidate reusable patterns here -->
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
<!-- Task logs below - APPEND ONLY -->
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. Branch Setup
|
|
90
|
+
|
|
91
|
+
Extract `prdName` from PRD, then:
|
|
92
|
+
- jj: `jj new -m '<prdName>'`
|
|
93
|
+
- git: `git checkout -b <prdName>` (or checkout if exists)
|
|
94
|
+
|
|
95
|
+
### 4. Implement Task
|
|
96
|
+
|
|
97
|
+
Work on the single task until verification steps pass.
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
### 5. Feedback Loops (REQUIRED)
|
|
101
|
+
|
|
102
|
+
Before committing, run ALL applicable:
|
|
103
|
+
- Type checking
|
|
104
|
+
- Tests
|
|
105
|
+
- Linting
|
|
106
|
+
- Formatting
|
|
107
|
+
|
|
108
|
+
**Do NOT commit if any fail.** Fix issues first.
|
|
109
|
+
|
|
110
|
+
### 6. Update PRD
|
|
111
|
+
|
|
112
|
+
Set the task's `passes` field to `true` in the PRD file.
|
|
113
|
+
|
|
114
|
+
### 7. Update Progress
|
|
115
|
+
|
|
116
|
+
Append to progress.txt:
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
## Task - [task.id]
|
|
120
|
+
- What was implemented
|
|
121
|
+
- Files changed
|
|
122
|
+
- **Learnings:** patterns, gotchas
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
If you discover a **reusable pattern**, also add to `## Codebase Patterns` at the TOP.
|
|
126
|
+
|
|
127
|
+
### 8. Commit
|
|
128
|
+
|
|
129
|
+
- jj: `jj describe -m 'feat(<scope>): <description>' && jj bookmark create <prdName>/<task-id> && jj new`
|
|
130
|
+
- git: `git add -A && git commit -m 'feat(<scope>): <description>'`
|
|
131
|
+
|
|
132
|
+
Bookmark format: `<prdName>/<task-id>` (e.g., `lib-relay-implementation/types-2`)
|
|
133
|
+
|
|
134
|
+
## Completion
|
|
135
|
+
|
|
136
|
+
If all tasks have `passes: true`, output:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
<tasks>COMPLETE</tasks>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Philosophy
|
|
143
|
+
|
|
144
|
+
This codebase will outlive you. Every shortcut becomes someone else's burden. Patterns you establish will be copied. Corners you cut will be cut again.
|
|
145
|
+
|
|
146
|
+
Fight entropy. Leave the codebase better than you found it.
|
|
147
|
+
|
|
148
|
+
<user-request>
|
|
149
|
+
$ARGUMENTS
|
|
150
|
+
</user-request>
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ralph-prd
|
|
3
|
+
description: Create Product Requirements Documents (PRDs) that define the end state of a feature. Use when planning new features, migrations, or refactors. Generates structured PRDs with acceptance criteria.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PRD Creation Skill
|
|
7
|
+
|
|
8
|
+
Create Product Requirements Documents suitable for RFC review by Principal Engineers, Designers, and Product Owners.
|
|
9
|
+
|
|
10
|
+
The PRD describes WHAT to build and WHY, not HOW or in WHAT ORDER.
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. User requests: "Load the prd skill and create a PRD for [feature]"
|
|
15
|
+
2. **Ask clarifying questions** to build full understanding
|
|
16
|
+
3. **Explore codebase** to understand patterns, constraints, and dependencies
|
|
17
|
+
4. Generate markdown PRD to `.ralph/prd/<feature-name>/prd.md`
|
|
18
|
+
|
|
19
|
+
## Clarifying Questions
|
|
20
|
+
|
|
21
|
+
Ask questions across these domains.
|
|
22
|
+
|
|
23
|
+
### Problem & Motivation
|
|
24
|
+
- What problem does this solve? Who experiences it?
|
|
25
|
+
- What's the cost of NOT solving this? (user pain, revenue, tech debt)
|
|
26
|
+
- Why now? What triggered this work?
|
|
27
|
+
|
|
28
|
+
### Users & Stakeholders
|
|
29
|
+
- Who are the primary users? Secondary users?
|
|
30
|
+
|
|
31
|
+
### End State & Success
|
|
32
|
+
- What does "done" look like? How will users interact with it?
|
|
33
|
+
|
|
34
|
+
### Scope & Boundaries
|
|
35
|
+
- What's explicitly OUT of scope?
|
|
36
|
+
- What's deferred to future iterations?
|
|
37
|
+
- Are there adjacent features that must NOT be affected?
|
|
38
|
+
|
|
39
|
+
### Constraints & Requirements
|
|
40
|
+
- Performance requirements?
|
|
41
|
+
- Security requirements? (auth, data sensitivity, compliance)
|
|
42
|
+
- Compatibility requirements? (browsers, versions, APIs)
|
|
43
|
+
- Accessibility requirements? (WCAG level, screen readers)
|
|
44
|
+
|
|
45
|
+
### Risks & Dependencies
|
|
46
|
+
- What could go wrong? Technical risks?
|
|
47
|
+
- External service dependencies?
|
|
48
|
+
- What decisions are still open/contentious?
|
|
49
|
+
|
|
50
|
+
Keep questions concise. 5-7 at most.
|
|
51
|
+
|
|
52
|
+
## Output Format
|
|
53
|
+
|
|
54
|
+
Save to `.ralph/prd/<feature-name>/prd.md`:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
# PRD: <Feature Name>
|
|
58
|
+
|
|
59
|
+
**Date:** <YYYY-MM-DD>
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Problem Statement
|
|
64
|
+
|
|
65
|
+
### What problem are we solving?
|
|
66
|
+
Clear description of the problem. Include user impact and business impact.
|
|
67
|
+
|
|
68
|
+
### Why now?
|
|
69
|
+
What triggered this work? Cost of inaction?
|
|
70
|
+
|
|
71
|
+
### Who is affected?
|
|
72
|
+
- **Primary users:** Description
|
|
73
|
+
- **Secondary users:** Description
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Proposed Solution
|
|
78
|
+
|
|
79
|
+
### Overview
|
|
80
|
+
One paragraph describing what this feature does when complete.
|
|
81
|
+
|
|
82
|
+
### User Experience (if applicable)
|
|
83
|
+
<!-- Include for user-facing features -->
|
|
84
|
+
How will users interact with this feature? Include user flows for primary scenarios.
|
|
85
|
+
|
|
86
|
+
#### User Flow: <Scenario Name>
|
|
87
|
+
1. User does X
|
|
88
|
+
2. System responds with Y
|
|
89
|
+
3. User sees Z
|
|
90
|
+
|
|
91
|
+
### Design Considerations (if applicable)
|
|
92
|
+
<!-- Include for features with UI/UX components -->
|
|
93
|
+
- Visual/interaction requirements
|
|
94
|
+
- Accessibility requirements (WCAG level)
|
|
95
|
+
- Platform-specific considerations
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## End State
|
|
100
|
+
|
|
101
|
+
When this PRD is complete, the following will be true:
|
|
102
|
+
|
|
103
|
+
- [ ] Capability 1 exists and works
|
|
104
|
+
- [ ] Capability 2 exists and works
|
|
105
|
+
- [ ] All acceptance criteria pass
|
|
106
|
+
- [ ] Tests cover the new functionality
|
|
107
|
+
- [ ] Documentation is updated
|
|
108
|
+
- [ ] Observability/monitoring is in place
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Success Metrics
|
|
113
|
+
|
|
114
|
+
### Quantitative
|
|
115
|
+
| Metric | Current | Target | Measurement Method |
|
|
116
|
+
|--------|---------|--------|-------------------|
|
|
117
|
+
| Metric 1 | X | Y | How measured |
|
|
118
|
+
| Metric 2 | X | Y | How measured |
|
|
119
|
+
|
|
120
|
+
### Qualitative
|
|
121
|
+
- User feedback criteria
|
|
122
|
+
- Team/process improvements expected
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Acceptance Criteria
|
|
127
|
+
|
|
128
|
+
### Feature: <Name>
|
|
129
|
+
- [ ] Criterion 1
|
|
130
|
+
- [ ] Criterion 2
|
|
131
|
+
- [ ] Criterion 3
|
|
132
|
+
|
|
133
|
+
### Feature: <Name>
|
|
134
|
+
- [ ] Criterion 1
|
|
135
|
+
- [ ] Criterion 2
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Technical Context
|
|
140
|
+
|
|
141
|
+
### Existing Patterns
|
|
142
|
+
- Pattern 1: `src/path/to/example.ts` - Why relevant
|
|
143
|
+
- Pattern 2: `src/path/to/example.ts` - Why relevant
|
|
144
|
+
|
|
145
|
+
### Key Files
|
|
146
|
+
- `src/relevant/file.ts` - Description of relevance
|
|
147
|
+
- `src/another/file.ts` - Description of relevance
|
|
148
|
+
|
|
149
|
+
### System Dependencies
|
|
150
|
+
- External services/APIs
|
|
151
|
+
- Package requirements
|
|
152
|
+
- Infrastructure requirements
|
|
153
|
+
|
|
154
|
+
### Data Model Changes
|
|
155
|
+
<!-- If applicable -->
|
|
156
|
+
- New entities/tables
|
|
157
|
+
- Schema migrations required
|
|
158
|
+
- Data backfill considerations
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Risks & Mitigations
|
|
163
|
+
|
|
164
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
165
|
+
|------|------------|--------|------------|
|
|
166
|
+
| Risk 1 | High/Med/Low | High/Med/Low | How to mitigate |
|
|
167
|
+
| Risk 2 | High/Med/Low | High/Med/Low | How to mitigate |
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Alternatives Considered
|
|
172
|
+
|
|
173
|
+
### Alternative 1: <Name>
|
|
174
|
+
- **Description:** Brief description
|
|
175
|
+
- **Pros:** What's good about it
|
|
176
|
+
- **Cons:** Why we didn't choose it
|
|
177
|
+
- **Decision:** Why rejected
|
|
178
|
+
|
|
179
|
+
### Alternative 2: <Name>
|
|
180
|
+
- **Description:** Brief description
|
|
181
|
+
- **Pros:** What's good about it
|
|
182
|
+
- **Cons:** Why we didn't choose it
|
|
183
|
+
- **Decision:** Why rejected
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Non-Goals (v1)
|
|
187
|
+
|
|
188
|
+
Explicitly out of scope for this PRD:
|
|
189
|
+
- Thing we're not building - why deferred
|
|
190
|
+
- Future enhancement - why deferred
|
|
191
|
+
- Related feature that's separate - why separate
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Interface Specifications
|
|
196
|
+
|
|
197
|
+
### CLI (if applicable)
|
|
198
|
+
```
|
|
199
|
+
command-name [args] [options]
|
|
200
|
+
|
|
201
|
+
Options:
|
|
202
|
+
--flag Description
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### API (if applicable)
|
|
206
|
+
```
|
|
207
|
+
POST /api/endpoint
|
|
208
|
+
Request: { field: type }
|
|
209
|
+
Response: { field: type }
|
|
210
|
+
Errors: 4xx/5xx scenarios
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### UI (if applicable)
|
|
214
|
+
Component behavior, states, and error handling.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Documentation Requirements
|
|
219
|
+
|
|
220
|
+
- [ ] User-facing documentation updates
|
|
221
|
+
- [ ] API documentation updates
|
|
222
|
+
- [ ] Internal runbook/playbook updates
|
|
223
|
+
- [ ] Architecture decision records (ADRs)
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Open Questions
|
|
228
|
+
|
|
229
|
+
| Question | Owner | Due Date | Status |
|
|
230
|
+
|----------|-------|----------|--------|
|
|
231
|
+
| Question 1 | Name | Date | Open/Resolved |
|
|
232
|
+
| Question 2 | Name | Date | Open/Resolved |
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Appendix
|
|
237
|
+
|
|
238
|
+
### Glossary
|
|
239
|
+
- **Term:** Definition
|
|
240
|
+
|
|
241
|
+
### References
|
|
242
|
+
- Link to related PRDs, ADRs, designs
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Key Principles
|
|
246
|
+
|
|
247
|
+
### Problem Before Solution
|
|
248
|
+
- Lead with the problem, not the solution
|
|
249
|
+
- Quantify the impact of NOT solving this
|
|
250
|
+
- Make the case for why this work matters
|
|
251
|
+
|
|
252
|
+
### Define End State, Not Process
|
|
253
|
+
- Describe WHAT exists when done
|
|
254
|
+
- Don't prescribe implementation order
|
|
255
|
+
- Don't assign priorities
|
|
256
|
+
- Don't create phases
|
|
257
|
+
|
|
258
|
+
### Technical Context Enables Autonomy
|
|
259
|
+
- Show existing patterns to follow
|
|
260
|
+
- Reference key files agent should explore
|
|
261
|
+
- Agent uses this to make informed decisions
|
|
262
|
+
|
|
263
|
+
### Non-Goals Prevent Scope Creep
|
|
264
|
+
- Explicit boundaries help agent stay focused
|
|
265
|
+
- Agent won't accidentally build deferred features
|
|
266
|
+
|
|
267
|
+
### Risks & Alternatives Show Rigor
|
|
268
|
+
- Demonstrate you've thought through what could go wrong
|
|
269
|
+
- Show alternatives considered and why rejected
|
|
270
|
+
- Builds confidence in the proposed approach
|
|
271
|
+
|
|
272
|
+
## Bad vs Good Examples
|
|
273
|
+
|
|
274
|
+
### Bad (Prescriptive / Thin)
|
|
275
|
+
```markdown
|
|
276
|
+
## Implementation Phases
|
|
277
|
+
|
|
278
|
+
### Phase 1: Database
|
|
279
|
+
1. Create users table
|
|
280
|
+
2. Add indexes
|
|
281
|
+
|
|
282
|
+
### Phase 2: API
|
|
283
|
+
1. Build registration endpoint
|
|
284
|
+
2. Build login endpoint
|
|
285
|
+
|
|
286
|
+
### Phase 3: Tests
|
|
287
|
+
1. Write unit tests
|
|
288
|
+
2. Write integration tests
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Bad (Missing RFC Context)
|
|
292
|
+
```markdown
|
|
293
|
+
## Overview
|
|
294
|
+
We need user authentication.
|
|
295
|
+
|
|
296
|
+
## Acceptance Criteria
|
|
297
|
+
- [ ] Users can register
|
|
298
|
+
- [ ] Users can log in
|
|
299
|
+
```
|
|
300
|
+
Missing: Why? What problem? Success metrics? Risks? Alternatives?
|
|
301
|
+
|
|
302
|
+
### Good (RFC-Ready)
|
|
303
|
+
```markdown
|
|
304
|
+
## Problem Statement
|
|
305
|
+
|
|
306
|
+
### What problem are we solving?
|
|
307
|
+
Users currently can't persist data across sessions. 47% of users drop off
|
|
308
|
+
when asked to re-enter information. This costs ~$50k/month in lost conversions.
|
|
309
|
+
|
|
310
|
+
### Why now?
|
|
311
|
+
Q4 retention initiative. Competitor X launched auth last month.
|
|
312
|
+
|
|
313
|
+
### Who is affected?
|
|
314
|
+
- **Primary users:** End users who want persistent sessions
|
|
315
|
+
- **Secondary users:** Support team handling "lost data" tickets (~200/week)
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
## End State
|
|
319
|
+
|
|
320
|
+
When complete:
|
|
321
|
+
- [ ] Users can register with email/password
|
|
322
|
+
- [ ] Users can log in and receive JWT
|
|
323
|
+
- [ ] Auth endpoints have >80% test coverage
|
|
324
|
+
- [ ] Monitoring dashboards track auth success/failure rates
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Acceptance Criteria
|
|
329
|
+
|
|
330
|
+
### Registration
|
|
331
|
+
- [ ] POST /api/auth/register creates user
|
|
332
|
+
- [ ] Password is hashed (bcrypt, cost factor 12)
|
|
333
|
+
- [ ] Duplicate email returns 409
|
|
334
|
+
- [ ] Invalid input returns 400 with details
|
|
335
|
+
|
|
336
|
+
### Login
|
|
337
|
+
- [ ] POST /api/auth/login returns JWT
|
|
338
|
+
- [ ] Invalid credentials return 401 (no user enumeration)
|
|
339
|
+
- [ ] Token expires in 24h, refresh token in 7d
|
|
340
|
+
---
|
|
341
|
+
## Risks & Mitigations
|
|
342
|
+
|
|
343
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
344
|
+
|------|------------|--------|------------|
|
|
345
|
+
| Credential stuffing | High | High | Rate limiting + CAPTCHA after 3 failures |
|
|
346
|
+
| Token theft | Med | High | Short expiry + secure cookie flags |
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Alternatives Considered
|
|
351
|
+
|
|
352
|
+
### Alternative 1: OAuth-only (Google/GitHub)
|
|
353
|
+
- **Pros:** No password storage liability
|
|
354
|
+
- **Cons:** Some users don't have/want social accounts
|
|
355
|
+
- **Decision:** Rejected. Add OAuth in v2, but need email/password baseline.
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
## After PRD Creation
|
|
359
|
+
|
|
360
|
+
### RFC Review Checklist
|
|
361
|
+
|
|
362
|
+
Before marking PRD ready for review and sharing with the user, verify:
|
|
363
|
+
|
|
364
|
+
- [ ] Technical risks identified and mitigated
|
|
365
|
+
- [ ] User flows documented (if applicable)
|
|
366
|
+
- [ ] Edge cases and error states covered (if applicable)
|
|
367
|
+
- [ ] Accessibility requirements specified (if applicable)
|
|
368
|
+
- [ ] Design considerations captured (if applicable)
|
|
369
|
+
- [ ] Problem statement is clear and compelling
|
|
370
|
+
- [ ] Scope boundaries explicit
|
|
371
|
+
|
|
372
|
+
### Register the PRD
|
|
373
|
+
|
|
374
|
+
After writing the PRD markdown file, register it with ralph:
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
ralph prd add .ralph/prd/<feature-name>/prd.md <feature-name>
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
This converts the markdown to a structured format for task execution.
|
|
381
|
+
|
|
382
|
+
### Ask About Execution
|
|
383
|
+
|
|
384
|
+
After registration, ask the user:
|
|
385
|
+
|
|
386
|
+
"PRD '<feature-name>' is registered. Would you like to start task execution now?
|
|
387
|
+
|
|
388
|
+
Run `ralph run <feature-name>` from the CLI"
|