agent-bober 0.11.5 → 0.12.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 (87) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/README.md +12 -6
  3. package/agents/bober-evaluator.md +38 -0
  4. package/agents/bober-generator.md +54 -0
  5. package/agents/bober-planner.md +256 -34
  6. package/dist/cli/commands/eval.js +6 -6
  7. package/dist/cli/commands/eval.js.map +1 -1
  8. package/dist/cli/commands/init.js +47 -3
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/plan.d.ts +12 -0
  11. package/dist/cli/commands/plan.d.ts.map +1 -1
  12. package/dist/cli/commands/plan.js +232 -37
  13. package/dist/cli/commands/plan.js.map +1 -1
  14. package/dist/cli/commands/run.js +2 -2
  15. package/dist/cli/commands/run.js.map +1 -1
  16. package/dist/cli/commands/sprint.d.ts.map +1 -1
  17. package/dist/cli/commands/sprint.js +8 -8
  18. package/dist/cli/commands/sprint.js.map +1 -1
  19. package/dist/cli/index.js +23 -2
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/config/schema.d.ts +40 -40
  22. package/dist/contracts/eval-result.d.ts +38 -38
  23. package/dist/contracts/index.d.ts +2 -2
  24. package/dist/contracts/index.d.ts.map +1 -1
  25. package/dist/contracts/index.js +8 -4
  26. package/dist/contracts/index.js.map +1 -1
  27. package/dist/contracts/spec.d.ts +335 -40
  28. package/dist/contracts/spec.d.ts.map +1 -1
  29. package/dist/contracts/spec.js +210 -18
  30. package/dist/contracts/spec.js.map +1 -1
  31. package/dist/contracts/sprint-contract.d.ts +155 -88
  32. package/dist/contracts/sprint-contract.d.ts.map +1 -1
  33. package/dist/contracts/sprint-contract.js +176 -29
  34. package/dist/contracts/sprint-contract.js.map +1 -1
  35. package/dist/evaluators/builtin/api-check.js +1 -1
  36. package/dist/evaluators/builtin/api-check.js.map +1 -1
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -2
  40. package/dist/index.js.map +1 -1
  41. package/dist/mcp/tools/contracts.js +2 -2
  42. package/dist/mcp/tools/contracts.js.map +1 -1
  43. package/dist/mcp/tools/eval.js +8 -8
  44. package/dist/mcp/tools/eval.js.map +1 -1
  45. package/dist/mcp/tools/plan.d.ts.map +1 -1
  46. package/dist/mcp/tools/plan.js +40 -14
  47. package/dist/mcp/tools/plan.js.map +1 -1
  48. package/dist/mcp/tools/sprint.d.ts.map +1 -1
  49. package/dist/mcp/tools/sprint.js +11 -11
  50. package/dist/mcp/tools/sprint.js.map +1 -1
  51. package/dist/orchestrator/context-handoff.d.ts +484 -224
  52. package/dist/orchestrator/context-handoff.d.ts.map +1 -1
  53. package/dist/orchestrator/context-handoff.js +32 -12
  54. package/dist/orchestrator/context-handoff.js.map +1 -1
  55. package/dist/orchestrator/curator-agent.d.ts.map +1 -1
  56. package/dist/orchestrator/curator-agent.js +4 -4
  57. package/dist/orchestrator/curator-agent.js.map +1 -1
  58. package/dist/orchestrator/evaluator-agent.js +2 -2
  59. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  60. package/dist/orchestrator/generator-agent.js +3 -3
  61. package/dist/orchestrator/generator-agent.js.map +1 -1
  62. package/dist/orchestrator/model-resolver.js +2 -2
  63. package/dist/orchestrator/model-resolver.js.map +1 -1
  64. package/dist/orchestrator/pipeline.d.ts +7 -0
  65. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  66. package/dist/orchestrator/pipeline.js +67 -28
  67. package/dist/orchestrator/pipeline.js.map +1 -1
  68. package/dist/orchestrator/planner-agent.d.ts +21 -1
  69. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  70. package/dist/orchestrator/planner-agent.js +11 -2
  71. package/dist/orchestrator/planner-agent.js.map +1 -1
  72. package/dist/state/history.d.ts.map +1 -1
  73. package/dist/state/history.js +3 -3
  74. package/dist/state/history.js.map +1 -1
  75. package/dist/state/plan-state.js +1 -1
  76. package/dist/state/plan-state.js.map +1 -1
  77. package/dist/state/sprint-state.d.ts +9 -2
  78. package/dist/state/sprint-state.d.ts.map +1 -1
  79. package/dist/state/sprint-state.js +25 -11
  80. package/dist/state/sprint-state.js.map +1 -1
  81. package/package.json +2 -1
  82. package/scripts/migrate-specs.mjs +127 -0
  83. package/scripts/sync-skills.mjs +96 -0
  84. package/skills/bober.plan/SKILL.md +41 -0
  85. package/skills/bober.plan/references/spec-schema.md +31 -4
  86. package/skills/bober.run/SKILL.md +41 -7
  87. package/skills/bober.sprint/SKILL.md +6 -259
