@shepai/cli 1.156.0-pr491.8a75139 → 1.156.0-pr492.c465926

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 (185) hide show
  1. package/README.md +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.d.ts +28 -0
  3. package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.d.ts.map +1 -0
  4. package/dist/packages/core/src/application/use-cases/features/resolve-merged-features.use-case.js +94 -0
  5. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  7. package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts +1 -1
  8. package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/git/pr-branding.js +1 -1
  10. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  11. package/dist/src/presentation/cli/commands/ui.command.js +8 -0
  12. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +1 -1
  13. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +2 -2
  14. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -1
  15. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +3 -3
  16. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +1 -1
  17. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +12 -12
  19. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +1 -1
  20. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +6 -6
  21. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +11 -11
  22. package/dist/src/presentation/web/components/features/version/version-page-client.js +1 -1
  23. package/dist/src/presentation/web/dev-server.js +8 -0
  24. package/dist/tsconfig.build.tsbuildinfo +1 -1
  25. package/package.json +2 -2
  26. package/web/.next/BUILD_ID +1 -1
  27. package/web/.next/build-manifest.json +2 -2
  28. package/web/.next/fallback-build-manifest.json +2 -2
  29. package/web/.next/prerender-manifest.json +3 -3
  30. package/web/.next/required-server-files.js +1 -1
  31. package/web/.next/required-server-files.json +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  33. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  36. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  48. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  54. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  57. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  66. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/_global-error.html +2 -2
  75. package/web/.next/server/app/_global-error.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  81. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  82. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  83. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  85. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  86. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  88. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  89. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  91. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  92. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  94. package/web/.next/server/app/version/page.js.nft.json +1 -1
  95. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  97. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  98. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  100. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +2 -2
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +2 -2
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/{_651cb3c2._.js → _0470f226._.js} +2 -2
  122. package/web/.next/server/chunks/ssr/{_651cb3c2._.js.map → _0470f226._.js.map} +1 -1
  123. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  124. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  126. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  128. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/{_a81f0c6e._.js → _49422452._.js} +2 -2
  130. package/web/.next/server/chunks/ssr/{_a81f0c6e._.js.map → _49422452._.js.map} +1 -1
  131. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  132. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  134. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/{_2a2ef2c8._.js → _6efb17ff._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/{_2a2ef2c8._.js.map → _6efb17ff._.js.map} +1 -1
  137. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  138. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  144. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  149. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  151. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  153. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  155. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  157. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  165. package/web/.next/server/pages/500.html +2 -2
  166. package/web/.next/server/server-reference-manifest.js +1 -1
  167. package/web/.next/server/server-reference-manifest.json +45 -45
  168. package/web/.next/static/chunks/{5e4685c23943adeb.js → 12f4909480716274.js} +1 -1
  169. package/web/.next/static/chunks/1535ca264cc51688.js +1 -0
  170. package/web/.next/static/chunks/{891987a18822095a.js → 1aef94553e4c7da4.js} +1 -1
  171. package/web/.next/static/chunks/{08ff9ace090d2691.js → 3e1e0f9bde3530d2.js} +1 -1
  172. package/web/.next/static/chunks/{e4fb17ae2aaffa9c.js → 43967a7326d83ea0.js} +1 -1
  173. package/web/.next/static/chunks/{d67b0c57d27fc3c5.js → 4cde55461bc680cd.js} +2 -2
  174. package/web/.next/static/chunks/{32f0296b12f8e234.js → 4f1e567bf3b02716.js} +2 -2
  175. package/web/.next/static/chunks/{a59d6684b099f03c.js → 5b7ce6a24a5e32a9.js} +1 -1
  176. package/web/.next/static/chunks/{093443eed9d7c21d.js → 7db2d7244d198023.js} +1 -1
  177. package/web/.next/static/chunks/{a75361ace8441fe1.js → 95febd9c9532119a.js} +2 -2
  178. package/web/.next/static/chunks/{45887253006aae6a.js → b1fb4b6f65f3eca6.js} +1 -1
  179. package/web/.next/static/chunks/{146b78db5daf2d19.js → cd444fa3aca8f1e2.js} +1 -1
  180. package/web/.next/static/chunks/e8bf321494da78f7.js +1 -0
  181. package/web/.next/static/chunks/02fcb64dbbbdf23e.js +0 -1
  182. package/web/.next/static/chunks/a3014ad1ff61fc87.js +0 -1
  183. /package/web/.next/static/{tlmwCGmYXRU5lkxEVtve9 → -aEY-UNBCed_KLrBdxJyk}/_buildManifest.js +0 -0
  184. /package/web/.next/static/{tlmwCGmYXRU5lkxEVtve9 → -aEY-UNBCed_KLrBdxJyk}/_clientMiddlewareManifest.json +0 -0
  185. /package/web/.next/static/{tlmwCGmYXRU5lkxEVtve9 → -aEY-UNBCed_KLrBdxJyk}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  _Manage 10 features at once — isolated branches, automatic commits, CI watching, and PRs — from a dashboard or the terminal._
15
15
 
16
- [![CI](https://github.com/shep-ai/shep/actions/workflows/ci.yml/badge.svg)](https://github.com/shep-ai/shep/actions/workflows/ci.yml)
16
+ [![CI](https://github.com/shep-ai/cli/actions/workflows/ci.yml/badge.svg)](https://github.com/shep-ai/cli/actions/workflows/ci.yml)
17
17
  [![npm version](https://img.shields.io/npm/v/@shepai/cli.svg?color=cb3837&logo=npm)](https://www.npmjs.com/package/@shepai/cli)
18
18
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
19
19
 
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ResolveMergedFeaturesUseCase
3
+ *
4
+ * Checks features in the Review lifecycle to see if their branch has already
5
+ * been merged into the repository's default branch. If so, transitions them
6
+ * to Maintain (done) and completes the associated agent run.
7
+ *
8
+ * This resolves "action needed" features that are out of sync — the branch
9
+ * was merged externally but the feature record was never updated.
10
+ *
11
+ * Called on first page load to catch stale Review features.
12
+ */
13
+ import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
14
+ import type { IGitPrService } from '../../ports/output/services/git-pr-service.interface.js';
15
+ import type { IAgentRunRepository } from '../../ports/output/agents/agent-run-repository.interface.js';
16
+ export declare class ResolveMergedFeaturesUseCase {
17
+ private readonly featureRepo;
18
+ private readonly gitPrService;
19
+ private readonly agentRunRepo;
20
+ constructor(featureRepo: IFeatureRepository, gitPrService: IGitPrService, agentRunRepo: IAgentRunRepository);
21
+ /**
22
+ * Scan all Review features and transition any whose branch has been merged.
23
+ *
24
+ * @returns Number of features resolved to Maintain.
25
+ */
26
+ execute(): Promise<number>;
27
+ }
28
+ //# sourceMappingURL=resolve-merged-features.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-merged-features.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/resolve-merged-features.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AAEvG,qBACa,4BAA4B;IAEP,OAAO,CAAC,QAAQ,CAAC,WAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFb,WAAW,EAAE,kBAAkB,EACpC,YAAY,EAAE,aAAa,EACrB,YAAY,EAAE,mBAAmB;IAGnF;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAsDjC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * ResolveMergedFeaturesUseCase
3
+ *
4
+ * Checks features in the Review lifecycle to see if their branch has already
5
+ * been merged into the repository's default branch. If so, transitions them
6
+ * to Maintain (done) and completes the associated agent run.
7
+ *
8
+ * This resolves "action needed" features that are out of sync — the branch
9
+ * was merged externally but the feature record was never updated.
10
+ *
11
+ * Called on first page load to catch stale Review features.
12
+ */
13
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
14
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
16
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
17
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
18
+ };
19
+ var __metadata = (this && this.__metadata) || function (k, v) {
20
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
21
+ };
22
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
23
+ return function (target, key) { decorator(target, key, paramIndex); }
24
+ };
25
+ import { injectable, inject } from 'tsyringe';
26
+ import { SdlcLifecycle, AgentRunStatus } from '../../../domain/generated/output.js';
27
+ let ResolveMergedFeaturesUseCase = class ResolveMergedFeaturesUseCase {
28
+ featureRepo;
29
+ gitPrService;
30
+ agentRunRepo;
31
+ constructor(featureRepo, gitPrService, agentRunRepo) {
32
+ this.featureRepo = featureRepo;
33
+ this.gitPrService = gitPrService;
34
+ this.agentRunRepo = agentRunRepo;
35
+ }
36
+ /**
37
+ * Scan all Review features and transition any whose branch has been merged.
38
+ *
39
+ * @returns Number of features resolved to Maintain.
40
+ */
41
+ async execute() {
42
+ const reviewFeatures = await this.featureRepo.list({
43
+ lifecycle: SdlcLifecycle.Review,
44
+ });
45
+ let resolved = 0;
46
+ for (const feature of reviewFeatures) {
47
+ if (!feature.repositoryPath || !feature.branch)
48
+ continue;
49
+ try {
50
+ // Check if the repo has a remote — verifyMerge needs remote refs
51
+ const hasRemote = await this.gitPrService.hasRemote(feature.repositoryPath);
52
+ if (!hasRemote)
53
+ continue;
54
+ const defaultBranch = await this.gitPrService.getDefaultBranch(feature.repositoryPath);
55
+ // Sync remote refs so merge-base check uses latest state
56
+ try {
57
+ await this.gitPrService.syncMain(feature.repositoryPath, defaultBranch);
58
+ }
59
+ catch {
60
+ // Sync failure is non-fatal — proceed with potentially stale refs
61
+ }
62
+ const isMerged = await this.gitPrService.verifyMerge(feature.repositoryPath, feature.branch, defaultBranch);
63
+ if (isMerged) {
64
+ feature.lifecycle = SdlcLifecycle.Maintain;
65
+ feature.updatedAt = new Date();
66
+ await this.featureRepo.update(feature);
67
+ // Complete the associated agent run if one exists
68
+ if (feature.agentRunId) {
69
+ try {
70
+ await this.agentRunRepo.updateStatus(feature.agentRunId, AgentRunStatus.completed);
71
+ }
72
+ catch {
73
+ // Non-fatal — feature lifecycle is already updated
74
+ }
75
+ }
76
+ resolved++;
77
+ }
78
+ }
79
+ catch {
80
+ // Skip features where git operations fail (repo deleted, etc.)
81
+ continue;
82
+ }
83
+ }
84
+ return resolved;
85
+ }
86
+ };
87
+ ResolveMergedFeaturesUseCase = __decorate([
88
+ injectable(),
89
+ __param(0, inject('IFeatureRepository')),
90
+ __param(1, inject('IGitPrService')),
91
+ __param(2, inject('IAgentRunRepository')),
92
+ __metadata("design:paramtypes", [Object, Object, Object])
93
+ ], ResolveMergedFeaturesUseCase);
94
+ export { ResolveMergedFeaturesUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAwarE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAkJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA4arE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -90,6 +90,7 @@ import { UpgradeCliUseCase } from '../../application/use-cases/upgrade/upgrade-c
90
90
  import { SyncRepositoryMainUseCase } from '../../application/use-cases/repositories/sync-repository-main.use-case.js';
91
91
  import { RebaseFeatureOnMainUseCase } from '../../application/use-cases/features/rebase-feature-on-main.use-case.js';
92
92
  import { GetBranchSyncStatusUseCase } from '../../application/use-cases/features/get-branch-sync-status.use-case.js';
93
+ import { ResolveMergedFeaturesUseCase } from '../../application/use-cases/features/resolve-merged-features.use-case.js';
93
94
  import { ConflictResolutionService } from '../services/agents/conflict-resolution/conflict-resolution.service.js';
94
95
  // Interactive session use cases
95
96
  import { StartInteractiveSessionUseCase } from '../../application/use-cases/interactive/start-interactive-session.use-case.js';
@@ -332,6 +333,7 @@ export async function initializeContainer() {
332
333
  container.registerSingleton(SyncRepositoryMainUseCase);
333
334
  container.registerSingleton(RebaseFeatureOnMainUseCase);
334
335
  container.registerSingleton(GetBranchSyncStatusUseCase);
336
+ container.registerSingleton(ResolveMergedFeaturesUseCase);
335
337
  // Session repositories (per-AgentType string tokens)
336
338
  container.register(`IAgentSessionRepository:${AgentType.ClaudeCode}`, {
337
339
  useFactory: () => new ClaudeCodeSessionRepository(),
@@ -449,6 +451,9 @@ export async function initializeContainer() {
449
451
  container.register('GetBranchSyncStatusUseCase', {
450
452
  useFactory: (c) => c.resolve(GetBranchSyncStatusUseCase),
451
453
  });
454
+ container.register('ResolveMergedFeaturesUseCase', {
455
+ useFactory: (c) => c.resolve(ResolveMergedFeaturesUseCase),
456
+ });
452
457
  // Register interactive session infrastructure
453
458
  container.register('IInteractiveSessionRepository', {
454
459
  useFactory: (c) => {
@@ -6,7 +6,7 @@
6
6
  * PR creation paths (agent-driven, fork-and-PR, etc.).
7
7
  */
8
8
  /** The branding line to append to PR bodies. */
9
- export declare const PR_BRANDING = "Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/shep)";
9
+ export declare const PR_BRANDING = "Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/cli)";
10
10
  /**
11
11
  * Ensure a PR body carries the correct Shep branding.
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pr-branding.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/pr-branding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW,6EACoD,CAAC;AAS7E;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAapD"}
1
+ {"version":3,"file":"pr-branding.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/pr-branding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW,4EACmD,CAAC;AAS5E;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAapD"}
@@ -6,7 +6,7 @@
6
6
  * PR creation paths (agent-driven, fork-and-PR, etc.).
7
7
  */
8
8
  /** The branding line to append to PR bodies. */
9
- export const PR_BRANDING = 'Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/shep)';
9
+ export const PR_BRANDING = 'Built with Shep \uD83D\uDC11 [Shep Bot](https://github.com/shep-ai/cli)';
10
10
  /**
11
11
  * Pattern matching common AI-tool attribution footers that should be
12
12
  * replaced (e.g. "Generated with Claude Code", "Co-Authored-By: Claude").
@@ -1 +1 @@
1
- {"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAkC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA+FzC"}
1
+ {"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAkC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAyGzC"}
@@ -73,6 +73,14 @@ Examples:
73
73
  const db = getExistingConnection();
74
74
  initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
75
75
  getPrSyncWatcher().start();
76
+ // Fire-and-forget: resolve stale Review features whose branch was already merged
77
+ try {
78
+ const resolveMerged = container.resolve('ResolveMergedFeaturesUseCase');
79
+ void resolveMerged.execute();
80
+ }
81
+ catch {
82
+ // Non-fatal — use case may not be registered in all configurations
83
+ }
76
84
  const url = `http://localhost:${port}`;
77
85
  messages.success(t('cli:commands.ui.serverReady', { url: fmt.code(url) }));
78
86
  messages.info(t('cli:commands.ui.pressCtrlC'));
@@ -393,7 +393,7 @@ export const MultipleRejections = {
393
393
  },
394
394
  {
395
395
  iteration: 4,
396
- message: "I've test and created a feature but the screenshots seems to be broken https://github.com/shep-ai/shep/pull/258 fix",
396
+ message: "I've test and created a feature but the screenshots seems to be broken https://github.com/shep-ai/cli/pull/258 fix",
397
397
  phase: 'merge',
398
398
  timestamp: '2025-01-15T10:25:00Z',
399
399
  },
@@ -116,7 +116,7 @@ const mergeReviewFeature = {
116
116
  baseBranch: 'main',
117
117
  hasPlan: true,
118
118
  pr: {
119
- url: 'https://github.com/shep-ai/shep/pull/42',
119
+ url: 'https://github.com/shep-ai/cli/pull/42',
120
120
  number: 42,
121
121
  status: PrStatus.Open,
122
122
  ciStatus: CiStatus.Success,
@@ -228,7 +228,7 @@ const productFixture = {
228
228
  };
229
229
  const mergeFixture = {
230
230
  pr: {
231
- url: 'https://github.com/shep-ai/shep/pull/42',
231
+ url: 'https://github.com/shep-ai/cli/pull/42',
232
232
  number: 42,
233
233
  status: PrStatus.Open,
234
234
  commitHash: 'a1b2c3d4e5f6789',
@@ -3,7 +3,7 @@ import { fn } from '@storybook/test';
3
3
  import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
4
4
  import { MergeReview } from './merge-review.js';
5
5
  const fullPr = {
6
- url: 'https://github.com/shep-ai/shep/pull/42',
6
+ url: 'https://github.com/shep-ai/cli/pull/42',
7
7
  number: 42,
8
8
  status: PrStatus.Open,
9
9
  commitHash: 'a1b2c3d4e5f6789',
@@ -14,8 +14,8 @@ const meta = {
14
14
  export default meta;
15
15
  const repoData = {
16
16
  id: 'repo-1',
17
- name: 'shep-ai/shep',
18
- repositoryPath: '/home/user/shep-ai/shep',
17
+ name: 'shep-ai/cli',
18
+ repositoryPath: '/home/user/shep-ai/cli',
19
19
  };
20
20
  function DrawerTrigger({ data, label }) {
21
21
  const [selected, setSelected] = useState(null);
@@ -27,7 +27,7 @@ export const Default = {
27
27
  export const LongPath = {
28
28
  render: () => (_jsx(DrawerTrigger, { data: {
29
29
  ...repoData,
30
- repositoryPath: '/home/user/projects/company/some-very-long-path/shep-ai/shep',
30
+ repositoryPath: '/home/user/projects/company/some-very-long-path/shep-ai/cli',
31
31
  }, label: "Open Long Path" })),
32
32
  };
33
33
  export const WithoutPath = {
@@ -3,7 +3,7 @@ export interface RepositoryNodeData {
3
3
  [key: string]: unknown;
4
4
  /** Repository domain entity ID (UUID), used for delete operations */
5
5
  id?: string;
6
- /** Repository name, e.g. "shep-ai/shep" */
6
+ /** Repository name, e.g. "shep-ai/cli" */
7
7
  name: string;
8
8
  /** Absolute path to the repository root, used for IDE/shell actions */
9
9
  repositoryPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oHAAoH;IACpH,aAAa,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oHAAoH;IACpH,aAAa,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
@@ -14,7 +14,7 @@ const meta = {
14
14
  layout: 'centered',
15
15
  },
16
16
  args: {
17
- name: 'shep-ai/shep',
17
+ name: 'shep-ai/cli',
18
18
  branch: 'main',
19
19
  commitMessage: 'feat: add dark mode toggle',
20
20
  committer: 'Jane Doe',
@@ -45,7 +45,7 @@ export const LongName = {
45
45
  const onAdd = () => undefined;
46
46
  const multipleRepos = [
47
47
  {
48
- name: 'shep-ai/shep',
48
+ name: 'shep-ai/cli',
49
49
  branch: 'main',
50
50
  commitMessage: 'feat: add dark mode toggle',
51
51
  committer: 'Jane Doe',
@@ -84,7 +84,7 @@ export const Multiple = {
84
84
  };
85
85
  const multipleReposWithButton = [
86
86
  {
87
- name: 'shep-ai/shep',
87
+ name: 'shep-ai/cli',
88
88
  onAdd,
89
89
  branch: 'main',
90
90
  commitMessage: 'feat: add dark mode toggle',
@@ -126,7 +126,7 @@ export const MultipleWithButton = {
126
126
  };
127
127
  export const WithPulseAdd = {
128
128
  args: {
129
- repositoryPath: '/home/user/shep-ai/shep',
129
+ repositoryPath: '/home/user/shep-ai/cli',
130
130
  pulseAdd: true,
131
131
  },
132
132
  argTypes: {
@@ -136,13 +136,13 @@ export const WithPulseAdd = {
136
136
  };
137
137
  export const WithActions = {
138
138
  args: {
139
- repositoryPath: '/home/user/shep-ai/shep',
139
+ repositoryPath: '/home/user/shep-ai/cli',
140
140
  },
141
141
  render: (args) => _jsx(RepositoryNodeCanvas, { data: args }),
142
142
  };
143
143
  export const WithActionsAndAddButton = {
144
144
  args: {
145
- repositoryPath: '/home/user/shep-ai/shep',
145
+ repositoryPath: '/home/user/shep-ai/cli',
146
146
  },
147
147
  argTypes: {
148
148
  onAdd: { action: 'onAdd' },
@@ -153,7 +153,7 @@ const onDelete = () => undefined;
153
153
  export const WithDeleteButton = {
154
154
  args: {
155
155
  id: 'repo-abc-123',
156
- repositoryPath: '/home/user/shep-ai/shep',
156
+ repositoryPath: '/home/user/shep-ai/cli',
157
157
  },
158
158
  argTypes: {
159
159
  onDelete: { action: 'onDelete' },
@@ -163,8 +163,8 @@ export const WithDeleteButton = {
163
163
  const multipleReposWithActions = [
164
164
  {
165
165
  id: 'r1',
166
- name: 'shep-ai/shep',
167
- repositoryPath: '/home/user/shep-ai/shep',
166
+ name: 'shep-ai/cli',
167
+ repositoryPath: '/home/user/shep-ai/cli',
168
168
  onAdd,
169
169
  onDelete,
170
170
  branch: 'main',
@@ -217,7 +217,7 @@ export const MultipleWithActions = {
217
217
  };
218
218
  export const WithGitInfo = {
219
219
  args: {
220
- repositoryPath: '/home/user/shep-ai/shep',
220
+ repositoryPath: '/home/user/shep-ai/cli',
221
221
  branch: 'feat/repo-node-enrichment',
222
222
  commitMessage: 'feat(web): enrich repository node with branch and commit info',
223
223
  committer: 'Ariel Shadkhan',
@@ -227,7 +227,7 @@ export const WithGitInfo = {
227
227
  };
228
228
  export const WithGitInfoBehind = {
229
229
  args: {
230
- repositoryPath: '/home/user/shep-ai/shep',
230
+ repositoryPath: '/home/user/shep-ai/cli',
231
231
  branch: 'feat/old-feature-branch',
232
232
  commitMessage: 'fix: resolve merge conflict in auth module',
233
233
  committer: 'Jane Doe',
@@ -237,7 +237,7 @@ export const WithGitInfoBehind = {
237
237
  };
238
238
  export const GitInfoLoading = {
239
239
  args: {
240
- repositoryPath: '/home/user/shep-ai/shep',
240
+ repositoryPath: '/home/user/shep-ai/cli',
241
241
  gitInfoStatus: 'loading',
242
242
  },
243
243
  render: (args) => _jsx(RepositoryNodeCanvas, { data: args }),
@@ -357,7 +357,7 @@ const archiveRepoNode = {
357
357
  id: 'repo-archive',
358
358
  type: 'repositoryNode',
359
359
  position: { x: 50, y: 115 },
360
- data: { name: 'shep-ai/shep' },
360
+ data: { name: 'shep-ai/cli' },
361
361
  };
362
362
  const archivedFeatureNodes = [
363
363
  {
@@ -267,7 +267,7 @@ const repoNode = {
267
267
  type: 'repositoryNode',
268
268
  position: { x: 50, y: 162 },
269
269
  data: {
270
- name: 'shep-ai/shep',
270
+ name: 'shep-ai/cli',
271
271
  },
272
272
  };
273
273
  const repoFeatureNodes = [
@@ -320,7 +320,7 @@ const singleRepoSingleFeatureNodes = [
320
320
  id: 'repo-1',
321
321
  type: 'repositoryNode',
322
322
  position: { x: 50, y: 127 },
323
- data: { name: 'shep-ai/shep' },
323
+ data: { name: 'shep-ai/cli' },
324
324
  },
325
325
  {
326
326
  id: 'feat-1',
@@ -352,7 +352,7 @@ const singleRepoMultiFeatNodes = [
352
352
  id: 'repo-1',
353
353
  type: 'repositoryNode',
354
354
  position: { x: 50, y: 162 },
355
- data: { name: 'shep-ai/shep' },
355
+ data: { name: 'shep-ai/cli' },
356
356
  },
357
357
  {
358
358
  id: 'feat-1',
@@ -416,7 +416,7 @@ const multiRepoNodes = [
416
416
  id: 'repo-1',
417
417
  type: 'repositoryNode',
418
418
  position: { x: 50, y: 86 },
419
- data: { name: 'shep-ai/shep' },
419
+ data: { name: 'shep-ai/cli' },
420
420
  },
421
421
  {
422
422
  id: 'repo-2',
@@ -470,7 +470,7 @@ const mixedRepoFeatureNodesRaw = [
470
470
  id: 'repo-1',
471
471
  type: 'repositoryNode',
472
472
  position: { x: 0, y: 0 },
473
- data: { name: 'shep-ai/shep' },
473
+ data: { name: 'shep-ai/cli' },
474
474
  },
475
475
  {
476
476
  id: 'repo-2',
@@ -591,7 +591,7 @@ const fastModeNodesRaw = [
591
591
  id: 'repo-1',
592
592
  type: 'repositoryNode',
593
593
  position: { x: 0, y: 0 },
594
- data: { name: 'shep-ai/shep' },
594
+ data: { name: 'shep-ai/cli' },
595
595
  },
596
596
  {
597
597
  id: 'feat-fast-1',
@@ -313,15 +313,15 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
313
313
  }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { id: "section-language", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: _jsx(LanguageSettingsSection, { language: settings.user?.preferredLanguage ?? Language.English }) }), _jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: t('settings.agent.sectionTitle'), description: t('settings.agent.sectionDescription'), testId: "agent-settings-section", children: _jsx(SettingsRow, { label: t('settings.agent.agentAndModel'), description: t('settings.agent.agentAndModelDescription'), htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
314
314
  {
315
315
  label: t('settings.agent.links.agentSystem'),
316
- href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/agent-system.md',
316
+ href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/agent-system.md',
317
317
  },
318
318
  {
319
319
  label: t('settings.agent.links.addingAgents'),
320
- href: 'https://github.com/shep-ai/shep/blob/main/docs/development/adding-agents.md',
320
+ href: 'https://github.com/shep-ai/cli/blob/main/docs/development/adding-agents.md',
321
321
  },
322
322
  {
323
323
  label: t('settings.agent.links.configurationGuide'),
324
- href: 'https://github.com/shep-ai/shep/blob/main/docs/guides/configuration.md',
324
+ href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
325
325
  },
326
326
  ], children: t('settings.agent.hint') })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Terminal, title: t('settings.environment.sectionTitle'), description: t('settings.environment.sectionDescription'), testId: "environment-settings-section", children: [_jsx(SettingsRow, { label: t('settings.environment.defaultEditor'), description: t('settings.environment.defaultEditorDescription'), htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
327
327
  setEditor(v);
@@ -356,7 +356,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
356
356
  }, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] }) })] }), _jsx(SectionHint, { links: [
357
357
  {
358
358
  label: t('settings.environment.links.configurationGuide'),
359
- href: 'https://github.com/shep-ai/shep/blob/main/docs/guides/configuration.md',
359
+ href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
360
360
  },
361
361
  ], children: t('settings.environment.hint') })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: t('settings.workflow.title'), description: t('settings.workflow.sectionDescription'), testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.workflow.subsections.approve') }), _jsx(SwitchRow, { label: t('settings.workflow.autoApprovePrd'), description: t('settings.workflow.autoApprovePrdDescription'), id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
362
362
  setAllowPrd(v);
@@ -397,11 +397,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
397
397
  } })] }), _jsx(SectionHint, { links: [
398
398
  {
399
399
  label: t('settings.workflow.links.approvalGates'),
400
- href: 'https://github.com/shep-ai/shep/blob/main/specs/016-hitl-approval-gates/spec.yaml',
400
+ href: 'https://github.com/shep-ai/cli/blob/main/specs/016-hitl-approval-gates/spec.yaml',
401
401
  },
402
402
  {
403
403
  label: t('settings.workflow.links.pushAndPrFlags'),
404
- href: 'https://github.com/shep-ai/shep/blob/main/specs/037-feature-pr-push-flags/spec.yaml',
404
+ href: 'https://github.com/shep-ai/cli/blob/main/specs/037-feature-pr-push-flags/spec.yaml',
405
405
  },
406
406
  ], children: t('settings.workflow.hint') })] }), _jsxs("div", { id: "section-ci", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Activity, title: t('settings.ci.title'), description: t('settings.ci.description'), testId: "ci-settings-section", children: [_jsx(SettingsRow, { label: t('settings.ci.maxFixAttempts'), description: t('settings.ci.maxFixAttemptsDescription'), htmlFor: "ci-max-fix", children: _jsx(NumberStepper, { id: "ci-max-fix", testId: "ci-max-fix-input", placeholder: "3", value: ciMaxFix, onChange: setCiMaxFix, onBlur: () => {
407
407
  if (ciMaxFix !== originalCiMaxFix)
@@ -421,11 +421,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
421
421
  } })] }), _jsx(SectionHint, { links: [
422
422
  {
423
423
  label: t('settings.ci.links.cicdPipeline'),
424
- href: 'https://github.com/shep-ai/shep/blob/main/docs/development/cicd.md',
424
+ href: 'https://github.com/shep-ai/cli/blob/main/docs/development/cicd.md',
425
425
  },
426
426
  {
427
427
  label: t('settings.ci.links.ciSecurityGates'),
428
- href: 'https://github.com/shep-ai/shep/blob/main/specs/003-cicd-security-gates/spec.md',
428
+ href: 'https://github.com/shep-ai/cli/blob/main/specs/003-cicd-security-gates/spec.md',
429
429
  },
430
430
  ], children: t('settings.ci.hint') })] }), _jsxs("div", { id: "section-stage-timeouts", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Timer, title: t('settings.stageTimeouts.title'), description: t('settings.stageTimeouts.description'), testId: "stage-timeouts-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.stageTimeouts.subsections.featureAgent') }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.analyze'), description: t('settings.stageTimeouts.analyzeDescription'), htmlFor: "timeout-analyze", children: _jsx(TimeoutSlider, { id: "timeout-analyze", testId: "timeout-analyze-input", value: analyzeTimeout, onChange: setAnalyzeTimeout, onBlur: () => {
431
431
  if (analyzeTimeout !== originalAnalyzeTimeout)
@@ -498,7 +498,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
498
498
  } })] }), _jsx(SectionHint, { links: [
499
499
  {
500
500
  label: t('settings.notifications.links.notificationSystem'),
501
- href: 'https://github.com/shep-ai/shep/blob/main/specs/021-agent-notifications/spec.yaml',
501
+ href: 'https://github.com/shep-ai/cli/blob/main/specs/021-agent-notifications/spec.yaml',
502
502
  },
503
503
  ], children: t('settings.notifications.hint') })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: t('settings.featureFlags.title'), description: t('settings.featureFlags.sectionDescription'), badge: t('settings.featureFlags.badge'), testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: t('settings.featureFlags.skills'), description: t('settings.featureFlags.skillsDescription'), id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
504
504
  const newFlags = { ...flags, skills: v };
@@ -564,11 +564,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
564
564
  } }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: t('settings.database.title'), description: t('settings.database.sectionDescription'), testId: "database-settings-section", children: [_jsx(SettingsRow, { label: t('settings.database.location'), description: t('settings.database.locationDescription'), children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: t('settings.database.size'), children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
565
565
  {
566
566
  label: t('settings.database.links.settingsService'),
567
- href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/settings-service.md',
567
+ href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/settings-service.md',
568
568
  },
569
569
  {
570
570
  label: t('settings.database.links.settingsSpec'),
571
- href: 'https://github.com/shep-ai/shep/blob/main/specs/005-global-settings-service/spec.md',
571
+ href: 'https://github.com/shep-ai/cli/blob/main/specs/005-global-settings-service/spec.md',
572
572
  },
573
573
  ], children: t('settings.database.hint') })] })] })] }));
574
574
  }
@@ -9,5 +9,5 @@ function InfoRow({ label, value, badge, badgeVariant = 'secondary' }) {
9
9
  return (_jsxs("div", { className: "flex items-center justify-between py-2", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: label }), badge ? (_jsx(Badge, { variant: badgeVariant, children: value })) : (_jsx("span", { className: "font-mono text-sm", children: value }))] }));
10
10
  }
11
11
  export default function VersionPageClient({ versionInfo, systemInfo }) {
12
- return (_jsx("div", { className: "flex flex-col items-center justify-center p-4", children: _jsxs("div", { className: "w-full max-w-2xl space-y-6", children: [_jsxs("div", { className: "text-center", children: [_jsx("h1", { className: "text-3xl font-bold tracking-tight", children: versionInfo.name }), _jsx("p", { className: "text-muted-foreground mt-2", children: versionInfo.description }), _jsx("div", { className: "mt-4", children: _jsxs(Badge, { variant: "default", "data-testid": "version-badge", children: ["v", versionInfo.version] }) })] }), _jsxs(Tabs, { defaultValue: "overview", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [_jsx(TabsTrigger, { value: "overview", children: "Overview" }), _jsx(TabsTrigger, { value: "system", children: "System" }), _jsx(TabsTrigger, { value: "features", children: "Features" })] }), _jsx(TabsContent, { value: "overview", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Package Information" }), _jsx(CardDescription, { children: "Details about the Shep AI CLI package" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Package", value: versionInfo.name }), _jsx(InfoRow, { label: "Version", value: `v${versionInfo.version}`, badge: true, badgeVariant: "default" }), _jsx(InfoRow, { label: "License", value: "MIT", badge: true, badgeVariant: "outline" }), _jsx(InfoRow, { label: "Author", value: "Shep AI" })] })] }) }), _jsx(TabsContent, { value: "system", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "System Information" }), _jsx(CardDescription, { children: "Runtime environment details" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Node.js", value: systemInfo.nodeVersion, badge: true, badgeVariant: "secondary" }), _jsx(InfoRow, { label: "Platform", value: `${systemInfo.platform} ${systemInfo.arch}` })] })] }) }), _jsx(TabsContent, { value: "features", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Key Features" }), _jsx(CardDescription, { children: "What Shep AI can do for you" })] }), _jsx(CardContent, { children: _jsxs("ul", { className: "space-y-2 text-sm", children: [_jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "AI" }), _jsx("span", { children: "Autonomous code generation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "SDLC" }), _jsx("span", { children: "Full development lifecycle automation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "CLI" }), _jsx("span", { children: "Powerful command-line interface" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "Web" }), _jsx("span", { children: "Modern web UI dashboard" })] })] }) })] }) })] }), _jsxs("div", { className: "flex justify-center gap-4", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { href: "/", children: "Back to Home" }) }), _jsx(Button, { asChild: true, children: _jsx("a", { href: "https://github.com/shep-ai/shep", target: "_blank", rel: "noopener noreferrer", children: "View on GitHub" }) })] })] }) }));
12
+ return (_jsx("div", { className: "flex flex-col items-center justify-center p-4", children: _jsxs("div", { className: "w-full max-w-2xl space-y-6", children: [_jsxs("div", { className: "text-center", children: [_jsx("h1", { className: "text-3xl font-bold tracking-tight", children: versionInfo.name }), _jsx("p", { className: "text-muted-foreground mt-2", children: versionInfo.description }), _jsx("div", { className: "mt-4", children: _jsxs(Badge, { variant: "default", "data-testid": "version-badge", children: ["v", versionInfo.version] }) })] }), _jsxs(Tabs, { defaultValue: "overview", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-3", children: [_jsx(TabsTrigger, { value: "overview", children: "Overview" }), _jsx(TabsTrigger, { value: "system", children: "System" }), _jsx(TabsTrigger, { value: "features", children: "Features" })] }), _jsx(TabsContent, { value: "overview", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Package Information" }), _jsx(CardDescription, { children: "Details about the Shep AI CLI package" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Package", value: versionInfo.name }), _jsx(InfoRow, { label: "Version", value: `v${versionInfo.version}`, badge: true, badgeVariant: "default" }), _jsx(InfoRow, { label: "License", value: "MIT", badge: true, badgeVariant: "outline" }), _jsx(InfoRow, { label: "Author", value: "Shep AI" })] })] }) }), _jsx(TabsContent, { value: "system", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "System Information" }), _jsx(CardDescription, { children: "Runtime environment details" })] }), _jsxs(CardContent, { className: "space-y-1", children: [_jsx(InfoRow, { label: "Node.js", value: systemInfo.nodeVersion, badge: true, badgeVariant: "secondary" }), _jsx(InfoRow, { label: "Platform", value: `${systemInfo.platform} ${systemInfo.arch}` })] })] }) }), _jsx(TabsContent, { value: "features", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Key Features" }), _jsx(CardDescription, { children: "What Shep AI can do for you" })] }), _jsx(CardContent, { children: _jsxs("ul", { className: "space-y-2 text-sm", children: [_jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "AI" }), _jsx("span", { children: "Autonomous code generation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "SDLC" }), _jsx("span", { children: "Full development lifecycle automation" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "CLI" }), _jsx("span", { children: "Powerful command-line interface" })] }), _jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: "Web" }), _jsx("span", { children: "Modern web UI dashboard" })] })] }) })] }) })] }), _jsxs("div", { className: "flex justify-center gap-4", children: [_jsx(Button, { asChild: true, variant: "outline", children: _jsx(Link, { href: "/", children: "Back to Home" }) }), _jsx(Button, { asChild: true, children: _jsx("a", { href: "https://github.com/shep-ai/cli", target: "_blank", rel: "noopener noreferrer", children: "View on GitHub" }) })] })] }) }));
13
13
  }
@@ -69,6 +69,14 @@ async function main() {
69
69
  const db = getExistingConnection();
70
70
  initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
71
71
  getPrSyncWatcher().start();
72
+ // Fire-and-forget: resolve stale Review features whose branch was already merged
73
+ try {
74
+ const resolveMerged = container.resolve('ResolveMergedFeaturesUseCase');
75
+ void resolveMerged.execute();
76
+ }
77
+ catch {
78
+ // Non-fatal — use case may not be registered in all configurations
79
+ }
72
80
  }
73
81
  catch (error) {
74
82
  console.warn('[dev-server] DI initialization failed — features will be empty:', error);