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.
Files changed (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/bin/planr.js +2 -0
  4. package/dist/cli/commands/checklist.d.ts +3 -0
  5. package/dist/cli/commands/checklist.d.ts.map +1 -0
  6. package/dist/cli/commands/checklist.js +34 -0
  7. package/dist/cli/commands/checklist.js.map +1 -0
  8. package/dist/cli/commands/epic.d.ts +3 -0
  9. package/dist/cli/commands/epic.d.ts.map +1 -0
  10. package/dist/cli/commands/epic.js +61 -0
  11. package/dist/cli/commands/epic.js.map +1 -0
  12. package/dist/cli/commands/feature.d.ts +3 -0
  13. package/dist/cli/commands/feature.d.ts.map +1 -0
  14. package/dist/cli/commands/feature.js +65 -0
  15. package/dist/cli/commands/feature.js.map +1 -0
  16. package/dist/cli/commands/init.d.ts +3 -0
  17. package/dist/cli/commands/init.d.ts.map +1 -0
  18. package/dist/cli/commands/init.js +49 -0
  19. package/dist/cli/commands/init.js.map +1 -0
  20. package/dist/cli/commands/rules.d.ts +3 -0
  21. package/dist/cli/commands/rules.d.ts.map +1 -0
  22. package/dist/cli/commands/rules.js +48 -0
  23. package/dist/cli/commands/rules.js.map +1 -0
  24. package/dist/cli/commands/status.d.ts +3 -0
  25. package/dist/cli/commands/status.d.ts.map +1 -0
  26. package/dist/cli/commands/status.js +38 -0
  27. package/dist/cli/commands/status.js.map +1 -0
  28. package/dist/cli/commands/story.d.ts +3 -0
  29. package/dist/cli/commands/story.d.ts.map +1 -0
  30. package/dist/cli/commands/story.js +81 -0
  31. package/dist/cli/commands/story.js.map +1 -0
  32. package/dist/cli/commands/task.d.ts +3 -0
  33. package/dist/cli/commands/task.d.ts.map +1 -0
  34. package/dist/cli/commands/task.js +76 -0
  35. package/dist/cli/commands/task.js.map +1 -0
  36. package/dist/cli/index.d.ts +2 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +27 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/generators/base-generator.d.ts +9 -0
  41. package/dist/generators/base-generator.d.ts.map +1 -0
  42. package/dist/generators/base-generator.js +9 -0
  43. package/dist/generators/base-generator.js.map +1 -0
  44. package/dist/generators/claude-generator.d.ts +7 -0
  45. package/dist/generators/claude-generator.d.ts.map +1 -0
  46. package/dist/generators/claude-generator.js +27 -0
  47. package/dist/generators/claude-generator.js.map +1 -0
  48. package/dist/generators/codex-generator.d.ts +7 -0
  49. package/dist/generators/codex-generator.d.ts.map +1 -0
  50. package/dist/generators/codex-generator.js +22 -0
  51. package/dist/generators/codex-generator.js.map +1 -0
  52. package/dist/generators/cursor-generator.d.ts +7 -0
  53. package/dist/generators/cursor-generator.d.ts.map +1 -0
  54. package/dist/generators/cursor-generator.js +37 -0
  55. package/dist/generators/cursor-generator.js.map +1 -0
  56. package/dist/generators/generator-factory.d.ts +5 -0
  57. package/dist/generators/generator-factory.d.ts.map +1 -0
  58. package/dist/generators/generator-factory.js +19 -0
  59. package/dist/generators/generator-factory.js.map +1 -0
  60. package/dist/generators/generator-types.d.ts +4 -0
  61. package/dist/generators/generator-types.d.ts.map +1 -0
  62. package/dist/generators/generator-types.js +2 -0
  63. package/dist/generators/generator-types.js.map +1 -0
  64. package/dist/models/schema.d.ts +79 -0
  65. package/dist/models/schema.d.ts.map +1 -0
  66. package/dist/models/schema.js +22 -0
  67. package/dist/models/schema.js.map +1 -0
  68. package/dist/models/types.d.ts +78 -0
  69. package/dist/models/types.d.ts.map +1 -0
  70. package/dist/models/types.js +2 -0
  71. package/dist/models/types.js.map +1 -0
  72. package/dist/services/artifact-service.d.ts +17 -0
  73. package/dist/services/artifact-service.d.ts.map +1 -0
  74. package/dist/services/artifact-service.js +63 -0
  75. package/dist/services/artifact-service.js.map +1 -0
  76. package/dist/services/checklist-service.d.ts +6 -0
  77. package/dist/services/checklist-service.d.ts.map +1 -0
  78. package/dist/services/checklist-service.js +26 -0
  79. package/dist/services/checklist-service.js.map +1 -0
  80. package/dist/services/config-service.d.ts +5 -0
  81. package/dist/services/config-service.d.ts.map +1 -0
  82. package/dist/services/config-service.js +38 -0
  83. package/dist/services/config-service.js.map +1 -0
  84. package/dist/services/id-service.d.ts +6 -0
  85. package/dist/services/id-service.d.ts.map +1 -0
  86. package/dist/services/id-service.js +22 -0
  87. package/dist/services/id-service.js.map +1 -0
  88. package/dist/services/prompt-service.d.ts +9 -0
  89. package/dist/services/prompt-service.d.ts.map +1 -0
  90. package/dist/services/prompt-service.js +23 -0
  91. package/dist/services/prompt-service.js.map +1 -0
  92. package/dist/services/template-service.d.ts +2 -0
  93. package/dist/services/template-service.d.ts.map +1 -0
  94. package/dist/services/template-service.js +32 -0
  95. package/dist/services/template-service.js.map +1 -0
  96. package/dist/templates/adrs/adr-general.md.hbs +46 -0
  97. package/dist/templates/checklists/agile-checklist.md.hbs +49 -0
  98. package/dist/templates/epics/epic.md.hbs +46 -0
  99. package/dist/templates/features/feature.md.hbs +42 -0
  100. package/dist/templates/rules/claude/CLAUDE.md.hbs +63 -0
  101. package/dist/templates/rules/codex/AGENTS.md.hbs +28 -0
  102. package/dist/templates/rules/cursor/2000-agile-checklist.mdc.hbs +33 -0
  103. package/dist/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +35 -0
  104. package/dist/templates/rules/cursor/2002-agile-create-features.mdc.hbs +35 -0
  105. package/dist/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +31 -0
  106. package/dist/templates/rules/cursor/2100-create-task-list.mdc.hbs +36 -0
  107. package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +28 -0
  108. package/dist/templates/stories/gherkin.feature.hbs +13 -0
  109. package/dist/templates/stories/user-story.md.hbs +28 -0
  110. package/dist/templates/tasks/task-list.md.hbs +24 -0
  111. package/dist/templates/templates/adrs/adr-general.md.hbs +46 -0
  112. package/dist/templates/templates/checklists/agile-checklist.md.hbs +49 -0
  113. package/dist/templates/templates/epics/epic.md.hbs +46 -0
  114. package/dist/templates/templates/features/feature.md.hbs +42 -0
  115. package/dist/templates/templates/rules/claude/CLAUDE.md.hbs +63 -0
  116. package/dist/templates/templates/rules/codex/AGENTS.md.hbs +28 -0
  117. package/dist/templates/templates/rules/cursor/2000-agile-checklist.mdc.hbs +33 -0
  118. package/dist/templates/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +35 -0
  119. package/dist/templates/templates/rules/cursor/2002-agile-create-features.mdc.hbs +35 -0
  120. package/dist/templates/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +31 -0
  121. package/dist/templates/templates/rules/cursor/2100-create-task-list.mdc.hbs +36 -0
  122. package/dist/templates/templates/rules/cursor/2101-implement-task-list.mdc.hbs +28 -0
  123. package/dist/templates/templates/stories/gherkin.feature.hbs +13 -0
  124. package/dist/templates/templates/stories/user-story.md.hbs +28 -0
  125. package/dist/templates/templates/tasks/task-list.md.hbs +24 -0
  126. package/dist/utils/constants.d.ts +20 -0
  127. package/dist/utils/constants.d.ts.map +1 -0
  128. package/dist/utils/constants.js +26 -0
  129. package/dist/utils/constants.js.map +1 -0
  130. package/dist/utils/fs.d.ts +6 -0
  131. package/dist/utils/fs.d.ts.map +1 -0
  132. package/dist/utils/fs.js +26 -0
  133. package/dist/utils/fs.js.map +1 -0
  134. package/dist/utils/logger.d.ts +9 -0
  135. package/dist/utils/logger.d.ts.map +1 -0
  136. package/dist/utils/logger.js +22 -0
  137. package/dist/utils/logger.js.map +1 -0
  138. package/dist/utils/markdown.d.ts +7 -0
  139. package/dist/utils/markdown.d.ts.map +1 -0
  140. package/dist/utils/markdown.js +9 -0
  141. package/dist/utils/markdown.js.map +1 -0
  142. package/dist/utils/slugify.d.ts +2 -0
  143. package/dist/utils/slugify.d.ts.map +1 -0
  144. package/dist/utils/slugify.js +10 -0
  145. package/dist/utils/slugify.js.map +1 -0
  146. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTaskCommand(program: Command): void;
3
+ //# sourceMappingURL=task.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,9 @@
1
+ export class BaseGenerator {
2
+ config;
3
+ projectDir;
4
+ constructor(config, projectDir) {
5
+ this.config = config;
6
+ this.projectDir = projectDir;
7
+ }
8
+ }
9
+ //# sourceMappingURL=base-generator.js.map
@@ -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,4 @@
1
+ export interface TemplateService {
2
+ render(templatePath: string, data: Record<string, unknown>): Promise<string>;
3
+ }
4
+ //# sourceMappingURL=generator-types.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generator-types.js.map
@@ -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"}