@shepai/cli 1.151.2-pr438.6135e39 → 1.151.2-pr470.ec33cce

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 (197) hide show
  1. package/apis/json-schema/WorkflowConfig.yaml +0 -5
  2. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +0 -28
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +0 -37
  5. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +0 -12
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts +3 -5
  8. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/ports/output/services/index.js +1 -2
  10. package/dist/packages/core/src/domain/generated/output.d.ts +0 -185
  11. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/di/container.js +0 -4
  14. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +1 -3
  15. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +1 -37
  17. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -2
  18. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +0 -21
  20. package/dist/src/presentation/cli/index.js +0 -2
  21. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts +15 -0
  22. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts.map +1 -0
  23. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.js +43 -0
  24. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts +18 -0
  25. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts.map +1 -0
  26. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.js +125 -0
  27. package/dist/src/presentation/web/components/common/evidence-lightbox/index.d.ts +3 -0
  28. package/dist/src/presentation/web/components/common/evidence-lightbox/index.d.ts.map +1 -0
  29. package/dist/src/presentation/web/components/common/evidence-lightbox/index.js +1 -0
  30. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +28 -2
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/package.json +1 -1
  34. package/web/.next/BUILD_ID +1 -1
  35. package/web/.next/build-manifest.json +2 -2
  36. package/web/.next/fallback-build-manifest.json +2 -2
  37. package/web/.next/prerender-manifest.json +3 -3
  38. package/web/.next/required-server-files.js +1 -1
  39. package/web/.next/required-server-files.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  41. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  44. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  56. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  65. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/_global-error.html +2 -2
  71. package/web/.next/server/app/_global-error.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  77. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  78. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  80. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  81. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  82. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  83. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  84. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  86. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  87. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  89. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  90. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  92. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  94. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  95. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  97. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -3
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/_0c473fef._.js +2 -2
  123. package/web/.next/server/chunks/ssr/_0c473fef._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  127. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/{_c2ca0f1b._.js → _34a8a162._.js} +2 -2
  129. package/web/.next/server/chunks/ssr/{_c2ca0f1b._.js.map → _34a8a162._.js.map} +1 -1
  130. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  131. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  133. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/{_dc9a9d32._.js → _762bbdd5._.js} +2 -2
  137. package/web/.next/server/chunks/ssr/{_dc9a9d32._.js.map → _762bbdd5._.js.map} +1 -1
  138. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +1 -1
  139. package/web/.next/server/chunks/ssr/_8fcc39d4._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  141. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  144. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/_e9e9ed20._.js +2 -2
  146. package/web/.next/server/chunks/ssr/_e9e9ed20._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  148. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  150. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web_b437e763._.js +3 -0
  155. package/web/.next/server/chunks/ssr/{src_presentation_web_aa941041._.js.map → src_presentation_web_b437e763._.js.map} +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  160. package/web/.next/server/pages/500.html +2 -2
  161. package/web/.next/server/server-reference-manifest.js +1 -1
  162. package/web/.next/server/server-reference-manifest.json +45 -45
  163. package/web/.next/static/chunks/{359b2815c5ed39cc.js → 0d473fbdf724361c.js} +1 -1
  164. package/web/.next/static/chunks/{e760b952ba1a10d4.js → 1ef9dfc624cdd5c0.js} +1 -1
  165. package/web/.next/static/chunks/{79eae02d0342fb73.js → 2c4e4027386847dc.js} +1 -1
  166. package/web/.next/static/chunks/{87b72b8a10f8255b.js → 331e2a1232d9f855.js} +3 -3
  167. package/web/.next/static/chunks/{80915095cec414bf.js → 48a36b37fc27443b.js} +1 -1
  168. package/web/.next/static/chunks/52470bcbe2e8198d.css +1 -0
  169. package/web/.next/static/chunks/{5e1877d1f1bcfd77.js → 6e406c42f179f73f.js} +1 -1
  170. package/web/.next/static/chunks/{c2388f8bc58b2a21.js → 706819c360883af1.js} +1 -1
  171. package/web/.next/static/chunks/{4a28fd1bca225386.js → 7bf35c5612fdba16.js} +1 -1
  172. package/web/.next/static/chunks/{76a3f345f8cf2608.js → c286aae364899eae.js} +1 -1
  173. package/web/.next/static/chunks/{25889ca8401d1bc0.js → d8685c1bf2415bc5.js} +1 -1
  174. package/web/.next/static/chunks/{091de81012e2bc48.js → e558b4b9d066763c.js} +1 -1
  175. package/web/.next/static/chunks/{ed9408f100149c34.js → ebebc7a215e04768.js} +1 -1
  176. package/apis/json-schema/AgentRunDetail.yaml +0 -28
  177. package/apis/json-schema/DoctorDiagnosticReport.yaml +0 -76
  178. package/apis/json-schema/FailedRunSummary.yaml +0 -22
  179. package/apis/json-schema/SystemInfo.yaml +0 -22
  180. package/apis/json-schema/WorkerLogEntry.yaml +0 -27
  181. package/dist/packages/core/src/application/ports/output/services/github-issue-service.interface.d.ts +0 -57
  182. package/dist/packages/core/src/application/ports/output/services/github-issue-service.interface.d.ts.map +0 -1
  183. package/dist/packages/core/src/application/ports/output/services/github-issue-service.interface.js +0 -39
  184. package/dist/packages/core/src/application/use-cases/doctor/doctor-diagnose.use-case.d.ts +0 -64
  185. package/dist/packages/core/src/application/use-cases/doctor/doctor-diagnose.use-case.d.ts.map +0 -1
  186. package/dist/packages/core/src/application/use-cases/doctor/doctor-diagnose.use-case.js +0 -493
  187. package/dist/packages/core/src/infrastructure/services/external/github-issue-creator.service.d.ts +0 -17
  188. package/dist/packages/core/src/infrastructure/services/external/github-issue-creator.service.d.ts.map +0 -1
  189. package/dist/packages/core/src/infrastructure/services/external/github-issue-creator.service.js +0 -69
  190. package/dist/src/presentation/cli/commands/doctor.command.d.ts +0 -20
  191. package/dist/src/presentation/cli/commands/doctor.command.d.ts.map +0 -1
  192. package/dist/src/presentation/cli/commands/doctor.command.js +0 -129
  193. package/web/.next/server/chunks/ssr/src_presentation_web_aa941041._.js +0 -3
  194. package/web/.next/static/chunks/9b8678597fa1db84.css +0 -1
  195. /package/web/.next/static/{-o7QIcv1p5C722dwF4EFd → crqlqgDegiKDLReFt70L0}/_buildManifest.js +0 -0
  196. /package/web/.next/static/{-o7QIcv1p5C722dwF4EFd → crqlqgDegiKDLReFt70L0}/_clientMiddlewareManifest.json +0 -0
  197. /package/web/.next/static/{-o7QIcv1p5C722dwF4EFd → crqlqgDegiKDLReFt70L0}/_ssgManifest.js +0 -0
