@shepai/cli 1.145.0 → 1.146.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/Feature.yaml +25 -0
- package/apis/json-schema/PullRequest.yaml +11 -0
- package/apis/json-schema/SdlcLifecycle.yaml +1 -0
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +5 -0
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.d.ts +79 -0
- package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.js +31 -0
- package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +5 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +10 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +10 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts +23 -0
- package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.js +84 -0
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +33 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +1 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +18 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts +13 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.js +30 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.js +23 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +23 -4
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +25 -0
- 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/feature-agent-graph.d.ts +85 -0
- 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-process.service.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +23 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +2 -0
- 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 +50 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +40 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.js +11 -9
- 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 +5 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +8 -6
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -9
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +8 -6
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.js +3 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.js +9 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +5 -0
- 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 +20 -0
- package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts +25 -0
- package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/git/git-fork.service.js +145 -0
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts +17 -3
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +98 -15
- package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/ui.command.js +2 -1
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +10 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/create-feature.js +8 -1
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +5 -3
- package/dist/src/presentation/web/app/build-graph-nodes.js +5 -3
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -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 +24 -7
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +12 -0
- 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 +35 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +7 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +5 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +12 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +1 -0
- package/dist/src/presentation/web/dev-server.js +2 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- 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/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
- 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 +36 -36
- 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 +36 -36
- 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 +26 -26
- 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 +28 -28
- 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 +36 -36
- 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 +36 -36
- 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 +26 -26
- 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 +26 -26
- 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.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 +3 -3
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- 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 +8 -8
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- 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]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- 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/[root-of-the-server]__0b150ddf._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- 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]__c094882b._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
- package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8fcc39d4._.js +3 -0
- package/web/.next/server/chunks/ssr/_8fcc39d4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_2a415784._.js → _f0507de3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2a415784._.js.map → _f0507de3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js → _f3428a54._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js.map → _f3428a54._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.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_3f392ed3._.js +3 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_721fb773._.js.map → src_presentation_web_3f392ed3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.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_e599bb8c._.js.map +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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +44 -44
- package/web/.next/static/chunks/{f2a6406394a41d3c.js → 00c975ddd2b87528.js} +1 -1
- package/web/.next/static/chunks/{74ee98538b63a4b2.css → 0b18c50740356276.css} +1 -1
- package/web/.next/static/chunks/{266fe61224d14058.js → 0ead3bd3449a6efe.js} +1 -1
- package/web/.next/static/chunks/{18c49ba954b15750.js → 5afa709c97ad44c3.js} +1 -1
- package/web/.next/static/chunks/{ed43f5ec24322234.js → 64a97bd60c175b9e.js} +1 -1
- package/web/.next/static/chunks/6dad9c4718b9ef1c.js +1 -0
- package/web/.next/static/chunks/{c0fd9ae3d7b3ebe3.js → 7558964bf146f27c.js} +1 -1
- package/web/.next/static/chunks/{7559d0ac9e155de8.js → 86bc398562d84b1d.js} +2 -2
- package/web/.next/static/chunks/{e2e3d8a7d339c110.js → 8ff013b5490a9111.js} +1 -1
- package/web/.next/static/chunks/{41667f7f505952e6.js → 96fb06a2ff46e152.js} +1 -1
- package/web/.next/static/chunks/b3ee28e6d690043f.js +2 -0
- package/web/.next/static/chunks/bb466ffb8a013811.js +1 -0
- package/web/.next/static/chunks/d8364c7cbc1a8432.js +1 -0
- package/web/.next/static/chunks/fa556c575c788679.js +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +0 -3
- package/web/.next/server/chunks/ssr/_a9f57758._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_721fb773._.js +0 -3
- package/web/.next/static/chunks/149c88eadafaf835.js +0 -1
- package/web/.next/static/chunks/37b065777853153c.js +0 -2
- package/web/.next/static/chunks/6a370f2709c81d83.js +0 -1
- package/web/.next/static/chunks/a6f8230f1756f318.js +0 -1
- package/web/.next/static/chunks/d1c52a649f1c7704.js +0 -1
- /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_buildManifest.js +0 -0
- /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Fork Service Implementation
|
|
3
|
+
*
|
|
4
|
+
* Manages GitHub fork operations: forking repos, pushing to forks,
|
|
5
|
+
* creating upstream PRs, and polling upstream PR status.
|
|
6
|
+
* Uses `gh` CLI for all GitHub API interactions.
|
|
7
|
+
*/
|
|
8
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
9
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
11
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
12
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
13
|
+
};
|
|
14
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
15
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
16
|
+
};
|
|
17
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
18
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
19
|
+
};
|
|
20
|
+
import { injectable, inject } from 'tsyringe';
|
|
21
|
+
import { GitForkError, GitForkErrorCode, } from '../../../application/ports/output/services/git-fork-service.interface.js';
|
|
22
|
+
import { PrStatus } from '../../../domain/generated/output.js';
|
|
23
|
+
let GitForkService = class GitForkService {
|
|
24
|
+
execFile;
|
|
25
|
+
constructor(execFile) {
|
|
26
|
+
this.execFile = execFile;
|
|
27
|
+
}
|
|
28
|
+
async forkRepository(cwd) {
|
|
29
|
+
// Check if origin is already a fork — if so, just ensure upstream remote exists
|
|
30
|
+
try {
|
|
31
|
+
const { stdout } = await this.execFile('gh', ['repo', 'view', '--json', 'isFork,parent'], {
|
|
32
|
+
cwd,
|
|
33
|
+
});
|
|
34
|
+
const repoInfo = JSON.parse(stdout);
|
|
35
|
+
if (repoInfo.isFork && repoInfo.parent) {
|
|
36
|
+
// Origin is already a fork — ensure upstream remote points to parent
|
|
37
|
+
const parentUrl = `https://github.com/${repoInfo.parent.owner.login}/${repoInfo.parent.name}.git`;
|
|
38
|
+
try {
|
|
39
|
+
await this.execFile('git', ['remote', 'add', 'upstream', parentUrl], { cwd });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Remote may already exist — update it
|
|
43
|
+
await this.execFile('git', ['remote', 'set-url', 'upstream', parentUrl], { cwd });
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// gh repo view failed — could be auth issue or not a GitHub repo
|
|
50
|
+
}
|
|
51
|
+
// Fork the repository: gh repo fork --remote remaps origin to fork, adds upstream
|
|
52
|
+
try {
|
|
53
|
+
await this.execFile('gh', ['repo', 'fork', '--remote', '--remote-name', 'origin'], { cwd });
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
57
|
+
if (message.includes('auth') || message.includes('login')) {
|
|
58
|
+
throw new GitForkError('GitHub authentication required to fork', GitForkErrorCode.AUTH_FAILURE, err instanceof Error ? err : undefined);
|
|
59
|
+
}
|
|
60
|
+
throw new GitForkError(`Failed to fork repository: ${message}`, GitForkErrorCode.FORK_FAILED, err instanceof Error ? err : undefined);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async pushToFork(cwd, branch) {
|
|
64
|
+
try {
|
|
65
|
+
await this.execFile('git', ['push', '-u', 'origin', branch], { cwd });
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
69
|
+
throw new GitForkError(`Failed to push to fork: ${message}`, GitForkErrorCode.PUSH_FAILED, err instanceof Error ? err : undefined);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async createUpstreamPr(cwd, title, body, head, base) {
|
|
73
|
+
try {
|
|
74
|
+
// Get the upstream repo identifier
|
|
75
|
+
const { stdout: upstreamUrl } = await this.execFile('git', ['remote', 'get-url', 'upstream'], { cwd });
|
|
76
|
+
const upstreamRepo = this.extractRepoFromUrl(upstreamUrl.trim());
|
|
77
|
+
// Get the fork owner for the head ref (owner:branch format)
|
|
78
|
+
const { stdout: forkUrl } = await this.execFile('git', ['remote', 'get-url', 'origin'], {
|
|
79
|
+
cwd,
|
|
80
|
+
});
|
|
81
|
+
const forkRepo = this.extractRepoFromUrl(forkUrl.trim());
|
|
82
|
+
const forkOwner = forkRepo.split('/')[0];
|
|
83
|
+
const { stdout } = await this.execFile('gh', [
|
|
84
|
+
'pr',
|
|
85
|
+
'create',
|
|
86
|
+
'--repo',
|
|
87
|
+
upstreamRepo,
|
|
88
|
+
'--title',
|
|
89
|
+
title,
|
|
90
|
+
'--body',
|
|
91
|
+
body,
|
|
92
|
+
'--head',
|
|
93
|
+
`${forkOwner}:${head}`,
|
|
94
|
+
'--base',
|
|
95
|
+
base,
|
|
96
|
+
'--json',
|
|
97
|
+
'url,number',
|
|
98
|
+
], { cwd });
|
|
99
|
+
const result = JSON.parse(stdout);
|
|
100
|
+
return { url: result.url, number: result.number };
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
104
|
+
throw new GitForkError(`Failed to create upstream PR: ${message}`, GitForkErrorCode.PR_CREATE_FAILED, err instanceof Error ? err : undefined);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async getUpstreamPrStatus(upstreamRepo, prNumber) {
|
|
108
|
+
try {
|
|
109
|
+
const { stdout } = await this.execFile('gh', ['pr', 'view', String(prNumber), '--repo', upstreamRepo, '--json', 'state'], {});
|
|
110
|
+
const result = JSON.parse(stdout);
|
|
111
|
+
const state = (result.state ?? '').toUpperCase();
|
|
112
|
+
if (state === 'MERGED')
|
|
113
|
+
return PrStatus.Merged;
|
|
114
|
+
if (state === 'CLOSED')
|
|
115
|
+
return PrStatus.Closed;
|
|
116
|
+
return PrStatus.Open;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
120
|
+
throw new GitForkError(`Failed to get upstream PR status: ${message}`, GitForkErrorCode.PR_STATUS_FAILED, err instanceof Error ? err : undefined);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Extract owner/repo from a git remote URL.
|
|
125
|
+
* Handles both HTTPS and SSH formats.
|
|
126
|
+
*/
|
|
127
|
+
extractRepoFromUrl(url) {
|
|
128
|
+
// SSH: git@github.com:owner/repo.git
|
|
129
|
+
const sshMatch = url.match(/git@[^:]+:([^/]+\/[^/.]+)/);
|
|
130
|
+
if (sshMatch)
|
|
131
|
+
return sshMatch[1];
|
|
132
|
+
// HTTPS: https://github.com/owner/repo.git
|
|
133
|
+
const httpsMatch = url.match(/github\.com\/([^/]+\/[^/.]+)/);
|
|
134
|
+
if (httpsMatch)
|
|
135
|
+
return httpsMatch[1];
|
|
136
|
+
// Strip .git suffix and return as-is
|
|
137
|
+
return url.replace(/\.git$/, '');
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
GitForkService = __decorate([
|
|
141
|
+
injectable(),
|
|
142
|
+
__param(0, inject('ExecFunction')),
|
|
143
|
+
__metadata("design:paramtypes", [Function])
|
|
144
|
+
], GitForkService);
|
|
145
|
+
export { GitForkService };
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* PR Sync Watcher Service
|
|
3
3
|
*
|
|
4
4
|
* Polls GitHub PR status and CI status for features in the Review lifecycle
|
|
5
|
-
* stage,
|
|
5
|
+
* stage, and upstream PR status for features in the AwaitingUpstream stage,
|
|
6
|
+
* updating feature records and emitting notifications when transitions
|
|
6
7
|
* are detected. Follows the NotificationWatcherService polling pattern.
|
|
7
8
|
*
|
|
8
9
|
* Maintains in-memory tracking of last-known PR and CI status per feature
|
|
@@ -13,12 +14,14 @@ import type { IFeatureRepository } from '../../../application/ports/output/repos
|
|
|
13
14
|
import type { IAgentRunRepository } from '../../../application/ports/output/agents/agent-run-repository.interface.js';
|
|
14
15
|
import type { IGitPrService } from '../../../application/ports/output/services/git-pr-service.interface.js';
|
|
15
16
|
import type { INotificationService } from '../../../application/ports/output/services/notification-service.interface.js';
|
|
17
|
+
import type { IGitForkService } from '../../../application/ports/output/services/git-fork-service.interface.js';
|
|
16
18
|
import type Database from 'better-sqlite3';
|
|
17
19
|
export declare class PrSyncWatcherService {
|
|
18
20
|
private readonly featureRepo;
|
|
19
21
|
private readonly agentRunRepo;
|
|
20
22
|
private readonly gitPrService;
|
|
21
23
|
private readonly notificationService;
|
|
24
|
+
private readonly gitForkService;
|
|
22
25
|
private readonly pollIntervalMs;
|
|
23
26
|
private readonly trackedFeatures;
|
|
24
27
|
private readonly skippedRepos;
|
|
@@ -27,7 +30,7 @@ export declare class PrSyncWatcherService {
|
|
|
27
30
|
private readonly processId;
|
|
28
31
|
private intervalId;
|
|
29
32
|
private pollCycle;
|
|
30
|
-
constructor(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null);
|
|
33
|
+
constructor(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null, gitForkService?: IGitForkService | null);
|
|
31
34
|
isRunning(): boolean;
|
|
32
35
|
start(): void;
|
|
33
36
|
stop(): void;
|
|
@@ -40,6 +43,17 @@ export declare class PrSyncWatcherService {
|
|
|
40
43
|
private handleRateLimitError;
|
|
41
44
|
private processRepository;
|
|
42
45
|
private processFeature;
|
|
46
|
+
/**
|
|
47
|
+
* Extract upstream repo (owner/name) from an upstream PR URL.
|
|
48
|
+
* Expected format: https://github.com/owner/repo/pull/123
|
|
49
|
+
*/
|
|
50
|
+
private extractUpstreamRepo;
|
|
51
|
+
/**
|
|
52
|
+
* Poll upstream PR status for a feature in AwaitingUpstream lifecycle.
|
|
53
|
+
* If the upstream PR is merged, transition to Maintain.
|
|
54
|
+
* If the upstream PR is closed, update upstreamPrStatus to Closed.
|
|
55
|
+
*/
|
|
56
|
+
private processAwaitingUpstreamFeature;
|
|
43
57
|
/** Mark associated agent run as completed so the UI reflects "done" state. */
|
|
44
58
|
private completeAgentRun;
|
|
45
59
|
private emitNotification;
|
|
@@ -50,7 +64,7 @@ export declare class PrSyncWatcherService {
|
|
|
50
64
|
*
|
|
51
65
|
* @throws Error if the watcher is already initialized
|
|
52
66
|
*/
|
|
53
|
-
export declare function initializePrSyncWatcher(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null): void;
|
|
67
|
+
export declare function initializePrSyncWatcher(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null, gitForkService?: IGitForkService | null): void;
|
|
54
68
|
/**
|
|
55
69
|
* Get the PR sync watcher singleton.
|
|
56
70
|
*
|
package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0EAA0E,CAAC;AAChH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW,EACnC,cAAc,GAAE,eAAe,GAAG,IAAW;IAY/C,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IAmDlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;IAkM5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;OAIG;YACW,8BAA8B;IA0F5C,8EAA8E;YAChE,gBAAgB;IAW9B,OAAO,CAAC,gBAAgB;CAoBzB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAC7B,cAAc,CAAC,EAAE,eAAe,GAAG,IAAI,GACtC,IAAI,CAcN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAQvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* PR Sync Watcher Service
|
|
3
3
|
*
|
|
4
4
|
* Polls GitHub PR status and CI status for features in the Review lifecycle
|
|
5
|
-
* stage,
|
|
5
|
+
* stage, and upstream PR status for features in the AwaitingUpstream stage,
|
|
6
|
+
* updating feature records and emitting notifications when transitions
|
|
6
7
|
* are detected. Follows the NotificationWatcherService polling pattern.
|
|
7
8
|
*
|
|
8
9
|
* Maintains in-memory tracking of last-known PR and CI status per feature
|
|
@@ -24,6 +25,7 @@ export class PrSyncWatcherService {
|
|
|
24
25
|
agentRunRepo;
|
|
25
26
|
gitPrService;
|
|
26
27
|
notificationService;
|
|
28
|
+
gitForkService;
|
|
27
29
|
pollIntervalMs;
|
|
28
30
|
trackedFeatures = new Map();
|
|
29
31
|
skippedRepos = new Set();
|
|
@@ -32,11 +34,12 @@ export class PrSyncWatcherService {
|
|
|
32
34
|
processId;
|
|
33
35
|
intervalId = null;
|
|
34
36
|
pollCycle = 0;
|
|
35
|
-
constructor(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, db = null) {
|
|
37
|
+
constructor(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, db = null, gitForkService = null) {
|
|
36
38
|
this.featureRepo = featureRepo;
|
|
37
39
|
this.agentRunRepo = agentRunRepo;
|
|
38
40
|
this.gitPrService = gitPrService;
|
|
39
41
|
this.notificationService = notificationService;
|
|
42
|
+
this.gitForkService = gitForkService;
|
|
40
43
|
this.pollIntervalMs = pollIntervalMs;
|
|
41
44
|
this.db = db;
|
|
42
45
|
this.processId = `${process.pid}-${Date.now()}`;
|
|
@@ -97,26 +100,32 @@ export class PrSyncWatcherService {
|
|
|
97
100
|
return; // another process holds the lock — skip this cycle
|
|
98
101
|
}
|
|
99
102
|
this.pollCycle++;
|
|
100
|
-
const
|
|
103
|
+
const allReviewFeatures = await this.featureRepo.list({ lifecycle: SdlcLifecycle.Review });
|
|
101
104
|
// Include features with a valid repositoryPath (with or without PR data)
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
this.trackedFeatures.clear();
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
// Group features by repositoryPath for batch queries
|
|
105
|
+
const reviewFeatures = allReviewFeatures.filter((f) => f.repositoryPath);
|
|
106
|
+
// Group Review features by repositoryPath for batch queries
|
|
108
107
|
const byRepo = new Map();
|
|
109
|
-
for (const feature of
|
|
108
|
+
for (const feature of reviewFeatures) {
|
|
110
109
|
const group = byRepo.get(feature.repositoryPath) ?? [];
|
|
111
110
|
group.push(feature);
|
|
112
111
|
byRepo.set(feature.repositoryPath, group);
|
|
113
112
|
}
|
|
114
|
-
// Process each repository
|
|
113
|
+
// Process each repository (Review features)
|
|
115
114
|
for (const [repoPath, repoFeatures] of byRepo) {
|
|
116
115
|
await this.processRepository(repoPath, repoFeatures);
|
|
117
116
|
}
|
|
118
|
-
//
|
|
119
|
-
const
|
|
117
|
+
// Process AwaitingUpstream features (poll upstream PR status individually)
|
|
118
|
+
const awaitingFeatures = await this.featureRepo.list({
|
|
119
|
+
lifecycle: SdlcLifecycle.AwaitingUpstream,
|
|
120
|
+
});
|
|
121
|
+
for (const feature of awaitingFeatures) {
|
|
122
|
+
await this.processAwaitingUpstreamFeature(feature);
|
|
123
|
+
}
|
|
124
|
+
// Prune features no longer in Review or AwaitingUpstream
|
|
125
|
+
const currentFeatureIds = new Set([
|
|
126
|
+
...reviewFeatures.map((f) => f.id),
|
|
127
|
+
...awaitingFeatures.map((f) => f.id),
|
|
128
|
+
]);
|
|
120
129
|
for (const trackedId of this.trackedFeatures.keys()) {
|
|
121
130
|
if (!currentFeatureIds.has(trackedId)) {
|
|
122
131
|
this.trackedFeatures.delete(trackedId);
|
|
@@ -319,6 +328,80 @@ export class PrSyncWatcherService {
|
|
|
319
328
|
tracked.unchangedCycles++;
|
|
320
329
|
}
|
|
321
330
|
}
|
|
331
|
+
/**
|
|
332
|
+
* Extract upstream repo (owner/name) from an upstream PR URL.
|
|
333
|
+
* Expected format: https://github.com/owner/repo/pull/123
|
|
334
|
+
*/
|
|
335
|
+
extractUpstreamRepo(upstreamPrUrl) {
|
|
336
|
+
const match = upstreamPrUrl.match(/github\.com\/([^/]+\/[^/]+)\/pull\//);
|
|
337
|
+
return match?.[1] ?? null;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Poll upstream PR status for a feature in AwaitingUpstream lifecycle.
|
|
341
|
+
* If the upstream PR is merged, transition to Maintain.
|
|
342
|
+
* If the upstream PR is closed, update upstreamPrStatus to Closed.
|
|
343
|
+
*/
|
|
344
|
+
async processAwaitingUpstreamFeature(feature) {
|
|
345
|
+
if (!this.gitForkService)
|
|
346
|
+
return;
|
|
347
|
+
if (!feature.pr?.upstreamPrUrl || !feature.pr?.upstreamPrNumber)
|
|
348
|
+
return;
|
|
349
|
+
// Check exponential backoff — skip features that haven't changed recently
|
|
350
|
+
if (!this.shouldPollFeature(feature.id)) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const upstreamRepo = this.extractUpstreamRepo(feature.pr.upstreamPrUrl);
|
|
354
|
+
if (!upstreamRepo) {
|
|
355
|
+
// eslint-disable-next-line no-console
|
|
356
|
+
console.warn(`${TAG} Could not extract upstream repo from URL: ${feature.pr.upstreamPrUrl}`);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
let upstreamStatus;
|
|
360
|
+
try {
|
|
361
|
+
upstreamStatus = await this.gitForkService.getUpstreamPrStatus(upstreamRepo, feature.pr.upstreamPrNumber);
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
365
|
+
// eslint-disable-next-line no-console
|
|
366
|
+
console.warn(`${TAG} getUpstreamPrStatus failed for "${feature.name}" (${upstreamRepo}#${feature.pr.upstreamPrNumber}): ${msg}`);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
// Initialize tracking if needed
|
|
370
|
+
const prevState = this.trackedFeatures.get(feature.id);
|
|
371
|
+
if (!prevState) {
|
|
372
|
+
this.trackedFeatures.set(feature.id, {
|
|
373
|
+
prStatus: feature.pr.upstreamPrStatus ?? PrStatus.Open,
|
|
374
|
+
ciStatus: undefined,
|
|
375
|
+
mergeable: undefined,
|
|
376
|
+
featureName: feature.name,
|
|
377
|
+
unchangedCycles: 0,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
const tracked = this.trackedFeatures.get(feature.id);
|
|
381
|
+
const previousStatus = tracked.prStatus;
|
|
382
|
+
if (upstreamStatus === previousStatus) {
|
|
383
|
+
tracked.unchangedCycles++;
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
// eslint-disable-next-line no-console
|
|
387
|
+
console.log(`${TAG} Upstream PR #${feature.pr.upstreamPrNumber} status changed: ${previousStatus} -> ${upstreamStatus} for "${feature.name}"`);
|
|
388
|
+
tracked.prStatus = upstreamStatus;
|
|
389
|
+
tracked.unchangedCycles = 0;
|
|
390
|
+
if (upstreamStatus === PrStatus.Merged) {
|
|
391
|
+
feature.lifecycle = SdlcLifecycle.Maintain;
|
|
392
|
+
feature.pr = { ...feature.pr, upstreamPrStatus: PrStatus.Merged };
|
|
393
|
+
feature.updatedAt = new Date();
|
|
394
|
+
await this.featureRepo.update(feature);
|
|
395
|
+
await this.completeAgentRun(feature);
|
|
396
|
+
this.emitNotification(NotificationEventType.PrMerged, feature.id, feature.agentRunId ?? '', feature.name, `Upstream PR #${feature.pr.upstreamPrNumber} merged for ${feature.name}`, NotificationSeverity.Success);
|
|
397
|
+
}
|
|
398
|
+
else if (upstreamStatus === PrStatus.Closed) {
|
|
399
|
+
feature.pr = { ...feature.pr, upstreamPrStatus: PrStatus.Closed };
|
|
400
|
+
feature.updatedAt = new Date();
|
|
401
|
+
await this.featureRepo.update(feature);
|
|
402
|
+
this.emitNotification(NotificationEventType.PrClosed, feature.id, feature.agentRunId ?? '', feature.name, `Upstream PR #${feature.pr.upstreamPrNumber} closed for ${feature.name}`, NotificationSeverity.Warning);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
322
405
|
/** Mark associated agent run as completed so the UI reflects "done" state. */
|
|
323
406
|
async completeAgentRun(feature) {
|
|
324
407
|
if (!feature.agentRunId)
|
|
@@ -353,11 +436,11 @@ let watcherInstance = null;
|
|
|
353
436
|
*
|
|
354
437
|
* @throws Error if the watcher is already initialized
|
|
355
438
|
*/
|
|
356
|
-
export function initializePrSyncWatcher(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db) {
|
|
439
|
+
export function initializePrSyncWatcher(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db, gitForkService) {
|
|
357
440
|
if (watcherInstance !== null) {
|
|
358
441
|
throw new Error('PR sync watcher already initialized. Cannot re-initialize.');
|
|
359
442
|
}
|
|
360
|
-
watcherInstance = new PrSyncWatcherService(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db ?? null);
|
|
443
|
+
watcherInstance = new PrSyncWatcherService(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db ?? null, gitForkService ?? null);
|
|
361
444
|
}
|
|
362
445
|
/**
|
|
363
446
|
* Get the PR sync watcher singleton.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAiC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA4FzC"}
|
|
@@ -67,8 +67,9 @@ Examples:
|
|
|
67
67
|
getNotificationWatcher().start();
|
|
68
68
|
// Start PR sync watcher to detect PR/CI status transitions on GitHub
|
|
69
69
|
const gitPrService = container.resolve('IGitPrService');
|
|
70
|
+
const gitForkService = container.resolve('IGitForkService');
|
|
70
71
|
const db = getExistingConnection();
|
|
71
|
-
initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db);
|
|
72
|
+
initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
|
|
72
73
|
getPrSyncWatcher().start();
|
|
73
74
|
const url = `http://localhost:${port}`;
|
|
74
75
|
messages.success(`Server ready at ${fmt.code(url)}`);
|
|
@@ -20,6 +20,16 @@ interface CreateFeatureInput {
|
|
|
20
20
|
fast?: boolean;
|
|
21
21
|
/** When true, create the feature in pending state (no agent spawned). */
|
|
22
22
|
pending?: boolean;
|
|
23
|
+
/** Fork repo and create PR to upstream at merge time. */
|
|
24
|
+
forkAndPr?: boolean;
|
|
25
|
+
/** Commit specs/evidences into the repo (default: true, auto-false when forkAndPr). */
|
|
26
|
+
commitSpecs?: boolean;
|
|
27
|
+
/** Enable CI watch/fix loop after push. */
|
|
28
|
+
ciWatchEnabled?: boolean;
|
|
29
|
+
/** Enable evidence collection after implementation. */
|
|
30
|
+
enableEvidence?: boolean;
|
|
31
|
+
/** Commit evidence to PR. */
|
|
32
|
+
commitEvidence?: boolean;
|
|
23
33
|
/** Optional agent type override for this feature run */
|
|
24
34
|
agentType?: string;
|
|
25
35
|
/** Optional model identifier for this feature run */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2FhD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { resolve } from '../../lib/server-container.js';
|
|
3
3
|
import { composeUserInput } from './compose-user-input.js';
|
|
4
4
|
export async function createFeature(input) {
|
|
5
|
-
const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, agentType, model, } = input;
|
|
5
|
+
const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, forkAndPr, commitSpecs, ciWatchEnabled, enableEvidence, commitEvidence, agentType, model, } = input;
|
|
6
6
|
if (!description?.trim()) {
|
|
7
7
|
return { error: 'description is required' };
|
|
8
8
|
}
|
|
@@ -28,6 +28,11 @@ export async function createFeature(input) {
|
|
|
28
28
|
description,
|
|
29
29
|
...(fast ? { fast } : {}),
|
|
30
30
|
...(pending ? { pending } : {}),
|
|
31
|
+
...(forkAndPr != null ? { forkAndPr } : {}),
|
|
32
|
+
...(commitSpecs != null ? { commitSpecs } : {}),
|
|
33
|
+
...(ciWatchEnabled != null ? { ciWatchEnabled } : {}),
|
|
34
|
+
...(enableEvidence != null ? { enableEvidence } : {}),
|
|
35
|
+
...(commitEvidence != null ? { commitEvidence } : {}),
|
|
31
36
|
...(agentType ? { agentType } : {}),
|
|
32
37
|
...(model ? { model } : {}),
|
|
33
38
|
});
|
|
@@ -43,6 +48,8 @@ export async function createFeature(input) {
|
|
|
43
48
|
...(parentId ? { parentId } : {}),
|
|
44
49
|
...(fast ? { fast } : {}),
|
|
45
50
|
...(pending ? { pending } : {}),
|
|
51
|
+
...(forkAndPr != null ? { forkAndPr } : {}),
|
|
52
|
+
...(commitSpecs != null ? { commitSpecs } : {}),
|
|
46
53
|
...(agentType ? { agentType } : {}),
|
|
47
54
|
...(model ? { model } : {}),
|
|
48
55
|
...(sessionId ? { sessionId } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAwEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA4R9C"}
|
|
@@ -36,6 +36,7 @@ const LIFECYCLE_TO_NODE = {
|
|
|
36
36
|
[SdlcLifecycle.Blocked]: 'blocked',
|
|
37
37
|
[SdlcLifecycle.Pending]: 'pending',
|
|
38
38
|
[SdlcLifecycle.Deleting]: 'blocked',
|
|
39
|
+
[SdlcLifecycle.AwaitingUpstream]: 'merge',
|
|
39
40
|
[SdlcLifecycle.Archived]: 'archived',
|
|
40
41
|
};
|
|
41
42
|
const STATUS_TO_EVENT = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,
|
|
1
|
+
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAsDjB"}
|
|
@@ -28,9 +28,11 @@ export function buildFeatureNodeData(feature, run, options) {
|
|
|
28
28
|
approvalGates: feature.approvalGates,
|
|
29
29
|
push: feature.push,
|
|
30
30
|
openPr: feature.openPr,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
forkAndPr: feature.forkAndPr,
|
|
32
|
+
commitSpecs: feature.commitSpecs,
|
|
33
|
+
enableEvidence: feature.enableEvidence ?? options?.enableEvidence ?? false,
|
|
34
|
+
commitEvidence: feature.commitEvidence ?? options?.commitEvidence ?? false,
|
|
35
|
+
ciWatchEnabled: feature.ciWatchEnabled ?? options?.ciWatchEnabled ?? true,
|
|
34
36
|
...(options?.hideCiStatus != null && { hideCiStatus: options.hideCiStatus }),
|
|
35
37
|
...(options?.repositoryName && { repositoryName: options.repositoryName }),
|
|
36
38
|
...(options?.baseBranch && { baseBranch: options.baseBranch }),
|
|
@@ -118,9 +118,11 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
|
|
|
118
118
|
approvalGates: feature.approvalGates,
|
|
119
119
|
push: feature.push,
|
|
120
120
|
openPr: feature.openPr,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
forkAndPr: feature.forkAndPr,
|
|
122
|
+
commitSpecs: feature.commitSpecs,
|
|
123
|
+
enableEvidence: feature.enableEvidence ?? options?.enableEvidence ?? false,
|
|
124
|
+
commitEvidence: feature.commitEvidence ?? options?.commitEvidence ?? false,
|
|
125
|
+
ciWatchEnabled: feature.ciWatchEnabled ?? options?.ciWatchEnabled ?? true,
|
|
124
126
|
...(repoName && { repositoryName: repoName }),
|
|
125
127
|
...(run?.agentType && { agentType: run.agentType }),
|
|
126
128
|
...(run?.modelId && { modelId: run.modelId }),
|
|
@@ -59,5 +59,5 @@ export function BaseDrawer({ open, onClose, modal = false, dismissOnOutsideClick
|
|
|
59
59
|
function DeployBar({ deployTarget }) {
|
|
60
60
|
const deployAction = useDeployAction(deployTarget);
|
|
61
61
|
const isDeploymentActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
|
|
62
|
-
return (_jsxs("div", { "data-testid": "base-drawer-deploy-bar", className: "flex items-center gap-2 px-4 pb-3", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: deployTarget.targetId })) : null] }));
|
|
62
|
+
return (_jsxs("div", { "data-testid": "base-drawer-deploy-bar", className: "flex items-center gap-2 px-4 pt-3 pb-3", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: deployTarget.targetId })) : null] }));
|
|
63
63
|
}
|
package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts
CHANGED
|
@@ -39,6 +39,10 @@ export interface FeatureCreatePayload {
|
|
|
39
39
|
fast: boolean;
|
|
40
40
|
/** When true, create the feature in pending state (no agent spawned). */
|
|
41
41
|
pending?: boolean;
|
|
42
|
+
/** Fork repo and create PR to upstream at merge time. */
|
|
43
|
+
forkAndPr: boolean;
|
|
44
|
+
/** Commit specs/evidences into the repo (defaults false when forkAndPr is enabled). */
|
|
45
|
+
commitSpecs: boolean;
|
|
42
46
|
/** Optional agent type override for this feature run */
|
|
43
47
|
agentType?: string;
|
|
44
48
|
/** Optional model override for this feature run */
|
|
@@ -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":"
|
|
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":"AA4BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAS5E,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,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,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,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IACrB,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,+EAA+E;IAC/E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GACnB,EAAE,wBAAwB,2CAk4B1B;AAmJD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,eAAe,EACf,QAAQ,GACT,EAAE,uBAAuB,2CAiNzB"}
|