@thxgg/steward 0.1.20 → 0.1.22

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 (94) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{Dn6yoG20.js → B4iDhohi.js} +2 -2
  3. package/.output/public/_nuxt/{CV5HFGKm.js → BQBm6AsP.js} +1 -1
  4. package/.output/public/_nuxt/{D6aZT905.js → BhBgWPCX.js} +1 -1
  5. package/.output/public/_nuxt/{BTHAQvnA.js → BuvhTQbX.js} +1 -1
  6. package/.output/public/_nuxt/{a87LfEfa.js → CL_YIWu4.js} +1 -1
  7. package/.output/public/_nuxt/CZWhz2fI.js +1 -0
  8. package/.output/public/_nuxt/C_5PUO5r.js +1 -0
  9. package/.output/public/_nuxt/{C2LWefrW.js → C_Sxjx0M.js} +1 -1
  10. package/.output/public/_nuxt/CjDuB5VD.js +1 -0
  11. package/.output/public/_nuxt/{DDV2bymk.js → CuOw9LiK.js} +1 -1
  12. package/.output/public/_nuxt/{CzCDTesu.js → DQivOuJJ.js} +1 -1
  13. package/.output/public/_nuxt/DUrbBKgG.js +3 -0
  14. package/.output/public/_nuxt/{B7kcsnX1.js → Du8Y9zEm.js} +1 -1
  15. package/.output/public/_nuxt/{DSqaInP-.js → HZy5mmMm.js} +1 -1
  16. package/.output/public/_nuxt/builds/latest.json +1 -1
  17. package/.output/public/_nuxt/builds/meta/3e08a0b0-262b-4fb5-b213-4aa35df11afb.json +1 -0
  18. package/.output/public/_nuxt/entry.xHdymH38.css +1 -0
  19. package/.output/public/_nuxt/{D9fz0wy8.js → okqELTtf.js} +1 -1
  20. package/.output/public/_nuxt/{ClxxfTZn.js → rG99Mq9f.js} +1 -1
  21. package/.output/public/_nuxt/rTDTR03M.js +30 -0
  22. package/.output/server/chunks/_/git-api.mjs +10 -23
  23. package/.output/server/chunks/_/git-api.mjs.map +1 -1
  24. package/.output/server/chunks/_/prd-service.mjs +1 -3
  25. package/.output/server/chunks/_/prd-service.mjs.map +1 -1
  26. package/.output/server/chunks/_/watcher.mjs +1 -2
  27. package/.output/server/chunks/_/watcher.mjs.map +1 -1
  28. package/.output/server/chunks/build/_prd_-DY25apyl.mjs +2 -1
  29. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  30. package/.output/server/chunks/build/default-BKKgG7HJ.mjs +2 -1
  31. package/.output/server/chunks/build/error-404-Bf6kdO80.mjs +2 -1
  32. package/.output/server/chunks/build/error-500-D_bcARXN.mjs +2 -1
  33. package/.output/server/chunks/build/index-DE1tjHAd.mjs +2 -1
  34. package/.output/server/chunks/build/nuxt-link-SvT1nf8Z.mjs +1 -1
  35. package/.output/server/chunks/build/repo-graph-CUcJKW1F.mjs +2 -1
  36. package/.output/server/chunks/build/server.mjs +3 -2
  37. package/.output/server/chunks/build/usePrd-hXZOmvAv.mjs +1 -1
  38. package/.output/server/chunks/nitro/nitro.mjs +1510 -690
  39. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  40. package/.output/server/chunks/routes/api/browse.get.mjs +1 -0
  41. package/.output/server/chunks/routes/api/browse.get.mjs.map +1 -1
  42. package/.output/server/chunks/routes/api/index.get.mjs +3 -3
  43. package/.output/server/chunks/routes/api/index.post.mjs +2 -2
  44. package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs +3 -5
  45. package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs.map +1 -1
  46. package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs +3 -5
  47. package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs.map +1 -1
  48. package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs +3 -5
  49. package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs.map +1 -1
  50. package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs +3 -5
  51. package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs.map +1 -1
  52. package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs +3 -5
  53. package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs.map +1 -1
  54. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/archive.post.mjs +2 -4
  55. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/archive.post.mjs.map +1 -1
  56. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs +3 -5
  57. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs.map +1 -1
  58. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs +3 -5
  59. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs.map +1 -1
  60. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs +3 -5
  61. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs.map +1 -1
  62. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs +3 -5
  63. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs.map +1 -1
  64. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs +3 -5
  65. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs.map +1 -1
  66. package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs +3 -5
  67. package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs.map +1 -1
  68. package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs +3 -3
  69. package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs +3 -3
  70. package/.output/server/chunks/routes/api/runtime.get.mjs +3 -2
  71. package/.output/server/chunks/routes/api/runtime.get.mjs.map +1 -1
  72. package/.output/server/chunks/routes/api/state-migration/status.get.mjs +3 -2
  73. package/.output/server/chunks/routes/api/state-migration/status.get.mjs.map +1 -1
  74. package/.output/server/chunks/routes/api/watch.get.mjs +3 -3
  75. package/.output/server/chunks/routes/renderer.mjs +1 -1
  76. package/.output/server/index.mjs +3 -2
  77. package/.output/server/index.mjs.map +1 -1
  78. package/.output/server/package.json +1 -1
  79. package/dist/host/src/api/git.js +14 -7
  80. package/dist/server/utils/git-repo-path.js +63 -0
  81. package/dist/server/utils/git.js +26 -9
  82. package/dist/server/utils/state-migration.js +206 -0
  83. package/package.json +1 -1
  84. package/.output/public/_nuxt/B3PShd4B.js +0 -3
  85. package/.output/public/_nuxt/B9j1BHt9.js +0 -1
  86. package/.output/public/_nuxt/BGSfDLaX.js +0 -1
  87. package/.output/public/_nuxt/DK5VWQk7.js +0 -1
  88. package/.output/public/_nuxt/builds/meta/37438177-5e14-4a46-9af4-eae491ba1f24.json +0 -1
  89. package/.output/public/_nuxt/entry.Dp3jx0Yw.css +0 -1
  90. package/.output/public/_nuxt/zhOijcjw.js +0 -30
  91. package/.output/server/chunks/_/git.mjs +0 -296
  92. package/.output/server/chunks/_/git.mjs.map +0 -1
  93. package/.output/server/chunks/_/repos.mjs +0 -272
  94. package/.output/server/chunks/_/repos.mjs.map +0 -1
