@shepai/cli 1.98.0 → 1.99.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/apis/json-schema/Evidence.yaml +25 -0
- package/apis/json-schema/EvidenceType.yaml +9 -0
- package/apis/json-schema/WorkflowConfig.yaml +10 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +2 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +39 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +7 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +5 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +7 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +12 -5
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.js +9 -8
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +18 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.js +48 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts +28 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +98 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +69 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +68 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +5 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +19 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +197 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +17 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +72 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +5 -0
- package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-merge-review-data.js +36 -3
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +2 -0
- package/dist/src/presentation/web/app/api/evidence/route.d.ts +8 -0
- package/dist/src/presentation/web/app/api/evidence/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/evidence/route.js +50 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +27 -3
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +2 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +12 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +63 -3
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +38 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +27 -5
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +14 -0
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +6 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/evidence/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/evidence/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/evidence/route.js +7 -0
- package/web/.next/server/app/api/evidence/route.js.map +5 -0
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -0
- package/web/.next/server/app/api/evidence/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/feature-logs/route.js +1 -1
- package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js +1 -1
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js +1 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__7d63f9a4._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__7d63f9a4._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js → [root-of-the-server]__91d44424._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__a1c7c02a._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__a1c7c02a._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__a5879003._.js → [root-of-the-server]__db04ed44._.js} +2 -2
- package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_evidence_route_actions_38aa6e60.js +3 -0
- package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_evidence_route_actions_38aa6e60.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19fb0bfe._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19fb0bfe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js → [root-of-the-server]__248ee887._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3d6f6b0e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3d6f6b0e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42020c54._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42020c54._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js → [root-of-the-server]__9bc1434f._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9cb60e1e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9cb60e1e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js → [root-of-the-server]__b062b383._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1718c38f._.js → _3fafea0f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1718c38f._.js.map → _3fafea0f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_5e112f82._.js → _60e203af._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_5e112f82._.js.map → _60e203af._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_6a83bd29._.js +3 -0
- package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_2b65878f._.js.map → _6a83bd29._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_17237ac7._.js → _cb93a788._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_17237ac7._.js.map → _cb93a788._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_eca4aa07._.js +3 -0
- package/web/.next/server/chunks/ssr/{_b6866f30._.js.map → _eca4aa07._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +30 -30
- package/web/.next/static/chunks/{d95cd4b81c8d7580.js → 133cef90b3975d8f.js} +1 -1
- package/web/.next/static/chunks/{9284ea43640fc469.js → 17c31f43cf41eda4.js} +1 -1
- package/web/.next/static/chunks/{3418f7926955f058.js → 24e64b7a634794ad.js} +1 -1
- package/web/.next/static/chunks/{feb21651203a4855.js → 356b41f959ceb6dc.js} +1 -1
- package/web/.next/static/chunks/{550b849dcc7c1df1.js → 43ac66e5699a245a.js} +1 -1
- package/web/.next/static/chunks/4d4019cbe85eaedc.css +1 -0
- package/web/.next/static/chunks/{550acf01d8003f3a.js → 6b3282453b0bdc6e.js} +1 -1
- package/web/.next/static/chunks/71f3fb72d47e709b.js +1 -0
- package/web/.next/static/chunks/761b0946d122beec.js +1 -0
- package/web/.next/static/chunks/{5dc83c75c3acefb3.js → d1f5da71a9abf369.js} +1 -1
- package/web/.next/static/chunks/{bd6df3bba696a007.js → e01c63f00ba7ec95.js} +2 -2
- package/web/.next/static/chunks/e24a024affc634d9.js +1 -0
- package/web/.next/static/chunks/e7d1e440160f9fc2.js +2 -0
- package/web/.next/server/chunks/[root-of-the-server]__0b10355c._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__0b10355c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_2b65878f._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b65f78cf._.js +0 -3
- package/web/.next/server/chunks/ssr/_b6866f30._.js +0 -3
- package/web/.next/static/chunks/197b047efa3501c8.js +0 -1
- package/web/.next/static/chunks/71d785d1de4b86f6.css +0 -1
- package/web/.next/static/chunks/8a3eff27cccf331f.js +0 -1
- package/web/.next/static/chunks/8bd300e88a189928.js +0 -1
- package/web/.next/static/chunks/f7794f1941c8c867.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js.map → [root-of-the-server]__91d44424._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__a5879003._.js.map → [root-of-the-server]__db04ed44._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js.map → [root-of-the-server]__248ee887._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b65f78cf._.js.map → [root-of-the-server]__4af0afe0._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js.map → [root-of-the-server]__9bc1434f._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js.map → [root-of-the-server]__b062b383._.js.map} +0 -0
- /package/web/.next/static/{HxY7oDPQaoJ0BmVeVLer5 → kPS64EVb81p_02U5q_c7b}/_buildManifest.js +0 -0
- /package/web/.next/static/{HxY7oDPQaoJ0BmVeVLer5 → kPS64EVb81p_02U5q_c7b}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{HxY7oDPQaoJ0BmVeVLer5 → kPS64EVb81p_02U5q_c7b}/_ssgManifest.js +0 -0
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export interface FeatureAgentGraphDeps {
|
|
|
14
14
|
* Factory function that creates and compiles the feature-agent LangGraph.
|
|
15
15
|
*
|
|
16
16
|
* The graph defines a linear SDLC workflow with validation gates:
|
|
17
|
-
* analyze → validate → requirements → validate → research → validate → plan → validate → implement → merge
|
|
17
|
+
* analyze → validate → requirements → validate → research → validate → plan → validate → implement (+ evidence sub-agent) → merge
|
|
18
18
|
*
|
|
19
19
|
* Each YAML-producing node is followed by a validate/repair loop that ensures
|
|
20
20
|
* the output YAML conforms to its schema before proceeding.
|
|
@@ -45,6 +45,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
45
45
|
ciStatus: string | null;
|
|
46
46
|
push: boolean;
|
|
47
47
|
openPr: boolean;
|
|
48
|
+
evidence: import("../../../../domain/index.js").Evidence[];
|
|
48
49
|
ciFixAttempts: number;
|
|
49
50
|
ciFixHistory: import("../../../../domain/index.js").CiFixRecord[];
|
|
50
51
|
ciFixStatus: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted";
|
|
@@ -70,6 +71,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
70
71
|
ciStatus?: string | null | undefined;
|
|
71
72
|
push?: boolean | undefined;
|
|
72
73
|
openPr?: boolean | undefined;
|
|
74
|
+
evidence?: import("../../../../domain/index.js").Evidence[] | undefined;
|
|
73
75
|
ciFixAttempts?: number | undefined;
|
|
74
76
|
ciFixHistory?: import("../../../../domain/index.js").CiFixRecord[] | undefined;
|
|
75
77
|
ciFixStatus?: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted" | undefined;
|
|
@@ -115,6 +117,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
115
117
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
116
118
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
117
119
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
120
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
118
121
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
119
122
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
120
123
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -160,6 +163,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
160
163
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
161
164
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
162
165
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
166
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
163
167
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
164
168
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
165
169
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -206,6 +210,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
206
210
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
207
211
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
208
212
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
213
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
209
214
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
210
215
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
211
216
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -252,6 +257,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
252
257
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
253
258
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
254
259
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
260
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
255
261
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
256
262
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
257
263
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -298,6 +304,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
298
304
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
299
305
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
300
306
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
307
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
301
308
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
302
309
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
303
310
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -344,6 +351,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
344
351
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
345
352
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
346
353
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
354
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
347
355
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
348
356
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
349
357
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -390,6 +398,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
390
398
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
391
399
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
392
400
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
401
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
393
402
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
394
403
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
395
404
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -436,6 +445,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
436
445
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
437
446
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
438
447
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
448
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
439
449
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
440
450
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
441
451
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -482,6 +492,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
482
492
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
483
493
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
484
494
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
495
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
485
496
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
486
497
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
487
498
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -528,6 +539,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
528
539
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
529
540
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
530
541
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
542
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
531
543
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
532
544
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
533
545
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -574,6 +586,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
574
586
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
575
587
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
576
588
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
589
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
577
590
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
578
591
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
579
592
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -620,6 +633,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
620
633
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
621
634
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
622
635
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
636
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
623
637
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
624
638
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
625
639
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -666,6 +680,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
666
680
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
667
681
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
668
682
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
683
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
669
684
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
670
685
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
671
686
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -712,6 +727,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
712
727
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
713
728
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
714
729
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
730
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
715
731
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
716
732
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
717
733
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -758,6 +774,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
|
|
|
758
774
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
759
775
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
760
776
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
777
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
|
|
761
778
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
762
779
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
|
|
763
780
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -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;AAyHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB
|
|
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;AAyHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwEnC"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js
CHANGED
|
@@ -123,7 +123,7 @@ function createPlanTasksValidator() {
|
|
|
123
123
|
* Factory function that creates and compiles the feature-agent LangGraph.
|
|
124
124
|
*
|
|
125
125
|
* The graph defines a linear SDLC workflow with validation gates:
|
|
126
|
-
* analyze → validate → requirements → validate → research → validate → plan → validate → implement → merge
|
|
126
|
+
* analyze → validate → requirements → validate → research → validate → plan → validate → implement (+ evidence sub-agent) → merge
|
|
127
127
|
*
|
|
128
128
|
* Each YAML-producing node is followed by a validate/repair loop that ensures
|
|
129
129
|
* the output YAML conforms to its schema before proceeding.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Output Parser
|
|
3
|
+
*
|
|
4
|
+
* Extracts structured Evidence records from free-form agent text output.
|
|
5
|
+
* Looks for a fenced JSON code block containing an array of evidence objects.
|
|
6
|
+
* Returns empty array gracefully on any parsing failure.
|
|
7
|
+
*/
|
|
8
|
+
import type { Evidence } from '../../../../../domain/generated/output.js';
|
|
9
|
+
/**
|
|
10
|
+
* Extract Evidence records from agent text output.
|
|
11
|
+
* Looks for a fenced JSON code block containing a JSON array of evidence objects.
|
|
12
|
+
* Returns empty array when no block found, JSON is malformed, or no valid records exist.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseEvidenceRecords(output: string): Evidence[];
|
|
15
|
+
//# sourceMappingURL=evidence-output-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-output-parser.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAwB1E;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAc/D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Output Parser
|
|
3
|
+
*
|
|
4
|
+
* Extracts structured Evidence records from free-form agent text output.
|
|
5
|
+
* Looks for a fenced JSON code block containing an array of evidence objects.
|
|
6
|
+
* Returns empty array gracefully on any parsing failure.
|
|
7
|
+
*/
|
|
8
|
+
import { EvidenceType } from '../../../../../domain/generated/output.js';
|
|
9
|
+
// Matches a fenced JSON code block: ```json ... ```
|
|
10
|
+
const JSON_BLOCK_RE = /```json\s*\n([\s\S]*?)\n\s*```/;
|
|
11
|
+
const VALID_EVIDENCE_TYPES = new Set(Object.values(EvidenceType));
|
|
12
|
+
function isValidRecord(record) {
|
|
13
|
+
if (record === null || typeof record !== 'object')
|
|
14
|
+
return false;
|
|
15
|
+
const r = record;
|
|
16
|
+
if (typeof r.type !== 'string' || !VALID_EVIDENCE_TYPES.has(r.type))
|
|
17
|
+
return false;
|
|
18
|
+
if (typeof r.capturedAt !== 'string')
|
|
19
|
+
return false;
|
|
20
|
+
if (typeof r.description !== 'string')
|
|
21
|
+
return false;
|
|
22
|
+
if (typeof r.relativePath !== 'string')
|
|
23
|
+
return false;
|
|
24
|
+
// Block path traversal
|
|
25
|
+
if (r.relativePath.includes('..'))
|
|
26
|
+
return false;
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract Evidence records from agent text output.
|
|
31
|
+
* Looks for a fenced JSON code block containing a JSON array of evidence objects.
|
|
32
|
+
* Returns empty array when no block found, JSON is malformed, or no valid records exist.
|
|
33
|
+
*/
|
|
34
|
+
export function parseEvidenceRecords(output) {
|
|
35
|
+
const match = output.match(JSON_BLOCK_RE);
|
|
36
|
+
if (!match)
|
|
37
|
+
return [];
|
|
38
|
+
let parsed;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(match[1]);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
if (!Array.isArray(parsed))
|
|
46
|
+
return [];
|
|
47
|
+
return parsed.filter(isValidRecord);
|
|
48
|
+
}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Node — Agent-Directed Evidence Collection
|
|
3
|
+
*
|
|
4
|
+
* Captures visual and textual evidence (screenshots, test outputs,
|
|
5
|
+
* terminal recordings) proving that implemented tasks work as expected.
|
|
6
|
+
* Evidence files are committed to .shep/evidence/ on the feature branch
|
|
7
|
+
* and evidence records flow through graph state to the merge node for
|
|
8
|
+
* inclusion in the PR body.
|
|
9
|
+
*
|
|
10
|
+
* Uses a custom node pattern (not executeNode) because it needs a
|
|
11
|
+
* post-execution parsing step to extract Evidence[] from the agent's
|
|
12
|
+
* text output via parseEvidenceRecords. Reuses the same helpers as
|
|
13
|
+
* other nodes (createNodeLogger, buildExecutorOptions, retryExecute,
|
|
14
|
+
* getCompletedPhases, markPhaseComplete).
|
|
15
|
+
*
|
|
16
|
+
* Graceful degradation (FR-8): parse failures return empty evidence
|
|
17
|
+
* array and log a warning. Evidence failures never block the merge.
|
|
18
|
+
*/
|
|
19
|
+
import type { IAgentExecutor } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
|
|
20
|
+
import type { FeatureAgentState } from '../state.js';
|
|
21
|
+
/**
|
|
22
|
+
* Factory that creates the evidence collection node function.
|
|
23
|
+
*
|
|
24
|
+
* @param executor - Agent executor for running the evidence capture prompt
|
|
25
|
+
* @returns A LangGraph node function
|
|
26
|
+
*/
|
|
27
|
+
export declare function createEvidenceNode(executor: IAgentExecutor): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
|
|
28
|
+
//# sourceMappingURL=evidence.node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAerD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,IAG3C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAsE7E"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Node — Agent-Directed Evidence Collection
|
|
3
|
+
*
|
|
4
|
+
* Captures visual and textual evidence (screenshots, test outputs,
|
|
5
|
+
* terminal recordings) proving that implemented tasks work as expected.
|
|
6
|
+
* Evidence files are committed to .shep/evidence/ on the feature branch
|
|
7
|
+
* and evidence records flow through graph state to the merge node for
|
|
8
|
+
* inclusion in the PR body.
|
|
9
|
+
*
|
|
10
|
+
* Uses a custom node pattern (not executeNode) because it needs a
|
|
11
|
+
* post-execution parsing step to extract Evidence[] from the agent's
|
|
12
|
+
* text output via parseEvidenceRecords. Reuses the same helpers as
|
|
13
|
+
* other nodes (createNodeLogger, buildExecutorOptions, retryExecute,
|
|
14
|
+
* getCompletedPhases, markPhaseComplete).
|
|
15
|
+
*
|
|
16
|
+
* Graceful degradation (FR-8): parse failures return empty evidence
|
|
17
|
+
* array and log a warning. Evidence failures never block the merge.
|
|
18
|
+
*/
|
|
19
|
+
import { isGraphBubbleUp } from '@langchain/langgraph';
|
|
20
|
+
import { createNodeLogger, getCompletedPhases, markPhaseComplete, retryExecute, buildExecutorOptions, } from './node-helpers.js';
|
|
21
|
+
import { reportNodeStart } from '../heartbeat.js';
|
|
22
|
+
import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
|
|
23
|
+
import { updateNodeLifecycle } from '../lifecycle-context.js';
|
|
24
|
+
import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
|
|
25
|
+
import { parseEvidenceRecords } from './evidence-output-parser.js';
|
|
26
|
+
import { hasSettings, getSettings } from '../../../settings.service.js';
|
|
27
|
+
/**
|
|
28
|
+
* Factory that creates the evidence collection node function.
|
|
29
|
+
*
|
|
30
|
+
* @param executor - Agent executor for running the evidence capture prompt
|
|
31
|
+
* @returns A LangGraph node function
|
|
32
|
+
*/
|
|
33
|
+
export function createEvidenceNode(executor) {
|
|
34
|
+
const log = createNodeLogger('evidence');
|
|
35
|
+
return async (state) => {
|
|
36
|
+
log.info('Starting evidence collection');
|
|
37
|
+
reportNodeStart('evidence');
|
|
38
|
+
await updateNodeLifecycle('evidence');
|
|
39
|
+
// --- Resume support: skip if already completed ---
|
|
40
|
+
const completedPhases = getCompletedPhases(state.specDir);
|
|
41
|
+
if (completedPhases.includes('evidence')) {
|
|
42
|
+
log.info('Evidence phase already completed, skipping execution');
|
|
43
|
+
return {
|
|
44
|
+
currentNode: 'evidence',
|
|
45
|
+
messages: ['[evidence] Already completed — skipping'],
|
|
46
|
+
_needsReexecution: false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const startTime = Date.now();
|
|
50
|
+
const timingId = await recordPhaseStart('evidence');
|
|
51
|
+
try {
|
|
52
|
+
const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
|
|
53
|
+
const prompt = buildEvidencePrompt(state, { commitEvidence });
|
|
54
|
+
const options = buildExecutorOptions(state);
|
|
55
|
+
log.info(`Executing agent at cwd=${options.cwd}`);
|
|
56
|
+
log.info(`Prompt length: ${prompt.length} chars`);
|
|
57
|
+
const result = await retryExecute(executor, prompt, options, { logger: log });
|
|
58
|
+
const durationMs = Date.now() - startTime;
|
|
59
|
+
const elapsed = (durationMs / 1000).toFixed(1);
|
|
60
|
+
log.info(`Agent complete (${result.result.length} chars, ${elapsed}s)`);
|
|
61
|
+
// --- Parse evidence records from agent output (graceful degradation) ---
|
|
62
|
+
let evidence;
|
|
63
|
+
try {
|
|
64
|
+
evidence = parseEvidenceRecords(result.result);
|
|
65
|
+
log.info(`Parsed ${evidence.length} evidence record(s)`);
|
|
66
|
+
}
|
|
67
|
+
catch (parseErr) {
|
|
68
|
+
const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
69
|
+
log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
|
|
70
|
+
evidence = [];
|
|
71
|
+
}
|
|
72
|
+
await recordPhaseEnd(timingId, durationMs);
|
|
73
|
+
markPhaseComplete(state.specDir, 'evidence', log);
|
|
74
|
+
return {
|
|
75
|
+
currentNode: 'evidence',
|
|
76
|
+
evidence,
|
|
77
|
+
messages: [
|
|
78
|
+
`[evidence] Complete — ${evidence.length} evidence record(s) captured (${elapsed}s)`,
|
|
79
|
+
...(evidence.length === 0
|
|
80
|
+
? ['[evidence] Warning: no evidence records parsed from agent output']
|
|
81
|
+
: []),
|
|
82
|
+
],
|
|
83
|
+
_needsReexecution: false,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// Re-throw LangGraph control-flow exceptions (interrupt, Command, etc.)
|
|
88
|
+
if (isGraphBubbleUp(err))
|
|
89
|
+
throw err;
|
|
90
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
91
|
+
const durationMs = Date.now() - startTime;
|
|
92
|
+
const elapsed = (durationMs / 1000).toFixed(1);
|
|
93
|
+
log.error(`Evidence collection failed: ${message} (${elapsed}s)`);
|
|
94
|
+
await recordPhaseEnd(timingId, durationMs);
|
|
95
|
+
throw new Error(`[evidence] ${message}`);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"fast-implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,IAGhD,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAmD7E"}
|
|
@@ -9,12 +9,17 @@
|
|
|
9
9
|
* Follows the same factory pattern as other nodes: takes executor
|
|
10
10
|
* dependency, returns async (state) => Partial<FeatureAgentState>.
|
|
11
11
|
*/
|
|
12
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
12
14
|
import { isGraphBubbleUp } from '@langchain/langgraph';
|
|
13
15
|
import { createNodeLogger, buildExecutorOptions, retryExecute } from './node-helpers.js';
|
|
14
16
|
import { reportNodeStart } from '../heartbeat.js';
|
|
15
17
|
import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
|
|
16
18
|
import { updateNodeLifecycle } from '../lifecycle-context.js';
|
|
17
19
|
import { buildFastImplementPrompt } from './prompts/fast-implement.prompt.js';
|
|
20
|
+
import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
|
|
21
|
+
import { parseEvidenceRecords } from './evidence-output-parser.js';
|
|
22
|
+
import { hasSettings, getSettings } from '../../../settings.service.js';
|
|
18
23
|
/**
|
|
19
24
|
* Factory that creates the fast-implement node function.
|
|
20
25
|
*
|
|
@@ -38,10 +43,20 @@ export function createFastImplementNode(executor) {
|
|
|
38
43
|
const durationMs = Date.now() - startTime;
|
|
39
44
|
const elapsed = (durationMs / 1000).toFixed(1);
|
|
40
45
|
log.info(`Complete (${result.result.length} chars, ${elapsed}s)`);
|
|
46
|
+
// --- Evidence sub-agent: capture proof of completion (settings-gated) ---
|
|
47
|
+
const evidenceEnabled = hasSettings() && getSettings().workflow.enableEvidence;
|
|
48
|
+
const evidence = evidenceEnabled ? await collectEvidence(executor, state, log) : [];
|
|
49
|
+
if (!evidenceEnabled) {
|
|
50
|
+
log.info('Evidence collection disabled via settings — skipping');
|
|
51
|
+
}
|
|
41
52
|
await recordPhaseEnd(timingId, durationMs);
|
|
42
53
|
return {
|
|
43
54
|
currentNode: 'fast-implement',
|
|
44
|
-
|
|
55
|
+
evidence,
|
|
56
|
+
messages: [
|
|
57
|
+
`[fast-implement] Complete (${result.result.length} chars, ${elapsed}s)`,
|
|
58
|
+
`[fast-implement] Evidence: ${evidence.length} record(s) captured`,
|
|
59
|
+
],
|
|
45
60
|
_needsReexecution: false,
|
|
46
61
|
};
|
|
47
62
|
}
|
|
@@ -58,3 +73,56 @@ export function createFastImplementNode(executor) {
|
|
|
58
73
|
}
|
|
59
74
|
};
|
|
60
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Sub-agent call to collect evidence after fast implementation completes.
|
|
78
|
+
* Graceful degradation: returns empty array on any failure so evidence
|
|
79
|
+
* collection never blocks the workflow.
|
|
80
|
+
*/
|
|
81
|
+
async function collectEvidence(executor, state, log) {
|
|
82
|
+
try {
|
|
83
|
+
log.info('Collecting evidence (sub-agent)');
|
|
84
|
+
const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
|
|
85
|
+
const prompt = buildEvidencePrompt(state, { commitEvidence });
|
|
86
|
+
const options = buildExecutorOptions(state);
|
|
87
|
+
const result = await retryExecute(executor, prompt, options, { logger: log });
|
|
88
|
+
try {
|
|
89
|
+
const evidence = parseEvidenceRecords(result.result);
|
|
90
|
+
log.info(`Parsed ${evidence.length} evidence record(s)`);
|
|
91
|
+
saveEvidenceManifest(state, evidence, log);
|
|
92
|
+
return evidence;
|
|
93
|
+
}
|
|
94
|
+
catch (parseErr) {
|
|
95
|
+
const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
96
|
+
log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
// Re-throw LangGraph control-flow exceptions
|
|
102
|
+
if (isGraphBubbleUp(err))
|
|
103
|
+
throw err;
|
|
104
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
105
|
+
log.error(`Evidence collection failed: ${msg} — continuing without evidence`);
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Save evidence manifest to the shep home evidence folder so the
|
|
111
|
+
* merge review UI can read it without accessing graph state.
|
|
112
|
+
*/
|
|
113
|
+
function saveEvidenceManifest(state, evidence, log) {
|
|
114
|
+
if (evidence.length === 0)
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
const cwd = state.worktreePath || state.repositoryPath;
|
|
118
|
+
const repoHashDir = dirname(dirname(cwd));
|
|
119
|
+
const evidenceDir = join(repoHashDir, 'evidence', state.featureId);
|
|
120
|
+
mkdirSync(evidenceDir, { recursive: true });
|
|
121
|
+
writeFileSync(join(evidenceDir, 'manifest.json'), JSON.stringify(evidence, null, 2), 'utf-8');
|
|
122
|
+
log.info(`Saved evidence manifest to ${evidenceDir}/manifest.json`);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
126
|
+
log.error(`Failed to save evidence manifest: ${msg}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAwErD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,IAG5C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAwL7E"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js
CHANGED
|
@@ -7,14 +7,17 @@
|
|
|
7
7
|
* feature.yaml between phases.
|
|
8
8
|
*/
|
|
9
9
|
import yaml from 'js-yaml';
|
|
10
|
-
import { writeFileSync } from 'node:fs';
|
|
11
|
-
import { join } from 'node:path';
|
|
10
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
11
|
+
import { join, dirname } from 'node:path';
|
|
12
12
|
import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
|
|
13
13
|
import { createNodeLogger, readSpecFile, buildExecutorOptions, shouldInterrupt, safeYamlLoad, retryExecute, getCompletedPhases, markPhaseComplete, } from './node-helpers.js';
|
|
14
14
|
import { reportNodeStart } from '../heartbeat.js';
|
|
15
15
|
import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, } from '../phase-timing-context.js';
|
|
16
16
|
import { updateNodeLifecycle } from '../lifecycle-context.js';
|
|
17
17
|
import { buildImplementPhasePrompt, } from './prompts/implement.prompt.js';
|
|
18
|
+
import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
|
|
19
|
+
import { parseEvidenceRecords } from './evidence-output-parser.js';
|
|
20
|
+
import { hasSettings, getSettings } from '../../../settings.service.js';
|
|
18
21
|
/**
|
|
19
22
|
* Update feature.yaml with current implementation progress.
|
|
20
23
|
* Silently no-ops if the file is missing or unparseable.
|
|
@@ -141,6 +144,13 @@ export function createImplementNode(executor) {
|
|
|
141
144
|
log.info(`All phases complete — ${completedTasks}/${totalTasks} tasks (${elapsed}s)`);
|
|
142
145
|
updateFeatureProgress(state.specDir, totalTasks, totalTasks, 'implementation-complete', null, log);
|
|
143
146
|
messages.push(`[implement] Complete: ${totalTasks} tasks across ${totalPhases} phases (${elapsed}s)`);
|
|
147
|
+
// --- Evidence sub-agent: capture proof of completion (settings-gated) ---
|
|
148
|
+
const evidenceEnabled = hasSettings() && getSettings().workflow.enableEvidence;
|
|
149
|
+
const evidence = evidenceEnabled ? await collectEvidence(executor, state, log) : [];
|
|
150
|
+
if (!evidenceEnabled) {
|
|
151
|
+
log.info('Evidence collection disabled via settings — skipping');
|
|
152
|
+
}
|
|
153
|
+
messages.push(`[implement] Evidence: ${evidence.length} record(s) captured`);
|
|
144
154
|
// Record top-level implement phase completion
|
|
145
155
|
await recordPhaseEnd(implementTimingId, Date.now() - startTime);
|
|
146
156
|
if (shouldInterrupt('implement', state.approvalGates)) {
|
|
@@ -151,7 +161,7 @@ export function createImplementNode(executor) {
|
|
|
151
161
|
message: `Implementation complete: ${totalTasks} tasks across ${totalPhases} phases. Approve to finish.`,
|
|
152
162
|
});
|
|
153
163
|
}
|
|
154
|
-
return { currentNode: 'implement', messages };
|
|
164
|
+
return { currentNode: 'implement', evidence, messages };
|
|
155
165
|
}
|
|
156
166
|
catch (err) {
|
|
157
167
|
if (isGraphBubbleUp(err))
|
|
@@ -168,3 +178,58 @@ export function createImplementNode(executor) {
|
|
|
168
178
|
}
|
|
169
179
|
};
|
|
170
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Sub-agent call to collect evidence after implementation completes.
|
|
183
|
+
* Graceful degradation: returns empty array on any failure so evidence
|
|
184
|
+
* collection never blocks the workflow.
|
|
185
|
+
*/
|
|
186
|
+
async function collectEvidence(executor, state, log) {
|
|
187
|
+
try {
|
|
188
|
+
log.info('Collecting evidence (sub-agent)');
|
|
189
|
+
const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
|
|
190
|
+
const prompt = buildEvidencePrompt(state, { commitEvidence });
|
|
191
|
+
const options = buildExecutorOptions(state);
|
|
192
|
+
const result = await retryExecute(executor, prompt, options, { logger: log });
|
|
193
|
+
try {
|
|
194
|
+
const evidence = parseEvidenceRecords(result.result);
|
|
195
|
+
log.info(`Parsed ${evidence.length} evidence record(s)`);
|
|
196
|
+
saveEvidenceManifest(state, evidence, log);
|
|
197
|
+
return evidence;
|
|
198
|
+
}
|
|
199
|
+
catch (parseErr) {
|
|
200
|
+
const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
201
|
+
log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
// Re-throw LangGraph control-flow exceptions
|
|
207
|
+
if (isGraphBubbleUp(err))
|
|
208
|
+
throw err;
|
|
209
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
210
|
+
log.error(`Evidence collection failed: ${msg} — continuing without evidence`);
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Save evidence manifest to the shep home evidence folder so the
|
|
216
|
+
* merge review UI can read it without accessing graph state.
|
|
217
|
+
*/
|
|
218
|
+
function saveEvidenceManifest(state, evidence, log) {
|
|
219
|
+
if (evidence.length === 0)
|
|
220
|
+
return;
|
|
221
|
+
try {
|
|
222
|
+
const cwd = state.worktreePath || state.repositoryPath;
|
|
223
|
+
// Worktree path: ~/.shep/repos/<hash>/wt/<slug>
|
|
224
|
+
// Evidence dir: ~/.shep/repos/<hash>/evidence/<featureId>/
|
|
225
|
+
const repoHashDir = dirname(dirname(cwd));
|
|
226
|
+
const evidenceDir = join(repoHashDir, 'evidence', state.featureId);
|
|
227
|
+
mkdirSync(evidenceDir, { recursive: true });
|
|
228
|
+
writeFileSync(join(evidenceDir, 'manifest.json'), JSON.stringify(evidence, null, 2), 'utf-8');
|
|
229
|
+
log.info(`Saved evidence manifest to ${evidenceDir}/manifest.json`);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
233
|
+
log.error(`Failed to save evidence manifest: ${msg}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAkBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAkBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAmR7E"}
|
|
@@ -82,6 +82,9 @@ export function createMergeNode(deps) {
|
|
|
82
82
|
let ciFixStatus = state.ciFixStatus ?? 'idle';
|
|
83
83
|
// --- Check for git remote (needed by both agent calls) ---
|
|
84
84
|
const remoteAvailable = await deps.hasRemote(cwd);
|
|
85
|
+
const repoUrl = remoteAvailable
|
|
86
|
+
? ((await deps.gitPrService.getRemoteUrl(cwd)) ?? undefined)
|
|
87
|
+
: undefined;
|
|
85
88
|
// --- Agent Call 1: Commit + Push + PR (skip on approval resume) ---
|
|
86
89
|
if (!isResumeAfterInterrupt) {
|
|
87
90
|
if (!remoteAvailable) {
|
|
@@ -89,7 +92,7 @@ export function createMergeNode(deps) {
|
|
|
89
92
|
}
|
|
90
93
|
const effectiveState = remoteAvailable ? state : { ...state, push: false, openPr: false };
|
|
91
94
|
log.info('Agent call 1: commit + push + PR');
|
|
92
|
-
const commitPushPrPrompt = buildCommitPushPrPrompt(effectiveState, branch, baseBranch);
|
|
95
|
+
const commitPushPrPrompt = buildCommitPushPrPrompt(effectiveState, branch, baseBranch, repoUrl);
|
|
93
96
|
const commitResult = await retryExecute(executor, commitPushPrPrompt, options, {
|
|
94
97
|
logger: log,
|
|
95
98
|
});
|
|
@@ -162,6 +165,7 @@ export function createMergeNode(deps) {
|
|
|
162
165
|
prUrl,
|
|
163
166
|
prNumber,
|
|
164
167
|
ciStatus,
|
|
168
|
+
evidence: state.evidence ?? [],
|
|
165
169
|
});
|
|
166
170
|
}
|
|
167
171
|
}
|