openplanr 0.1.0 → 0.3.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 (209) hide show
  1. package/README.md +23 -5
  2. package/dist/agents/agent-factory.d.ts +7 -0
  3. package/dist/agents/agent-factory.d.ts.map +1 -0
  4. package/dist/agents/agent-factory.js +22 -0
  5. package/dist/agents/agent-factory.js.map +1 -0
  6. package/dist/agents/claude-agent.d.ts +13 -0
  7. package/dist/agents/claude-agent.d.ts.map +1 -0
  8. package/dist/agents/claude-agent.js +48 -0
  9. package/dist/agents/claude-agent.js.map +1 -0
  10. package/dist/agents/codex-agent.d.ts +13 -0
  11. package/dist/agents/codex-agent.d.ts.map +1 -0
  12. package/dist/agents/codex-agent.js +47 -0
  13. package/dist/agents/codex-agent.js.map +1 -0
  14. package/dist/agents/cursor-agent.d.ts +13 -0
  15. package/dist/agents/cursor-agent.d.ts.map +1 -0
  16. package/dist/agents/cursor-agent.js +40 -0
  17. package/dist/agents/cursor-agent.js.map +1 -0
  18. package/dist/agents/implementation-bridge.d.ts +21 -0
  19. package/dist/agents/implementation-bridge.d.ts.map +1 -0
  20. package/dist/agents/implementation-bridge.js +173 -0
  21. package/dist/agents/implementation-bridge.js.map +1 -0
  22. package/dist/agents/index.d.ts +6 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +5 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/prompt-composer.d.ts +30 -0
  27. package/dist/agents/prompt-composer.d.ts.map +1 -0
  28. package/dist/agents/prompt-composer.js +81 -0
  29. package/dist/agents/prompt-composer.js.map +1 -0
  30. package/dist/agents/task-parser.d.ts +38 -0
  31. package/dist/agents/task-parser.d.ts.map +1 -0
  32. package/dist/agents/task-parser.js +83 -0
  33. package/dist/agents/task-parser.js.map +1 -0
  34. package/dist/agents/types.d.ts +23 -0
  35. package/dist/agents/types.d.ts.map +1 -0
  36. package/dist/agents/types.js +8 -0
  37. package/dist/agents/types.js.map +1 -0
  38. package/dist/agents/utils.d.ts +9 -0
  39. package/dist/agents/utils.d.ts.map +1 -0
  40. package/dist/agents/utils.js +21 -0
  41. package/dist/agents/utils.js.map +1 -0
  42. package/dist/ai/codebase/context-builder.d.ts +31 -0
  43. package/dist/ai/codebase/context-builder.d.ts.map +1 -0
  44. package/dist/ai/codebase/context-builder.js +93 -0
  45. package/dist/ai/codebase/context-builder.js.map +1 -0
  46. package/dist/ai/codebase/file-reader.d.ts +22 -0
  47. package/dist/ai/codebase/file-reader.d.ts.map +1 -0
  48. package/dist/ai/codebase/file-reader.js +111 -0
  49. package/dist/ai/codebase/file-reader.js.map +1 -0
  50. package/dist/ai/codebase/index.d.ts +5 -0
  51. package/dist/ai/codebase/index.d.ts.map +1 -0
  52. package/dist/ai/codebase/index.js +5 -0
  53. package/dist/ai/codebase/index.js.map +1 -0
  54. package/dist/ai/codebase/stack-detector.d.ts +18 -0
  55. package/dist/ai/codebase/stack-detector.d.ts.map +1 -0
  56. package/dist/ai/codebase/stack-detector.js +147 -0
  57. package/dist/ai/codebase/stack-detector.js.map +1 -0
  58. package/dist/ai/codebase/tree-generator.d.ts +8 -0
  59. package/dist/ai/codebase/tree-generator.d.ts.map +1 -0
  60. package/dist/ai/codebase/tree-generator.js +85 -0
  61. package/dist/ai/codebase/tree-generator.js.map +1 -0
  62. package/dist/ai/errors.d.ts +22 -0
  63. package/dist/ai/errors.d.ts.map +1 -0
  64. package/dist/ai/errors.js +70 -0
  65. package/dist/ai/errors.js.map +1 -0
  66. package/dist/ai/index.d.ts +11 -0
  67. package/dist/ai/index.d.ts.map +1 -0
  68. package/dist/ai/index.js +10 -0
  69. package/dist/ai/index.js.map +1 -0
  70. package/dist/ai/prompts/prompt-builder.d.ts +42 -0
  71. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -0
  72. package/dist/ai/prompts/prompt-builder.js +96 -0
  73. package/dist/ai/prompts/prompt-builder.js.map +1 -0
  74. package/dist/ai/prompts/system-prompts.d.ts +13 -0
  75. package/dist/ai/prompts/system-prompts.d.ts.map +1 -0
  76. package/dist/ai/prompts/system-prompts.js +124 -0
  77. package/dist/ai/prompts/system-prompts.js.map +1 -0
  78. package/dist/ai/provider-factory.d.ts +10 -0
  79. package/dist/ai/provider-factory.d.ts.map +1 -0
  80. package/dist/ai/provider-factory.js +33 -0
  81. package/dist/ai/provider-factory.js.map +1 -0
  82. package/dist/ai/providers/anthropic-provider.d.ts +22 -0
  83. package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
  84. package/dist/ai/providers/anthropic-provider.js +82 -0
  85. package/dist/ai/providers/anthropic-provider.js.map +1 -0
  86. package/dist/ai/providers/ollama-provider.d.ts +13 -0
  87. package/dist/ai/providers/ollama-provider.d.ts.map +1 -0
  88. package/dist/ai/providers/ollama-provider.js +16 -0
  89. package/dist/ai/providers/ollama-provider.js.map +1 -0
  90. package/dist/ai/providers/openai-provider.d.ts +17 -0
  91. package/dist/ai/providers/openai-provider.d.ts.map +1 -0
  92. package/dist/ai/providers/openai-provider.js +58 -0
  93. package/dist/ai/providers/openai-provider.js.map +1 -0
  94. package/dist/ai/schemas/ai-response-schemas.d.ts +425 -0
  95. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -0
  96. package/dist/ai/schemas/ai-response-schemas.js +87 -0
  97. package/dist/ai/schemas/ai-response-schemas.js.map +1 -0
  98. package/dist/ai/types.d.ts +40 -0
  99. package/dist/ai/types.d.ts.map +1 -0
  100. package/dist/ai/types.js +16 -0
  101. package/dist/ai/types.js.map +1 -0
  102. package/dist/cli/commands/checklist.d.ts.map +1 -1
  103. package/dist/cli/commands/checklist.js +60 -1
  104. package/dist/cli/commands/checklist.js.map +1 -1
  105. package/dist/cli/commands/config.d.ts +8 -0
  106. package/dist/cli/commands/config.d.ts.map +1 -0
  107. package/dist/cli/commands/config.js +112 -0
  108. package/dist/cli/commands/config.js.map +1 -0
  109. package/dist/cli/commands/epic.d.ts +7 -0
  110. package/dist/cli/commands/epic.d.ts.map +1 -1
  111. package/dist/cli/commands/epic.js +161 -31
  112. package/dist/cli/commands/epic.js.map +1 -1
  113. package/dist/cli/commands/feature.d.ts +6 -0
  114. package/dist/cli/commands/feature.d.ts.map +1 -1
  115. package/dist/cli/commands/feature.js +143 -30
  116. package/dist/cli/commands/feature.js.map +1 -1
  117. package/dist/cli/commands/init.d.ts +6 -0
  118. package/dist/cli/commands/init.d.ts.map +1 -1
  119. package/dist/cli/commands/init.js +48 -6
  120. package/dist/cli/commands/init.js.map +1 -1
  121. package/dist/cli/commands/plan.d.ts +15 -0
  122. package/dist/cli/commands/plan.d.ts.map +1 -0
  123. package/dist/cli/commands/plan.js +259 -0
  124. package/dist/cli/commands/plan.js.map +1 -0
  125. package/dist/cli/commands/refine.d.ts +9 -0
  126. package/dist/cli/commands/refine.d.ts.map +1 -0
  127. package/dist/cli/commands/refine.js +101 -0
  128. package/dist/cli/commands/refine.js.map +1 -0
  129. package/dist/cli/commands/status.d.ts.map +1 -1
  130. package/dist/cli/commands/status.js +150 -18
  131. package/dist/cli/commands/status.js.map +1 -1
  132. package/dist/cli/commands/story.d.ts +6 -0
  133. package/dist/cli/commands/story.d.ts.map +1 -1
  134. package/dist/cli/commands/story.js +259 -45
  135. package/dist/cli/commands/story.js.map +1 -1
  136. package/dist/cli/commands/sync.d.ts +12 -0
  137. package/dist/cli/commands/sync.d.ts.map +1 -0
  138. package/dist/cli/commands/sync.js +227 -0
  139. package/dist/cli/commands/sync.js.map +1 -0
  140. package/dist/cli/commands/task.d.ts +9 -0
  141. package/dist/cli/commands/task.d.ts.map +1 -1
  142. package/dist/cli/commands/task.js +350 -35
  143. package/dist/cli/commands/task.js.map +1 -1
  144. package/dist/cli/index.js +16 -2
  145. package/dist/cli/index.js.map +1 -1
  146. package/dist/models/schema.d.ts +41 -0
  147. package/dist/models/schema.d.ts.map +1 -1
  148. package/dist/models/schema.js +9 -0
  149. package/dist/models/schema.js.map +1 -1
  150. package/dist/models/types.d.ts +9 -0
  151. package/dist/models/types.d.ts.map +1 -1
  152. package/dist/services/ai-service.d.ts +40 -0
  153. package/dist/services/ai-service.d.ts.map +1 -0
  154. package/dist/services/ai-service.js +150 -0
  155. package/dist/services/ai-service.js.map +1 -0
  156. package/dist/services/artifact-gathering.d.ts +49 -0
  157. package/dist/services/artifact-gathering.d.ts.map +1 -0
  158. package/dist/services/artifact-gathering.js +128 -0
  159. package/dist/services/artifact-gathering.js.map +1 -0
  160. package/dist/services/artifact-service.d.ts +47 -0
  161. package/dist/services/artifact-service.d.ts.map +1 -1
  162. package/dist/services/artifact-service.js +169 -0
  163. package/dist/services/artifact-service.js.map +1 -1
  164. package/dist/services/checklist-service.d.ts +23 -0
  165. package/dist/services/checklist-service.d.ts.map +1 -1
  166. package/dist/services/checklist-service.js +44 -0
  167. package/dist/services/checklist-service.js.map +1 -1
  168. package/dist/services/credentials-service.d.ts +22 -0
  169. package/dist/services/credentials-service.d.ts.map +1 -0
  170. package/dist/services/credentials-service.js +58 -0
  171. package/dist/services/credentials-service.js.map +1 -0
  172. package/dist/services/id-service.d.ts.map +1 -1
  173. package/dist/services/id-service.js +8 -5
  174. package/dist/services/id-service.js.map +1 -1
  175. package/dist/services/prompt-service.d.ts +6 -0
  176. package/dist/services/prompt-service.d.ts.map +1 -1
  177. package/dist/services/prompt-service.js +7 -1
  178. package/dist/services/prompt-service.js.map +1 -1
  179. package/dist/services/template-service.d.ts.map +1 -1
  180. package/dist/services/template-service.js +6 -0
  181. package/dist/services/template-service.js.map +1 -1
  182. package/dist/templates/checklists/agile-checklist.md.hbs +8 -8
  183. package/dist/templates/epics/epic.md.hbs +8 -2
  184. package/dist/templates/features/feature.md.hbs +3 -3
  185. package/dist/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +1 -1
  186. package/dist/templates/rules/cursor/2002-agile-create-features.mdc.hbs +1 -1
  187. package/dist/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +1 -1
  188. package/dist/templates/stories/user-story.md.hbs +2 -2
  189. package/dist/templates/tasks/task-list.md.hbs +26 -3
  190. package/dist/utils/logger.d.ts +3 -0
  191. package/dist/utils/logger.d.ts.map +1 -1
  192. package/dist/utils/logger.js +12 -0
  193. package/dist/utils/logger.js.map +1 -1
  194. package/package.json +12 -5
  195. package/dist/templates/templates/adrs/adr-general.md.hbs +0 -46
  196. package/dist/templates/templates/checklists/agile-checklist.md.hbs +0 -49
  197. package/dist/templates/templates/epics/epic.md.hbs +0 -46
  198. package/dist/templates/templates/features/feature.md.hbs +0 -42
  199. package/dist/templates/templates/rules/claude/CLAUDE.md.hbs +0 -63
  200. package/dist/templates/templates/rules/codex/AGENTS.md.hbs +0 -28
  201. package/dist/templates/templates/rules/cursor/2000-agile-checklist.mdc.hbs +0 -33
  202. package/dist/templates/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +0 -35
  203. package/dist/templates/templates/rules/cursor/2002-agile-create-features.mdc.hbs +0 -35
  204. package/dist/templates/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +0 -31
  205. package/dist/templates/templates/rules/cursor/2100-create-task-list.mdc.hbs +0 -36
  206. package/dist/templates/templates/rules/cursor/2101-implement-task-list.mdc.hbs +0 -28
  207. package/dist/templates/templates/stories/gherkin.feature.hbs +0 -13
  208. package/dist/templates/templates/stories/user-story.md.hbs +0 -28
  209. package/dist/templates/templates/tasks/task-list.md.hbs +0 -24