@@ -1,296 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import { resolve, isAbsolute, relative, join } from 'node:path';
3
-
4
- async function execGit(repoPath, args) {
5
- return new Promise((resolve2, reject) => {
6
- const proc = spawn("git", args, {
7
- cwd: repoPath,
8
- env: { ...process.env, GIT_TERMINAL_PROMPT: "0" }
9
- });
10
- let stdout = "";
11
- let stderr = "";
12
- proc.stdout.on("data", (data) => {
13
- stdout += data.toString();
14
- });
15
- proc.stderr.on("data", (data) => {
16
- stderr += data.toString();
17
- });
18
- proc.on("close", (code) => {
19
- if (code === 0) {
20
- resolve2(stdout);
21
- } else {
22
- reject(new Error(stderr || `git exited with code ${code}`));
23
- }
24
- });
25
- proc.on("error", (err) => {
26
- reject(new Error(`Failed to spawn git: ${err.message}`));
27
- });
28
- });
29
- }
30
- async function isGitRepo(path) {
31
- try {
32
- await execGit(path, ["rev-parse", "--git-dir"]);
33
- return true;
34
- } catch {
35
- return false;
36
- }
37
- }
38
- function validatePathInRepo(repoPath, filePath) {
39
- const resolvedRepo = resolve(repoPath);
40
- const resolvedFile = isAbsolute(filePath) ? resolve(filePath) : resolve(repoPath, filePath);
41
- const relativePath = relative(resolvedRepo, resolvedFile);
42
- return !relativePath.startsWith("..") && !isAbsolute(relativePath);
43
- }
44
- async function getCommitInfo(repoPath, sha) {
45
- if (!/^[0-9a-f]{4,40}$/i.test(sha)) {
46
- throw new Error(`Invalid commit SHA: ${sha}`);
47
- }
48
- const format = "%H%n%h%n%s%n%an%n%aI";
49
- const output = await execGit(repoPath, ["show", sha, "--format=" + format, "--no-patch"]);
50
- const lines = output.trim().split("\n");
51
- if (lines.length < 5) {
52
- throw new Error(`Failed to parse commit info for ${sha}`);
53
- }
54
- const statsOutput = await execGit(repoPath, ["show", sha, "--format=", "--numstat"]);
55
- const statsLines = statsOutput.trim().split("\n").filter((l) => l.trim());
56
- let additions = 0;
57
- let deletions = 0;
58
- let filesChanged = 0;
59
- for (const line of statsLines) {
60
- const parts = line.split(" ");
61
- const added = parts[0];
62
- const deleted = parts[1];
63
- if (added && deleted && added !== "-" && deleted !== "-") {
64
- additions += parseInt(added, 10) || 0;
65
- deletions += parseInt(deleted, 10) || 0;
66
- }
67
- filesChanged++;
68
- }
69
- return {
70
- sha: lines[0],
71
- shortSha: lines[1],
72
- message: lines[2],
73
- author: lines[3],
74
- date: lines[4],
75
- filesChanged,
76
- additions,
77
- deletions
78
- };
79
- }
80
- async function getCommitDiff(repoPath, sha) {
81
- if (!/^[0-9a-f]{4,40}$/i.test(sha)) {
82
- throw new Error(`Invalid commit SHA: ${sha}`);
83
- }
84
- const numstatOutput = await execGit(repoPath, ["show", sha, "--format=", "--numstat"]);
85
- const nameStatusOutput = await execGit(repoPath, ["show", sha, "--format=", "--name-status"]);
86
- const numstatLines = numstatOutput.trim().split("\n").filter((l) => l.trim());
87
- const nameStatusLines = nameStatusOutput.trim().split("\n").filter((l) => l.trim());
88
- const files = [];
89
- const statsMap = /* @__PURE__ */ new Map();
90
- for (const line of numstatLines) {
91
- const parts = line.split(" ");
92
- if (parts.length >= 3) {
93
- const added = parts[0];
94
- const deleted = parts[1];
95
- const pathParts = parts.slice(2);
96
- const path = pathParts.join(" ");
97
- const isBinary = added === "-" && deleted === "-";
98
- statsMap.set(path, {
99
- additions: isBinary ? 0 : parseInt(added, 10) || 0,
100
- deletions: isBinary ? 0 : parseInt(deleted, 10) || 0,
101
- binary: isBinary
102
- });
103
- }
104
- }
105
- for (const line of nameStatusLines) {
106
- const parts = line.split(" ");
107
- if (parts.length < 2 || !parts[0] || !parts[1]) continue;
108
- const statusChar = parts[0].charAt(0);
109
- let status;
110
- let path;
111
- let oldPath;
112
- switch (statusChar) {
113
- case "A":
114
- status = "added";
115
- path = parts[1];
116
- break;
117
- case "D":
118
- status = "deleted";
119
- path = parts[1];
120
- break;
121
- case "M":
122
- status = "modified";
123
- path = parts[1];
124
- break;
125
- case "R":
126
- status = "renamed";
127
- oldPath = parts[1];
128
- path = parts[2] || parts[1];
129
- break;
130
- case "C":
131
- status = "added";
132
- path = parts[2] || parts[1];
133
- break;
134
- default:
135
- status = "modified";
136
- path = parts[1];
137
- }
138
- const stats = statsMap.get(path) || (oldPath ? statsMap.get(`${oldPath} => ${path}`) : void 0) || statsMap.get(`${oldPath} ${path}`) || { additions: 0, deletions: 0, binary: false };
139
- files.push({
140
- path,
141
- status,
142
- oldPath,
143
- additions: stats.additions,
144
- deletions: stats.deletions,
145
- binary: stats.binary
146
- });
147
- }
148
- return files;
149
- }
150
- async function getFileDiff(repoPath, sha, filePath) {
151
- if (!/^[0-9a-f]{4,40}$/i.test(sha)) {
152
- throw new Error(`Invalid commit SHA: ${sha}`);
153
- }
154
- if (!validatePathInRepo(repoPath, filePath)) {
155
- throw new Error("File path is outside repository");
156
- }
157
- const output = await execGit(repoPath, [
158
- "show",
159
- sha,
160
- "--format=",
161
- "--unified=3",
162
- "--",
163
- filePath
164
- ]);
165
- return parseDiffHunks(output);
166
- }
167
- function parseDiffHunks(diffOutput) {
168
- const hunks = [];
169
- const lines = diffOutput.split("\n");
170
- let currentHunk = null;
171
- let oldLineNum = 0;
172
- let newLineNum = 0;
173
- for (const line of lines) {
174
- const hunkMatch = line.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
175
- if (hunkMatch) {
176
- if (currentHunk) {
177
- hunks.push(currentHunk);
178
- }
179
- const oldStart = parseInt(hunkMatch[1], 10);
180
- const oldLines = hunkMatch[2] ? parseInt(hunkMatch[2], 10) : 1;
181
- const newStart = parseInt(hunkMatch[3], 10);
182
- const newLines = hunkMatch[4] ? parseInt(hunkMatch[4], 10) : 1;
183
- currentHunk = {
184
- oldStart,
185
- oldLines,
186
- newStart,
187
- newLines,
188
- lines: []
189
- };
190
- oldLineNum = oldStart;
191
- newLineNum = newStart;
192
- continue;
193
- }
194
- const isDiffHeader = line.startsWith("diff --git") || line.startsWith("index ") || /^--- (?:a\/.*|\/dev\/null)$/.test(line) || /^\+\+\+ (?:b\/.*|\/dev\/null)$/.test(line) || line === "\";
195
- if (isDiffHeader) {
196
- continue;
197
- }
198
- if (currentHunk) {
199
- if (line.startsWith("+")) {
200
- const diffLine = {
201
- type: "add",
202
- content: line.substring(1),
203
- newNumber: newLineNum++
204
- };
205
- currentHunk.lines.push(diffLine);
206
- } else if (line.startsWith("-")) {
207
- const diffLine = {
208
- type: "remove",
209
- content: line.substring(1),
210
- oldNumber: oldLineNum++
211
- };
212
- currentHunk.lines.push(diffLine);
213
- } else if (line.startsWith(" ")) {
214
- const diffLine = {
215
- type: "context",
216
- content: line.substring(1),
217
- oldNumber: oldLineNum++,
218
- newNumber: newLineNum++
219
- };
220
- currentHunk.lines.push(diffLine);
221
- }
222
- }
223
- }
224
- if (currentHunk) {
225
- hunks.push(currentHunk);
226
- }
227
- return hunks;
228
- }
229
- async function getFileContent(repoPath, sha, filePath) {
230
- if (!/^[0-9a-f]{4,40}$/i.test(sha)) {
231
- throw new Error(`Invalid commit SHA: ${sha}`);
232
- }
233
- if (!validatePathInRepo(repoPath, filePath)) {
234
- throw new Error("File path is outside repository");
235
- }
236
- const output = await execGit(repoPath, ["show", `${sha}:${filePath}`]);
237
- return output;
238
- }
239
- async function commitExistsInRepo(repoPath, sha) {
240
- try {
241
- await execGit(repoPath, ["cat-file", "-t", sha]);
242
- return true;
243
- } catch {
244
- return false;
245
- }
246
- }
247
- async function findRepoForCommit(repoConfig, sha) {
248
- if (!/^[0-9a-f]{4,40}$/i.test(sha)) {
249
- throw new Error(`Invalid commit SHA: ${sha}`);
250
- }
251
- if (await isGitRepo(repoConfig.path)) {
252
- if (await commitExistsInRepo(repoConfig.path, sha)) {
253
- return {
254
- sha,
255
- repoPath: "",
256
- absolutePath: repoConfig.path
257
- };
258
- }
259
- }
260
- if (!repoConfig.gitRepos || repoConfig.gitRepos.length === 0) {
261
- throw new Error(`Commit ${sha.substring(0, 7)} not found in repository "${repoConfig.name}"`);
262
- }
263
- const results = await Promise.all(
264
- repoConfig.gitRepos.map(async (gitRepo) => {
265
- if (await commitExistsInRepo(gitRepo.absolutePath, sha)) {
266
- return {
267
- sha,
268
- repoPath: gitRepo.relativePath,
269
- absolutePath: gitRepo.absolutePath
270
- };
271
- }
272
- return null;
273
- })
274
- );
275
- const found = results.find((r) => r !== null);
276
- if (found) {
277
- return found;
278
- }
279
- throw new Error(
280
- `Commit ${sha.substring(0, 7)} not found in repository "${repoConfig.name}" or any of its ${repoConfig.gitRepos.length} discovered git repos`
281
- );
282
- }
283
- async function resolveCommitRepo(repoConfig, commitEntry) {
284
- if (typeof commitEntry === "object" && commitEntry.sha && commitEntry.repo) {
285
- return {
286
- sha: commitEntry.sha,
287
- repoPath: commitEntry.repo,
288
- absolutePath: join(repoConfig.path, commitEntry.repo)
289
- };
290
- }
291
- const sha = typeof commitEntry === "string" ? commitEntry : commitEntry.sha;
292
- return findRepoForCommit(repoConfig, sha);
293
- }
294
-
295
- export { getCommitDiff as a, getFileContent as b, getFileDiff as c, findRepoForCommit as f, getCommitInfo as g, isGitRepo as i, resolveCommitRepo as r, validatePathInRepo as v };
296
- //# sourceMappingURL=git.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.mjs","sources":["../../../../server/utils/git.ts"],"names":["resolve"],"mappings":"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"}
@@ -1,272 +0,0 @@
1
- import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import { promises, existsSync } from 'node:fs';
2
- import { resolve, isAbsolute, join, basename, relative, dirname } from 'node:path';
3
- import { randomUUID } from 'node:crypto';
4
- import { fileURLToPath } from 'node:url';
5
- import { b as dbRun, h as dbAll, e as dbGet } from '../nitro/nitro.mjs';
6
-
7
- function findPackageRoot(startDir) {
8
- let currentDir = startDir;
9
- while (true) {
10
- if (existsSync(join(currentDir, "package.json"))) {
11
- return currentDir;
12
- }
13
- const parentDir = dirname(currentDir);
14
- if (parentDir === currentDir) {
15
- return startDir;
16
- }
17
- currentDir = parentDir;
18
- }
19
- }
20
- function normalizePathSlashes(path) {
21
- return path.replaceAll("\\", "/");
22
- }
23
- function isPathWithin(basePath, candidatePath) {
24
- const relativePath = relative(resolve(basePath), resolve(candidatePath));
25
- return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute(relativePath);
26
- }
27
- const PACKAGE_ROOT = findPackageRoot(dirname(fileURLToPath(globalThis._importMeta_.url)));
28
- const LEGACY_REPOS_FILE = join(PACKAGE_ROOT, "server", "data", "repos.json");
29
- let legacyImportPromise = null;
30
- function serializeGitRepos(gitRepos) {
31
- return gitRepos && gitRepos.length > 0 ? JSON.stringify(gitRepos) : null;
32
- }
33
- function parseGitRepos(repoPath, gitReposJson) {
34
- if (!gitReposJson) {
35
- return void 0;
36
- }
37
- try {
38
- const parsed = JSON.parse(gitReposJson);
39
- if (!Array.isArray(parsed)) {
40
- return void 0;
41
- }
42
- const repoRoot = resolve(repoPath);
43
- const validRepos = /* @__PURE__ */ new Map();
44
- for (const item of parsed) {
45
- if (!item || typeof item !== "object") {
46
- continue;
47
- }
48
- const relativePath = item.relativePath;
49
- const name = item.name;
50
- if (!relativePath || !name) {
51
- continue;
52
- }
53
- const normalizedRelativePath = normalizePathSlashes(relativePath).replace(/^\.\//, "");
54
- if (!normalizedRelativePath || normalizedRelativePath === ".") {
55
- continue;
56
- }
57
- const absolutePath = resolve(repoRoot, normalizedRelativePath);
58
- if (!isPathWithin(repoRoot, absolutePath)) {
59
- continue;
60
- }
61
- validRepos.set(normalizedRelativePath, {
62
- relativePath: normalizedRelativePath,
63
- absolutePath,
64
- name
65
- });
66
- }
67
- return validRepos.size > 0 ? Array.from(validRepos.values()) : void 0;
68
- } catch {
69
- return void 0;
70
- }
71
- }
72
- function rowToRepo(row) {
73
- const gitRepos = parseGitRepos(row.path, row.git_repos_json);
74
- return {
75
- id: row.id,
76
- name: row.name,
77
- path: row.path,
78
- addedAt: row.added_at,
79
- ...gitRepos && { gitRepos }
80
- };
81
- }
82
- function isLegacyRepoConfig(value) {
83
- if (!value || typeof value !== "object") {
84
- return false;
85
- }
86
- const repo = value;
87
- return typeof repo.id === "string" && typeof repo.name === "string" && typeof repo.path === "string" && typeof repo.addedAt === "string";
88
- }
89
- async function importLegacyReposIfNeeded() {
90
- if (legacyImportPromise) {
91
- return legacyImportPromise;
92
- }
93
- legacyImportPromise = (async () => {
94
- var _a;
95
- const row = await dbGet("SELECT COUNT(*) as count FROM repos");
96
- if (((_a = row == null ? void 0 : row.count) != null ? _a : 0) > 0) {
97
- return;
98
- }
99
- let legacyRepos;
100
- try {
101
- const content = await promises.readFile(LEGACY_REPOS_FILE, "utf-8");
102
- legacyRepos = JSON.parse(content);
103
- } catch {
104
- return;
105
- }
106
- if (!Array.isArray(legacyRepos) || legacyRepos.length === 0) {
107
- return;
108
- }
109
- for (const candidate of legacyRepos) {
110
- if (!isLegacyRepoConfig(candidate)) {
111
- continue;
112
- }
113
- const repo = candidate;
114
- await dbRun(
115
- `
116
- INSERT INTO repos (id, name, path, added_at, git_repos_json)
117
- VALUES (?, ?, ?, ?, ?)
118
- ON CONFLICT(id) DO UPDATE SET
119
- name = excluded.name,
120
- path = excluded.path,
121
- added_at = excluded.added_at,
122
- git_repos_json = excluded.git_repos_json
123
- `,
124
- [repo.id, repo.name, repo.path, repo.addedAt, serializeGitRepos(repo.gitRepos)]
125
- );
126
- }
127
- try {
128
- await promises.unlink(LEGACY_REPOS_FILE);
129
- } catch {
130
- }
131
- })();
132
- return legacyImportPromise;
133
- }
134
- async function getRepos() {
135
- await importLegacyReposIfNeeded();
136
- const rows = await dbAll("SELECT id, name, path, added_at, git_repos_json FROM repos ORDER BY added_at ASC");
137
- return rows.map(rowToRepo);
138
- }
139
- async function addRepo(path, name) {
140
- await importLegacyReposIfNeeded();
141
- const resolvedPath = resolve(path);
142
- const existing = await dbGet("SELECT id FROM repos WHERE path = ?", [resolvedPath]);
143
- if (existing) {
144
- throw new Error("Repository already added");
145
- }
146
- const gitRepos = await discoverGitRepos(resolvedPath);
147
- const repo = {
148
- id: randomUUID(),
149
- name: name || basename(resolvedPath),
150
- path: resolvedPath,
151
- addedAt: (/* @__PURE__ */ new Date()).toISOString(),
152
- ...gitRepos.length > 0 && { gitRepos }
153
- };
154
- await dbRun(
155
- "INSERT INTO repos (id, name, path, added_at, git_repos_json) VALUES (?, ?, ?, ?, ?)",
156
- [repo.id, repo.name, repo.path, repo.addedAt, serializeGitRepos(repo.gitRepos)]
157
- );
158
- return repo;
159
- }
160
- async function getRepoById(id) {
161
- await importLegacyReposIfNeeded();
162
- const row = await dbGet(
163
- "SELECT id, name, path, added_at, git_repos_json FROM repos WHERE id = ?",
164
- [id]
165
- );
166
- return row ? rowToRepo(row) : void 0;
167
- }
168
- async function updateRepoGitRepos(id, gitRepos) {
169
- await importLegacyReposIfNeeded();
170
- const result = await dbRun(
171
- "UPDATE repos SET git_repos_json = ? WHERE id = ?",
172
- [serializeGitRepos(gitRepos), id]
173
- );
174
- return result.changes > 0;
175
- }
176
- async function removeRepo(id) {
177
- await importLegacyReposIfNeeded();
178
- const result = await dbRun("DELETE FROM repos WHERE id = ?", [id]);
179
- return result.changes > 0;
180
- }
181
- const IGNORED_DIRS = /* @__PURE__ */ new Set([
182
- "node_modules",
183
- ".git",
184
- "vendor",
185
- "dist",
186
- "build",
187
- ".next",
188
- ".nuxt",
189
- "__pycache__",
190
- ".venv",
191
- "venv",
192
- "target",
193
- // Rust
194
- "Pods"
195
- // iOS
196
- ]);
197
- async function isGitRepo(dirPath) {
198
- try {
199
- const gitPath = join(dirPath, ".git");
200
- const stats = await promises.stat(gitPath);
201
- return stats.isDirectory() || stats.isFile();
202
- } catch {
203
- return false;
204
- }
205
- }
206
- async function discoverGitRepos(basePath, maxDepth = 4) {
207
- const resolvedBase = resolve(basePath);
208
- if (await isGitRepo(resolvedBase)) {
209
- return [];
210
- }
211
- const discovered = [];
212
- async function scanDirectory(dirPath, currentDepth) {
213
- if (currentDepth > maxDepth) return;
214
- try {
215
- const entries = await promises.readdir(dirPath, { withFileTypes: true });
216
- for (const entry of entries) {
217
- if (!entry.isDirectory()) continue;
218
- if (IGNORED_DIRS.has(entry.name)) continue;
219
- const fullPath = join(dirPath, entry.name);
220
- if (await isGitRepo(fullPath)) {
221
- const relativePath = relative(resolvedBase, fullPath);
222
- discovered.push({
223
- relativePath,
224
- absolutePath: fullPath,
225
- name: entry.name
226
- });
227
- continue;
228
- }
229
- await scanDirectory(fullPath, currentDepth + 1);
230
- }
231
- } catch {
232
- }
233
- }
234
- await scanDirectory(resolvedBase, 1);
235
- return discovered;
236
- }
237
- async function validateRepoPath(path) {
238
- const trimmedPath = path.trim();
239
- if (trimmedPath.length === 0) {
240
- return { valid: false, error: "Path is required" };
241
- }
242
- if (trimmedPath.length > 4096) {
243
- return { valid: false, error: "Path is too long" };
244
- }
245
- if (trimmedPath.includes("\0")) {
246
- return { valid: false, error: "Path contains invalid characters" };
247
- }
248
- const isWindowsAbsolutePath = /^[A-Za-z]:[\\/]/.test(trimmedPath);
249
- if (!isAbsolute(trimmedPath) && !isWindowsAbsolutePath) {
250
- return { valid: false, error: "Path must be absolute" };
251
- }
252
- const resolvedPath = resolve(trimmedPath);
253
- try {
254
- const stats = await promises.stat(resolvedPath);
255
- if (!stats.isDirectory()) {
256
- return { valid: false, error: "Path is not a directory" };
257
- }
258
- const hasPrdDir = await promises.stat(join(resolvedPath, "docs", "prd")).then(() => true).catch(() => false);
259
- if (!hasPrdDir) {
260
- return {
261
- valid: false,
262
- error: "Directory does not appear to be a valid PRD repository (missing docs/prd directory)"
263
- };
264
- }
265
- return { valid: true };
266
- } catch {
267
- return { valid: false, error: "Directory does not exist" };
268
- }
269
- }
270
-
271
- export { getRepoById as a, addRepo as b, discoverGitRepos as d, getRepos as g, removeRepo as r, updateRepoGitRepos as u, validateRepoPath as v };
272
- //# sourceMappingURL=repos.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repos.mjs","sources":["../../../../server/utils/repos.ts"],"names":["fs"],"mappings":"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"}