@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.
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts +12 -1
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +61 -4
- package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts +0 -3
- package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/diff-view.js +17 -100
- package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts +1 -3
- package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.js +1 -31
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +23 -23
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +23 -23
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +23 -23
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__6882232d._.js → [root-of-the-server]__d48c5b11._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__6882232d._.js.map → [root-of-the-server]__d48c5b11._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_2d94bed7._.js → _0afe5add._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2d94bed7._.js.map → _0afe5add._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_67104d9e._.js +1 -1
- package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_e6819f98._.js +3 -0
- package/web/.next/server/chunks/ssr/{_fefe070a._.js.map → _e6819f98._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_e69a26ba._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_8213e5ea._.js → src_presentation_web_6e5a6584._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_8213e5ea._.js.map → src_presentation_web_6e5a6584._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +39 -39
- package/web/.next/static/chunks/{c2e2ff7e444af0fb.js → 0d9d536c3a1e3769.js} +1 -1
- package/web/.next/static/chunks/{9403c53377b1bfee.js → 567ce91151ef6047.js} +1 -1
- package/web/.next/static/chunks/{ef02305e9eeeae2d.js → 637939aee23af962.js} +1 -1
- package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
- package/web/.next/static/chunks/{13cb84d179d5b4ec.js → 6cfe48db0ef62904.js} +1 -1
- package/web/.next/static/chunks/7551e6ec93bab5f0.js +1 -0
- package/web/.next/static/chunks/{15ac82422c6ff481.js → 88172de8ecaf66b3.js} +2 -2
- package/web/.next/static/chunks/92cd6f523639a6fa.css +1 -0
- package/web/.next/static/chunks/92e04793b5e324cd.js +1 -0
- package/web/.next/static/chunks/{e49b53761421e978.js → b04ab84a67bae78b.js} +2 -2
- package/web/.next/static/chunks/d0dff217a94d4ee1.js +1 -0
- package/web/.next/static/chunks/d408e7dc9c253e29.js +1 -0
- package/web/.next/static/chunks/dde2b000405d2ae4.js +1 -0
- package/web/.next/static/chunks/{6ce910f8eca9c744.js → e843dbe14e813279.js} +1 -1
- package/web/.next/static/chunks/{311e3e6daae41529.js → fb766dbac52d1c8d.js} +1 -1
- package/dist/src/presentation/web/components/ui/file-tree.d.ts +0 -39
- package/dist/src/presentation/web/components/ui/file-tree.d.ts.map +0 -1
- package/dist/src/presentation/web/components/ui/file-tree.js +0 -194
- package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts +0 -14
- package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/ui/file-tree.stories.js +0 -92
- package/web/.next/server/chunks/ssr/_fefe070a._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js.map +0 -1
- package/web/.next/static/chunks/2a6fc81b4d79edd5.js +0 -1
- package/web/.next/static/chunks/4942206ecc6050b3.js +0 -1
- package/web/.next/static/chunks/66e554b3fb85d07b.js +0 -1
- package/web/.next/static/chunks/72813fbc89b39798.js +0 -1
- package/web/.next/static/chunks/72fb66a9a892b323.js +0 -1
- package/web/.next/static/chunks/76fe6d79d9531082.js +0 -1
- package/web/.next/static/chunks/8445a8933ec13b8f.css +0 -1
- package/web/.next/static/chunks/d7cf75b9d218a74a.js +0 -1
- /package/web/.next/static/{6xm4SoE6w_Z_XqNQlMkvd → oWFb73SbPSY-pNucEiCuA}/_buildManifest.js +0 -0
- /package/web/.next/static/{6xm4SoE6w_Z_XqNQlMkvd → oWFb73SbPSY-pNucEiCuA}/_clientMiddlewareManifest.json +0 -0
- /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;
|
|
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"}
|
package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js
CHANGED
|
@@ -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
|
package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts
CHANGED
|
@@ -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.
|
package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
|
44
|
-
?
|
|
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,
|
|
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
|
|
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
|
-
|
|
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('
|
|
15
|
+
return _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', config.className) });
|
|
82
16
|
}
|
|
83
|
-
function
|
|
84
|
-
return (_jsxs("
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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, ")"] })] }) }),
|
|
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
|
|
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
|
|
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
|
|
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
|
-
};
|