smartlisa 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 (155) hide show
  1. package/README.md +77 -0
  2. package/dist/cli.js +6517 -0
  3. package/dist/src/adapters/cli/formatter.d.ts +34 -0
  4. package/dist/src/adapters/cli/formatter.d.ts.map +1 -0
  5. package/dist/src/adapters/cli/formatter.js +254 -0
  6. package/dist/src/adapters/cli/formatter.js.map +1 -0
  7. package/dist/src/adapters/cli/index.d.ts +14 -0
  8. package/dist/src/adapters/cli/index.d.ts.map +1 -0
  9. package/dist/src/adapters/cli/index.js +781 -0
  10. package/dist/src/adapters/cli/index.js.map +1 -0
  11. package/dist/src/adapters/state/__tests__/api.test.d.ts +8 -0
  12. package/dist/src/adapters/state/__tests__/api.test.d.ts.map +1 -0
  13. package/dist/src/adapters/state/__tests__/api.test.js +500 -0
  14. package/dist/src/adapters/state/__tests__/api.test.js.map +1 -0
  15. package/dist/src/adapters/state/__tests__/filesystem.test.d.ts +7 -0
  16. package/dist/src/adapters/state/__tests__/filesystem.test.d.ts.map +1 -0
  17. package/dist/src/adapters/state/__tests__/filesystem.test.js +418 -0
  18. package/dist/src/adapters/state/__tests__/filesystem.test.js.map +1 -0
  19. package/dist/src/adapters/state/api.d.ts +148 -0
  20. package/dist/src/adapters/state/api.d.ts.map +1 -0
  21. package/dist/src/adapters/state/api.js +337 -0
  22. package/dist/src/adapters/state/api.js.map +1 -0
  23. package/dist/src/adapters/state/filesystem.d.ts +80 -0
  24. package/dist/src/adapters/state/filesystem.d.ts.map +1 -0
  25. package/dist/src/adapters/state/filesystem.js +228 -0
  26. package/dist/src/adapters/state/filesystem.js.map +1 -0
  27. package/dist/src/adapters/state/index.d.ts +9 -0
  28. package/dist/src/adapters/state/index.d.ts.map +1 -0
  29. package/dist/src/adapters/state/index.js +10 -0
  30. package/dist/src/adapters/state/index.js.map +1 -0
  31. package/dist/src/adapters/state/types.d.ts +131 -0
  32. package/dist/src/adapters/state/types.d.ts.map +1 -0
  33. package/dist/src/adapters/state/types.js +11 -0
  34. package/dist/src/adapters/state/types.js.map +1 -0
  35. package/dist/src/core/__tests__/context.test.d.ts +12 -0
  36. package/dist/src/core/__tests__/context.test.d.ts.map +1 -0
  37. package/dist/src/core/__tests__/context.test.js +528 -0
  38. package/dist/src/core/__tests__/context.test.js.map +1 -0
  39. package/dist/src/core/__tests__/discover.test.d.ts +2 -0
  40. package/dist/src/core/__tests__/discover.test.d.ts.map +1 -0
  41. package/dist/src/core/__tests__/discover.test.js +667 -0
  42. package/dist/src/core/__tests__/discover.test.js.map +1 -0
  43. package/dist/src/core/__tests__/engine.test.d.ts +2 -0
  44. package/dist/src/core/__tests__/engine.test.d.ts.map +1 -0
  45. package/dist/src/core/__tests__/engine.test.js +444 -0
  46. package/dist/src/core/__tests__/engine.test.js.map +1 -0
  47. package/dist/src/core/__tests__/feedback.test.d.ts +2 -0
  48. package/dist/src/core/__tests__/feedback.test.d.ts.map +1 -0
  49. package/dist/src/core/__tests__/feedback.test.js +351 -0
  50. package/dist/src/core/__tests__/feedback.test.js.map +1 -0
  51. package/dist/src/core/__tests__/plan.test.d.ts +2 -0
  52. package/dist/src/core/__tests__/plan.test.d.ts.map +1 -0
  53. package/dist/src/core/__tests__/plan.test.js +429 -0
  54. package/dist/src/core/__tests__/plan.test.js.map +1 -0
  55. package/dist/src/core/__tests__/schemas.test.d.ts +2 -0
  56. package/dist/src/core/__tests__/schemas.test.d.ts.map +1 -0
  57. package/dist/src/core/__tests__/schemas.test.js +614 -0
  58. package/dist/src/core/__tests__/schemas.test.js.map +1 -0
  59. package/dist/src/core/__tests__/state.test.d.ts +2 -0
  60. package/dist/src/core/__tests__/state.test.d.ts.map +1 -0
  61. package/dist/src/core/__tests__/state.test.js +1107 -0
  62. package/dist/src/core/__tests__/state.test.js.map +1 -0
  63. package/dist/src/core/__tests__/status.test.d.ts +2 -0
  64. package/dist/src/core/__tests__/status.test.d.ts.map +1 -0
  65. package/dist/src/core/__tests__/status.test.js +600 -0
  66. package/dist/src/core/__tests__/status.test.js.map +1 -0
  67. package/dist/src/core/__tests__/test-helpers.d.ts +28 -0
  68. package/dist/src/core/__tests__/test-helpers.d.ts.map +1 -0
  69. package/dist/src/core/__tests__/test-helpers.js +185 -0
  70. package/dist/src/core/__tests__/test-helpers.js.map +1 -0
  71. package/dist/src/core/__tests__/utils.test.d.ts +2 -0
  72. package/dist/src/core/__tests__/utils.test.d.ts.map +1 -0
  73. package/dist/src/core/__tests__/utils.test.js +276 -0
  74. package/dist/src/core/__tests__/utils.test.js.map +1 -0
  75. package/dist/src/core/__tests__/validate.test.d.ts +2 -0
  76. package/dist/src/core/__tests__/validate.test.d.ts.map +1 -0
  77. package/dist/src/core/__tests__/validate.test.js +354 -0
  78. package/dist/src/core/__tests__/validate.test.js.map +1 -0
  79. package/dist/src/core/commands/discover.d.ts +71 -0
  80. package/dist/src/core/commands/discover.d.ts.map +1 -0
  81. package/dist/src/core/commands/discover.js +687 -0
  82. package/dist/src/core/commands/discover.js.map +1 -0
  83. package/dist/src/core/commands/feedback.d.ts +49 -0
  84. package/dist/src/core/commands/feedback.d.ts.map +1 -0
  85. package/dist/src/core/commands/feedback.js +283 -0
  86. package/dist/src/core/commands/feedback.js.map +1 -0
  87. package/dist/src/core/commands/index.d.ts +11 -0
  88. package/dist/src/core/commands/index.d.ts.map +1 -0
  89. package/dist/src/core/commands/index.js +11 -0
  90. package/dist/src/core/commands/index.js.map +1 -0
  91. package/dist/src/core/commands/plan.d.ts +108 -0
  92. package/dist/src/core/commands/plan.d.ts.map +1 -0
  93. package/dist/src/core/commands/plan.js +621 -0
  94. package/dist/src/core/commands/plan.js.map +1 -0
  95. package/dist/src/core/commands/status.d.ts +72 -0
  96. package/dist/src/core/commands/status.d.ts.map +1 -0
  97. package/dist/src/core/commands/status.js +720 -0
  98. package/dist/src/core/commands/status.js.map +1 -0
  99. package/dist/src/core/commands/validate.d.ts +47 -0
  100. package/dist/src/core/commands/validate.d.ts.map +1 -0
  101. package/dist/src/core/commands/validate.js +608 -0
  102. package/dist/src/core/commands/validate.js.map +1 -0
  103. package/dist/src/core/engine.d.ts +294 -0
  104. package/dist/src/core/engine.d.ts.map +1 -0
  105. package/dist/src/core/engine.js +219 -0
  106. package/dist/src/core/engine.js.map +1 -0
  107. package/dist/src/core/index.d.ts +14 -0
  108. package/dist/src/core/index.d.ts.map +1 -0
  109. package/dist/src/core/index.js +18 -0
  110. package/dist/src/core/index.js.map +1 -0
  111. package/dist/src/core/prompts/context-helpers.d.ts +48 -0
  112. package/dist/src/core/prompts/context-helpers.d.ts.map +1 -0
  113. package/dist/src/core/prompts/context-helpers.js +206 -0
  114. package/dist/src/core/prompts/context-helpers.js.map +1 -0
  115. package/dist/src/core/prompts/discovery.d.ts +11 -0
  116. package/dist/src/core/prompts/discovery.d.ts.map +1 -0
  117. package/dist/src/core/prompts/discovery.js +179 -0
  118. package/dist/src/core/prompts/discovery.js.map +1 -0
  119. package/dist/src/core/prompts/feedback.d.ts +38 -0
  120. package/dist/src/core/prompts/feedback.d.ts.map +1 -0
  121. package/dist/src/core/prompts/feedback.js +292 -0
  122. package/dist/src/core/prompts/feedback.js.map +1 -0
  123. package/dist/src/core/prompts/index.d.ts +12 -0
  124. package/dist/src/core/prompts/index.d.ts.map +1 -0
  125. package/dist/src/core/prompts/index.js +12 -0
  126. package/dist/src/core/prompts/index.js.map +1 -0
  127. package/dist/src/core/prompts/planning.d.ts +15 -0
  128. package/dist/src/core/prompts/planning.d.ts.map +1 -0
  129. package/dist/src/core/prompts/planning.js +293 -0
  130. package/dist/src/core/prompts/planning.js.map +1 -0
  131. package/dist/src/core/prompts/status.d.ts +41 -0
  132. package/dist/src/core/prompts/status.d.ts.map +1 -0
  133. package/dist/src/core/prompts/status.js +270 -0
  134. package/dist/src/core/prompts/status.js.map +1 -0
  135. package/dist/src/core/prompts/validate.d.ts +62 -0
  136. package/dist/src/core/prompts/validate.d.ts.map +1 -0
  137. package/dist/src/core/prompts/validate.js +302 -0
  138. package/dist/src/core/prompts/validate.js.map +1 -0
  139. package/dist/src/core/schemas.d.ts +5045 -0
  140. package/dist/src/core/schemas.d.ts.map +1 -0
  141. package/dist/src/core/schemas.js +492 -0
  142. package/dist/src/core/schemas.js.map +1 -0
  143. package/dist/src/core/state.d.ts +156 -0
  144. package/dist/src/core/state.d.ts.map +1 -0
  145. package/dist/src/core/state.js +608 -0
  146. package/dist/src/core/state.js.map +1 -0
  147. package/dist/src/core/types.d.ts +167 -0
  148. package/dist/src/core/types.d.ts.map +1 -0
  149. package/dist/src/core/types.js +102 -0
  150. package/dist/src/core/types.js.map +1 -0
  151. package/dist/src/core/utils.d.ts +39 -0
  152. package/dist/src/core/utils.d.ts.map +1 -0
  153. package/dist/src/core/utils.js +208 -0
  154. package/dist/src/core/utils.js.map +1 -0
  155. package/package.json +77 -0
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Feedback Prompts for Ralph Engine
3
+ *
4
+ * AI guidance templates for feedback, story status, and blocker management.
5
+ */
6
+ import { enhanceWithContext } from "./context-helpers.js";
7
+ export function getMarkStoryGuidance(state) {
8
+ const { storyId, newStatus, reason } = state;
9
+ let situation;
10
+ let instructions;
11
+ const commands = [];
12
+ switch (newStatus) {
13
+ case "done":
14
+ situation = `Story ${storyId} marked as done`;
15
+ instructions = [
16
+ "Celebrate the completion",
17
+ "Check board for next available stories",
18
+ "Consider if any dependent stories are now unblocked",
19
+ ];
20
+ commands.push({
21
+ command: "status board",
22
+ description: "Check kanban board",
23
+ when: "To see next available work",
24
+ });
25
+ break;
26
+ case "blocked":
27
+ situation = `Story ${storyId} marked as blocked: ${reason || "No reason given"}`;
28
+ instructions = [
29
+ "Record the blocker details in feedback",
30
+ "Look for workarounds or alternative approaches",
31
+ "Consider if this impacts other stories",
32
+ "Escalate if needed",
33
+ ];
34
+ commands.push({
35
+ command: "feedback add",
36
+ args: `--story ${storyId} --type blocker --message '<details>'`,
37
+ description: "Record blocker details",
38
+ when: "If not already recorded",
39
+ }, {
40
+ command: "status board",
41
+ description: "Check other available stories",
42
+ when: "To continue work elsewhere",
43
+ });
44
+ break;
45
+ case "in_progress":
46
+ situation = `Story ${storyId} is now in progress`;
47
+ instructions = [
48
+ "Start implementation",
49
+ "Refer to acceptance criteria as checklist",
50
+ "Check architecture for technical guidance",
51
+ ];
52
+ commands.push({
53
+ command: "status how",
54
+ args: storyId,
55
+ description: "Get implementation guidance",
56
+ when: "For detailed implementation checklist",
57
+ }, {
58
+ command: "status context",
59
+ args: storyId,
60
+ description: "View full context",
61
+ when: "For architecture and requirements",
62
+ });
63
+ break;
64
+ case "review":
65
+ situation = `Story ${storyId} submitted for review`;
66
+ instructions = [
67
+ "Verify all acceptance criteria are met",
68
+ "Run tests if applicable",
69
+ "Wait for review feedback",
70
+ ];
71
+ commands.push({
72
+ command: "feedback mark",
73
+ args: `${storyId} done`,
74
+ description: "Mark as done",
75
+ when: "When review passes",
76
+ });
77
+ break;
78
+ case "todo":
79
+ situation = `Story ${storyId} moved to todo`;
80
+ instructions = ["Story is ready to be picked up", "Check dependencies before starting"];
81
+ commands.push({
82
+ command: "feedback mark",
83
+ args: `${storyId} in_progress`,
84
+ description: "Start working",
85
+ when: "When ready to begin",
86
+ });
87
+ break;
88
+ default:
89
+ situation = `Story ${storyId} status changed to ${newStatus}`;
90
+ instructions = ["Continue with the workflow"];
91
+ commands.push({
92
+ command: "status board",
93
+ description: "Check kanban board",
94
+ when: "To see project status",
95
+ });
96
+ }
97
+ // Extract epic ID from story ID (e.g., "E1.S2" -> "E1")
98
+ const epicId = storyId.split(".")[0];
99
+ return enhanceWithContext({ situation, instructions, commands }, { target: { type: "story", id: storyId, epicId } });
100
+ }
101
+ export function getAddFeedbackGuidance(state) {
102
+ const { feedbackId, type, storyId, markedBlocked } = state;
103
+ let situation;
104
+ let instructions;
105
+ const commands = [];
106
+ switch (type) {
107
+ case "blocker":
108
+ situation = markedBlocked
109
+ ? `Blocker recorded (${feedbackId}) and story ${storyId} marked blocked`
110
+ : `Blocker recorded: ${feedbackId}`;
111
+ instructions = [
112
+ "Document what you tried and why it's blocked",
113
+ "Look for alternative approaches",
114
+ "Consider if other stories can proceed",
115
+ "Escalate if this blocks critical path",
116
+ ];
117
+ commands.push({
118
+ command: "status board",
119
+ description: "Find other stories to work on",
120
+ when: "To continue with unblocked work",
121
+ });
122
+ break;
123
+ case "gap":
124
+ situation = `Gap identified: ${feedbackId}`;
125
+ instructions = [
126
+ "This indicates missing requirements or unclear specs",
127
+ "Consider if planning needs revision",
128
+ "Clarify with stakeholders if needed",
129
+ ];
130
+ commands.push({
131
+ command: "plan epic",
132
+ args: storyId.split(".")[0],
133
+ description: "Review epic planning",
134
+ when: "If PRD needs updates",
135
+ });
136
+ break;
137
+ case "scope":
138
+ situation = `Scope concern recorded: ${feedbackId}`;
139
+ instructions = [
140
+ "Story may need to be split or rescoped",
141
+ "Review acceptance criteria for clarity",
142
+ "Consider breaking into smaller stories",
143
+ ];
144
+ break;
145
+ case "conflict":
146
+ situation = `Conflict detected: ${feedbackId}`;
147
+ instructions = [
148
+ "Resolve the conflict before proceeding",
149
+ "Check if architectural changes are needed",
150
+ "May need to update dependent stories",
151
+ ];
152
+ break;
153
+ case "question":
154
+ situation = `Question recorded: ${feedbackId}`;
155
+ instructions = [
156
+ "Get clarification before proceeding",
157
+ "Document the answer when received",
158
+ "Update requirements if needed",
159
+ ];
160
+ break;
161
+ default:
162
+ situation = `Feedback recorded: ${feedbackId}`;
163
+ instructions = ["Review and address the feedback"];
164
+ }
165
+ commands.push({
166
+ command: "feedback list",
167
+ description: "View all feedback",
168
+ when: "To see pending items",
169
+ });
170
+ // Extract epic ID from story ID (e.g., "E1.S2" -> "E1")
171
+ const epicId = storyId.split(".")[0];
172
+ return enhanceWithContext({ situation, instructions, commands }, { target: { type: "story", id: storyId, epicId } });
173
+ }
174
+ export function getListFeedbackGuidance(state) {
175
+ const { pendingCount, blockerCount, stuckCount, pendingItems, stuckItems } = state;
176
+ let situation;
177
+ const instructions = [];
178
+ const commands = [];
179
+ if (pendingCount === 0 && stuckCount === 0) {
180
+ situation = "No pending feedback or blockers";
181
+ instructions.push("Continue with implementation");
182
+ commands.push({
183
+ command: "status board",
184
+ description: "View available stories",
185
+ when: "To pick next work",
186
+ });
187
+ return { situation, instructions, commands };
188
+ }
189
+ situation =
190
+ blockerCount > 0
191
+ ? `${blockerCount} blockers and ${pendingCount - blockerCount} other feedback items`
192
+ : `${pendingCount} feedback items pending`;
193
+ if (stuckCount > 0) {
194
+ situation += `, ${stuckCount} stuck items need resolution`;
195
+ }
196
+ // Prioritize blockers
197
+ if (blockerCount > 0) {
198
+ instructions.push("Address blockers first - they're blocking progress");
199
+ const blockers = pendingItems.filter((f) => f.type === "blocker");
200
+ for (const blocker of blockers.slice(0, 3)) {
201
+ instructions.push(` - ${blocker.id}: ${blocker.summary.slice(0, 50)}...`);
202
+ }
203
+ }
204
+ // Then stuck items
205
+ if (stuckCount > 0) {
206
+ instructions.push("Resolve stuck items - AI needs human input");
207
+ for (const stuck of stuckItems.slice(0, 2)) {
208
+ instructions.push(` - ${stuck.id}: ${stuck.summary.slice(0, 50)}...`);
209
+ if (stuck.suggested_options && stuck.suggested_options.length > 0) {
210
+ instructions.push(` Options: ${stuck.suggested_options.map((o) => o.label).join(", ")}`);
211
+ }
212
+ }
213
+ }
214
+ // Then other feedback
215
+ const nonBlockers = pendingItems.filter((f) => f.type !== "blocker");
216
+ if (nonBlockers.length > 0) {
217
+ instructions.push("Review other feedback when blockers are resolved");
218
+ }
219
+ commands.push({
220
+ command: "feedback resolve",
221
+ args: "<id>",
222
+ description: "Resolve a feedback item",
223
+ when: "After addressing the issue",
224
+ });
225
+ if (blockerCount > 0) {
226
+ const firstBlocker = pendingItems.find((f) => f.type === "blocker");
227
+ if (firstBlocker?.source.story_id) {
228
+ commands.push({
229
+ command: "feedback mark",
230
+ args: `${firstBlocker.source.story_id} todo`,
231
+ description: "Unblock the story",
232
+ when: "After resolving the blocker",
233
+ });
234
+ }
235
+ }
236
+ return { situation, instructions, commands };
237
+ }
238
+ export function getResolveFeedbackGuidance(state) {
239
+ const { feedbackId, storyId, wasBlocker } = state;
240
+ let situation = `Feedback ${feedbackId} resolved`;
241
+ const instructions = [];
242
+ const commands = [];
243
+ if (wasBlocker && storyId) {
244
+ situation += ` - story ${storyId} may be ready to unblock`;
245
+ instructions.push(`Story ${storyId} was blocked by this issue`);
246
+ instructions.push("Unblock the story if the issue is fully resolved");
247
+ commands.push({
248
+ command: "feedback mark",
249
+ args: `${storyId} todo`,
250
+ description: "Unblock the story",
251
+ when: "If blocker is fully resolved",
252
+ });
253
+ }
254
+ instructions.push("Check if other feedback items need attention");
255
+ commands.push({
256
+ command: "feedback list",
257
+ description: "View remaining feedback",
258
+ when: "To check for other items",
259
+ });
260
+ commands.push({
261
+ command: "status board",
262
+ description: "View kanban board",
263
+ when: "To continue with available work",
264
+ });
265
+ // Enhance with context if we have a story
266
+ if (storyId) {
267
+ const epicId = storyId.split(".")[0];
268
+ return enhanceWithContext({ situation, instructions, commands }, { target: { type: "story", id: storyId, epicId } });
269
+ }
270
+ return { situation, instructions, commands };
271
+ }
272
+ // ============================================================================
273
+ // Dismiss Feedback Guidance
274
+ // ============================================================================
275
+ export function getDismissFeedbackGuidance(feedbackId) {
276
+ return {
277
+ situation: `Feedback ${feedbackId} dismissed`,
278
+ instructions: [
279
+ "Feedback has been dismissed but not resolved",
280
+ "Consider documenting why it was dismissed",
281
+ "Continue with other work",
282
+ ],
283
+ commands: [
284
+ {
285
+ command: "feedback list",
286
+ description: "View remaining feedback",
287
+ when: "To check for other items",
288
+ },
289
+ ],
290
+ };
291
+ }
292
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../../src/core/prompts/feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Prompts Index for Ralph Engine
3
+ *
4
+ * Re-exports all prompt templates - the "prompt contract" for AI guidance.
5
+ */
6
+ export * from "./discovery.js";
7
+ export * from "./planning.js";
8
+ export * from "./status.js";
9
+ export * from "./feedback.js";
10
+ export * from "./validate.js";
11
+ export * from "./context-helpers.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Prompts Index for Ralph Engine
3
+ *
4
+ * Re-exports all prompt templates - the "prompt contract" for AI guidance.
5
+ */
6
+ export * from "./discovery.js";
7
+ export * from "./planning.js";
8
+ export * from "./status.js";
9
+ export * from "./feedback.js";
10
+ export * from "./validate.js";
11
+ export * from "./context-helpers.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Planning Prompts for Ralph Engine
3
+ *
4
+ * AI guidance templates for milestone, epic, and story planning.
5
+ */
6
+ import { AIGuidance } from "../types.js";
7
+ import { DiscoveryContext, MilestoneIndex, Milestone, Epic, EpicContext, StoryContext, DerivedEpicStatus } from "../schemas.js";
8
+ export declare function getMilestonesGuidance(context: DiscoveryContext | null, index: MilestoneIndex | null): AIGuidance;
9
+ export declare function getEpicsGuidance(milestone: Milestone, epics: Array<{
10
+ epic: Epic;
11
+ status: DerivedEpicStatus;
12
+ }>): AIGuidance;
13
+ export declare function getEpicPlanningGuidance(ctx: EpicContext, nextStep: "prd" | "architecture" | "stories" | "complete"): AIGuidance;
14
+ export declare function getStoriesGuidance(ctx: StoryContext): AIGuidance;
15
+ //# sourceMappingURL=planning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../../src/core/prompts/planning.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAMvB,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,KAAK,EAAE,cAAc,GAAG,IAAI,GAC3B,UAAU,CA8CZ;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,GACtD,UAAU,CA2DZ;AAMD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,KAAK,GAAG,cAAc,GAAG,SAAS,GAAG,UAAU,GACxD,UAAU,CAuIZ;AAMD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CA2ChE"}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Planning Prompts for Ralph Engine
3
+ *
4
+ * AI guidance templates for milestone, epic, and story planning.
5
+ */
6
+ // ============================================================================
7
+ // Milestones Guidance
8
+ // ============================================================================
9
+ export function getMilestonesGuidance(context, index) {
10
+ if (!index || index.milestones.length === 0) {
11
+ return {
12
+ situation: "No milestones defined yet - ready to create milestone structure",
13
+ instructions: [
14
+ "Based on the discovery context, propose milestones that fit the project scope",
15
+ "Small projects might need 2 milestones; larger ones might need 5+",
16
+ "Each milestone should represent a meaningful, deliverable phase",
17
+ "Experienced default: ~3 milestones (Foundation, Core Features, Polish)",
18
+ ],
19
+ commands: [
20
+ {
21
+ command: "plan addMilestone",
22
+ args: "{ name: '<name>', description: '<desc>' }",
23
+ description: "Add a milestone",
24
+ when: "For each milestone in your proposal",
25
+ },
26
+ ],
27
+ context: {
28
+ projectProblem: context?.problem,
29
+ projectVision: context?.vision,
30
+ },
31
+ };
32
+ }
33
+ return {
34
+ situation: `${index.milestones.length} milestones defined - ready to plan epics`,
35
+ instructions: [
36
+ "Pick a milestone to work on (M1 recommended for new projects)",
37
+ "Add more milestones if needed, or proceed to epic planning",
38
+ ],
39
+ commands: [
40
+ {
41
+ command: "plan showEpics",
42
+ args: "{ milestoneId: 'M1' }",
43
+ description: "Plan epics for M1",
44
+ when: "To start epic planning",
45
+ },
46
+ {
47
+ command: "plan addMilestone",
48
+ args: "{ name: '<name>', description: '<desc>' }",
49
+ description: "Add another milestone",
50
+ when: "If more milestones are needed",
51
+ },
52
+ ],
53
+ };
54
+ }
55
+ // ============================================================================
56
+ // Epics Guidance
57
+ // ============================================================================
58
+ export function getEpicsGuidance(milestone, epics) {
59
+ if (epics.length === 0) {
60
+ return {
61
+ situation: `Planning epics for ${milestone.id}: ${milestone.name}`,
62
+ instructions: [
63
+ `Propose epics for ${milestone.id} based on its scope and complexity`,
64
+ "Focused milestones might need 2 epics; complex ones might need 5+",
65
+ "Each epic should be a coherent, independently plannable piece of work",
66
+ "Experienced default: ~2-3 epics per milestone",
67
+ "Ask user to review the milestone scope and suggest epics",
68
+ ],
69
+ commands: [
70
+ {
71
+ command: "plan addEpic",
72
+ args: `{ milestoneId: '${milestone.id}', name: '<name>', description: '<desc>' }`,
73
+ description: "Add an epic",
74
+ when: "For each epic you propose",
75
+ },
76
+ ],
77
+ context: {
78
+ milestoneId: milestone.id,
79
+ milestoneName: milestone.name,
80
+ milestoneDescription: milestone.description,
81
+ },
82
+ };
83
+ }
84
+ const incompleteEpics = epics.filter((e) => e.status !== "done");
85
+ const nextEpic = incompleteEpics[0];
86
+ if (nextEpic) {
87
+ return {
88
+ situation: `${epics.length} epics in ${milestone.id}, ${incompleteEpics.length} incomplete`,
89
+ instructions: [
90
+ `Continue with ${nextEpic.epic.id}: ${nextEpic.epic.name}`,
91
+ `Status: ${nextEpic.status}`,
92
+ ],
93
+ commands: [
94
+ {
95
+ command: "plan planEpic",
96
+ args: `{ epicId: '${nextEpic.epic.id}' }`,
97
+ description: `Plan ${nextEpic.epic.id}`,
98
+ when: "To continue with this epic",
99
+ },
100
+ {
101
+ command: "plan addEpic",
102
+ args: `{ milestoneId: '${milestone.id}', name: '<name>', description: '<desc>' }`,
103
+ description: "Add another epic",
104
+ when: "If more epics are needed",
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ return {
110
+ situation: `All epics in ${milestone.id} complete!`,
111
+ instructions: ["Move to the next milestone or validate the completed work"],
112
+ commands: [],
113
+ };
114
+ }
115
+ // ============================================================================
116
+ // Epic Planning Guidance
117
+ // ============================================================================
118
+ export function getEpicPlanningGuidance(ctx, nextStep) {
119
+ if (nextStep === "prd") {
120
+ const instructions = [
121
+ "Generate a PRD for this epic based on discovery context",
122
+ "The PRD should include:",
123
+ " - Overview section",
124
+ " - Requirements (E1.R1, E1.R2, etc.) with acceptance criteria",
125
+ " - Out of scope section",
126
+ " - Dependencies section",
127
+ ];
128
+ // Add context about epic discovery
129
+ if (ctx.epicDiscovery && ctx.epicDiscovery.status !== "skipped") {
130
+ instructions.push("Reference epic discovery context:");
131
+ if (ctx.epicDiscovery.problem) {
132
+ instructions.push(` - Problem: ${ctx.epicDiscovery.problem.slice(0, 60)}...`);
133
+ }
134
+ if (ctx.epicDiscovery.scope.length > 0) {
135
+ instructions.push(` - Scope: ${ctx.epicDiscovery.scope.join("; ")}`);
136
+ }
137
+ }
138
+ const commands = [
139
+ {
140
+ command: "plan savePrd",
141
+ args: `{ epicId: '${ctx.epic.id}', content: '<markdown>' }`,
142
+ description: "Save PRD",
143
+ when: "After generating PRD content",
144
+ },
145
+ ];
146
+ // Suggest discovery if not done
147
+ if (!ctx.epicDiscovery || ctx.epicDiscovery.status === "not_started") {
148
+ commands.unshift({
149
+ command: "discover element",
150
+ args: `{ elementType: 'epic', elementId: '${ctx.epic.id}' }`,
151
+ description: "Run epic discovery first",
152
+ when: "To gather more context before PRD",
153
+ });
154
+ }
155
+ return {
156
+ situation: `${ctx.epic.id} ready for PRD generation`,
157
+ instructions,
158
+ commands,
159
+ context: {
160
+ epicId: ctx.epic.id,
161
+ epicName: ctx.epic.name,
162
+ epicDescription: ctx.epic.description,
163
+ milestoneId: ctx.milestone.id,
164
+ milestoneName: ctx.milestone.name,
165
+ projectProblem: ctx.project.discovery?.problem,
166
+ projectVision: ctx.project.discovery?.vision,
167
+ epicDiscovery: ctx.epicDiscovery
168
+ ? {
169
+ problem: ctx.epicDiscovery.problem,
170
+ scope: ctx.epicDiscovery.scope,
171
+ outOfScope: ctx.epicDiscovery.out_of_scope,
172
+ successCriteria: ctx.epicDiscovery.success_criteria,
173
+ }
174
+ : null,
175
+ constraints: [
176
+ ...(ctx.project.constraints?.constraints || []),
177
+ ...(ctx.milestoneDiscovery?.constraints || []),
178
+ ...(ctx.epicDiscovery?.constraints || []),
179
+ ],
180
+ },
181
+ };
182
+ }
183
+ if (nextStep === "architecture") {
184
+ const allConstraints = [
185
+ ...(ctx.project.constraints?.constraints || []),
186
+ ...(ctx.milestoneDiscovery?.constraints || []),
187
+ ...(ctx.epicDiscovery?.constraints || []),
188
+ ];
189
+ return {
190
+ situation: `${ctx.epic.id} PRD complete, ready for architecture`,
191
+ instructions: [
192
+ "Read the PRD and generate architecture",
193
+ "Include data models, APIs, component structure",
194
+ "Reference requirements (E1.R1 → E1.A1)",
195
+ allConstraints.length > 0
196
+ ? `Consider ${allConstraints.length} constraints`
197
+ : "Check for any constraints in context",
198
+ ],
199
+ commands: [
200
+ {
201
+ command: "plan saveArchitecture",
202
+ args: `{ epicId: '${ctx.epic.id}', content: '<markdown>' }`,
203
+ description: "Save architecture",
204
+ when: "After generating architecture content",
205
+ },
206
+ ],
207
+ context: {
208
+ epicId: ctx.epic.id,
209
+ constraints: allConstraints,
210
+ techStack: ctx.project.config?.stack,
211
+ },
212
+ };
213
+ }
214
+ if (nextStep === "stories") {
215
+ return {
216
+ situation: `${ctx.epic.id} architecture complete, ready for stories`,
217
+ instructions: [
218
+ "Generate stories that cover all requirements",
219
+ "Each story should have clear acceptance criteria",
220
+ "Link to requirements and architecture",
221
+ "Stories should be implementable in 1-3 days",
222
+ ],
223
+ commands: [
224
+ {
225
+ command: "plan showStories",
226
+ args: `{ epicId: '${ctx.epic.id}' }`,
227
+ description: "Generate stories",
228
+ when: "To start story generation",
229
+ },
230
+ ],
231
+ };
232
+ }
233
+ return {
234
+ situation: `${ctx.epic.id} all artifacts complete!`,
235
+ instructions: ["Run validation to check coverage and links"],
236
+ commands: [
237
+ {
238
+ command: "validate epic",
239
+ args: ctx.epic.id,
240
+ description: "Validate epic",
241
+ when: "To check requirements coverage",
242
+ },
243
+ ],
244
+ };
245
+ }
246
+ // ============================================================================
247
+ // Stories Guidance
248
+ // ============================================================================
249
+ export function getStoriesGuidance(ctx) {
250
+ return {
251
+ situation: `Generating stories for ${ctx.epic.id}: ${ctx.epic.name}`,
252
+ instructions: [
253
+ "Read the PRD and architecture",
254
+ "Generate stories that cover all requirements",
255
+ "Each story should:",
256
+ " - Have clear acceptance criteria",
257
+ " - Link to requirements (E1.R1, E1.R2)",
258
+ " - Link to architecture (E1.A1)",
259
+ " - Be implementable in 1-3 days",
260
+ "Add stories one by one or save all at once",
261
+ ],
262
+ commands: [
263
+ {
264
+ command: "plan addStory",
265
+ args: `{ epicId: '${ctx.epic.id}', title: '<title>', description: '<desc>', requirements: ['R1','R2'], criteria: ['c1','c2'] }`,
266
+ description: "Add a story",
267
+ when: "For each story",
268
+ },
269
+ {
270
+ command: "plan saveStories",
271
+ args: `{ epicId: '${ctx.epic.id}', stories: [...] }`,
272
+ description: "Save all stories at once",
273
+ when: "If you have the full list ready",
274
+ },
275
+ {
276
+ command: "plan markStoriesComplete",
277
+ args: `{ epicId: '${ctx.epic.id}' }`,
278
+ description: "Mark stories complete",
279
+ when: "After all stories are added",
280
+ },
281
+ ],
282
+ context: {
283
+ epicId: ctx.epic.id,
284
+ requirements: ctx.requirements,
285
+ successCriteria: [
286
+ ...(ctx.project.discovery?.success_criteria || []),
287
+ ...(ctx.milestoneDiscovery?.success_criteria || []),
288
+ ...(ctx.epicDiscovery?.success_criteria || []),
289
+ ],
290
+ },
291
+ };
292
+ }
293
+ //# sourceMappingURL=planning.js.map