@shepai/cli 1.82.0-pr253.ecbd0ca → 1.82.0-pr254.277165d

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 (150) hide show
  1. package/apis/json-schema/Feature.yaml +5 -0
  2. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +48 -0
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.js +0 -3
  6. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +4 -1
  7. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +103 -0
  9. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
  10. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +5 -2
  11. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  12. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +0 -1
  13. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +0 -2
  14. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +1 -1
  15. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +0 -65
  16. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts +6 -0
  17. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts.map +1 -0
  18. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +30 -0
  19. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts +18 -0
  20. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts.map +1 -0
  21. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.js +174 -0
  22. package/dist/src/presentation/web/components/common/merge-review/index.d.ts +2 -1
  23. package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/merge-review/index.js +1 -0
  25. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +23 -0
  26. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  28. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +3 -2
  29. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +2 -0
  30. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +69 -0
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/package.json +1 -1
  34. package/web/.next/BUILD_ID +1 -1
  35. package/web/.next/build-manifest.json +2 -2
  36. package/web/.next/fallback-build-manifest.json +2 -2
  37. package/web/.next/prerender-manifest.json +3 -3
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  45. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  48. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  54. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  57. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/_global-error.html +2 -2
  60. package/web/.next/server/app/_global-error.rsc +1 -1
  61. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  63. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  64. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  65. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  66. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  67. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  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 +6 -6
  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 +6 -6
  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 +1 -1
  78. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  80. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  82. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  83. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  84. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/_1e3cf73b._.js +1 -1
  97. package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/{_f8b5d93c._.js → _2ced1bad._.js} +2 -2
  99. package/web/.next/server/chunks/ssr/{_f8b5d93c._.js.map → _2ced1bad._.js.map} +1 -1
  100. package/web/.next/server/chunks/ssr/_2f3a54c6._.js +3 -0
  101. package/web/.next/server/chunks/ssr/{_c3a8bcb1._.js.map → _2f3a54c6._.js.map} +1 -1
  102. package/web/.next/server/chunks/ssr/_440a3db4._.js +4 -0
  103. package/web/.next/server/chunks/ssr/{_9c4ccd3c._.js.map → _440a3db4._.js.map} +1 -1
  104. package/web/.next/server/chunks/ssr/_63868199._.js +1 -1
  105. package/web/.next/server/chunks/ssr/_63868199._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  107. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/{_9563a37e._.js → _f7a8d4dd._.js} +2 -2
  109. package/web/.next/server/chunks/ssr/{_9563a37e._.js.map → _f7a8d4dd._.js.map} +1 -1
  110. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  111. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js +1 -1
  121. package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  123. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  127. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  128. package/web/.next/server/pages/500.html +2 -2
  129. package/web/.next/server/server-reference-manifest.js +1 -1
  130. package/web/.next/server/server-reference-manifest.json +28 -28
  131. package/web/.next/static/chunks/{5c9f19b4b6f7a828.js → 123dc2bd9254c73b.js} +1 -1
  132. package/web/.next/static/chunks/{283368c8a4d8430b.js → 151bc9cb40276142.js} +1 -1
  133. package/web/.next/static/chunks/3fb38599fa02670a.js +1 -0
  134. package/web/.next/static/chunks/45380c149fa1d4c4.js +1 -0
  135. package/web/.next/static/chunks/{be063038a7dfbe4e.js → 71732e5466c44408.js} +1 -1
  136. package/web/.next/static/chunks/9dc311d9e5c84094.js +2 -0
  137. package/web/.next/static/chunks/{60be99cd0e96954c.js → ad8ba7829353cf47.js} +1 -1
  138. package/web/.next/static/chunks/b8019132d9d42c18.css +2 -0
  139. package/web/.next/static/chunks/{a8beb7c4e4e7452d.js → f3f07f7a70a3e275.js} +1 -1
  140. package/web/.next/static/chunks/{dcf7baf83946590f.js → fa0866b6b0e4dfd1.js} +1 -1
  141. package/web/.next/static/chunks/{1b97689878d85e89.js → fde15c628b30b107.js} +1 -1
  142. package/web/.next/server/chunks/ssr/_9c4ccd3c._.js +0 -4
  143. package/web/.next/server/chunks/ssr/_c3a8bcb1._.js +0 -3
  144. package/web/.next/static/chunks/1edbb960447a6b77.js +0 -1
  145. package/web/.next/static/chunks/63098b44c9aae2c0.js +0 -2
  146. package/web/.next/static/chunks/89e2999b0b070bb7.js +0 -1
  147. package/web/.next/static/chunks/ae01d2be1d0bad47.css +0 -2
  148. /package/web/.next/static/{dA1SrRBjp-dLSoo1oCMdm → DVftHXLk3n_1HUyfhoQOJ}/_buildManifest.js +0 -0
  149. /package/web/.next/static/{dA1SrRBjp-dLSoo1oCMdm → DVftHXLk3n_1HUyfhoQOJ}/_clientMiddlewareManifest.json +0 -0
  150. /package/web/.next/static/{dA1SrRBjp-dLSoo1oCMdm → DVftHXLk3n_1HUyfhoQOJ}/_ssgManifest.js +0 -0
