@shepai/cli 1.122.1 → 1.122.2

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 (135) hide show
  1. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +21 -4
  3. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts +7 -1
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.js +24 -2
  6. package/dist/tsconfig.build.tsbuildinfo +1 -1
  7. package/package.json +1 -1
  8. package/web/.next/BUILD_ID +1 -1
  9. package/web/.next/build-manifest.json +2 -2
  10. package/web/.next/fallback-build-manifest.json +2 -2
  11. package/web/.next/prerender-manifest.json +3 -3
  12. package/web/.next/required-server-files.js +2 -2
  13. package/web/.next/required-server-files.json +2 -2
  14. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  15. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  17. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  18. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  24. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  27. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  30. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  33. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  36. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  39. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/_global-error.html +2 -2
  42. package/web/.next/server/app/_global-error.rsc +1 -1
  43. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  44. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  45. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  46. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  47. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  48. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  49. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  51. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  52. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  54. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  56. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  58. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  60. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  61. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  62. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  63. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  64. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  65. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  66. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  67. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js +1 -1
  68. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +1 -1
  69. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +2 -2
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +1 -1
  87. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  89. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  90. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  91. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/{_92d851b4._.js → _42caff2c._.js} +2 -2
  93. package/web/.next/server/chunks/ssr/{_92d851b4._.js.map → _42caff2c._.js.map} +1 -1
  94. package/web/.next/server/chunks/ssr/{_b294a667._.js → _9b7b1c2b._.js} +2 -2
  95. package/web/.next/server/chunks/ssr/{_b294a667._.js.map → _9b7b1c2b._.js.map} +1 -1
  96. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  97. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/_ecfef26e._.js +3 -0
  99. package/web/.next/server/chunks/ssr/{_469c5451._.js.map → _ecfef26e._.js.map} +1 -1
  100. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  101. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  103. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  105. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  107. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  111. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  118. package/web/.next/server/pages/500.html +2 -2
  119. package/web/.next/server/server-reference-manifest.js +1 -1
  120. package/web/.next/server/server-reference-manifest.json +34 -34
  121. package/web/.next/static/chunks/{658fc2f5f65cf3b5.js → 0110425f3a60fc18.js} +2 -2
  122. package/web/.next/static/chunks/12f3ae6b693c8baf.js +1 -0
  123. package/web/.next/static/chunks/{78ab7b134f0649ac.js → 17d618a2fb4e9a11.js} +1 -1
  124. package/web/.next/static/chunks/{941c13dcdb1978a4.js → 6339d1c357e7fea3.js} +2 -2
  125. package/web/.next/static/chunks/{df85e52b1afb7340.js → 83fed73369b40eaf.js} +1 -1
  126. package/web/.next/static/chunks/{e6a2fb8707e079ff.js → 8e5bdf9fb945ae6a.js} +1 -1
  127. package/web/.next/static/chunks/{e9c3fbbeb418cbfa.js → be0d245d0e672d44.js} +1 -1
  128. package/web/.next/static/chunks/{50dd80c8aafa3b20.js → e6c0bf49bcd5d0fb.js} +1 -1
  129. package/web/.next/static/chunks/{37ac7fe1cd493293.js → f464a486bd88502d.js} +1 -1
  130. package/web/.next/static/chunks/{9df4681de92ebfc3.js → ff81a9dd7b7bc56f.js} +1 -1
  131. package/web/.next/server/chunks/ssr/_469c5451._.js +0 -3
  132. package/web/.next/static/chunks/11e4439096f8d652.js +0 -1
  133. /package/web/.next/static/{hsK1x0unrjI_pUsvQhn6P → DIjy_LTLHBNoz5RRTRhBy}/_buildManifest.js +0 -0
  134. /package/web/.next/static/{hsK1x0unrjI_pUsvQhn6P → DIjy_LTLHBNoz5RRTRhBy}/_clientMiddlewareManifest.json +0 -0
  135. /package/web/.next/static/{hsK1x0unrjI_pUsvQhn6P → DIjy_LTLHBNoz5RRTRhBy}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/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;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASlF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AA0HD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwEnC"}
