devchain-cli 0.6.0 → 0.7.0

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 (170) hide show
  1. package/dist/drizzle/0024_review_tables.sql +71 -0
  2. package/dist/drizzle/0025_reviews_mode_and_nullable_shas.sql +80 -0
  3. package/dist/drizzle/0026_review_comments_edited_at.sql +2 -0
  4. package/dist/drizzle/meta/_journal.json +22 -1
  5. package/dist/node_modules/@devchain/shared/tsconfig.tsbuildinfo +1 -1
  6. package/dist/server/common/errors/error-types.d.ts +3 -0
  7. package/dist/server/common/errors/error-types.js +7 -1
  8. package/dist/server/common/errors/error-types.js.map +1 -1
  9. package/dist/server/common/validation/path-validation.d.ts +11 -0
  10. package/dist/server/common/validation/path-validation.js +197 -0
  11. package/dist/server/common/validation/path-validation.js.map +1 -0
  12. package/dist/server/modules/chat/dtos/chat.dto.d.ts +13 -13
  13. package/dist/server/modules/core/core.module.js +3 -2
  14. package/dist/server/modules/core/core.module.js.map +1 -1
  15. package/dist/server/modules/core/services/preflight.service.d.ts +1 -3
  16. package/dist/server/modules/core/services/preflight.service.js +2 -28
  17. package/dist/server/modules/core/services/preflight.service.js.map +1 -1
  18. package/dist/server/modules/core/services/provider-mcp-ensure.service.d.ts +26 -0
  19. package/dist/server/modules/core/services/provider-mcp-ensure.service.js +224 -0
  20. package/dist/server/modules/core/services/provider-mcp-ensure.service.js.map +1 -0
  21. package/dist/server/modules/epics/controllers/epics.controller.d.ts +3 -2
  22. package/dist/server/modules/epics/controllers/epics.controller.js +16 -6
  23. package/dist/server/modules/epics/controllers/epics.controller.js.map +1 -1
  24. package/dist/server/modules/events/catalog/epic.created.d.ts +2 -2
  25. package/dist/server/modules/events/catalog/index.d.ts +340 -2
  26. package/dist/server/modules/events/catalog/index.js +12 -0
  27. package/dist/server/modules/events/catalog/index.js.map +1 -1
  28. package/dist/server/modules/events/catalog/review.comment.created.d.ts +69 -0
  29. package/dist/server/modules/events/catalog/review.comment.created.js +30 -0
  30. package/dist/server/modules/events/catalog/review.comment.created.js.map +1 -0
  31. package/dist/server/modules/events/catalog/review.comment.deleted.d.ts +30 -0
  32. package/dist/server/modules/events/catalog/review.comment.deleted.js +17 -0
  33. package/dist/server/modules/events/catalog/review.comment.deleted.js.map +1 -0
  34. package/dist/server/modules/events/catalog/review.comment.resolved.d.ts +30 -0
  35. package/dist/server/modules/events/catalog/review.comment.resolved.js +17 -0
  36. package/dist/server/modules/events/catalog/review.comment.resolved.js.map +1 -0
  37. package/dist/server/modules/events/catalog/review.comment.updated.d.ts +39 -0
  38. package/dist/server/modules/events/catalog/review.comment.updated.js +20 -0
  39. package/dist/server/modules/events/catalog/review.comment.updated.js.map +1 -0
  40. package/dist/server/modules/events/catalog/review.created.d.ts +90 -0
  41. package/dist/server/modules/events/catalog/review.created.js +40 -0
  42. package/dist/server/modules/events/catalog/review.created.js.map +1 -0
  43. package/dist/server/modules/events/catalog/review.updated.d.ts +110 -0
  44. package/dist/server/modules/events/catalog/review.updated.js +35 -0
  45. package/dist/server/modules/events/catalog/review.updated.js.map +1 -0
  46. package/dist/server/modules/events/subscribers/index.js +4 -0
  47. package/dist/server/modules/events/subscribers/index.js.map +1 -1
  48. package/dist/server/modules/events/subscribers/review-broadcaster.subscriber.d.ts +16 -0
  49. package/dist/server/modules/events/subscribers/review-broadcaster.subscriber.js +163 -0
  50. package/dist/server/modules/events/subscribers/review-broadcaster.subscriber.js.map +1 -0
  51. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.d.ts +23 -0
  52. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js +217 -0
  53. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js.map +1 -0
  54. package/dist/server/modules/git/controllers/git.controller.d.ts +24 -0
  55. package/dist/server/modules/git/controllers/git.controller.js +230 -0
  56. package/dist/server/modules/git/controllers/git.controller.js.map +1 -0
  57. package/dist/server/modules/git/dtos/git.dto.d.ts +86 -0
  58. package/dist/server/modules/git/dtos/git.dto.js +36 -0
  59. package/dist/server/modules/git/dtos/git.dto.js.map +1 -0
  60. package/dist/server/modules/git/git.module.d.ts +2 -0
  61. package/dist/server/modules/git/git.module.js +25 -0
  62. package/dist/server/modules/git/git.module.js.map +1 -0
  63. package/dist/server/modules/git/services/git.service.d.ts +71 -0
  64. package/dist/server/modules/git/services/git.service.js +550 -0
  65. package/dist/server/modules/git/services/git.service.js.map +1 -0
  66. package/dist/server/modules/mcp/controllers/mcp-http.controller.js +17 -562
  67. package/dist/server/modules/mcp/controllers/mcp-http.controller.js.map +1 -1
  68. package/dist/server/modules/mcp/controllers/mcp-sdk.controller.js +9 -568
  69. package/dist/server/modules/mcp/controllers/mcp-sdk.controller.js.map +1 -1
  70. package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +226 -36
  71. package/dist/server/modules/mcp/dtos/mcp.dto.js +158 -50
  72. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  73. package/dist/server/modules/mcp/dtos/schema-registry.d.ts +7 -0
  74. package/dist/server/modules/mcp/dtos/schema-registry.js +56 -0
  75. package/dist/server/modules/mcp/dtos/schema-registry.js.map +1 -0
  76. package/dist/server/modules/mcp/mcp.module.js +2 -0
  77. package/dist/server/modules/mcp/mcp.module.js.map +1 -1
  78. package/dist/server/modules/mcp/services/mcp.service.d.ts +9 -1
  79. package/dist/server/modules/mcp/services/mcp.service.js +702 -33
  80. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  81. package/dist/server/modules/mcp/tool-definitions.d.ts +2438 -0
  82. package/dist/server/modules/mcp/tool-definitions.js +727 -0
  83. package/dist/server/modules/mcp/tool-definitions.js.map +1 -0
  84. package/dist/server/modules/mcp/utils/param-suggestion.d.ts +3 -0
  85. package/dist/server/modules/mcp/utils/param-suggestion.js +95 -0
  86. package/dist/server/modules/mcp/utils/param-suggestion.js.map +1 -0
  87. package/dist/server/modules/providers/controllers/providers.controller.d.ts +7 -6
  88. package/dist/server/modules/providers/controllers/providers.controller.js +12 -107
  89. package/dist/server/modules/providers/controllers/providers.controller.js.map +1 -1
  90. package/dist/server/modules/reviews/controllers/reviews.controller.d.ts +28 -0
  91. package/dist/server/modules/reviews/controllers/reviews.controller.js +369 -0
  92. package/dist/server/modules/reviews/controllers/reviews.controller.js.map +1 -0
  93. package/dist/server/modules/reviews/dtos/review.dto.d.ts +195 -0
  94. package/dist/server/modules/reviews/dtos/review.dto.js +92 -0
  95. package/dist/server/modules/reviews/dtos/review.dto.js.map +1 -0
  96. package/dist/server/modules/reviews/reviews.module.d.ts +2 -0
  97. package/dist/server/modules/reviews/reviews.module.js +27 -0
  98. package/dist/server/modules/reviews/reviews.module.js.map +1 -0
  99. package/dist/server/modules/reviews/services/reviews.service.d.ts +86 -0
  100. package/dist/server/modules/reviews/services/reviews.service.js +464 -0
  101. package/dist/server/modules/reviews/services/reviews.service.js.map +1 -0
  102. package/dist/server/modules/reviews/utils/notification-formatter.d.ts +12 -0
  103. package/dist/server/modules/reviews/utils/notification-formatter.js +60 -0
  104. package/dist/server/modules/reviews/utils/notification-formatter.js.map +1 -0
  105. package/dist/server/modules/sessions/services/sessions.service.d.ts +3 -1
  106. package/dist/server/modules/sessions/services/sessions.service.js +32 -2
  107. package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
  108. package/dist/server/modules/storage/db/schema.d.ts +697 -0
  109. package/dist/server/modules/storage/db/schema.js +71 -1
  110. package/dist/server/modules/storage/db/schema.js.map +1 -1
  111. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +23 -1
  112. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  113. package/dist/server/modules/storage/local/local-storage.service.d.ts +15 -2
  114. package/dist/server/modules/storage/local/local-storage.service.js +396 -7
  115. package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
  116. package/dist/server/modules/storage/models/domain.models.d.ts +62 -0
  117. package/dist/server/templates/claude-codex-advanced-swe.json +139 -0
  118. package/dist/server/templates/claude-codex-advanced.json +82 -82
  119. package/dist/server/templates/claude-opus.json +99 -99
  120. package/dist/server/templates/claude-swe-single.json +105 -0
  121. package/dist/server/templates/simple-codex.json +70 -70
  122. package/dist/server/test-setup.js +45 -0
  123. package/dist/server/test-setup.js.map +1 -1
  124. package/dist/server/tsconfig.tsbuildinfo +1 -1
  125. package/dist/server/ui/assets/ReviewDetailPage-I54h-2L-.js +6 -0
  126. package/dist/server/ui/assets/ReviewsPage-B4ua5hiX.js +19 -0
  127. package/dist/server/ui/assets/index-CqcmnFBh.css +32 -0
  128. package/dist/server/ui/assets/index-JbUMpbg7.js +858 -0
  129. package/dist/server/ui/assets/useReviewSubscription-C0GEsiRw.js +83 -0
  130. package/dist/server/ui/assets/useReviewSubscription-T3uj2-aP.css +1 -0
  131. package/dist/server/ui/index.html +2 -2
  132. package/dist/templates/claude-codex-advanced-swe.json +139 -0
  133. package/dist/templates/claude-codex-advanced.json +82 -82
  134. package/dist/templates/claude-opus.json +99 -99
  135. package/dist/templates/claude-swe-single.json +105 -0
  136. package/dist/templates/simple-codex.json +70 -70
  137. package/package.json +16 -3
  138. package/prebuilds/node-pty/darwin-arm64/pty.node +0 -0
  139. package/prebuilds/node-pty/darwin-arm64/spawn-helper +0 -0
  140. package/prebuilds/node-pty/darwin-x64/pty.node +0 -0
  141. package/prebuilds/node-pty/darwin-x64/spawn-helper +0 -0
  142. package/prebuilds/node-pty/linux-arm64/pty.node +0 -0
  143. package/prebuilds/node-pty/linux-x64/pty.node +0 -0
  144. package/prebuilds/node-pty/win32-arm64/conpty/OpenConsole.exe +0 -0
  145. package/prebuilds/node-pty/win32-arm64/conpty/conpty.dll +0 -0
  146. package/prebuilds/node-pty/win32-arm64/conpty.node +0 -0
  147. package/prebuilds/node-pty/win32-arm64/conpty.pdb +0 -0
  148. package/prebuilds/node-pty/win32-arm64/conpty_console_list.node +0 -0
  149. package/prebuilds/node-pty/win32-arm64/conpty_console_list.pdb +0 -0
  150. package/prebuilds/node-pty/win32-arm64/pty.node +0 -0
  151. package/prebuilds/node-pty/win32-arm64/pty.pdb +0 -0
  152. package/prebuilds/node-pty/win32-arm64/winpty-agent.exe +0 -0
  153. package/prebuilds/node-pty/win32-arm64/winpty-agent.pdb +0 -0
  154. package/prebuilds/node-pty/win32-arm64/winpty.dll +0 -0
  155. package/prebuilds/node-pty/win32-arm64/winpty.pdb +0 -0
  156. package/prebuilds/node-pty/win32-x64/conpty/OpenConsole.exe +0 -0
  157. package/prebuilds/node-pty/win32-x64/conpty/conpty.dll +0 -0
  158. package/prebuilds/node-pty/win32-x64/conpty.node +0 -0
  159. package/prebuilds/node-pty/win32-x64/conpty.pdb +0 -0
  160. package/prebuilds/node-pty/win32-x64/conpty_console_list.node +0 -0
  161. package/prebuilds/node-pty/win32-x64/conpty_console_list.pdb +0 -0
  162. package/prebuilds/node-pty/win32-x64/pty.node +0 -0
  163. package/prebuilds/node-pty/win32-x64/pty.pdb +0 -0
  164. package/prebuilds/node-pty/win32-x64/winpty-agent.exe +0 -0
  165. package/prebuilds/node-pty/win32-x64/winpty-agent.pdb +0 -0
  166. package/prebuilds/node-pty/win32-x64/winpty.dll +0 -0
  167. package/prebuilds/node-pty/win32-x64/winpty.pdb +0 -0
  168. package/scripts/postinstall.js +51 -1
  169. package/dist/server/ui/assets/index-BoDZOB7c.css +0 -32
  170. package/dist/server/ui/assets/index-hB0e02VB.js +0 -735
