@shepai/cli 1.19.0 → 1.20.1

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 (150) hide show
  1. package/dist/eslint.config.mjs +4 -0
  2. package/dist/src/application/ports/output/agents/feature-agent-process.interface.d.ts +2 -1
  3. package/dist/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  4. package/dist/src/application/ports/output/agents/index.d.ts +1 -0
  5. package/dist/src/application/ports/output/agents/index.d.ts.map +1 -1
  6. package/dist/src/application/ports/output/agents/phase-timing-repository.interface.d.ts +44 -0
  7. package/dist/src/application/ports/output/agents/phase-timing-repository.interface.d.ts.map +1 -0
  8. package/dist/src/application/ports/output/agents/phase-timing-repository.interface.js +11 -0
  9. package/dist/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
  10. package/dist/src/application/use-cases/agents/approve-agent-run.use-case.js +6 -2
  11. package/dist/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
  12. package/dist/src/application/use-cases/agents/reject-agent-run.use-case.js +0 -1
  13. package/dist/src/application/use-cases/features/create/create-feature.use-case.d.ts +37 -0
  14. package/dist/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -0
  15. package/dist/src/application/use-cases/features/{create-feature.use-case.js → create/create-feature.use-case.js} +22 -70
  16. package/dist/src/application/use-cases/features/create/metadata-generator.d.ts +28 -0
  17. package/dist/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -0
  18. package/dist/src/application/use-cases/features/create/metadata-generator.js +109 -0
  19. package/dist/src/application/use-cases/features/create/slug-resolver.d.ts +24 -0
  20. package/dist/src/application/use-cases/features/create/slug-resolver.d.ts.map +1 -0
  21. package/dist/src/application/use-cases/features/create/slug-resolver.js +66 -0
  22. package/dist/src/application/use-cases/features/create/types.d.ts +16 -0
  23. package/dist/src/application/use-cases/features/create/types.d.ts.map +1 -0
  24. package/dist/src/application/use-cases/features/create/types.js +1 -0
  25. package/dist/src/application/use-cases/features/resume-feature.use-case.js +2 -2
  26. package/dist/src/domain/generated/output.d.ts +40 -6
  27. package/dist/src/domain/generated/output.d.ts.map +1 -1
  28. package/dist/src/infrastructure/di/container.d.ts.map +1 -1
  29. package/dist/src/infrastructure/di/container.js +12 -1
  30. package/dist/src/infrastructure/persistence/sqlite/mappers/agent-run.mapper.d.ts +1 -2
  31. package/dist/src/infrastructure/persistence/sqlite/mappers/agent-run.mapper.d.ts.map +1 -1
  32. package/dist/src/infrastructure/persistence/sqlite/mappers/agent-run.mapper.js +4 -4
  33. package/dist/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  34. package/dist/src/infrastructure/persistence/sqlite/migrations.js +31 -0
  35. package/dist/src/infrastructure/repositories/agent-run.repository.d.ts.map +1 -1
  36. package/dist/src/infrastructure/repositories/agent-run.repository.js +5 -9
  37. package/dist/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts +21 -0
  38. package/dist/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts.map +1 -0
  39. package/dist/src/infrastructure/repositories/sqlite-phase-timing.repository.js +100 -0
  40. package/dist/src/infrastructure/services/agents/common/executors/mock-executor.service.js +2 -2
  41. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +305 -13
  42. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  43. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +124 -7
  44. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +2 -1
  45. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  46. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +2 -2
  47. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +2 -1
  48. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  49. package/dist/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +19 -7
  50. package/dist/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +1 -1
  51. package/dist/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +11 -2
  52. package/dist/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  53. package/dist/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +46 -15
  54. package/dist/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts +23 -0
  55. package/dist/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -0
  56. package/dist/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +77 -0
  57. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/plan.schema.d.ts +4 -0
  58. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/plan.schema.d.ts.map +1 -0
  59. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/plan.schema.js +54 -0
  60. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/research.schema.d.ts +3 -0
  61. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/research.schema.d.ts.map +1 -0
  62. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/research.schema.js +24 -0
  63. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts +4 -0
  64. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts.map +1 -0
  65. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.js +50 -0
  66. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts +8 -0
  67. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts.map +1 -0
  68. package/dist/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.js +36 -0
  69. package/dist/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts +12 -0
  70. package/dist/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts.map +1 -0
  71. package/dist/src/infrastructure/services/agents/feature-agent/nodes/validate.node.js +58 -0
  72. package/dist/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts +30 -0
  73. package/dist/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts.map +1 -0
  74. package/dist/src/infrastructure/services/agents/feature-agent/phase-timing-context.js +68 -0
  75. package/dist/src/infrastructure/services/agents/feature-agent/state.d.ts +5 -1
  76. package/dist/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  77. package/dist/src/infrastructure/services/agents/feature-agent/state.js +14 -1
  78. package/dist/src/presentation/cli/commands/feat/approve.command.d.ts +12 -0
  79. package/dist/src/presentation/cli/commands/feat/approve.command.d.ts.map +1 -0
  80. package/dist/src/presentation/cli/commands/feat/approve.command.js +48 -0
  81. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  82. package/dist/src/presentation/cli/commands/feat/index.js +7 -1
  83. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  84. package/dist/src/presentation/cli/commands/feat/ls.command.js +13 -5
  85. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  86. package/dist/src/presentation/cli/commands/feat/new.command.js +35 -16
  87. package/dist/src/presentation/cli/commands/feat/reject.command.d.ts +12 -0
  88. package/dist/src/presentation/cli/commands/feat/reject.command.d.ts.map +1 -0
  89. package/dist/src/presentation/cli/commands/feat/reject.command.js +50 -0
  90. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.d.ts +30 -0
  91. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.d.ts.map +1 -0
  92. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.js +57 -0
  93. package/dist/src/presentation/cli/commands/feat/review.command.d.ts +12 -0
  94. package/dist/src/presentation/cli/commands/feat/review.command.d.ts.map +1 -0
  95. package/dist/src/presentation/cli/commands/feat/review.command.js +49 -0
  96. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  97. package/dist/src/presentation/cli/commands/feat/show.command.js +51 -6
  98. package/dist/tsconfig.build.tsbuildinfo +1 -1
  99. package/package.json +3 -1
  100. package/web/.next/BUILD_ID +1 -1
  101. package/web/.next/build-manifest.json +2 -2
  102. package/web/.next/cache/.previewinfo +1 -1
  103. package/web/.next/cache/.rscinfo +1 -1
  104. package/web/.next/cache/config.json +3 -3
  105. package/web/.next/fallback-build-manifest.json +2 -2
  106. package/web/.next/prerender-manifest.json +3 -3
  107. package/web/.next/required-server-files.js +1 -1
  108. package/web/.next/required-server-files.json +1 -1
  109. package/web/.next/server/app/_global-error.html +2 -2
  110. package/web/.next/server/app/_global-error.rsc +1 -1
  111. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  112. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  114. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  115. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  116. package/web/.next/server/app/_not-found.html +2 -2
  117. package/web/.next/server/app/_not-found.rsc +1 -1
  118. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  119. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  120. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  121. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  122. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  123. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  124. package/web/.next/server/app/index.html +2 -2
  125. package/web/.next/server/app/index.rsc +1 -1
  126. package/web/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  127. package/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  128. package/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  129. package/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  130. package/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  131. package/web/.next/server/app/version.html +2 -2
  132. package/web/.next/server/app/version.rsc +1 -1
  133. package/web/.next/server/app/version.segments/_full.segment.rsc +1 -1
  134. package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
  135. package/web/.next/server/app/version.segments/_index.segment.rsc +1 -1
  136. package/web/.next/server/app/version.segments/_tree.segment.rsc +1 -1
  137. package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +1 -1
  138. package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
  139. package/web/.next/server/chunks/ssr/_19be0743._.js +1 -1
  140. package/web/.next/server/pages/404.html +2 -2
  141. package/web/.next/server/pages/500.html +2 -2
  142. package/web/.next/server/server-reference-manifest.js +1 -1
  143. package/web/.next/server/server-reference-manifest.json +1 -1
  144. package/web/.next/trace +1 -1
  145. package/web/.next/trace-build +1 -1
  146. package/dist/src/application/use-cases/features/create-feature.use-case.d.ts +0 -43
  147. package/dist/src/application/use-cases/features/create-feature.use-case.d.ts.map +0 -1
  148. /package/web/.next/static/{nw4IT0rr_mE5Tx22X9OgO → xKJulVMYO_ZRGoqa6eM7G}/_buildManifest.js +0 -0
  149. /package/web/.next/static/{nw4IT0rr_mE5Tx22X9OgO → xKJulVMYO_ZRGoqa6eM7G}/_clientMiddlewareManifest.json +0 -0
  150. /package/web/.next/static/{nw4IT0rr_mE5Tx22X9OgO → xKJulVMYO_ZRGoqa6eM7G}/_ssgManifest.js +0 -0