@@ -1,101 +1,396 @@
1
1
  import { z } from "zod";
2
- export declare const PrioritySchema: z.ZodEnum<["must", "should", "could"]>;
2
+ /**
3
+ * Threshold at which a spec must be marked needs-clarification rather than
4
+ * proceeding to sprint decomposition. Mirrors the planner agent's autonomous
5
+ * mode rule. Scores are 0..10 inclusive.
6
+ */
7
+ export declare const AMBIGUITY_BLOCK_THRESHOLD = 7;
8
+ export declare const PrioritySchema: z.ZodEnum<["must-have", "should-have", "nice-to-have"]>;
3
9
  export type Priority = z.infer<typeof PrioritySchema>;
10
+ export declare const EstimatedComplexitySchema: z.ZodEnum<["low", "medium", "high"]>;
11
+ export type EstimatedComplexity = z.infer<typeof EstimatedComplexitySchema>;
12
+ /**
13
+ * Lifecycle of a plan spec.
14
+ *
15
+ * - `draft` — planner just emitted, no sprints run yet
16
+ * - `needs-clarification` — planner refused to fully decompose: ambiguityScore
17
+ * >= 7 OR open questions remain. The pipeline will not run sprints from
18
+ * this spec until status flips to `ready`.
19
+ * - `ready` — clarifications resolved (or never needed), pipeline may proceed
20
+ * - `in-progress` — at least one sprint has started
21
+ * - `completed` — all sprints finished
22
+ * - `abandoned` — planner or user explicitly dropped this spec
23
+ */
24
+ export declare const PlanSpecStatusSchema: z.ZodEnum<["draft", "needs-clarification", "ready", "in-progress", "completed", "abandoned"]>;
25
+ export type PlanSpecStatus = z.infer<typeof PlanSpecStatusSchema>;
26
+ export declare const PlanSpecModeSchema: z.ZodEnum<["greenfield", "brownfield"]>;
27
+ export type PlanSpecMode = z.infer<typeof PlanSpecModeSchema>;
28
+ /**
29
+ * Categories the planner uses to group clarifying questions. Matches the
30
+ * categories listed in `.claude/agents/bober-planner.md` Phase 2.
31
+ */
32
+ export declare const ClarificationCategorySchema: z.ZodEnum<["scope", "user-personas", "data-model", "tech-constraints", "design-ux", "integrations", "non-functional", "error-handling", "integration-risk", "pattern-conflict", "regression-risk", "other"]>;
33
+ export type ClarificationCategory = z.infer<typeof ClarificationCategorySchema>;
34
+ export declare const ClarificationOptionSchema: z.ZodObject<{
35
+ /** Short label shown to the user (e.g. "A", "B", "Custom") */
36
+ label: z.ZodString;
37
+ /** What this option means in plain English */
38
+ description: z.ZodString;
39
+ }, "strip", z.ZodTypeAny, {
40
+ description: string;
41
+ label: string;
42
+ }, {
43
+ description: string;
44
+ label: string;
45
+ }>;
46
+ export type ClarificationOption = z.infer<typeof ClarificationOptionSchema>;
47
+ export declare const ClarificationQuestionSchema: z.ZodObject<{
48
+ questionId: z.ZodString;
49
+ category: z.ZodEnum<["scope", "user-personas", "data-model", "tech-constraints", "design-ux", "integrations", "non-functional", "error-handling", "integration-risk", "pattern-conflict", "regression-risk", "other"]>;
50
+ /** The question itself — should end with a "?" */
51
+ question: z.ZodString;
52
+ /** Optional multiple-choice options, including an "Other" escape hatch */
53
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
54
+ /** Short label shown to the user (e.g. "A", "B", "Custom") */
55
+ label: z.ZodString;
56
+ /** What this option means in plain English */
57
+ description: z.ZodString;
58
+ }, "strip", z.ZodTypeAny, {
59
+ description: string;
60
+ label: string;
61
+ }, {
62
+ description: string;
63
+ label: string;
64
+ }>, "many">>;
65
+ /** Planner's recommended answer based on codebase evidence */
66
+ recommendation: z.ZodOptional<z.ZodString>;
67
+ /**
68
+ * How much this question contributes to the overall ambiguityScore.
69
+ * Useful for the user to know which questions matter most to resolve.
70
+ */
71
+ ambiguityWeight: z.ZodOptional<z.ZodNumber>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ questionId: string;
74
+ category: "other" | "scope" | "user-personas" | "data-model" | "tech-constraints" | "design-ux" | "integrations" | "non-functional" | "error-handling" | "integration-risk" | "pattern-conflict" | "regression-risk";
75
+ question: string;
76
+ options?: {
77
+ description: string;
78
+ label: string;
79
+ }[] | undefined;
80
+ recommendation?: string | undefined;
81
+ ambiguityWeight?: number | undefined;
82
+ }, {
83
+ questionId: string;
84
+ category: "other" | "scope" | "user-personas" | "data-model" | "tech-constraints" | "design-ux" | "integrations" | "non-functional" | "error-handling" | "integration-risk" | "pattern-conflict" | "regression-risk";
85
+ question: string;
86
+ options?: {
87
+ description: string;
88
+ label: string;
89
+ }[] | undefined;
90
+ recommendation?: string | undefined;
91
+ ambiguityWeight?: number | undefined;
92
+ }>;
93
+ export type ClarificationQuestion = z.infer<typeof ClarificationQuestionSchema>;
94
+ export declare const ResolvedClarificationSchema: z.ZodObject<{
95
+ questionId: z.ZodString;
96
+ /** The user-supplied answer (free-form, may reference an option label) */
97
+ answer: z.ZodString;
98
+ /** ISO 8601 timestamp when the answer was recorded */
99
+ resolvedAt: z.ZodString;
100
+ /** Who answered: "user" (interactive) or "planner" (autonomous self-answer) */
101
+ resolvedBy: z.ZodDefault<z.ZodEnum<["user", "planner"]>>;
102
+ }, "strip", z.ZodTypeAny, {
103
+ questionId: string;
104
+ answer: string;
105
+ resolvedAt: string;
106
+ resolvedBy: "planner" | "user";
107
+ }, {
108
+ questionId: string;
109
+ answer: string;
110
+ resolvedAt: string;
111
+ resolvedBy?: "planner" | "user" | undefined;
112
+ }>;
113
+ export type ResolvedClarification = z.infer<typeof ResolvedClarificationSchema>;
4
114
  export declare const FeatureSpecSchema: z.ZodObject<{
5
- id: z.ZodString;
115
+ featureId: z.ZodString;
6
116
  title: z.ZodString;
7
117
  description: z.ZodString;
8
- priority: z.ZodEnum<["must", "should", "could"]>;
9
- estimatedSprints: z.ZodNumber;
118
+ priority: z.ZodEnum<["must-have", "should-have", "nice-to-have"]>;
10
119
  acceptanceCriteria: z.ZodArray<z.ZodString, "many">;
120
+ dependencies: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
121
+ estimatedComplexity: z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>;
122
+ /** Legacy field kept for backward compat — prefer estimatedComplexity */
123
+ estimatedSprints: z.ZodOptional<z.ZodNumber>;
11
124
  }, "strip", z.ZodTypeAny, {
12
125
  description: string;
13
- id: string;
14
126
  title: string;
15
- priority: "must" | "should" | "could";
16
- estimatedSprints: number;
127
+ featureId: string;
128
+ priority: "must-have" | "should-have" | "nice-to-have";
17
129
  acceptanceCriteria: string[];
130
+ dependencies: string[];
131
+ estimatedComplexity?: "medium" | "low" | "high" | undefined;
132
+ estimatedSprints?: number | undefined;
18
133
  }, {
19
134
  description: string;
20
- id: string;
21
135
  title: string;
22
- priority: "must" | "should" | "could";
23
- estimatedSprints: number;
136
+ featureId: string;
137
+ priority: "must-have" | "should-have" | "nice-to-have";
24
138
  acceptanceCriteria: string[];
139
+ dependencies?: string[] | undefined;
140
+ estimatedComplexity?: "medium" | "low" | "high" | undefined;
141
+ estimatedSprints?: number | undefined;
25
142
  }>;
