@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.
Files changed (288) hide show
  1. package/apis/json-schema/Feature.yaml +3 -0
  2. package/apis/json-schema/Repository.yaml +0 -3
  3. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  4. package/dist/packages/core/src/application/index.d.ts +1 -1
  5. package/dist/packages/core/src/application/index.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
  7. package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +2 -0
  9. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +1 -1
  11. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -1
  13. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  14. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +5 -21
  15. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
  16. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts +20 -0
  17. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +1 -0
  18. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +74 -0
  19. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -1
  20. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  21. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +2 -8
  22. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts +20 -0
  23. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts.map +1 -0
  24. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.js +65 -0
  25. package/dist/packages/core/src/domain/generated/output.d.ts +6 -5
  26. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  27. package/dist/packages/core/src/domain/generated/output.js +1 -0
  28. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/di/container.js +10 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +0 -1
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +0 -2
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts +12 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts.map +1 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.js +16 -0
  39. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +7 -2
  41. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
  42. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  43. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +2 -6
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +2 -4
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +8 -15
  47. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  48. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +4 -2
  49. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -1
  50. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +4 -2
  51. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +3 -17
  52. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
  53. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +13 -49
  54. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts +18 -0
  55. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -0
  56. package/dist/src/presentation/cli/commands/feat/archive.command.js +54 -0
  57. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  58. package/dist/src/presentation/cli/commands/feat/index.js +5 -1
  59. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/feat/ls.command.js +5 -0
  61. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts +17 -0
  62. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -0
  63. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +42 -0
  64. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  65. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +6 -1
  66. package/dist/src/presentation/web/app/actions/archive-feature.d.ts +6 -0
  67. package/dist/src/presentation/web/app/actions/archive-feature.d.ts.map +1 -0
  68. package/dist/src/presentation/web/app/actions/archive-feature.js +16 -0
  69. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts +6 -0
  70. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts.map +1 -0
  71. package/dist/src/presentation/web/app/actions/unarchive-feature.js +16 -0
  72. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  73. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  74. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
  76. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -1
  77. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  78. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +11 -1
  79. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +22 -6
  81. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +5 -0
  82. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +75 -1
  84. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  85. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +13 -4
  86. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +6 -0
  87. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +70 -0
  89. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +6 -0
  90. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  91. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +43 -2
  92. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  93. package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
  94. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +1 -1
  95. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  96. package/dist/src/presentation/web/hooks/use-graph-state.js +17 -2
  97. package/dist/src/presentation/web/lib/derive-graph.d.ts +4 -0
  98. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  99. package/dist/src/presentation/web/lib/derive-graph.js +12 -0
  100. package/dist/tsconfig.build.tsbuildinfo +1 -1
  101. package/package.json +1 -1
  102. package/web/.next/BUILD_ID +1 -1
  103. package/web/.next/build-manifest.json +2 -2
  104. package/web/.next/fallback-build-manifest.json +2 -2
  105. package/web/.next/prerender-manifest.json +3 -3
  106. package/web/.next/required-server-files.js +1 -1
  107. package/web/.next/required-server-files.json +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +78 -48
  109. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +78 -48
  113. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +90 -60
  121. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +74 -44
  125. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +78 -48
  129. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  130. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  133. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  134. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +90 -60
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +74 -44
  141. package/web/.next/server/app/(dashboard)/page.js +1 -1
  142. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +74 -44
  145. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  146. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/_global-error.html +2 -2
  149. package/web/.next/server/app/_global-error.rsc +1 -1
  150. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  151. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  153. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  154. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  155. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  156. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  157. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  158. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  159. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  160. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  161. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  162. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  164. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  165. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  166. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  167. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  168. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  170. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  172. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  173. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  174. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  175. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  176. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  177. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  178. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  179. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b731076a.js +3 -0
  181. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b731076a.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  183. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_edb1ed93.js +3 -0
  185. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_edb1ed93.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9b4d65a0.js +3 -0
  187. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9b4d65a0.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +1 -1
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/{[root-of-the-server]__3f6cd19e._.js → [root-of-the-server]__78a7fcc9._.js} +2 -2
  195. package/web/.next/server/chunks/ssr/{[root-of-the-server]__3f6cd19e._.js.map → [root-of-the-server]__78a7fcc9._.js.map} +1 -1
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6c83fbec._.js → [root-of-the-server]__8fbe6424._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2096f24f._.js.map → [root-of-the-server]__8fbe6424._.js.map} +1 -1
  200. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2096f24f._.js → [root-of-the-server]__960623da._.js} +2 -2
  201. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a13f3ed8._.js.map → [root-of-the-server]__960623da._.js.map} +1 -1
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js +2 -2
  203. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js +1 -1
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a13f3ed8._.js → [root-of-the-server]__c3bd3892._.js} +2 -2
  209. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6c83fbec._.js.map → [root-of-the-server]__c3bd3892._.js.map} +1 -1
  210. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/{_c5a0904f._.js → _4fce23fd._.js} +2 -2
  213. package/web/.next/server/chunks/ssr/_4fce23fd._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  215. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_b6960ca0._.js +2 -2
  218. package/web/.next/server/chunks/ssr/_b6960ca0._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  221. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/_f18353a1._.js +3 -0
  223. package/web/.next/server/chunks/ssr/{_c80f0ee4._.js.map → _f18353a1._.js.map} +1 -1
  224. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  225. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  227. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/{src_presentation_web_5cbfa9c3._.js → src_presentation_web_5a474643._.js} +2 -2
  229. package/web/.next/server/chunks/ssr/{src_presentation_web_5cbfa9c3._.js.map → src_presentation_web_5a474643._.js.map} +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_820d7c79._.js +5 -0
  231. package/web/.next/server/chunks/ssr/{src_presentation_web_8e7fe0d1._.js.map → src_presentation_web_820d7c79._.js.map} +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_005499f7.js +3 -0
  233. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_005499f7.js.map +1 -0
  234. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_a1a382f3._.js +5 -0
  239. package/web/.next/server/chunks/ssr/{src_presentation_web_b9023017._.js.map → src_presentation_web_a1a382f3._.js.map} +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  242. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  243. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  244. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  245. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  246. package/web/.next/server/pages/500.html +2 -2
  247. package/web/.next/server/server-reference-manifest.js +1 -1
  248. package/web/.next/server/server-reference-manifest.json +452 -296
  249. package/web/.next/static/chunks/09db7c74857d727e.js +1 -0
  250. package/web/.next/static/chunks/0f1221daf6a27f15.css +1 -0
  251. package/web/.next/static/chunks/{d4ea4340c78d8fe8.js → 14c5d3477ab30cbd.js} +1 -1
  252. package/web/.next/static/chunks/{9cde06b0bf7f313d.js → 16557147753ecd97.js} +2 -2
  253. package/web/.next/static/chunks/{32a0eb00cc8f57a5.js → 381674b7016bfe2d.js} +1 -1
  254. package/web/.next/static/chunks/{6cf053583d146b73.js → 3dbb95c2df37cd69.js} +1 -1
  255. package/web/.next/static/chunks/42d4cfca94db8f3a.js +1 -0
  256. package/web/.next/static/chunks/458c2a7ea153c3f0.js +2 -0
  257. package/web/.next/static/chunks/5e2a1042deae63bc.js +1 -0
  258. package/web/.next/static/chunks/{9a53c38c866d6fd6.js → 83fe7a19db594510.js} +1 -1
  259. package/web/.next/static/chunks/{dca377b2a0726988.js → 8be41bcbf3d0a5b2.js} +1 -1
  260. package/web/.next/static/chunks/{7eb6cae52a1a3747.js → bd2735ffbb5a405f.js} +1 -1
  261. package/web/.next/static/chunks/d7317df625d1f4bc.js +1 -0
  262. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts +0 -12
  263. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts.map +0 -1
  264. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.js +0 -19
  265. package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts +0 -17
  266. package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts.map +0 -1
  267. package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.js +0 -21
  268. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
  269. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
  271. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
  273. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
  274. package/web/.next/server/chunks/ssr/_c5a0904f._.js.map +0 -1
  275. package/web/.next/server/chunks/ssr/_c80f0ee4._.js +0 -3
  276. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
  277. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
  278. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
  280. package/web/.next/static/chunks/0f7a03924ffe9201.js +0 -1
  281. package/web/.next/static/chunks/290b9ee95370f3e6.js +0 -2
  282. package/web/.next/static/chunks/3e2d7d07926b05bf.css +0 -1
  283. package/web/.next/static/chunks/47151663050b874d.js +0 -1
  284. package/web/.next/static/chunks/6472785bb556ec8a.js +0 -1
  285. package/web/.next/static/chunks/769db91c3a32cb62.js +0 -1
  286. /package/web/.next/static/{joXWxy8xjQS31B-KrKQy2 → lRiUQJLpOuDbBG06Veg7i}/_buildManifest.js +0 -0
  287. /package/web/.next/static/{joXWxy8xjQS31B-KrKQy2 → lRiUQJLpOuDbBG06Veg7i}/_clientMiddlewareManifest.json +0 -0
  288. /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
  });