@@ -4,10 +4,11 @@ export { FeatureAgentAnnotation, type FeatureAgentState } from './state.js';
4
4
  /**
5
5
  * Factory function that creates and compiles the feature-agent LangGraph.
6
6
  *
7
- * The graph defines a linear SDLC workflow:
8
- * analyze → requirements → research → plan → implement
7
+ * The graph defines a linear SDLC workflow with validation gates:
8
+ * analyze → validate → requirements → validate → research → validate → plan → validate → implement
9
9
  *
10
- * Each node delegates work to the injected IAgentExecutor (e.g. Claude Code).
10
+ * Each YAML-producing node is followed by a validate/repair loop that ensures
11
+ * the output YAML conforms to its schema before proceeding.
11
12
  *
12
13
  * @param executor - The agent executor to delegate prompt execution to
13
14
  * @param checkpointer - Optional checkpoint saver for state persistence
@@ -20,8 +21,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
20
21
  worktreePath: string;
21
22
  currentNode: string;
22
23
  error: string | null;
23
- approvalMode: string | undefined;
24
+ approvalGates: import("../../../../domain/generated/output.js").ApprovalGates | undefined;
24
25
  messages: string[];
26
+ validationRetries: number;
27
+ lastValidationTarget: string;
28
+ lastValidationErrors: string[];
25
29
  }, {
26
30
  featureId?: string | undefined;
27
31
  repositoryPath?: string | undefined;
@@ -29,9 +33,12 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
29
33
  worktreePath?: string | undefined;
30
34
  currentNode?: string | undefined;
31
35
  error?: string | null | undefined;
32
- approvalMode?: string | undefined;
36
+ approvalGates?: import("../../../../domain/generated/output.js").ApprovalGates | undefined;
33
37
  messages?: string[] | undefined;
34
- }, "__start__" | "analyze" | "requirements" | "research" | "plan" | "implement", {
38
+ validationRetries?: number | undefined;
39
+ lastValidationTarget?: string | undefined;
40
+ lastValidationErrors?: string[] | undefined;
41
+ }, "__start__" | "analyze" | "requirements" | "plan" | "implement" | "research" | "validate_spec_analyze" | "validate_spec_requirements" | "validate_research" | "validate_plan_tasks" | "repair_spec_analyze" | "repair_spec_requirements" | "repair_research" | "repair_plan_tasks", {
35
42
  featureId: {
36
43
  (): import("@langchain/langgraph").LastValue<string>;
37
44
  (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
@@ -58,8 +65,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
58
65
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
59
66
  };
60
67
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
61
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
68
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
62
69
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
70
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
71
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
72
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
63
73
  }, {
64
74
  featureId: {
65
75
  (): import("@langchain/langgraph").LastValue<string>;
@@ -87,8 +97,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
87
97
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
88
98
  };
89
99
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
90
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
100
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
91
101
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
102
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
103
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
104
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
92
105
  }, import("@langchain/langgraph").StateDefinition, {
93
106
  analyze: Partial<import("@langchain/langgraph").StateType<{
94
107
  featureId: {
@@ -117,8 +130,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
117
130
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
118
131
  };
119
132
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
120
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
133
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
121
134
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
135
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
136
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
137
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
122
138
  }>>;
123
139
  requirements: Partial<import("@langchain/langgraph").StateType<{
124
140
  featureId: {
@@ -147,8 +163,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
147
163
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
148
164
  };
149
165
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
150
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
166
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
151
167
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
168
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
169
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
170
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
152
171
  }>>;
153
172
  research: Partial<import("@langchain/langgraph").StateType<{
154
173
  featureId: {
@@ -177,8 +196,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
177
196
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
178
197
  };
179
198
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
180
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
199
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
181
200
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
201
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
202
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
203
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
182
204
  }>>;
183
205
  plan: Partial<import("@langchain/langgraph").StateType<{
184
206
  featureId: {
@@ -207,8 +229,11 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
207
229
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
208
230
  };
209
231
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
210
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
232
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
211
233
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
234
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
235
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
236
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
212
237
  }>>;
213
238
  implement: Partial<import("@langchain/langgraph").StateType<{
214
239
  featureId: {
@@ -237,8 +262,275 @@ export declare function createFeatureAgentGraph(executor: IAgentExecutor, checkp
237
262
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
238
263
  };
239
264
  error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
240
- approvalMode: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
265
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
241
266
  messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
267
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
268
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
269
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
270
+ }>>;
271
+ validate_spec_analyze: Partial<import("@langchain/langgraph").StateType<{
272
+ featureId: {
273
+ (): import("@langchain/langgraph").LastValue<string>;
274
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
275
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
276
+ };
277
+ repositoryPath: {
278
+ (): import("@langchain/langgraph").LastValue<string>;
279
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
280
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
281
+ };
282
+ specDir: {
283
+ (): import("@langchain/langgraph").LastValue<string>;
284
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
285
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
286
+ };
287
+ worktreePath: {
288
+ (): import("@langchain/langgraph").LastValue<string>;
289
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
290
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
291
+ };
292
+ currentNode: {
293
+ (): import("@langchain/langgraph").LastValue<string>;
294
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
295
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
296
+ };
297
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
298
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
299
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
300
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
301
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
302
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
303
+ }>>;
304
+ validate_spec_requirements: Partial<import("@langchain/langgraph").StateType<{
305
+ featureId: {
306
+ (): import("@langchain/langgraph").LastValue<string>;
307
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
308
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
309
+ };
310
+ repositoryPath: {
311
+ (): import("@langchain/langgraph").LastValue<string>;
312
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
313
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
314
+ };
315
+ specDir: {
316
+ (): import("@langchain/langgraph").LastValue<string>;
317
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
318
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
319
+ };
320
+ worktreePath: {
321
+ (): import("@langchain/langgraph").LastValue<string>;
322
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
323
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
324
+ };
325
+ currentNode: {
326
+ (): import("@langchain/langgraph").LastValue<string>;
327
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
328
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
329
+ };
330
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
331
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
332
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
333
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
334
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
335
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
336
+ }>>;
337
+ validate_research: Partial<import("@langchain/langgraph").StateType<{
338
+ featureId: {
339
+ (): import("@langchain/langgraph").LastValue<string>;
340
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
341
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
342
+ };
343
+ repositoryPath: {
344
+ (): import("@langchain/langgraph").LastValue<string>;
345
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
346
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
347
+ };
348
+ specDir: {
349
+ (): import("@langchain/langgraph").LastValue<string>;
350
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
351
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
352
+ };
353
+ worktreePath: {
354
+ (): import("@langchain/langgraph").LastValue<string>;
355
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
356
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
357
+ };
358
+ currentNode: {
359
+ (): import("@langchain/langgraph").LastValue<string>;
360
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
361
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
362
+ };
363
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
364
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
365
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
366
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
367
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
368
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
369
+ }>>;
370
+ validate_plan_tasks: Partial<import("@langchain/langgraph").StateType<{
371
+ featureId: {
372
+ (): import("@langchain/langgraph").LastValue<string>;
373
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
374
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
375
+ };
376
+ repositoryPath: {
377
+ (): import("@langchain/langgraph").LastValue<string>;
378
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
379
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
380
+ };
381
+ specDir: {
382
+ (): import("@langchain/langgraph").LastValue<string>;
383
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
384
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
385
+ };
386
+ worktreePath: {
387
+ (): import("@langchain/langgraph").LastValue<string>;
388
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
389
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
390
+ };
391
+ currentNode: {
392
+ (): import("@langchain/langgraph").LastValue<string>;
393
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
394
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
395
+ };
396
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
397
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
398
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
399
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
400
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
401
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
402
+ }>>;
403
+ repair_spec_analyze: Partial<import("@langchain/langgraph").StateType<{
404
+ featureId: {
405
+ (): import("@langchain/langgraph").LastValue<string>;
406
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
407
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
408
+ };
409
+ repositoryPath: {
410
+ (): import("@langchain/langgraph").LastValue<string>;
411
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
412
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
413
+ };
414
+ specDir: {
415
+ (): import("@langchain/langgraph").LastValue<string>;
416
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
417
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
418
+ };
419
+ worktreePath: {
420
+ (): import("@langchain/langgraph").LastValue<string>;
421
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
422
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
423
+ };
424
+ currentNode: {
425
+ (): import("@langchain/langgraph").LastValue<string>;
426
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
427
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
428
+ };
429
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
430
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
431
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
432
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
433
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
434
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
435
+ }>>;
436
+ repair_spec_requirements: Partial<import("@langchain/langgraph").StateType<{
437
+ featureId: {
438
+ (): import("@langchain/langgraph").LastValue<string>;
439
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
440
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
441
+ };
442
+ repositoryPath: {
443
+ (): import("@langchain/langgraph").LastValue<string>;
444
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
445
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
446
+ };
447
+ specDir: {
448
+ (): import("@langchain/langgraph").LastValue<string>;
449
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
450
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
451
+ };
452
+ worktreePath: {
453
+ (): import("@langchain/langgraph").LastValue<string>;
454
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
455
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
456
+ };
457
+ currentNode: {
458
+ (): import("@langchain/langgraph").LastValue<string>;
459
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
460
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
461
+ };
462
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
463
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
464
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
465
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
466
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
467
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
468
+ }>>;
469
+ repair_research: Partial<import("@langchain/langgraph").StateType<{
470
+ featureId: {
471
+ (): import("@langchain/langgraph").LastValue<string>;
472
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
473
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
474
+ };
475
+ repositoryPath: {
476
+ (): import("@langchain/langgraph").LastValue<string>;
477
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
478
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
479
+ };
480
+ specDir: {
481
+ (): import("@langchain/langgraph").LastValue<string>;
482
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
483
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
484
+ };
485
+ worktreePath: {
486
+ (): import("@langchain/langgraph").LastValue<string>;
487
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
488
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
489
+ };
490
+ currentNode: {
491
+ (): import("@langchain/langgraph").LastValue<string>;
492
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
493
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
494
+ };
495
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
496
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
497
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
498
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
499
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
500
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
501
+ }>>;
502
+ repair_plan_tasks: Partial<import("@langchain/langgraph").StateType<{
503
+ featureId: {
504
+ (): import("@langchain/langgraph").LastValue<string>;
505
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
506
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
507
+ };
508
+ repositoryPath: {
509
+ (): import("@langchain/langgraph").LastValue<string>;
510
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
511
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
512
+ };
513
+ specDir: {
514
+ (): import("@langchain/langgraph").LastValue<string>;
515
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
516
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
517
+ };
518
+ worktreePath: {
519
+ (): import("@langchain/langgraph").LastValue<string>;
520
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
521
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
522
+ };
523
+ currentNode: {
524
+ (): import("@langchain/langgraph").LastValue<string>;
525
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
526
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
527
+ };
528
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
529
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/generated/output.js").ApprovalGates | undefined, import("../../../../domain/generated/output.js").ApprovalGates | undefined>;
530
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
531
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
532
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
533
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
242
534
  }>>;
243
535
  }, unknown, unknown>;
244
536
  //# sourceMappingURL=feature-agent-graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AASpG,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,cAAc,EACxB,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgBnC"}
1
+ {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAepG,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAuG5E;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,cAAc,EACxB,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoDnC"}
@@ -5,15 +5,112 @@ import { createRequirementsNode } from './nodes/requirements.node.js';
5
5
  import { createResearchNode } from './nodes/research.node.js';
6
6
  import { createPlanNode } from './nodes/plan.node.js';
7
7
  import { createImplementNode } from './nodes/implement.node.js';
8
+ import { createValidateNode } from './nodes/validate.node.js';
9
+ import { createRepairNode } from './nodes/repair.node.js';
10
+ import { validateSpecAnalyze, validateSpecRequirements } from './nodes/schemas/spec.schema.js';
11
+ import { validateResearch } from './nodes/schemas/research.schema.js';
12
+ import { validatePlan, validateTasks } from './nodes/schemas/plan.schema.js';
13
+ import { readSpecFile, safeYamlLoad, createNodeLogger } from './nodes/node-helpers.js';
8
14
  // Re-export state types for consumers
9
15
  export { FeatureAgentAnnotation } from './state.js';
16
+ /**
17
+ * Factory that creates a conditional edge function for validation routing.
18
+ *
19
+ * Routes to successNode on pass, repairNode on fail, throws after maxRetries.
20
+ */
21
+ function routeValidation(successNode, repairNode, maxRetries = 3) {
22
+ return (state) => {
23
+ if (state.lastValidationErrors.length === 0)
24
+ return successNode;
25
+ if (state.validationRetries >= maxRetries) {
26
+ throw new Error(`Validation failed after ${maxRetries} repair attempts for '${state.lastValidationTarget}': ${state.lastValidationErrors.join('; ')}`);
27
+ }
28
+ return repairNode;
29
+ };
30
+ }
31
+ /**
32
+ * Creates a combined plan+tasks validator node.
33
+ *
34
+ * Validates plan.yaml first, then tasks.yaml with cross-referencing
35
+ * of phaseIds from the plan. Combines all errors.
36
+ */
37
+ function createPlanTasksValidator() {
38
+ const log = createNodeLogger('validate:plan+tasks');
39
+ return async (state) => {
40
+ log.info('Validating plan.yaml and tasks.yaml');
41
+ const allErrors = [];
42
+ // Validate plan.yaml
43
+ const planContent = readSpecFile(state.specDir, 'plan.yaml');
44
+ if (!planContent) {
45
+ allErrors.push("File 'plan.yaml' not found or empty");
46
+ }
47
+ else {
48
+ try {
49
+ const planData = safeYamlLoad(planContent);
50
+ const planResult = validatePlan(planData);
51
+ allErrors.push(...planResult.errors);
52
+ }
53
+ catch (err) {
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ allErrors.push(`YAML parse error in plan.yaml: ${msg}`);
56
+ }
57
+ }
58
+ // Validate tasks.yaml with cross-reference
59
+ const tasksContent = readSpecFile(state.specDir, 'tasks.yaml');
60
+ if (!tasksContent) {
61
+ allErrors.push("File 'tasks.yaml' not found or empty");
62
+ }
63
+ else {
64
+ try {
65
+ const tasksData = safeYamlLoad(tasksContent);
66
+ // Extract phaseIds from plan for cross-validation
67
+ let phaseIds = [];
68
+ if (planContent) {
69
+ try {
70
+ const planData = safeYamlLoad(planContent);
71
+ const phases = Array.isArray(planData?.phases) ? planData.phases : [];
72
+ phaseIds = phases
73
+ .filter((p) => typeof p?.id === 'string')
74
+ .map((p) => p.id);
75
+ }
76
+ catch {
77
+ // Plan parse already reported above
78
+ }
79
+ }
80
+ const tasksResult = validateTasks(tasksData, phaseIds);
81
+ allErrors.push(...tasksResult.errors);
82
+ }
83
+ catch (err) {
84
+ const msg = err instanceof Error ? err.message : String(err);
85
+ allErrors.push(`YAML parse error in tasks.yaml: ${msg}`);
86
+ }
87
+ }
88
+ if (allErrors.length === 0) {
89
+ log.info('Validation passed');
90
+ return {
91
+ lastValidationTarget: 'plan.yaml+tasks.yaml',
92
+ lastValidationErrors: [],
93
+ validationRetries: 0,
94
+ messages: ['[validate:plan+tasks] PASS'],
95
+ };
96
+ }
97
+ log.error(`Validation failed: ${allErrors.join('; ')}`);
98
+ return {
99
+ lastValidationTarget: 'plan.yaml+tasks.yaml',
100
+ lastValidationErrors: allErrors,
101
+ validationRetries: state.validationRetries + 1,
102
+ messages: [`[validate:plan+tasks] FAIL: ${allErrors.length} error(s)`],
103
+ };
104
+ };
105
+ }
10
106
  /**
11
107
  * Factory function that creates and compiles the feature-agent LangGraph.
12
108
  *
13
- * The graph defines a linear SDLC workflow:
14
- * analyze → requirements → research → plan → implement
109
+ * The graph defines a linear SDLC workflow with validation gates:
110
+ * analyze → validate → requirements → validate → research → validate → plan → validate → implement
15
111
  *
16
- * Each node delegates work to the injected IAgentExecutor (e.g. Claude Code).
112
+ * Each YAML-producing node is followed by a validate/repair loop that ensures
113
+ * the output YAML conforms to its schema before proceeding.
17
114
  *
18
115
  * @param executor - The agent executor to delegate prompt execution to
19
116
  * @param checkpointer - Optional checkpoint saver for state persistence
@@ -21,16 +118,36 @@ export { FeatureAgentAnnotation } from './state.js';
21
118
  */