@@ -45,6 +45,10 @@ properties:
45
45
  repositoryId:
46
46
  $ref: UUID.yaml
47
47
  description: ID of the Repository entity this feature belongs to
48
+ fast:
49
+ type: boolean
50
+ default: false
51
+ description: When true, SDLC phases were skipped and the feature was implemented directly from the prompt
48
52
  push:
49
53
  type: boolean
50
54
  default: false
@@ -75,6 +79,7 @@ required:
75
79
  - lifecycle
76
80
  - messages
77
81
  - relatedArtifacts
82
+ - fast
78
83
  - push
79
84
  - openPr
80
85
  - approvalGates
@@ -55,6 +55,45 @@ export interface DiffSummary {
55
55
  /** Number of commits in the diff */
56
56
  commitCount: number;
57
57
  }
58
+ /**
59
+ * A single hunk in a file diff showing the actual line changes.
60
+ */
61
+ export interface DiffHunk {
62
+ /** Header line (e.g. "@@ -1,5 +1,7 @@") */
63
+ header: string;
64
+ /** Lines in this hunk with their type and content */
65
+ lines: DiffLine[];
66
+ }
67
+ /**
68
+ * A single line within a diff hunk.
69
+ */
70
+ export interface DiffLine {
71
+ /** Type of change: added, removed, or context (unchanged) */
72
+ type: 'added' | 'removed' | 'context';
73
+ /** The line content (without the leading +/-/space) */
74
+ content: string;
75
+ /** Old file line number (undefined for added lines) */
76
+ oldNumber?: number;
77
+ /** New file line number (undefined for removed lines) */
78
+ newNumber?: number;
79
+ }
80
+ /**
81
+ * Per-file diff data showing what changed in a single file.
82
+ */
83
+ export interface FileDiff {
84
+ /** File path (new path for renames) */
85
+ path: string;
86
+ /** Previous path if the file was renamed */
87
+ oldPath?: string;
88
+ /** Number of lines added */
89
+ additions: number;
90
+ /** Number of lines removed */
91
+ deletions: number;
92
+ /** Change type */
93
+ status: 'added' | 'modified' | 'deleted' | 'renamed';
94
+ /** Diff hunks with actual line changes */
95
+ hunks: DiffHunk[];
96
+ }
58
97
  /**
59
98
  * Result of creating a pull request.
60
99
  */
