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
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Zod schemas for validating AI JSON responses.
3
+ *
4
+ * These ensure the AI returned all required fields in the correct
5
+ * format before we pass data to artifact creation.
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const aiEpicResponseSchema: z.ZodObject<{
9
+ title: z.ZodString;
10
+ owner: z.ZodString;
11
+ businessValue: z.ZodString;
12
+ targetUsers: z.ZodString;
13
+ problemStatement: z.ZodString;
14
+ solutionOverview: z.ZodString;
15
+ successCriteria: z.ZodUnion<[z.ZodArray<z.ZodString, "many">, z.ZodEffects<z.ZodString, string[], string>]>;
16
+ keyFeatures: z.ZodArray<z.ZodString, "many">;
17
+ dependencies: z.ZodDefault<z.ZodString>;
18
+ risks: z.ZodDefault<z.ZodString>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ title: string;
21
+ dependencies: string;
22
+ owner: string;
23
+ businessValue: string;
24
+ targetUsers: string;
25
+ problemStatement: string;
26
+ solutionOverview: string;
27
+ successCriteria: string[];
28
+ keyFeatures: string[];
29
+ risks: string;
30
+ }, {
31
+ title: string;
32
+ owner: string;
33
+ businessValue: string;
34
+ targetUsers: string;
35
+ problemStatement: string;
36
+ solutionOverview: string;
37
+ successCriteria: string | string[];
38
+ keyFeatures: string[];
39
+ dependencies?: string | undefined;
40
+ risks?: string | undefined;
41
+ }>;
42
+ export type AIEpicResponse = z.infer<typeof aiEpicResponseSchema>;
43
+ export declare const aiFeatureSchema: z.ZodObject<{
44
+ title: z.ZodString;
45
+ overview: z.ZodString;
46
+ functionalRequirements: z.ZodArray<z.ZodString, "many">;
47
+ dependencies: z.ZodDefault<z.ZodString>;
48
+ technicalConsiderations: z.ZodDefault<z.ZodString>;
49
+ risks: z.ZodDefault<z.ZodString>;
50
+ successMetrics: z.ZodString;
51
+ }, "strip", z.ZodTypeAny, {
52
+ title: string;
53
+ dependencies: string;
54
+ risks: string;
55
+ overview: string;
56
+ functionalRequirements: string[];
57
+ technicalConsiderations: string;
58
+ successMetrics: string;
59
+ }, {
60
+ title: string;
61
+ overview: string;
62
+ functionalRequirements: string[];
63
+ successMetrics: string;
64
+ dependencies?: string | undefined;
65
+ risks?: string | undefined;
66
+ technicalConsiderations?: string | undefined;
67
+ }>;
68
+ export declare const aiFeaturesResponseSchema: z.ZodObject<{
69
+ features: z.ZodArray<z.ZodObject<{
70
+ title: z.ZodString;
71
+ overview: z.ZodString;
72
+ functionalRequirements: z.ZodArray<z.ZodString, "many">;
73
+ dependencies: z.ZodDefault<z.ZodString>;
74
+ technicalConsiderations: z.ZodDefault<z.ZodString>;
75
+ risks: z.ZodDefault<z.ZodString>;
76
+ successMetrics: z.ZodString;
77
+ }, "strip", z.ZodTypeAny, {
78
+ title: string;
79
+ dependencies: string;
80
+ risks: string;
81
+ overview: string;
82
+ functionalRequirements: string[];
83
+ technicalConsiderations: string;
84
+ successMetrics: string;
85
+ }, {
86
+ title: string;
87
+ overview: string;
88
+ functionalRequirements: string[];
89
+ successMetrics: string;
90
+ dependencies?: string | undefined;
91
+ risks?: string | undefined;
92
+ technicalConsiderations?: string | undefined;
93
+ }>, "many">;
94
+ }, "strip", z.ZodTypeAny, {
95
+ features: {
96
+ title: string;
97
+ dependencies: string;
98
+ risks: string;
99
+ overview: string;
100
+ functionalRequirements: string[];
101
+ technicalConsiderations: string;
102
+ successMetrics: string;
103
+ }[];
104
+ }, {
105
+ features: {
106
+ title: string;
107
+ overview: string;
108
+ functionalRequirements: string[];
109
+ successMetrics: string;
110
+ dependencies?: string | undefined;
111
+ risks?: string | undefined;
112
+ technicalConsiderations?: string | undefined;
113
+ }[];
114
+ }>;
115
+ export type AIFeaturesResponse = z.infer<typeof aiFeaturesResponseSchema>;
116
+ export declare const aiGherkinScenarioSchema: z.ZodObject<{
117
+ name: z.ZodString;
118
+ given: z.ZodString;
119
+ when: z.ZodString;
120
+ then: z.ZodString;
121
+ }, "strip", z.ZodTypeAny, {
122
+ then: string;
123
+ name: string;
124
+ given: string;
125
+ when: string;
126
+ }, {
127
+ then: string;
128
+ name: string;
129
+ given: string;
130
+ when: string;
131
+ }>;
132
+ export declare const aiStorySchema: z.ZodObject<{
133
+ title: z.ZodString;
134
+ role: z.ZodString;
135
+ goal: z.ZodString;
136
+ benefit: z.ZodString;
137
+ additionalNotes: z.ZodDefault<z.ZodString>;
138
+ gherkinScenarios: z.ZodArray<z.ZodObject<{
139
+ name: z.ZodString;
140
+ given: z.ZodString;
141
+ when: z.ZodString;
142
+ then: z.ZodString;
143
+ }, "strip", z.ZodTypeAny, {
144
+ then: string;
145
+ name: string;
146
+ given: string;
147
+ when: string;
148
+ }, {
149
+ then: string;
150
+ name: string;
151
+ given: string;
152
+ when: string;
153
+ }>, "many">;
154
+ }, "strip", z.ZodTypeAny, {
155
+ title: string;
156
+ role: string;
157
+ goal: string;
158
+ benefit: string;
159
+ additionalNotes: string;
160
+ gherkinScenarios: {
161
+ then: string;
162
+ name: string;
163
+ given: string;
164
+ when: string;
165
+ }[];
166
+ }, {
167
+ title: string;
168
+ role: string;
169
+ goal: string;
170
+ benefit: string;
171
+ gherkinScenarios: {
172
+ then: string;
173
+ name: string;
174
+ given: string;
175
+ when: string;
176
+ }[];
177
+ additionalNotes?: string | undefined;
178
+ }>;
179
+ export declare const aiStoriesResponseSchema: z.ZodObject<{
180
+ stories: z.ZodArray<z.ZodObject<{
181
+ title: z.ZodString;
182
+ role: z.ZodString;
183
+ goal: z.ZodString;
184
+ benefit: z.ZodString;
185
+ additionalNotes: z.ZodDefault<z.ZodString>;
186
+ gherkinScenarios: z.ZodArray<z.ZodObject<{
187
+ name: z.ZodString;
188
+ given: z.ZodString;
189
+ when: z.ZodString;
190
+ then: z.ZodString;
191
+ }, "strip", z.ZodTypeAny, {
192
+ then: string;
193
+ name: string;
194
+ given: string;
195
+ when: string;
196
+ }, {
197
+ then: string;
198
+ name: string;
199
+ given: string;
200
+ when: string;
201
+ }>, "many">;
202
+ }, "strip", z.ZodTypeAny, {
203
+ title: string;
204
+ role: string;
205
+ goal: string;
206
+ benefit: string;
207
+ additionalNotes: string;
208
+ gherkinScenarios: {
209
+ then: string;
210
+ name: string;
211
+ given: string;
212
+ when: string;
213
+ }[];
214
+ }, {
215
+ title: string;
216
+ role: string;
217
+ goal: string;
218
+ benefit: string;
219
+ gherkinScenarios: {
220
+ then: string;
221
+ name: string;
222
+ given: string;
223
+ when: string;
224
+ }[];
225
+ additionalNotes?: string | undefined;
226
+ }>, "many">;
227
+ }, "strip", z.ZodTypeAny, {
228
+ stories: {
229
+ title: string;
230
+ role: string;
231
+ goal: string;
232
+ benefit: string;
233
+ additionalNotes: string;
234
+ gherkinScenarios: {
235
+ then: string;
236
+ name: string;
237
+ given: string;
238
+ when: string;
239
+ }[];
240
+ }[];
241
+ }, {
242
+ stories: {
243
+ title: string;
244
+ role: string;
245
+ goal: string;
246
+ benefit: string;
247
+ gherkinScenarios: {
248
+ then: string;
249
+ name: string;
250
+ given: string;
251
+ when: string;
252
+ }[];
253
+ additionalNotes?: string | undefined;
254
+ }[];
255
+ }>;
256
+ export type AIStoriesResponse = z.infer<typeof aiStoriesResponseSchema>;
257
+ export declare const aiSubtaskSchema: z.ZodObject<{
258
+ id: z.ZodString;
259
+ title: z.ZodString;
260
+ }, "strip", z.ZodTypeAny, {
261
+ title: string;
262
+ id: string;
263
+ }, {
264
+ title: string;
265
+ id: string;
266
+ }>;
267
+ export declare const aiTaskGroupSchema: z.ZodObject<{
268
+ id: z.ZodString;
269
+ title: z.ZodString;
270
+ subtasks: z.ZodDefault<z.ZodArray<z.ZodObject<{
271
+ id: z.ZodString;
272
+ title: z.ZodString;
273
+ }, "strip", z.ZodTypeAny, {
274
+ title: string;
275
+ id: string;
276
+ }, {
277
+ title: string;
278
+ id: string;
279
+ }>, "many">>;
280
+ }, "strip", z.ZodTypeAny, {
281
+ title: string;
282
+ id: string;
283
+ subtasks: {
284
+ title: string;
285
+ id: string;
286
+ }[];
287
+ }, {
288
+ title: string;
289
+ id: string;
290
+ subtasks?: {
291
+ title: string;
292
+ id: string;
293
+ }[] | undefined;
294
+ }>;
295
+ export declare const aiACMappingSchema: z.ZodObject<{
296
+ criterion: z.ZodString;
297
+ sourceStoryId: z.ZodString;
298
+ taskIds: z.ZodArray<z.ZodString, "many">;
299
+ }, "strip", z.ZodTypeAny, {
300
+ criterion: string;
301
+ sourceStoryId: string;
302
+ taskIds: string[];
303
+ }, {
304
+ criterion: string;
305
+ sourceStoryId: string;
306
+ taskIds: string[];
307
+ }>;
308
+ export declare const aiRelevantFileSchema: z.ZodObject<{
309
+ path: z.ZodString;
310
+ reason: z.ZodString;
311
+ }, "strip", z.ZodTypeAny, {
312
+ path: string;
313
+ reason: string;
314
+ }, {
315
+ path: string;
316
+ reason: string;
317
+ }>;
318
+ export declare const aiTasksResponseSchema: z.ZodObject<{
319
+ title: z.ZodString;
320
+ tasks: z.ZodArray<z.ZodObject<{
321
+ id: z.ZodString;
322
+ title: z.ZodString;
323
+ subtasks: z.ZodDefault<z.ZodArray<z.ZodObject<{
324
+ id: z.ZodString;
325
+ title: z.ZodString;
326
+ }, "strip", z.ZodTypeAny, {
327
+ title: string;
328
+ id: string;
329
+ }, {
330
+ title: string;
331
+ id: string;
332
+ }>, "many">>;
333
+ }, "strip", z.ZodTypeAny, {
334
+ title: string;
335
+ id: string;
336
+ subtasks: {
337
+ title: string;
338
+ id: string;
339
+ }[];
340
+ }, {
341
+ title: string;
342
+ id: string;
343
+ subtasks?: {
344
+ title: string;
345
+ id: string;
346
+ }[] | undefined;
347
+ }>, "many">;
348
+ acceptanceCriteriaMapping: z.ZodDefault<z.ZodArray<z.ZodObject<{
349
+ criterion: z.ZodString;
350
+ sourceStoryId: z.ZodString;
351
+ taskIds: z.ZodArray<z.ZodString, "many">;
352
+ }, "strip", z.ZodTypeAny, {
353
+ criterion: string;
354
+ sourceStoryId: string;
355
+ taskIds: string[];
356
+ }, {
357
+ criterion: string;
358
+ sourceStoryId: string;
359
+ taskIds: string[];
360
+ }>, "many">>;
361
+ relevantFiles: z.ZodDefault<z.ZodArray<z.ZodObject<{
362
+ path: z.ZodString;
363
+ reason: z.ZodString;
364
+ }, "strip", z.ZodTypeAny, {
365
+ path: string;
366
+ reason: string;
367
+ }, {
368
+ path: string;
369
+ reason: string;
370
+ }>, "many">>;
371
+ }, "strip", z.ZodTypeAny, {
372
+ tasks: {
373
+ title: string;
374
+ id: string;
375
+ subtasks: {
376
+ title: string;
377
+ id: string;
378
+ }[];
379
+ }[];
380
+ title: string;
381
+ acceptanceCriteriaMapping: {
382
+ criterion: string;
383
+ sourceStoryId: string;
384
+ taskIds: string[];
385
+ }[];
386
+ relevantFiles: {
387
+ path: string;
388
+ reason: string;
389
+ }[];
390
+ }, {
391
+ tasks: {
392
+ title: string;
393
+ id: string;
394
+ subtasks?: {
395
+ title: string;
396
+ id: string;
397
+ }[] | undefined;
398
+ }[];
399
+ title: string;
400
+ acceptanceCriteriaMapping?: {
401
+ criterion: string;
402
+ sourceStoryId: string;
403
+ taskIds: string[];
404
+ }[] | undefined;
405
+ relevantFiles?: {
406
+ path: string;
407
+ reason: string;
408
+ }[] | undefined;
409
+ }>;
410
+ export type AITasksResponse = z.infer<typeof aiTasksResponseSchema>;
411
+ export declare const aiRefineResponseSchema: z.ZodObject<{
412
+ suggestions: z.ZodArray<z.ZodString, "many">;
413
+ improved: z.ZodRecord<z.ZodString, z.ZodUnknown>;
414
+ improvedMarkdown: z.ZodString;
415
+ }, "strip", z.ZodTypeAny, {
416
+ suggestions: string[];
417
+ improved: Record<string, unknown>;
418
+ improvedMarkdown: string;
419
+ }, {
420
+ suggestions: string[];
421
+ improved: Record<string, unknown>;
422
+ improvedMarkdown: string;
423
+ }>;
424
+ export type AIRefineResponse = z.infer<typeof aiRefineResponseSchema>;
425
+ //# sourceMappingURL=ai-response-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-response-schemas.d.ts","sourceRoot":"","sources":["../../../src/ai/schemas/ai-response-schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAQ1B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAI1E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOxB,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAElC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAIpE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Zod schemas for validating AI JSON responses.
3
+ *
4
+ * These ensure the AI returned all required fields in the correct
5
+ * format before we pass data to artifact creation.
6
+ */
7
+ import { z } from 'zod';
8
+ // --- Epic ---
9
+ export const aiEpicResponseSchema = z.object({
10
+ title: z.string().min(1),
11
+ owner: z.string().min(1),
12
+ businessValue: z.string().min(1),
13
+ targetUsers: z.string().min(1),
14
+ problemStatement: z.string().min(1),
15
+ solutionOverview: z.string().min(1),
16
+ successCriteria: z.union([
17
+ z.array(z.string().min(1)).min(1),
18
+ // Gracefully handle string format: split by semicolons
19
+ z.string().min(1).transform((s) => s.split(';').map((item) => item.trim()).filter(Boolean)),
20
+ ]),
21
+ keyFeatures: z.array(z.string().min(1)).min(1),
22
+ dependencies: z.string().default('None'),
23
+ risks: z.string().default('None'),
24
+ });
25
+ // --- Features ---
26
+ export const aiFeatureSchema = z.object({
27
+ title: z.string().min(1),
28
+ overview: z.string().min(1),
29
+ functionalRequirements: z.array(z.string().min(1)).min(1),
30
+ dependencies: z.string().default('None'),
31
+ technicalConsiderations: z.string().default('None'),
32
+ risks: z.string().default('None'),
33
+ successMetrics: z.string().min(1),
34
+ });
35
+ export const aiFeaturesResponseSchema = z.object({
36
+ features: z.array(aiFeatureSchema).min(1),
37
+ });
38
+ // --- Stories ---
39
+ export const aiGherkinScenarioSchema = z.object({
40
+ name: z.string().min(1),
41
+ given: z.string().min(1),
42
+ when: z.string().min(1),
43
+ then: z.string().min(1),
44
+ });
45
+ export const aiStorySchema = z.object({
46
+ title: z.string().min(1),
47
+ role: z.string().min(1),
48
+ goal: z.string().min(1),
49
+ benefit: z.string().min(1),
50
+ additionalNotes: z.string().default(''),
51
+ gherkinScenarios: z.array(aiGherkinScenarioSchema).min(1),
52
+ });
53
+ export const aiStoriesResponseSchema = z.object({
54
+ stories: z.array(aiStorySchema).min(1),
55
+ });
56
+ // --- Tasks ---
57
+ export const aiSubtaskSchema = z.object({
58
+ id: z.string().min(1),
59
+ title: z.string().min(1),
60
+ });
61
+ export const aiTaskGroupSchema = z.object({
62
+ id: z.string().min(1),
63
+ title: z.string().min(1),
64
+ subtasks: z.array(aiSubtaskSchema).default([]),
65
+ });
66
+ export const aiACMappingSchema = z.object({
67
+ criterion: z.string().min(1),
68
+ sourceStoryId: z.string().min(1),
69
+ taskIds: z.array(z.string().min(1)),
70
+ });
71
+ export const aiRelevantFileSchema = z.object({
72
+ path: z.string().min(1),
73
+ reason: z.string().min(1),
74
+ });
75
+ export const aiTasksResponseSchema = z.object({
76
+ title: z.string().min(1),
77
+ tasks: z.array(aiTaskGroupSchema).min(1),
78
+ acceptanceCriteriaMapping: z.array(aiACMappingSchema).default([]),
79
+ relevantFiles: z.array(aiRelevantFileSchema).default([]),
80
+ });
81
+ // --- Refine ---
82
+ export const aiRefineResponseSchema = z.object({
83
+ suggestions: z.array(z.string().min(1)).min(1),
84
+ improved: z.record(z.unknown()),
85
+ improvedMarkdown: z.string().min(1),
86
+ });
87
+ //# sourceMappingURL=ai-response-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-response-schemas.js","sourceRoot":"","sources":["../../../src/ai/schemas/ai-response-schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Core type definitions for the AI provider abstraction layer.
3
+ *
4
+ * All AI providers (Anthropic, OpenAI, Ollama) implement the `AIProvider`
5
+ * interface, enabling seamless switching between backends.
6
+ */
7
+ export interface AIMessage {
8
+ role: 'system' | 'user' | 'assistant';
9
+ content: string;
10
+ }
11
+ export interface AIRequestOptions {
12
+ temperature?: number;
13
+ maxTokens?: number;
14
+ jsonMode?: boolean;
15
+ }
16
+ export interface AIProviderConfig {
17
+ provider: AIProviderName;
18
+ model?: string;
19
+ apiKey?: string;
20
+ baseUrl?: string;
21
+ }
22
+ export type AIProviderName = 'anthropic' | 'openai' | 'ollama';
23
+ export type CodingAgentName = 'claude' | 'cursor' | 'codex';
24
+ export interface AIProvider {
25
+ readonly name: AIProviderName;
26
+ readonly model: string;
27
+ /**
28
+ * Stream a chat completion, yielding text chunks as they arrive.
29
+ * Use this for real-time terminal output during generation.
30
+ */
31
+ chat(messages: AIMessage[], options?: AIRequestOptions): AsyncIterable<string>;
32
+ /**
33
+ * Get a complete chat response (non-streaming).
34
+ * Use this when you need the full response before processing (e.g., JSON parsing).
35
+ */
36
+ chatSync(messages: AIMessage[], options?: AIRequestOptions): Promise<string>;
37
+ }
38
+ export declare const DEFAULT_MODELS: Record<AIProviderName, string>;
39
+ export declare const ENV_KEY_MAP: Record<string, string>;
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE/E;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9E;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAIhD,CAAC;AAEX,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Core type definitions for the AI provider abstraction layer.
3
+ *
4
+ * All AI providers (Anthropic, OpenAI, Ollama) implement the `AIProvider`
5
+ * interface, enabling seamless switching between backends.
6
+ */
7
+ export const DEFAULT_MODELS = {
8
+ anthropic: 'claude-sonnet-4-20250514',
9
+ openai: 'gpt-4o',
10
+ ollama: 'llama3.1',
11
+ };
12
+ export const ENV_KEY_MAP = {
13
+ anthropic: 'ANTHROPIC_API_KEY',
14
+ openai: 'OPENAI_API_KEY',
15
+ };
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwCH,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,SAAS,EAAE,0BAA0B;IACrC,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,UAAU;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;CAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"checklist.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/checklist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,QAiCxD"}
1
+ {"version":3,"file":"checklist.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/checklist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,QAqGxD"}
@@ -1,6 +1,9 @@
1
1
  import { loadConfig } from '../../services/config-service.js';