26
143
  export type FeatureSpec = z.infer<typeof FeatureSpecSchema>;
27
144
  export declare const PlanSpecSchema: z.ZodObject<{
28
- id: z.ZodString;
145
+ specId: z.ZodString;
146
+ version: z.ZodDefault<z.ZodNumber>;
29
147
  title: z.ZodString;
30
148
  description: z.ZodString;
31
- projectType: z.ZodString;
32
- techStack: z.ZodArray<z.ZodString, "many">;
149
+ status: z.ZodEnum<["draft", "needs-clarification", "ready", "in-progress", "completed", "abandoned"]>;
150
+ mode: z.ZodEnum<["greenfield", "brownfield"]>;
33
151
  features: z.ZodArray<z.ZodObject<{
34
- id: z.ZodString;
152
+ featureId: z.ZodString;
35
153
  title: z.ZodString;
36
154
  description: z.ZodString;
37
- priority: z.ZodEnum<["must", "should", "could"]>;
38
- estimatedSprints: z.ZodNumber;
155
+ priority: z.ZodEnum<["must-have", "should-have", "nice-to-have"]>;
39
156
  acceptanceCriteria: z.ZodArray<z.ZodString, "many">;
157
+ dependencies: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
158
+ estimatedComplexity: z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>;
159
+ /** Legacy field kept for backward compat — prefer estimatedComplexity */
160
+ estimatedSprints: z.ZodOptional<z.ZodNumber>;
40
161
  }, "strip", z.ZodTypeAny, {
41
162
  description: string;
42
- id: string;
43
163
  title: string;
44
- priority: "must" | "should" | "could";
45
- estimatedSprints: number;
164
+ featureId: string;
165
+ priority: "must-have" | "should-have" | "nice-to-have";
46
166
  acceptanceCriteria: string[];
167
+ dependencies: string[];
168
+ estimatedComplexity?: "medium" | "low" | "high" | undefined;
169
+ estimatedSprints?: number | undefined;
47
170
  }, {
48
171
  description: string;
49
- id: string;
50
172
  title: string;
51
- priority: "must" | "should" | "could";
52
- estimatedSprints: number;
173
+ featureId: string;
174
+ priority: "must-have" | "should-have" | "nice-to-have";
53
175
  acceptanceCriteria: string[];
176
+ dependencies?: string[] | undefined;
177
+ estimatedComplexity?: "medium" | "low" | "high" | undefined;
178
+ estimatedSprints?: number | undefined;
54
179
  }>, "many">;
55
- nonFunctional: z.ZodArray<z.ZodString, "many">;
56
- constraints: z.ZodArray<z.ZodString, "many">;
180
+ assumptions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
181
+ outOfScope: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
182
+ /**
183
+ * Self-rated ambiguity 0..10. >= AMBIGUITY_BLOCK_THRESHOLD must result in
184
+ * status === "needs-clarification" with at least one open question.
185
+ */
186
+ ambiguityScore: z.ZodOptional<z.ZodNumber>;
187
+ /** Open questions awaiting user answer. Empty when status is ready/completed. */
188
+ clarificationQuestions: z.ZodDefault<z.ZodArray<z.ZodObject<{
189
+ questionId: z.ZodString;
190
+ category: z.ZodEnum<["scope", "user-personas", "data-model", "tech-constraints", "design-ux", "integrations", "non-functional", "error-handling", "integration-risk", "pattern-conflict", "regression-risk", "other"]>;
191
+ /** The question itself — should end with a "?" */
192
+ question: z.ZodString;
193
+ /** Optional multiple-choice options, including an "Other" escape hatch */
194
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
195
+ /** Short label shown to the user (e.g. "A", "B", "Custom") */
196
+ label: z.ZodString;
197
+ /** What this option means in plain English */
198
+ description: z.ZodString;
199
+ }, "strip", z.ZodTypeAny, {
200
+ description: string;
201
+ label: string;
202
+ }, {
203
+ description: string;
204
+ label: string;
205
+ }>, "many">>;
206
+ /** Planner's recommended answer based on codebase evidence */
207
+ recommendation: z.ZodOptional<z.ZodString>;
208
+ /**
209
+ * How much this question contributes to the overall ambiguityScore.
210
+ * Useful for the user to know which questions matter most to resolve.
211
+ */
212
+ ambiguityWeight: z.ZodOptional<z.ZodNumber>;
213
+ }, "strip", z.ZodTypeAny, {
214
+ questionId: string;
215
+ category: "other" | "scope" | "user-personas" | "data-model" | "tech-constraints" | "design-ux" | "integrations" | "non-functional" | "error-handling" | "integration-risk" | "pattern-conflict" | "regression-risk";
216
+ question: string;
217
+ options?: {
218
+ description: string;
219
+ label: string;
220
+ }[] | undefined;
221
+ recommendation?: string | undefined;
222
+ ambiguityWeight?: number | undefined;
223
+ }, {
224
+ questionId: string;
225
+ category: "other" | "scope" | "user-personas" | "data-model" | "tech-constraints" | "design-ux" | "integrations" | "non-functional" | "error-handling" | "integration-risk" | "pattern-conflict" | "regression-risk";
226
+ question: string;
227
+ options?: {
228
+ description: string;
229
+ label: string;
230
+ }[] | undefined;
231
+ recommendation?: string | undefined;
232
+ ambiguityWeight?: number | undefined;
233
+ }>, "many">>;
234
+ /** Question/answer history, both autonomous self-answers and user inputs */
235
+ resolvedClarifications: z.ZodDefault<z.ZodArray<z.ZodObject<{
236
+ questionId: z.ZodString;
237
+ /** The user-supplied answer (free-form, may reference an option label) */
238
+ answer: z.ZodString;
239
+ /** ISO 8601 timestamp when the answer was recorded */
240
+ resolvedAt: z.ZodString;
241
+ /** Who answered: "user" (interactive) or "planner" (autonomous self-answer) */
242
+ resolvedBy: z.ZodDefault<z.ZodEnum<["user", "planner"]>>;
243
+ }, "strip", z.ZodTypeAny, {
244
+ questionId: string;
245
+ answer: string;
246
+ resolvedAt: string;
247
+ resolvedBy: "planner" | "user";
248
+ }, {
249
+ questionId: string;
250
+ answer: string;
251
+ resolvedAt: string;
252
+ resolvedBy?: "planner" | "user" | undefined;
253
+ }>, "many">>;
254
+ techStack: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
255
+ techNotes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
256
+ nonFunctionalRequirements: z.ZodDefault<z.ZodArray<z.ZodUnknown, "many">>;
257
+ constraints: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
258
+ sprints: z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>;
259
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
57
260
  createdAt: z.ZodString;
