@shepai/cli 1.123.0-pr394.80f3f1f → 1.123.0-pr394.f86a739

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 (143) hide show
  1. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts +11 -2
  2. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +48 -6
  4. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts.map +1 -1
  5. package/dist/src/presentation/cli/commands/feat/adopt.command.js +3 -0
  6. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +4 -0
  8. package/dist/tsconfig.build.tsbuildinfo +1 -1
  9. package/package.json +1 -1
  10. package/web/.next/BUILD_ID +1 -1
  11. package/web/.next/build-manifest.json +2 -2
  12. package/web/.next/fallback-build-manifest.json +2 -2
  13. package/web/.next/prerender-manifest.json +3 -3
  14. package/web/.next/required-server-files.js +1 -1
  15. package/web/.next/required-server-files.json +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +22 -22
  17. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  18. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  20. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  21. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  32. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  35. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  41. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  44. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/_global-error.html +2 -2
  47. package/web/.next/server/app/_global-error.rsc +1 -1
  48. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  53. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  54. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  56. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  57. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  59. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  61. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  63. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  65. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  66. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  67. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_cfc9281c.js +1 -1
  68. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_cfc9281c.js.map +1 -1
  69. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  70. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  71. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  72. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  73. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  74. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js +2 -2
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  98. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  100. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/_a187fd7e._.js +1 -1
  102. package/web/.next/server/chunks/ssr/_a187fd7e._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  104. package/web/.next/server/chunks/ssr/{_0a97d643._.js → _af7ec14e._.js} +2 -2
  105. package/web/.next/server/chunks/ssr/{_0a97d643._.js.map → _af7ec14e._.js.map} +1 -1
  106. package/web/.next/server/chunks/ssr/{_60922fc4._.js → _bd291dd4._.js} +2 -2
  107. package/web/.next/server/chunks/ssr/{_60922fc4._.js.map → _bd291dd4._.js.map} +1 -1
  108. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  109. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  111. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  113. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  121. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/{src_presentation_web_7a78701e._.js → src_presentation_web_d19182cb._.js} +2 -2
  125. package/web/.next/server/chunks/ssr/{src_presentation_web_7a78701e._.js.map → src_presentation_web_d19182cb._.js.map} +1 -1
  126. package/web/.next/server/pages/500.html +2 -2
  127. package/web/.next/server/server-reference-manifest.js +1 -1
  128. package/web/.next/server/server-reference-manifest.json +36 -36
  129. package/web/.next/static/chunks/{e1de6b08082f5365.js → 07973cb4a37c0c40.js} +1 -1
  130. package/web/.next/static/chunks/15665b473febf97f.js +1 -0
  131. package/web/.next/static/chunks/{fc45997b8b835378.js → 4e9bc4d7b844e342.js} +1 -1
  132. package/web/.next/static/chunks/{8c50a0b7a7d9a4d5.js → 5f4d4edcd476f2df.js} +1 -1
  133. package/web/.next/static/chunks/{26110def6c1641a5.js → 688689aa17b96e5d.js} +1 -1
  134. package/web/.next/static/chunks/{b626e6ad69805e9a.js → 6ebcb8f40fde6b83.js} +1 -1
  135. package/web/.next/static/chunks/{14d6411c627ccc15.js → 71acbe51602d440d.js} +1 -1
  136. package/web/.next/static/chunks/{44e35ac2426a1bd0.js → 77be7fb4731d37a0.js} +1 -1
  137. package/web/.next/static/chunks/{2dade33cf8b0e03e.js → b014c7d70d2c71ed.js} +1 -1
  138. package/web/.next/static/chunks/{9fe8af38605fa69a.js → b0e3592dff0215dc.js} +1 -1
  139. package/web/.next/static/chunks/{e413cc49d94d7093.js → ec348ad3d7e20677.js} +2 -2
  140. package/web/.next/static/chunks/a73b4cc8c0548c91.js +0 -1
  141. /package/web/.next/static/{-FOfzDf8kOTPigHYVlPm4 → oFYfLIWkGEGaI30kH8DXG}/_buildManifest.js +0 -0
  142. /package/web/.next/static/{-FOfzDf8kOTPigHYVlPm4 → oFYfLIWkGEGaI30kH8DXG}/_clientMiddlewareManifest.json +0 -0
  143. /package/web/.next/static/{-FOfzDf8kOTPigHYVlPm4 → oFYfLIWkGEGaI30kH8DXG}/_ssgManifest.js +0 -0
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Imports an existing git branch into Shep's feature tracking system.
5
5
  * Creates a worktree (if needed), derives feature metadata from the branch name,