22
119
  export function createFeatureAgentGraph(executor, checkpointer) {
23
120
  const graph = new StateGraph(FeatureAgentAnnotation)
121
+ // --- Producer nodes ---
24
122
  .addNode('analyze', createAnalyzeNode(executor))
25
123
  .addNode('requirements', createRequirementsNode(executor))
26
124
  .addNode('research', createResearchNode(executor))
27
125
  .addNode('plan', createPlanNode(executor))
28
126
  .addNode('implement', createImplementNode(executor))
127
+ // --- Validate nodes ---
128
+ .addNode('validate_spec_analyze', createValidateNode('spec.yaml', validateSpecAnalyze))
129
+ .addNode('validate_spec_requirements', createValidateNode('spec.yaml', validateSpecRequirements))
130
+ .addNode('validate_research', createValidateNode('research.yaml', validateResearch))
131
+ .addNode('validate_plan_tasks', createPlanTasksValidator())
132
+ // --- Repair nodes ---
133
+ .addNode('repair_spec_analyze', createRepairNode('spec.yaml', executor))
134
+ .addNode('repair_spec_requirements', createRepairNode('spec.yaml', executor))
135
+ .addNode('repair_research', createRepairNode('research.yaml', executor))
136
+ .addNode('repair_plan_tasks', createRepairNode(['plan.yaml', 'tasks.yaml'], executor))
137
+ // --- Edges: linear flow with validation gates ---
29
138
  .addEdge(START, 'analyze')
30
- .addEdge('analyze', 'requirements')
31
- .addEdge('requirements', 'research')
32
- .addEdge('research', 'plan')
33
- .addEdge('plan', 'implement')
139
+ .addEdge('analyze', 'validate_spec_analyze')
140
+ .addConditionalEdges('validate_spec_analyze', routeValidation('requirements', 'repair_spec_analyze'))
141
+ .addEdge('repair_spec_analyze', 'validate_spec_analyze')
142
+ .addEdge('requirements', 'validate_spec_requirements')
143
+ .addConditionalEdges('validate_spec_requirements', routeValidation('research', 'repair_spec_requirements'))
144
+ .addEdge('repair_spec_requirements', 'validate_spec_requirements')
145
+ .addEdge('research', 'validate_research')
146
+ .addConditionalEdges('validate_research', routeValidation('plan', 'repair_research'))
147
+ .addEdge('repair_research', 'validate_research')
148
+ .addEdge('plan', 'validate_plan_tasks')
149
+ .addConditionalEdges('validate_plan_tasks', routeValidation('implement', 'repair_plan_tasks'))
150
+ .addEdge('repair_plan_tasks', 'validate_plan_tasks')
34
151
  .addEdge('implement', END);
35
152
  return graph.compile({ checkpointer });
36
153
  }
