@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
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Phase Prompt
|
|
3
|
+
*
|
|
4
|
+
* Instructs the agent to capture visual and textual evidence
|
|
5
|
+
* (screenshots, test outputs, terminal recordings) proving that
|
|
6
|
+
* completed tasks work as expected. Evidence files are saved to the
|
|
7
|
+
* shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
|
|
8
|
+
* is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
|
|
9
|
+
* in the worktree. The agent outputs a structured JSON manifest of
|
|
10
|
+
* evidence records that the evidence-output-parser extracts for the
|
|
11
|
+
* graph state.
|
|
12
|
+
*/
|
|
13
|
+
import type { FeatureAgentState } from '../../state.js';
|
|
14
|
+
export interface EvidencePromptOptions {
|
|
15
|
+
/** Whether to commit evidence to the worktree / feature branch */
|
|
16
|
+
commitEvidence: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function buildEvidencePrompt(state: FeatureAgentState, options?: EvidencePromptOptions): string;
|
|
19
|
+
//# sourceMappingURL=evidence-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA6LR"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Phase Prompt
|
|
3
|
+
*
|
|
4
|
+
* Instructs the agent to capture visual and textual evidence
|
|
5
|
+
* (screenshots, test outputs, terminal recordings) proving that
|
|
6
|
+
* completed tasks work as expected. Evidence files are saved to the
|
|
7
|
+
* shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
|
|
8
|
+
* is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
|
|
9
|
+
* in the worktree. The agent outputs a structured JSON manifest of
|
|
10
|
+
* evidence records that the evidence-output-parser extracts for the
|
|
11
|
+
* graph state.
|
|
12
|
+
*/
|
|
13
|
+
import { join, dirname, relative } from 'node:path';
|
|
14
|
+
import { readSpecFile, buildCommitPushBlock } from '../node-helpers.js';
|
|
15
|
+
export function buildEvidencePrompt(state, options = { commitEvidence: false }) {
|
|
16
|
+
const specContent = readSpecFile(state.specDir, 'spec.yaml');
|
|
17
|
+
const tasksContent = readSpecFile(state.specDir, 'tasks.yaml');
|
|
18
|
+
const cwd = state.worktreePath || state.repositoryPath;
|
|
19
|
+
// Derive the shep home evidence directory from the worktree path.
|
|
20
|
+
// Worktree path is: ~/.shep/repos/<hash>/wt/<slug>
|
|
21
|
+
// Evidence path is: ~/.shep/repos/<hash>/evidence/<featureId>/
|
|
22
|
+
const repoHashDir = dirname(dirname(cwd)); // go up from wt/<slug>
|
|
23
|
+
const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId);
|
|
24
|
+
const specSection = specContent
|
|
25
|
+
? `## Feature Specification (spec.yaml)
|
|
26
|
+
|
|
27
|
+
\`\`\`yaml
|
|
28
|
+
${specContent}
|
|
29
|
+
\`\`\`
|
|
30
|
+
`
|
|
31
|
+
: `## Feature Context
|
|
32
|
+
|
|
33
|
+
Feature ID: ${state.featureId}
|
|
34
|
+
`;
|
|
35
|
+
const tasksSection = tasksContent
|
|
36
|
+
? `## Task List (tasks.yaml)
|
|
37
|
+
|
|
38
|
+
\`\`\`yaml
|
|
39
|
+
${tasksContent}
|
|
40
|
+
\`\`\`
|
|
41
|
+
`
|
|
42
|
+
: '';
|
|
43
|
+
// Relative spec dir path from worktree root (e.g., "specs/057-sidenav-feature-toggle")
|
|
44
|
+
const relativeSpecDir = relative(cwd, state.specDir);
|
|
45
|
+
const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
|
|
46
|
+
const specEvidenceAbsPath = join(state.specDir, 'evidence');
|
|
47
|
+
const storageSection = options.commitEvidence
|
|
48
|
+
? `## Evidence Storage
|
|
49
|
+
|
|
50
|
+
Save all evidence files to BOTH locations:
|
|
51
|
+
|
|
52
|
+
1. **Shep home folder** (persistent local storage):
|
|
53
|
+
\`mkdir -p ${shepEvidenceDir}/\`
|
|
54
|
+
Save each file here first.
|
|
55
|
+
|
|
56
|
+
2. **Spec folder** (for PR commit):
|
|
57
|
+
\`mkdir -p ${specEvidenceAbsPath}/\`
|
|
58
|
+
Copy each file here too.
|
|
59
|
+
|
|
60
|
+
3. Use descriptive file names (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
|
|
61
|
+
4. In the output JSON, use relative paths from the repo root (e.g., \`${specEvidenceRelPath}/homepage-screenshot.png\`)`
|
|
62
|
+
: `## Evidence Storage
|
|
63
|
+
|
|
64
|
+
Save all evidence files to the shep home folder:
|
|
65
|
+
|
|
66
|
+
1. Create the directory if it does not exist: \`mkdir -p ${shepEvidenceDir}/\`
|
|
67
|
+
2. Save each evidence file with a descriptive name (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
|
|
68
|
+
3. In the output JSON, set relativePath to the absolute path in the shep home folder (e.g., \`${shepEvidenceDir}/homepage-screenshot.png\`)`;
|
|
69
|
+
const commitSection = options.commitEvidence
|
|
70
|
+
? `\n${buildCommitPushBlock({
|
|
71
|
+
push: state.push,
|
|
72
|
+
files: [`${specEvidenceRelPath}/`],
|
|
73
|
+
commitHint: 'chore(agents): capture evidence for completed tasks',
|
|
74
|
+
})}`
|
|
75
|
+
: `\n## Git Operations
|
|
76
|
+
|
|
77
|
+
Do NOT commit or push any files. Evidence is stored locally only.`;
|
|
78
|
+
return `You are a senior software engineer performing the EVIDENCE COLLECTION phase of feature development.
|
|
79
|
+
|
|
80
|
+
Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${options.commitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
|
|
81
|
+
|
|
82
|
+
${specSection}
|
|
83
|
+
${tasksSection}
|
|
84
|
+
## Working Directory
|
|
85
|
+
|
|
86
|
+
${cwd}
|
|
87
|
+
|
|
88
|
+
## Evidence Capture Instructions
|
|
89
|
+
|
|
90
|
+
Review the completed tasks above and capture evidence for each.
|
|
91
|
+
|
|
92
|
+
### MANDATORY Screenshot Rule
|
|
93
|
+
|
|
94
|
+
**If ANY task touches UI code (components, pages, views, styles, layouts, templates, JSX/TSX, HTML, CSS), you MUST capture at least one Screenshot.** This is non-negotiable. Changing a heading, button label, color, layout, or any visible element requires a screenshot proving the change renders correctly.
|
|
95
|
+
|
|
96
|
+
To capture screenshots:
|
|
97
|
+
1. Install Playwright if not already available: \`npx playwright install chromium --with-deps 2>/dev/null || npx playwright install chromium\`
|
|
98
|
+
2. Start the dev server in the background (e.g., \`npm run dev &\` or \`pnpm dev &\`)
|
|
99
|
+
3. Wait for the server to be ready
|
|
100
|
+
4. Use a Playwright script to navigate and screenshot:
|
|
101
|
+
\`\`\`bash
|
|
102
|
+
node -e "
|
|
103
|
+
const { chromium } = require('playwright');
|
|
104
|
+
(async () => {
|
|
105
|
+
const browser = await chromium.launch();
|
|
106
|
+
const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
|
|
107
|
+
await page.goto('http://localhost:PORT');
|
|
108
|
+
await page.waitForLoadState('networkidle');
|
|
109
|
+
await page.screenshot({ path: 'SCREENSHOT_PATH' });
|
|
110
|
+
await browser.close();
|
|
111
|
+
})();
|
|
112
|
+
"
|
|
113
|
+
\`\`\`
|
|
114
|
+
5. Stop the dev server after capturing
|
|
115
|
+
|
|
116
|
+
If Playwright installation fails, try alternative approaches (e.g., \`npx puppeteer\`, \`curl\` for API responses). Only skip screenshots if ALL browser automation approaches fail — and in that case, explicitly note the failure reason in the evidence description.
|
|
117
|
+
|
|
118
|
+
### Evidence by Task Type
|
|
119
|
+
|
|
120
|
+
- **UI/Web tasks**: You MUST take screenshots (see mandatory rule above). Also run and capture test output.
|
|
121
|
+
- **Backend/API tasks**: Run the relevant test suite and capture test output showing passing tests.
|
|
122
|
+
- **CLI tasks**: Run the CLI commands and capture terminal output demonstrating correct behavior.
|
|
123
|
+
- **Refactoring/Infrastructure tasks**: Capture test output or build output confirming no regressions.
|
|
124
|
+
|
|
125
|
+
### Evidence Types
|
|
126
|
+
|
|
127
|
+
- **Screenshot** — Visual proof of UI or output state (PNG/JPEG). **Required for any UI change.**
|
|
128
|
+
- **Video** — Screen recording of a workflow or interaction (MP4/WebM)
|
|
129
|
+
- **TestOutput** — Test suite execution results (TXT)
|
|
130
|
+
- **TerminalRecording** — CLI command output capture (TXT)
|
|
131
|
+
|
|
132
|
+
### Minimum Evidence Requirements
|
|
133
|
+
|
|
134
|
+
Your output MUST include:
|
|
135
|
+
1. At least one **Screenshot** if any task modifies UI/visual code (components, styles, templates, markup)
|
|
136
|
+
2. At least one **TestOutput** if the project has a test suite
|
|
137
|
+
3. Do NOT output only TestOutput/TerminalRecording when the feature involves visible UI changes — screenshots are mandatory in that case
|
|
138
|
+
|
|
139
|
+
${storageSection}
|
|
140
|
+
|
|
141
|
+
## File Size Constraints
|
|
142
|
+
|
|
143
|
+
- Capture screenshots at standard resolution (1280x720 or similar) — do NOT use 4K or retina resolution
|
|
144
|
+
- Compress images where possible (use PNG for screenshots, JPEG for photos)
|
|
145
|
+
- Truncate test output and terminal recordings to the first 500 lines to avoid large files
|
|
146
|
+
- Keep individual evidence files under 500KB where possible
|
|
147
|
+
|
|
148
|
+
## Sensitive Data Redaction
|
|
149
|
+
|
|
150
|
+
- Redact any API keys, tokens, passwords, or secrets visible in screenshots or terminal output
|
|
151
|
+
- Do NOT capture screenshots of authentication screens or settings pages showing sensitive credentials
|
|
152
|
+
- Strip environment variables containing sensitive values from test output before saving
|
|
153
|
+
|
|
154
|
+
## Output Format
|
|
155
|
+
|
|
156
|
+
After capturing all evidence, output a JSON array of evidence records in a fenced code block. This is CRITICAL — the system parses this block to extract evidence metadata.
|
|
157
|
+
|
|
158
|
+
\`\`\`json
|
|
159
|
+
[
|
|
160
|
+
{
|
|
161
|
+
"type": "Screenshot",
|
|
162
|
+
"capturedAt": "2026-01-01T12:00:00Z",
|
|
163
|
+
"description": "Homepage showing new feature banner",
|
|
164
|
+
"relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
|
|
165
|
+
"taskRef": "task-1"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"type": "TestOutput",
|
|
169
|
+
"capturedAt": "2026-01-01T12:01:00Z",
|
|
170
|
+
"description": "Unit test results — all 42 tests passing",
|
|
171
|
+
"relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
|
|
172
|
+
"taskRef": "task-2"
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
\`\`\`
|
|
176
|
+
|
|
177
|
+
Each evidence record must have:
|
|
178
|
+
- **type**: One of Screenshot, Video, TestOutput, TerminalRecording
|
|
179
|
+
- **capturedAt**: ISO 8601 timestamp of when the evidence was captured
|
|
180
|
+
- **description**: Human-readable description of what this evidence proves
|
|
181
|
+
- **relativePath**: ${options.commitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
|
|
182
|
+
- **taskRef**: (optional) Reference to the task ID this evidence proves
|
|
183
|
+
|
|
184
|
+
If no evidence can be captured (e.g., no UI to screenshot, no tests to run), output an empty JSON array:
|
|
185
|
+
|
|
186
|
+
\`\`\`json
|
|
187
|
+
[]
|
|
188
|
+
\`\`\`
|
|
189
|
+
|
|
190
|
+
## Constraints
|
|
191
|
+
|
|
192
|
+
- Capture evidence for completed tasks only — do NOT modify any implementation code
|
|
193
|
+
- Capture evidence that proves the feature works — prioritize screenshots for UI changes, test output for logic changes
|
|
194
|
+
- If a screenshot capture fails, document the failure reason in the evidence description and try alternative approaches before giving up
|
|
195
|
+
- Do NOT capture evidence for documentation-only changes or spec files
|
|
196
|
+
${commitSection}`;
|
|
197
|
+
}
|
|
@@ -5,14 +5,30 @@
|
|
|
5
5
|
* 1. buildCommitPushPrPrompt — commit (always), push (conditional), PR create (conditional)
|
|
6
6
|
* 2. buildMergeSquashPrompt — merge/squash PR or branch
|
|
7
7
|
*/
|
|
8
|
+
import { type Evidence } from '../../../../../../domain/generated/output.js';
|
|
8
9
|
import type { FeatureAgentState } from '../../state.js';
|
|
10
|
+
/**
|
|
11
|
+
* Parse a GitHub remote URL (HTTPS or SSH) into owner/repo.
|
|
12
|
+
* Returns null if the URL does not match a known GitHub format.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseGitHubOwnerRepo(remoteUrl: string): {
|
|
15
|
+
owner: string;
|
|
16
|
+
repo: string;
|
|
17
|
+
} | null;
|
|
18
|
+
/**
|
|
19
|
+
* Build a markdown evidence section from evidence records.
|
|
20
|
+
* Returns empty string when no evidence is available.
|
|
21
|
+
* When branch and repoUrl are provided, image paths are converted to
|
|
22
|
+
* absolute raw.githubusercontent.com URLs for correct rendering in PR bodies.
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatEvidenceSection(evidence: Evidence[], branch?: string, repoUrl?: string): string;
|
|
9
25
|
/**
|
|
10
26
|
* Build a prompt for the commit + push + PR agent call.
|
|
11
27
|
*
|
|
12
28
|
* The agent always commits. Push and PR creation are conditional based
|
|
13
29
|
* on state.push and state.openPr flags.
|
|
14
30
|
*/
|
|
15
|
-
export declare function buildCommitPushPrPrompt(state: FeatureAgentState, branch: string, baseBranch: string): string;
|
|
31
|
+
export declare function buildCommitPushPrPrompt(state: FeatureAgentState, branch: string, baseBranch: string, repoUrl?: string): string;
|
|
16
32
|
/**
|
|
17
33
|
* Build a prompt for the CI watch/fix agent call.
|
|
18
34
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwCxD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAU9F;AAuCD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAUR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAmER;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,UAAQ,GAChB,MAAM,CAkER"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* 2. buildMergeSquashPrompt — merge/squash PR or branch
|
|
7
7
|
*/
|
|
8
8
|
import yaml from 'js-yaml';
|
|
9
|
+
import { EvidenceType } from '../../../../../../domain/generated/output.js';
|
|
9
10
|
import { readSpecFile } from '../node-helpers.js';
|
|
10
11
|
/**
|
|
11
12
|
* Extract merge-phase rejection feedback from spec.yaml.
|
|
@@ -42,17 +43,86 @@ ${olderSection}
|
|
|
42
43
|
}
|
|
43
44
|
return '';
|
|
44
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a GitHub remote URL (HTTPS or SSH) into owner/repo.
|
|
48
|
+
* Returns null if the URL does not match a known GitHub format.
|
|
49
|
+
*/
|
|
50
|
+
export function parseGitHubOwnerRepo(remoteUrl) {
|
|
51
|
+
// HTTPS: https://github.com/owner/repo.git or https://github.com/owner/repo
|
|
52
|
+
const httpsMatch = remoteUrl.match(/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/);
|
|
53
|
+
if (httpsMatch)
|
|
54
|
+
return { owner: httpsMatch[1], repo: httpsMatch[2] };
|
|
55
|
+
// SSH: git@github.com:owner/repo.git or git@github.com:owner/repo
|
|
56
|
+
const sshMatch = remoteUrl.match(/github\.com:([^/]+)\/([^/.]+?)(?:\.git)?$/);
|
|
57
|
+
if (sshMatch)
|
|
58
|
+
return { owner: sshMatch[1], repo: sshMatch[2] };
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Convert a relative evidence path to an absolute GitHub raw URL.
|
|
63
|
+
* Falls back to the relative path if repoUrl is unavailable or not a GitHub repo.
|
|
64
|
+
*/
|
|
65
|
+
function toGitHubRawUrl(relativePath, branch, repoUrl) {
|
|
66
|
+
if (!repoUrl || !branch)
|
|
67
|
+
return relativePath;
|
|
68
|
+
const parsed = parseGitHubOwnerRepo(repoUrl);
|
|
69
|
+
if (!parsed)
|
|
70
|
+
return relativePath;
|
|
71
|
+
return `https://raw.githubusercontent.com/${parsed.owner}/${parsed.repo}/${branch}/${relativePath}`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Format a single evidence record as GitHub-compatible markdown.
|
|
75
|
+
* When repoUrl and branch are provided, converts relative paths to
|
|
76
|
+
* absolute raw.githubusercontent.com URLs so images render in PR bodies.
|
|
77
|
+
*/
|
|
78
|
+
function formatEvidenceItem(e, branch, repoUrl) {
|
|
79
|
+
const taskLine = e.taskRef ? ` (${e.taskRef})` : '';
|
|
80
|
+
const url = toGitHubRawUrl(e.relativePath, branch, repoUrl);
|
|
81
|
+
switch (e.type) {
|
|
82
|
+
case EvidenceType.Screenshot:
|
|
83
|
+
return `- **${e.description}**${taskLine}\n `;
|
|
84
|
+
case EvidenceType.TestOutput:
|
|
85
|
+
return `- **${e.description}**${taskLine}\n See: \`${e.relativePath}\``;
|
|
86
|
+
case EvidenceType.Video:
|
|
87
|
+
return `- [${e.description}](${url})${taskLine}`;
|
|
88
|
+
case EvidenceType.TerminalRecording:
|
|
89
|
+
return `- [${e.description}](${url})${taskLine}`;
|
|
90
|
+
default:
|
|
91
|
+
return `- [${e.description}](${url})${taskLine}`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build a markdown evidence section from evidence records.
|
|
96
|
+
* Returns empty string when no evidence is available.
|
|
97
|
+
* When branch and repoUrl are provided, image paths are converted to
|
|
98
|
+
* absolute raw.githubusercontent.com URLs for correct rendering in PR bodies.
|
|
99
|
+
*/
|
|
100
|
+
export function formatEvidenceSection(evidence, branch, repoUrl) {
|
|
101
|
+
if (!evidence || evidence.length === 0)
|
|
102
|
+
return '';
|
|
103
|
+
const items = evidence.map((e) => formatEvidenceItem(e, branch, repoUrl)).join('\n');
|
|
104
|
+
return `\n## Evidence
|
|
105
|
+
|
|
106
|
+
The following evidence was captured to prove task completion. Include this section in the PR body:
|
|
107
|
+
|
|
108
|
+
${items}
|
|
109
|
+
`;
|
|
110
|
+
}
|
|
45
111
|
/**
|
|
46
112
|
* Build a prompt for the commit + push + PR agent call.
|
|
47
113
|
*
|
|
48
114
|
* The agent always commits. Push and PR creation are conditional based
|
|
49
115
|
* on state.push and state.openPr flags.
|
|
50
116
|
*/
|
|
51
|
-
export function buildCommitPushPrPrompt(state, branch, baseBranch) {
|
|
117
|
+
export function buildCommitPushPrPrompt(state, branch, baseBranch, repoUrl) {
|
|
52
118
|
const specContent = readSpecFile(state.specDir, 'spec.yaml');
|
|
53
119
|
const cwd = state.worktreePath || state.repositoryPath;
|
|
54
120
|
const shouldPush = state.push || state.openPr;
|
|
55
121
|
const rejectionSection = getMergeRejectionFeedback(specContent);
|
|
122
|
+
// Only include evidence in the PR body when commitEvidence is enabled
|
|
123
|
+
const evidenceSection = state.evidence?.length
|
|
124
|
+
? formatEvidenceSection(state.evidence, branch, repoUrl)
|
|
125
|
+
: '';
|
|
56
126
|
const steps = [];
|
|
57
127
|
// Step 1: Commit (always)
|
|
58
128
|
steps.push(`1. Review the current changes using \`git diff\` and \`git status\`
|
|
@@ -98,7 +168,7 @@ ${cwd}
|
|
|
98
168
|
## Instructions
|
|
99
169
|
|
|
100
170
|
${steps.join('\n')}
|
|
101
|
-
|
|
171
|
+
${evidenceSection}
|
|
102
172
|
## Constraints
|
|
103
173
|
|
|
104
174
|
- Write a meaningful conventional commit message derived from the actual diff — do NOT use generic messages
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApprovalGates, CiFixRecord } from '../../../../domain/generated/output.js';
|
|
1
|
+
import type { ApprovalGates, CiFixRecord, Evidence } from '../../../../domain/generated/output.js';
|
|
2
2
|
/**
|
|
3
3
|
* State annotation for the feature-agent graph.
|
|
4
4
|
*
|
|
@@ -48,6 +48,7 @@ export declare const FeatureAgentAnnotation: import("@langchain/langgraph").Anno
|
|
|
48
48
|
ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
|
|
49
49
|
push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
50
50
|
openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
|
|
51
|
+
evidence: import("@langchain/langgraph").BinaryOperatorAggregate<Evidence[], Evidence[]>;
|
|
51
52
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
52
53
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<CiFixRecord[], CiFixRecord[]>;
|
|
53
54
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FjC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC"}
|
|
@@ -79,6 +79,11 @@ export const FeatureAgentAnnotation = Annotation.Root({
|
|
|
79
79
|
reducer: (_prev, next) => next,
|
|
80
80
|
default: () => false,
|
|
81
81
|
}),
|
|
82
|
+
// --- Evidence state ---
|
|
83
|
+
evidence: Annotation({
|
|
84
|
+
reducer: (prev, next) => [...prev, ...next],
|
|
85
|
+
default: () => [],
|
|
86
|
+
}),
|
|
82
87
|
// --- CI watch/fix loop state ---
|
|
83
88
|
ciFixAttempts: Annotation({
|
|
84
89
|
reducer: (_prev, next) => next,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAG9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgF7F"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
'use server';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
2
4
|
import { resolve } from '../../lib/server-container.js';
|
|
3
5
|
import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
|
|
4
6
|
export async function getMergeReviewData(featureId) {
|
|
@@ -25,8 +27,33 @@ export async function getMergeReviewData(featureId) {
|
|
|
25
27
|
(feature.repositoryPath && feature.branch
|
|
26
28
|
? computeWorktreePath(feature.repositoryPath, feature.branch)
|
|
27
29
|
: null);
|
|
30
|
+
// Load evidence manifest (best-effort)
|
|
31
|
+
let evidence;
|
|
32
|
+
let evidenceBasePath;
|
|
33
|
+
if (worktreePath) {
|
|
34
|
+
try {
|
|
35
|
+
// Worktree path: ~/.shep/repos/<hash>/wt/<slug>
|
|
36
|
+
// Evidence manifest: ~/.shep/repos/<hash>/evidence/<featureId>/manifest.json
|
|
37
|
+
const repoHashDir = dirname(dirname(worktreePath));
|
|
38
|
+
const evidenceDir = join(repoHashDir, 'evidence', featureId);
|
|
39
|
+
const manifestPath = join(evidenceDir, 'manifest.json');
|
|
40
|
+
if (existsSync(manifestPath)) {
|
|
41
|
+
evidence = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
42
|
+
evidenceBasePath = worktreePath;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Evidence unavailable — not critical
|
|
47
|
+
}
|
|
48
|
+
}
|
|
28
49
|
if (!worktreePath) {
|
|
29
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
pr,
|
|
52
|
+
branch,
|
|
53
|
+
evidence,
|
|
54
|
+
evidenceBasePath,
|
|
55
|
+
warning: pr ? undefined : 'No PR or diff data available',
|
|
56
|
+
};
|
|
30
57
|
}
|
|
31
58
|
try {
|
|
32
59
|
const gitPrService = resolve('IGitPrService');
|
|
@@ -34,10 +61,16 @@ export async function getMergeReviewData(featureId) {
|
|
|
34
61
|
gitPrService.getPrDiffSummary(worktreePath, 'main'),
|
|
35
62
|
gitPrService.getFileDiffs(worktreePath, 'main').catch(() => undefined),
|
|
36
63
|
]);
|
|
37
|
-
return { pr, branch, diffSummary, fileDiffs };
|
|
64
|
+
return { pr, branch, diffSummary, fileDiffs, evidence, evidenceBasePath };
|
|
38
65
|
}
|
|
39
66
|
catch {
|
|
40
|
-
return {
|
|
67
|
+
return {
|
|
68
|
+
pr,
|
|
69
|
+
branch,
|
|
70
|
+
evidence,
|
|
71
|
+
evidenceBasePath,
|
|
72
|
+
warning: 'Diff statistics unavailable',
|
|
73
|
+
};
|
|
41
74
|
}
|
|
42
75
|
}
|
|
43
76
|
catch (error) {
|
|
@@ -6,6 +6,8 @@ export interface WorkflowDefaults {
|
|
|
6
6
|
};
|
|
7
7
|
push: boolean;
|
|
8
8
|
openPr: boolean;
|
|
9
|
+
enableEvidence: boolean;
|
|
10
|
+
commitEvidence: boolean;
|
|
9
11
|
}
|
|
10
12
|
export declare function getWorkflowDefaults(): Promise<WorkflowDefaults>;
|
|
11
13
|
//# sourceMappingURL=get-workflow-defaults.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAerE"}
|
|
@@ -11,5 +11,7 @@ export async function getWorkflowDefaults() {
|
|
|
11
11
|
},
|
|
12
12
|
push: workflow.approvalGateDefaults.pushOnImplementationComplete,
|
|
13
13
|
openPr: workflow.openPrOnImplementationComplete,
|
|
14
|
+
enableEvidence: workflow.enableEvidence,
|
|
15
|
+
commitEvidence: workflow.commitEvidence,
|
|
14
16
|
};
|
|
15
17
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NextRequest } from 'next/server';
|
|
2
|
+
import { NextResponse } from 'next/server';
|
|
3
|
+
/**
|
|
4
|
+
* Serves evidence files from ~/.shep/repos/ directories.
|
|
5
|
+
* Security: only paths within SHEP_HOME/repos/ are allowed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function GET(request: NextRequest): Promise<NextResponse>;
|
|
8
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/evidence/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB3C;;;GAGG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA6BrE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { readFile, stat } from 'fs/promises';
|
|
3
|
+
import { extname, resolve } from 'path';
|
|
4
|
+
import { getShepHomeDir } from '../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
|
|
5
|
+
const MIME_MAP = {
|
|
6
|
+
'.png': 'image/png',
|
|
7
|
+
'.jpg': 'image/jpeg',
|
|
8
|
+
'.jpeg': 'image/jpeg',
|
|
9
|
+
'.gif': 'image/gif',
|
|
10
|
+
'.webp': 'image/webp',
|
|
11
|
+
'.svg': 'image/svg+xml',
|
|
12
|
+
'.bmp': 'image/bmp',
|
|
13
|
+
'.mp4': 'video/mp4',
|
|
14
|
+
'.webm': 'video/webm',
|
|
15
|
+
'.mov': 'video/quicktime',
|
|
16
|
+
'.txt': 'text/plain',
|
|
17
|
+
'.log': 'text/plain',
|
|
18
|
+
'.json': 'application/json',
|
|
19
|
+
'.cast': 'application/json',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Serves evidence files from ~/.shep/repos/ directories.
|
|
23
|
+
* Security: only paths within SHEP_HOME/repos/ are allowed.
|
|
24
|
+
*/
|
|
25
|
+
export async function GET(request) {
|
|
26
|
+
const path = request.nextUrl.searchParams.get('path');
|
|
27
|
+
if (!path) {
|
|
28
|
+
return NextResponse.json({ error: 'Missing path parameter' }, { status: 400 });
|
|
29
|
+
}
|
|
30
|
+
const resolved = resolve(path);
|
|
31
|
+
const reposRoot = resolve(getShepHomeDir(), 'repos');
|
|
32
|
+
if (!resolved.startsWith(reposRoot)) {
|
|
33
|
+
return NextResponse.json({ error: 'Access denied' }, { status: 403 });
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
await stat(resolved);
|
|
37
|
+
const buffer = await readFile(resolved);
|
|
38
|
+
const ext = extname(resolved).toLowerCase();
|
|
39
|
+
const contentType = MIME_MAP[ext] ?? 'application/octet-stream';
|
|
40
|
+
return new NextResponse(buffer, {
|
|
41
|
+
headers: {
|
|
42
|
+
'Content-Type': contentType,
|
|
43
|
+
'Cache-Control': 'private, max-age=3600',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return NextResponse.json({ error: 'File not found' }, { status: 404 });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CA8rB1B"}
|