6
- * and persists a Feature entity with lifecycle=Maintain (agent inactive).
6
+ * and persists a Feature entity. Branches with an open PR get lifecycle=Review
7
+ * (shown as "REVIEW" in the UI); all others get lifecycle=Maintain (completed).
7
8
  *
8
9
  * This is a standalone use case — it does NOT extend or modify CreateFeatureUseCase.
9
10
  * It needs only three dependencies: IFeatureRepository, IRepositoryRepository, and IWorktreeService.
@@ -12,6 +13,7 @@ import type { Feature } from '../../../domain/generated/output.js';
12
13
  import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
13
14
  import type { IRepositoryRepository } from '../../ports/output/repositories/repository-repository.interface.js';
14
15
  import type { IWorktreeService } from '../../ports/output/services/worktree-service.interface.js';
16
+ import type { IGitPrService } from '../../ports/output/services/git-pr-service.interface.js';
15
17
  export interface AdoptBranchInput {
16
18
  branchName: string;
17
19
  repositoryPath: string;
@@ -23,7 +25,8 @@ export declare class AdoptBranchUseCase {
23
25
  private readonly featureRepo;
24
26
  private readonly repositoryRepo;
25
27
  private readonly worktreeService;
26
- constructor(featureRepo: IFeatureRepository, repositoryRepo: IRepositoryRepository, worktreeService: IWorktreeService);
28
+ private readonly gitPrService;
29
+ constructor(featureRepo: IFeatureRepository, repositoryRepo: IRepositoryRepository, worktreeService: IWorktreeService, gitPrService: IGitPrService);
27
30
  execute(input: AdoptBranchInput): Promise<AdoptBranchResult>;
28
31
  /**
29
32
  * Resolve the git ref to use for worktree creation.
@@ -31,6 +34,12 @@ export declare class AdoptBranchUseCase {
31
34
  * Throws if branch does not exist anywhere.
32
35
  */
33
36
  private resolveBranchRef;
37
+ /**
38
+ * Detect if the branch has an open PR (or one whose closure we cannot confirm).
39
+ * Returns PullRequest data if found, undefined otherwise.
40
+ * Gracefully returns undefined if gh CLI is unavailable or the repo has no remote.
41
+ */
42
+ private detectPrForBranch;
34
43
  /**
35
44
  * Find or create a Repository entity for the given path.
36
45
  * Mirrors the pattern from CreateFeatureUseCase.
@@ -1 +1 @@
1
- {"version":3,"file":"adopt-branch.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/adopt-branch.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAGlG,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,qBACa,kBAAkB;IAG3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAJf,WAAW,EAAE,kBAAkB,EAE/B,cAAc,EAAE,qBAAqB,EAErC,eAAe,EAAE,gBAAgB;IAG9C,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6ElE;;;;OAIG;YACW,gBAAgB;IAiB9B;;;OAGG;YACW,iBAAiB;CAuBhC"}
1
+ {"version":3,"file":"adopt-branch.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/adopt-branch.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,qCAAqC,CAAC;AAEhF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAG7F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD,qBACa,kBAAkB;IAG3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBANZ,WAAW,EAAE,kBAAkB,EAE/B,cAAc,EAAE,qBAAqB,EAErC,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,aAAa;IAGxC,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyFlE;;;;OAIG;YACW,gBAAgB;IAiB9B;;;;OAIG;YACW,iBAAiB;IA4B/B;;;OAGG;YACW,iBAAiB;CAuBhC"}
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Imports an existing git branch into Shep's feature tracking system.
5
5
  * Creates a worktree (if needed), derives feature metadata from the branch name,
6
- * and persists a Feature entity with lifecycle=Maintain (agent inactive).
6
+ * and persists a Feature entity. Branches with an open PR get lifecycle=Review
7
+ * (shown as "REVIEW" in the UI); all others get lifecycle=Maintain (completed).
7
8
  *
8
9
  * This is a standalone use case — it does NOT extend or modify CreateFeatureUseCase.
9
10
  * It needs only three dependencies: IFeatureRepository, IRepositoryRepository, and IWorktreeService.
@@ -22,7 +23,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
22
23
  };
23
24
  import { injectable, inject } from 'tsyringe';
24
25
  import { randomUUID } from 'node:crypto';
25
- import { SdlcLifecycle } from '../../../domain/generated/output.js';
26
+ import { SdlcLifecycle, PrStatus } from '../../../domain/generated/output.js';
26
27
  import { deriveName, deriveSlug } from './branch-name-utils.js';
27
28
  /** Branches that must not be adopted as features. */
28
29
  const PROTECTED_BRANCHES = new Set(['main', 'master']);
@@ -30,10 +31,12 @@ let AdoptBranchUseCase = class AdoptBranchUseCase {
30
31
  featureRepo;
31
32
  repositoryRepo;
32
33
  worktreeService;
33
- constructor(featureRepo, repositoryRepo, worktreeService) {
34
+ gitPrService;
35
+ constructor(featureRepo, repositoryRepo, worktreeService, gitPrService) {
34
36
  this.featureRepo = featureRepo;
35
37
  this.repositoryRepo = repositoryRepo;
36
38
  this.worktreeService = worktreeService;
39
+ this.gitPrService = gitPrService;
37
40
  }
38
41
  async execute(input) {
39
42
  const { branchName, repositoryPath } = input;
@@ -64,9 +67,16 @@ let AdoptBranchUseCase = class AdoptBranchUseCase {
64
67
  if (!worktreeExists) {
65
68
  await this.worktreeService.addExisting(repositoryPath, branchRef, worktreePath);
66
69
  }
70
+ // --- Detect open PR for this branch ---
71
+ const prData = await this.detectPrForBranch(branchName, repositoryPath);
67
72
  // --- Derive feature metadata ---
68
73
  const name = deriveName(branchName);
69
74
  const now = new Date();
75
+ const hasOpenPr = prData !== undefined;
76
+ // If the branch has an open (not yet merged) PR, place the feature in
77
+ // Review so the node shows "REVIEW" instead of "COMPLETED". Only truly
78
+ // finished branches (no PR, merged PR, or closed PR) get Maintain.
79
+ const lifecycle = prData?.status === PrStatus.Open ? SdlcLifecycle.Review : SdlcLifecycle.Maintain;
70
80
  // --- Persist feature ---
71
81
  const feature = {
72
82
  id: randomUUID(),
@@ -76,12 +86,12 @@ let AdoptBranchUseCase = class AdoptBranchUseCase {
76
86
  userQuery: '',
77
87
  repositoryPath,
78
88
  branch: branchName,
79
- lifecycle: SdlcLifecycle.Maintain,
89
+ lifecycle,
80
90
  messages: [],
81
91
  relatedArtifacts: [],
82
92
  fast: false,
83
93
  push: false,
84
- openPr: false,
94
+ openPr: hasOpenPr,
85
95
  approvalGates: {
86
96
  allowPrd: false,
87
97
  allowPlan: false,
@@ -89,6 +99,7 @@ let AdoptBranchUseCase = class AdoptBranchUseCase {
89
99
  },
90
100
  worktreePath,
91
101
  repositoryId: repository.id,
102
+ pr: prData,
92
103
  createdAt: now,
93
104
  updatedAt: now,
94
105
  };
@@ -112,6 +123,36 @@ let AdoptBranchUseCase = class AdoptBranchUseCase {
112
123
  throw new Error(`Branch "${branchName}" does not exist locally or on the remote. ` +
113
124
  'Check the branch name spelling and ensure you have fetched from the remote.');
114
125
  }
126
+ /**
127
+ * Detect if the branch has an open PR (or one whose closure we cannot confirm).
128
+ * Returns PullRequest data if found, undefined otherwise.
129
+ * Gracefully returns undefined if gh CLI is unavailable or the repo has no remote.
130
+ */
131
+ async detectPrForBranch(branchName, repositoryPath) {
132
+ try {
133
+ const hasRemote = await this.gitPrService.hasRemote(repositoryPath);
134
+ if (!hasRemote)
135
+ return undefined;
136
+ const prStatuses = await this.gitPrService.listPrStatuses(repositoryPath);
137
+ const match = prStatuses.find((pr) => pr.headRefName === branchName);
138
+ if (!match)
139
+ return undefined;
140
+ // If the PR is definitively closed (not merged), skip it
141
+ if (match.state === PrStatus.Closed)
142
+ return undefined;
143
+ // Open or Merged — attach PR data
144
+ return {
145
+ url: match.url,
146
+ number: match.number,
147
+ status: match.state,
148
+ mergeable: match.mergeable,
149
+ };
150
+ }
151
+ catch {
152
+ // gh CLI not installed, auth failure, etc. — gracefully skip PR detection
153
+ return undefined;
154
+ }
155
+ }
115
156
  /**
116
157
  * Find or create a Repository entity for the given path.
117
158
  * Mirrors the pattern from CreateFeatureUseCase.
@@ -141,6 +182,7 @@ AdoptBranchUseCase = __decorate([
141
182
  __param(0, inject('IFeatureRepository')),
142
183
  __param(1, inject('IRepositoryRepository')),
143
184
  __param(2, inject('IWorktreeService')),
144
- __metadata("design:paramtypes", [Object, Object, Object])
185
+ __param(3, inject('IGitPrService')),
186
+ __metadata("design:paramtypes", [Object, Object, Object, Object])
145
187
  ], AdoptBranchUseCase);
146
188
  export { AdoptBranchUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"adopt.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/adopt.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,IAAI,OAAO,CA6B5C"}
1
+ {"version":3,"file":"adopt.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/adopt.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,IAAI,OAAO,CAkC5C"}
@@ -31,6 +31,9 @@ export function createAdoptCommand() {
31
31
  console.log(` ${colors.muted('Name:')} ${feature.name}`);
32
32
  console.log(` ${colors.muted('Branch:')} ${colors.accent(feature.branch)}`);
33
33
  console.log(` ${colors.muted('Status:')} ${feature.lifecycle}`);
34
+ if (feature.pr) {
35
+ console.log(` ${colors.muted('PR:')} ${colors.accent(feature.pr.url)} (${feature.pr.status})`);
36
+ }
34
37
  console.log(` ${colors.muted('Worktree:')} ${colors.accent(feature.worktreePath ?? '')}`);
35
38
  messages.newline();
36
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAuDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAQlE,CAAC;AAeF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
1
+ {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CA4DlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAQlE,CAAC;AAeF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
@@ -51,6 +51,10 @@ export function deriveNodeState(feature, agentRun, options) {
51
51
  if (feature.lifecycle === SdlcLifecycle.Maintain) {
52
52
  return 'done';
53
53
  }
54
+ // Adopted branch with an open PR — needs user review/merge action
55
+ if (feature.lifecycle === SdlcLifecycle.Review && !agentRun) {
56
+ return 'action-required';
57
+ }
54
58
  const tasks = feature.plan?.tasks;
55
59
  if (!tasks || tasks.length === 0) {
56
60
  return 'running';