58
261
  updatedAt: z.ZodString;
262
+ completedAt: z.ZodOptional<z.ZodString>;
59
263
  }, "strip", z.ZodTypeAny, {
264
+ mode: "greenfield" | "brownfield";
265
+ status: "draft" | "needs-clarification" | "ready" | "in-progress" | "completed" | "abandoned";
60
266
  description: string;
61
- id: string;
267
+ specId: string;
268
+ version: number;
62
269
  title: string;
63
- projectType: string;
64
- techStack: string[];
65
270
  features: {
66
271
  description: string;
67
- id: string;
68
272
  title: string;
69
- priority: "must" | "should" | "could";
70
- estimatedSprints: number;
273
+ featureId: string;
274
+ priority: "must-have" | "should-have" | "nice-to-have";
71
275
  acceptanceCriteria: string[];
276
+ dependencies: string[];
277
+ estimatedComplexity?: "medium" | "low" | "high" | undefined;
278
+ estimatedSprints?: number | undefined;
279
+ }[];
280
+ assumptions: string[];
281
+ outOfScope: string[];
282
+ clarificationQuestions: {
283
+ questionId: string;
284
+ category: "other" | "scope" | "user-personas" | "data-model" | "tech-constraints" | "design-ux" | "integrations" | "non-functional" | "error-handling" | "integration-risk" | "pattern-conflict" | "regression-risk";
285
+ question: string;
286
+ options?: {
287
+ description: string;
288
+ label: string;
289
+ }[] | undefined;
290
+ recommendation?: string | undefined;
291
+ ambiguityWeight?: number | undefined;
72
292
  }[];
73
- nonFunctional: string[];
293
+ resolvedClarifications: {
294
+ questionId: string;
295
+ answer: string;
296
+ resolvedAt: string;
297
+ resolvedBy: "planner" | "user";
298
+ }[];
299
+ techStack: string[];
300
+ nonFunctionalRequirements: unknown[];
74
301
  constraints: string[];
75
302
  createdAt: string;
76
303
  updatedAt: string;
304
+ ambiguityScore?: number | undefined;
305
+ techNotes?: Record<string, unknown> | undefined;
306
+ sprints?: unknown[] | undefined;
307
+ metadata?: Record<string, unknown> | undefined;
308
+ completedAt?: string | undefined;
77
309
  }, {
310
+ mode: "greenfield" | "brownfield";
311
+ status: "draft" | "needs-clarification" | "ready" | "in-progress" | "completed" | "abandoned";
78
312
  description: string;
79
- id: string;
313
+ specId: string;
80
314
  title: string;
81
- projectType: string;
82
- techStack: string[];
83
315
  features: {
84
316
  description: string;
85
- id: string;
86
317
  title: string;
87
- priority: "must" | "should" | "could";
88
- estimatedSprints: number;
318
+ featureId: string;
319
+ priority: "must-have" | "should-have" | "nice-to-have";
89
320
  acceptanceCriteria: string[];
321
+ dependencies?: string[] | undefined;
322
+ estimatedComplexity?: "medium" | "low" | "high" | undefined;
323
+ estimatedSprints?: number | undefined;
90
324
  }[];
91
- nonFunctional: string[];
92
- constraints: string[];
93
325
  createdAt: string;
94
326
  updatedAt: string;
327
+ version?: number | undefined;
328
+ assumptions?: string[] | undefined;
329
+ outOfScope?: string[] | undefined;
330
+ ambiguityScore?: number | undefined;
331
+ clarificationQuestions?: {
332
+ questionId: string;
333
+ category: "other" | "scope" | "user-personas" | "data-model" | "tech-constraints" | "design-ux" | "integrations" | "non-functional" | "error-handling" | "integration-risk" | "pattern-conflict" | "regression-risk";
334
+ question: string;
335
+ options?: {
336
+ description: string;
337
+ label: string;
338
+ }[] | undefined;
339
+ recommendation?: string | undefined;
340
+ ambiguityWeight?: number | undefined;
341
+ }[] | undefined;
342
+ resolvedClarifications?: {
343
+ questionId: string;
344
+ answer: string;
345
+ resolvedAt: string;
346
+ resolvedBy?: "planner" | "user" | undefined;
347
+ }[] | undefined;
348
+ techStack?: string[] | undefined;
349
+ techNotes?: Record<string, unknown> | undefined;
350
+ nonFunctionalRequirements?: unknown[] | undefined;
351
+ constraints?: string[] | undefined;
352
+ sprints?: unknown[] | undefined;
353
+ metadata?: Record<string, unknown> | undefined;
354
+ completedAt?: string | undefined;
95
355
  }>;
