@shepai/cli 1.135.2-pr439.e1871c8 → 1.135.2-pr440.e97f691
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/json-schema/Feature.yaml +3 -0
- package/apis/json-schema/Repository.yaml +0 -3
- package/apis/json-schema/SdlcLifecycle.yaml +1 -0
- 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/feature-repository.interface.d.ts +2 -0
- package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.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/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +5 -21
- 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/archive-feature.use-case.d.ts +20 -0
- package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +74 -0
- 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 +2 -8
- package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts +20 -0
- package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.js +65 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +6 -5
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +1 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +10 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +0 -1
- 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 +0 -2
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.js +16 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +7 -2
- 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 +2 -6
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +2 -4
- 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 +8 -15
- 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 +4 -2
- 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 +4 -2
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +3 -17
- 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 +13 -49
- package/dist/src/presentation/cli/commands/feat/archive.command.d.ts +18 -0
- package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/feat/archive.command.js +54 -0
- package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/index.js +5 -1
- package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/ls.command.js +5 -0
- package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts +17 -0
- package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/feat/unarchive.command.js +42 -0
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +6 -1
- package/dist/src/presentation/web/app/actions/archive-feature.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/archive-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/archive-feature.js +16 -0
- package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/unarchive-feature.js +16 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +11 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +22 -6
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +5 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +75 -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 +13 -4
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +6 -0
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +70 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +6 -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 +43 -2
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +17 -2
- package/dist/src/presentation/web/lib/derive-graph.d.ts +4 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +12 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +78 -48
- 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 +78 -48
- 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 +90 -60
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +90 -60
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +74 -44
- 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 +78 -48
- 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 +90 -60
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +90 -60
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +74 -44
- 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 +74 -44
- 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/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +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.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b731076a.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b731076a.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_edb1ed93.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_edb1ed93.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9b4d65a0.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9b4d65a0.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__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]__3f6cd19e._.js → [root-of-the-server]__78a7fcc9._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__3f6cd19e._.js.map → [root-of-the-server]__78a7fcc9._.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]__6c83fbec._.js → [root-of-the-server]__8fbe6424._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2096f24f._.js.map → [root-of-the-server]__8fbe6424._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__2096f24f._.js → [root-of-the-server]__960623da._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a13f3ed8._.js.map → [root-of-the-server]__960623da._.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 +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]__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]__a13f3ed8._.js → [root-of-the-server]__c3bd3892._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__6c83fbec._.js.map → [root-of-the-server]__c3bd3892._.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/{_c5a0904f._.js → _4fce23fd._.js} +2 -2
- package/web/.next/server/chunks/ssr/_4fce23fd._.js.map +1 -0
- 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/_b6960ca0._.js +2 -2
- package/web/.next/server/chunks/ssr/_b6960ca0._.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/_f18353a1._.js +3 -0
- package/web/.next/server/chunks/ssr/{_c80f0ee4._.js.map → _f18353a1._.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_5cbfa9c3._.js → src_presentation_web_5a474643._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_5cbfa9c3._.js.map → src_presentation_web_5a474643._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_820d7c79._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_8e7fe0d1._.js.map → src_presentation_web_820d7c79._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_005499f7.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_005499f7.js.map +1 -0
- 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_a1a382f3._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_b9023017._.js.map → src_presentation_web_a1a382f3._.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_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 +452 -296
- package/web/.next/static/chunks/09db7c74857d727e.js +1 -0
- package/web/.next/static/chunks/0f1221daf6a27f15.css +1 -0
- package/web/.next/static/chunks/{d4ea4340c78d8fe8.js → 14c5d3477ab30cbd.js} +1 -1
- package/web/.next/static/chunks/{9cde06b0bf7f313d.js → 16557147753ecd97.js} +2 -2
- package/web/.next/static/chunks/{32a0eb00cc8f57a5.js → 381674b7016bfe2d.js} +1 -1
- package/web/.next/static/chunks/{6cf053583d146b73.js → 3dbb95c2df37cd69.js} +1 -1
- package/web/.next/static/chunks/42d4cfca94db8f3a.js +1 -0
- package/web/.next/static/chunks/458c2a7ea153c3f0.js +2 -0
- package/web/.next/static/chunks/5e2a1042deae63bc.js +1 -0
- package/web/.next/static/chunks/{9a53c38c866d6fd6.js → 83fe7a19db594510.js} +1 -1
- package/web/.next/static/chunks/{dca377b2a0726988.js → 8be41bcbf3d0a5b2.js} +1 -1
- package/web/.next/static/chunks/{7eb6cae52a1a3747.js → bd2735ffbb5a405f.js} +1 -1
- package/web/.next/static/chunks/d7317df625d1f4bc.js +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts +0 -12
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.js +0 -19
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts +0 -17
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.js +0 -21
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c5a0904f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c80f0ee4._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
- package/web/.next/static/chunks/0f7a03924ffe9201.js +0 -1
- package/web/.next/static/chunks/290b9ee95370f3e6.js +0 -2
- package/web/.next/static/chunks/3e2d7d07926b05bf.css +0 -1
- package/web/.next/static/chunks/47151663050b874d.js +0 -1
- package/web/.next/static/chunks/6472785bb556ec8a.js +0 -1
- package/web/.next/static/chunks/769db91c3a32cb62.js +0 -1
- /package/web/.next/static/{joXWxy8xjQS31B-KrKQy2 → lRiUQJLpOuDbBG06Veg7i}/_buildManifest.js +0 -0
- /package/web/.next/static/{joXWxy8xjQS31B-KrKQy2 → lRiUQJLpOuDbBG06Veg7i}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{joXWxy8xjQS31B-KrKQy2 → lRiUQJLpOuDbBG06Veg7i}/_ssgManifest.js +0 -0
|
@@ -83,6 +83,8 @@ import { ListGitHubRepositoriesUseCase } from '../../application/use-cases/repos
|
|
|
83
83
|
import { CheckAndUnblockFeaturesUseCase } from '../../application/use-cases/features/check-and-unblock-features.use-case.js';
|
|
84
84
|
import { UpdateFeatureLifecycleUseCase } from '../../application/use-cases/features/update/update-feature-lifecycle.use-case.js';
|
|
85
85
|
import { CleanupFeatureWorktreeUseCase } from '../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
|
|
86
|
+
import { ArchiveFeatureUseCase } from '../../application/use-cases/features/archive-feature.use-case.js';
|
|
87
|
+
import { UnarchiveFeatureUseCase } from '../../application/use-cases/features/unarchive-feature.use-case.js';
|
|
86
88
|
import { UpgradeCliUseCase } from '../../application/use-cases/upgrade/upgrade-cli.use-case.js';
|
|
87
89
|
// Session listing
|
|
88
90
|
import { ClaudeCodeSessionRepository } from '../services/agents/sessions/claude-code-session.repository.js';
|
|
@@ -304,6 +306,8 @@ export async function initializeContainer() {
|
|
|
304
306
|
container.registerSingleton(CheckAndUnblockFeaturesUseCase);
|
|
305
307
|
container.registerSingleton(UpdateFeatureLifecycleUseCase);
|
|
306
308
|
container.registerSingleton(CleanupFeatureWorktreeUseCase);
|
|
309
|
+
container.registerSingleton(ArchiveFeatureUseCase);
|
|
310
|
+
container.registerSingleton(UnarchiveFeatureUseCase);
|
|
307
311
|
container.registerSingleton(UpgradeCliUseCase);
|
|
308
312
|
// Session repositories (per-AgentType string tokens)
|
|
309
313
|
container.register(`IAgentSessionRepository:${AgentType.ClaudeCode}`, {
|
|
@@ -401,6 +405,12 @@ export async function initializeContainer() {
|
|
|
401
405
|
container.register('CleanupFeatureWorktreeUseCase', {
|
|
402
406
|
useFactory: (c) => c.resolve(CleanupFeatureWorktreeUseCase),
|
|
403
407
|
});
|
|
408
|
+
container.register('ArchiveFeatureUseCase', {
|
|
409
|
+
useFactory: (c) => c.resolve(ArchiveFeatureUseCase),
|
|
410
|
+
});
|
|
411
|
+
container.register('UnarchiveFeatureUseCase', {
|
|
412
|
+
useFactory: (c) => c.resolve(UnarchiveFeatureUseCase),
|
|
413
|
+
});
|
|
404
414
|
container.register('UpgradeCliUseCase', {
|
|
405
415
|
useFactory: (c) => c.resolve(UpgradeCliUseCase),
|
|
406
416
|
});
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"feature.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAkDvD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAsDrD"}
|
|
@@ -58,6 +58,8 @@ export function toDatabase(feature) {
|
|
|
58
58
|
pr_mergeable: feature.pr?.mergeable !== undefined ? (feature.pr.mergeable ? 1 : 0) : null,
|
|
59
59
|
// Feature dependency
|
|
60
60
|
parent_id: feature.parentId ?? null,
|
|
61
|
+
// Archive state
|
|
62
|
+
previous_lifecycle: feature.previousLifecycle ?? null,
|
|
61
63
|
// User attachments
|
|
62
64
|
attachments: JSON.stringify((feature.attachments ?? []).map((a) => ({ ...a, size: Number(a.size) }))),
|
|
63
65
|
// Soft delete
|
|
@@ -118,6 +120,10 @@ export function fromDatabase(row) {
|
|
|
118
120
|
}),
|
|
119
121
|
// Feature dependency
|
|
120
122
|
...(row.parent_id != null && { parentId: row.parent_id }),
|
|
123
|
+
// Archive state
|
|
124
|
+
...(row.previous_lifecycle != null && {
|
|
125
|
+
previousLifecycle: row.previous_lifecycle,
|
|
126
|
+
}),
|
|
121
127
|
// User attachments
|
|
122
128
|
attachments: JSON.parse(row.attachments ?? '[]'),
|
|
123
129
|
// Soft delete
|
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,
|
|
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,CAc1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAU3D"}
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js
CHANGED
|
@@ -16,7 +16,6 @@ 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,
|
|
20
19
|
created_at: repo.createdAt instanceof Date ? repo.createdAt.getTime() : repo.createdAt,
|
|
21
20
|
updated_at: repo.updatedAt instanceof Date ? repo.updatedAt.getTime() : repo.updatedAt,
|
|
22
21
|
deleted_at: repo.deletedAt
|
|
@@ -35,7 +34,6 @@ export function fromDatabase(row) {
|
|
|
35
34
|
name: row.name,
|
|
36
35
|
path: row.path,
|
|
37
36
|
remoteUrl: row.remote_url ?? undefined,
|
|
38
|
-
specStorageMode: row.spec_storage_mode ?? 'in-repo',
|
|
39
37
|
createdAt: new Date(row.created_at),
|
|
40
38
|
updatedAt: new Date(row.updated_at),
|
|
41
39
|
deletedAt: row.deleted_at ? new Date(row.deleted_at) : undefined,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 044: Add previous_lifecycle column to features table.
|
|
3
|
+
*
|
|
4
|
+
* Stores the lifecycle state prior to archiving so it can be restored
|
|
5
|
+
* when a feature is unarchived. Nullable TEXT — only populated when
|
|
6
|
+
* the feature lifecycle is Archived.
|
|
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-previous-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"044-add-previous-lifecycle.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.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,CAK3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 044: Add previous_lifecycle column to features table.
|
|
3
|
+
*
|
|
4
|
+
* Stores the lifecycle state prior to archiving so it can be restored
|
|
5
|
+
* when a feature is unarchived. Nullable TEXT — only populated when
|
|
6
|
+
* the feature lifecycle is Archived.
|
|
7
|
+
*/
|
|
8
|
+
export async function up({ context: db }) {
|
|
9
|
+
const columns = db.pragma('table_info(features)');
|
|
10
|
+
if (!columns.some((c) => c.name === 'previous_lifecycle')) {
|
|
11
|
+
db.exec('ALTER TABLE features ADD COLUMN previous_lifecycle TEXT');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function down({ context: db }) {
|
|
15
|
+
void db;
|
|
16
|
+
}
|
package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-feature.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-feature.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6EAA6E,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE;;;GAGG;AACH,qBACa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAazE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAa7E,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-feature.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-feature.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6EAA6E,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE;;;GAGG;AACH,qBACa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAazE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAa7E,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8BtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5C"}
|
|
@@ -36,7 +36,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
|
|
|
36
36
|
push, open_pr, auto_merge, allow_prd, allow_plan, allow_merge,
|
|
37
37
|
pr_url, pr_number, pr_status, commit_hash, ci_status,
|
|
38
38
|
ci_fix_attempts, ci_fix_history, pr_mergeable,
|
|
39
|
-
parent_id,
|
|
39
|
+
parent_id, previous_lifecycle,
|
|
40
40
|
created_at, updated_at
|
|
41
41
|
) VALUES (
|
|
42
42
|
@id, @name, @slug, @description, @user_query, @repository_path, @branch,
|
|
@@ -46,7 +46,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
|
|
|
46
46
|
@push, @open_pr, @auto_merge, @allow_prd, @allow_plan, @allow_merge,
|
|
47
47
|
@pr_url, @pr_number, @pr_status, @commit_hash, @ci_status,
|
|
48
48
|
@ci_fix_attempts, @ci_fix_history, @pr_mergeable,
|
|
49
|
-
@parent_id,
|
|
49
|
+
@parent_id, @previous_lifecycle,
|
|
50
50
|
@created_at, @updated_at
|
|
51
51
|
)
|
|
52
52
|
`);
|
|
@@ -92,6 +92,10 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
|
|
|
92
92
|
if (!filters?.includeDeleted) {
|
|
93
93
|
conditions.push('deleted_at IS NULL');
|
|
94
94
|
}
|
|
95
|
+
if (!filters?.includeArchived && !filters?.lifecycle) {
|
|
96
|
+
conditions.push('lifecycle != ?');
|
|
97
|
+
params.push('Archived');
|
|
98
|
+
}
|
|
95
99
|
if (filters?.repositoryPath) {
|
|
96
100
|
conditions.push("REPLACE(repository_path, '\\', '/') = ?");
|
|
97
101
|
params.push(filters.repositoryPath.replace(/\\/g, '/'));
|
|
@@ -142,6 +146,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
|
|
|
142
146
|
ci_fix_history = @ci_fix_history,
|
|
143
147
|
pr_mergeable = @pr_mergeable,
|
|
144
148
|
parent_id = @parent_id,
|
|
149
|
+
previous_lifecycle = @previous_lifecycle,
|
|
145
150
|
deleted_at = @deleted_at,
|
|
146
151
|
updated_at = @updated_at
|
|
147
152
|
WHERE id = @id
|
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'
|
|
19
|
+
update(id: string, fields: Partial<Pick<Repository, 'name' | 'path' | 'remoteUrl'>>): 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,
|
|
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,GAC/D,OAAO,CAAC,UAAU,CAAC;IA+BhB,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,
|
|
27
|
-
VALUES (@id, @name, @path, @
|
|
26
|
+
INSERT OR IGNORE INTO repositories (id, name, path, created_at, updated_at)
|
|
27
|
+
VALUES (@id, @name, @path, @created_at, @updated_at)
|
|
28
28
|
`);
|
|
29
29
|
insertStmt.run(row);
|
|
30
30
|
const selectStmt = this.db.prepare('SELECT * FROM repositories WHERE path = ?');
|
|
@@ -77,10 +77,6 @@ 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
|
-
}
|
|
84
80
|
values.push(id);
|
|
85
81
|
const stmt = this.db.prepare(`UPDATE repositories SET ${setClauses.join(', ')} WHERE id = ?`);
|
|
86
82
|
const result = stmt.run(...values);
|
|
@@ -5,10 +5,8 @@
|
|
|
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
|
|
9
|
-
* in 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
|
|
8
|
+
* is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
|
|
9
|
+
* in the worktree. The agent outputs a structured JSON manifest of
|
|
12
10
|
* evidence records that the evidence-output-parser extracts for the
|
|
13
11
|
* graph state.
|
|
14
12
|
*/
|
|
@@ -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;;;;;;;;;;;GAWG;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,CAoNR;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CAsBR"}
|
|
@@ -5,10 +5,8 @@
|
|
|
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
|
|
9
|
-
* in 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
|
|
8
|
+
* is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
|
|
9
|
+
* in the worktree. The agent outputs a structured JSON manifest of
|
|
12
10
|
* evidence records that the evidence-output-parser extracts for the
|
|
13
11
|
* graph state.
|
|
14
12
|
*/
|
|
@@ -47,12 +45,7 @@ ${tasksContent}
|
|
|
47
45
|
const relativeSpecDir = relative(cwd, state.specDir).replaceAll('\\', '/');
|
|
48
46
|
const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
|
|
49
47
|
const specEvidenceAbsPath = join(state.specDir, 'evidence').replaceAll('\\', '/');
|
|
50
|
-
|
|
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
|
|
48
|
+
const storageSection = options.commitEvidence
|
|
56
49
|
? `## Evidence Storage
|
|
57
50
|
|
|
58
51
|
Save all evidence files to BOTH locations:
|
|
@@ -74,7 +67,7 @@ Save all evidence files to the shep home folder:
|
|
|
74
67
|
1. Create the directory if it does not exist: \`mkdir -p ${shepEvidenceDir}/\`
|
|
75
68
|
2. Save each evidence file with a descriptive name (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
|
|
76
69
|
3. In the output JSON, set relativePath to the absolute path in the shep home folder (e.g., \`${shepEvidenceDir}/homepage-screenshot.png\`)`;
|
|
77
|
-
const commitSection =
|
|
70
|
+
const commitSection = options.commitEvidence
|
|
78
71
|
? `\n${buildCommitPushBlock({
|
|
79
72
|
push: state.push,
|
|
80
73
|
files: [`${specEvidenceRelPath}/`],
|
|
@@ -86,7 +79,7 @@ Do NOT commit or push any evidence files. Evidence is stored locally only.
|
|
|
86
79
|
However, if you make code fixes during evidence collection, those fixes MUST be committed (see "Handling Code Fixes" above).`;
|
|
87
80
|
return `You are a senior software engineer performing the EVIDENCE COLLECTION phase of feature development.
|
|
88
81
|
|
|
89
|
-
Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${
|
|
82
|
+
Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${options.commitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
|
|
90
83
|
|
|
91
84
|
${specSection}
|
|
92
85
|
${tasksSection}
|
|
@@ -182,14 +175,14 @@ After capturing all evidence, output a JSON array of evidence records in a fence
|
|
|
182
175
|
"type": "Screenshot",
|
|
183
176
|
"capturedAt": "2026-01-01T12:00:00Z",
|
|
184
177
|
"description": "Homepage showing new feature banner",
|
|
185
|
-
"relativePath": "${
|
|
178
|
+
"relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
|
|
186
179
|
"taskRef": "task-1"
|
|
187
180
|
},
|
|
188
181
|
{
|
|
189
182
|
"type": "TestOutput",
|
|
190
183
|
"capturedAt": "2026-01-01T12:01:00Z",
|
|
191
184
|
"description": "Unit test results — all 42 tests passing",
|
|
192
|
-
"relativePath": "${
|
|
185
|
+
"relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
|
|
193
186
|
"taskRef": "task-2"
|
|
194
187
|
}
|
|
195
188
|
]
|
|
@@ -199,7 +192,7 @@ Each evidence record must have:
|
|
|
199
192
|
- **type**: One of Screenshot, Video, TestOutput, TerminalRecording
|
|
200
193
|
- **capturedAt**: ISO 8601 timestamp of when the evidence was captured
|
|
201
194
|
- **description**: Human-readable description of what this evidence proves
|
|
202
|
-
- **relativePath**: ${
|
|
195
|
+
- **relativePath**: ${options.commitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
|
|
203
196
|
- **taskRef**: (optional) Reference to the task ID this evidence proves
|
|
204
197
|
|
|
205
198
|
If no evidence can be captured (e.g., no UI to screenshot, no tests to run), output an empty JSON array:
|
|
@@ -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;IAQzD,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';
|
|
20
21
|
import { mkdirSync, realpathSync } from 'node:fs';
|
|
21
22
|
import path from 'node:path';
|
|
22
23
|
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,7 +178,9 @@ let WorktreeService = class WorktreeService {
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
getWorktreePath(repoPath, branch) {
|
|
181
|
-
|
|
181
|
+
// Normalize separators before hashing so C:\foo and C:/foo produce the same hash
|
|
182
|
+
const normalizedRepoPath = repoPath.replace(/\\/g, '/');
|
|
183
|
+
const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
|
|
182
184
|
const slug = branch.replace(/\//g, '-');
|
|
183
185
|
return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
|
|
184
186
|
}
|
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,CAM5E"}
|
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';
|
|
9
10
|
import { join } from 'node:path';
|
|
10
11
|
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,7 +17,9 @@ import { computeRepoHash } from '../filesystem/repo-hash.js';
|
|
|
17
17
|
* @returns Absolute path to the worktree directory under ~/.shep/repos/
|
|
18
18
|
*/
|
|
19
19
|
export function computeWorktreePath(repoPath, branch) {
|
|
20
|
-
|
|
20
|
+
// Normalize separators before hashing so C:\foo and C:/foo produce the same hash
|
|
21
|
+
const normalizedRepoPath = repoPath.replace(/\\/g, '/');
|
|
22
|
+
const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
|
|
21
23
|
const slug = branch.replace(/\//g, '-');
|
|
22
24
|
return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
|
|
23
25
|
}
|
|
@@ -5,27 +5,13 @@
|
|
|
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,
|
|
8
|
+
import type { ISpecInitializerService, 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'
|
|
10
|
+
initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast'): Promise<SpecInitializerResult>;
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
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
|
-
*
|
|
12
|
+
* Scan specs/ for existing NNN-* directories and return the next available number.
|
|
22
13
|
* Uses the DB-derived hint as a minimum, but always respects filesystem state.
|
|
23
14
|
*/
|
|
24
15
|
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;
|
|
30
16
|
}
|
|
31
17
|
//# 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,
|
|
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;AA8P3E,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,GACZ,OAAO,CAAC,qBAAqB,CAAC;IAqCjC;;;OAGG;YACW,iBAAiB;CAoBhC"}
|
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { mkdir, readdir, writeFile } from 'node:fs/promises';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
|
-
import { computeRepoHash } from '../../services/filesystem/repo-hash.js';
|
|
11
|
-
import { getShepHomeDir } from '../../services/filesystem/shep-directory.service.js';
|
|
12
10
|
/**
|
|
13
11
|
* Pad a number to 3 digits with leading zeros.
|
|
14
12
|
*/
|
|
@@ -242,14 +240,13 @@ const TEMPLATES = [
|
|
|
242
240
|
{ filename: 'feature.yaml', content: FEATURE_YAML },
|
|
243
241
|
];
|
|
244
242
|
export class SpecInitializerService {
|
|
245
|
-
async initialize(basePath, slug, featureNumber, description, mode
|
|
246
|
-
|
|
247
|
-
// Scan existing spec directories for highest NNN prefix to avoid collisions
|
|
243
|
+
async initialize(basePath, slug, featureNumber, description, mode) {
|
|
244
|
+
// Scan existing specs/ directory for highest NNN prefix to avoid collisions
|
|
248
245
|
// (specs may have been created outside the DB, e.g., via /shep-kit:new-feature)
|
|
249
|
-
const resolvedNumber = await this.resolveNextNumber(basePath, featureNumber
|
|
246
|
+
const resolvedNumber = await this.resolveNextNumber(basePath, featureNumber);
|
|
250
247
|
const nnn = padNumber(resolvedNumber);
|
|
251
248
|
const specDirName = `${nnn}-${slug}`;
|
|
252
|
-
const specDir =
|
|
249
|
+
const specDir = join(basePath, 'specs', specDirName);
|
|
253
250
|
// Create the spec directory
|
|
254
251
|
await mkdir(specDir, { recursive: true });
|
|
255
252
|
const now = new Date();
|
|
@@ -266,59 +263,26 @@ export class SpecInitializerService {
|
|
|
266
263
|
return { specDir, featureNumber: nnn };
|
|
267
264
|
}
|
|
268
265
|
/**
|
|
269
|
-
*
|
|
270
|
-
*/
|
|
271
|
-
computeSpecDir(basePath, specDirName, storageMode, repositoryPath) {
|
|
272
|
-
if (storageMode === 'shep-managed') {
|
|
273
|
-
if (!repositoryPath) {
|
|
274
|
-
throw new Error('repositoryPath is required when storageMode is shep-managed');
|
|
275
|
-
}
|
|
276
|
-
const repoHash = computeRepoHash(repositoryPath);
|
|
277
|
-
return join(getShepHomeDir(), 'repos', repoHash, 'specs', specDirName);
|
|
278
|
-
}
|
|
279
|
-
return join(basePath, '.shep', 'specs', specDirName);
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Scan spec directories for existing NNN-* entries and return the next available number.
|
|
283
|
-
* Scans up to 3 locations to prevent collisions during the transition period:
|
|
284
|
-
* 1. specs/ (legacy location)
|
|
285
|
-
* 2. .shep/specs/ (new in-repo location)
|
|
286
|
-
* 3. ~/.shep/repos/<hash>/specs/ (shep-managed location, when repositoryPath provided)
|
|
287
|
-
*
|
|
266
|
+
* Scan specs/ for existing NNN-* directories and return the next available number.
|
|
288
267
|
* Uses the DB-derived hint as a minimum, but always respects filesystem state.
|
|
289
268
|
*/
|
|
290
|
-
async resolveNextNumber(basePath, hint
|
|
291
|
-
const
|
|
292
|
-
if (repositoryPath) {
|
|
293
|
-
const repoHash = computeRepoHash(repositoryPath);
|
|
294
|
-
dirsToScan.push(join(getShepHomeDir(), 'repos', repoHash, 'specs'));
|
|
295
|
-
}
|
|
296
|
-
let maxExisting = 0;
|
|
297
|
-
for (const dir of dirsToScan) {
|
|
298
|
-
const max = await this.scanDirForMaxNumber(dir);
|
|
299
|
-
maxExisting = Math.max(maxExisting, max);
|
|
300
|
-
}
|
|
301
|
-
return Math.max(maxExisting + 1, hint);
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Scan a single directory for NNN-* prefixed entries and return the max number found.
|
|
305
|
-
* Returns 0 if the directory does not exist or is empty.
|
|
306
|
-
*/
|
|
307
|
-
async scanDirForMaxNumber(dirPath) {
|
|
269
|
+
async resolveNextNumber(basePath, hint) {
|
|
270
|
+
const specsDir = join(basePath, 'specs');
|
|
308
271
|
let entries;
|
|
309
272
|
try {
|
|
310
|
-
entries = await readdir(
|
|
273
|
+
entries = await readdir(specsDir);
|
|
311
274
|
}
|
|
312
275
|
catch {
|
|
313
|
-
|
|
276
|
+
// specs/ doesn't exist yet — use hint
|
|
277
|
+
return hint;
|
|
314
278
|
}
|
|
315
|
-
let
|
|
279
|
+
let maxExisting = 0;
|
|
316
280
|
for (const entry of entries) {
|
|
317
281
|
const match = entry.match(/^(\d{3})-/);
|
|
318
282
|
if (match) {
|
|
319
|
-
|
|
283
|
+
maxExisting = Math.max(maxExisting, parseInt(match[1], 10));
|
|
320
284
|
}
|
|
321
285
|
}
|
|
322
|
-
return max;
|
|
286
|
+
return Math.max(maxExisting + 1, hint);
|
|
323
287
|
}
|
|
324
288
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Archive Command
|
|
3
|
+
*
|
|
4
|
+
* Archives a feature to hide it from the canvas without deleting it.
|
|
5
|
+
* Stores the current lifecycle state for restoration on unarchive.
|
|
6
|
+
*
|
|
7
|
+
* Usage: shep feat archive <id> [--force]
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* $ shep feat archive feat-123
|
|
11
|
+
* $ shep feat archive feat-123 --force
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
/**
|
|
15
|
+
* Create the feat archive command
|
|
16
|
+
*/
|
|
17
|
+
export declare function createArchiveCommand(): Command;
|
|
18
|
+
//# sourceMappingURL=archive.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/archive.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAkC9C"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Archive Command
|
|
3
|
+
*
|
|
4
|
+
* Archives a feature to hide it from the canvas without deleting it.
|
|
5
|
+
* Stores the current lifecycle state for restoration on unarchive.
|
|
6
|
+
*
|
|
7
|
+
* Usage: shep feat archive <id> [--force]
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* $ shep feat archive feat-123
|
|
11
|
+
* $ shep feat archive feat-123 --force
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
15
|
+
import { ShowFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/show-feature.use-case.js';
|
|
16
|
+
import { ArchiveFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/archive-feature.use-case.js';
|
|
17
|
+
import { colors, messages } from '../../ui/index.js';
|
|
18
|
+
import { confirm } from '@inquirer/prompts';
|
|
19
|
+
/**
|
|
20
|
+
* Create the feat archive command
|
|
21
|
+
*/
|
|
22
|
+
export function createArchiveCommand() {
|
|
23
|
+
return new Command('archive')
|
|
24
|
+
.description('Archive a feature to hide it from the canvas')
|
|
25
|
+
.argument('<id>', 'Feature ID or prefix')
|
|
26
|
+
.option('-f, --force', 'Skip confirmation prompt')
|
|
27
|
+
.action(async (featureId, options) => {
|
|
28
|
+
try {
|
|
29
|
+
const showUseCase = container.resolve(ShowFeatureUseCase);
|
|
30
|
+
const feature = await showUseCase.execute(featureId);
|
|
31
|
+
if (!options.force) {
|
|
32
|
+
const confirmed = await confirm({
|
|
33
|
+
message: `Archive feature "${feature.name}"?`,
|
|
34
|
+
default: false,
|
|
35
|
+
});
|
|
36
|
+
if (!confirmed) {
|
|
37
|
+
messages.info('Cancelled');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const archiveUseCase = container.resolve(ArchiveFeatureUseCase);
|
|
42
|
+
await archiveUseCase.execute(feature.id);
|
|
43
|
+
messages.newline();
|
|
44
|
+
messages.success('Feature archived');
|
|
45
|
+
console.log(` ${colors.muted('Name:')} ${feature.name}`);
|
|
46
|
+
messages.newline();
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
50
|
+
messages.error('Failed to archive feature', err);
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgB3C"}
|
|
@@ -21,6 +21,8 @@ import { createApproveCommand } from './approve.command.js';
|
|
|
21
21
|
import { createRejectCommand } from './reject.command.js';
|
|
22
22
|
import { createLogsCommand } from './logs.command.js';
|
|
23
23
|
import { createAdoptCommand } from './adopt.command.js';
|
|
24
|
+
import { createArchiveCommand } from './archive.command.js';
|
|
25
|
+
import { createUnarchiveCommand } from './unarchive.command.js';
|
|
24
26
|
/**
|
|
25
27
|
* Create the feat command group
|
|
26
28
|
*/
|
|
@@ -37,5 +39,7 @@ export function createFeatCommand() {
|
|
|
37
39
|
.addCommand(createApproveCommand())
|
|
38
40
|
.addCommand(createRejectCommand())
|
|
39
41
|
.addCommand(createLogsCommand())
|
|
40
|
-
.addCommand(createAdoptCommand())
|
|
42
|
+
.addCommand(createAdoptCommand())
|
|
43
|
+
.addCommand(createArchiveCommand())
|
|
44
|
+
.addCommand(createUnarchiveCommand());
|
|
41
45
|
}
|