@shepai/cli 1.136.0-pr443.863a0ce → 1.136.0-pr444.eca4070

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 (177) hide show
  1. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts +12 -1
  4. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +61 -4
  6. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts +0 -3
  7. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +17 -100
  9. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts +1 -3
  10. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.js +1 -31
  12. package/dist/tsconfig.build.tsbuildinfo +1 -1
  13. package/package.json +1 -1
  14. package/web/.next/BUILD_ID +1 -1
  15. package/web/.next/build-manifest.json +2 -2
  16. package/web/.next/fallback-build-manifest.json +2 -2
  17. package/web/.next/prerender-manifest.json +3 -3
  18. package/web/.next/required-server-files.js +1 -1
  19. package/web/.next/required-server-files.json +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +25 -25
  21. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +25 -25
  24. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +31 -31
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +31 -31
  30. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +23 -23
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +25 -25
  36. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +31 -31
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +31 -31
  42. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +23 -23
  45. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +23 -23
  48. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/_global-error.html +2 -2
  51. package/web/.next/server/app/_global-error.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  55. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  56. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  58. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  59. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  61. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  62. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  63. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  64. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  65. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  67. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  68. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  70. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  71. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  73. package/web/.next/server/app/version/page.js.nft.json +1 -1
  74. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  76. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +1 -1
  77. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  79. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  80. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +1 -1
  81. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -1
  82. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +1 -1
  83. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js.map +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js.map +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6882232d._.js → [root-of-the-server]__d48c5b11._.js} +2 -2
  102. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6882232d._.js.map → [root-of-the-server]__d48c5b11._.js.map} +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  106. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/{_2d94bed7._.js → _0afe5add._.js} +2 -2
  108. package/web/.next/server/chunks/ssr/{_2d94bed7._.js.map → _0afe5add._.js.map} +1 -1
  109. package/web/.next/server/chunks/ssr/_67104d9e._.js +1 -1
  110. package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  112. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  114. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  116. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/_e6819f98._.js +3 -0
  118. package/web/.next/server/chunks/ssr/{_fefe070a._.js.map → _e6819f98._.js.map} +1 -1
  119. package/web/.next/server/chunks/ssr/_e69a26ba._.js +1 -1
  120. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  123. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +2 -2
  125. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/{src_presentation_web_8213e5ea._.js → src_presentation_web_6e5a6584._.js} +2 -2
  127. package/web/.next/server/chunks/ssr/{src_presentation_web_8213e5ea._.js.map → src_presentation_web_6e5a6584._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +1 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +2 -2
  139. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +1 -1
  140. package/web/.next/server/pages/500.html +2 -2
  141. package/web/.next/server/server-reference-manifest.js +1 -1
  142. package/web/.next/server/server-reference-manifest.json +39 -39
  143. package/web/.next/static/chunks/{c2e2ff7e444af0fb.js → 0d9d536c3a1e3769.js} +1 -1
  144. package/web/.next/static/chunks/{9403c53377b1bfee.js → 567ce91151ef6047.js} +1 -1
  145. package/web/.next/static/chunks/{ef02305e9eeeae2d.js → 637939aee23af962.js} +1 -1
  146. package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
  147. package/web/.next/static/chunks/{13cb84d179d5b4ec.js → 6cfe48db0ef62904.js} +1 -1
  148. package/web/.next/static/chunks/7551e6ec93bab5f0.js +1 -0
  149. package/web/.next/static/chunks/{15ac82422c6ff481.js → 88172de8ecaf66b3.js} +2 -2
  150. package/web/.next/static/chunks/92cd6f523639a6fa.css +1 -0
  151. package/web/.next/static/chunks/92e04793b5e324cd.js +1 -0
  152. package/web/.next/static/chunks/{e49b53761421e978.js → b04ab84a67bae78b.js} +2 -2
  153. package/web/.next/static/chunks/d0dff217a94d4ee1.js +1 -0
  154. package/web/.next/static/chunks/d408e7dc9c253e29.js +1 -0
  155. package/web/.next/static/chunks/dde2b000405d2ae4.js +1 -0
  156. package/web/.next/static/chunks/{6ce910f8eca9c744.js → e843dbe14e813279.js} +1 -1
  157. package/web/.next/static/chunks/{311e3e6daae41529.js → fb766dbac52d1c8d.js} +1 -1
  158. package/dist/src/presentation/web/components/ui/file-tree.d.ts +0 -39
  159. package/dist/src/presentation/web/components/ui/file-tree.d.ts.map +0 -1
  160. package/dist/src/presentation/web/components/ui/file-tree.js +0 -194
  161. package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts +0 -14
  162. package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts.map +0 -1
  163. package/dist/src/presentation/web/components/ui/file-tree.stories.js +0 -92
  164. package/web/.next/server/chunks/ssr/_fefe070a._.js +0 -3
  165. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js +0 -3
  166. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js.map +0 -1
  167. package/web/.next/static/chunks/2a6fc81b4d79edd5.js +0 -1
  168. package/web/.next/static/chunks/4942206ecc6050b3.js +0 -1
  169. package/web/.next/static/chunks/66e554b3fb85d07b.js +0 -1
  170. package/web/.next/static/chunks/72813fbc89b39798.js +0 -1
  171. package/web/.next/static/chunks/72fb66a9a892b323.js +0 -1
  172. package/web/.next/static/chunks/76fe6d79d9531082.js +0 -1
  173. package/web/.next/static/chunks/8445a8933ec13b8f.css +0 -1
  174. package/web/.next/static/chunks/d7cf75b9d218a74a.js +0 -1
  175. /package/web/.next/static/{6xm4SoE6w_Z_XqNQlMkvd → oWFb73SbPSY-pNucEiCuA}/_buildManifest.js +0 -0
  176. /package/web/.next/static/{6xm4SoE6w_Z_XqNQlMkvd → oWFb73SbPSY-pNucEiCuA}/_clientMiddlewareManifest.json +0 -0
  177. /package/web/.next/static/{6xm4SoE6w_Z_XqNQlMkvd → oWFb73SbPSY-pNucEiCuA}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2DAA2D,CAAC;AAGjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBApBd,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB,EAE3C,cAAc,EAAE,eAAe;IAGlD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmI1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAgI1D"}
1
+ {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2DAA2D,CAAC;AAGjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBApBd,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa,EAE3B,iBAAiB,EAAE,wBAAwB,EAE3C,cAAc,EAAE,eAAe;IAGlD;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmI1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAiI1D"}
@@ -197,7 +197,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
197
197
  const effectiveRepoPath = feature.repositoryPath;
198
198
  // Ensure the target directory is a git repository (auto-init if needed)
199
199
  await this.worktreeService.ensureGitRepository(effectiveRepoPath);
200
- const metadata = await this.metadataGenerator.generateMetadata(input.userInput, input.agentType);
200
+ const metadata = await this.metadataGenerator.generateMetadata(input.userInput, input.agentType, effectiveRepoPath);
201
201
  const originalSlug = metadata.slug;
202
202
  const { slug, branch, warning } = await this.slugResolver.resolveUniqueSlug(originalSlug, effectiveRepoPath);
203
203
  // Determine next feature number for this repo
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * Generates feature metadata (slug, name, description) from user input
5
5
  * via AI call through IStructuredAgentCaller.
6
+ * When the user input references a file (e.g. SPEC.md), the file content
7
+ * is read and included in the prompt so the AI derives metadata from the
8
+ * actual file rather than the bare reference string.
6
9
  * Errors are propagated to the caller.
7
10
  */
8
11
  import type { AgentType } from '../../../../domain/generated/output.js';
@@ -17,9 +20,17 @@ export declare class MetadataGenerator {
17
20
  constructor(structuredCaller: IStructuredAgentCaller);
18
21
  /**
19
22
  * Generate feature metadata from user input via AI.
23
+ * When repositoryPath is provided, file references in the user input
24
+ * (e.g. "Develop based on the current SPEC.md") are resolved and their
25
+ * content is included in the prompt.
20
26
  * Errors are propagated to the caller.
21
27
  */
22
- generateMetadata(userInput: string, agentType?: AgentType): Promise<FeatureMetadata>;
28
+ generateMetadata(userInput: string, agentType?: AgentType, repositoryPath?: string): Promise<FeatureMetadata>;
29
+ /**
30
+ * Detect a file reference in user input and read the file content.
31
+ * Returns the file content if found and readable, undefined otherwise.
32
+ */
33
+ resolveFileReference(userInput: string, repositoryPath: string): string | undefined;
23
34
  /**
24
35
  * Extract metadata locally from user input without AI.
25
36
  * Used as fallback when the AI call fails or returns invalid data.
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-generator.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/metadata-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mEAAmE,CAAC;AAEhH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,sBAAsB;IAG3D;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;IAwC1F;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,MAAM;CAgBf"}
1
+ {"version":3,"file":"metadata-generator.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/metadata-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mEAAmE,CAAC;AAEhH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AA2BD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,sBAAsB;IAG3D;;;;;;OAMG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,SAAS,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC;IAoD3B;;;OAGG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA8BnF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,MAAM;CAgBf"}
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * Generates feature metadata (slug, name, description) from user input
5
5
  * via AI call through IStructuredAgentCaller.
6
+ * When the user input references a file (e.g. SPEC.md), the file content
7
+ * is read and included in the prompt so the AI derives metadata from the
8
+ * actual file rather than the bare reference string.
6
9
  * Errors are propagated to the caller.
7
10
  */
8
11
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
@@ -18,8 +21,18 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
18
21
  return function (target, key) { decorator(target, key, paramIndex); }
19
22
  };
20
23
  import { injectable, inject } from 'tsyringe';
24
+ import { readFileSync, existsSync } from 'node:fs';
25
+ import { join, isAbsolute } from 'node:path';
21
26
  /** Maximum characters of user input sent to the AI for metadata generation. */
22
27
  const MAX_INPUT_FOR_AI = 500;
28
+ /** Maximum characters of file content included in the AI prompt. */
29
+ const MAX_FILE_CONTENT_FOR_AI = 4000;
30
+ /**
31
+ * Pattern that matches user input referencing a file for feature definition.
32
+ * Captures the filename in group 1. Case-insensitive.
33
+ * Examples: "Develop based on the current SPEC.md", "based on SPEC.md", "use ./docs/SPEC.md"
34
+ */
35
+ const FILE_REFERENCE_PATTERN = /(?:based\s+on|from|use|using|see|refer\s+to|according\s+to)[\s]+(?:the\s+)?(?:current\s+)?(\S+\.(?:md|txt|yaml|yml))/i;
23
36
  const METADATA_SCHEMA = {
24
37
  type: 'object',
25
38
  properties: {
@@ -37,18 +50,30 @@ let MetadataGenerator = class MetadataGenerator {
37
50
  }
38
51
  /**
39
52
  * Generate feature metadata from user input via AI.
53
+ * When repositoryPath is provided, file references in the user input
54
+ * (e.g. "Develop based on the current SPEC.md") are resolved and their
55
+ * content is included in the prompt.
40
56
  * Errors are propagated to the caller.
41
57
  */
42
- async generateMetadata(userInput, agentType) {
43
- const truncated = userInput.length > MAX_INPUT_FOR_AI
44
- ? `${userInput.slice(0, MAX_INPUT_FOR_AI)}...`
58
+ async generateMetadata(userInput, agentType, repositoryPath) {
59
+ const fileContent = repositoryPath
60
+ ? this.resolveFileReference(userInput, repositoryPath)
61
+ : undefined;
62
+ const effectiveInput = fileContent
63
+ ? `${userInput}\n\n--- Referenced file content ---\n${fileContent}`
45
64
  : userInput;
65
+ const truncated = effectiveInput.length > MAX_INPUT_FOR_AI + MAX_FILE_CONTENT_FOR_AI
66
+ ? `${effectiveInput.slice(0, MAX_INPUT_FOR_AI + MAX_FILE_CONTENT_FOR_AI)}...`
67
+ : effectiveInput;
68
+ const fileHint = fileContent
69
+ ? "\nIMPORTANT: The user referenced a file. Derive the feature name, slug, and description from the FILE CONTENT, not from the user's reference instruction."
70
+ : '';
46
71
  const prompt = `Analyze this user request and extract the CORE feature intent. Condense to essential concepts.
47
72
 
48
73
  User request:
49
74
  "${truncated}"
50
75
 
51
- IMPORTANT: Don't use the request as-is. Extract the key feature being requested and improve the wording.
76
+ IMPORTANT: Don't use the request as-is. Extract the key feature being requested and improve the wording.${fileHint}
52
77
 
53
78
  Return a JSON object with these fields:
54
79
  - slug: kebab-case identifier, 2-4 words MAX. Extract the core feature name (e.g., "github-oauth-login" from "add github oauth")
@@ -74,6 +99,38 @@ Return a JSON object with these fields:
74
99
  }
75
100
  return this.extractMetadataLocally(userInput);
76
101
  }
102
+ /**
103
+ * Detect a file reference in user input and read the file content.
104
+ * Returns the file content if found and readable, undefined otherwise.
105
+ */
106
+ resolveFileReference(userInput, repositoryPath) {
107
+ const match = FILE_REFERENCE_PATTERN.exec(userInput);
108
+ if (!match)
109
+ return undefined;
110
+ const filename = match[1];
111
+ const candidates = [
112
+ // Try the path as-is (handles absolute or relative with ./)
113
+ isAbsolute(filename) ? filename : join(repositoryPath, filename),
114
+ // Also try common locations
115
+ join(repositoryPath, filename.replace(/^\.\//, '')),
116
+ ];
117
+ for (const candidate of candidates) {
118
+ try {
119
+ if (existsSync(candidate)) {
120
+ const content = readFileSync(candidate, 'utf-8');
121
+ if (content.trim().length > 0) {
122
+ return content.length > MAX_FILE_CONTENT_FOR_AI
123
+ ? `${content.slice(0, MAX_FILE_CONTENT_FOR_AI)}...`
124
+ : content;
125
+ }
126
+ }
127
+ }
128
+ catch {
129
+ // File not readable — try next candidate
130
+ }
131
+ }
132
+ return undefined;
133
+ }
77
134
  /**
78
135
  * Extract metadata locally from user input without AI.
79
136
  * Used as fallback when the AI call fails or returns invalid data.
@@ -1,7 +1,4 @@
1
- import { type TreeViewElement } from '../../ui/file-tree.js';
2
1
  import type { MergeReviewFileDiff } from './merge-review-config.js';
3
- /** Build a tree structure from flat file paths. */
4
- export declare function buildFileTree(fileDiffs: MergeReviewFileDiff[]): TreeViewElement[];
5
2
  export interface DiffViewProps {
6
3
  fileDiffs: MergeReviewFileDiff[];
7
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AAStF,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,SAAS,EAAE,mBAAmB,EAAE,GAAG,eAAe,EAAE,CAoCjF;AAoJD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAkEpD"}
1
+ {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AA4GtF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAmBpD"}
@@ -1,113 +1,30 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useMemo, useCallback } from 'react';
4
- import { FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { ChevronRight, FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
- import { Tree, Folder, File } from '../../ui/file-tree.js';
7
6
  const STATUS_CONFIG = {
8
- added: { icon: FilePlus, className: 'text-green-600' },
9
- modified: { icon: FileEdit, className: 'text-amber-600' },
10
- deleted: { icon: FileMinus, className: 'text-red-600' },
11
- renamed: { icon: FileEdit, className: 'text-blue-600' },
7
+ added: { icon: FilePlus, label: 'A', className: 'text-green-600' },
8
+ modified: { icon: FileEdit, label: 'M', className: 'text-amber-600' },
9
+ deleted: { icon: FileMinus, label: 'D', className: 'text-red-600' },
10
+ renamed: { icon: FileEdit, label: 'R', className: 'text-blue-600' },
12
11
  };
13
- /** Build a tree structure from flat file paths. */
14
- export function buildFileTree(fileDiffs) {
15
- const root = [];
16
- for (const diff of fileDiffs) {
17
- const parts = diff.path.split('/');
18
- let currentLevel = root;
19
- for (let i = 0; i < parts.length; i++) {
20
- const part = parts[i];
21
- const isFile = i === parts.length - 1;
22
- const pathSoFar = parts.slice(0, i + 1).join('/');
23
- const existing = currentLevel.find((el) => el.name === part && el.type === (isFile ? 'file' : 'folder'));
24
- if (existing) {
25
- if (!isFile && existing.children) {
26
- currentLevel = existing.children;
27
- }
28
- }
29
- else {
30
- const node = {
31
- id: pathSoFar,
32
- name: part,
33
- type: isFile ? 'file' : 'folder',
34
- ...(isFile ? {} : { children: [] }),
35
- };
36
- currentLevel.push(node);
37
- if (!isFile && node.children) {
38
- currentLevel = node.children;
39
- }
40
- }
41
- }
42
- }
43
- return collapseSingleChildFolders(root);
44
- }
45
- /** Collapse folders that contain only one child folder (e.g. src/components -> src/components). */
46
- function collapseSingleChildFolders(elements) {
47
- return elements.map((el) => {
48
- if (el.type === 'folder' && el.children) {
49
- const collapsed = collapseSingleChildFolders(el.children);
50
- if (collapsed.length === 1 && collapsed[0].type === 'folder' && collapsed[0].children) {
51
- return {
52
- ...collapsed[0],
53
- id: `${el.id}/${collapsed[0].name}`,
54
- name: `${el.name}/${collapsed[0].name}`,
55
- children: collapsed[0].children,
56
- };
57
- }
58
- return { ...el, children: collapsed };
59
- }
60
- return el;
61
- });
62
- }
63
- /** Count the total number of file descendants under an element. */
64
- function countFiles(element) {
65
- if (element.type === 'file')
66
- return 1;
67
- if (!element.children)
68
- return 0;
69
- return element.children.reduce((sum, child) => sum + countFiles(child), 0);
70
- }
71
- /** Get folder IDs for the first level of folders only (top-level). */
72
- function getTopLevelFolderIds(elements) {
73
- return elements.filter((el) => el.type === 'folder').map((el) => el.id);
74
- }
75
- function HunkView({ hunk }) {
76
- return (_jsxs("div", { className: "border-border border-t first:border-t-0", children: [_jsx("div", { className: "bg-muted/50 text-muted-foreground px-3 py-1 font-mono text-[10px]", children: hunk.header }), _jsx("div", { className: "font-mono text-[11px] leading-[18px]", children: hunk.lines.map((line) => (_jsxs("div", { className: cn('flex', line.type === 'added' && 'bg-green-50 dark:bg-green-950/30', line.type === 'removed' && 'bg-red-50 dark:bg-red-950/30'), children: [_jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.oldNumber ?? '' }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.newNumber ?? '' }), _jsx("span", { className: cn('w-4 shrink-0 text-center select-none', line.type === 'added' && 'text-green-700 dark:text-green-400', line.type === 'removed' && 'text-red-700 dark:text-red-400'), children: line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' ' }), _jsx("span", { className: "min-w-0 flex-1 pr-2 break-all whitespace-pre-wrap", children: line.content })] }, `${line.type}-${line.oldNumber ?? ''}-${line.newNumber ?? ''}`))) })] }));
77
- }
78
- function DiffFileIcon({ status }) {
12
+ function FileStatusIcon({ status }) {
79
13
  const config = STATUS_CONFIG[status];
80
14
  const Icon = config.icon;
81
- return _jsx(Icon, { className: cn('size-4 shrink-0', config.className) });
15
+ return _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', config.className) });
82
16
  }
83
- function DiffStats({ additions, deletions }) {
84
- return (_jsxs("span", { className: "ml-auto shrink-0 text-[10px]", children: [additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", additions] }) : null, additions > 0 && deletions > 0 ? ' ' : null, deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", deletions] }) : null] }));
17
+ function HunkView({ hunk }) {
18
+ return (_jsxs("div", { className: "border-border border-t first:border-t-0", children: [_jsx("div", { className: "bg-muted/50 text-muted-foreground px-3 py-1 font-mono text-[10px]", children: hunk.header }), _jsx("div", { className: "font-mono text-[11px] leading-[18px]", children: hunk.lines.map((line) => (_jsxs("div", { className: cn('flex', line.type === 'added' && 'bg-green-50 dark:bg-green-950/30', line.type === 'removed' && 'bg-red-50 dark:bg-red-950/30'), children: [_jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.oldNumber ?? '' }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.newNumber ?? '' }), _jsx("span", { className: cn('w-4 shrink-0 text-center select-none', line.type === 'added' && 'text-green-700 dark:text-green-400', line.type === 'removed' && 'text-red-700 dark:text-red-400'), children: line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' ' }), _jsx("span", { className: "min-w-0 flex-1 pr-2 break-all whitespace-pre-wrap", children: line.content })] }, `${line.type}-${line.oldNumber ?? ''}-${line.newNumber ?? ''}`))) })] }));
85
19
  }
86
- function FileTreeNode({ element, diffMap, selectedFile, onSelectFile, }) {
87
- if (element.type === 'folder' && element.children) {
88
- const fileCount = countFiles(element);
89
- return (_jsx(Folder, { value: element.id, element: `${element.name} (${fileCount})`, className: "text-muted-foreground", children: element.children.map((child) => (_jsx(FileTreeNode, { element: child, diffMap: diffMap, selectedFile: selectedFile, onSelectFile: onSelectFile }, child.id))) }, element.id));
90
- }
91
- const diff = diffMap.get(element.id);
92
- const status = diff?.status ?? 'modified';
93
- return (_jsx(File, { value: element.id, fileIcon: _jsx(DiffFileIcon, { status: status }), isSelect: selectedFile === element.id, handleSelect: onSelectFile, className: "w-full", children: _jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-1", children: [_jsx("span", { className: "truncate", children: element.name }), diff?.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", diff.oldPath.split('/').pop()] })) : null, diff ? _jsx(DiffStats, { additions: diff.additions, deletions: diff.deletions }) : null] }) }, element.id));
20
+ function FileDiffItem({ file }) {
21
+ const [isOpen, setIsOpen] = useState(false);
22
+ const fileName = file.path.split('/').pop() ?? file.path;
23
+ const dirPath = file.path.includes('/') ? file.path.slice(0, file.path.lastIndexOf('/')) : '';
24
+ return (_jsxs("div", { className: "border-border border-b last:border-b-0", children: [_jsxs("button", { type: "button", onClick: () => setIsOpen(!isOpen), className: "hover:bg-muted/50 flex w-full items-center gap-2 px-3 py-2 text-left", children: [_jsx(ChevronRight, { className: cn('text-muted-foreground h-3 w-3 shrink-0 transition-transform duration-150', isOpen && 'rotate-90') }), _jsx(FileStatusIcon, { status: file.status }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate text-xs", children: dirPath ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "text-muted-foreground", children: [dirPath, "/"] }), fileName] })) : (fileName) }), file.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", file.oldPath.split('/').pop()] })) : null, _jsxs("span", { className: "shrink-0 text-[10px]", children: [file.additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", file.additions] }) : null, file.additions > 0 && file.deletions > 0 ? ' ' : null, file.deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", file.deletions] }) : null] })] }), isOpen && file.hunks.length > 0 ? (_jsx("div", { className: "border-border overflow-x-auto border-t", children: file.hunks.map((hunk) => (_jsx(HunkView, { hunk: hunk }, hunk.header))) })) : null] }));
94
25
  }
95
26
  export function DiffView({ fileDiffs }) {
96
- const [selectedFile, setSelectedFile] = useState(null);
97
- const treeElements = useMemo(() => buildFileTree(fileDiffs), [fileDiffs]);
98
- const topLevelFolderIds = useMemo(() => getTopLevelFolderIds(treeElements), [treeElements]);
99
- const diffMap = useMemo(() => {
100
- const map = new Map();
101
- for (const diff of fileDiffs) {
102
- map.set(diff.path, diff);
103
- }
104
- return map;
105
- }, [fileDiffs]);
106
- const handleSelectFile = useCallback((path) => {
107
- setSelectedFile((prev) => (prev === path ? null : path));
108
- }, []);
109
- const selectedDiff = selectedFile ? diffMap.get(selectedFile) : null;
110
27
  if (fileDiffs.length === 0)
111
28
  return null;
112
- return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsxs("div", { className: "border-border border-t", children: [_jsx("div", { className: "py-2", children: _jsx(Tree, { elements: treeElements, initialExpandedItems: topLevelFolderIds, indicator: true, sort: "none", className: "text-xs", children: treeElements.map((element) => (_jsx(FileTreeNode, { element: element, diffMap: diffMap, selectedFile: selectedFile, onSelectFile: handleSelectFile }, element.id))) }) }), selectedDiff && selectedDiff.hunks.length > 0 ? (_jsxs("div", { className: "border-border overflow-x-auto border-t", children: [_jsxs("div", { className: "bg-muted/30 flex items-center gap-2 px-3 py-1.5", children: [_jsx(DiffFileIcon, { status: selectedDiff.status }), _jsx("span", { className: "text-foreground font-mono text-xs", children: selectedDiff.path }), _jsx(DiffStats, { additions: selectedDiff.additions, deletions: selectedDiff.deletions })] }), selectedDiff.hunks.map((hunk) => (_jsx(HunkView, { hunk: hunk }, hunk.header)))] })) : null] })] }));
29
+ return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsx("div", { className: "border-border border-t", children: fileDiffs.map((file) => (_jsx(FileDiffItem, { file: file }, `${file.status}-${file.path}`))) })] }));
113
30
  }
@@ -3,7 +3,7 @@ import { DiffView } from './diff-view.js';
3
3
  declare const meta: Meta<typeof DiffView>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof DiffView>;
6
- /** Default — multiple files with various change types shown in a file tree. */
6
+ /** Default — multiple files with various change types. */
7
7
  export declare const Default: Story;
8
8
  /** Single modified file. */
9
9
  export declare const SingleFile: Story;
@@ -15,6 +15,4 @@ export declare const OnlyDeletions: Story;
15
15
  export declare const RenamedFile: Story;
16
16
  /** Empty diff list — renders nothing. */
17
17
  export declare const EmptyDiffs: Story;
18
- /** Root-level files without directory nesting. */
19
- export declare const RootLevelFiles: Story;
20
18
  //# sourceMappingURL=diff-view.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2HvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAuB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEvC,+EAA+E;AAC/E,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,cAAc,EAAE,KA4B5B,CAAC"}
1
+ {"version":3,"file":"diff-view.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2HvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAuB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEvC,0DAA0D;AAC1D,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC"}
@@ -136,7 +136,7 @@ const meta = {
136
136
  ],
137
137
  };
138
138
  export default meta;
139
- /** Default — multiple files with various change types shown in a file tree. */
139
+ /** Default — multiple files with various change types. */
140
140
  export const Default = {
141
141
  args: {
142
142
  fileDiffs: sampleFiles,
@@ -172,33 +172,3 @@ export const EmptyDiffs = {
172
172
  fileDiffs: [],
173
173
  },
174
174
  };
175
- /** Root-level files without directory nesting. */
176
- export const RootLevelFiles = {
177
- args: {
178
- fileDiffs: [
179
- {
180
- path: 'package.json',
181
- additions: 3,
182
- deletions: 1,
183
- status: 'modified',
184
- hunks: [
185
- {
186
- header: '@@ -10,3 +10,5 @@',
187
- lines: [
188
- { type: 'context', content: ' "dependencies": {', oldNumber: 10, newNumber: 10 },
189
- { type: 'added', content: ' "new-dep": "^1.0.0",', newNumber: 11 },
190
- { type: 'context', content: ' }', oldNumber: 11, newNumber: 12 },
191
- ],
192
- },
193
- ],
194
- },
195
- {
196
- path: 'README.md',
197
- additions: 10,
198
- deletions: 0,
199
- status: 'modified',
200
- hunks: [],
201
- },
202
- ],
203
- },
204
- };