2
- import { readChecklist, resetChecklist, createChecklist, } from '../../services/checklist-service.js';
2
+ import { readChecklist, resetChecklist, createChecklist, getChecklistPath, parseChecklistItems, toggleChecklistItems, getChecklistProgress, } from '../../services/checklist-service.js';
3
+ import { promptCheckbox } from '../../services/prompt-service.js';
4
+ import { writeFile } from '../../utils/fs.js';
3
5
  import { logger } from '../../utils/logger.js';
6
+ import chalk from 'chalk';
4
7
  export function registerChecklistCommand(program) {
5
8
  const checklist = program
6
9
  .command('checklist')
@@ -19,8 +22,64 @@ export function registerChecklistCommand(program) {
19
22
  }
20
23
  if (content) {
21
24
  console.log(content);
25
+ const items = parseChecklistItems(content);
26
+ if (items.length > 0) {
27
+ const { done, total, percent } = getChecklistProgress(items);
28
+ const color = percent >= 75 ? chalk.green : percent >= 25 ? chalk.yellow : chalk.red;
29
+ console.log(color(`\nProgress: ${done}/${total} complete (${percent}%)`));
30
+ }
22
31
  }
23
32
  });
33
+ checklist
34
+ .command('toggle')
35
+ .description('Interactively toggle checklist items')
36
+ .action(async () => {
37
+ const projectDir = program.opts().projectDir;
38
+ const config = await loadConfig(projectDir);
39
+ let content = await readChecklist(projectDir, config);
40
+ if (!content) {
41
+ logger.info('No checklist found. Creating one...');
42
+ await createChecklist(projectDir, config);
43
+ content = await readChecklist(projectDir, config);
44
+ }
45
+ if (!content) {
46
+ logger.error('Could not read checklist.');
47
+ return;
48
+ }
49
+ const items = parseChecklistItems(content);
50
+ if (items.length === 0) {
51
+ logger.info('No checklist items found.');
52
+ return;
53
+ }
54
+ const choices = items.map((item) => ({
55
+ name: `${item.index}. ${item.activity}`,
56
+ value: String(item.index),
57
+ checked: item.done,
58
+ }));
59
+ const selected = await promptCheckbox('Toggle checklist items (space to toggle, enter to confirm):', choices);
60
+ const selectedSet = new Set(selected.map(Number));
61
+ // Find items that changed: were checked but now unchecked, or vice versa
62
+ const toToggle = new Set();
63
+ for (const item of items) {
64
+ const wasChecked = item.done;
65
+ const nowChecked = selectedSet.has(item.index);
66
+ if (wasChecked !== nowChecked) {
67
+ toToggle.add(item.index);
68
+ }
69
+ }
70
+ if (toToggle.size === 0) {
71
+ logger.info('No changes made.');
72
+ return;
73
+ }
74
+ const updated = toggleChecklistItems(content, toToggle, items);
75
+ const filePath = getChecklistPath(projectDir, config);
76
+ await writeFile(filePath, updated);
77
+ const updatedItems = parseChecklistItems(updated);
78
+ const { done, total, percent } = getChecklistProgress(updatedItems);
79
+ const color = percent >= 75 ? chalk.green : percent >= 25 ? chalk.yellow : chalk.red;
80
+ logger.success(`Updated ${toToggle.size} item(s).`);
81
+ console.log(color(`Progress: ${done}/${total} complete (${percent}%)`));
82
+ });
24
83
  checklist
25
84
  .command('reset')
26
85
  .description('Reset the checklist to its initial state')
@@ -1 +1 @@
1
- {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../../../src/cli/commands/checklist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,wCAAwC,CAAC,CAAC;IAEzD,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yCAAyC,CAAC;SACtD,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,IAAI,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACnD,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC1C,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0CAA0C,CAAC;SACvD,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;QAC5C,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../../../src/cli/commands/checklist.ts"],"names":[],"mappings":"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"}