@shepai/cli 1.135.2-pr438.f43bc1e → 1.135.2-pr439.e1871c8
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/Repository.yaml +3 -0
- package/apis/json-schema/WorkflowConfig.yaml +0 -5
- package/dist/packages/core/src/application/index.d.ts +1 -1
- package/dist/packages/core/src/application/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +0 -28
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +0 -37
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +0 -12
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +4 -6
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.js +1 -2
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +21 -5
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -1
- 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 +8 -2
- package/dist/packages/core/src/domain/generated/output.d.ts +4 -67
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +0 -4
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.js +19 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +6 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +4 -2
- 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 +15 -8
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +1 -3
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +1 -37
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts +17 -0
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.js +21 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -2
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +0 -21
- 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 +2 -4
- package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +2 -4
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +17 -3
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +49 -13
- package/dist/src/presentation/cli/index.js +0 -2
- 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 +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +24 -24
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +24 -24
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- 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 +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- 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 +22 -22
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +24 -24
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- 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 +30 -30
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- 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 +22 -22
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.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_026fdffa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__90f9ae71._.js → [root-of-the-server]__2096f24f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__31bc28da._.js.map → [root-of-the-server]__2096f24f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__31bc28da._.js → [root-of-the-server]__3f6cd19e._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__90ce4b6d._.js.map → [root-of-the-server]__3f6cd19e._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__32ecbed9._.js → [root-of-the-server]__6c83fbec._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__32ecbed9._.js.map → [root-of-the-server]__6c83fbec._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__90ce4b6d._.js → [root-of-the-server]__a13f3ed8._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__90f9ae71._.js.map → [root-of-the-server]__a13f3ed8._.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/_02ec1aea._.js +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/{_77083321._.js → _b6960ca0._.js} +3 -3
- package/web/.next/server/chunks/ssr/_b6960ca0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_7e29a7bc._.js → _c5a0904f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_7e29a7bc._.js.map → _c5a0904f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_8b0c1045._.js → _c80f0ee4._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_8b0c1045._.js.map → _c80f0ee4._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_cfea7939._.js → src_presentation_web_5cbfa9c3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_cfea7939._.js.map → src_presentation_web_5cbfa9c3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +38 -38
- package/web/.next/static/chunks/{0d539860f56e6468.js → 0f7a03924ffe9201.js} +1 -1
- package/web/.next/static/chunks/290b9ee95370f3e6.js +2 -0
- package/web/.next/static/chunks/{d45958925d9b5068.js → 32a0eb00cc8f57a5.js} +1 -1
- package/web/.next/static/chunks/47151663050b874d.js +1 -0
- package/web/.next/static/chunks/6472785bb556ec8a.js +1 -0
- package/web/.next/static/chunks/{475a8dfc028d8ade.js → 6cf053583d146b73.js} +1 -1
- package/web/.next/static/chunks/{67b290f5a29737c1.js → 769db91c3a32cb62.js} +1 -1
- package/web/.next/static/chunks/{daf11c5cc3adbcbc.js → 7eb6cae52a1a3747.js} +1 -1
- package/web/.next/static/chunks/{2b853c80d6032a5b.js → 9a53c38c866d6fd6.js} +1 -1
- package/web/.next/static/chunks/{13daed9124d5db9d.js → 9cde06b0bf7f313d.js} +1 -1
- package/web/.next/static/chunks/{fe4aab39650fe1da.js → d4ea4340c78d8fe8.js} +1 -1
- package/web/.next/static/chunks/{9b5e512c27b112a5.js → dca377b2a0726988.js} +1 -1
- package/apis/json-schema/DoctorDiagnosticReport.yaml +0 -24
- package/apis/json-schema/FailedRunSummary.yaml +0 -22
- package/apis/json-schema/SystemInfo.yaml +0 -22
- package/dist/packages/core/src/application/ports/output/services/github-issue-service.interface.d.ts +0 -57
- package/dist/packages/core/src/application/ports/output/services/github-issue-service.interface.d.ts.map +0 -1
- package/dist/packages/core/src/application/ports/output/services/github-issue-service.interface.js +0 -39
- package/dist/packages/core/src/application/use-cases/doctor/doctor-diagnose.use-case.d.ts +0 -53
- package/dist/packages/core/src/application/use-cases/doctor/doctor-diagnose.use-case.d.ts.map +0 -1
- package/dist/packages/core/src/application/use-cases/doctor/doctor-diagnose.use-case.js +0 -266
- package/dist/packages/core/src/infrastructure/services/external/github-issue-creator.service.d.ts +0 -17
- package/dist/packages/core/src/infrastructure/services/external/github-issue-creator.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/external/github-issue-creator.service.js +0 -69
- package/dist/src/presentation/cli/commands/doctor.command.d.ts +0 -20
- package/dist/src/presentation/cli/commands/doctor.command.d.ts.map +0 -1
- package/dist/src/presentation/cli/commands/doctor.command.js +0 -127
- package/web/.next/server/chunks/ssr/_77083321._.js.map +0 -1
- package/web/.next/static/chunks/30f300c565f39570.js +0 -1
- package/web/.next/static/chunks/3cf03a4faffa22e9.js +0 -1
- package/web/.next/static/chunks/e87e22afc1ecf600.js +0 -2
- /package/web/.next/static/{rYnuAm9xTEAUIz5Pqp9fP → joXWxy8xjQS31B-KrKQy2}/_buildManifest.js +0 -0
- /package/web/.next/static/{rYnuAm9xTEAUIz5Pqp9fP → joXWxy8xjQS31B-KrKQy2}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{rYnuAm9xTEAUIz5Pqp9fP → joXWxy8xjQS31B-KrKQy2}/_ssgManifest.js +0 -0
|
@@ -28,7 +28,6 @@ import { DaemonPidService } from '../services/daemon/daemon-pid.service.js';
|
|
|
28
28
|
import { DeploymentService } from '../services/deployment/deployment.service.js';
|
|
29
29
|
import { AttachmentStorageService } from '../services/attachment-storage.service.js';
|
|
30
30
|
import { GitHubRepositoryService } from '../services/external/github-repository.service.js';
|
|
31
|
-
import { GitHubIssueCreatorService } from '../services/external/github-issue-creator.service.js';
|
|
32
31
|
import { AgentExecutorFactory } from '../services/agents/common/agent-executor-factory.service.js';
|
|
33
32
|
import { AgentExecutorProvider } from '../services/agents/common/agent-executor-provider.service.js';
|
|
34
33
|
import { StructuredAgentCallerService } from '../services/agents/common/structured-agent-caller.service.js';
|
|
@@ -85,7 +84,6 @@ import { CheckAndUnblockFeaturesUseCase } from '../../application/use-cases/feat
|
|
|
85
84
|
import { UpdateFeatureLifecycleUseCase } from '../../application/use-cases/features/update/update-feature-lifecycle.use-case.js';
|
|
86
85
|
import { CleanupFeatureWorktreeUseCase } from '../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
|
|
87
86
|
import { UpgradeCliUseCase } from '../../application/use-cases/upgrade/upgrade-cli.use-case.js';
|
|
88
|
-
import { DoctorDiagnoseUseCase } from '../../application/use-cases/doctor/doctor-diagnose.use-case.js';
|
|
89
87
|
// Session listing
|
|
90
88
|
import { ClaudeCodeSessionRepository } from '../services/agents/sessions/claude-code-session.repository.js';
|
|
91
89
|
import { StubSessionRepository } from '../services/agents/sessions/stub-session.repository.js';
|
|
@@ -171,7 +169,6 @@ export async function initializeContainer() {
|
|
|
171
169
|
container.registerSingleton('IToolInstallerService', ToolInstallerServiceImpl);
|
|
172
170
|
container.registerSingleton('IGitPrService', GitPrService);
|
|
173
171
|
container.registerSingleton('IGitHubRepositoryService', GitHubRepositoryService);
|
|
174
|
-
container.registerSingleton('IGitHubIssueService', GitHubIssueCreatorService);
|
|
175
172
|
container.registerSingleton('IIdeLauncherService', JsonDrivenIdeLauncherService);
|
|
176
173
|
container.registerSingleton('IDaemonService', DaemonPidService);
|
|
177
174
|
container.registerSingleton(AttachmentStorageService);
|
|
@@ -308,7 +305,6 @@ export async function initializeContainer() {
|
|
|
308
305
|
container.registerSingleton(UpdateFeatureLifecycleUseCase);
|
|
309
306
|
container.registerSingleton(CleanupFeatureWorktreeUseCase);
|
|
310
307
|
container.registerSingleton(UpgradeCliUseCase);
|
|
311
|
-
container.registerSingleton(DoctorDiagnoseUseCase);
|
|
312
308
|
// Session repositories (per-AgentType string tokens)
|
|
313
309
|
container.register(`IAgentSessionRepository:${AgentType.ClaudeCode}`, {
|
|
314
310
|
useFactory: () => new ClaudeCodeSessionRepository(),
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"repository.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAe1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAW3D"}
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js
CHANGED
|
@@ -16,6 +16,7 @@ export function toDatabase(repo) {
|
|
|
16
16
|
name: repo.name,
|
|
17
17
|
path: repo.path,
|
|
18
18
|
remote_url: repo.remoteUrl ?? null,
|
|
19
|
+
spec_storage_mode: repo.specStorageMode ?? null,
|
|
19
20
|
created_at: repo.createdAt instanceof Date ? repo.createdAt.getTime() : repo.createdAt,
|
|
20
21
|
updated_at: repo.updatedAt instanceof Date ? repo.updatedAt.getTime() : repo.updatedAt,
|
|
21
22
|
deleted_at: repo.deletedAt
|
|
@@ -34,6 +35,7 @@ export function fromDatabase(row) {
|
|
|
34
35
|
name: row.name,
|
|
35
36
|
path: row.path,
|
|
36
37
|
remoteUrl: row.remote_url ?? undefined,
|
|
38
|
+
specStorageMode: row.spec_storage_mode ?? 'in-repo',
|
|
37
39
|
createdAt: new Date(row.created_at),
|
|
38
40
|
updatedAt: new Date(row.updated_at),
|
|
39
41
|
deletedAt: row.deleted_at ? new Date(row.deleted_at) : undefined,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 044: Add spec_storage_mode column to repositories table.
|
|
3
|
+
*
|
|
4
|
+
* Adds a TEXT column with DEFAULT 'in-repo' to control where new feature
|
|
5
|
+
* specs are stored: 'in-repo' (<worktree>/.shep/specs/) or 'shep-managed'
|
|
6
|
+
* (~/.shep/repos/<hash>/specs/).
|
|
7
|
+
*/
|
|
8
|
+
import type { MigrationParams } from 'umzug';
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
11
|
+
export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=044-add-spec-storage-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"044-add-spec-storage-mode.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 044: Add spec_storage_mode column to repositories table.
|
|
3
|
+
*
|
|
4
|
+
* Adds a TEXT column with DEFAULT 'in-repo' to control where new feature
|
|
5
|
+
* specs are stored: 'in-repo' (<worktree>/.shep/specs/) or 'shep-managed'
|
|
6
|
+
* (~/.shep/repos/<hash>/specs/).
|
|
7
|
+
*/
|
|
8
|
+
export async function up({ context: db }) {
|
|
9
|
+
const columns = db.pragma('table_info(repositories)');
|
|
10
|
+
const existing = new Set(columns.map((c) => c.name));
|
|
11
|
+
if (!existing.has('spec_storage_mode')) {
|
|
12
|
+
db.exec("ALTER TABLE repositories ADD COLUMN spec_storage_mode TEXT DEFAULT 'in-repo'");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function down({ context: db }) {
|
|
16
|
+
// SQLite does not support DROP COLUMN before 3.35.0.
|
|
17
|
+
// The column remains but is unused after rollback.
|
|
18
|
+
void db;
|
|
19
|
+
}
|
package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export declare class SQLiteRepositoryRepository implements IRepositoryRepository
|
|
|
16
16
|
remove(id: string): Promise<void>;
|
|
17
17
|
findByPathIncludingDeleted(path: string): Promise<Repository | null>;
|
|
18
18
|
findByRemoteUrl(url: string): Promise<Repository | null>;
|
|
19
|
-
update(id: string, fields: Partial<Pick<Repository, 'name' | 'path' | 'remoteUrl'>>): Promise<Repository>;
|
|
19
|
+
update(id: string, fields: Partial<Pick<Repository, 'name' | 'path' | 'remoteUrl' | 'specStorageMode'>>): Promise<Repository>;
|
|
20
20
|
softDelete(id: string): Promise<void>;
|
|
21
21
|
restore(id: string): Promise<void>;
|
|
22
22
|
static normalizeRemoteUrl(url: string): string;
|
package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-repository.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-repository.repository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gFAAgF,CAAC;AAC5H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAOnE,qBACa,0BAA2B,YAAW,qBAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAYnD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQpD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ7B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMpE,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IASxD,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"sqlite-repository.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-repository.repository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gFAAgF,CAAC;AAC5H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAOnE,qBACa,0BAA2B,YAAW,qBAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAYnD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQpD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ7B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMpE,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IASxD,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC,GACnF,OAAO,CAAC,UAAU,CAAC;IAmChB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG/C"}
|
|
@@ -23,8 +23,8 @@ let SQLiteRepositoryRepository = SQLiteRepositoryRepository_1 = class SQLiteRepo
|
|
|
23
23
|
async create(repository) {
|
|
24
24
|
const row = toDatabase(repository);
|
|
25
25
|
const insertStmt = this.db.prepare(`
|
|
26
|
-
INSERT OR IGNORE INTO repositories (id, name, path, created_at, updated_at)
|
|
27
|
-
VALUES (@id, @name, @path, @created_at, @updated_at)
|
|
26
|
+
INSERT OR IGNORE INTO repositories (id, name, path, spec_storage_mode, created_at, updated_at)
|
|
27
|
+
VALUES (@id, @name, @path, @spec_storage_mode, @created_at, @updated_at)
|
|
28
28
|
`);
|
|
29
29
|
insertStmt.run(row);
|
|
30
30
|
const selectStmt = this.db.prepare('SELECT * FROM repositories WHERE path = ?');
|
|
@@ -77,6 +77,10 @@ let SQLiteRepositoryRepository = SQLiteRepositoryRepository_1 = class SQLiteRepo
|
|
|
77
77
|
setClauses.push('remote_url = ?');
|
|
78
78
|
values.push(fields.remoteUrl);
|
|
79
79
|
}
|
|
80
|
+
if (fields.specStorageMode !== undefined) {
|
|
81
|
+
setClauses.push('spec_storage_mode = ?');
|
|
82
|
+
values.push(fields.specStorageMode);
|
|
83
|
+
}
|
|
80
84
|
values.push(id);
|
|
81
85
|
const stmt = this.db.prepare(`UPDATE repositories SET ${setClauses.join(', ')} WHERE id = ?`);
|
|
82
86
|
const result = stmt.run(...values);
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
* (screenshots, test outputs, terminal recordings) proving that
|
|
6
6
|
* completed tasks work as expected. Evidence files are saved to the
|
|
7
7
|
* shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
|
|
8
|
-
* is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
|
|
9
|
-
* in the worktree.
|
|
8
|
+
* is enabled, files are also committed to .shep/specs/<NNN>-<feature>/evidence/
|
|
9
|
+
* in the worktree. When the spec directory is outside the worktree
|
|
10
|
+
* (shep-managed mode), commitEvidence is forced to false since git
|
|
11
|
+
* cannot track files outside the worktree. The agent outputs a structured JSON manifest of
|
|
10
12
|
* evidence records that the evidence-output-parser extracts for the
|
|
11
13
|
* graph state.
|
|
12
14
|
*/
|
|
@@ -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
|
|
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;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA0NR;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CAsBR"}
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
* (screenshots, test outputs, terminal recordings) proving that
|
|
6
6
|
* completed tasks work as expected. Evidence files are saved to the
|
|
7
7
|
* shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
|
|
8
|
-
* is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
|
|
9
|
-
* in the worktree.
|
|
8
|
+
* is enabled, files are also committed to .shep/specs/<NNN>-<feature>/evidence/
|
|
9
|
+
* in the worktree. When the spec directory is outside the worktree
|
|
10
|
+
* (shep-managed mode), commitEvidence is forced to false since git
|
|
11
|
+
* cannot track files outside the worktree. The agent outputs a structured JSON manifest of
|
|
10
12
|
* evidence records that the evidence-output-parser extracts for the
|
|
11
13
|
* graph state.
|
|
12
14
|
*/
|
|
@@ -45,7 +47,12 @@ ${tasksContent}
|
|
|
45
47
|
const relativeSpecDir = relative(cwd, state.specDir).replaceAll('\\', '/');
|
|
46
48
|
const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
|
|
47
49
|
const specEvidenceAbsPath = join(state.specDir, 'evidence').replaceAll('\\', '/');
|
|
48
|
-
|
|
50
|
+
// When specDir is outside the worktree (shep-managed mode), force commitEvidence=false.
|
|
51
|
+
// In shep-managed mode, relative() produces paths starting with '..' which escape
|
|
52
|
+
// the worktree boundary, making git operations invalid.
|
|
53
|
+
const isSpecDirOutsideWorktree = relativeSpecDir.startsWith('..');
|
|
54
|
+
const effectiveCommitEvidence = isSpecDirOutsideWorktree ? false : options.commitEvidence;
|
|
55
|
+
const storageSection = effectiveCommitEvidence
|
|
49
56
|
? `## Evidence Storage
|
|
50
57
|
|
|
51
58
|
Save all evidence files to BOTH locations:
|
|
@@ -67,7 +74,7 @@ Save all evidence files to the shep home folder:
|
|
|
67
74
|
1. Create the directory if it does not exist: \`mkdir -p ${shepEvidenceDir}/\`
|
|
68
75
|
2. Save each evidence file with a descriptive name (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
|
|
69
76
|
3. In the output JSON, set relativePath to the absolute path in the shep home folder (e.g., \`${shepEvidenceDir}/homepage-screenshot.png\`)`;
|
|
70
|
-
const commitSection =
|
|
77
|
+
const commitSection = effectiveCommitEvidence
|
|
71
78
|
? `\n${buildCommitPushBlock({
|
|
72
79
|
push: state.push,
|
|
73
80
|
files: [`${specEvidenceRelPath}/`],
|
|
@@ -79,7 +86,7 @@ Do NOT commit or push any evidence files. Evidence is stored locally only.
|
|
|
79
86
|
However, if you make code fixes during evidence collection, those fixes MUST be committed (see "Handling Code Fixes" above).`;
|
|
80
87
|
return `You are a senior software engineer performing the EVIDENCE COLLECTION phase of feature development.
|
|
81
88
|
|
|
82
|
-
Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${
|
|
89
|
+
Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${effectiveCommitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
|
|
83
90
|
|
|
84
91
|
${specSection}
|
|
85
92
|
${tasksSection}
|
|
@@ -175,14 +182,14 @@ After capturing all evidence, output a JSON array of evidence records in a fence
|
|
|
175
182
|
"type": "Screenshot",
|
|
176
183
|
"capturedAt": "2026-01-01T12:00:00Z",
|
|
177
184
|
"description": "Homepage showing new feature banner",
|
|
178
|
-
"relativePath": "${
|
|
185
|
+
"relativePath": "${effectiveCommitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
|
|
179
186
|
"taskRef": "task-1"
|
|
180
187
|
},
|
|
181
188
|
{
|
|
182
189
|
"type": "TestOutput",
|
|
183
190
|
"capturedAt": "2026-01-01T12:01:00Z",
|
|
184
191
|
"description": "Unit test results — all 42 tests passing",
|
|
185
|
-
"relativePath": "${
|
|
192
|
+
"relativePath": "${effectiveCommitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
|
|
186
193
|
"taskRef": "task-2"
|
|
187
194
|
}
|
|
188
195
|
]
|
|
@@ -192,7 +199,7 @@ Each evidence record must have:
|
|
|
192
199
|
- **type**: One of Screenshot, Video, TestOutput, TerminalRecording
|
|
193
200
|
- **capturedAt**: ISO 8601 timestamp of when the evidence was captured
|
|
194
201
|
- **description**: Human-readable description of what this evidence proves
|
|
195
|
-
- **relativePath**: ${
|
|
202
|
+
- **relativePath**: ${effectiveCommitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
|
|
196
203
|
- **taskRef**: (optional) Reference to the task ID this evidence proves
|
|
197
204
|
|
|
198
205
|
If no evidence can be captured (e.g., no UI to screenshot, no tests to run), output an empty JSON array:
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* checks, repository listing, cloning (with progress streaming), and URL parsing.
|
|
6
6
|
*/
|
|
7
7
|
import type { ExecFunction } from '../git/worktree.service.js';
|
|
8
|
-
import type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl
|
|
8
|
+
import type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
9
9
|
export declare class GitHubRepositoryService implements IGitHubRepositoryService {
|
|
10
10
|
private readonly execFile;
|
|
11
11
|
constructor(execFile: ExecFunction);
|
|
@@ -13,8 +13,6 @@ export declare class GitHubRepositoryService implements IGitHubRepositoryService
|
|
|
13
13
|
listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
|
|
14
14
|
cloneRepository(nameWithOwner: string, destination: string, options?: CloneOptions): Promise<void>;
|
|
15
15
|
parseGitHubUrl(url: string): ParsedGitHubUrl;
|
|
16
|
-
checkPushAccess(repoNameWithOwner: string): Promise<boolean>;
|
|
17
|
-
forkRepository(repoNameWithOwner: string): Promise<ForkResult>;
|
|
18
16
|
private cleanupPartialClone;
|
|
19
17
|
}
|
|
20
18
|
//# sourceMappingURL=github-repository.service.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,EAChB,MAAM,mFAAmF,CAAC;AAwB3F,qBACa,uBAAwB,YAAW,wBAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAsClF,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAgDhB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;YA2C9B,mBAAmB;CAOlC"}
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js
CHANGED
|
@@ -20,7 +20,7 @@ import { injectable, inject } from 'tsyringe';
|
|
|
20
20
|
import { resolve, normalize } from 'node:path';
|
|
21
21
|
import { rm } from 'node:fs/promises';
|
|
22
22
|
import { spawn } from 'node:child_process';
|
|
23
|
-
import { GitHubAuthError, GitHubCloneError,
|
|
23
|
+
import { GitHubAuthError, GitHubCloneError, GitHubRepoListError, GitHubUrlParseError, } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
// URL regex patterns
|
|
26
26
|
// ---------------------------------------------------------------------------
|
|
@@ -154,42 +154,6 @@ let GitHubRepositoryService = class GitHubRepositoryService {
|
|
|
154
154
|
'Supported formats: https://github.com/owner/repo, ' +
|
|
155
155
|
'git@github.com:owner/repo.git, or owner/repo shorthand.');
|
|
156
156
|
}
|
|
157
|
-
async checkPushAccess(repoNameWithOwner) {
|
|
158
|
-
try {
|
|
159
|
-
const { stdout } = await this.execFile('gh', [
|
|
160
|
-
'api',
|
|
161
|
-
`repos/${repoNameWithOwner}`,
|
|
162
|
-
'--jq',
|
|
163
|
-
'.permissions.push',
|
|
164
|
-
]);
|
|
165
|
-
return stdout.trim() === 'true';
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
// Safe fallback: assume no push access on any error (NFR-9)
|
|
169
|
-
return false;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
async forkRepository(repoNameWithOwner) {
|
|
173
|
-
try {
|
|
174
|
-
const { stdout } = await this.execFile('gh', [
|
|
175
|
-
'repo',
|
|
176
|
-
'fork',
|
|
177
|
-
repoNameWithOwner,
|
|
178
|
-
'--clone=false',
|
|
179
|
-
'--json',
|
|
180
|
-
'nameWithOwner,url',
|
|
181
|
-
]);
|
|
182
|
-
const parsed = JSON.parse(stdout);
|
|
183
|
-
return {
|
|
184
|
-
nameWithOwner: parsed.nameWithOwner,
|
|
185
|
-
cloneUrl: parsed.url.endsWith('.git') ? parsed.url : `${parsed.url}.git`,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
catch (error) {
|
|
189
|
-
const cause = error instanceof Error ? error : undefined;
|
|
190
|
-
throw new GitHubForkError(`Failed to fork ${repoNameWithOwner}: ${cause?.message ?? String(error)}`, cause);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
157
|
async cleanupPartialClone(destination) {
|
|
194
158
|
try {
|
|
195
159
|
await rm(destination, { recursive: true, force: true });
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository Hash Utility
|
|
3
|
+
*
|
|
4
|
+
* Computes a deterministic hash prefix from a repository path.
|
|
5
|
+
* Used to create unique per-repo directories under ~/.shep/repos/<hash>/.
|
|
6
|
+
*
|
|
7
|
+
* Normalizes path separators before hashing so the same repository
|
|
8
|
+
* produces the same hash on both Unix and Windows.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Compute a 16-character hex hash prefix for a repository path.
|
|
12
|
+
*
|
|
13
|
+
* @param repoPath - Absolute path to the repository root
|
|
14
|
+
* @returns First 16 hex characters of the SHA-256 hash
|
|
15
|
+
*/
|
|
16
|
+
export declare function computeRepoHash(repoPath: string): string;
|
|
17
|
+
//# sourceMappingURL=repo-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-hash.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/repo-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository Hash Utility
|
|
3
|
+
*
|
|
4
|
+
* Computes a deterministic hash prefix from a repository path.
|
|
5
|
+
* Used to create unique per-repo directories under ~/.shep/repos/<hash>/.
|
|
6
|
+
*
|
|
7
|
+
* Normalizes path separators before hashing so the same repository
|
|
8
|
+
* produces the same hash on both Unix and Windows.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
11
|
+
/**
|
|
12
|
+
* Compute a 16-character hex hash prefix for a repository path.
|
|
13
|
+
*
|
|
14
|
+
* @param repoPath - Absolute path to the repository root
|
|
15
|
+
* @returns First 16 hex characters of the SHA-256 hash
|
|
16
|
+
*/
|
|
17
|
+
export function computeRepoHash(repoPath) {
|
|
18
|
+
// Normalize separators before hashing so C:\foo and C:/foo produce the same hash
|
|
19
|
+
const normalizedRepoPath = repoPath.replace(/\\/g, '/');
|
|
20
|
+
return createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
|
|
21
|
+
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Uses constructor dependency injection for the command executor.
|
|
6
6
|
*/
|
|
7
7
|
import type { IGitPrService } from '../../../application/ports/output/services/git-pr-service.interface.js';
|
|
8
|
-
import type { CiStatusResult, DiffSummary, FileDiff, MergeStrategy,
|
|
8
|
+
import type { CiStatusResult, DiffSummary, FileDiff, MergeStrategy, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
|
|
9
9
|
import type { ExecFunction } from './worktree.service.js';
|
|
10
10
|
export declare class GitPrService implements IGitPrService {
|
|
11
11
|
private readonly execFile;
|
|
@@ -18,7 +18,6 @@ export declare class GitPrService implements IGitPrService {
|
|
|
18
18
|
commitAll(cwd: string, message: string): Promise<string>;
|
|
19
19
|
push(cwd: string, branch: string, setUpstream?: boolean): Promise<void>;
|
|
20
20
|
createPr(cwd: string, prYamlPath: string): Promise<PrCreateResult>;
|
|
21
|
-
createPrFromArgs(cwd: string, args: PrCreateArgs): Promise<PrCreateResult>;
|
|
22
21
|
mergePr(cwd: string, prNumber: number, strategy?: MergeStrategy): Promise<void>;
|
|
23
22
|
private getPrHeadBranch;
|
|
24
23
|
localMergeSquash(cwd: string, featureBranch: string, baseBranch: string, commitMessage: string, hasRemote?: boolean): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAUhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKnD,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;YA6BjF,eAAe;IASvB,gBAAgB,CACpB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,UAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;IA4EV,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,CAAC;IAiEpB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAaxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IAmFf,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCpD,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAc/E,WAAW,CACf,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC;IA6CnB;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,GACnB,OAAO,CAAC,MAAM,CAAC;IAWlB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -184,27 +184,6 @@ let GitPrService = class GitPrService {
|
|
|
184
184
|
throw this.parseGhError(error);
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
|
-
async createPrFromArgs(cwd, args) {
|
|
188
|
-
try {
|
|
189
|
-
const ghArgs = ['pr', 'create', '--title', args.title, '--body', args.body];
|
|
190
|
-
if (args.base) {
|
|
191
|
-
ghArgs.push('--base', args.base);
|
|
192
|
-
}
|
|
193
|
-
if (args.labels?.length) {
|
|
194
|
-
ghArgs.push('--label', args.labels.join(','));
|
|
195
|
-
}
|
|
196
|
-
if (args.repo) {
|
|
197
|
-
ghArgs.push('--repo', args.repo);
|
|
198
|
-
}
|
|
199
|
-
const { stdout } = await this.execFile('gh', ghArgs, { cwd });
|
|
200
|
-
const url = stdout.trim();
|
|
201
|
-
const number = this.parsePrNumberFromUrl(url);
|
|
202
|
-
return { url, number };
|
|
203
|
-
}
|
|
204
|
-
catch (error) {
|
|
205
|
-
throw this.parseGhError(error);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
187
|
async mergePr(cwd, prNumber, strategy = 'squash') {
|
|
209
188
|
try {
|
|
210
189
|
await this.execFile('gh', ['pr', 'merge', String(prNumber), `--${strategy}`], {
|
|
@@ -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;AAQlF;;;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,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB1F,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,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,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBjD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;
|
|
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;AAQlF;;;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,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB1F,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,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,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBjD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1D,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"}
|
|
@@ -17,10 +17,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
17
17
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
18
18
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
19
19
|
};
|
|
20
|
-
import { createHash } from 'node:crypto';
|
|
21
20
|
import { mkdirSync, realpathSync } from 'node:fs';
|
|
22
21
|
import path from 'node:path';
|
|
23
22
|
import { injectable, inject } from 'tsyringe';
|
|
23
|
+
import { computeRepoHash } from '../filesystem/repo-hash.js';
|
|
24
24
|
const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
|
|
25
25
|
const GIT_AUTO_INIT_EMAIL = 'bot@shep.bot';
|
|
26
26
|
import { WorktreeError, WorktreeErrorCode, } from '../../../application/ports/output/services/worktree-service.interface.js';
|
|
@@ -178,9 +178,7 @@ let WorktreeService = class WorktreeService {
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
getWorktreePath(repoPath, branch) {
|
|
181
|
-
|
|
182
|
-
const normalizedRepoPath = repoPath.replace(/\\/g, '/');
|
|
183
|
-
const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
|
|
181
|
+
const repoHash = computeRepoHash(repoPath);
|
|
184
182
|
const slug = branch.replace(/\//g, '-');
|
|
185
183
|
return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
|
|
186
184
|
}
|
package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute-worktree-path.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"compute-worktree-path.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI5E"}
|
package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Path format: ~/.shep/repos/<sha256-hash-prefix>/wt/<branch-slug>
|
|
8
8
|
*/
|
|
9
|
-
import { createHash } from 'node:crypto';
|
|
10
9
|
import { join } from 'node:path';
|
|
11
10
|
import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
|
|
11
|
+
import { computeRepoHash } from '../filesystem/repo-hash.js';
|
|
12
12
|
/**
|
|
13
13
|
* Compute the worktree path for a given repository and branch.
|
|
14
14
|
*
|
|
@@ -17,9 +17,7 @@ import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
|
|
|
17
17
|
* @returns Absolute path to the worktree directory under ~/.shep/repos/
|
|
18
18
|
*/
|
|
19
19
|
export function computeWorktreePath(repoPath, branch) {
|
|
20
|
-
|
|
21
|
-
const normalizedRepoPath = repoPath.replace(/\\/g, '/');
|
|
22
|
-
const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
|
|
20
|
+
const repoHash = computeRepoHash(repoPath);
|
|
23
21
|
const slug = branch.replace(/\//g, '-');
|
|
24
22
|
return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
|
|
25
23
|
}
|
|
@@ -5,13 +5,27 @@
|
|
|
5
5
|
* Templates match exactly what /shep-kit:new-feature produces,
|
|
6
6
|
* enabling dogfooding — the CLI and the skill use the same spec format.
|
|
7
7
|
*/
|
|
8
|
-
import type { ISpecInitializerService, SpecInitializerResult } from '../../../application/ports/output/services/spec-initializer.interface.js';
|
|
8
|
+
import type { ISpecInitializerService, SpecInitializerOptions, SpecInitializerResult } from '../../../application/ports/output/services/spec-initializer.interface.js';
|
|
9
9
|
export declare class SpecInitializerService implements ISpecInitializerService {
|
|
10
|
-
initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast'): Promise<SpecInitializerResult>;
|
|
10
|
+
initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast', options?: SpecInitializerOptions): Promise<SpecInitializerResult>;
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Compute the spec directory path based on storage mode.
|
|
13
|
+
*/
|
|
14
|
+
private computeSpecDir;
|
|
15
|
+
/**
|
|
16
|
+
* Scan spec directories for existing NNN-* entries and return the next available number.
|
|
17
|
+
* Scans up to 3 locations to prevent collisions during the transition period:
|
|
18
|
+
* 1. specs/ (legacy location)
|
|
19
|
+
* 2. .shep/specs/ (new in-repo location)
|
|
20
|
+
* 3. ~/.shep/repos/<hash>/specs/ (shep-managed location, when repositoryPath provided)
|
|
21
|
+
*
|
|
13
22
|
* Uses the DB-derived hint as a minimum, but always respects filesystem state.
|
|
14
23
|
*/
|
|
15
24
|
private resolveNextNumber;
|
|
25
|
+
/**
|
|
26
|
+
* Scan a single directory for NNN-* prefixed entries and return the max number found.
|
|
27
|
+
* Returns 0 if the directory does not exist or is empty.
|
|
28
|
+
*/
|
|
29
|
+
private scanDirForMaxNumber;
|
|
16
30
|
}
|
|
17
31
|
//# sourceMappingURL=spec-initializer.service.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-initializer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/spec/spec-initializer.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,mEAAmE,CAAC;
|
|
1
|
+
{"version":3,"file":"spec-initializer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/spec/spec-initializer.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,mEAAmE,CAAC;AAgQ3E,qBAAa,sBAAuB,YAAW,uBAAuB;IAC9D,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IAgDjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;;;;;;OAQG;YACW,iBAAiB;IAqB/B;;;OAGG;YACW,mBAAmB;CAiBlC"}
|