1
+ {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/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;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAclF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAwID;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgFnC"}
@@ -11,7 +11,7 @@ import { createRepairNode } from './nodes/repair.node.js';
11
11
  import { validateSpecAnalyze, validateSpecRequirements } from './nodes/schemas/spec.schema.js';
12
12
  import { validateResearch } from './nodes/schemas/research.schema.js';
13
13
  import { validatePlan, validateTasks } from './nodes/schemas/plan.schema.js';
14
- import { readSpecFile, safeYamlLoad, createNodeLogger } from './nodes/node-helpers.js';
14
+ import { readSpecFile, safeYamlLoad, createNodeLogger, getCompletedPhases, } from './nodes/node-helpers.js';
15
15
  // Re-export state types for consumers
16
16
  export { FeatureAgentAnnotation } from './state.js';
17
17
  /**
@@ -54,6 +54,18 @@ function createPlanTasksValidator() {
54
54
  const log = createNodeLogger('validate:plan+tasks');
55
55
  return async (state) => {
56
56
  log.activate();
57
+ // Skip validation when the successor phase (implement) is already completed.
58
+ // This proves validation already passed and the pipeline progressed beyond it.
59
+ // Same logic as createValidateNode's successorPhase guard.
60
+ if (getCompletedPhases(state.specDir).includes('implement')) {
61
+ log.info("Successor phase 'implement' already completed, skipping validation");
62
+ return {
63
+ lastValidationTarget: 'plan.yaml+tasks.yaml',
64
+ lastValidationErrors: [],
65
+ validationRetries: 0,
66
+ messages: ["[validate:plan+tasks] SKIP (successor 'implement' already completed)"],
67
+ };
68
+ }
57
69
  log.info('Validating plan.yaml and tasks.yaml');
58
70
  const allErrors = [];
59
71
  // Validate plan.yaml
@@ -145,9 +157,14 @@ export function createFeatureAgentGraph(depsOrExecutor, checkpointer) {
145
157
  .addNode('plan', createPlanNode(executor))
146
158
  .addNode('implement', createImplementNode(executor))
147
159
  // --- Validate nodes ---
148
- .addNode('validate_spec_analyze', createValidateNode('spec.yaml', validateSpecAnalyze))
149
- .addNode('validate_spec_requirements', createValidateNode('spec.yaml', validateSpecRequirements))
150
- .addNode('validate_research', createValidateNode('research.yaml', validateResearch))
160
+ // Each validate node receives its SUCCESSOR phase name (the phase that runs
161
+ // after validation passes). On resume, validation is skipped only when the
162
+ // successor is already completed — proving this validation already passed.
163
+ // Using the successor (not the producer) avoids skipping validation when the
164
+ // producer ran successfully but validation itself failed.
165
+ .addNode('validate_spec_analyze', createValidateNode('spec.yaml', validateSpecAnalyze, 'requirements'))
166
+ .addNode('validate_spec_requirements', createValidateNode('spec.yaml', validateSpecRequirements, 'research'))
167
+ .addNode('validate_research', createValidateNode('research.yaml', validateResearch, 'plan'))
151
168
  .addNode('validate_plan_tasks', createPlanTasksValidator())
152
169
  // --- Repair nodes ---
153
170
  .addNode('repair_spec_analyze', createRepairNode('spec.yaml', executor))
@@ -6,7 +6,13 @@ type SchemaValidator = (data: unknown) => ValidationResult;
6
6
  *
7
7
  * On success: resets validationRetries to 0, clears errors.
8
8
  * On failure: increments validationRetries, sets errors for repair node.
9
+ *
10
+ * @param successorPhase - The phase that runs AFTER this validation passes.
11
+ * If provided, skip validation when the successor is already completed — this
12
+ * proves the validation already passed in a prior run and the pipeline progressed
13
+ * beyond it. Checking the successor (not the producer) avoids skipping validation
14
+ * when the producer ran but validation itself failed.
9
15
  */
10
- export declare function createValidateNode(filename: string, schema: SchemaValidator): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
16
+ export declare function createValidateNode(filename: string, schema: SchemaValidator, successorPhase?: string): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
11
17
  export {};
12
18
  //# sourceMappingURL=validate.node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,GACtB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAuDnE"}
1
+ {"version":3,"file":"validate.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,GACtB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAyEnE"}
@@ -1,14 +1,36 @@
1
- import { readSpecFile, safeYamlLoad, createNodeLogger } from './node-helpers.js';
1
+ import { readSpecFile, safeYamlLoad, createNodeLogger, getCompletedPhases, } from './node-helpers.js';
2
2
  /**
3
3
  * Factory that creates a validate node for a specific YAML file.
4
4
  *
5
5
  * On success: resets validationRetries to 0, clears errors.
6
6
  * On failure: increments validationRetries, sets errors for repair node.
7
+ *
8
+ * @param successorPhase - The phase that runs AFTER this validation passes.
9
+ * If provided, skip validation when the successor is already completed — this
10
+ * proves the validation already passed in a prior run and the pipeline progressed
11
+ * beyond it. Checking the successor (not the producer) avoids skipping validation
12
+ * when the producer ran but validation itself failed.
7
13
  */
8
- export function createValidateNode(filename, schema) {
14
+ export function createValidateNode(filename, schema, successorPhase) {
9
15
  const log = createNodeLogger(`validate:${filename}`);
10
16
  return async (state) => {
11
17
  log.activate();
18
+ // Skip validation when the successor phase is already completed.
19
+ // This means: the validation already passed in a prior run AND the next phase
20
+ // ran successfully. On resume, LangGraph replays nodes from the last checkpoint.
21
+ // The producer node skips (via getCompletedPhases), but if we only checked the
22
+ // producer we'd also skip validation when it previously FAILED (since
23
+ // markPhaseComplete runs before validation). Checking the successor is safe:
24
+ // if the successor completed, this validation must have passed to get there.
25
+ if (successorPhase && getCompletedPhases(state.specDir).includes(successorPhase)) {
26
+ log.info(`Successor phase '${successorPhase}' already completed, skipping validation`);
27
+ return {
28
+ lastValidationTarget: filename,
29
+ lastValidationErrors: [],
30
+ validationRetries: 0,
31
+ messages: [`[validate:${filename}] SKIP (successor '${successorPhase}' already completed)`],
32
+ };
33
+ }
12
34
  log.info(`Validating ${filename}`);
13
35
  const content = readSpecFile(state.specDir, filename);
14
36
  if (!content) {