@@ -50,6 +50,7 @@ export interface FeatureRow {
50
50
  ci_fix_history: string | null;
51
51
  pr_mergeable: number | null;
52
52
  parent_id: string | null;
53
+ previous_lifecycle: string | null;
53
54
  attachments: string;
54
55
  deleted_at: number | null;
55
56
  created_at: number;
@@ -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,CAgDvD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAkDrD"}
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
@@ -16,7 +16,6 @@ export interface RepositoryRow {
16
16
  name: string;
17
17
  path: string;
18
18
  remote_url: string | null;
19
- spec_storage_mode: string | null;
20
19
  created_at: number;
21
20
  updated_at: number;
22
21
  deleted_at: number | null;
@@ -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,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"}
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"}
@@ -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
+ }
@@ -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;IAyBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5C"}
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
@@ -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' | 'specStorageMode'>>): Promise<Repository>;
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;
@@ -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,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"}
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, spec_storage_mode, created_at, updated_at)
27
- VALUES (@id, @name, @path, @spec_storage_mode, @created_at, @updated_at)
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 .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
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;;;;;;;;;;;;;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"}
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 .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
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
- // 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
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 = effectiveCommitEvidence
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.${effectiveCommitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
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": "${effectiveCommitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
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": "${effectiveCommitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
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**: ${effectiveCommitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
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;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
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
- const repoHash = computeRepoHash(repoPath);
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
  }
@@ -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,CAI5E"}
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"}
@@ -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
- const repoHash = computeRepoHash(repoPath);
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, SpecInitializerOptions, SpecInitializerResult } from '../../../application/ports/output/services/spec-initializer.interface.js';
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', options?: SpecInitializerOptions): Promise<SpecInitializerResult>;
10
+ initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast'): Promise<SpecInitializerResult>;
11
11
  /**
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
- *
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
@@ -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,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"}
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, options) {
246
- const storageMode = options?.storageMode ?? 'in-repo';
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, options?.repositoryPath);
246
+ const resolvedNumber = await this.resolveNextNumber(basePath, featureNumber);
250
247
  const nnn = padNumber(resolvedNumber);
251
248
  const specDirName = `${nnn}-${slug}`;
252
- const specDir = this.computeSpecDir(basePath, specDirName, storageMode, options?.repositoryPath);
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
- * Compute the spec directory path based on storage mode.
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, repositoryPath) {
291
- const dirsToScan = [join(basePath, 'specs'), join(basePath, '.shep', 'specs')];
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(dirPath);
273
+ entries = await readdir(specsDir);
311
274
  }
312
275
  catch {
313
- return 0;
276
+ // specs/ doesn't exist yet — use hint
277
+ return hint;
314
278
  }
315
- let max = 0;
279
+ let maxExisting = 0;
316
280
  for (const entry of entries) {
317
281
  const match = entry.match(/^(\d{3})-/);
318
282
  if (match) {
319
- max = Math.max(max, parseInt(match[1], 10));
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;AAapC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAc3C"}
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
  }