@@ -1,38 +1,170 @@
1
1
  import { loadConfig } from '../../services/config-service.js';
2
- import { listArtifacts } from '../../services/artifact-service.js';
2
+ import { listArtifacts, readArtifact, readArtifactRaw } from '../../services/artifact-service.js';
3
+ import { parseTaskMarkdown } from '../../agents/task-parser.js';
3
4
  import { logger } from '../../utils/logger.js';
5
+ import chalk from 'chalk';
4
6
  export function registerStatusCommand(program) {
5
7
  program
6
8
  .command('status')
7
9
  .description('Show project planning status')
8
- .action(async () => {
10
+ .option('--all', 'show all items without truncation')
11
+ .action(async (opts) => {
9
12
  const projectDir = program.opts().projectDir;
10
13
  const config = await loadConfig(projectDir);
14
+ const showAll = !!opts.all;
11
15
  logger.heading(`OpenPlanr Status — ${config.projectName}`);
12
16
  console.log('');
13
- const types = [
14
- { type: 'epic', label: 'Epics' },
15
- { type: 'feature', label: 'Features' },
16
- { type: 'story', label: 'User Stories' },
17
- { type: 'task', label: 'Task Lists' },
18
- ];
19
- for (const { type, label } of types) {
20
- const items = await listArtifacts(projectDir, config, type);
21
- const count = items.length;
22
- const icon = count > 0 ? '●' : '○';
23
- console.log(` ${icon} ${label}: ${count}`);
24
- if (count > 0) {
25
- for (const item of items.slice(0, 5)) {
26
- console.log(` ${item.id} ${item.title}`);
17
+ // Gather all artifacts
18
+ const epics = await listArtifacts(projectDir, config, 'epic');
19
+ const features = await listArtifacts(projectDir, config, 'feature');
20
+ const stories = await listArtifacts(projectDir, config, 'story');
21
+ const tasks = await listArtifacts(projectDir, config, 'task');
22
+ // Build parent lookups: featureId → epicId, storyId → featureId, taskId → storyId/featureId
23
+ const featureToEpic = new Map();
24
+ const storyToFeature = new Map();
25
+ const taskToParent = new Map();
26
+ for (const f of features) {
27
+ const data = await readArtifact(projectDir, config, 'feature', f.id);
28
+ if (data?.data.epicId)
29
+ featureToEpic.set(f.id, data.data.epicId);
30
+ }
31
+ for (const s of stories) {
32
+ const data = await readArtifact(projectDir, config, 'story', s.id);
33
+ if (data?.data.featureId)
34
+ storyToFeature.set(s.id, data.data.featureId);
35
+ }
36
+ for (const t of tasks) {
37
+ const data = await readArtifact(projectDir, config, 'task', t.id);
38
+ const parentStory = data?.data.storyId;
39
+ const parentFeature = data?.data.featureId;
40
+ if (parentStory)
41
+ taskToParent.set(t.id, parentStory);
42
+ else if (parentFeature)
43
+ taskToParent.set(t.id, parentFeature);
44
+ }
45
+ // Task completion metrics
46
+ const taskMetrics = new Map();
47
+ for (const t of tasks) {
48
+ const raw = await readArtifactRaw(projectDir, config, 'task', t.id);
49
+ if (raw) {
50
+ const parsed = parseTaskMarkdown(raw);
51
+ const subtasks = parsed.filter((s) => s.depth > 0);
52
+ const total = subtasks.length || parsed.length;
53
+ const done = (subtasks.length > 0 ? subtasks : parsed).filter((s) => s.done).length;
54
+ taskMetrics.set(t.id, { done, total });
55
+ }
56
+ }
57
+ // Tree view: group by epic hierarchy
58
+ if (epics.length > 0) {
59
+ printSection('Epics', epics, showAll);
60
+ for (const epic of epics) {
61
+ console.log('');
62
+ console.log(chalk.bold.cyan(` ${epic.id}: ${epic.title}`));
63
+ // Features under this epic
64
+ const epicFeatures = features.filter((f) => featureToEpic.get(f.id) === epic.id);
65
+ if (epicFeatures.length > 0) {
66
+ const featureList = showAll ? epicFeatures : epicFeatures.slice(0, 5);
67
+ for (const f of featureList) {
68
+ console.log(chalk.white(` ${f.id} ${f.title}`));
69
+ // Stories under this feature
70
+ const featureStories = stories.filter((s) => storyToFeature.get(s.id) === f.id);
71
+ const storyList = showAll ? featureStories : featureStories.slice(0, 3);
72
+ for (const s of storyList) {
73
+ console.log(chalk.dim(` ${s.id} ${s.title}`));
74
+ }
75
+ if (!showAll && featureStories.length > 3) {
76
+ console.log(chalk.dim(` ... and ${featureStories.length - 3} more stories`));
77
+ }
78
+ }
79
+ if (!showAll && epicFeatures.length > 5) {
80
+ console.log(chalk.dim(` ... and ${epicFeatures.length - 5} more features`));
81
+ }
27
82
  }
28
- if (count > 5) {
29
- console.log(` ... and ${count - 5} more`);
83
+ }
84
+ // Show orphaned features (no epic parent)
85
+ const orphanFeatures = features.filter((f) => !featureToEpic.has(f.id));
86
+ if (orphanFeatures.length > 0) {
87
+ console.log('');
88
+ console.log(chalk.yellow(` Unlinked Features: ${orphanFeatures.length}`));
89
+ for (const f of showAll ? orphanFeatures : orphanFeatures.slice(0, 5)) {
90
+ console.log(chalk.dim(` ${f.id} ${f.title}`));
30
91
  }
31
92
  }
93
+ // Show orphaned stories (no feature parent)
94
+ const orphanStories = stories.filter((s) => !storyToFeature.has(s.id));
95
+ if (orphanStories.length > 0) {
96
+ console.log('');
97
+ console.log(chalk.yellow(` Unlinked Stories: ${orphanStories.length}`));
98
+ for (const s of showAll ? orphanStories : orphanStories.slice(0, 5)) {
99
+ console.log(chalk.dim(` ${s.id} ${s.title}`));
100
+ }
101
+ }
102
+ }
103
+ else {
104
+ // No epics — flat listing fallback
105
+ printSection('Features', features, showAll);
106
+ printSection('User Stories', stories, showAll);
32
107
  }
108
+ // Task lists with completion metrics
33
109
  console.log('');
110
+ const taskIcon = tasks.length > 0 ? '●' : '○';
111
+ console.log(` ${taskIcon} Task Lists: ${tasks.length}`);
112
+ if (tasks.length > 0) {
113
+ const taskList = showAll ? tasks : tasks.slice(0, 5);
114
+ for (const t of taskList) {
115
+ const metrics = taskMetrics.get(t.id);
116
+ if (metrics && metrics.total > 0) {
117
+ const pct = Math.round((metrics.done / metrics.total) * 100);
118
+ const progressText = `(${metrics.done}/${metrics.total} subtasks, ${pct}%)`;
119
+ const coloredProgress = colorByPercent(progressText, pct);
120
+ console.log(` ${t.id} ${t.title} ${coloredProgress}`);
121
+ }
122
+ else {
123
+ console.log(` ${t.id} ${t.title}`);
124
+ }
125
+ }
126
+ if (!showAll && tasks.length > 5) {
127
+ console.log(chalk.dim(` ... and ${tasks.length - 5} more`));
128
+ }
129
+ // Overall task completion summary
130
+ let totalDone = 0;
131
+ let totalSubtasks = 0;
132
+ for (const m of taskMetrics.values()) {
133
+ totalDone += m.done;
134
+ totalSubtasks += m.total;
135
+ }
136
+ if (totalSubtasks > 0) {
137
+ const overallPct = Math.round((totalDone / totalSubtasks) * 100);
138
+ console.log('');
139
+ console.log(` ${colorByPercent(`Overall: ${totalDone}/${totalSubtasks} subtasks complete (${overallPct}%)`, overallPct)}`);
140
+ }
141
+ }
142
+ // Summary counts
143
+ console.log('');
144
+ console.log(chalk.dim(` Totals: ${epics.length} epics, ${features.length} features, ${stories.length} stories, ${tasks.length} task lists`));
34
145
  logger.dim('Targets: ' + config.targets.join(', '));
35
146
  logger.dim('Artifacts: ' + config.outputPaths.agile + '/');
36
147
  });
37
148
  }
149
+ function printSection(label, items, showAll) {
150
+ const count = items.length;
151
+ const icon = count > 0 ? '●' : '○';
152
+ console.log(` ${icon} ${label}: ${count}`);
153
+ if (count > 0) {
154
+ const list = showAll ? items : items.slice(0, 5);
155
+ for (const item of list) {
156
+ console.log(` ${item.id} ${item.title}`);
157
+ }
158
+ if (!showAll && count > 5) {
159
+ console.log(chalk.dim(` ... and ${count - 5} more`));
160
+ }
161
+ }
162
+ }
163
+ function colorByPercent(text, pct) {
164
+ if (pct >= 75)
165
+ return chalk.green(text);
166
+ if (pct >= 25)
167
+ return chalk.yellow(text);
168
+ return chalk.red(text);
169
+ }
38
170
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,MAAM,CAAC,OAAO,CAAC,sBAAsB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAiD;YAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE;YAChC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;YACtC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;YACxC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE;SACtC,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,OAAO,EAAE,mCAAmC,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAE3B,MAAM,CAAC,OAAO,CAAC,sBAAsB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,uBAAuB;QACvB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE9D,4FAA4F;QAC5F,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAChD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE/C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACrE,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM;gBAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS;gBAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,CAAC,OAA6B,CAAC;YAC7D,MAAM,aAAa,GAAG,IAAI,EAAE,IAAI,CAAC,SAA+B,CAAC;YACjE,IAAI,WAAW;gBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;iBAChD,IAAI,aAAa;gBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2C,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACpE,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;gBAC/C,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;gBACpF,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAE5D,2BAA2B;gBAC3B,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACtE,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAEpD,6BAA6B;wBAC7B,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wBAChF,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBACxE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;4BAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBACtD,CAAC;wBACD,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,cAAc,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;wBACpF,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;YAED,0CAA0C;YAC1C,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC3E,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACzE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,YAAY,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;oBAC7D,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,cAAc,GAAG,IAAI,CAAC;oBAC5E,MAAM,eAAe,GAAG,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;oBAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,kCAAkC;YAClC,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC;gBACpB,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,KAAK,cAAc,CAAC,YAAY,SAAS,IAAI,aAAa,uBAAuB,UAAU,IAAI,EAAE,UAAU,CAAC,EAAE,CAC/G,CAAC;YACJ,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,aAAa,KAAK,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,cAAc,OAAO,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,aAAa,CACtH,CACF,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CACnB,KAAa,EACb,KAA2C,EAC3C,OAAgB;IAEhB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,GAAW;IAC/C,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * `planr story` command group.
3
+ *
4
+ * AI-powered by default: reads the parent feature and epic context
5
+ * to generate user stories with Gherkin scenarios.
6
+ */
1
7
  import { Command } from 'commander';
2
8
  export declare function registerStoryCommand(program: Command): void;
3
9
  //# sourceMappingURL=story.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"story.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA8FpD"}
1
+ {"version":3,"file":"story.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA+IpD"}
@@ -1,64 +1,111 @@
1
+ /**
2
+ * `planr story` command group.
3
+ *
4
+ * AI-powered by default: reads the parent feature and epic context
5
+ * to generate user stories with Gherkin scenarios.
6
+ */
1
7
  import path from 'node:path';
2
8
  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';
9
+ import { createArtifact, listArtifacts, readArtifact, readArtifactRaw, getArtifactDir, resolveArtifactFilename, addChildReference, } from '../../services/artifact-service.js';
10
+ import { isAIConfigured, getAIProvider, generateStreamingJSON } from '../../services/ai-service.js';
11
+ import { promptText, promptConfirm } from '../../services/prompt-service.js';
5
12
  import { renderTemplate } from '../../services/template-service.js';
6
13
  import { writeFile } from '../../utils/fs.js';
14
+ import { buildStoriesPrompt } from '../../ai/prompts/prompt-builder.js';
15
+ import { aiStoriesResponseSchema } from '../../ai/schemas/ai-response-schemas.js';
7
16
  import { logger } from '../../utils/logger.js';
17
+ import chalk from 'chalk';
8
18
  export function registerStoryCommand(program) {
9
19
  const story = program.command('story').description('Manage user stories');
10
20
  story
11
21
  .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')
22
+ .description('Create user stories from a feature or all features under an epic')
23
+ .option('--feature <featureId>', 'parent feature ID (e.g., FEAT-001)')
24
+ .option('--epic <epicId>', 'parent epic ID — generates stories for ALL features under this epic')
25
+ .option('--title <title>', 'story title (manual mode only)')
26
+ .option('--manual', 'use manual interactive prompts instead of AI')
15
27
  .action(async (opts) => {
16
28
  const projectDir = program.opts().projectDir;
17
29
  const config = await loadConfig(projectDir);
30
+ // Validate: exactly one of --feature or --epic must be provided
31
+ if (opts.feature && opts.epic) {
32
+ logger.error('Cannot use both --feature and --epic. Choose one.');
33
+ process.exit(1);
34
+ }
35
+ if (!opts.feature && !opts.epic) {
36
+ logger.error('Must provide --feature <featureId> or --epic <epicId>.');
37
+ process.exit(1);
38
+ }
39
+ if (opts.epic) {
40
+ // Batch mode: generate stories for all features under the epic
41
+ if (opts.manual) {
42
+ logger.error('--manual is not supported with --epic. Use --feature for manual mode.');
43
+ process.exit(1);
44
+ }
45
+ if (!isAIConfigured(config)) {
46
+ logger.error('AI not configured. Run `planr config set-provider` to enable AI.');
47
+ process.exit(1);
48
+ }
49
+ const epicData = await readArtifact(projectDir, config, 'epic', opts.epic);
50
+ if (!epicData) {
51
+ logger.error(`Epic ${opts.epic} not found.`);
52
+ process.exit(1);
53
+ }
54
+ // Find all features under this epic
55
+ const allFeatures = await listArtifacts(projectDir, config, 'feature');
56
+ const epicFeatures = [];
57
+ for (const f of allFeatures) {
58
+ const data = await readArtifact(projectDir, config, 'feature', f.id);
59
+ if (data && data.data.epicId === opts.epic) {
60
+ epicFeatures.push({ id: f.id, title: data.data.title || f.title });
61
+ }
62
+ }
63
+ if (epicFeatures.length === 0) {
64
+ logger.error(`No features found under ${opts.epic}. Create features first with \`planr feature create --epic ${opts.epic}\`.`);
65
+ process.exit(1);
66
+ }
67
+ logger.heading(`Batch Story Generation for ${opts.epic}`);
68
+ console.log(chalk.dim(`Found ${epicFeatures.length} feature(s):`));
69
+ for (const f of epicFeatures) {
70
+ console.log(chalk.dim(` ${f.id}: ${f.title}`));
71
+ }
72
+ console.log('');
73
+ const confirmBatch = await promptConfirm(`Generate stories for all ${epicFeatures.length} features?`, true);
74
+ if (!confirmBatch) {
75
+ logger.info('Batch story generation cancelled.');
76
+ return;
77
+ }
78
+ let totalCreated = 0;
79
+ for (const feature of epicFeatures) {
80
+ const count = await createStoriesWithAI(projectDir, config, feature.id);
81
+ totalCreated += count;
82
+ }
83
+ console.log('');
84
+ console.log(chalk.dim('━'.repeat(50)));
85
+ logger.success(`Batch complete: created ${totalCreated} stories across ${epicFeatures.length} features.`);
86
+ logger.dim('');
87
+ logger.heading('Next steps:');
88
+ logger.dim(' 1. planr story list — View all stories');
89
+ logger.dim(' 2. planr task create --story <ID> — Generate tasks for a story');
90
+ logger.dim(' 3. planr task create --feature <ID> — Generate tasks for a feature');
91
+ return;
92
+ }
93
+ // Single feature mode
18
94
  const featureData = await readArtifact(projectDir, config, 'feature', opts.feature);
19
95
  if (!featureData) {
20
96
  logger.error(`Feature ${opts.feature} not found.`);
21
97
  process.exit(1);
22
98
  }
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}`);
99
+ const useAI = !opts.manual && isAIConfigured(config);
100
+ if (useAI) {
101
+ await createStoriesWithAI(projectDir, config, opts.feature);
102
+ }
103
+ else {
104
+ if (!opts.manual && !isAIConfigured(config)) {
105
+ logger.warn('AI not configured. Using manual mode.');
106
+ }
107
+ await createStoryManually(projectDir, config, opts);
108
+ }
62
109
  });
63
110
  story
64
111
  .command('list')
@@ -72,10 +119,177 @@ export function registerStoryCommand(program) {
72
119
  logger.info('No stories found. Run "planr story create --feature <ID>" to create one.');
73
120
  return;
74
121
  }
122
+ // Filter by feature if specified
123
+ let filtered = stories;
124
+ if (opts.feature) {
125
+ filtered = [];
126
+ for (const s of stories) {
127
+ const data = await readArtifact(projectDir, config, 'story', s.id);
128
+ if (data && data.data.featureId === opts.feature) {
129
+ filtered.push(s);
130
+ }
131
+ }
132
+ if (filtered.length === 0) {
133
+ logger.info(`No stories found for feature ${opts.feature}.`);
134
+ return;
135
+ }
136
+ }
75
137
  logger.heading('User Stories');
76
- for (const s of stories) {
138
+ for (const s of filtered) {
77
139
  console.log(` ${s.id} ${s.title}`);
78
140
  }
79
141
  });
80
142
  }
143
+ /**
144
+ * Generate stories with AI for a single feature. Returns the number of stories created.
145
+ */
146
+ async function createStoriesWithAI(projectDir, config, featureId) {
147
+ logger.heading(`Create User Stories (AI-powered from ${featureId})`);
148
+ const featureRaw = await readArtifactRaw(projectDir, config, 'feature', featureId);
149
+ if (!featureRaw) {
150
+ logger.error(`Could not read feature ${featureId}.`);
151
+ return 0;
152
+ }
153
+ // Read parent epic for context
154
+ const featureData = await readArtifact(projectDir, config, 'feature', featureId);
155
+ const epicId = featureData?.data.epicId;
156
+ let epicRaw = '';
157
+ if (epicId) {
158
+ epicRaw = (await readArtifactRaw(projectDir, config, 'epic', epicId)) || '';
159
+ }
160
+ // Find existing stories for THIS feature (for dedup + warning)
161
+ const allStories = await listArtifacts(projectDir, config, 'story');
162
+ const featureStories = [];
163
+ for (const s of allStories) {
164
+ const data = await readArtifact(projectDir, config, 'story', s.id);
165
+ if (data && data.data.featureId === featureId) {
166
+ featureStories.push({ id: s.id, title: data.data.title || s.title });
167
+ }
168
+ }
169
+ if (featureStories.length > 0) {
170
+ logger.warn(`${featureId} already has ${featureStories.length} story/stories:`);
171
+ for (const s of featureStories) {
172
+ console.log(chalk.dim(` ${s.id}: ${s.title}`));
173
+ }
174
+ const continueCreate = await promptConfirm('Generate additional stories? (AI will avoid duplicates)', false);
175
+ if (!continueCreate) {
176
+ logger.info('Story creation cancelled.');
177
+ return 0;
178
+ }
179
+ }
180
+ const existingTitles = featureStories.map((s) => `${s.id}: ${s.title}`);
181
+ logger.dim('AI is generating user stories...');
182
+ try {
183
+ const provider = await getAIProvider(config);
184
+ const messages = buildStoriesPrompt(featureRaw, epicRaw, existingTitles);
185
+ const result = await generateStreamingJSON(provider, messages, aiStoriesResponseSchema);
186
+ // Display generated stories
187
+ console.log(chalk.dim('━'.repeat(50)));
188
+ result.stories.forEach((story, i) => {
189
+ console.log(chalk.bold(` ${i + 1}. ${story.title}`));
190
+ console.log(chalk.dim(` As a ${story.role}, I want to ${story.goal}`));
191
+ console.log(chalk.dim(` So that ${story.benefit}`));
192
+ console.log(` Scenarios: ${story.gherkinScenarios.length}`);
193
+ });
194
+ console.log(chalk.dim('━'.repeat(50)));
195
+ const confirmAll = await promptConfirm(`Create all ${result.stories.length} user stories?`, true);
196
+ if (!confirmAll) {
197
+ logger.info('Story creation cancelled.');
198
+ return 0;
199
+ }
200
+ const createdIds = [];
201
+ const storyDir = path.join(projectDir, getArtifactDir(config, 'story'));
202
+ const featureFilename = await resolveArtifactFilename(projectDir, config, 'feature', featureId);
203
+ for (const story of result.stories) {
204
+ // Create the user story markdown
205
+ const { id, filePath } = await createArtifact(projectDir, config, 'story', 'stories/user-story.md.hbs', {
206
+ title: story.title,
207
+ featureId,
208
+ featureFilename,
209
+ role: story.role,
210
+ goal: story.goal,
211
+ benefit: story.benefit,
212
+ additionalNotes: story.additionalNotes || undefined,
213
+ });
214
+ // Create companion Gherkin file
215
+ const gherkinContent = await renderTemplate('stories/gherkin.feature.hbs', {
216
+ id,
217
+ title: story.title,
218
+ role: story.role,
219
+ goal: story.goal,
220
+ benefit: story.benefit,
221
+ scenarios: story.gherkinScenarios.map((s) => ({
222
+ name: s.name,
223
+ given: s.given,
224
+ when: s.when,
225
+ then: s.then,
226
+ })),
227
+ }, config.templateOverrides);
228
+ const gherkinPath = path.join(storyDir, `${id}-gherkin.feature`);
229
+ await writeFile(gherkinPath, gherkinContent);
230
+ createdIds.push(id);
231
+ await addChildReference(projectDir, config, 'feature', featureId, 'story', id, story.title);
232
+ logger.success(`Created ${id}: ${story.title}`);
233
+ logger.dim(` ${filePath}`);
234
+ }
235
+ logger.dim('');
236
+ logger.heading('Next steps:');
237
+ logger.dim(` 1. planr task create --story ${createdIds[0]} — Generate implementation tasks`);
238
+ logger.dim(` 2. planr task implement TASK-* — Implement with your coding agent`);
239
+ return createdIds.length;
240
+ }
241
+ catch (err) {
242
+ const { AIError } = await import('../../ai/errors.js');
243
+ if (err instanceof AIError) {
244
+ logger.error(err.userMessage);
245
+ }
246
+ else {
247
+ throw err;
248
+ }
249
+ return 0;
250
+ }
251
+ }
252
+ async function createStoryManually(projectDir, config, opts) {
253
+ logger.heading(`Create User Story (from ${opts.feature})`);
254
+ const title = opts.title || (await promptText('Story title:'));
255
+ const role = await promptText('As a (role):');
256
+ const goal = await promptText('I want to (goal):');
257
+ const benefit = await promptText('So that (benefit):');
258
+ const additionalNotes = await promptText('Additional notes:', '');
259
+ const featureFilename = await resolveArtifactFilename(projectDir, config, 'feature', opts.feature);
260
+ const { id, filePath } = await createArtifact(projectDir, config, 'story', 'stories/user-story.md.hbs', {
261
+ title,
262
+ featureId: opts.feature,
263
+ featureFilename,
264
+ role,
265
+ goal,
266
+ benefit,
267
+ additionalNotes: additionalNotes || undefined,
268
+ });
269
+ // Create companion Gherkin file
270
+ const storyDir = path.join(projectDir, getArtifactDir(config, 'story'));
271
+ const gherkinContent = await renderTemplate('stories/gherkin.feature.hbs', {
272
+ id,
273
+ title,
274
+ role,
275
+ goal,
276
+ benefit,
277
+ scenarios: [
278
+ {
279
+ name: 'Happy path',
280
+ given: 'the preconditions are met',
281
+ when: `the user ${goal.toLowerCase()}`,
282
+ then: 'the expected outcome occurs',
283
+ },
284
+ ],
285
+ }, config.templateOverrides);
286
+ const gherkinPath = path.join(storyDir, `${id}-gherkin.feature`);
287
+ await writeFile(gherkinPath, gherkinContent);
288
+ await addChildReference(projectDir, config, 'feature', opts.feature, 'story', id, title);
289
+ logger.success(`Created user story ${id}: ${title}`);
290
+ logger.dim(` ${filePath}`);
291
+ logger.dim(` ${gherkinPath}`);
292
+ logger.dim('');
293
+ logger.dim(`Next: planr task create --story ${id}`);
294
+ }
81
295
  //# sourceMappingURL=story.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"story.js","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAE1E,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wCAAwC,CAAC;SACrD,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,2BAA2B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAElE,iCAAiC;QACjC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,cAAc,CAC3C,UAAU,EACV,MAAM,EACN,OAAO,EACP,2BAA2B,EAC3B;YACE,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,eAAe,EAAE,eAAe,IAAI,SAAS;SAC9C,CACF,CAAC;QAEF,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,MAAM,cAAc,CACzC,6BAA6B,EAC7B;YACE,EAAE;YACF,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE,2BAA2B;oBAClC,IAAI,EAAE,YAAY,IAAI,CAAC,WAAW,EAAE,EAAE;oBACtC,IAAI,EAAE,6BAA6B;iBACpC;aACF;SACF,EACD,MAAM,CAAC,iBAAiB,CACzB,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACjE,MAAM,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CACT,0EAA0E,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"story.js","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `planr sync` command.
3
+ *
4
+ * Validates and repairs cross-references across all artifacts:
5
+ * - Removes links to non-existent artifacts
6
+ * - Adds missing links (e.g., feature references epic but epic doesn't list it)
7
+ * - Deduplicates link lists
8
+ * - Reports all fixes
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare function registerSyncCommand(program: Command): void;
12
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAuDnD"}