@shepai/cli 1.116.3 → 1.117.0-pr376.0b9d7e1
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/AnalyzeRepoTimeouts.yaml +10 -0
- package/apis/json-schema/EnvironmentConfig.yaml +5 -0
- package/apis/json-schema/SdlcLifecycle.yaml +1 -0
- package/apis/json-schema/StageTimeouts.yaml +35 -0
- package/apis/json-schema/TerminalType.yaml +10 -0
- package/apis/json-schema/WorkflowConfig.yaml +6 -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 +17 -8
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -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/start-feature.use-case.d.ts +25 -0
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +116 -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 +7 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +58 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +9 -0
- package/dist/packages/core/src/domain/lifecycle-gates.d.ts +3 -0
- package/dist/packages/core/src/domain/lifecycle-gates.d.ts.map +1 -1
- package/dist/packages/core/src/domain/lifecycle-gates.js +3 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +8 -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 +46 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts +22 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.js +53 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts +11 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.js +13 -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 +15 -6
- 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 +18 -2
- package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.js +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +11 -1
- 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 +42 -3
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +7 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json +24 -0
- package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/index.js +2 -0
- package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/ls.command.js +3 -0
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +9 -1
- package/dist/src/presentation/cli/commands/feat/start.command.d.ts +12 -0
- package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/feat/start.command.js +43 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -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 +3 -1
- package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +12 -0
- package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-available-terminals.js +53 -0
- package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-shell.js +47 -3
- package/dist/src/presentation/web/app/actions/start-feature.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/start-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/start-feature.js +16 -0
- 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/settings/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/settings/page.js +6 -2
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +20 -1
- 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 +6 -2
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -2
- 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 +13 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +12 -3
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +2 -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 +36 -2
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +23 -0
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +3 -1
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +32 -5
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +34 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts +3 -1
- 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 +120 -15
- 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 +23 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts +11 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.js +63 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.js +24 -0
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +97 -2
- 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 +22 -0
- package/dist/src/presentation/web/components/ui/slider.d.ts +5 -0
- package/dist/src/presentation/web/components/ui/slider.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/slider.js +10 -0
- package/dist/src/presentation/web/components/ui/slider.stories.d.ts +7 -0
- package/dist/src/presentation/web/components/ui/slider.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/slider.stories.js +15 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +1 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts +2 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +5 -0
- 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 +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +55 -40
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
- 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 +51 -36
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
- 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 +55 -40
- package/web/.next/server/app/(dashboard)/create/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
- 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 +67 -52
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
- 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 +51 -36
- package/web/.next/server/app/(dashboard)/page.js +3 -3
- 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 +51 -36
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
- 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.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 +2 -2
- 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.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +25 -10
- package/web/.next/server/app/settings/page.js +3 -3
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/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]__7d5492a0._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.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]__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/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js → [root-of-the-server]__2dddfea9._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__2dddfea9._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__039967e3._.js → [root-of-the-server]__3155add4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__039967e3._.js.map → [root-of-the-server]__3155add4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__4c7486cb._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__4c7486cb._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__11033878._.js.map → [root-of-the-server]__6b17a22d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdc75809._.js.map → [root-of-the-server]__804c006d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__89e8a5cc._.js → [root-of-the-server]__8763fd7a._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8763fd7a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e70c5627._.js → [root-of-the-server]__9c56d724._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__cbd8062c._.js.map → [root-of-the-server]__9c56d724._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2773312c._.js → [root-of-the-server]__cfc116d5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2773312c._.js.map → [root-of-the-server]__cfc116d5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__cbd8062c._.js → [root-of-the-server]__d3841d9e._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e70c5627._.js.map → [root-of-the-server]__d3841d9e._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__db9afe04._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b1e68e34._.js.map → [root-of-the-server]__db9afe04._.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 +1 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_2eea2048._.js +3 -0
- package/web/.next/server/chunks/ssr/{_c5f84841._.js.map → _2eea2048._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_8dacd1e7._.js → _2f6f48b8._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_8dacd1e7._.js.map → _2f6f48b8._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_6f0118a0._.js → _3d260002._.js} +2 -2
- package/web/.next/server/chunks/ssr/_3d260002._.js.map +1 -0
- 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/_f5a1a9b8._.js +3 -0
- package/web/.next/server/chunks/ssr/_f5a1a9b8._.js.map +1 -0
- 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_0835b28e._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -0
- 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_de814675._.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_e8034a29._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -0
- 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 +320 -234
- package/web/.next/static/chunks/{18de73b2f14204d3.js → 09528d327a2bb15a.js} +1 -1
- package/web/.next/static/chunks/{e12f41ac3d49a7b5.js → 261a4f0c60d9e4ba.js} +1 -1
- package/web/.next/static/chunks/304a3dced97f4f68.js +2 -0
- package/web/.next/static/chunks/62a8173911f8f130.css +1 -0
- package/web/.next/static/chunks/{52285fdb39925ad5.js → 6a2f770718cd585d.js} +1 -1
- package/web/.next/static/chunks/{5de387864b89e64c.js → 8748274a8d9400da.js} +2 -2
- package/web/.next/static/chunks/a6d2916a7b4b2633.js +1 -0
- package/web/.next/static/chunks/bba38aefe51cfdfc.js +1 -0
- package/web/.next/static/chunks/bf6bd3385f65bed8.js +1 -0
- package/web/.next/static/chunks/{2babc8e3ae9ba6e8.js → c039476485c8b4e8.js} +1 -1
- package/web/.next/static/chunks/d363520c26e1cd08.js +1 -0
- package/web/.next/static/chunks/{fcde0cbb2976b933.js → e2ef95d904c360f3.js} +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +0 -4
- package/web/.next/server/chunks/ssr/_6f0118a0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c5f84841._.js +0 -3
- package/web/.next/server/chunks/ssr/_d2e408a9._.js +0 -3
- package/web/.next/server/chunks/ssr/_d2e408a9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +0 -1
- package/web/.next/static/chunks/0b3ab176958a8286.js +0 -1
- package/web/.next/static/chunks/242446982e8d196e.js +0 -1
- package/web/.next/static/chunks/552e0f129144b54d.js +0 -1
- package/web/.next/static/chunks/57b45edf86522369.css +0 -1
- package/web/.next/static/chunks/7b924c47dd2a5a53.js +0 -2
- package/web/.next/static/chunks/c172f4a6010cb5b5.js +0 -1
- /package/web/.next/static/{CStnC7-QgiTd6U99YUc1N → nIxRprL30XWZ36yCODJqc}/_buildManifest.js +0 -0
- /package/web/.next/static/{CStnC7-QgiTd6U99YUc1N → nIxRprL30XWZ36yCODJqc}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{CStnC7-QgiTd6U99YUc1N → nIxRprL30XWZ36yCODJqc}/_ssgManifest.js +0 -0
|
@@ -55,6 +55,7 @@ export function createNewCommand() {
|
|
|
55
55
|
.option('--allow-merge', 'Auto-approve merge phase')
|
|
56
56
|
.option('--allow-all', 'Run fully autonomous (no approval pauses)')
|
|
57
57
|
.option('--parent <fid>', 'Parent feature ID (full or partial prefix)')
|
|
58
|
+
.option('--pending', 'Create feature without starting the agent')
|
|
58
59
|
.option('--fast', 'Skip SDLC phases and implement directly from your prompt')
|
|
59
60
|
.option('--model <model>', 'LLM model identifier for this run (e.g. claude-opus-4-6)')
|
|
60
61
|
.option('--attach <path>', 'Attach a file (repeatable)', collect, [])
|
|
@@ -113,6 +114,7 @@ export function createNewCommand() {
|
|
|
113
114
|
push,
|
|
114
115
|
openPr,
|
|
115
116
|
...(parentId !== undefined && { parentId }),
|
|
117
|
+
...(options.pending && { pending: true }),
|
|
116
118
|
...(options.fast && { fast: true }),
|
|
117
119
|
...(options.model !== undefined && { model: options.model }),
|
|
118
120
|
...(attachmentPaths.length > 0 && { attachmentPaths }),
|
|
@@ -129,6 +131,9 @@ export function createNewCommand() {
|
|
|
129
131
|
if (feature.lifecycle === SdlcLifecycle.Blocked) {
|
|
130
132
|
messages.info(`Feature created in Blocked state — waiting for parent to reach Implementation`);
|
|
131
133
|
}
|
|
134
|
+
if (feature.lifecycle === SdlcLifecycle.Pending) {
|
|
135
|
+
messages.info(`Feature created in Pending state — run ${colors.accent(`shep feat start ${feature.id.slice(0, 8)}`)} to begin`);
|
|
136
|
+
}
|
|
132
137
|
console.log(` ${colors.muted('ID:')} ${colors.accent(feature.id)}`);
|
|
133
138
|
console.log(` ${colors.muted('Name:')} ${feature.name}`);
|
|
134
139
|
console.log(` ${colors.muted('Branch:')} ${colors.accent(feature.branch)}`);
|
|
@@ -138,7 +143,10 @@ export function createNewCommand() {
|
|
|
138
143
|
console.log(` ${colors.muted('Spec:')} ${feature.specPath}`);
|
|
139
144
|
}
|
|
140
145
|
if (feature.agentRunId) {
|
|
141
|
-
|
|
146
|
+
const agentStatus = feature.lifecycle === SdlcLifecycle.Pending
|
|
147
|
+
? colors.muted('pending')
|
|
148
|
+
: colors.success('spawned');
|
|
149
|
+
console.log(` ${colors.muted('Agent:')} ${agentStatus} (run ${feature.agentRunId.slice(0, 8)})`);
|
|
142
150
|
}
|
|
143
151
|
if (push || openPr) {
|
|
144
152
|
const pushHint = openPr ? 'push + PR' : 'push only';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Start Command
|
|
3
|
+
*
|
|
4
|
+
* Starts a pending feature by transitioning it to its active lifecycle
|
|
5
|
+
* and spawning the agent.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* shep feat start <id>
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare function createStartCommand(): Command;
|
|
12
|
+
//# sourceMappingURL=start.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/start.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,IAAI,OAAO,CAgC5C"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Start Command
|
|
3
|
+
*
|
|
4
|
+
* Starts a pending feature by transitioning it to its active lifecycle
|
|
5
|
+
* and spawning the agent.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* shep feat start <id>
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
12
|
+
import { StartFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/start-feature.use-case.js';
|
|
13
|
+
import { colors, messages, spinner } from '../../ui/index.js';
|
|
14
|
+
export function createStartCommand() {
|
|
15
|
+
return new Command('start')
|
|
16
|
+
.description('Start a pending feature (spawn the agent)')
|
|
17
|
+
.argument('<id>', 'Feature ID (or prefix)')
|
|
18
|
+
.action(async (id) => {
|
|
19
|
+
try {
|
|
20
|
+
const useCase = container.resolve(StartFeatureUseCase);
|
|
21
|
+
const { feature, agentRun } = await spinner('Starting feature', () => useCase.execute(id));
|
|
22
|
+
messages.newline();
|
|
23
|
+
if (feature.lifecycle === 'Blocked') {
|
|
24
|
+
messages.warning(`Feature transitioned to Blocked — parent has not reached Implementation`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
messages.success('Feature started');
|
|
28
|
+
}
|
|
29
|
+
console.log(` ${colors.muted('Feature:')} ${feature.name}`);
|
|
30
|
+
console.log(` ${colors.muted('Branch:')} ${colors.accent(feature.branch)}`);
|
|
31
|
+
console.log(` ${colors.muted('Status:')} ${feature.lifecycle}`);
|
|
32
|
+
if (feature.lifecycle !== 'Blocked') {
|
|
33
|
+
console.log(` ${colors.muted('Agent:')} ${colors.success('spawned')} (run ${agentRun.id.slice(0, 8)})`);
|
|
34
|
+
}
|
|
35
|
+
messages.newline();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
39
|
+
messages.error('Failed to start feature', err);
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
@@ -18,6 +18,8 @@ interface CreateFeatureInput {
|
|
|
18
18
|
parentId?: string;
|
|
19
19
|
/** When true, skip SDLC phases and implement directly from the prompt. */
|
|
20
20
|
fast?: boolean;
|
|
21
|
+
/** When true, create the feature in pending state (no agent spawned). */
|
|
22
|
+
pending?: boolean;
|
|
21
23
|
/** Optional agent type override for this feature run */
|
|
22
24
|
agentType?: string;
|
|
23
25
|
/** 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,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,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,CA+EhD"}
|
|
@@ -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, agentType, model, } = input;
|
|
5
|
+
const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, agentType, model, } = input;
|
|
6
6
|
if (!description?.trim()) {
|
|
7
7
|
return { error: 'description is required' };
|
|
8
8
|
}
|
|
@@ -27,6 +27,7 @@ export async function createFeature(input) {
|
|
|
27
27
|
...(parentId ? { parentId } : {}),
|
|
28
28
|
description,
|
|
29
29
|
...(fast ? { fast } : {}),
|
|
30
|
+
...(pending ? { pending } : {}),
|
|
30
31
|
...(agentType ? { agentType } : {}),
|
|
31
32
|
...(model ? { model } : {}),
|
|
32
33
|
});
|
|
@@ -41,6 +42,7 @@ export async function createFeature(input) {
|
|
|
41
42
|
openPr: openPr ?? false,
|
|
42
43
|
...(parentId ? { parentId } : {}),
|
|
43
44
|
...(fast ? { fast } : {}),
|
|
45
|
+
...(pending ? { pending } : {}),
|
|
44
46
|
...(agentType ? { agentType } : {}),
|
|
45
47
|
...(model ? { model } : {}),
|
|
46
48
|
...(sessionId ? { sessionId } : {}),
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AvailableTerminal {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
available: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Returns the list of terminal entries from tool metadata, filtered to the
|
|
8
|
+
* current platform, with availability checks. The "system-terminal" entry
|
|
9
|
+
* is always marked available and listed first.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getAvailableTerminals(): Promise<AvailableTerminal[]>;
|
|
12
|
+
//# sourceMappingURL=get-available-terminals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-available-terminals.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-available-terminals.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkD1E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { platform } from 'node:os';
|
|
3
|
+
import { getTerminalEntries } from '../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.js';
|
|
4
|
+
import { checkBinaryExists } from '../../../../../packages/core/src/infrastructure/services/tool-installer/binary-exists.js';
|
|
5
|
+
/**
|
|
6
|
+
* Returns the list of terminal entries from tool metadata, filtered to the
|
|
7
|
+
* current platform, with availability checks. The "system-terminal" entry
|
|
8
|
+
* is always marked available and listed first.
|
|
9
|
+
*/
|
|
10
|
+
export async function getAvailableTerminals() {
|
|
11
|
+
const currentPlatform = platform();
|
|
12
|
+
const entries = getTerminalEntries();
|
|
13
|
+
const results = [];
|
|
14
|
+
for (const [id, meta] of entries) {
|
|
15
|
+
// Skip terminals not supported on this platform
|
|
16
|
+
if (meta.platforms &&
|
|
17
|
+
!meta.platforms.includes(currentPlatform)) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
// System terminal is always available
|
|
21
|
+
if (id === 'system-terminal') {
|
|
22
|
+
results.unshift({ id: 'system', name: meta.name, available: true });
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
// Check binary availability
|
|
26
|
+
const binary = typeof meta.binary === 'string' ? meta.binary : meta.binary[currentPlatform];
|
|
27
|
+
if (!binary)
|
|
28
|
+
continue;
|
|
29
|
+
// For app-bundle terminals (Warp, iTerm2) that use verifyCommand instead of binary check
|
|
30
|
+
let available = false;
|
|
31
|
+
if (meta.verifyCommand.startsWith('test ')) {
|
|
32
|
+
// Use verifyCommand for app-bundle checks (e.g., "test -d /Applications/Warp.app")
|
|
33
|
+
try {
|
|
34
|
+
const { execSync } = await import('node:child_process');
|
|
35
|
+
execSync(meta.verifyCommand, { stdio: 'ignore' });
|
|
36
|
+
available = true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
available = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const result = await checkBinaryExists(binary);
|
|
44
|
+
available = result.found;
|
|
45
|
+
}
|
|
46
|
+
results.push({ id, name: meta.name, available });
|
|
47
|
+
}
|
|
48
|
+
// Ensure system terminal is always present even if not in tool metadata
|
|
49
|
+
if (!results.some((r) => r.id === 'system')) {
|
|
50
|
+
results.unshift({ id: 'system', name: 'System Terminal', available: true });
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AA+BA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2E9E"}
|
|
@@ -5,11 +5,19 @@ import { isAbsolute } from 'node:path';
|
|
|
5
5
|
import { spawn } from 'node:child_process';
|
|
6
6
|
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
7
7
|
import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
|
|
8
|
-
|
|
8
|
+
import { getTerminalEntries } from '../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.js';
|
|
9
|
+
/** Resolves a platform-keyed value to the current platform string. */
|
|
10
|
+
function resolvePlatformValue(value) {
|
|
11
|
+
if (typeof value === 'string')
|
|
12
|
+
return value;
|
|
13
|
+
return value[platform()] ?? Object.values(value)[0];
|
|
14
|
+
}
|
|
15
|
+
// Fallback commands for the "system" terminal when no tool metadata entry exists.
|
|
16
|
+
// Uses a record lookup instead of if/else to prevent the bundler from
|
|
9
17
|
// tree-shaking platform branches at build time. Turbopack evaluates
|
|
10
18
|
// os.platform() during the build and dead-code-eliminates unused branches,
|
|
11
19
|
// baking in the CI platform (linux) and breaking macOS/Windows installs.
|
|
12
|
-
const
|
|
20
|
+
const SYSTEM_TERMINAL_COMMANDS = {
|
|
13
21
|
darwin: { cmd: 'open', args: (p) => ['-a', 'Terminal', p] },
|
|
14
22
|
linux: { cmd: 'x-terminal-emulator', args: (p) => [`--working-directory=${p}`] },
|
|
15
23
|
win32: {
|
|
@@ -25,11 +33,47 @@ export async function openShell(input) {
|
|
|
25
33
|
try {
|
|
26
34
|
const settings = getSettings();
|
|
27
35
|
const shell = settings.environment.shellPreference;
|
|
36
|
+
const terminalPref = settings.environment.terminalPreference ?? 'system';
|
|
28
37
|
const targetPath = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;
|
|
29
38
|
if (!existsSync(targetPath)) {
|
|
30
39
|
return { success: false, error: `Path does not exist: ${targetPath}` };
|
|
31
40
|
}
|
|
32
|
-
|
|
41
|
+
// Try to find the terminal in tool metadata for non-system terminals
|
|
42
|
+
if (terminalPref !== 'system') {
|
|
43
|
+
const entries = getTerminalEntries();
|
|
44
|
+
const terminalEntry = entries.find(([id]) => id === terminalPref);
|
|
45
|
+
if (terminalEntry) {
|
|
46
|
+
const [, meta] = terminalEntry;
|
|
47
|
+
if (meta.openDirectory) {
|
|
48
|
+
const openCmd = resolvePlatformValue(meta.openDirectory);
|
|
49
|
+
if (openCmd.includes('{dir}')) {
|
|
50
|
+
const resolved = openCmd.replace('{dir}', targetPath);
|
|
51
|
+
const useShell = meta.spawnOptions?.shell === true;
|
|
52
|
+
if (useShell) {
|
|
53
|
+
const child = spawn(resolved, [], {
|
|
54
|
+
detached: true,
|
|
55
|
+
stdio: 'ignore',
|
|
56
|
+
shell: true,
|
|
57
|
+
});
|
|
58
|
+
child.on('error', () => undefined);
|
|
59
|
+
child.unref();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const [command, ...args] = resolved.split(/\s+/);
|
|
63
|
+
const child = spawn(command, args, {
|
|
64
|
+
detached: true,
|
|
65
|
+
stdio: 'ignore',
|
|
66
|
+
});
|
|
67
|
+
child.on('error', () => undefined);
|
|
68
|
+
child.unref();
|
|
69
|
+
}
|
|
70
|
+
return { success: true, path: targetPath, shell };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Fallback to system terminal
|
|
76
|
+
const entry = SYSTEM_TERMINAL_COMMANDS[platform()];
|
|
33
77
|
if (!entry) {
|
|
34
78
|
return {
|
|
35
79
|
success: false,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/start-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function startFeature(featureId) {
|
|
4
|
+
if (!featureId.trim()) {
|
|
5
|
+
return { started: false, error: 'Feature id is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const useCase = resolve('StartFeatureUseCase');
|
|
9
|
+
await useCase.execute(featureId);
|
|
10
|
+
return { started: true };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : 'Failed to start feature';
|
|
14
|
+
return { started: false, error: message };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -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;AAsEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA4R9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/settings/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/settings/page.tsx"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAA8B,YAAY,qDAwBzC"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { loadSettings } from '../actions/load-settings.js';
|
|
3
|
+
import { getAvailableTerminals } from '../actions/get-available-terminals.js';
|
|
3
4
|
import { SettingsPageClient } from '../../components/features/settings/settings-page-client.js';
|
|
4
5
|
/** Skip static pre-rendering since we need runtime DI container and server context. */
|
|
5
6
|
export const dynamic = 'force-dynamic';
|
|
6
7
|
export default async function SettingsPage() {
|
|
7
|
-
const { settings, shepHome, dbFileSize, error } = await
|
|
8
|
+
const [{ settings, shepHome, dbFileSize, error }, availableTerminals] = await Promise.all([
|
|
9
|
+
loadSettings(),
|
|
10
|
+
getAvailableTerminals(),
|
|
11
|
+
]);
|
|
8
12
|
if (error || !settings) {
|
|
9
13
|
return (_jsx("div", { className: "flex h-full flex-col p-6", children: _jsxs("p", { className: "text-destructive text-sm", children: ["Failed to load settings: ", error] }) }));
|
|
10
14
|
}
|
|
11
|
-
return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown' }) }));
|
|
15
|
+
return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown', availableTerminals: availableTerminals }) }));
|
|
12
16
|
}
|
|
@@ -32,7 +32,7 @@ export const SmallSize = {
|
|
|
32
32
|
};
|
|
33
33
|
/** Medium size with content-rich review-style content. */
|
|
34
34
|
export const MediumSize = {
|
|
35
|
-
render: () => (_jsx(DrawerTrigger, { size: "md", children: _jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Review Content" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "This drawer uses size=\"md\" (w-
|
|
35
|
+
render: () => (_jsx(DrawerTrigger, { size: "md", children: _jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Review Content" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "This drawer uses size=\"md\" (w-2xl / 672px) for content-rich review panels that need more horizontal space for diff summaries, tables, and code blocks." }), _jsx("div", { className: "bg-muted rounded-md p-3", children: _jsx("pre", { className: "text-xs", children: `+ Added authentication middleware\n- Removed legacy session handler\n Updated user model schema` }) })] }) })),
|
|
36
36
|
};
|
|
37
37
|
/** Modal drawer with overlay. */
|
|
38
38
|
export const Modal = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA+jB1F"}
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js
CHANGED
|
@@ -6,6 +6,7 @@ import { toast } from 'sonner';
|
|
|
6
6
|
import { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink } from 'lucide-react';
|
|
7
7
|
import { approveFeature } from '../../../app/actions/approve-feature.js';
|
|
8
8
|
import { resumeFeature } from '../../../app/actions/resume-feature.js';
|
|
9
|
+
import { startFeature } from '../../../app/actions/start-feature.js';
|
|
9
10
|
import { rejectFeature } from '../../../app/actions/reject-feature.js';
|
|
10
11
|
import { getFeatureArtifact } from '../../../app/actions/get-feature-artifact.js';
|
|
11
12
|
import { getResearchArtifact } from '../../../app/actions/get-research-artifact.js';
|
|
@@ -281,6 +282,20 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
|
281
282
|
return { ...prev, node: { ...prev.node, state: 'running' } };
|
|
282
283
|
});
|
|
283
284
|
}, []);
|
|
285
|
+
const handleStart = useCallback(async (featureId) => {
|
|
286
|
+
const result = await startFeature(featureId);
|
|
287
|
+
if (result.error) {
|
|
288
|
+
toast.error(result.error);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
toast.success('Feature started');
|
|
292
|
+
// Optimistically update the drawer view
|
|
293
|
+
setView((prev) => {
|
|
294
|
+
if (prev.type !== 'feature')
|
|
295
|
+
return prev;
|
|
296
|
+
return { ...prev, node: { ...prev.node, state: 'running' } };
|
|
297
|
+
});
|
|
298
|
+
}, []);
|
|
284
299
|
// ── Hooks (always called unconditionally per Rules of Hooks) ──────────
|
|
285
300
|
const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
|
|
286
301
|
? {
|
|
@@ -322,7 +337,11 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
|
322
337
|
// ── Body ──────────────────────────────────────────────────────────────
|
|
323
338
|
let body = null;
|
|
324
339
|
if (view.type === 'feature' && featureNode) {
|
|
325
|
-
const enrichedNode =
|
|
340
|
+
const enrichedNode = {
|
|
341
|
+
...featureNode,
|
|
342
|
+
...(featureNode.state === 'error' && { onRetry: handleRetry }),
|
|
343
|
+
...(featureNode.state === 'pending' && { onStart: handleStart }),
|
|
344
|
+
};
|
|
326
345
|
body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
327
346
|
}
|
|
328
347
|
return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
|
package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export interface FeatureCreatePayload {
|
|
|
36
36
|
parentId?: string;
|
|
37
37
|
/** When true, skip SDLC phases and implement directly from the prompt. */
|
|
38
38
|
fast: boolean;
|
|
39
|
+
/** When true, create the feature in pending state (no agent spawned). */
|
|
40
|
+
pending?: boolean;
|
|
39
41
|
/** Optional agent type override for this feature run */
|
|
40
42
|
agentType?: string;
|
|
41
43
|
/** 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":"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"}
|
package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
4
|
-
import { PaperclipIcon, ChevronsUpDown, CheckIcon, Zap, FolderPlus, Loader2 } from 'lucide-react';
|
|
4
|
+
import { PaperclipIcon, ChevronsUpDown, CheckIcon, Zap, Clock, FolderPlus, Loader2, } from 'lucide-react';
|
|
5
5
|
import { cn } from '../../../lib/utils.js';
|
|
6
6
|
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
7
7
|
import { BaseDrawer } from '../../common/base-drawer/index.js';
|
|
@@ -109,6 +109,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
109
109
|
const [commitEvidence, setCommitEvidence] = useState(defaultCommitEvidence);
|
|
110
110
|
const [parentId, setParentId] = useState(undefined);
|
|
111
111
|
const [fast, setFast] = useState(false);
|
|
112
|
+
const [pending, setPending] = useState(false);
|
|
112
113
|
const [overrideAgent, setOverrideAgent] = useState(undefined);
|
|
113
114
|
const [overrideModel, setOverrideModel] = useState(undefined);
|
|
114
115
|
const [selectedRepoPath, setSelectedRepoPath] = useState(repositoryPath || undefined);
|
|
@@ -152,6 +153,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
152
153
|
setSelectedRepoPath(repositoryPath || undefined);
|
|
153
154
|
setLocalRepos(repositories ?? []);
|
|
154
155
|
setFast(false);
|
|
156
|
+
setPending(false);
|
|
155
157
|
setOverrideAgent(undefined);
|
|
156
158
|
setOverrideModel(undefined);
|
|
157
159
|
setUploadError(null);
|
|
@@ -299,6 +301,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
299
301
|
enableEvidence,
|
|
300
302
|
commitEvidence,
|
|
301
303
|
fast,
|
|
304
|
+
...(pending ? { pending } : {}),
|
|
302
305
|
...(overrideAgent ? { agentType: overrideAgent } : {}),
|
|
303
306
|
...(overrideModel ? { model: overrideModel } : {}),
|
|
304
307
|
...(parentId ? { parentId } : {}),
|
|
@@ -317,6 +320,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
317
320
|
enableEvidence,
|
|
318
321
|
commitEvidence,
|
|
319
322
|
fast,
|
|
323
|
+
pending,
|
|
320
324
|
overrideAgent,
|
|
321
325
|
overrideModel,
|
|
322
326
|
parentId,
|
|
@@ -406,7 +410,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
406
410
|
repositoryPath.split('/').pop() })] })) : null, _jsxs("div", { role: "region", "aria-label": "File drop zone", "data-drag-over": isDragOver ? 'true' : 'false', onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: cn('flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIBE YOUR FEATURE" }), _jsxs("div", { ref: promptContainerRef, onFocus: handlePromptFocus, onBlur: handlePromptBlur, className: cn('border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]', isPromptFocused && 'ring-ring/50 border-ring ring-[3px]'), children: [_jsx(Textarea, { id: "feature-description", placeholder: "e.g. Add GitHub OAuth login with callback handling and token refresh...", value: description, onChange: (e) => setDescription(e.target.value), onPaste: handlePaste, required: true, disabled: isSubmitting, className: "min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0" }), attachments.length > 0 && (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => handleRemoveFile(file.id), disabled: isSubmitting, loading: file.loading }, file.id))) })), uploadError ? (_jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError })) : null, _jsxs("div", { className: "border-input flex items-center gap-3 border-t px-3 py-1.5", children: [_jsx(AgentModelPicker, { initialAgentType: overrideAgent ?? currentAgentType ?? 'claude-code', initialModel: overrideModel ?? currentModel ?? 'claude-sonnet-4-6', mode: "override", onAgentModelChange: (agent, model) => {
|
|
407
411
|
setOverrideAgent(agent);
|
|
408
412
|
setOverrideModel(model);
|
|
409
|
-
}, disabled: isSubmitting, className: "w-55" }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "ml-auto flex cursor-pointer items-center gap-2", children: [_jsx(Switch, { id: "fast-mode", checked: fast, onCheckedChange: setFast, disabled: isSubmitting }), _jsxs(Label, { htmlFor: "fast-mode", className: "flex cursor-pointer items-center gap-1 text-sm font-medium", children: [_jsx(Zap, { className: "h-3.5 w-3.5" }), "Fast Mode"] })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Skip SDLC phases and implement directly from your prompt." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: handleAddFiles, disabled: isSubmitting, "aria-label": "Attach files", className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(PaperclipIcon, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Attach files" })] })] })] })] }), hasFeatures && initialParentId !== undefined ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider", children: "APPROVE" }) }), _jsx(TooltipContent, { side: "bottom", children: "Auto-approve phase transitions without manual review." })] }), _jsx("div", { className: "flex flex-1 items-center gap-4", children: AUTO_APPROVE_OPTIONS.map((opt) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: `approve-${opt.id}`, size: "sm", checked: approvalGates[opt.id] ?? false, onCheckedChange: (v) => setApprovalGates((prev) => ({ ...prev, [opt.id]: v })), disabled: isSubmitting ||
|
|
413
|
+
}, disabled: isSubmitting, className: "w-55" }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "ml-auto flex cursor-pointer items-center gap-2", children: [_jsx(Switch, { id: "pending-mode", checked: pending, onCheckedChange: setPending, disabled: isSubmitting }), _jsxs(Label, { htmlFor: "pending-mode", className: "flex cursor-pointer items-center gap-1 text-sm font-medium", children: [_jsx(Clock, { className: "h-3.5 w-3.5" }), "Pending"] })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Create without starting \u2014 start manually later." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-2", children: [_jsx(Switch, { id: "fast-mode", checked: fast, onCheckedChange: setFast, disabled: isSubmitting }), _jsxs(Label, { htmlFor: "fast-mode", className: "flex cursor-pointer items-center gap-1 text-sm font-medium", children: [_jsx(Zap, { className: "h-3.5 w-3.5" }), "Fast Mode"] })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Skip SDLC phases and implement directly from your prompt." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: handleAddFiles, disabled: isSubmitting, "aria-label": "Attach files", className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(PaperclipIcon, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Attach files" })] })] })] })] }), hasFeatures && initialParentId !== undefined ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider", children: "APPROVE" }) }), _jsx(TooltipContent, { side: "bottom", children: "Auto-approve phase transitions without manual review." })] }), _jsx("div", { className: "flex flex-1 items-center gap-4", children: AUTO_APPROVE_OPTIONS.map((opt) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: `approve-${opt.id}`, size: "sm", checked: approvalGates[opt.id] ?? false, onCheckedChange: (v) => setApprovalGates((prev) => ({ ...prev, [opt.id]: v })), disabled: isSubmitting ||
|
|
410
414
|
(fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')) }), _jsx(Label, { htmlFor: `approve-${opt.id}`, className: "cursor-pointer text-xs font-medium", children: opt.label })] }) }), _jsx(TooltipContent, { side: "bottom", children: fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')
|
|
411
415
|
? 'Skipped in Fast Mode'
|
|
412
416
|
: opt.description })] }, opt.id))) }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => {
|
package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAuDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAQlE,CAAC;AAeF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
|
|
@@ -21,6 +21,10 @@ export function deriveNodeState(feature, agentRun, options) {
|
|
|
21
21
|
if (feature.lifecycle === SdlcLifecycle.Deleting) {
|
|
22
22
|
return 'deleting';
|
|
23
23
|
}
|
|
24
|
+
// Pending lifecycle — user-deferred, agent not yet spawned
|
|
25
|
+
if (feature.lifecycle === SdlcLifecycle.Pending) {
|
|
26
|
+
return 'pending';
|
|
27
|
+
}
|
|
24
28
|
// Blocked lifecycle takes priority — child waiting on parent regardless of agent run
|
|
25
29
|
if (feature.lifecycle === SdlcLifecycle.Blocked) {
|
|
26
30
|
return 'blocked';
|
|
@@ -111,6 +115,7 @@ export const sdlcLifecycleMap = {
|
|
|
111
115
|
Review: 'review',
|
|
112
116
|
'Deploy & QA': 'deploy',
|
|
113
117
|
Maintain: 'maintain',
|
|
118
|
+
Pending: 'pending',
|
|
114
119
|
};
|
|
115
120
|
/** Map agent graph node names (from agent_run.result or SSE phaseName) to UI lifecycle phases. */
|
|
116
121
|
const phaseNameToLifecycle = {
|
|
@@ -122,6 +127,7 @@ const phaseNameToLifecycle = {
|
|
|
122
127
|
merge: 'review',
|
|
123
128
|
maintain: 'maintain',
|
|
124
129
|
blocked: 'requirements',
|
|
130
|
+
pending: 'pending',
|
|
125
131
|
};
|
|
126
132
|
/**
|
|
127
133
|
* Derives the UI lifecycle phase from a Feature + AgentRun.
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { type LucideIcon } from 'lucide-react';
|
|
|
2
2
|
import type { Node } from '@xyflow/react';
|
|
3
3
|
import type { PrStatus, CiStatus, DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
4
4
|
import type { AgentTypeValue } from './agent-type-icons.js';
|
|
5
|
-
export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'done' | 'blocked' | 'error' | 'deleting';
|
|
6
|
-
export type FeatureLifecyclePhase = 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
|
|
5
|
+
export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'done' | 'blocked' | 'pending' | 'error' | 'deleting';
|
|
6
|
+
export type FeatureLifecyclePhase = 'pending' | 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
|
|
7
7
|
/** Human-readable display labels for lifecycle phases. */
|
|
8
8
|
export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
|
|
9
9
|
/** Present-participle verbs for the running badge, keyed by lifecycle phase. */
|
|
@@ -85,6 +85,7 @@ export interface FeatureNodeData {
|
|
|
85
85
|
hasChildren?: boolean;
|
|
86
86
|
onDelete?: (featureId: string, cleanup?: boolean, cascadeDelete?: boolean) => void;
|
|
87
87
|
onRetry?: (featureId: string) => void;
|
|
88
|
+
onStart?: (featureId: string) => void;
|
|
88
89
|
showHandles?: boolean;
|
|
89
90
|
}
|
|
90
91
|
export type FeatureNodeType = Node<FeatureNodeData, 'featureNode'>;
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
|