@@ -7,11 +7,12 @@
7
7
  */
8
8
  import type { IFeatureAgentProcessService } from '../../../../application/ports/output/agents/feature-agent-process.interface.js';
9
9
  import type { IAgentRunRepository } from '../../../../application/ports/output/agents/agent-run-repository.interface.js';
10
+ import { type ApprovalGates } from '../../../../domain/generated/output.js';
10
11
  export declare class FeatureAgentProcessService implements IFeatureAgentProcessService {
11
12
  private readonly runRepository;
12
13
  constructor(runRepository: IAgentRunRepository);
13
14
  spawn(featureId: string, runId: string, repoPath: string, specDir: string, worktreePath?: string, options?: {
14
- approvalMode?: string;
15
+ approvalGates?: ApprovalGates;
15
16
  resume?: boolean;
16
17
  threadId?: string;
17
18
  resumeFromInterrupt?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-process.service.d.ts","sourceRoot":"","sources":["../../../../../../src/infrastructure/services/agents/feature-agent/feature-agent-process.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAa/G,qBAAa,0BAA2B,YAAW,2BAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAE/D,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,GACA,MAAM;IAkDT,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAexD"}
1
+ {"version":3,"file":"feature-agent-process.service.d.ts","sourceRoot":"","sources":["../../../../../../src/infrastructure/services/agents/feature-agent/feature-agent-process.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAC/G,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAYlF,qBAAa,0BAA2B,YAAW,2BAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAE/D,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,GACA,MAAM;IAkDT,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAexD"}
@@ -41,8 +41,8 @@ export class FeatureAgentProcessService {
41
41
  if (worktreePath) {
42
42
  args.push('--worktree-path', worktreePath);
43
43
  }
44
- if (options?.approvalMode) {
45
- args.push('--approval-mode', options.approvalMode);
44
+ if (options?.approvalGates) {
45
+ args.push('--approval-gates', JSON.stringify(options.approvalGates));
46
46
  }
47
47
  if (options?.threadId) {
48
48
  args.push('--thread-id', options.threadId);
@@ -9,13 +9,14 @@
9
9
  * CLI Args: --feature-id <id> --run-id <id> --repo <path> --spec-dir <path>
10
10
  */
11
11
  import 'reflect-metadata';
12
+ import type { ApprovalGates } from '../../../../domain/generated/output.js';
12
13
  export interface WorkerArgs {
13
14
  featureId: string;
14
15
  runId: string;
15
16
  repo: string;
16
17
  specDir: string;
17
18
  worktreePath?: string;
18
- approvalMode?: string;
19
+ approvalGates?: ApprovalGates;
19
20
  resume?: boolean;
20
21
  threadId?: string;
21
22
  resumeFromInterrupt?: boolean;