@@ -192,6 +231,15 @@ export interface IGitPrService {
192
231
  * @throws GitPrError with GIT_ERROR code
193
232
  */
194
233
  getPrDiffSummary(cwd: string, baseBranch: string): Promise<DiffSummary>;
234
+ /**
235
+ * Get per-file diffs between the current branch and a base branch.
236
+ *
237
+ * @param cwd - Working directory path
238
+ * @param baseBranch - Base branch to compare against
239
+ * @returns Array of per-file diffs with hunks and line changes
240
+ * @throws GitPrError with GIT_ERROR code
241
+ */
242
+ getFileDiffs(cwd: string, baseBranch: string): Promise<FileDiff[]>;
195
243
  /**
196
244
  * List PR statuses for all open and recently-updated PRs in a repository.
197
245
  *
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reject-agent-run.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/agents/reject-agent-run.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AAC7G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAU1G,qBACa,qBAAqB;IAG9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBANrB,kBAAkB,EAAE,mBAAmB,EAEvC,cAAc,EAAE,2BAA2B,EAE3C,iBAAiB,EAAE,kBAAkB,EAErC,qBAAqB,EAAE,sBAAsB;IAG1D,OAAO,CACX,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CAmHH"}
1
+ {"version":3,"file":"reject-agent-run.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/agents/reject-agent-run.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AAC7G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAS1G,qBACa,qBAAqB;IAG9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBANrB,kBAAkB,EAAE,mBAAmB,EAEvC,cAAc,EAAE,2BAA2B,EAE3C,iBAAiB,EAAE,kBAAkB,EAErC,qBAAqB,EAAE,sBAAsB;IAG1D,OAAO,CACX,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CAgHH"}
@@ -23,7 +23,6 @@ import { readFileSync } from 'node:fs';
23
23
  import { join } from 'node:path';
24
24
  import { AgentRunStatus } from '../../../domain/generated/output.js';
25
25
  import { writeSpecFileAtomic } from '../../../infrastructure/services/agents/feature-agent/nodes/node-helpers.js';
26
- import { recordLifecycleEvent } from '../../../infrastructure/services/agents/feature-agent/phase-timing-context.js';
27
26
  import { computeWorktreePath } from '../../../infrastructure/services/ide-launchers/compute-worktree-path.js';
28
27
  let RejectAgentRunUseCase = class RejectAgentRunUseCase {
29
28
  agentRunRepository;
@@ -102,8 +101,6 @@ let RejectAgentRunUseCase = class RejectAgentRunUseCase {
102
101
  catch {
103
102
  // Non-fatal
104
103
  }
105
- // Record rejected lifecycle event
106
- await recordLifecycleEvent('run:rejected', id, this.phaseTimingRepository);
107
104
  // Spawn worker with rejection payload
108
105
  const rejectionPayload = {
109
106
  rejected: true,
@@ -5,7 +5,7 @@
5
5
  * Uses constructor dependency injection for the command executor.
6
6
  */
7
7
  import type { IGitPrService } from '../../../application/ports/output/services/git-pr-service.interface.js';
8
- import type { CiStatusResult, DiffSummary, MergeStrategy, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
8
+ import type { CiStatusResult, DiffSummary, FileDiff, MergeStrategy, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
9
9
  import type { ExecFunction } from './worktree.service.js';
10
10
  export declare class GitPrService implements IGitPrService {
11
11
  private readonly execFile;
@@ -22,6 +22,9 @@ export declare class GitPrService implements IGitPrService {
22
22
  watchCi(cwd: string, branch: string, timeoutMs?: number): Promise<CiStatusResult>;
23
23
  deleteBranch(cwd: string, branch: string, deleteRemote?: boolean): Promise<void>;
24
24
  getPrDiffSummary(cwd: string, baseBranch: string): Promise<DiffSummary>;
25
+ getFileDiffs(cwd: string, baseBranch: string): Promise<FileDiff[]>;
26
+ private parseUnifiedDiff;
27
+ private parseFileDiff;
25
28
  listPrStatuses(cwd: string): Promise<PrStatusInfo[]>;
26
29
  verifyMerge(cwd: string, featureBranch: string, baseBranch: string): Promise<boolean>;
27
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAmDjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkCpD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3F;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3F,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAmDjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAaxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IAmFf,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkCpD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3F;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3F,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
@@ -258,6 +258,109 @@ let GitPrService = class GitPrService {
258
258
  const { stdout: logOutput } = await this.execFile('git', ['log', '--oneline', `${baseBranch}...HEAD`], { cwd });
259
259
  return this.parseDiffStat(diffStat, logOutput);
260
260
  }
261
+ async getFileDiffs(cwd, baseBranch) {
262
+ try {
263
+ const { stdout } = await this.execFile('git', ['diff', '--unified=3', `${baseBranch}...HEAD`], { cwd });
264
+ return this.parseUnifiedDiff(stdout);
265
+ }
266
+ catch (error) {
267
+ throw this.parseGitError(error);
268
+ }
269
+ }
270
+ parseUnifiedDiff(rawDiff) {
271
+ if (!rawDiff.trim())
272
+ return [];
273
+ const files = [];
274
+ // Split on "diff --git" boundaries (keeping the delimiter)
275
+ const fileSections = rawDiff.split(/^(?=diff --git )/m).filter((s) => s.trim());
276
+ for (const section of fileSections) {
277
+ const file = this.parseFileDiff(section);
278
+ if (file)
279
+ files.push(file);
280
+ }
281
+ return files;
282
+ }
283
+ parseFileDiff(section) {
284
+ const lines = section.split('\n');
285
+ if (lines.length === 0)
286
+ return null;
287
+ // Parse header: "diff --git a/path b/path"
288
+ const headerMatch = lines[0].match(/^diff --git a\/(.+?) b\/(.+)$/);
289
+ if (!headerMatch)
290
+ return null;
291
+ const oldPath = headerMatch[1];
292
+ const newPath = headerMatch[2];
293
+ // Determine status from diff header lines
294
+ let status = 'modified';
295
+ const isNew = lines.some((l) => l.startsWith('new file mode'));
296
+ const isDeleted = lines.some((l) => l.startsWith('deleted file mode'));
297
+ const isRenamed = lines.some((l) => l.startsWith('rename from'));
298
+ if (isNew)
299
+ status = 'added';
300
+ else if (isDeleted)
301
+ status = 'deleted';
302
+ else if (isRenamed)
303
+ status = 'renamed';
304
+ // Parse hunks
305
+ const hunks = [];
306
+ let currentHunk = null;
307
+ let oldLineNum = 0;
308
+ let newLineNum = 0;
309
+ let additions = 0;
310
+ let deletions = 0;
311
+ for (const line of lines) {
312
+ const hunkHeaderMatch = line.match(/^@@\s+-(\d+)(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@(.*)$/);
313
+ if (hunkHeaderMatch) {
314
+ currentHunk = { header: line, lines: [] };
315
+ hunks.push(currentHunk);
316
+ oldLineNum = parseInt(hunkHeaderMatch[1], 10);
317
+ newLineNum = parseInt(hunkHeaderMatch[2], 10);
318
+ continue;
319
+ }
320
+ if (!currentHunk)
321
+ continue;
322
+ if (line.startsWith('+')) {
323
+ const diffLine = {
324
+ type: 'added',
325
+ content: line.slice(1),
326
+ newNumber: newLineNum,
327
+ };
328
+ currentHunk.lines.push(diffLine);
329
+ newLineNum++;
330
+ additions++;
331
+ }
332
+ else if (line.startsWith('-')) {
333
+ const diffLine = {
334
+ type: 'removed',
335
+ content: line.slice(1),
336
+ oldNumber: oldLineNum,
337
+ };
338
+ currentHunk.lines.push(diffLine);
339
+ oldLineNum++;
340
+ deletions++;
341
+ }
342
+ else if (line.startsWith(' ')) {
343
+ const diffLine = {
344
+ type: 'context',
345
+ content: line.slice(1),
346
+ oldNumber: oldLineNum,
347
+ newNumber: newLineNum,
348
+ };
349
+ currentHunk.lines.push(diffLine);
350
+ oldLineNum++;
351
+ newLineNum++;
352
+ }
353
+ // Skip lines like ""
354
+ }
355
+ return {
356
+ path: newPath,
357
+ oldPath: isRenamed || oldPath !== newPath ? oldPath : undefined,
358
+ additions,
359
+ deletions,
360
+ status,
361
+ hunks,
362
+ };
363
+ }
261
364
  async listPrStatuses(cwd) {
262
365
  try {
263
366
  const { stdout } = await this.execFile('gh', [
@@ -1 +1 @@
1
- {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAE9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAkD7F"}
1
+ {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAE9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAqD7F"}
@@ -35,8 +35,11 @@ export async function getMergeReviewData(featureId) {
35
35
  }
36
36
  try {
37
37
  const gitPrService = resolve('IGitPrService');
38
- const diffSummary = await gitPrService.getPrDiffSummary(feature.worktreePath, 'main');
39
- return { pr, branch, phases, diffSummary };
38
+ const [diffSummary, fileDiffs] = await Promise.all([
39
+ gitPrService.getPrDiffSummary(feature.worktreePath, 'main'),
40
+ gitPrService.getFileDiffs(feature.worktreePath, 'main').catch(() => undefined),
41
+ ]);
42
+ return { pr, branch, phases, diffSummary, fileDiffs };
40
43
  }
41
44
  catch {
42
45
  return { pr, branch, phases, warning: 'Diff statistics unavailable' };
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAgDD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CA0DxE"}
1
+ {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AA+CD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CA0DxE"}
@@ -16,7 +16,6 @@ const LIFECYCLE_EVENTS = {
16
16
  'run:failed': { label: 'failed', colorClass: 'text-red-600' },
17
17
  'run:stopped': { label: 'stopped', colorClass: 'text-amber-600' },
18
18
  'run:crashed': { label: 'crashed', colorClass: 'text-red-600' },
19
- 'run:rejected': { label: 'rejected', colorClass: 'text-orange-600' },
20
19
  };
21
20
  function isLifecycleEvent(phase) {
22
21
  return phase.startsWith('run:');
@@ -15,8 +15,6 @@ export declare const Loading: Story;
15
15
  export declare const Empty: Story;
16
16
  /** Error state — inline error message. */
17
17
  export declare const Error: Story;
18
- /** Rejection — shows rejected lifecycle event after an approval wait. */
19
- export declare const WithRejection: Story;
20
18
  /** Approval wait indicators — phases with approval wait sub-rows. */
21
19
  export declare const WithApprovalWaits: Story;
22
20
  //# sourceMappingURL=activity-tab.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAmK1C,2EAA2E;AAC3E,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,KA+D3B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,KAgC/B,CAAC"}
1
+ {"version":3,"file":"activity-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAmK1C,2EAA2E;AAC3E,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,KAgC/B,CAAC"}
@@ -216,71 +216,6 @@ export const Error = {
216
216
  error: 'Failed to load phase timings. Please try again.',
217
217
  },
218
218
  };
219
- /** Rejection — shows rejected lifecycle event after an approval wait. */
220
- export const WithRejection = {
221
- args: {
222
- timings: [
223
- {
224
- agentRunId: 'run-1',
225
- phase: 'run:started',
226
- startedAt: '2025-01-15T10:00:00Z',
227
- durationMs: 0,
228
- },
229
- {
230
- agentRunId: 'run-1',
231
- phase: 'analyze',
232
- startedAt: '2025-01-15T10:00:01Z',
233
- completedAt: '2025-01-15T10:00:15Z',
234
- durationMs: 14000,
235
- },
236
- {
237
- agentRunId: 'run-1',
238
- phase: 'requirements',
239
- startedAt: '2025-01-15T10:00:15Z',
240
- completedAt: '2025-01-15T10:01:45Z',
241
- durationMs: 90000,
242
- waitingApprovalAt: '2025-01-15T10:01:00Z',
243
- approvalWaitMs: 30000,
244
- },
245
- {
246
- agentRunId: 'run-1',
247
- phase: 'run:rejected',
248
- startedAt: '2025-01-15T10:01:45Z',
249
- durationMs: 0,
250
- },
251
- {
252
- agentRunId: 'run-1',
253
- phase: 'run:resumed',
254
- startedAt: '2025-01-15T10:02:00Z',
255
- durationMs: 0,
256
- },
257
- {
258
- agentRunId: 'run-1',
259
- phase: 'requirements:2',
260
- startedAt: '2025-01-15T10:02:01Z',
261
- completedAt: '2025-01-15T10:03:30Z',
262
- durationMs: 89000,
263
- waitingApprovalAt: '2025-01-15T10:03:00Z',
264
- approvalWaitMs: 15000,
265
- },
266
- {
267
- agentRunId: 'run-1',
268
- phase: 'research',
269
- startedAt: '2025-01-15T10:03:30Z',
270
- completedAt: '2025-01-15T10:05:00Z',
271
- durationMs: 90000,
272
- },
273
- {
274
- agentRunId: 'run-1',
275
- phase: 'run:completed',
276
- startedAt: '2025-01-15T10:05:00Z',
277
- durationMs: 0,
278
- },
279
- ],
280
- loading: false,
281
- error: null,
282
- },
283
- };
284
219
  /** Approval wait indicators — phases with approval wait sub-rows. */
285
220
  export const WithApprovalWaits = {
286
221
  args: {
@@ -0,0 +1,6 @@
1
+ import type { MergeReviewFileDiff } from './merge-review-config.js';
2
+ export interface DiffViewProps {
3
+ fileDiffs: MergeReviewFileDiff[];
4
+ }
5
+ export declare function DiffView({ fileDiffs }: DiffViewProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=diff-view.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,30 @@
1
+ 'use client';
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
+ import { cn } from '../../../lib/utils.js';
6
+ const STATUS_CONFIG = {
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' },
11
+ };
12
+ function FileStatusIcon({ status }) {
13
+ const config = STATUS_CONFIG[status];
14
+ const Icon = config.icon;
15
+ return _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', config.className) });
16
+ }
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 ?? ''}`))) })] }));
19
+ }
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] }));
25
+ }
26
+ export function DiffView({ fileDiffs }) {
27
+ if (fileDiffs.length === 0)
28
+ return 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.path))) })] }));
30
+ }
@@ -0,0 +1,18 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { DiffView } from './diff-view.js';
3
+ declare const meta: Meta<typeof DiffView>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof DiffView>;
6
+ /** Default — multiple files with various change types. */
7
+ export declare const Default: Story;
8
+ /** Single modified file. */
9
+ export declare const SingleFile: Story;
10
+ /** Only new files added. */
11
+ export declare const OnlyAdditions: Story;
12
+ /** Only deleted files. */
13
+ export declare const OnlyDeletions: Story;
14
+ /** Renamed file. */
15
+ export declare const RenamedFile: Story;
16
+ /** Empty diff list — renders nothing. */
17
+ export declare const EmptyDiffs: Story;
18
+ //# sourceMappingURL=diff-view.stories.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,174 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DiffView } from './diff-view.js';
3
+ const sampleFiles = [
4
+ {
5
+ path: 'src/components/auth/login-form.tsx',
6
+ additions: 45,
7
+ deletions: 12,
8
+ status: 'modified',
9
+ hunks: [
10
+ {
11
+ header: '@@ -1,8 +1,12 @@',
12
+ lines: [
13
+ {
14
+ type: 'context',
15
+ content: "import { useState } from 'react';",
16
+ oldNumber: 1,
17
+ newNumber: 1,
18
+ },
19
+ {
20
+ type: 'context',
21
+ content: "import { Button } from '../../ui/button.js';",
22
+ oldNumber: 2,
23
+ newNumber: 2,
24
+ },
25
+ {
26
+ type: 'added',
27
+ content: "import { Input } from '../../ui/input.js';",
28
+ newNumber: 3,
29
+ },
30
+ {
31
+ type: 'added',
32
+ content: "import { Label } from '../../ui/label.js';",
33
+ newNumber: 4,
34
+ },
35
+ { type: 'context', content: '', oldNumber: 3, newNumber: 5 },
36
+ { type: 'removed', content: 'export function LoginForm() {', oldNumber: 4 },
37
+ {
38
+ type: 'added',
39
+ content: 'export function LoginForm({ onSubmit }: LoginFormProps) {',
40
+ newNumber: 6,
41
+ },
42
+ {
43
+ type: 'context',
44
+ content: " const [email, setEmail] = useState('');",
45
+ oldNumber: 5,
46
+ newNumber: 7,
47
+ },
48
+ {
49
+ type: 'context',
50
+ content: " const [password, setPassword] = useState('');",
51
+ oldNumber: 6,
52
+ newNumber: 8,
53
+ },
54
+ {
55
+ type: 'added',
56
+ content: ' const [isLoading, setIsLoading] = useState(false);',
57
+ newNumber: 9,
58
+ },
59
+ ],
60
+ },
61
+ ],
62
+ },
63
+ {
64
+ path: 'src/lib/auth.ts',
65
+ additions: 28,
66
+ deletions: 0,
67
+ status: 'added',
68
+ hunks: [
69
+ {
70
+ header: '@@ -0,0 +1,8 @@',
71
+ lines: [
72
+ { type: 'added', content: "import { hash } from 'bcrypt';", newNumber: 1 },
73
+ { type: 'added', content: '', newNumber: 2 },
74
+ {
75
+ type: 'added',
76
+ content: 'export async function hashPassword(password: string) {',
77
+ newNumber: 3,
78
+ },
79
+ { type: 'added', content: ' return hash(password, 10);', newNumber: 4 },
80
+ { type: 'added', content: '}', newNumber: 5 },
81
+ ],
82
+ },
83
+ ],
84
+ },
85
+ {
86
+ path: 'src/utils/legacy-auth.ts',
87
+ additions: 0,
88
+ deletions: 35,
89
+ status: 'deleted',
90
+ hunks: [
91
+ {
92
+ header: '@@ -1,5 +0,0 @@',
93
+ lines: [
94
+ { type: 'removed', content: '// Legacy auth utilities', oldNumber: 1 },
95
+ { type: 'removed', content: 'export function oldLogin() {', oldNumber: 2 },
96
+ { type: 'removed', content: " return fetch('/api/login');", oldNumber: 3 },
97
+ { type: 'removed', content: '}', oldNumber: 4 },
98
+ ],
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ path: 'src/services/user-service.ts',
104
+ oldPath: 'src/services/user.ts',
105
+ additions: 5,
106
+ deletions: 2,
107
+ status: 'renamed',
108
+ hunks: [
109
+ {
110
+ header: '@@ -1,4 +1,7 @@',
111
+ lines: [
112
+ { type: 'removed', content: "import { db } from './db';", oldNumber: 1 },
113
+ { type: 'added', content: "import { db } from '../lib/db';", newNumber: 1 },
114
+ { type: 'added', content: "import { hashPassword } from '../lib/auth';", newNumber: 2 },
115
+ { type: 'context', content: '', oldNumber: 2, newNumber: 3 },
116
+ { type: 'context', content: 'export class UserService {', oldNumber: 3, newNumber: 4 },
117
+ ],
118
+ },
119
+ ],
120
+ },
121
+ ];
122
+ const meta = {
123
+ title: 'Drawers/Review/DiffView',
124
+ component: DiffView,
125
+ tags: ['autodocs'],
126
+ parameters: {
127
+ layout: 'fullscreen',
128
+ },
129
+ decorators: [
130
+ (Story) => (_jsx("div", { style: {
131
+ height: '600px',
132
+ width: '500px',
133
+ overflow: 'auto',
134
+ border: '1px solid var(--color-border)',
135
+ }, children: _jsx("div", { style: { padding: '16px' }, children: _jsx(Story, {}) }) })),
136
+ ],
137
+ };
138
+ export default meta;
139
+ /** Default — multiple files with various change types. */
140
+ export const Default = {
141
+ args: {
142
+ fileDiffs: sampleFiles,
143
+ },
144
+ };
145
+ /** Single modified file. */
146
+ export const SingleFile = {
147
+ args: {
148
+ fileDiffs: [sampleFiles[0]],
149
+ },
150
+ };
151
+ /** Only new files added. */
152
+ export const OnlyAdditions = {
153
+ args: {
154
+ fileDiffs: [sampleFiles[1]],
155
+ },
156
+ };
157
+ /** Only deleted files. */
158
+ export const OnlyDeletions = {
159
+ args: {
160
+ fileDiffs: [sampleFiles[2]],
161
+ },
162
+ };
163
+ /** Renamed file. */
164
+ export const RenamedFile = {
165
+ args: {
166
+ fileDiffs: [sampleFiles[3]],
167
+ },
168
+ };
169
+ /** Empty diff list — renders nothing. */
170
+ export const EmptyDiffs = {
171
+ args: {
172
+ fileDiffs: [],
173
+ },
174
+ };
@@ -1,3 +1,4 @@
1
1
  export { MergeReview } from './merge-review.js';
2
- export type { MergeReviewProps, MergeReviewData } from './merge-review-config.js';
2
+ export { DiffView } from './diff-view.js';
3
+ export type { MergeReviewProps, MergeReviewData, MergeReviewFileDiff } from './merge-review-config.js';
3
4
  //# sourceMappingURL=index.d.ts.map