@shepai/cli 1.107.1 → 1.107.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +2 -2
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts +5 -0
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +31 -13
- package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.js +6 -2
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +13 -3
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +4 -4
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +4 -4
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +9 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +17 -7
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +5 -3
- 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 +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +4 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +2 -1
- package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.js +1 -1
- package/dist/packages/core/src/infrastructure/services/attachment-storage.service.js +3 -3
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +8 -7
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +18 -5
- package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +1 -1
- package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.js +6 -8
- package/dist/packages/core/src/infrastructure/services/process/tree-kill.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/services/process/tree-kill.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/process/tree-kill.js +11 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.d.ts +25 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.js +32 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +4 -27
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +3 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +3 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +3 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gh.json +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/git.json +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +3 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +3 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +3 -2
- package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.js +1 -0
- package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +5 -4
- package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/upgrade.command.js +4 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-repository.js +2 -1
- package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-folder.js +4 -2
- package/dist/src/presentation/web/app/actions/open-ide.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-ide.js +2 -1
- package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-shell.js +4 -2
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +8 -5
- 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 +10 -20
- package/dist/src/presentation/web/components/common/merge-review/diff-view.js +1 -1
- 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 +12 -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 +32 -8
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts +14 -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 +35 -1
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +4 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -6
- 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/create/page/server-reference-manifest.json +20 -20
- 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 +26 -26
- 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 +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/create/page.js.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 +26 -26
- 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 +26 -26
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.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 +1 -1
- 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 +5 -5
- 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_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_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_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/[root-of-the-server]__a402b567._.js +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_a1104008.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__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]__cbd8062c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_3c0076bc._.js → _e2681489._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_3c0076bc._.js.map → _e2681489._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_89745126._.js → _f3612e5a._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_89745126._.js.map → _f3612e5a._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_4d49c223._.js → _f891c054._.js} +2 -2
- package/web/.next/server/chunks/ssr/_f891c054._.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__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_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_ce7cbc3c._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.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_e2604413._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.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 +31 -31
- package/web/.next/static/chunks/{9751a0c871920841.js → 2ffe2f11f4ca9bb4.js} +1 -1
- package/web/.next/static/chunks/{fa27e698e0daf727.js → 430e372a1ef8e0a1.js} +1 -1
- package/web/.next/static/chunks/{e429067d6277ac20.js → 87488a543d25cd04.js} +1 -1
- package/web/.next/static/chunks/{dd30ae99bcec5f69.js → 8f1322aea6f75e2d.js} +2 -2
- package/web/.next/static/chunks/{2c6298885de1484c.js → acce61815a6260e7.js} +1 -1
- package/web/.next/static/chunks/{eed22af4cf55faea.js → c3253a63b95ec66e.js} +1 -1
- package/web/.next/static/chunks/{2eab3bb5550eccac.js → f60e223f91508b6e.js} +1 -1
- package/web/.next/static/chunks/{5ebc63ae73de50a3.js → f7d21f36df719f6f.js} +1 -1
- package/web/.next/static/chunks/f8672a435cc52ee8.js +2 -0
- package/web/.next/static/chunks/{f28d2411c36c308b.js → fc986ec4aa601f4d.js} +1 -1
- package/web/.next/server/chunks/ssr/_4d49c223._.js.map +0 -1
- package/web/.next/static/chunks/281782a712ea79cb.js +0 -2
- /package/web/.next/static/{OYucSKP83TUMTV1zRbeB8 → ITseKg4TnnrOWm79esrvr}/_buildManifest.js +0 -0
- /package/web/.next/static/{OYucSKP83TUMTV1zRbeB8 → ITseKg4TnnrOWm79esrvr}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{OYucSKP83TUMTV1zRbeB8 → ITseKg4TnnrOWm79esrvr}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAlBjB,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB;IAG9D;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAlBjB,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB;IAG9D;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAoG1D"}
|
package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js
CHANGED
|
@@ -77,7 +77,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
|
|
|
77
77
|
? SdlcLifecycle.Implementation
|
|
78
78
|
: SdlcLifecycle.Requirements;
|
|
79
79
|
let shouldSpawn = true;
|
|
80
|
-
let effectiveRepoPath = input.repositoryPath;
|
|
80
|
+
let effectiveRepoPath = input.repositoryPath.replace(/\\/g, '/');
|
|
81
81
|
if (input.parentId) {
|
|
82
82
|
const parent = await this.featureRepo.findById(input.parentId);
|
|
83
83
|
if (!parent) {
|
|
@@ -106,7 +106,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
// Resolve or create repository entity for this path
|
|
109
|
-
const normalizedPath = effectiveRepoPath.replace(/\/+$/, '') || effectiveRepoPath;
|
|
109
|
+
const normalizedPath = effectiveRepoPath.replace(/\\/g, '/').replace(/\/+$/, '') || effectiveRepoPath;
|
|
110
110
|
let repository = await this.repositoryRepo.findByPath(normalizedPath);
|
|
111
111
|
const now = new Date();
|
|
112
112
|
if (!repository) {
|
package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ export declare class MetadataGenerator {
|
|
|
20
20
|
* Errors are propagated to the caller.
|
|
21
21
|
*/
|
|
22
22
|
generateMetadata(userInput: string, agentType?: AgentType): Promise<FeatureMetadata>;
|
|
23
|
+
/**
|
|
24
|
+
* Extract metadata locally from user input without AI.
|
|
25
|
+
* Used as fallback when the AI call fails or returns invalid data.
|
|
26
|
+
*/
|
|
27
|
+
private extractMetadataLocally;
|
|
23
28
|
/**
|
|
24
29
|
* Convert text to kebab-case slug with 50-char limit.
|
|
25
30
|
* Removes special characters, collapses spaces, limits length.
|
package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-generator.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/metadata-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mEAAmE,CAAC;AAEhH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,sBAAsB;IAG3D;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata-generator.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/metadata-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mEAAmE,CAAC;AAEhH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,sBAAsB;IAG3D;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;IAwC1F;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,MAAM;CAgBf"}
|
|
@@ -54,20 +54,38 @@ Return a JSON object with these fields:
|
|
|
54
54
|
- slug: kebab-case identifier, 2-4 words MAX. Extract the core feature name (e.g., "github-oauth-login" from "add github oauth")
|
|
55
55
|
- name: polished, professional title (improve upon user's wording)
|
|
56
56
|
- description: refined 1-2 sentence description that captures the feature essence (not the request verbatim)`;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
57
|
+
try {
|
|
58
|
+
const parsed = await this.structuredCaller.call(prompt, METADATA_SCHEMA, {
|
|
59
|
+
maxTurns: 10,
|
|
60
|
+
allowedTools: [],
|
|
61
|
+
silent: true,
|
|
62
|
+
agentType,
|
|
63
|
+
});
|
|
64
|
+
if (parsed.slug && parsed.name && parsed.description) {
|
|
65
|
+
return {
|
|
66
|
+
slug: this.toSlug(parsed.slug),
|
|
67
|
+
name: parsed.name,
|
|
68
|
+
description: parsed.description,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
65
71
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
catch {
|
|
73
|
+
// AI-based metadata generation failed — fall through to local extraction
|
|
74
|
+
}
|
|
75
|
+
return this.extractMetadataLocally(userInput);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract metadata locally from user input without AI.
|
|
79
|
+
* Used as fallback when the AI call fails or returns invalid data.
|
|
80
|
+
*/
|
|
81
|
+
extractMetadataLocally(userInput) {
|
|
82
|
+
const slug = this.toSlug(userInput);
|
|
83
|
+
// Capitalize first letter of each word for the name
|
|
84
|
+
const name = userInput
|
|
85
|
+
.slice(0, 80)
|
|
86
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
87
|
+
.trim();
|
|
88
|
+
return { slug, name, description: userInput.slice(0, 200).trim() };
|
|
71
89
|
}
|
|
72
90
|
/**
|
|
73
91
|
* Convert text to kebab-case slug with 50-char limit.
|
package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/add-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAEhH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"add-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/add-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAEhH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAcD,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAGlD,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;CA8B9D"}
|
package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.js
CHANGED
|
@@ -19,11 +19,15 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
19
19
|
import { injectable, inject } from 'tsyringe';
|
|
20
20
|
import { randomUUID } from 'node:crypto';
|
|
21
21
|
/**
|
|
22
|
-
* Normalizes a path
|
|
22
|
+
* Normalizes a path: backslashes → forward slashes, trailing slashes removed.
|
|
23
|
+
* On Windows, the folder picker returns backslashes (C:\Users\...) while
|
|
24
|
+
* the CLI uses forward slashes (C:/Users/...). Normalize to forward slashes
|
|
25
|
+
* so the same directory is never stored under two different path strings.
|
|
23
26
|
*/
|
|
24
27
|
function normalizePath(p) {
|
|
28
|
+
const forwardSlash = p.replace(/\\/g, '/');
|
|
25
29
|
// Remove trailing slashes but keep root "/"
|
|
26
|
-
return
|
|
30
|
+
return forwardSlash.length > 1 ? forwardSlash.replace(/\/+$/, '') : forwardSlash;
|
|
27
31
|
}
|
|
28
32
|
let AddRepositoryUseCase = class AddRepositoryUseCase {
|
|
29
33
|
repositoryRepo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAkHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAkHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA6TrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -126,8 +126,13 @@ export async function initializeContainer() {
|
|
|
126
126
|
},
|
|
127
127
|
});
|
|
128
128
|
// Register external dependencies as tokens
|
|
129
|
+
// On Windows, agent CLIs ship as .cmd/.ps1 scripts (e.g. cursor's `agent.cmd`).
|
|
130
|
+
// execFile without shell: true cannot resolve .cmd extensions, causing ENOENT.
|
|
129
131
|
const execFileAsync = promisify(execFile);
|
|
130
|
-
|
|
132
|
+
const execFn = process.platform === 'win32'
|
|
133
|
+
? (file, args, options) => execFileAsync(file, args, { ...options, shell: true, windowsHide: true })
|
|
134
|
+
: execFileAsync;
|
|
135
|
+
container.registerInstance('ExecFunction', execFn);
|
|
131
136
|
// Register services (singletons via @injectable + token)
|
|
132
137
|
container.registerSingleton('IAgentValidator', AgentValidatorService);
|
|
133
138
|
container.registerSingleton('IVersionService', VersionService);
|
|
@@ -184,9 +189,14 @@ export async function initializeContainer() {
|
|
|
184
189
|
else {
|
|
185
190
|
container.register('IAgentExecutorFactory', {
|
|
186
191
|
useFactory: () => {
|
|
187
|
-
// Wrap spawn to ensure stdio is explicitly set to 'pipe'
|
|
192
|
+
// Wrap spawn to ensure stdio is explicitly set to 'pipe'.
|
|
193
|
+
// On Windows, .cmd scripts (e.g. cursor's `agent.cmd`) need shell: true.
|
|
188
194
|
const spawnWithPipe = (command, args, options) => {
|
|
189
|
-
return spawn(command, args, {
|
|
195
|
+
return spawn(command, args, {
|
|
196
|
+
...options,
|
|
197
|
+
stdio: 'pipe',
|
|
198
|
+
...(process.platform === 'win32' ? { shell: true, windowsHide: true } : {}),
|
|
199
|
+
});
|
|
190
200
|
};
|
|
191
201
|
return new AgentExecutorFactory(spawnWithPipe);
|
|
192
202
|
},
|
|
@@ -71,8 +71,8 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
|
|
|
71
71
|
return fromDatabase(rows[0]);
|
|
72
72
|
}
|
|
73
73
|
async findBySlug(slug, repositoryPath) {
|
|
74
|
-
const stmt = this.db.prepare(
|
|
75
|
-
const row = stmt.get(slug, repositoryPath);
|
|
74
|
+
const stmt = this.db.prepare("SELECT * FROM features WHERE slug = ? AND REPLACE(repository_path, '\\', '/') = ? AND deleted_at IS NULL");
|
|
75
|
+
const row = stmt.get(slug, repositoryPath.replace(/\\/g, '/'));
|
|
76
76
|
if (!row) {
|
|
77
77
|
return null;
|
|
78
78
|
}
|
|
@@ -85,8 +85,8 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
|
|
|
85
85
|
conditions.push('deleted_at IS NULL');
|
|
86
86
|
}
|
|
87
87
|
if (filters?.repositoryPath) {
|
|
88
|
-
conditions.push(
|
|
89
|
-
params.push(filters.repositoryPath);
|
|
88
|
+
conditions.push("REPLACE(repository_path, '\\', '/') = ?");
|
|
89
|
+
params.push(filters.repositoryPath.replace(/\\/g, '/'));
|
|
90
90
|
}
|
|
91
91
|
if (filters?.lifecycle) {
|
|
92
92
|
conditions.push('lifecycle = ?');
|
|
@@ -36,8 +36,8 @@ let SQLiteRepositoryRepository = class SQLiteRepositoryRepository {
|
|
|
36
36
|
return row ? fromDatabase(row) : null;
|
|
37
37
|
}
|
|
38
38
|
async findByPath(path) {
|
|
39
|
-
const stmt = this.db.prepare(
|
|
40
|
-
const row = stmt.get(path);
|
|
39
|
+
const stmt = this.db.prepare("SELECT * FROM repositories WHERE REPLACE(path, '\\', '/') = ? AND deleted_at IS NULL");
|
|
40
|
+
const row = stmt.get(path.replace(/\\/g, '/'));
|
|
41
41
|
return row ? fromDatabase(row) : null;
|
|
42
42
|
}
|
|
43
43
|
async list() {
|
|
@@ -50,8 +50,8 @@ let SQLiteRepositoryRepository = class SQLiteRepositoryRepository {
|
|
|
50
50
|
stmt.run(id);
|
|
51
51
|
}
|
|
52
52
|
async findByPathIncludingDeleted(path) {
|
|
53
|
-
const stmt = this.db.prepare(
|
|
54
|
-
const row = stmt.get(path);
|
|
53
|
+
const stmt = this.db.prepare("SELECT * FROM repositories WHERE REPLACE(path, '\\', '/') = ?");
|
|
54
|
+
const row = stmt.get(path.replace(/\\/g, '/'));
|
|
55
55
|
return row ? fromDatabase(row) : null;
|
|
56
56
|
}
|
|
57
57
|
async softDelete(id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
|
|
@@ -291,6 +291,15 @@ export class ClaudeCodeExecutorService {
|
|
|
291
291
|
const spawnOpts = {};
|
|
292
292
|
if (options?.cwd)
|
|
293
293
|
spawnOpts.cwd = options.cwd;
|
|
294
|
+
// Explicitly pipe stdio so streams are available even when parent disconnects
|
|
295
|
+
spawnOpts.stdio = ['pipe', 'pipe', 'pipe'];
|
|
296
|
+
// On Windows: windowsHide=true to prevent blank console windows.
|
|
297
|
+
// Do NOT use shell=true — it causes DEP0190 argument escaping issues
|
|
298
|
+
// and mangles prompts with special characters. The claude CLI is a
|
|
299
|
+
// native .exe, so spawn() finds it on PATH without shell.
|
|
300
|
+
if (process.platform === 'win32') {
|
|
301
|
+
spawnOpts.windowsHide = true;
|
|
302
|
+
}
|
|
294
303
|
// Strip CLAUDECODE env var to prevent "nested session" error when shep
|
|
295
304
|
// is invoked from within a Claude Code session. The claude CLI checks for
|
|
296
305
|
// this variable and refuses to start if it's set.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0GtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,eAAe;CAgDxB"}
|
|
@@ -49,7 +49,9 @@ export class CursorExecutorService {
|
|
|
49
49
|
}
|
|
50
50
|
async execute(prompt, options) {
|
|
51
51
|
this.silent = options?.silent ?? false;
|
|
52
|
-
|
|
52
|
+
// Use json (not stream-json) for execute() — outputs a single JSON result line.
|
|
53
|
+
// stream-json is unreliable on Windows where shell: true can mangle args.
|
|
54
|
+
const args = this.buildArgs(prompt, options);
|
|
53
55
|
const spawnOpts = this.buildSpawnOptions(options);
|
|
54
56
|
this.log(`Spawning: agent ${args.map((a) => (a.length > 80 ? `${a.slice(0, 77)}...` : a)).join(' ')}`);
|
|
55
57
|
this.log(`Spawn cwd: ${spawnOpts.cwd ?? '(inherited)'}`);
|
|
@@ -62,8 +64,9 @@ export class CursorExecutorService {
|
|
|
62
64
|
let stderr = '';
|
|
63
65
|
let timedOut = false;
|
|
64
66
|
let timeoutId;
|
|
65
|
-
// Accumulated from
|
|
67
|
+
// Accumulated from JSON events or raw text fallback
|
|
66
68
|
let resultText = '';
|
|
69
|
+
let rawText = '';
|
|
67
70
|
let sessionId;
|
|
68
71
|
let metadata;
|
|
69
72
|
if (options?.timeout) {
|
|
@@ -83,16 +86,21 @@ export class CursorExecutorService {
|
|
|
83
86
|
}
|
|
84
87
|
}
|
|
85
88
|
else if (parsed.type === 'result') {
|
|
89
|
+
// json format puts the full result text in parsed.result
|
|
90
|
+
if (typeof parsed.result === 'string' && parsed.result)
|
|
91
|
+
resultText = parsed.result;
|
|
86
92
|
if (parsed.session_id)
|
|
87
93
|
sessionId = parsed.session_id;
|
|
88
94
|
if (parsed.duration_ms !== undefined) {
|
|
89
95
|
metadata = { ...metadata, duration_ms: parsed.duration_ms };
|
|
90
96
|
}
|
|
91
97
|
}
|
|
92
|
-
// user
|
|
98
|
+
// user, system, thinking events: logged but don't affect result
|
|
93
99
|
}
|
|
94
100
|
catch {
|
|
95
|
-
|
|
101
|
+
// Non-JSON output — accumulate as raw text fallback
|
|
102
|
+
if (line.length > 0)
|
|
103
|
+
rawText += `${line}\n`;
|
|
96
104
|
}
|
|
97
105
|
};
|
|
98
106
|
proc.stdout?.on('data', (chunk) => {
|
|
@@ -119,7 +127,9 @@ export class CursorExecutorService {
|
|
|
119
127
|
proc.on('close', (code) => {
|
|
120
128
|
if (lineBuffer.trim())
|
|
121
129
|
processLine(lineBuffer.trim());
|
|
122
|
-
|
|
130
|
+
// Use raw text as fallback when no JSON result was captured
|
|
131
|
+
const finalText = resultText || rawText.trim();
|
|
132
|
+
this.log(`Process closed with code ${code}, result=${finalText.length} chars`);
|
|
123
133
|
if (timeoutId)
|
|
124
134
|
clearTimeout(timeoutId);
|
|
125
135
|
if (timedOut) {
|
|
@@ -130,7 +140,7 @@ export class CursorExecutorService {
|
|
|
130
140
|
reject(new Error(stderr.trim() || `Process exited with code ${code}`));
|
|
131
141
|
return;
|
|
132
142
|
}
|
|
133
|
-
const result = { result:
|
|
143
|
+
const result = { result: finalText };
|
|
134
144
|
if (sessionId)
|
|
135
145
|
result.sessionId = sessionId;
|
|
136
146
|
if (metadata)
|
|
@@ -244,7 +254,7 @@ export class CursorExecutorService {
|
|
|
244
254
|
}
|
|
245
255
|
}
|
|
246
256
|
buildArgs(prompt, options) {
|
|
247
|
-
const args = ['-p', prompt, '--output-format', 'json'
|
|
257
|
+
const args = ['--yolo', '-p', prompt, '--output-format', 'json'];
|
|
248
258
|
if (options?.resumeSession)
|
|
249
259
|
args.push('--resume', options.resumeSession);
|
|
250
260
|
if (options?.model)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAwIpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
|
|
@@ -101,20 +101,22 @@ const CI_FIX_RESULT = 'Fixed CI failure: corrected import path. All checks now p
|
|
|
101
101
|
* plan.prompt.ts:199.
|
|
102
102
|
*/
|
|
103
103
|
function extractSpecDir(prompt) {
|
|
104
|
+
// Match both Unix absolute paths (/...) and Windows absolute paths (C:\...)
|
|
105
|
+
const ABS_PATH = String.raw `(?:\/|[A-Za-z]:[/\\])[^\s\n]+`;
|
|
104
106
|
// Analyze ("Write your analysis to:"), requirements ("Update the file at:"),
|
|
105
107
|
// research ("Write your research to:")
|
|
106
|
-
const fileMatch = prompt.match(
|
|
108
|
+
const fileMatch = prompt.match(new RegExp(`(?:Write your \\w+ to|Update the file at):\\s+(${ABS_PATH})`));
|
|
107
109
|
if (fileMatch)
|
|
108
110
|
return path.dirname(fileMatch[1]);
|
|
109
111
|
// Plan: "Write to BOTH /path/plan.yaml AND /path/tasks.yaml"
|
|
110
|
-
const planMatch = prompt.match(
|
|
112
|
+
const planMatch = prompt.match(new RegExp(`Write to BOTH\\s+(${ABS_PATH})[/\\\\]plan\\.yaml`));
|
|
111
113
|
if (planMatch)
|
|
112
114
|
return planMatch[1];
|
|
113
115
|
return null;
|
|
114
116
|
}
|
|
115
117
|
/** Validate extracted specDir: must be absolute, no ".." traversal. */
|
|
116
118
|
function validateSpecDir(specDir) {
|
|
117
|
-
if (!
|
|
119
|
+
if (!path.isAbsolute(specDir))
|
|
118
120
|
throw new Error(`DevAgentExecutorService: invalid specDir (not absolute): ${specDir}`);
|
|
119
121
|
if (specDir.includes('..'))
|
|
120
122
|
throw new Error(`DevAgentExecutorService: invalid specDir (contains ".."): ${specDir}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,+DAA+D,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;kBAG/B,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;EAK/B;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,+DAA+D,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;kBAG/B,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;EAK/B;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,CAOpF;AAeD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAQ3F;AAMD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,GAAG,eAAe,GAAG,SAAS,CAAC;AAMhG;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAKjE;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,YAAY,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA6B/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAqB5F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAwB1F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAa5F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CA6BT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAa3E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GACjE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAoHnE"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js
CHANGED
|
@@ -48,6 +48,7 @@ export function buildExecutorOptions(state) {
|
|
|
48
48
|
return {
|
|
49
49
|
cwd: state.worktreePath || state.repositoryPath,
|
|
50
50
|
maxTurns: 5000,
|
|
51
|
+
timeout: 300_000, // 5 minutes per agent call — prevents infinite hangs
|
|
51
52
|
...(state.model ? { model: state.model } : {}),
|
|
52
53
|
};
|
|
53
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,
|
|
1
|
+
{"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA8LR"}
|
|
@@ -20,7 +20,7 @@ export function buildEvidencePrompt(state, options = { commitEvidence: false })
|
|
|
20
20
|
// Worktree path is: ~/.shep/repos/<hash>/wt/<slug>
|
|
21
21
|
// Evidence path is: ~/.shep/repos/<hash>/evidence/<featureId>/
|
|
22
22
|
const repoHashDir = dirname(dirname(cwd)); // go up from wt/<slug>
|
|
23
|
-
const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId);
|
|
23
|
+
const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId).replaceAll('\\', '/');
|
|
24
24
|
const specSection = specContent
|
|
25
25
|
? `## Feature Specification (spec.yaml)
|
|
26
26
|
|
|
@@ -41,9 +41,10 @@ ${tasksContent}
|
|
|
41
41
|
`
|
|
42
42
|
: '';
|
|
43
43
|
// Relative spec dir path from worktree root (e.g., "specs/057-sidenav-feature-toggle")
|
|
44
|
-
|
|
44
|
+
// Normalize to forward slashes so prompts always use POSIX paths (even on Windows)
|
|
45
|
+
const relativeSpecDir = relative(cwd, state.specDir).replaceAll('\\', '/');
|
|
45
46
|
const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
|
|
46
|
-
const specEvidenceAbsPath = join(state.specDir, 'evidence');
|
|
47
|
+
const specEvidenceAbsPath = join(state.specDir, 'evidence').replaceAll('\\', '/');
|
|
47
48
|
const storageSection = options.commitEvidence
|
|
48
49
|
? `## Evidence Storage
|
|
49
50
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,
|
|
1
|
+
{"version":3,"file":"repair.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CA2BR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,QAAQ,EAAE,cAAc,GACvB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAuCnE"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js
CHANGED
|
@@ -13,7 +13,8 @@ import { readSpecFile, createNodeLogger } from './node-helpers.js';
|
|
|
13
13
|
*/
|
|
14
14
|
export function buildRepairPrompt(filename, content, errors, specDir) {
|
|
15
15
|
const filenames = Array.isArray(filename) ? filename : [filename];
|
|
16
|
-
|
|
16
|
+
// Normalize to forward slashes so prompts always use POSIX paths (even on Windows)
|
|
17
|
+
const filePaths = filenames.map((f) => join(specDir, f).replaceAll('\\', '/'));
|
|
17
18
|
return [
|
|
18
19
|
'## YAML Repair Task',
|
|
19
20
|
'',
|
|
@@ -311,7 +311,7 @@ let ClaudeCodeSessionRepository = class ClaudeCodeSessionRepository {
|
|
|
311
311
|
const home = os.homedir();
|
|
312
312
|
if (filePath === home)
|
|
313
313
|
return '~';
|
|
314
|
-
if (filePath.startsWith(`${home}
|
|
314
|
+
if (filePath.startsWith(`${home}${path.sep}`)) {
|
|
315
315
|
return `~${filePath.slice(home.length)}`;
|
|
316
316
|
}
|
|
317
317
|
return filePath;
|
|
@@ -33,7 +33,7 @@ let AttachmentStorageService = class AttachmentStorageService {
|
|
|
33
33
|
name: sanitized,
|
|
34
34
|
size: BigInt(buffer.length),
|
|
35
35
|
mimeType,
|
|
36
|
-
path: filePath,
|
|
36
|
+
path: filePath.replace(/\\/g, '/'),
|
|
37
37
|
createdAt: new Date(),
|
|
38
38
|
sha256: hash,
|
|
39
39
|
};
|
|
@@ -68,7 +68,7 @@ let AttachmentStorageService = class AttachmentStorageService {
|
|
|
68
68
|
name: stored.name,
|
|
69
69
|
size: stored.size,
|
|
70
70
|
mimeType: stored.mimeType,
|
|
71
|
-
path: newPath,
|
|
71
|
+
path: newPath.replace(/\\/g, '/'),
|
|
72
72
|
createdAt: stored.createdAt,
|
|
73
73
|
});
|
|
74
74
|
}
|
|
@@ -84,7 +84,7 @@ let AttachmentStorageService = class AttachmentStorageService {
|
|
|
84
84
|
name: file,
|
|
85
85
|
size: BigInt(0),
|
|
86
86
|
mimeType: 'application/octet-stream',
|
|
87
|
-
path: filePath,
|
|
87
|
+
path: filePath.replace(/\\/g, '/'),
|
|
88
88
|
createdAt: new Date(),
|
|
89
89
|
});
|
|
90
90
|
}
|
package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/deployment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/deployment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAI9D,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACT,MAAM,qEAAqE,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAoBzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAgBD,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAElC,IAAI,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIrD;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA+EjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAYpD;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI3D;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+D5B;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACH,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { spawn } from 'node:child_process';
|
|
10
10
|
import { EventEmitter } from 'node:events';
|
|
11
|
+
import treeKill from 'tree-kill';
|
|
11
12
|
import { DeploymentState } from '../../../domain/generated/output.js';
|
|
12
13
|
import { detectDevScript } from './detect-dev-script.js';
|
|
13
14
|
import { createDeploymentLogger } from './deployment-logger.js';
|
|
@@ -19,7 +20,7 @@ const MAX_WAIT_MS = 5000;
|
|
|
19
20
|
const defaultDeps = {
|
|
20
21
|
spawn,
|
|
21
22
|
detectDevScript,
|
|
22
|
-
kill: (pid, signal) =>
|
|
23
|
+
kill: (pid, signal) => treeKill(pid, signal),
|
|
23
24
|
isAlive: (pid) => {
|
|
24
25
|
try {
|
|
25
26
|
process.kill(pid, 0);
|
|
@@ -123,11 +124,11 @@ export class DeploymentService {
|
|
|
123
124
|
log.info(`stop("${targetId}") — no deployment found, nothing to stop`);
|
|
124
125
|
return;
|
|
125
126
|
}
|
|
126
|
-
log.info(`stop("${targetId}") — sending SIGTERM to process
|
|
127
|
+
log.info(`stop("${targetId}") — sending SIGTERM to process tree (pid=${entry.pid})`);
|
|
127
128
|
entry.logs.clear();
|
|
128
|
-
// Send SIGTERM to process
|
|
129
|
+
// Send SIGTERM to process tree (tree-kill handles child processes)
|
|
129
130
|
try {
|
|
130
|
-
this.deps.kill(
|
|
131
|
+
this.deps.kill(entry.pid, 'SIGTERM');
|
|
131
132
|
}
|
|
132
133
|
catch {
|
|
133
134
|
log.info(`stop("${targetId}") — process already dead on SIGTERM`);
|
|
@@ -140,7 +141,7 @@ export class DeploymentService {
|
|
|
140
141
|
log.warn(`stop("${targetId}") — process did not exit after ${MAX_WAIT_MS}ms, escalating to SIGKILL`);
|
|
141
142
|
// Escalate to SIGKILL
|
|
142
143
|
try {
|
|
143
|
-
this.deps.kill(
|
|
144
|
+
this.deps.kill(entry.pid, 'SIGKILL');
|
|
144
145
|
}
|
|
145
146
|
catch {
|
|
146
147
|
// Process may have exited between check and kill
|
|
@@ -183,11 +184,11 @@ export class DeploymentService {
|
|
|
183
184
|
this.emitter.off(event, handler);
|
|
184
185
|
}
|
|
185
186
|
/**
|
|
186
|
-
* Send SIGKILL to a process
|
|
187
|
+
* Send SIGKILL to a process tree.
|
|
187
188
|
*/
|
|
188
189
|
killProcess(entry) {
|
|
189
190
|
try {
|
|
190
|
-
this.deps.kill(
|
|
191
|
+
this.deps.kill(entry.pid, 'SIGKILL');
|
|
191
192
|
}
|
|
192
193
|
catch {
|
|
193
194
|
// Process may already be dead
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBlB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
|
|
@@ -18,7 +18,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
18
18
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
19
19
|
};
|
|
20
20
|
import { createHash } from 'node:crypto';
|
|
21
|
-
import { mkdirSync } from 'node:fs';
|
|
21
|
+
import { mkdirSync, realpathSync } from 'node:fs';
|
|
22
22
|
import path from 'node:path';
|
|
23
23
|
import { injectable, inject } from 'tsyringe';
|
|
24
24
|
const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
|
|
@@ -40,9 +40,10 @@ let WorktreeService = class WorktreeService {
|
|
|
40
40
|
catch (error) {
|
|
41
41
|
throw this.parseGitError(error);
|
|
42
42
|
}
|
|
43
|
-
// Get info about the created worktree
|
|
43
|
+
// Get info about the created worktree — match by branch (reliable) then path
|
|
44
44
|
const worktrees = await this.list(repoPath);
|
|
45
|
-
const created = worktrees.find((w) =>
|
|
45
|
+
const created = worktrees.find((w) => w.branch === branch) ??
|
|
46
|
+
worktrees.find((w) => this.arePathsEquivalent(w.path, worktreePath));
|
|
46
47
|
if (!created) {
|
|
47
48
|
throw new WorktreeError('Worktree created but not found in list', WorktreeErrorCode.GIT_ERROR);
|
|
48
49
|
}
|
|
@@ -123,7 +124,7 @@ let WorktreeService = class WorktreeService {
|
|
|
123
124
|
try {
|
|
124
125
|
if (!isExistingRepo) {
|
|
125
126
|
mkdirSync(repoPath, { recursive: true });
|
|
126
|
-
await this.execFile('git', ['init'], { cwd: repoPath });
|
|
127
|
+
await this.execFile('git', ['init', '-b', 'main'], { cwd: repoPath });
|
|
127
128
|
}
|
|
128
129
|
await this.execFile('git', ['config', 'user.name', GIT_AUTO_INIT_USER], { cwd: repoPath });
|
|
129
130
|
await this.execFile('git', ['config', 'user.email', GIT_AUTO_INIT_EMAIL], { cwd: repoPath });
|
|
@@ -136,7 +137,7 @@ let WorktreeService = class WorktreeService {
|
|
|
136
137
|
getWorktreePath(repoPath, branch) {
|
|
137
138
|
const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
|
|
138
139
|
const slug = branch.replace(/\//g, '-');
|
|
139
|
-
return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug);
|
|
140
|
+
return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
|
|
140
141
|
}
|
|
141
142
|
parseWorktreeOutput(output) {
|
|
142
143
|
if (!output.trim())
|
|
@@ -178,6 +179,18 @@ let WorktreeService = class WorktreeService {
|
|
|
178
179
|
return this.normalizeWorktreePath(a) === this.normalizeWorktreePath(b);
|
|
179
180
|
}
|
|
180
181
|
normalizeWorktreePath(input) {
|
|
182
|
+
// On Windows, git outputs forward slashes but path.normalize uses backslashes.
|
|
183
|
+
// Normalize to forward slashes before comparing, case-insensitive.
|
|
184
|
+
if (process.platform === 'win32') {
|
|
185
|
+
let normalized = path.normalize(input).replace(/\\/g, '/').replace(/\/+$/, '');
|
|
186
|
+
try {
|
|
187
|
+
normalized = realpathSync(normalized).replace(/\\/g, '/');
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Path may not exist yet — use as-is
|
|
191
|
+
}
|
|
192
|
+
return normalized.toLowerCase();
|
|
193
|
+
}
|
|
181
194
|
const normalized = path.normalize(input).replace(/\/+$/, '');
|
|
182
195
|
// On macOS, git can report /private/var/... while callers use /var/...
|
|
183
196
|
if (process.platform === 'darwin' && normalized.startsWith('/private/var/')) {
|