96
356
  export type PlanSpec = z.infer<typeof PlanSpecSchema>;
357
+ export interface CreateSpecOptions {
358
+ mode?: PlanSpecMode;
359
+ status?: PlanSpecStatus;
360
+ ambiguityScore?: number;
361
+ clarificationQuestions?: ClarificationQuestion[];
362
+ assumptions?: string[];
363
+ outOfScope?: string[];
364
+ techStack?: string[];
365
+ }
97
366
  /**
98
367
  * Create a new plan specification with sensible defaults.
99
368
  */
100
- export declare function createSpec(title: string, description: string, features: Omit<FeatureSpec, "id">[]): PlanSpec;
369
+ export declare function createSpec(title: string, description: string, features: Omit<FeatureSpec, "featureId">[], options?: CreateSpecOptions): PlanSpec;
370
+ /**
371
+ * Return true when the spec has unresolved clarification questions.
372
+ *
373
+ * NOTE: This checks question state only, NOT spec.status — `status` is
374
+ * downstream of this. If you want "is the pipeline blocked?", check
375
+ * `spec.status === "needs-clarification" || hasOpenClarifications(spec)`
376
+ * instead, or use `isPipelineReady(spec)`.
377
+ */
378
+ export declare function hasOpenClarifications(spec: PlanSpec): boolean;
379
+ /**
380
+ * Return true when the pipeline is allowed to run sprints from this spec.
381
+ * Combines the explicit status check with the question-resolution check.
382
+ */
383
+ export declare function isPipelineReady(spec: PlanSpec): boolean;
384
+ /**
385
+ * Return the questions that haven't been answered yet.
386
+ */
387
+ export declare function getOpenClarifications(spec: PlanSpec): ClarificationQuestion[];
388
+ /**
389
+ * Record an answer to a clarification question. Returns a new spec — does
390
+ * not mutate. If this answer was the last open question, the spec status
391
+ * flips from `needs-clarification` to `ready`.
392
+ *
393
+ * Throws if the questionId doesn't exist on the spec.
394
+ */
395
+ export declare function resolveClarification(spec: PlanSpec, questionId: string, answer: string, resolvedBy?: ResolvedClarification["resolvedBy"]): PlanSpec;
101
396
  //# sourceMappingURL=spec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/contracts/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc,wCAAsC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAItD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAO5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAMtD;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,GAClC,QAAQ,CAoBV"}
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/contracts/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAI3C,eAAO,MAAM,cAAc,yDAIzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,yBAAyB,sCAAoC,CAAC;AAC3E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,+FAO/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,kBAAkB,yCAAuC,CAAC;AACvE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,2BAA2B,8MAatC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAIhF,eAAO,MAAM,yBAAyB;IACpC,8DAA8D;;IAE9D,8CAA8C;;;;;;;;EAE9C,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,2BAA2B;;;IAGtC,kDAAkD;;IAElD,0EAA0E;;QAZ1E,8DAA8D;;QAE9D,8CAA8C;;;;;;;;;IAY9C,8DAA8D;;IAE9D;;;OAGG;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,2BAA2B;;IAEtC,0EAA0E;;IAE1E,sDAAsD;;IAEtD,+EAA+E;;;;;;;;;;;;EAE/E,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAIhF,eAAO,MAAM,iBAAiB;;;;;;;;IAQ5B,yEAAyE;;;;;;;;;;;;;;;;;;;;EAEzE,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;QAPzB,yEAAyE;;;;;;;;;;;;;;;;;;;;;;;IA0BzE;;;OAGG;;IAEH,iFAAiF;;;;QAlEjF,kDAAkD;;QAElD,0EAA0E;;YAZ1E,8DAA8D;;YAE9D,8CAA8C;;;;;;;;;QAY9C,8DAA8D;;QAE9D;;;WAGG;;;;;;;;;;;;;;;;;;;;;;;IA2DH,4EAA4E;;;QApD5E,0EAA0E;;QAE1E,sDAAsD;;QAEtD,+EAA+E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmE/E,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAMtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAC1C,OAAO,GAAE,iBAAsB,GAC9B,QAAQ,CAuCV;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAO7D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,GACb,qBAAqB,EAAE,CAOzB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,qBAAqB,CAAC,YAAY,CAAU,GACvD,QAAQ,CAsCV"}