@@ -5,7 +5,7 @@
5
5
  * Uses constructor dependency injection for the command executor.
6
6
  */
7
7
  import type { IGitPrService } from '../../../application/ports/output/services/git-pr-service.interface.js';
8
- import type { CiStatusResult, DiffSummary, FileDiff, MergeStrategy, PrCreateArgs, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
8
+ import type { CiStatusResult, DiffSummary, FileDiff, MergeStrategy, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
9
9
  import type { ExecFunction } from './worktree.service.js';
10
10
  export declare class GitPrService implements IGitPrService {
11
11
  private readonly execFile;
@@ -18,7 +18,6 @@ export declare class GitPrService implements IGitPrService {
18
18
  commitAll(cwd: string, message: string): Promise<string>;
19
19
  push(cwd: string, branch: string, setUpstream?: boolean): Promise<void>;
20
20
  createPr(cwd: string, prYamlPath: string): Promise<PrCreateResult>;
21
- createPrFromArgs(cwd: string, args: PrCreateArgs): Promise<PrCreateResult>;
22
21
  mergePr(cwd: string, prNumber: number, strategy?: MergeStrategy): Promise<void>;
23
22
  private getPrHeadBranch;
24
23
  localMergeSquash(cwd: string, featureBranch: string, baseBranch: string, commitMessage: string, hasRemote?: boolean): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
@@ -184,27 +184,6 @@ let GitPrService = class GitPrService {
184
184
  throw this.parseGhError(error);
185
185
  }
186
186
  }
187
- async createPrFromArgs(cwd, args) {
188
- try {
189
- const ghArgs = ['pr', 'create', '--title', args.title, '--body', args.body];
190
- if (args.base) {
191
- ghArgs.push('--base', args.base);
192
- }
193
- if (args.labels?.length) {
194
- ghArgs.push('--label', args.labels.join(','));
195
- }
196
- if (args.repo) {
197
- ghArgs.push('--repo', args.repo);
198
- }
199
- const { stdout } = await this.execFile('gh', ghArgs, { cwd });
200
- const url = stdout.trim();
201
- const number = this.parsePrNumberFromUrl(url);
202
- return { url, number };
203
- }
204
- catch (error) {
205
- throw this.parseGhError(error);
206
- }
207
- }
208
187
  async mergePr(cwd, prNumber, strategy = 'squash') {
209
188
  try {
210
189
  await this.execFile('gh', ['pr', 'merge', String(prNumber), `--${strategy}`], {
@@ -42,7 +42,6 @@ import { createIdeOpenCommand } from './commands/ide-open.command.js';
42
42
  import { createInstallCommand } from './commands/install.command.js';
43
43
  import { createUpgradeCommand } from './commands/upgrade.command.js';
44
44
  import { createToolsCommand } from './commands/tools.command.js';
45
- import { createDoctorCommand } from './commands/doctor.command.js';
46
45
  import { messages } from './ui/index.js';
47
46
  // Daemon lifecycle commands
48
47
  import { createStartCommand } from './commands/start.command.js';
@@ -111,7 +110,6 @@ async function bootstrap() {
111
110
  program.addCommand(createInstallCommand());
112
111
  program.addCommand(createToolsCommand());
113
112
  program.addCommand(createUpgradeCommand());
114
- program.addCommand(createDoctorCommand());
115
113
  // Daemon lifecycle commands (task-9)
116
114
  program.addCommand(createStartCommand());
117
115
  program.addCommand(createStopCommand());
@@ -0,0 +1,15 @@
1
+ import type { MergeReviewEvidence } from '../../common/merge-review/merge-review-config.js';
2
+ export interface EvidenceLightboxProps {
3
+ /** Array of image evidence items to display in the lightbox. */
4
+ images: MergeReviewEvidence[];
5
+ /** Whether the lightbox dialog is open. */
6
+ open: boolean;
7
+ /** Callback when the dialog open state changes. */
8
+ onOpenChange: (open: boolean) => void;
9
+ /** Index of the currently selected image. */
10
+ selectedIndex: number;
11
+ /** Callback when the selected image index changes. */
12
+ onSelectedIndexChange: (index: number) => void;
13
+ }
14
+ export declare function EvidenceLightbox({ images, open, onOpenChange, selectedIndex, onSelectedIndexChange, }: EvidenceLightboxProps): import("react/jsx-runtime").JSX.Element | null;
15
+ //# sourceMappingURL=evidence-lightbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-lightbox.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAOhG,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,2CAA2C;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,mDAAmD;IACnD,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAKD,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,qBAAqB,GACtB,EAAE,qBAAqB,kDA6FvB"}
@@ -0,0 +1,43 @@
1
+ /* eslint-disable @next/next/no-img-element -- Local evidence files require raw <img>, not next/image */
2
+ 'use client';
3
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
4
+ import { useEffect, useCallback } from 'react';
5
+ import { Dialog, DialogContent, DialogTitle } from '../../ui/dialog.js';
6
+ import { VisuallyHidden } from 'radix-ui';
7
+ import { ChevronLeft, ChevronRight, DownloadIcon } from 'lucide-react';
8
+ /** Build the API URL for serving an evidence file (paths are pre-normalized to absolute). */
9
+ function buildEvidenceUrl(absolutePath) {
10
+ return `/api/evidence?path=${encodeURIComponent(absolutePath)}`;
11
+ }
12
+ const DIALOG_CONTENT_CLASS = 'max-w-4xl gap-0 overflow-hidden border-0 p-0 [&>button:last-child]:!cursor-pointer [&>button:last-child]:!rounded-full [&>button:last-child]:!bg-black/70 [&>button:last-child]:!p-1.5 [&>button:last-child]:!text-white [&>button:last-child]:!opacity-100 [&>button:last-child]:!shadow-lg [&>button:last-child]:!backdrop-blur-md [&>button:last-child]:hover:!bg-black/90';
13
+ export function EvidenceLightbox({ images, open, onOpenChange, selectedIndex, onSelectedIndexChange, }) {
14
+ const count = images.length;
15
+ const current = images[selectedIndex];
16
+ const hasMultiple = count > 1;
17
+ const goNext = useCallback(() => {
18
+ onSelectedIndexChange((selectedIndex + 1) % count);
19
+ }, [selectedIndex, count, onSelectedIndexChange]);
20
+ const goPrev = useCallback(() => {
21
+ onSelectedIndexChange((selectedIndex - 1 + count) % count);
22
+ }, [selectedIndex, count, onSelectedIndexChange]);
23
+ useEffect(() => {
24
+ if (!open || !hasMultiple)
25
+ return;
26
+ function handleKeyDown(e) {
27
+ if (e.key === 'ArrowRight') {
28
+ e.stopPropagation();
29
+ goNext();
30
+ }
31
+ else if (e.key === 'ArrowLeft') {
32
+ e.stopPropagation();
33
+ goPrev();
34
+ }
35
+ }
36
+ document.addEventListener('keydown', handleKeyDown);
37
+ return () => document.removeEventListener('keydown', handleKeyDown);
38
+ }, [open, hasMultiple, goNext, goPrev]);
39
+ if (!current)
40
+ return null;
41
+ const imageUrl = buildEvidenceUrl(current.relativePath);
42
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: DIALOG_CONTENT_CLASS, "aria-describedby": undefined, children: [_jsx(VisuallyHidden.Root, { children: _jsxs(DialogTitle, { children: ["Evidence: ", current.description] }) }), _jsx("div", { className: "relative bg-black/90", children: _jsx("img", { src: imageUrl, alt: current.description, className: "h-auto max-h-[90vh] w-full object-contain" }) }), _jsxs("div", { className: "bg-background flex items-center gap-3 px-4 py-3", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [hasMultiple ? (_jsxs("span", { className: "text-muted-foreground shrink-0 text-xs tabular-nums", children: [selectedIndex + 1, " / ", count] })) : null, _jsx("span", { className: "text-foreground truncate text-sm", children: current.description })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [hasMultiple ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: goPrev, className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1.5 transition-colors", "aria-label": "Previous image", children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: goNext, className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1.5 transition-colors", "aria-label": "Next image", children: _jsx(ChevronRight, { className: "h-4 w-4" }) })] })) : null, _jsx("a", { href: imageUrl, download: true, className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-1.5 transition-colors", "aria-label": "Download image", children: _jsx(DownloadIcon, { className: "h-4 w-4" }) })] })] })] }) }));
43
+ }
@@ -0,0 +1,18 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { EvidenceLightbox } from './evidence-lightbox.js';
3
+ declare const meta: Meta<typeof EvidenceLightbox>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof EvidenceLightbox>;
6
+ /** Default — 3-column thumbnail gallery with 3 image evidence items. Click to open lightbox. */
7
+ export declare const Default: Story;
8
+ /** Lightbox open — dialog visible with image, counter, nav buttons, description, and download. */
9
+ export declare const LightboxOpen: Story;
10
+ /** Single image — gallery with one thumbnail. Lightbox opens without nav buttons or counter. */
11
+ export declare const SingleImage: Story;
12
+ /** Many images — 8 images in the gallery grid to test multi-row layout. */
13
+ export declare const ManyImages: Story;
14
+ /** Mixed evidence — images in gallery grid + non-images listed below as expandable items. */
15
+ export declare const MixedEvidence: Story;
16
+ /** Lightbox only (controlled) — raw EvidenceLightbox component with args. */
17
+ export declare const LightboxControlled: Story;
18
+ //# sourceMappingURL=evidence-lightbox.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-lightbox.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA+JvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAYvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAM/C,gGAAgG;AAChG,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,EAAE,KAQhC,CAAC"}
@@ -0,0 +1,125 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* eslint-disable @next/next/no-img-element -- Story thumbnails use raw <img> to match production */
3
+ import { useState } from 'react';
4
+ import { fn } from '@storybook/test';
5
+ import { EvidenceLightbox } from './evidence-lightbox.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Mock data — placeholder images via data-URI (1×1 colored pixels)
8
+ // ---------------------------------------------------------------------------
9
+ function mockEvidence(index, overrides) {
10
+ return {
11
+ type: 'Screenshot',
12
+ capturedAt: `2026-03-09T12:0${index}:00Z`,
13
+ description: `Screenshot ${index + 1} — evidence capture`,
14
+ relativePath: `/home/user/.shep/repos/abc/evidence/screenshot-${index}.png`,
15
+ taskRef: `task-${index + 1}`,
16
+ ...overrides,
17
+ };
18
+ }
19
+ const threeImages = [
20
+ mockEvidence(0, { description: 'Homepage after auth banner added' }),
21
+ mockEvidence(1, { description: 'Login form validation error states' }),
22
+ mockEvidence(2, { description: 'Dashboard with new sidebar navigation' }),
23
+ ];
24
+ const singleImage = [
25
+ mockEvidence(0, { description: 'Final state of the landing page redesign' }),
26
+ ];
27
+ const manyImages = Array.from({ length: 8 }, (_, i) => mockEvidence(i, {
28
+ description: `Evidence capture ${i + 1} — ${['homepage', 'login form', 'dashboard', 'settings page', 'profile view', 'search results', 'notification panel', 'admin console'][i]}`,
29
+ }));
30
+ const mixedEvidence = [
31
+ mockEvidence(0, { description: 'Homepage showing new auth banner' }),
32
+ mockEvidence(1, { description: 'Login form with validation errors' }),
33
+ mockEvidence(2, { description: 'Dashboard after navigation update' }),
34
+ {
35
+ type: 'TestOutput',
36
+ capturedAt: '2026-03-09T12:04:00Z',
37
+ description: 'Unit tests — all 42 passing',
38
+ relativePath: '/home/user/.shep/repos/abc/evidence/unit-test-results.txt',
39
+ taskRef: 'task-4',
40
+ },
41
+ {
42
+ type: 'Video',
43
+ capturedAt: '2026-03-09T12:05:00Z',
44
+ description: 'Login flow walkthrough recording',
45
+ relativePath: '/home/user/.shep/repos/abc/evidence/login-flow.mp4',
46
+ },
47
+ {
48
+ type: 'TerminalRecording',
49
+ capturedAt: '2026-03-09T12:06:00Z',
50
+ description: 'CLI auth command output',
51
+ relativePath: '/home/user/.shep/repos/abc/evidence/cli-auth.txt',
52
+ taskRef: 'task-5',
53
+ },
54
+ ];
55
+ // ---------------------------------------------------------------------------
56
+ // Helper: thumbnail gallery grid + lightbox (mirrors EvidenceList behavior)
57
+ // ---------------------------------------------------------------------------
58
+ const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp']);
59
+ function getExtension(path) {
60
+ const dot = path.lastIndexOf('.');
61
+ return dot >= 0 ? path.slice(dot).toLowerCase() : '';
62
+ }
63
+ function isImageEvidence(e) {
64
+ return e.type === 'Screenshot' || IMAGE_EXTENSIONS.has(getExtension(e.relativePath));
65
+ }
66
+ function buildEvidenceUrl(absolutePath) {
67
+ return `/api/evidence?path=${encodeURIComponent(absolutePath)}`;
68
+ }
69
+ /** Story wrapper that renders a thumbnail grid + lightbox, matching EvidenceList layout. */
70
+ function GalleryWithLightbox({ evidence, initialOpen = false, initialIndex = 0, }) {
71
+ const [open, setOpen] = useState(initialOpen);
72
+ const [selectedIndex, setSelectedIndex] = useState(initialIndex);
73
+ const imageEvidence = evidence.filter(isImageEvidence);
74
+ const nonImageEvidence = evidence.filter((e) => !isImageEvidence(e));
75
+ return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx("span", { className: "bg-secondary text-secondary-foreground rounded-md px-1.5 py-0.5 text-[10px] font-medium", children: evidence.length })] }), imageEvidence.length > 0 ? (_jsx("div", { className: "mb-3 grid grid-cols-3 gap-2", children: imageEvidence.map((e, i) => (_jsx("button", { type: "button", className: "cursor-pointer overflow-hidden rounded-md border", onClick: () => {
76
+ setSelectedIndex(i);
77
+ setOpen(true);
78
+ }, children: _jsx("img", { src: buildEvidenceUrl(e.relativePath), alt: e.description, className: "aspect-square w-full bg-gray-100 object-cover dark:bg-gray-800", loading: "lazy" }) }, e.relativePath))) })) : null, nonImageEvidence.length > 0 ? (_jsx("ul", { className: "space-y-2", children: nonImageEvidence.map((e) => (_jsx("li", { className: "border-border rounded-md border", children: _jsxs("div", { className: "flex items-center gap-2.5 px-3 py-2.5", children: [_jsx("span", { className: "text-foreground text-xs font-medium", children: e.description }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", e.type, ")"] })] }) }, e.relativePath))) })) : null] }), _jsx(EvidenceLightbox, { images: imageEvidence, open: open, onOpenChange: setOpen, selectedIndex: selectedIndex, onSelectedIndexChange: setSelectedIndex })] }));
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Meta
82
+ // ---------------------------------------------------------------------------
83
+ const meta = {
84
+ title: 'Common/EvidenceLightbox',
85
+ component: EvidenceLightbox,
86
+ tags: ['autodocs'],
87
+ parameters: { layout: 'padded' },
88
+ decorators: [
89
+ (Story) => (_jsx("div", { style: { maxWidth: '400px', border: '1px solid var(--color-border)', padding: '16px' }, children: _jsx(Story, {}) })),
90
+ ],
91
+ };
92
+ export default meta;
93
+ // ---------------------------------------------------------------------------
94
+ // Stories
95
+ // ---------------------------------------------------------------------------
96
+ /** Default — 3-column thumbnail gallery with 3 image evidence items. Click to open lightbox. */
97
+ export const Default = {
98
+ render: () => _jsx(GalleryWithLightbox, { evidence: threeImages }),
99
+ };
100
+ /** Lightbox open — dialog visible with image, counter, nav buttons, description, and download. */
101
+ export const LightboxOpen = {
102
+ render: () => _jsx(GalleryWithLightbox, { evidence: threeImages, initialOpen: true, initialIndex: 1 }),
103
+ };
104
+ /** Single image — gallery with one thumbnail. Lightbox opens without nav buttons or counter. */
105
+ export const SingleImage = {
106
+ render: () => _jsx(GalleryWithLightbox, { evidence: singleImage, initialOpen: true }),
107
+ };
108
+ /** Many images — 8 images in the gallery grid to test multi-row layout. */
109
+ export const ManyImages = {
110
+ render: () => _jsx(GalleryWithLightbox, { evidence: manyImages }),
111
+ };
112
+ /** Mixed evidence — images in gallery grid + non-images listed below as expandable items. */
113
+ export const MixedEvidence = {
114
+ render: () => _jsx(GalleryWithLightbox, { evidence: mixedEvidence }),
115
+ };
116
+ /** Lightbox only (controlled) — raw EvidenceLightbox component with args. */
117
+ export const LightboxControlled = {
118
+ args: {
119
+ images: threeImages,
120
+ open: true,
121
+ onOpenChange: fn().mockName('onOpenChange'),
122
+ selectedIndex: 0,
123
+ onSelectedIndexChange: fn().mockName('onSelectedIndexChange'),
124
+ },
125
+ };
@@ -0,0 +1,3 @@
1
+ export { EvidenceLightbox } from './evidence-lightbox.js';
2
+ export type { EvidenceLightboxProps } from './evidence-lightbox.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/evidence-lightbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ export { EvidenceLightbox } from './evidence-lightbox.js';
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AAuJnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CA+JlB"}
1
+ {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AAmNnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CA+JlB"}
@@ -1,10 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from 'react';
3
+ import { useState, useMemo } from 'react';
4
4
  import { ExternalLink, AlertTriangle, FileDiff, GitCommitHorizontal, GitBranch, ArrowRight, Camera, FileText, MonitorPlay, Terminal, Download, ChevronDown, ChevronRight, } from 'lucide-react';
5
5
  import { Badge } from '../../ui/badge.js';
6
6
  import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
7
7
  import { DrawerActionBar } from '../../common/drawer-action-bar/index.js';
8
+ import { EvidenceLightbox } from '../../common/evidence-lightbox/index.js';
8
9
  import { DiffView } from './diff-view.js';
9
10
  const EVIDENCE_ICONS = {
10
11
  Screenshot: Camera,
@@ -54,8 +55,33 @@ function EvidenceTextPreview({ url }) {
54
55
  }
55
56
  return (_jsx("pre", { className: "bg-muted/50 max-h-60 overflow-auto rounded-md p-3 font-mono text-[11px] leading-relaxed", children: content }));
56
57
  }
58
+ function isImageEvidence(evidence) {
59
+ return (evidence.type === 'Screenshot' || IMAGE_EXTENSIONS.has(getExtension(evidence.relativePath)));
60
+ }
57
61
  function EvidenceList({ evidence }) {
58
- return (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(Camera, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx(Badge, { variant: "secondary", className: "text-[10px]", children: evidence.length })] }), _jsx("ul", { className: "space-y-2", children: evidence.map((e) => (_jsx(EvidenceItem, { evidence: e }, `${e.type}-${e.relativePath}`))) })] }) }));
62
+ const [lightboxOpen, setLightboxOpen] = useState(false);
63
+ const [selectedIndex, setSelectedIndex] = useState(0);
64
+ const { imageEvidence, nonImageEvidence } = useMemo(() => {
65
+ const imgs = [];
66
+ const nonImgs = [];
67
+ for (const e of evidence) {
68
+ if (isImageEvidence(e)) {
69
+ imgs.push(e);
70
+ }
71
+ else {
72
+ nonImgs.push(e);
73
+ }
74
+ }
75
+ return { imageEvidence: imgs, nonImageEvidence: nonImgs };
76
+ }, [evidence]);
77
+ function handleThumbnailClick(index) {
78
+ setSelectedIndex(index);
79
+ setLightboxOpen(true);
80
+ }
81
+ return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(Camera, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx(Badge, { variant: "secondary", className: "text-[10px]", children: evidence.length })] }), imageEvidence.length > 0 ? (
82
+ /* eslint-disable @next/next/no-img-element -- Local evidence files require raw <img>, not next/image */
83
+ _jsx("div", { className: "mb-3 grid grid-cols-3 gap-2", children: imageEvidence.map((e, i) => (_jsx("button", { type: "button", className: "cursor-pointer overflow-hidden rounded-md border", onClick: () => handleThumbnailClick(i), children: _jsx("img", { src: buildEvidenceUrl(e.relativePath), alt: e.description, className: "aspect-square w-full object-cover", loading: "lazy" }) }, `thumb-${e.relativePath}`))) })) : /* eslint-enable @next/next/no-img-element */
84
+ null, nonImageEvidence.length > 0 ? (_jsx("ul", { className: "space-y-2", children: nonImageEvidence.map((e) => (_jsx(EvidenceItem, { evidence: e }, `${e.type}-${e.relativePath}`))) })) : null] }), _jsx(EvidenceLightbox, { images: imageEvidence, open: lightboxOpen, onOpenChange: setLightboxOpen, selectedIndex: selectedIndex, onSelectedIndexChange: setSelectedIndex })] }));
59
85
  }
60
86
  export function MergeReview({ data, readOnly = false, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
61
87
  const { pr, diffSummary, fileDiffs, branch, warning, evidence, hideCiStatus } = data;