openplanr 0.1.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/LICENSE +21 -0
- package/README.md +168 -0
- package/bin/planr.js +2 -0
- package/dist/cli/commands/checklist.d.ts +3 -0
- package/dist/cli/commands/checklist.d.ts.map +1 -0
- package/dist/cli/commands/checklist.js +34 -0
- package/dist/cli/commands/checklist.js.map +1 -0
- package/dist/cli/commands/epic.d.ts +3 -0
- package/dist/cli/commands/epic.d.ts.map +1 -0
- package/dist/cli/commands/epic.js +61 -0
- package/dist/cli/commands/epic.js.map +1 -0
- package/dist/cli/commands/feature.d.ts +3 -0
- package/dist/cli/commands/feature.d.ts.map +1 -0
- package/dist/cli/commands/feature.js +65 -0
- package/dist/cli/commands/feature.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +49 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +3 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +48 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +38 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/story.d.ts +3 -0
- package/dist/cli/commands/story.d.ts.map +1 -0
- package/dist/cli/commands/story.js +81 -0
- package/dist/cli/commands/story.js.map +1 -0
- package/dist/cli/commands/task.d.ts +3 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +76 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +27 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/generators/base-generator.d.ts +9 -0
- package/dist/generators/base-generator.d.ts.map +1 -0
- package/dist/generators/base-generator.js +9 -0
- package/dist/generators/base-generator.js.map +1 -0
- package/dist/generators/claude-generator.d.ts +7 -0
- package/dist/generators/claude-generator.d.ts.map +1 -0
- package/dist/generators/claude-generator.js +27 -0
- package/dist/generators/claude-generator.js.map +1 -0
- package/dist/generators/codex-generator.d.ts +7 -0
- package/dist/generators/codex-generator.d.ts.map +1 -0
- package/dist/generators/codex-generator.js +22 -0
- package/dist/generators/codex-generator.js.map +1 -0
- package/dist/generators/cursor-generator.d.ts +7 -0
- package/dist/generators/cursor-generator.d.ts.map +1 -0
- package/dist/generators/cursor-generator.js +37 -0
- package/dist/generators/cursor-generator.js.map +1 -0
- package/dist/generators/generator-factory.d.ts +5 -0
- package/dist/generators/generator-factory.d.ts.map +1 -0
- package/dist/generators/generator-factory.js +19 -0
- package/dist/generators/generator-factory.js.map +1 -0
- package/dist/generators/generator-types.d.ts +4 -0
- package/dist/generators/generator-types.d.ts.map +1 -0
- package/dist/generators/generator-types.js +2 -0
- package/dist/generators/generator-types.js.map +1 -0
- package/dist/models/schema.d.ts +79 -0
- package/dist/models/schema.d.ts.map +1 -0
- package/dist/models/schema.js +22 -0
- package/dist/models/schema.js.map +1 -0
- package/dist/models/types.d.ts +78 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +2 -0
- package/dist/models/types.js.map +1 -0
- package/dist/services/artifact-service.d.ts +17 -0
- package/dist/services/artifact-service.d.ts.map +1 -0
- package/dist/services/artifact-service.js +63 -0
- package/dist/services/artifact-service.js.map +1 -0
- package/dist/services/checklist-service.d.ts +6 -0
- package/dist/services/checklist-service.d.ts.map +1 -0
- package/dist/services/checklist-service.js +26 -0
- package/dist/services/checklist-service.js.map +1 -0
- package/dist/services/config-service.d.ts +5 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +38 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/id-service.d.ts +6 -0
- package/dist/services/id-service.d.ts.map +1 -0
- package/dist/services/id-service.js +22 -0
- package/dist/services/id-service.js.map +1 -0
- package/dist/services/prompt-service.d.ts +9 -0
- package/dist/services/prompt-service.d.ts.map +1 -0
- package/dist/services/prompt-service.js +23 -0
- package/dist/services/prompt-service.js.map +1 -0
- package/dist/services/template-service.d.ts +2 -0
- package/dist/services/template-service.d.ts.map +1 -0
- package/dist/services/template-service.js +32 -0
- package/dist/services/template-service.js.map +1 -0
- package/dist/templates/adrs/adr-general.md.hbs +46 -0
- package/dist/templates/checklists/agile-checklist.md.hbs +49 -0
- package/dist/templates/epics/epic.md.hbs +46 -0
- package/dist/templates/features/feature.md.hbs +42 -0
- package/dist/templates/rules/claude/CLAUDE.md.hbs +63 -0
- package/dist/templates/rules/codex/AGENTS.md.hbs +28 -0
- package/dist/templates/rules/cursor/2000-agile-checklist.mdc.hbs +33 -0
- package/dist/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +35 -0
- package/dist/templates/rules/cursor/2002-agile-create-features.mdc.hbs +35 -0
- package/dist/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +31 -0
- package/dist/templates/rules/cursor/2100-create-task-list.mdc.hbs +36 -0
- package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +28 -0
- package/dist/templates/stories/gherkin.feature.hbs +13 -0
- package/dist/templates/stories/user-story.md.hbs +28 -0
- package/dist/templates/tasks/task-list.md.hbs +24 -0
- package/dist/templates/templates/adrs/adr-general.md.hbs +46 -0
- package/dist/templates/templates/checklists/agile-checklist.md.hbs +49 -0
- package/dist/templates/templates/epics/epic.md.hbs +46 -0
- package/dist/templates/templates/features/feature.md.hbs +42 -0
- package/dist/templates/templates/rules/claude/CLAUDE.md.hbs +63 -0
- package/dist/templates/templates/rules/codex/AGENTS.md.hbs +28 -0
- package/dist/templates/templates/rules/cursor/2000-agile-checklist.mdc.hbs +33 -0
- package/dist/templates/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +35 -0
- package/dist/templates/templates/rules/cursor/2002-agile-create-features.mdc.hbs +35 -0
- package/dist/templates/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +31 -0
- package/dist/templates/templates/rules/cursor/2100-create-task-list.mdc.hbs +36 -0
- package/dist/templates/templates/rules/cursor/2101-implement-task-list.mdc.hbs +28 -0
- package/dist/templates/templates/stories/gherkin.feature.hbs +13 -0
- package/dist/templates/templates/stories/user-story.md.hbs +28 -0
- package/dist/templates/templates/tasks/task-list.md.hbs +24 -0
- package/dist/utils/constants.d.ts +20 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +26 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +26 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +7 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +9 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/slugify.d.ts +2 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +10 -0
- package/dist/utils/slugify.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { loadConfig } from '../../services/config-service.js';
|
|
3
|
+
import { createArtifact, listArtifacts, readArtifact, getArtifactDir, } from '../../services/artifact-service.js';
|
|
4
|
+
import { promptText } from '../../services/prompt-service.js';
|
|
5
|
+
import { renderTemplate } from '../../services/template-service.js';
|
|
6
|
+
import { writeFile } from '../../utils/fs.js';
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
export function registerStoryCommand(program) {
|
|
9
|
+
const story = program.command('story').description('Manage user stories');
|
|
10
|
+
story
|
|
11
|
+
.command('create')
|
|
12
|
+
.description('Create a new user story from a feature')
|
|
13
|
+
.requiredOption('--feature <featureId>', 'parent feature ID (e.g., FEAT-001)')
|
|
14
|
+
.option('--title <title>', 'story title')
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
const projectDir = program.opts().projectDir;
|
|
17
|
+
const config = await loadConfig(projectDir);
|
|
18
|
+
const featureData = await readArtifact(projectDir, config, 'feature', opts.feature);
|
|
19
|
+
if (!featureData) {
|
|
20
|
+
logger.error(`Feature ${opts.feature} not found.`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
logger.heading(`Create User Story (from ${opts.feature})`);
|
|
24
|
+
const title = opts.title || (await promptText('Story title:'));
|
|
25
|
+
const role = await promptText('As a (role):');
|
|
26
|
+
const goal = await promptText('I want to (goal):');
|
|
27
|
+
const benefit = await promptText('So that (benefit):');
|
|
28
|
+
const additionalNotes = await promptText('Additional notes:', '');
|
|
29
|
+
// Create the user story markdown
|
|
30
|
+
const { id, filePath } = await createArtifact(projectDir, config, 'story', 'stories/user-story.md.hbs', {
|
|
31
|
+
title,
|
|
32
|
+
featureId: opts.feature,
|
|
33
|
+
role,
|
|
34
|
+
goal,
|
|
35
|
+
benefit,
|
|
36
|
+
additionalNotes: additionalNotes || undefined,
|
|
37
|
+
});
|
|
38
|
+
// Create companion Gherkin file
|
|
39
|
+
const storyDir = path.join(projectDir, getArtifactDir(config, 'story'));
|
|
40
|
+
const gherkinContent = await renderTemplate('stories/gherkin.feature.hbs', {
|
|
41
|
+
id,
|
|
42
|
+
title,
|
|
43
|
+
role,
|
|
44
|
+
goal,
|
|
45
|
+
benefit,
|
|
46
|
+
scenarios: [
|
|
47
|
+
{
|
|
48
|
+
name: 'Happy path',
|
|
49
|
+
given: 'the preconditions are met',
|
|
50
|
+
when: `the user ${goal.toLowerCase()}`,
|
|
51
|
+
then: 'the expected outcome occurs',
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
}, config.templateOverrides);
|
|
55
|
+
const gherkinPath = path.join(storyDir, `${id}-gherkin.feature`);
|
|
56
|
+
await writeFile(gherkinPath, gherkinContent);
|
|
57
|
+
logger.success(`Created user story ${id}: ${title}`);
|
|
58
|
+
logger.dim(` ${filePath}`);
|
|
59
|
+
logger.dim(` ${gherkinPath}`);
|
|
60
|
+
logger.dim('');
|
|
61
|
+
logger.dim(`Next: planr task create --story ${id}`);
|
|
62
|
+
});
|
|
63
|
+
story
|
|
64
|
+
.command('list')
|
|
65
|
+
.description('List user stories')
|
|
66
|
+
.option('--feature <featureId>', 'filter by feature ID')
|
|
67
|
+
.action(async (opts) => {
|
|
68
|
+
const projectDir = program.opts().projectDir;
|
|
69
|
+
const config = await loadConfig(projectDir);
|
|
70
|
+
const stories = await listArtifacts(projectDir, config, 'story');
|
|
71
|
+
if (stories.length === 0) {
|
|
72
|
+
logger.info('No stories found. Run "planr story create --feature <ID>" to create one.');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
logger.heading('User Stories');
|
|
76
|
+
for (const s of stories) {
|
|
77
|
+
console.log(` ${s.id} ${s.title}`);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=story.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story.js","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAiGnD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { loadConfig } from '../../services/config-service.js';
|
|
2
|
+
import { createArtifact, listArtifacts, readArtifact } from '../../services/artifact-service.js';
|
|
3
|
+
import { promptText, promptMultiText } from '../../services/prompt-service.js';
|
|
4
|
+
import { logger } from '../../utils/logger.js';
|
|
5
|
+
export function registerTaskCommand(program) {
|
|
6
|
+
const task = program.command('task').description('Manage tasks');
|
|
7
|
+
task
|
|
8
|
+
.command('create')
|
|
9
|
+
.description('Create tasks from a user story')
|
|
10
|
+
.requiredOption('--story <storyId>', 'parent user story ID (e.g., US-001)')
|
|
11
|
+
.option('--title <title>', 'task list title')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const projectDir = program.opts().projectDir;
|
|
14
|
+
const config = await loadConfig(projectDir);
|
|
15
|
+
const storyData = await readArtifact(projectDir, config, 'story', opts.story);
|
|
16
|
+
if (!storyData) {
|
|
17
|
+
logger.error(`User story ${opts.story} not found.`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
logger.heading(`Create Tasks (from ${opts.story})`);
|
|
21
|
+
const title = opts.title || (await promptText('Task list title:', `Tasks for ${opts.story}`));
|
|
22
|
+
const taskNames = await promptMultiText('Enter task names', 'comma-separated, e.g.: Setup, Implement API, Write tests');
|
|
23
|
+
const tasks = taskNames.map((name, i) => ({
|
|
24
|
+
id: `${i + 1}.0`,
|
|
25
|
+
title: name,
|
|
26
|
+
status: 'pending',
|
|
27
|
+
subtasks: [],
|
|
28
|
+
}));
|
|
29
|
+
const { id, filePath } = await createArtifact(projectDir, config, 'task', 'tasks/task-list.md.hbs', {
|
|
30
|
+
title,
|
|
31
|
+
storyId: opts.story,
|
|
32
|
+
tasks,
|
|
33
|
+
});
|
|
34
|
+
logger.success(`Created task list ${id}: ${title}`);
|
|
35
|
+
logger.dim(` ${filePath}`);
|
|
36
|
+
logger.dim(` ${tasks.length} tasks created`);
|
|
37
|
+
logger.dim('');
|
|
38
|
+
logger.dim(`Next: planr task implement ${id}`);
|
|
39
|
+
});
|
|
40
|
+
task
|
|
41
|
+
.command('list')
|
|
42
|
+
.description('List task lists')
|
|
43
|
+
.option('--story <storyId>', 'filter by story ID')
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
const projectDir = program.opts().projectDir;
|
|
46
|
+
const config = await loadConfig(projectDir);
|
|
47
|
+
const tasks = await listArtifacts(projectDir, config, 'task');
|
|
48
|
+
if (tasks.length === 0) {
|
|
49
|
+
logger.info('No task lists found. Run "planr task create --story <ID>" to create one.');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
logger.heading('Task Lists');
|
|
53
|
+
for (const t of tasks) {
|
|
54
|
+
console.log(` ${t.id} ${t.title}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
task
|
|
58
|
+
.command('implement')
|
|
59
|
+
.description('Start implementing a task')
|
|
60
|
+
.argument('<taskId>', 'task list ID (e.g., TASK-001)')
|
|
61
|
+
.action(async (taskId) => {
|
|
62
|
+
const projectDir = program.opts().projectDir;
|
|
63
|
+
const config = await loadConfig(projectDir);
|
|
64
|
+
const taskData = await readArtifact(projectDir, config, 'task', taskId);
|
|
65
|
+
if (!taskData) {
|
|
66
|
+
logger.error(`Task list ${taskId} not found.`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
logger.heading(`Implement: ${taskId}`);
|
|
70
|
+
logger.info('Task list content:');
|
|
71
|
+
console.log(taskData.content);
|
|
72
|
+
logger.dim('');
|
|
73
|
+
logger.dim('Use your AI assistant with the generated rules to implement tasks one at a time.');
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/cli/commands/task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { registerInitCommand } from './commands/init.js';
|
|
3
|
+
import { registerEpicCommand } from './commands/epic.js';
|
|
4
|
+
import { registerFeatureCommand } from './commands/feature.js';
|
|
5
|
+
import { registerStoryCommand } from './commands/story.js';
|
|
6
|
+
import { registerTaskCommand } from './commands/task.js';
|
|
7
|
+
import { registerChecklistCommand } from './commands/checklist.js';
|
|
8
|
+
import { registerRulesCommand } from './commands/rules.js';
|
|
9
|
+
import { registerStatusCommand } from './commands/status.js';
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('planr')
|
|
13
|
+
.description('CLI tool for agile planning with AI agents')
|
|
14
|
+
.version('0.1.0')
|
|
15
|
+
.option('--project-dir <path>', 'project root directory', process.cwd())
|
|
16
|
+
.option('--verbose', 'verbose output', false)
|
|
17
|
+
.option('--no-interactive', 'skip interactive prompts');
|
|
18
|
+
registerInitCommand(program);
|
|
19
|
+
registerEpicCommand(program);
|
|
20
|
+
registerFeatureCommand(program);
|
|
21
|
+
registerStoryCommand(program);
|
|
22
|
+
registerTaskCommand(program);
|
|
23
|
+
registerChecklistCommand(program);
|
|
24
|
+
registerRulesCommand(program);
|
|
25
|
+
registerStatusCommand(program);
|
|
26
|
+
program.parse(process.argv);
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,4CAA4C,CAAC;KACzD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACvE,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC;KAC5C,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAC;AAE1D,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OpenPlanrConfig, ArtifactCollection, GeneratedFile } from '../models/types.js';
|
|
2
|
+
export declare abstract class BaseGenerator {
|
|
3
|
+
protected config: OpenPlanrConfig;
|
|
4
|
+
protected projectDir: string;
|
|
5
|
+
constructor(config: OpenPlanrConfig, projectDir: string);
|
|
6
|
+
abstract generate(artifacts: ArtifactCollection): Promise<GeneratedFile[]>;
|
|
7
|
+
abstract getTargetName(): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=base-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-generator.d.ts","sourceRoot":"","sources":["../../src/generators/base-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG7F,8BAAsB,aAAa;IAE/B,SAAS,CAAC,MAAM,EAAE,eAAe;IACjC,SAAS,CAAC,UAAU,EAAE,MAAM;gBADlB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM;IAG9B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAC1E,QAAQ,CAAC,aAAa,IAAI,MAAM;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-generator.js","sourceRoot":"","sources":["../../src/generators/base-generator.ts"],"names":[],"mappings":"AAGA,MAAM,OAAgB,aAAa;IAErB;IACA;IAFZ,YACY,MAAuB,EACvB,UAAkB;QADlB,WAAM,GAAN,MAAM,CAAiB;QACvB,eAAU,GAAV,UAAU,CAAQ;IAC3B,CAAC;CAIL"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BaseGenerator } from './base-generator.js';
|
|
2
|
+
import type { ArtifactCollection, GeneratedFile } from '../models/types.js';
|
|
3
|
+
export declare class ClaudeGenerator extends BaseGenerator {
|
|
4
|
+
getTargetName(): string;
|
|
5
|
+
generate(artifacts: ArtifactCollection): Promise<GeneratedFile[]>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=claude-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-generator.d.ts","sourceRoot":"","sources":["../../src/generators/claude-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5E,qBAAa,eAAgB,SAAQ,aAAa;IAChD,aAAa,IAAI,MAAM;IAIjB,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAuBxE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { BaseGenerator } from './base-generator.js';
|
|
3
|
+
import { renderTemplate } from '../services/template-service.js';
|
|
4
|
+
import { listArtifacts } from '../services/artifact-service.js';
|
|
5
|
+
export class ClaudeGenerator extends BaseGenerator {
|
|
6
|
+
getTargetName() {
|
|
7
|
+
return 'claude';
|
|
8
|
+
}
|
|
9
|
+
async generate(artifacts) {
|
|
10
|
+
const epics = await listArtifacts(this.projectDir, this.config, 'epic');
|
|
11
|
+
const features = await listArtifacts(this.projectDir, this.config, 'feature');
|
|
12
|
+
const content = await renderTemplate('rules/claude/CLAUDE.md.hbs', {
|
|
13
|
+
projectName: this.config.projectName,
|
|
14
|
+
agilePath: this.config.outputPaths.agile,
|
|
15
|
+
date: new Date().toISOString().split('T')[0],
|
|
16
|
+
existingEpics: epics,
|
|
17
|
+
existingFeatures: features,
|
|
18
|
+
}, this.config.templateOverrides);
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
path: path.join(this.config.outputPaths.claudeConfig, 'CLAUDE.md'),
|
|
22
|
+
content,
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=claude-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-generator.js","sourceRoot":"","sources":["../../src/generators/claude-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAChD,aAAa;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAA6B;QAC1C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG,MAAM,cAAc,CAClC,4BAA4B,EAC5B;YACE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK;YACxC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5C,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,QAAQ;SAC3B,EACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC9B,CAAC;QAEF,OAAO;YACL;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC;gBAClE,OAAO;aACR;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BaseGenerator } from './base-generator.js';
|
|
2
|
+
import type { ArtifactCollection, GeneratedFile } from '../models/types.js';
|
|
3
|
+
export declare class CodexGenerator extends BaseGenerator {
|
|
4
|
+
getTargetName(): string;
|
|
5
|
+
generate(artifacts: ArtifactCollection): Promise<GeneratedFile[]>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=codex-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-generator.d.ts","sourceRoot":"","sources":["../../src/generators/codex-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5E,qBAAa,cAAe,SAAQ,aAAa;IAC/C,aAAa,IAAI,MAAM;IAIjB,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAkBxE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { BaseGenerator } from './base-generator.js';
|
|
3
|
+
import { renderTemplate } from '../services/template-service.js';
|
|
4
|
+
export class CodexGenerator extends BaseGenerator {
|
|
5
|
+
getTargetName() {
|
|
6
|
+
return 'codex';
|
|
7
|
+
}
|
|
8
|
+
async generate(artifacts) {
|
|
9
|
+
const content = await renderTemplate('rules/codex/AGENTS.md.hbs', {
|
|
10
|
+
projectName: this.config.projectName,
|
|
11
|
+
agilePath: this.config.outputPaths.agile,
|
|
12
|
+
date: new Date().toISOString().split('T')[0],
|
|
13
|
+
}, this.config.templateOverrides);
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
path: path.join(this.config.outputPaths.codexConfig, 'AGENTS.md'),
|
|
17
|
+
content,
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=codex-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-generator.js","sourceRoot":"","sources":["../../src/generators/codex-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,MAAM,OAAO,cAAe,SAAQ,aAAa;IAC/C,aAAa;QACX,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAA6B;QAC1C,MAAM,OAAO,GAAG,MAAM,cAAc,CAClC,2BAA2B,EAC3B;YACE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK;YACxC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC7C,EACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC9B,CAAC;QAEF,OAAO;YACL;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC;gBACjE,OAAO;aACR;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BaseGenerator } from './base-generator.js';
|
|
2
|
+
import type { ArtifactCollection, GeneratedFile } from '../models/types.js';
|
|
3
|
+
export declare class CursorGenerator extends BaseGenerator {
|
|
4
|
+
getTargetName(): string;
|
|
5
|
+
generate(artifacts: ArtifactCollection): Promise<GeneratedFile[]>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=cursor-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-generator.d.ts","sourceRoot":"","sources":["../../src/generators/cursor-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAW5E,qBAAa,eAAgB,SAAQ,aAAa;IAChD,aAAa,IAAI,MAAM;IAIjB,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CA0BxE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { BaseGenerator } from './base-generator.js';
|
|
3
|
+
import { renderTemplate } from '../services/template-service.js';
|
|
4
|
+
const CURSOR_RULE_TEMPLATES = [
|
|
5
|
+
'2000-agile-checklist.mdc.hbs',
|
|
6
|
+
'2001-agile-create-epic.mdc.hbs',
|
|
7
|
+
'2002-agile-create-features.mdc.hbs',
|
|
8
|
+
'2003-agile-create-user-story.mdc.hbs',
|
|
9
|
+
'2100-create-task-list.mdc.hbs',
|
|
10
|
+
'2101-implement-task-list.mdc.hbs',
|
|
11
|
+
];
|
|
12
|
+
export class CursorGenerator extends BaseGenerator {
|
|
13
|
+
getTargetName() {
|
|
14
|
+
return 'cursor';
|
|
15
|
+
}
|
|
16
|
+
async generate(artifacts) {
|
|
17
|
+
const files = [];
|
|
18
|
+
const rulesDir = this.config.outputPaths.cursorRules;
|
|
19
|
+
const data = {
|
|
20
|
+
projectName: this.config.projectName,
|
|
21
|
+
agilePath: this.config.outputPaths.agile,
|
|
22
|
+
existingEpics: artifacts.epics.map((e) => ({ id: e.id, title: e.title })),
|
|
23
|
+
existingFeatures: artifacts.features.map((f) => ({ id: f.id, title: f.title })),
|
|
24
|
+
existingStories: artifacts.stories.map((s) => ({ id: s.id, title: s.title })),
|
|
25
|
+
};
|
|
26
|
+
for (const template of CURSOR_RULE_TEMPLATES) {
|
|
27
|
+
const content = await renderTemplate(`rules/cursor/${template}`, data, this.config.templateOverrides);
|
|
28
|
+
const outputName = template.replace('.hbs', '');
|
|
29
|
+
files.push({
|
|
30
|
+
path: path.join(rulesDir, outputName),
|
|
31
|
+
content,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return files;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cursor-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-generator.js","sourceRoot":"","sources":["../../src/generators/cursor-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,MAAM,qBAAqB,GAAG;IAC5B,8BAA8B;IAC9B,gCAAgC;IAChC,oCAAoC;IACpC,sCAAsC;IACtC,+BAA+B;IAC/B,kCAAkC;CACnC,CAAC;AAEF,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAChD,aAAa;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAA6B;QAC1C,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;QACrD,MAAM,IAAI,GAAG;YACX,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK;YACxC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACzE,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/E,eAAe,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;SAC9E,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,qBAAqB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,cAAc,CAClC,gBAAgB,QAAQ,EAAE,EAC1B,IAAI,EACJ,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC9B,CAAC;YACF,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;gBACrC,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BaseGenerator } from './base-generator.js';
|
|
2
|
+
import type { OpenPlanrConfig, TargetCLI } from '../models/types.js';
|
|
3
|
+
export declare function createGenerator(target: TargetCLI, config: OpenPlanrConfig, projectDir: string): BaseGenerator;
|
|
4
|
+
export declare function createGenerators(config: OpenPlanrConfig, projectDir: string): BaseGenerator[];
|
|
5
|
+
//# sourceMappingURL=generator-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-factory.d.ts","sourceRoot":"","sources":["../../src/generators/generator-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAErE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,GACjB,aAAa,CAWf;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CAEjB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CursorGenerator } from './cursor-generator.js';
|
|
2
|
+
import { ClaudeGenerator } from './claude-generator.js';
|
|
3
|
+
import { CodexGenerator } from './codex-generator.js';
|
|
4
|
+
export function createGenerator(target, config, projectDir) {
|
|
5
|
+
switch (target) {
|
|
6
|
+
case 'cursor':
|
|
7
|
+
return new CursorGenerator(config, projectDir);
|
|
8
|
+
case 'claude':
|
|
9
|
+
return new ClaudeGenerator(config, projectDir);
|
|
10
|
+
case 'codex':
|
|
11
|
+
return new CodexGenerator(config, projectDir);
|
|
12
|
+
default:
|
|
13
|
+
throw new Error(`Unknown target: ${target}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function createGenerators(config, projectDir) {
|
|
17
|
+
return config.targets.map((target) => createGenerator(target, config, projectDir));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=generator-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-factory.js","sourceRoot":"","sources":["../../src/generators/generator-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,UAAU,eAAe,CAC7B,MAAiB,EACjB,MAAuB,EACvB,UAAkB;IAElB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,KAAK,QAAQ;YACX,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,KAAK,OAAO;YACV,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAChD;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAuB,EACvB,UAAkB;IAElB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-types.d.ts","sourceRoot":"","sources":["../../src/generators/generator-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator-types.js","sourceRoot":"","sources":["../../src/generators/generator-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const targetCLISchema: z.ZodEnum<["cursor", "claude", "codex"]>;
|
|
3
|
+
export declare const configSchema: z.ZodObject<{
|
|
4
|
+
projectName: z.ZodString;
|
|
5
|
+
targets: z.ZodArray<z.ZodEnum<["cursor", "claude", "codex"]>, "many">;
|
|
6
|
+
outputPaths: z.ZodObject<{
|
|
7
|
+
agile: z.ZodDefault<z.ZodString>;
|
|
8
|
+
cursorRules: z.ZodDefault<z.ZodString>;
|
|
9
|
+
claudeConfig: z.ZodDefault<z.ZodString>;
|
|
10
|
+
codexConfig: z.ZodDefault<z.ZodString>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
agile: string;
|
|
13
|
+
cursorRules: string;
|
|
14
|
+
claudeConfig: string;
|
|
15
|
+
codexConfig: string;
|
|
16
|
+
}, {
|
|
17
|
+
agile?: string | undefined;
|
|
18
|
+
cursorRules?: string | undefined;
|
|
19
|
+
claudeConfig?: string | undefined;
|
|
20
|
+
codexConfig?: string | undefined;
|
|
21
|
+
}>;
|
|
22
|
+
idPrefix: z.ZodObject<{
|
|
23
|
+
epic: z.ZodDefault<z.ZodString>;
|
|
24
|
+
feature: z.ZodDefault<z.ZodString>;
|
|
25
|
+
story: z.ZodDefault<z.ZodString>;
|
|
26
|
+
task: z.ZodDefault<z.ZodString>;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
epic: string;
|
|
29
|
+
feature: string;
|
|
30
|
+
story: string;
|
|
31
|
+
task: string;
|
|
32
|
+
}, {
|
|
33
|
+
epic?: string | undefined;
|
|
34
|
+
feature?: string | undefined;
|
|
35
|
+
story?: string | undefined;
|
|
36
|
+
task?: string | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
templateOverrides: z.ZodOptional<z.ZodString>;
|
|
39
|
+
author: z.ZodOptional<z.ZodString>;
|
|
40
|
+
createdAt: z.ZodString;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
projectName: string;
|
|
43
|
+
targets: ("cursor" | "claude" | "codex")[];
|
|
44
|
+
outputPaths: {
|
|
45
|
+
agile: string;
|
|
46
|
+
cursorRules: string;
|
|
47
|
+
claudeConfig: string;
|
|
48
|
+
codexConfig: string;
|
|
49
|
+
};
|
|
50
|
+
idPrefix: {
|
|
51
|
+
epic: string;
|
|
52
|
+
feature: string;
|
|
53
|
+
story: string;
|
|
54
|
+
task: string;
|
|
55
|
+
};
|
|
56
|
+
createdAt: string;
|
|
57
|
+
templateOverrides?: string | undefined;
|
|
58
|
+
author?: string | undefined;
|
|
59
|
+
}, {
|
|
60
|
+
projectName: string;
|
|
61
|
+
targets: ("cursor" | "claude" | "codex")[];
|
|
62
|
+
outputPaths: {
|
|
63
|
+
agile?: string | undefined;
|
|
64
|
+
cursorRules?: string | undefined;
|
|
65
|
+
claudeConfig?: string | undefined;
|
|
66
|
+
codexConfig?: string | undefined;
|
|
67
|
+
};
|
|
68
|
+
idPrefix: {
|
|
69
|
+
epic?: string | undefined;
|
|
70
|
+
feature?: string | undefined;
|
|
71
|
+
story?: string | undefined;
|
|
72
|
+
task?: string | undefined;
|
|
73
|
+
};
|
|
74
|
+
createdAt: string;
|
|
75
|
+
templateOverrides?: string | undefined;
|
|
76
|
+
author?: string | undefined;
|
|
77
|
+
}>;
|
|
78
|
+
export type ValidatedConfig = z.infer<typeof configSchema>;
|
|
79
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/models/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,0CAAwC,CAAC;AAErE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBvB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const targetCLISchema = z.enum(['cursor', 'claude', 'codex']);
|
|
3
|
+
export const configSchema = z.object({
|
|
4
|
+
projectName: z.string().min(1),
|
|
5
|
+
targets: z.array(targetCLISchema).min(1),
|
|
6
|
+
outputPaths: z.object({
|
|
7
|
+
agile: z.string().default('docs/agile'),
|
|
8
|
+
cursorRules: z.string().default('.cursor/rules'),
|
|
9
|
+
claudeConfig: z.string().default('.'),
|
|
10
|
+
codexConfig: z.string().default('.'),
|
|
11
|
+
}),
|
|
12
|
+
idPrefix: z.object({
|
|
13
|
+
epic: z.string().default('EPIC'),
|
|
14
|
+
feature: z.string().default('FEAT'),
|
|
15
|
+
story: z.string().default('US'),
|
|
16
|
+
task: z.string().default('TASK'),
|
|
17
|
+
}),
|
|
18
|
+
templateOverrides: z.string().optional(),
|
|
19
|
+
author: z.string().optional(),
|
|
20
|
+
createdAt: z.string(),
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/models/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;QACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;QAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACrC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;KACrC,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;KACjC,CAAC;IACF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC"}
|