agent-bober 0.11.6 → 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.
- package/CHANGELOG.md +98 -0
- package/README.md +12 -6
- package/agents/bober-evaluator.md +38 -0
- package/agents/bober-generator.md +54 -0
- package/agents/bober-planner.md +256 -34
- package/dist/cli/commands/eval.js +6 -6
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/init.js +46 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +12 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +232 -37
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/run.js +2 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +8 -8
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/index.js +23 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/schema.d.ts +40 -40
- package/dist/contracts/eval-result.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +8 -4
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/spec.d.ts +335 -40
- package/dist/contracts/spec.d.ts.map +1 -1
- package/dist/contracts/spec.js +210 -18
- package/dist/contracts/spec.js.map +1 -1
- package/dist/contracts/sprint-contract.d.ts +155 -88
- package/dist/contracts/sprint-contract.d.ts.map +1 -1
- package/dist/contracts/sprint-contract.js +176 -29
- package/dist/contracts/sprint-contract.js.map +1 -1
- package/dist/evaluators/builtin/api-check.js +1 -1
- package/dist/evaluators/builtin/api-check.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/contracts.js +2 -2
- package/dist/mcp/tools/contracts.js.map +1 -1
- package/dist/mcp/tools/eval.js +8 -8
- package/dist/mcp/tools/eval.js.map +1 -1
- package/dist/mcp/tools/plan.d.ts.map +1 -1
- package/dist/mcp/tools/plan.js +40 -14
- package/dist/mcp/tools/plan.js.map +1 -1
- package/dist/mcp/tools/sprint.d.ts.map +1 -1
- package/dist/mcp/tools/sprint.js +11 -11
- package/dist/mcp/tools/sprint.js.map +1 -1
- package/dist/orchestrator/context-handoff.d.ts +484 -224
- package/dist/orchestrator/context-handoff.d.ts.map +1 -1
- package/dist/orchestrator/context-handoff.js +32 -12
- package/dist/orchestrator/context-handoff.js.map +1 -1
- package/dist/orchestrator/curator-agent.d.ts.map +1 -1
- package/dist/orchestrator/curator-agent.js +4 -4
- package/dist/orchestrator/curator-agent.js.map +1 -1
- package/dist/orchestrator/evaluator-agent.js +2 -2
- package/dist/orchestrator/evaluator-agent.js.map +1 -1
- package/dist/orchestrator/generator-agent.js +3 -3
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/model-resolver.js +2 -2
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +7 -0
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +67 -28
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts +21 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +11 -2
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/state/history.d.ts.map +1 -1
- package/dist/state/history.js +3 -3
- package/dist/state/history.js.map +1 -1
- package/dist/state/plan-state.js +1 -1
- package/dist/state/plan-state.js.map +1 -1
- package/dist/state/sprint-state.d.ts +9 -2
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +25 -11
- package/dist/state/sprint-state.js.map +1 -1
- package/package.json +2 -1
- package/scripts/migrate-specs.mjs +127 -0
- package/scripts/sync-skills.mjs +96 -0
- package/skills/bober.plan/SKILL.md +41 -0
- package/skills/bober.plan/references/spec-schema.md +31 -4
- package/skills/bober.run/SKILL.md +41 -7
- package/skills/bober.sprint/SKILL.md +6 -259
package/dist/contracts/spec.d.ts
CHANGED
|
@@ -1,101 +1,396 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
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
|
-
|
|
115
|
+
featureId: z.ZodString;
|
|
6
116
|
title: z.ZodString;
|
|
7
117
|
description: z.ZodString;
|
|
8
|
-
priority: z.ZodEnum<["must", "should", "
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
145
|
+
specId: z.ZodString;
|
|
146
|
+
version: z.ZodDefault<z.ZodNumber>;
|
|
29
147
|
title: z.ZodString;
|
|
30
148
|
description: z.ZodString;
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
152
|
+
featureId: z.ZodString;
|
|
35
153
|
title: z.ZodString;
|
|
36
154
|
description: z.ZodString;
|
|
37
|
-
priority: z.ZodEnum<["must", "should", "
|
|
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
|
-
|
|
45
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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, "
|
|
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,
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/contracts/spec.ts"],"names":[],"mappings":"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"}
|