@shepai/cli 1.149.1-pr469.a02d90d → 1.149.1-pr470.181ab7c

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 (181) hide show
  1. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/di/container.js +0 -13
  3. package/dist/src/presentation/cli/index.d.ts +0 -1
  4. package/dist/src/presentation/cli/index.d.ts.map +1 -1
  5. package/dist/src/presentation/cli/index.js +0 -3
  6. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts +15 -0
  7. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.d.ts.map +1 -0
  8. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.js +43 -0
  9. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts +18 -0
  10. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.d.ts.map +1 -0
  11. package/dist/src/presentation/web/components/common/evidence-lightbox/evidence-lightbox.stories.js +125 -0
  12. package/dist/src/presentation/web/components/common/evidence-lightbox/index.d.ts +3 -0
  13. package/dist/src/presentation/web/components/common/evidence-lightbox/index.d.ts.map +1 -0
  14. package/dist/src/presentation/web/components/common/evidence-lightbox/index.js +1 -0
  15. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +28 -2
  17. package/dist/src/presentation/web/hooks/useTheme.d.ts +1 -1
  18. package/dist/tsconfig.build.tsbuildinfo +1 -1
  19. package/package.json +1 -3
  20. package/web/.next/BUILD_ID +1 -1
  21. package/web/.next/build-manifest.json +2 -2
  22. package/web/.next/fallback-build-manifest.json +2 -2
  23. package/web/.next/prerender-manifest.json +3 -3
  24. package/web/.next/required-server-files.js +1 -1
  25. package/web/.next/required-server-files.json +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  27. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  30. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  33. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  36. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  39. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  42. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  45. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  48. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  51. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  54. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/_global-error.html +2 -2
  57. package/web/.next/server/app/_global-error.rsc +1 -1
  58. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  59. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  61. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  63. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  64. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  66. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  67. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  68. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  69. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  70. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  72. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  73. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  75. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  76. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  78. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  80. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  81. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -3
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  102. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  104. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  106. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  108. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  110. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  112. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  114. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  116. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/{_632999e5._.js → _8c1ecf12._.js} +2 -2
  118. package/web/.next/server/chunks/ssr/{_632999e5._.js.map → _8c1ecf12._.js.map} +1 -1
  119. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +1 -1
  120. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/_c0d42db9._.js +3 -0
  123. package/web/.next/server/chunks/ssr/{_48c27bde._.js.map → _c0d42db9._.js.map} +1 -1
  124. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  127. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  133. package/web/.next/server/chunks/ssr/{src_presentation_web_bf0f159f._.js → src_presentation_web_b40daacd._.js} +2 -2
  134. package/web/.next/server/chunks/ssr/{src_presentation_web_bf0f159f._.js.map → src_presentation_web_b40daacd._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  139. package/web/.next/server/pages/500.html +2 -2
  140. package/web/.next/server/server-reference-manifest.js +1 -1
  141. package/web/.next/server/server-reference-manifest.json +44 -44
  142. package/web/.next/static/chunks/{bb090d9e36df8327.js → 0541215261be863c.js} +1 -1
  143. package/web/.next/static/chunks/{22a499ec013f10be.js → 157c9dc13f50a7b0.js} +1 -1
  144. package/web/.next/static/chunks/{1a8a38f6308de8b4.js → 26bf5bbba13a82e6.js} +1 -1
  145. package/web/.next/static/chunks/{9f04f42c1705c673.js → 2ec1f596453dd1f2.js} +3 -3
  146. package/web/.next/static/chunks/{97c21e22559eef75.js → 4d6eda6040df02ce.js} +1 -1
  147. package/web/.next/static/chunks/52470bcbe2e8198d.css +1 -0
  148. package/web/.next/static/chunks/68312c4f96aa45cb.js +1 -0
  149. package/web/.next/static/chunks/{4bde88d697f31229.js → 808b5c407600a5a4.js} +1 -1
  150. package/web/.next/static/chunks/{9651aaa108eba61c.js → 8b0566bb8abb859c.js} +1 -1
  151. package/web/.next/static/chunks/{db8e005837f3044b.js → 8b724f9eb703b65f.js} +1 -1
  152. package/web/.next/static/chunks/{a704525b56425f85.js → 96a2f9ad6146fe70.js} +1 -1
  153. package/web/.next/static/chunks/{bec96dacaa80110a.js → 9d92dc5a448e4a75.js} +1 -1
  154. package/web/.next/static/chunks/{5cba475c8264bfff.js → f37fa84c0b1429a4.js} +2 -2
  155. package/dist/packages/core/src/infrastructure/services/mcp/mcp-server.service.d.ts +0 -25
  156. package/dist/packages/core/src/infrastructure/services/mcp/mcp-server.service.d.ts.map +0 -1
  157. package/dist/packages/core/src/infrastructure/services/mcp/mcp-server.service.js +0 -38
  158. package/dist/packages/core/src/infrastructure/services/mcp/tools/agent-tools.d.ts +0 -13
  159. package/dist/packages/core/src/infrastructure/services/mcp/tools/agent-tools.d.ts.map +0 -1
  160. package/dist/packages/core/src/infrastructure/services/mcp/tools/agent-tools.js +0 -92
  161. package/dist/packages/core/src/infrastructure/services/mcp/tools/feature-tools.d.ts +0 -13
  162. package/dist/packages/core/src/infrastructure/services/mcp/tools/feature-tools.d.ts.map +0 -1
  163. package/dist/packages/core/src/infrastructure/services/mcp/tools/feature-tools.js +0 -122
  164. package/dist/packages/core/src/infrastructure/services/mcp/tools/index.d.ts +0 -12
  165. package/dist/packages/core/src/infrastructure/services/mcp/tools/index.d.ts.map +0 -1
  166. package/dist/packages/core/src/infrastructure/services/mcp/tools/index.js +0 -18
  167. package/dist/packages/core/src/infrastructure/services/mcp/tools/repo-tools.d.ts +0 -13
  168. package/dist/packages/core/src/infrastructure/services/mcp/tools/repo-tools.d.ts.map +0 -1
  169. package/dist/packages/core/src/infrastructure/services/mcp/tools/repo-tools.js +0 -39
  170. package/dist/packages/core/src/infrastructure/services/mcp/tools/settings-tools.d.ts +0 -13
  171. package/dist/packages/core/src/infrastructure/services/mcp/tools/settings-tools.d.ts.map +0 -1
  172. package/dist/packages/core/src/infrastructure/services/mcp/tools/settings-tools.js +0 -57
  173. package/dist/src/presentation/cli/commands/mcp.command.d.ts +0 -20
  174. package/dist/src/presentation/cli/commands/mcp.command.d.ts.map +0 -1
  175. package/dist/src/presentation/cli/commands/mcp.command.js +0 -65
  176. package/web/.next/server/chunks/ssr/_48c27bde._.js +0 -3
  177. package/web/.next/static/chunks/9b8678597fa1db84.css +0 -1
  178. package/web/.next/static/chunks/d6579a7c65fdb449.js +0 -1
  179. /package/web/.next/static/{N1E-vO_BaQtqQQzmIws-E → gB1rARZYoJnVIR28ikzjW}/_buildManifest.js +0 -0
  180. /package/web/.next/static/{N1E-vO_BaQtqQQzmIws-E → gB1rARZYoJnVIR28ikzjW}/_clientMiddlewareManifest.json +0 -0
  181. /package/web/.next/static/{N1E-vO_BaQtqQQzmIws-E → gB1rARZYoJnVIR28ikzjW}/_ssgManifest.js +0 -0
@@ -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;AAiIrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA0XrE;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;AAiIrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA4WrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -436,19 +436,6 @@ export async function initializeContainer() {
436
436
  container.register('GetBranchSyncStatusUseCase', {
437
437
  useFactory: (c) => c.resolve(GetBranchSyncStatusUseCase),
438
438
  });
439
- // McpServerFactory is registered as a lazy async factory to avoid importing
440
- // @modelcontextprotocol/sdk for non-MCP commands. The factory uses dynamic
441
- // import() — the actual SDK import only happens when the factory is called.
442
- container.register('McpServerFactory', {
443
- useFactory: (c) => {
444
- return async () => {
445
- const { McpServerService } = await import('../services/mcp/mcp-server.service.js');
446
- const versionService = c.resolve('IVersionService');
447
- const { version } = versionService.getVersion();
448
- return new McpServerService(version, c);
449
- };
450
- },
451
- });
452
439
  _initialized = true;
453
440
  return container;
454
441
  }
@@ -21,7 +21,6 @@
21
21
  * shep repo Manage tracked repositories
22
22
  * shep settings Configure Shep settings
23
23
  * shep upgrade Upgrade Shep CLI to the latest version
24
- * shep mcp Start the MCP server for AI agent integration
25
24
  * shep --version Display version number only
26
25
  *
27
26
  * Global Options:
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/presentation/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/presentation/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,kBAAkB,CAAC"}
@@ -21,7 +21,6 @@
21
21
  * shep repo Manage tracked repositories
22
22
  * shep settings Configure Shep settings
23
23
  * shep upgrade Upgrade Shep CLI to the latest version
24
- * shep mcp Start the MCP server for AI agent integration
25
24
  * shep --version Display version number only
26
25
  *
27
26
  * Global Options:
@@ -43,7 +42,6 @@ import { createIdeOpenCommand } from './commands/ide-open.command.js';
43
42
  import { createInstallCommand } from './commands/install.command.js';
44
43
  import { createUpgradeCommand } from './commands/upgrade.command.js';
45
44
  import { createToolsCommand } from './commands/tools.command.js';
46
- import { createMcpCommand } from './commands/mcp.command.js';
47
45
  import { messages } from './ui/index.js';
48
46
  // Daemon lifecycle commands
49
47
  import { createStartCommand } from './commands/start.command.js';
@@ -112,7 +110,6 @@ async function bootstrap() {
112
110
  program.addCommand(createInstallCommand());
113
111
  program.addCommand(createToolsCommand());
114
112
  program.addCommand(createUpgradeCommand());
115
- program.addCommand(createMcpCommand());
116
113
  // Daemon lifecycle commands (task-9)
117
114
  program.addCommand(createStartCommand());
118
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;
@@ -5,7 +5,7 @@ import { type Theme } from '../types/theme.js';
5
5
  */
6
6
  export declare function useTheme(): {
7
7
  theme: Theme;
8
- resolvedTheme: "light" | "dark";
8
+ resolvedTheme: "dark" | "light";
9
9
  setTheme: (newTheme: Theme) => void;
10
10
  };
11
11
  //# sourceMappingURL=useTheme.d.ts.map