@@ -0,0 +1,71 @@
1
+ import { StorageService } from '../../storage/interfaces/storage.interface';
2
+ export interface Commit {
3
+ sha: string;
4
+ message: string;
5
+ author: string;
6
+ authorEmail: string;
7
+ date: string;
8
+ }
9
+ export interface Branch {
10
+ name: string;
11
+ sha: string;
12
+ isCurrent: boolean;
13
+ }
14
+ export interface Tag {
15
+ name: string;
16
+ sha: string;
17
+ }
18
+ export interface ChangedFile {
19
+ path: string;
20
+ status: 'added' | 'modified' | 'deleted' | 'renamed' | 'copied';
21
+ additions: number;
22
+ deletions: number;
23
+ oldPath?: string;
24
+ }
25
+ export type WorkingTreeFilter = 'all' | 'staged' | 'unstaged';
26
+ export interface WorkingTreeChanges {
27
+ staged: ChangedFile[];
28
+ unstaged: ChangedFile[];
29
+ untracked: string[];
30
+ }
31
+ export interface WorkingTreeDiffResult {
32
+ diff: string;
33
+ untrackedDiffsCapped: boolean;
34
+ untrackedTotal: number;
35
+ untrackedProcessed: number;
36
+ }
37
+ export interface WorkingTreeData {
38
+ changes: WorkingTreeChanges;
39
+ diff: string;
40
+ untrackedDiffsCapped: boolean;
41
+ untrackedTotal: number;
42
+ untrackedProcessed: number;
43
+ }
44
+ export declare class GitService {
45
+ private readonly storage;
46
+ constructor(storage: StorageService);
47
+ private execGit;
48
+ private validatePathWithinProject;
49
+ resolveRef(projectId: string, ref: string): Promise<string>;
50
+ listCommits(projectId: string, options?: {
51
+ limit?: number;
52
+ ref?: string;
53
+ }): Promise<Commit[]>;
54
+ listBranches(projectId: string): Promise<Branch[]>;
55
+ listTags(projectId: string): Promise<Tag[]>;
56
+ getDiff(projectId: string, baseSha: string, headSha: string): Promise<string>;
57
+ getChangedFiles(projectId: string, baseSha: string, headSha: string): Promise<ChangedFile[]>;
58
+ getFileContent(projectId: string, ref: string, filePath: string): Promise<string>;
59
+ isGitRepository(projectId: string): Promise<boolean>;
60
+ getCurrentBranch(projectId: string): Promise<string | null>;
61
+ private parseChangedFiles;
62
+ getWorkingTreeChanges(projectId: string, filter?: WorkingTreeFilter): Promise<WorkingTreeChanges>;
63
+ getWorkingTreeData(projectId: string, filter?: WorkingTreeFilter): Promise<WorkingTreeData>;
64
+ getWorkingTreeDiff(projectId: string, filter?: WorkingTreeFilter): Promise<WorkingTreeDiffResult>;
65
+ private getUntrackedFileDiffs;
66
+ private isFileBinary;
67
+ private generateBinaryFilePlaceholderDiff;
68
+ private generateLargeFilePlaceholderDiff;
69
+ getCommitDiff(projectId: string, sha: string): Promise<string>;
70
+ getCommitChangedFiles(projectId: string, sha: string): Promise<ChangedFile[]>;
71
+ }
@@ -0,0 +1,550 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GitService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const child_process_1 = require("child_process");
18
+ const util_1 = require("util");
19
+ const fs_1 = require("fs");
20
+ const path_1 = require("path");
21
+ const storage_interface_1 = require("../../storage/interfaces/storage.interface");
22
+ const logger_1 = require("../../../common/logging/logger");
23
+ const error_types_1 = require("../../../common/errors/error-types");
24
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
25
+ const logger = (0, logger_1.createLogger)('GitService');
26
+ const MAX_BUFFER = 10 * 1024 * 1024;
27
+ const MAX_UNTRACKED_FILE_SIZE = 1 * 1024 * 1024;
28
+ const MAX_UNTRACKED_DIFFS = 50;
29
+ let GitService = class GitService {
30
+ constructor(storage) {
31
+ this.storage = storage;
32
+ }
33
+ async execGit(projectId, args, options) {
34
+ const rootPath = options?.rootPath ?? (await this.storage.getProject(projectId)).rootPath;
35
+ const gitDir = (0, path_1.join)(rootPath, '.git');
36
+ if (!(0, fs_1.existsSync)(gitDir)) {
37
+ throw new error_types_1.ValidationError('Project is not a git repository', {
38
+ projectId,
39
+ rootPath,
40
+ });
41
+ }
42
+ try {
43
+ const { stdout } = await execFileAsync('git', args, {
44
+ cwd: rootPath,
45
+ maxBuffer: options?.maxBuffer ?? MAX_BUFFER,
46
+ });
47
+ return stdout;
48
+ }
49
+ catch (error) {
50
+ const err = error;
51
+ if (options?.allowNonZero && err.code === 1 && err.stdout !== undefined) {
52
+ return err.stdout;
53
+ }
54
+ logger.error({ error: err.message, args, projectId }, 'Git command failed');
55
+ throw new error_types_1.IOError('Git command failed', {
56
+ projectId,
57
+ command: `git ${args.join(' ')}`,
58
+ stderr: err.stderr,
59
+ code: err.code,
60
+ });
61
+ }
62
+ }
63
+ validatePathWithinProject(rootPath, filePath) {
64
+ const fullPath = (0, path_1.isAbsolute)(filePath) ? filePath : (0, path_1.join)(rootPath, filePath);
65
+ const resolvedPath = (0, path_1.resolve)(fullPath);
66
+ const resolvedRoot = (0, path_1.resolve)(rootPath);
67
+ const relativePath = (0, path_1.relative)(resolvedRoot, resolvedPath);
68
+ if (relativePath.startsWith('..') || (0, path_1.isAbsolute)(relativePath)) {
69
+ throw new error_types_1.ValidationError('File path is outside project root', {
70
+ filePath,
71
+ rootPath,
72
+ });
73
+ }
74
+ return relativePath;
75
+ }
76
+ async resolveRef(projectId, ref) {
77
+ const output = await this.execGit(projectId, ['rev-parse', ref]);
78
+ return output.trim();
79
+ }
80
+ async listCommits(projectId, options) {
81
+ const limit = options?.limit ?? 50;
82
+ const ref = options?.ref ?? 'HEAD';
83
+ const format = '%H%x00%s%x00%an%x00%ae%x00%aI';
84
+ const output = await this.execGit(projectId, ['log', `--format=${format}`, `-n${limit}`, ref]);
85
+ if (!output.trim()) {
86
+ return [];
87
+ }
88
+ return output
89
+ .trim()
90
+ .split(/\r?\n/)
91
+ .filter(Boolean)
92
+ .map((line) => {
93
+ const [sha, message, author, authorEmail, date] = line.split('\x00');
94
+ return { sha, message, author, authorEmail, date };
95
+ });
96
+ }
97
+ async listBranches(projectId) {
98
+ const output = await this.execGit(projectId, [
99
+ 'for-each-ref',
100
+ '--format=%(refname:short)%00%(objectname)%00%(HEAD)',
101
+ 'refs/heads/',
102
+ ]);
103
+ if (!output.trim()) {
104
+ return [];
105
+ }
106
+ return output
107
+ .trim()
108
+ .split(/\r?\n/)
109
+ .filter(Boolean)
110
+ .map((line) => {
111
+ const [name, sha, headMarker] = line.split('\x00');
112
+ return {
113
+ name,
114
+ sha,
115
+ isCurrent: headMarker === '*',
116
+ };
117
+ });
118
+ }
119
+ async listTags(projectId) {
120
+ const output = await this.execGit(projectId, [
121
+ 'for-each-ref',
122
+ '--format=%(refname:short)%00%(objectname)',
123
+ 'refs/tags/',
124
+ ]);
125
+ if (!output.trim()) {
126
+ return [];
127
+ }
128
+ return output
129
+ .trim()
130
+ .split(/\r?\n/)
131
+ .filter(Boolean)
132
+ .map((line) => {
133
+ const [name, sha] = line.split('\x00');
134
+ return { name, sha };
135
+ });
136
+ }
137
+ async getDiff(projectId, baseSha, headSha) {
138
+ const output = await this.execGit(projectId, ['diff', baseSha, headSha]);
139
+ return output;
140
+ }
141
+ async getChangedFiles(projectId, baseSha, headSha) {
142
+ const [numstatOutput, statusOutput] = await Promise.all([
143
+ this.execGit(projectId, ['diff', '--numstat', baseSha, headSha]),
144
+ this.execGit(projectId, ['diff', '--name-status', baseSha, headSha]),
145
+ ]);
146
+ const stats = new Map();
147
+ if (numstatOutput.trim()) {
148
+ for (const line of numstatOutput.trim().split(/\r?\n/).filter(Boolean)) {
149
+ const [add, del, ...pathParts] = line.split('\t');
150
+ const path = pathParts.join('\t');
151
+ stats.set(path, {
152
+ additions: add === '-' ? 0 : parseInt(add, 10),
153
+ deletions: del === '-' ? 0 : parseInt(del, 10),
154
+ });
155
+ }
156
+ }
157
+ const files = [];
158
+ if (statusOutput.trim()) {
159
+ for (const line of statusOutput.trim().split(/\r?\n/).filter(Boolean)) {
160
+ const parts = line.split('\t');
161
+ const statusCode = parts[0];
162
+ const path = parts.length > 2 ? parts[2] : parts[1];
163
+ const oldPath = parts.length > 2 ? parts[1] : undefined;
164
+ let status;
165
+ switch (statusCode[0]) {
166
+ case 'A':
167
+ status = 'added';
168
+ break;
169
+ case 'M':
170
+ status = 'modified';
171
+ break;
172
+ case 'D':
173
+ status = 'deleted';
174
+ break;
175
+ case 'R':
176
+ status = 'renamed';
177
+ break;
178
+ case 'C':
179
+ status = 'copied';
180
+ break;
181
+ default:
182
+ status = 'modified';
183
+ }
184
+ const fileStats = stats.get(path) ??
185
+ stats.get(oldPath ?? '') ?? { additions: 0, deletions: 0 };
186
+ files.push({
187
+ path,
188
+ status,
189
+ additions: fileStats.additions,
190
+ deletions: fileStats.deletions,
191
+ ...(oldPath && { oldPath }),
192
+ });
193
+ }
194
+ }
195
+ return files;
196
+ }
197
+ async getFileContent(projectId, ref, filePath) {
198
+ const project = await this.storage.getProject(projectId);
199
+ const relativePath = this.validatePathWithinProject(project.rootPath, filePath);
200
+ try {
201
+ const output = await this.execGit(projectId, ['show', `${ref}:${relativePath}`]);
202
+ return output;
203
+ }
204
+ catch (error) {
205
+ const err = error;
206
+ if (err.stderr?.includes('does not exist') || err.stderr?.includes('Path')) {
207
+ throw new error_types_1.NotFoundError('File at ref', `${ref}:${relativePath}`);
208
+ }
209
+ throw error;
210
+ }
211
+ }
212
+ async isGitRepository(projectId) {
213
+ try {
214
+ const project = await this.storage.getProject(projectId);
215
+ const gitDir = (0, path_1.join)(project.rootPath, '.git');
216
+ return (0, fs_1.existsSync)(gitDir);
217
+ }
218
+ catch {
219
+ return false;
220
+ }
221
+ }
222
+ async getCurrentBranch(projectId) {
223
+ try {
224
+ const output = await this.execGit(projectId, ['rev-parse', '--abbrev-ref', 'HEAD']);
225
+ const branch = output.trim();
226
+ return branch === 'HEAD' ? null : branch;
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ }
232
+ parseChangedFiles(numstatOutput, statusOutput) {
233
+ const stats = new Map();
234
+ if (numstatOutput.trim()) {
235
+ for (const line of numstatOutput.trim().split(/\r?\n/).filter(Boolean)) {
236
+ const [add, del, ...pathParts] = line.split('\t');
237
+ const path = pathParts.join('\t');
238
+ stats.set(path, {
239
+ additions: add === '-' ? 0 : parseInt(add, 10),
240
+ deletions: del === '-' ? 0 : parseInt(del, 10),
241
+ });
242
+ }
243
+ }
244
+ const files = [];
245
+ if (statusOutput.trim()) {
246
+ for (const line of statusOutput.trim().split(/\r?\n/).filter(Boolean)) {
247
+ const parts = line.split('\t');
248
+ const statusCode = parts[0];
249
+ const path = parts.length > 2 ? parts[2] : parts[1];
250
+ const oldPath = parts.length > 2 ? parts[1] : undefined;
251
+ let status;
252
+ switch (statusCode[0]) {
253
+ case 'A':
254
+ status = 'added';
255
+ break;
256
+ case 'M':
257
+ status = 'modified';
258
+ break;
259
+ case 'D':
260
+ status = 'deleted';
261
+ break;
262
+ case 'R':
263
+ status = 'renamed';
264
+ break;
265
+ case 'C':
266
+ status = 'copied';
267
+ break;
268
+ default:
269
+ status = 'modified';
270
+ }
271
+ const fileStats = stats.get(path) ??
272
+ stats.get(oldPath ?? '') ?? { additions: 0, deletions: 0 };
273
+ files.push({
274
+ path,
275
+ status,
276
+ additions: fileStats.additions,
277
+ deletions: fileStats.deletions,
278
+ ...(oldPath && { oldPath }),
279
+ });
280
+ }
281
+ }
282
+ return files;
283
+ }
284
+ async getWorkingTreeChanges(projectId, filter = 'all') {
285
+ const project = await this.storage.getProject(projectId);
286
+ const rootPath = project.rootPath;
287
+ const result = {
288
+ staged: [],
289
+ unstaged: [],
290
+ untracked: [],
291
+ };
292
+ if (filter === 'all' || filter === 'staged') {
293
+ try {
294
+ const [stagedNumstat, stagedStatus] = await Promise.all([
295
+ this.execGit(projectId, ['diff', '--cached', '--numstat'], { rootPath }),
296
+ this.execGit(projectId, ['diff', '--cached', '--name-status'], { rootPath }),
297
+ ]);
298
+ result.staged = this.parseChangedFiles(stagedNumstat, stagedStatus);
299
+ }
300
+ catch (error) {
301
+ logger.warn({ error, projectId }, 'Failed to get staged changes');
302
+ }
303
+ }
304
+ if (filter === 'all' || filter === 'unstaged') {
305
+ try {
306
+ const [unstagedNumstat, unstagedStatus] = await Promise.all([
307
+ this.execGit(projectId, ['diff', '--numstat'], { rootPath }),
308
+ this.execGit(projectId, ['diff', '--name-status'], { rootPath }),
309
+ ]);
310
+ result.unstaged = this.parseChangedFiles(unstagedNumstat, unstagedStatus);
311
+ }
312
+ catch (error) {
313
+ logger.warn({ error, projectId }, 'Failed to get unstaged changes');
314
+ }
315
+ }
316
+ if (filter === 'all') {
317
+ try {
318
+ const untrackedOutput = await this.execGit(projectId, ['ls-files', '--others', '--exclude-standard'], { rootPath });
319
+ result.untracked = untrackedOutput.trim()
320
+ ? untrackedOutput.trim().split(/\r?\n/).filter(Boolean)
321
+ : [];
322
+ }
323
+ catch (error) {
324
+ logger.warn({ error, projectId }, 'Failed to get untracked files');
325
+ }
326
+ }
327
+ return result;
328
+ }
329
+ async getWorkingTreeData(projectId, filter = 'all') {
330
+ const project = await this.storage.getProject(projectId);
331
+ const rootPath = project.rootPath;
332
+ const changes = {
333
+ staged: [],
334
+ unstaged: [],
335
+ untracked: [],
336
+ };
337
+ const diffs = [];
338
+ let untrackedDiffsCapped = false;
339
+ let untrackedTotal = 0;
340
+ let untrackedProcessed = 0;
341
+ if (filter === 'all' || filter === 'staged') {
342
+ try {
343
+ const [stagedNumstat, stagedStatus, stagedDiff] = await Promise.all([
344
+ this.execGit(projectId, ['diff', '--cached', '--numstat'], { rootPath }),
345
+ this.execGit(projectId, ['diff', '--cached', '--name-status'], { rootPath }),
346
+ this.execGit(projectId, ['diff', '--cached'], { rootPath }),
347
+ ]);
348
+ changes.staged = this.parseChangedFiles(stagedNumstat, stagedStatus);
349
+ if (stagedDiff.trim()) {
350
+ diffs.push(stagedDiff);
351
+ }
352
+ }
353
+ catch (error) {
354
+ logger.warn({ error, projectId }, 'Failed to get staged changes');
355
+ }
356
+ }
357
+ if (filter === 'all' || filter === 'unstaged') {
358
+ try {
359
+ const [unstagedNumstat, unstagedStatus, unstagedDiff] = await Promise.all([
360
+ this.execGit(projectId, ['diff', '--numstat'], { rootPath }),
361
+ this.execGit(projectId, ['diff', '--name-status'], { rootPath }),
362
+ this.execGit(projectId, ['diff'], { rootPath }),
363
+ ]);
364
+ changes.unstaged = this.parseChangedFiles(unstagedNumstat, unstagedStatus);
365
+ if (unstagedDiff.trim()) {
366
+ diffs.push(unstagedDiff);
367
+ }
368
+ }
369
+ catch (error) {
370
+ logger.warn({ error, projectId }, 'Failed to get unstaged changes');
371
+ }
372
+ }
373
+ if (filter === 'all') {
374
+ try {
375
+ const untrackedOutput = await this.execGit(projectId, ['ls-files', '--others', '--exclude-standard'], { rootPath });
376
+ const untrackedFiles = untrackedOutput.trim()
377
+ ? untrackedOutput.trim().split(/\r?\n/).filter(Boolean)
378
+ : [];
379
+ changes.untracked = untrackedFiles;
380
+ if (untrackedFiles.length > 0) {
381
+ const untrackedResult = await this.getUntrackedFileDiffs(projectId, rootPath, untrackedFiles);
382
+ if (untrackedResult.diffs.length > 0) {
383
+ diffs.push(...untrackedResult.diffs);
384
+ }
385
+ untrackedDiffsCapped = untrackedResult.capped;
386
+ untrackedTotal = untrackedResult.total;
387
+ untrackedProcessed = untrackedResult.processed;
388
+ }
389
+ }
390
+ catch (error) {
391
+ logger.warn({ error, projectId }, 'Failed to get untracked files');
392
+ }
393
+ }
394
+ return {
395
+ changes,
396
+ diff: diffs.join('\n'),
397
+ untrackedDiffsCapped,
398
+ untrackedTotal,
399
+ untrackedProcessed,
400
+ };
401
+ }
402
+ async getWorkingTreeDiff(projectId, filter = 'all') {
403
+ const project = await this.storage.getProject(projectId);
404
+ const rootPath = project.rootPath;
405
+ const diffs = [];
406
+ let untrackedDiffsCapped = false;
407
+ let untrackedTotal = 0;
408
+ let untrackedProcessed = 0;
409
+ if (filter === 'all' || filter === 'staged') {
410
+ try {
411
+ const stagedDiff = await this.execGit(projectId, ['diff', '--cached'], { rootPath });
412
+ if (stagedDiff.trim()) {
413
+ diffs.push(stagedDiff);
414
+ }
415
+ }
416
+ catch (error) {
417
+ logger.warn({ error, projectId }, 'Failed to get staged diff');
418
+ }
419
+ }
420
+ if (filter === 'all' || filter === 'unstaged') {
421
+ try {
422
+ const unstagedDiff = await this.execGit(projectId, ['diff'], { rootPath });
423
+ if (unstagedDiff.trim()) {
424
+ diffs.push(unstagedDiff);
425
+ }
426
+ }
427
+ catch (error) {
428
+ logger.warn({ error, projectId }, 'Failed to get unstaged diff');
429
+ }
430
+ }
431
+ if (filter === 'all') {
432
+ try {
433
+ const untrackedResult = await this.getUntrackedFileDiffs(projectId, rootPath);
434
+ if (untrackedResult.diffs.length > 0) {
435
+ diffs.push(...untrackedResult.diffs);
436
+ }
437
+ untrackedDiffsCapped = untrackedResult.capped;
438
+ untrackedTotal = untrackedResult.total;
439
+ untrackedProcessed = untrackedResult.processed;
440
+ }
441
+ catch (error) {
442
+ logger.warn({ error, projectId }, 'Failed to get untracked file diffs');
443
+ }
444
+ }
445
+ return {
446
+ diff: diffs.join('\n'),
447
+ untrackedDiffsCapped,
448
+ untrackedTotal,
449
+ untrackedProcessed,
450
+ };
451
+ }
452
+ async getUntrackedFileDiffs(projectId, rootPath, untrackedFiles) {
453
+ if (!untrackedFiles) {
454
+ const untrackedOutput = await this.execGit(projectId, ['ls-files', '--others', '--exclude-standard'], { rootPath });
455
+ if (!untrackedOutput.trim()) {
456
+ return { diffs: [], capped: false, total: 0, processed: 0 };
457
+ }
458
+ untrackedFiles = untrackedOutput.trim().split(/\r?\n/).filter(Boolean);
459
+ }
460
+ if (untrackedFiles.length === 0) {
461
+ return { diffs: [], capped: false, total: 0, processed: 0 };
462
+ }
463
+ const diffs = [];
464
+ const total = untrackedFiles.length;
465
+ const capped = total > MAX_UNTRACKED_DIFFS;
466
+ const filesToProcess = untrackedFiles.slice(0, MAX_UNTRACKED_DIFFS);
467
+ if (capped) {
468
+ logger.info({ projectId, total, processed: MAX_UNTRACKED_DIFFS }, 'Capping untracked file diffs for performance');
469
+ }
470
+ for (const filePath of filesToProcess) {
471
+ try {
472
+ const relativePath = this.validatePathWithinProject(rootPath, filePath);
473
+ const fullPath = (0, path_1.join)(rootPath, relativePath);
474
+ if (!(0, fs_1.existsSync)(fullPath)) {
475
+ continue;
476
+ }
477
+ const stats = (0, fs_1.statSync)(fullPath);
478
+ if (stats.size > MAX_UNTRACKED_FILE_SIZE) {
479
+ diffs.push(this.generateLargeFilePlaceholderDiff(relativePath, stats.size));
480
+ continue;
481
+ }
482
+ const isBinary = await this.isFileBinary(projectId, relativePath, rootPath);
483
+ if (isBinary) {
484
+ diffs.push(this.generateBinaryFilePlaceholderDiff(relativePath));
485
+ continue;
486
+ }
487
+ const diff = await this.execGit(projectId, ['diff', '--no-index', '--', '/dev/null', relativePath], { allowNonZero: true, rootPath });
488
+ if (diff.trim()) {
489
+ diffs.push(diff);
490
+ }
491
+ }
492
+ catch (error) {
493
+ logger.warn({ error, projectId, filePath }, 'Failed to generate diff for untracked file');
494
+ }
495
+ }
496
+ return { diffs, capped, total, processed: filesToProcess.length };
497
+ }
498
+ async isFileBinary(projectId, relativePath, rootPath) {
499
+ try {
500
+ const output = await this.execGit(projectId, ['diff', '--no-index', '--numstat', '--', '/dev/null', relativePath], { allowNonZero: true, rootPath });
501
+ return output.startsWith('-\t-\t');
502
+ }
503
+ catch {
504
+ return false;
505
+ }
506
+ }
507
+ generateBinaryFilePlaceholderDiff(relativePath) {
508
+ return `diff --git a/${relativePath} b/${relativePath}
509
+ new file mode 100644
510
+ --- /dev/null
511
+ +++ b/${relativePath}
512
+ @@ -0,0 +1 @@
513
+ +Binary file (content not shown)
514
+ \`;
515
+ }
516
+ generateLargeFilePlaceholderDiff(relativePath, size) {
517
+ const sizeMB = (size / (1024 * 1024)).toFixed(2);
518
+ return `diff --git a/${relativePath} b/${relativePath}
519
+ new file mode 100644
520
+ --- /dev/null
521
+ +++ b/${relativePath}
522
+ @@ -0,0 +1 @@
523
+ +File too large (${sizeMB}MB) - content not shown
524
+ \`;
525
+ }
526
+ async getCommitDiff(projectId, sha) {
527
+ if (!/^[a-f0-9]{4,40}$/i.test(sha)) {
528
+ throw new error_types_1.ValidationError('Invalid commit SHA', { sha });
529
+ }
530
+ const output = await this.execGit(projectId, ['show', sha, '--format=']);
531
+ return output;
532
+ }
533
+ async getCommitChangedFiles(projectId, sha) {
534
+ if (!/^[a-f0-9]{4,40}$/i.test(sha)) {
535
+ throw new error_types_1.ValidationError('Invalid commit SHA', { sha });
536
+ }
537
+ const [numstatOutput, statusOutput] = await Promise.all([
538
+ this.execGit(projectId, ['show', sha, '--format=', '--numstat']),
539
+ this.execGit(projectId, ['show', sha, '--format=', '--name-status']),
540
+ ]);
541
+ return this.parseChangedFiles(numstatOutput, statusOutput);
542
+ }
543
+ };
544
+ exports.GitService = GitService;
545
+ exports.GitService = GitService = __decorate([
546
+ (0, common_1.Injectable)(),
547
+ __param(0, (0, common_1.Inject)(storage_interface_1.STORAGE_SERVICE)),
548
+ __metadata("design:paramtypes", [Object])
549
+ ], GitService);
550
+ //# sourceMappingURL=git.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.service.js","sourceRoot":"","sources":["../../../../src/modules/git/services/git.service.ts"],"names":[],"mappings":"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"}