@thxgg/steward 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{DZSVDCT3.js → B3hkJjmY.js} +1 -1
- package/.output/public/_nuxt/{BklAyl7e.js → BNzFoVmP.js} +1 -1
- package/.output/public/_nuxt/{Ck5q4LNZ.js → BRDbaJqY.js} +2 -2
- package/.output/public/_nuxt/{lAfn4NY4.js → Bo1Fdv48.js} +19 -19
- package/.output/public/_nuxt/{DIeYonPk.js → BqmZq_gb.js} +1 -1
- package/.output/public/_nuxt/{CxUtB6on.js → Bri1ZtcQ.js} +1 -1
- package/.output/public/_nuxt/{MKpq065x.js → CEJOILWG.js} +1 -1
- package/.output/public/_nuxt/{DuGNRgMW.js → CFsNy2aC.js} +1 -1
- package/.output/public/_nuxt/{BPnSj2YP.js → D0zW6lUK.js} +1 -1
- package/.output/public/_nuxt/DYDTtHLR.js +1 -0
- package/.output/public/_nuxt/{jgc2Z7xi.js → DhQtydpF.js} +2 -2
- package/.output/public/_nuxt/{C3Sxm8SF.js → X6fIXIFO.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/6683a0d9-9c02-4098-b750-bbbc0305261e.json +1 -0
- package/.output/server/chunks/_/git-api.mjs +100 -0
- package/.output/server/chunks/_/git-api.mjs.map +1 -0
- package/.output/server/chunks/_/git.mjs +1 -1
- package/.output/server/chunks/build/{_prd_-JbQLT1IJ.mjs → _prd_-CnwhMRyf.mjs} +12 -9
- package/.output/server/chunks/build/_prd_-CnwhMRyf.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/server.mjs +1 -1
- package/.output/server/chunks/nitro/nitro.mjs +618 -618
- package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs +41 -22
- package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs +27 -15
- package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs +42 -13
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs +29 -17
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/dist/host/src/ui.js +43 -6
- package/dist/server/utils/repos.js +2 -2
- package/package.json +1 -1
- package/.output/public/_nuxt/builds/meta/7bb8c982-dc40-47ba-9dfb-5efd6fd086ac.json +0 -1
- package/.output/public/_nuxt/tuYgPddM.js +0 -1
- package/.output/server/chunks/build/_prd_-JbQLT1IJ.mjs.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, g as getQuery } from '../../../../../nitro/nitro.mjs';
|
|
2
|
-
import { i as isGitRepo, g as getCommitInfo } from '../../../../../_/git.mjs';
|
|
2
|
+
import { i as isGitRepo, f as findRepoForCommit, g as getCommitInfo } from '../../../../../_/git.mjs';
|
|
3
|
+
import { b as buildRepoLookup, r as resolveRequestedGitRepoPath, n as normalizeErrorMessage, g as getRepoRelativePath } from '../../../../../_/git-api.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -43,46 +44,64 @@ const commits_get = defineEventHandler(async (event) => {
|
|
|
43
44
|
statusMessage: "At least one SHA is required"
|
|
44
45
|
});
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
+
const repoLookup = await buildRepoLookup(repo);
|
|
48
|
+
let fixedGitRepoPath = null;
|
|
49
|
+
let fixedRepoPath = "";
|
|
47
50
|
if (repoPath) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
const matchedRepo = repo.gitRepos.find((gr) => gr.relativePath === repoPath);
|
|
55
|
-
if (!matchedRepo) {
|
|
51
|
+
try {
|
|
52
|
+
const resolved = await resolveRequestedGitRepoPath(repoLookup, repoPath);
|
|
53
|
+
fixedGitRepoPath = resolved.gitRepoPath;
|
|
54
|
+
fixedRepoPath = resolved.normalizedRepoPath;
|
|
55
|
+
} catch (error) {
|
|
56
56
|
throw createError({
|
|
57
57
|
statusCode: 400,
|
|
58
|
-
statusMessage:
|
|
58
|
+
statusMessage: "Invalid repo path",
|
|
59
|
+
message: normalizeErrorMessage(error.message)
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
throw createError({
|
|
65
|
-
statusCode: 400,
|
|
66
|
-
statusMessage: "Resolved path is not a git repository"
|
|
67
|
-
});
|
|
62
|
+
} else if (await isGitRepo(repo.path)) {
|
|
63
|
+
fixedGitRepoPath = repo.path;
|
|
64
|
+
fixedRepoPath = "";
|
|
68
65
|
}
|
|
69
66
|
const commits = [];
|
|
70
67
|
const errors = [];
|
|
71
68
|
for (const sha of shas) {
|
|
72
69
|
try {
|
|
73
|
-
|
|
70
|
+
let gitRepoPathForCommit = fixedGitRepoPath;
|
|
71
|
+
let resolvedRepoPath = fixedRepoPath;
|
|
72
|
+
if (!gitRepoPathForCommit) {
|
|
73
|
+
const resolved = await findRepoForCommit(repoLookup, sha);
|
|
74
|
+
gitRepoPathForCommit = resolved.absolutePath;
|
|
75
|
+
resolvedRepoPath = resolved.repoPath;
|
|
76
|
+
}
|
|
77
|
+
let commit;
|
|
78
|
+
try {
|
|
79
|
+
commit = await getCommitInfo(gitRepoPathForCommit, sha);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (!fixedGitRepoPath) {
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
const fallback = await findRepoForCommit(repoLookup, sha).catch(() => null);
|
|
85
|
+
if (!fallback || fallback.absolutePath === gitRepoPathForCommit) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
commit = await getCommitInfo(fallback.absolutePath, sha);
|
|
89
|
+
resolvedRepoPath = fallback.repoPath;
|
|
90
|
+
gitRepoPathForCommit = fallback.absolutePath;
|
|
91
|
+
}
|
|
74
92
|
commits.push({
|
|
75
93
|
...commit,
|
|
76
|
-
repoPath:
|
|
94
|
+
repoPath: resolvedRepoPath || getRepoRelativePath(repo.path, gitRepoPathForCommit)
|
|
77
95
|
});
|
|
78
96
|
} catch (error) {
|
|
79
|
-
errors.push(`${sha}: ${error.message}`);
|
|
97
|
+
errors.push(`${sha}: ${normalizeErrorMessage(error.message)}`);
|
|
80
98
|
}
|
|
81
99
|
}
|
|
82
100
|
if (commits.length === 0 && errors.length > 0) {
|
|
83
101
|
throw createError({
|
|
84
102
|
statusCode: 404,
|
|
85
|
-
statusMessage:
|
|
103
|
+
statusMessage: "No valid commits found",
|
|
104
|
+
message: `No valid commits found: ${errors.join("; ")}`
|
|
86
105
|
});
|
|
87
106
|
}
|
|
88
107
|
return commits;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/commits.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/commits.get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAUA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAGA,EAAA,MAAA,KAAA,GAAA,SAAA,KAAA,CAAA;AACA,EAAA,MAAA,YAAA,KAAA,CAAA,IAAA;AACA,EAAA,MAAA,WAAA,KAAA,CAAA,IAAA;AAEA,EAAA,IAAA,CAAA,SAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,IAAA,GAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,IAAA,EAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA;AAEA,EAAA,IAAA,IAAA,CAAA,WAAA,CAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,UAAA,GAAA,MAAA,eAAA,CAAA,IAAA,CAAA;AAEA,EAAA,IAAA,gBAAA,GAAA,IAAA;AACA,EAAA,IAAA,aAAA,GAAA,EAAA;AAEA,EAAA,IAAA,QAAA,EAAA;AACA,IAAA,IAAA;AACA,MAAA,MAAA,QAAA,GAAA,MAAA,2BAAA,CAAA,UAAA,EAAA,QAAA,CAAA;AACA,MAAA,gBAAA,GAAA,QAAA,CAAA,WAAA;AACA,MAAA,aAAA,GAAA,QAAA,CAAA,kBAAA;AAAA,IACA,SAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA,mBAAA;AAAA,QACA,OAAA,EAAA,qBAAA,CAAA,KAAA,CAAA,OAAA;AAAA,OACA,CAAA;AAAA,IACA;AAAA,EACA,CAAA,MAAA,IAAA,MAAA,SAAA,CAAA,IAAA,CAAA,IAAA,CAAA,EAAA;AACA,IAAA,gBAAA,GAAA,IAAA,CAAA,IAAA;AACA,IAAA,aAAA,GAAA,EAAA;AAAA,EACA;AAGA,EAAA,MAAA,UAAA,EAAA;AACA,EAAA,MAAA,SAAA,EAAA;AAEA,EAAA,KAAA,MAAA,OAAA,IAAA,EAAA;AACA,IAAA,IAAA;AACA,MAAA,IAAA,oBAAA,GAAA,gBAAA;AACA,MAAA,IAAA,gBAAA,GAAA,aAAA;AAEA,MAAA,IAAA,CAAA,oBAAA,EAAA;AACA,QAAA,MAAA,QAAA,GAAA,MAAA,iBAAA,CAAA,UAAA,EAAA,GAAA,CAAA;AACA,QAAA,oBAAA,GAAA,QAAA,CAAA,YAAA;AACA,QAAA,gBAAA,GAAA,QAAA,CAAA,QAAA;AAAA,MACA;AAEA,MAAA,IAAA,MAAA;AAEA,MAAA,IAAA;AACA,QAAA,MAAA,GAAA,MAAA,aAAA,CAAA,oBAAA,EAAA,GAAA,CAAA;AAAA,MACA,SAAA,KAAA,EAAA;AACA,QAAA,IAAA,CAAA,gBAAA,EAAA;AACA,UAAA,MAAA,KAAA;AAAA,QACA;AAEA,QAAA,MAAA,QAAA,GAAA,MAAA,iBAAA,CAAA,UAAA,EAAA,GAAA,CAAA,CAAA,KAAA,CAAA,MAAA,IAAA,CAAA;AACA,QAAA,IAAA,CAAA,QAAA,IAAA,QAAA,CAAA,YAAA,KAAA,oBAAA,EAAA;AACA,UAAA,MAAA,KAAA;AAAA,QACA;AAEA,QAAA,MAAA,GAAA,MAAA,aAAA,CAAA,QAAA,CAAA,YAAA,EAAA,GAAA,CAAA;AACA,QAAA,gBAAA,GAAA,QAAA,CAAA,QAAA;AACA,QAAA,oBAAA,GAAA,QAAA,CAAA,YAAA;AAAA,MACA;AAEA,MAAA,OAAA,CAAA,IAAA,CAAA;AAAA,QACA,GAAA,MAAA;AAAA,QACA,QAAA,EAAA,gBAAA,IAAA,mBAAA,CAAA,IAAA,CAAA,MAAA,oBAAA;AAAA,OACA,CAAA;AAAA,IACA,SAAA,KAAA,EAAA;AACA,MAAA,MAAA,CAAA,IAAA,CAAA,GAAA,GAAA,CAAA,EAAA,EAAA,sBAAA,KAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,IACA;AAAA,EACA;AAGA,EAAA,IAAA,OAAA,CAAA,MAAA,KAAA,CAAA,IAAA,MAAA,CAAA,SAAA,CAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,wBAAA;AAAA,MACA,OAAA,EAAA,CAAA,wBAAA,EAAA,MAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,OAAA,OAAA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, g as getQuery } from '../../../../../nitro/nitro.mjs';
|
|
2
|
-
import { i as isGitRepo, a as getCommitDiff } from '../../../../../_/git.mjs';
|
|
2
|
+
import { i as isGitRepo, f as findRepoForCommit, a as getCommitDiff } from '../../../../../_/git.mjs';
|
|
3
|
+
import { b as buildRepoLookup, r as resolveRequestedGitRepoPath, n as normalizeErrorMessage } from '../../../../../_/git-api.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -36,36 +37,47 @@ const diff_get = defineEventHandler(async (event) => {
|
|
|
36
37
|
statusMessage: "commit query parameter is required"
|
|
37
38
|
});
|
|
38
39
|
}
|
|
40
|
+
const repoLookup = await buildRepoLookup(repo);
|
|
39
41
|
let gitRepoPath = repo.path;
|
|
40
42
|
if (repoPath) {
|
|
41
|
-
|
|
43
|
+
try {
|
|
44
|
+
const resolved = await resolveRequestedGitRepoPath(repoLookup, repoPath);
|
|
45
|
+
gitRepoPath = resolved.gitRepoPath;
|
|
46
|
+
} catch (error) {
|
|
42
47
|
throw createError({
|
|
43
48
|
statusCode: 400,
|
|
44
|
-
statusMessage: "repo
|
|
49
|
+
statusMessage: "Invalid repo path",
|
|
50
|
+
message: normalizeErrorMessage(error.message)
|
|
45
51
|
});
|
|
46
52
|
}
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
}
|
|
54
|
+
if (!await isGitRepo(gitRepoPath)) {
|
|
55
|
+
const fallback = await findRepoForCommit(repoLookup, commit).catch(() => null);
|
|
56
|
+
if (!fallback) {
|
|
49
57
|
throw createError({
|
|
50
58
|
statusCode: 400,
|
|
51
|
-
statusMessage:
|
|
59
|
+
statusMessage: "Resolved path is not a git repository"
|
|
52
60
|
});
|
|
53
61
|
}
|
|
54
|
-
gitRepoPath =
|
|
55
|
-
}
|
|
56
|
-
if (!await isGitRepo(gitRepoPath)) {
|
|
57
|
-
throw createError({
|
|
58
|
-
statusCode: 400,
|
|
59
|
-
statusMessage: "Resolved path is not a git repository"
|
|
60
|
-
});
|
|
62
|
+
gitRepoPath = fallback.absolutePath;
|
|
61
63
|
}
|
|
62
64
|
try {
|
|
63
65
|
const files = await getCommitDiff(gitRepoPath, commit);
|
|
64
66
|
return files;
|
|
65
67
|
} catch (error) {
|
|
68
|
+
const message = normalizeErrorMessage(error.message);
|
|
69
|
+
const fallback = await findRepoForCommit(repoLookup, commit).catch(() => null);
|
|
70
|
+
if (fallback && fallback.absolutePath !== gitRepoPath) {
|
|
71
|
+
try {
|
|
72
|
+
return await getCommitDiff(fallback.absolutePath, commit);
|
|
73
|
+
} catch {
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const isInvalidCommit = message.startsWith("Invalid commit SHA");
|
|
66
77
|
throw createError({
|
|
67
|
-
statusCode: 404,
|
|
68
|
-
statusMessage:
|
|
78
|
+
statusCode: isInvalidCommit ? 400 : 404,
|
|
79
|
+
statusMessage: isInvalidCommit ? "Invalid commit SHA" : "Commit not found or invalid",
|
|
80
|
+
message
|
|
69
81
|
});
|
|
70
82
|
}
|
|
71
83
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/diff.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diff.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/diff.get.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { d as defineEventHandler, a as getRouterParam, g as getQuery, c as createError, b as getRepos } from '../../../../../nitro/nitro.mjs';
|
|
2
|
-
import { i as isGitRepo, b as getFileContent } from '../../../../../_/git.mjs';
|
|
2
|
+
import { i as isGitRepo, f as findRepoForCommit, v as validatePathInRepo, b as getFileContent } from '../../../../../_/git.mjs';
|
|
3
|
+
import { b as buildRepoLookup, r as resolveRequestedGitRepoPath, n as normalizeErrorMessage } from '../../../../../_/git-api.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -31,33 +32,61 @@ const fileContent_get = defineEventHandler(async (event) => {
|
|
|
31
32
|
if (!repo) {
|
|
32
33
|
throw createError({ statusCode: 404, message: "Repository not found" });
|
|
33
34
|
}
|
|
35
|
+
const repoLookup = await buildRepoLookup(repo);
|
|
34
36
|
let gitRepoPath = repo.path;
|
|
35
37
|
if (repoPath) {
|
|
36
|
-
|
|
38
|
+
try {
|
|
39
|
+
const resolved = await resolveRequestedGitRepoPath(repoLookup, repoPath);
|
|
40
|
+
gitRepoPath = resolved.gitRepoPath;
|
|
41
|
+
} catch (error) {
|
|
37
42
|
throw createError({
|
|
38
43
|
statusCode: 400,
|
|
39
|
-
|
|
44
|
+
statusMessage: "Invalid repo path",
|
|
45
|
+
message: normalizeErrorMessage(error.message)
|
|
40
46
|
});
|
|
41
47
|
}
|
|
42
|
-
const matchedRepo = repo.gitRepos.find((gr) => gr.relativePath === repoPath);
|
|
43
|
-
if (!matchedRepo) {
|
|
44
|
-
throw createError({
|
|
45
|
-
statusCode: 400,
|
|
46
|
-
message: `repo "${repoPath}" is not a discovered git repo. Available: ${repo.gitRepos.map((gr) => gr.relativePath).join(", ")}`
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
gitRepoPath = matchedRepo.absolutePath;
|
|
50
48
|
}
|
|
51
49
|
if (!await isGitRepo(gitRepoPath)) {
|
|
52
|
-
|
|
50
|
+
const fallback = await findRepoForCommit(repoLookup, commit).catch(() => null);
|
|
51
|
+
if (!fallback) {
|
|
52
|
+
throw createError({ statusCode: 400, statusMessage: "Not a git repository" });
|
|
53
|
+
}
|
|
54
|
+
gitRepoPath = fallback.absolutePath;
|
|
55
|
+
}
|
|
56
|
+
if (!validatePathInRepo(gitRepoPath, file)) {
|
|
57
|
+
throw createError({ statusCode: 400, statusMessage: "Invalid file path", message: "Path traversal not allowed" });
|
|
53
58
|
}
|
|
54
59
|
try {
|
|
55
60
|
const content = await getFileContent(gitRepoPath, commit, file);
|
|
56
61
|
return { content };
|
|
57
62
|
} catch (error) {
|
|
63
|
+
const message = normalizeErrorMessage(error instanceof Error ? error.message : String(error));
|
|
64
|
+
const fallback = await findRepoForCommit(repoLookup, commit).catch(() => null);
|
|
65
|
+
if (fallback && fallback.absolutePath !== gitRepoPath && validatePathInRepo(fallback.absolutePath, file)) {
|
|
66
|
+
try {
|
|
67
|
+
const content = await getFileContent(fallback.absolutePath, commit, file);
|
|
68
|
+
return { content };
|
|
69
|
+
} catch {
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (message.includes("Invalid commit SHA")) {
|
|
73
|
+
throw createError({
|
|
74
|
+
statusCode: 400,
|
|
75
|
+
statusMessage: "Invalid commit SHA",
|
|
76
|
+
message
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (message.includes("outside repository")) {
|
|
80
|
+
throw createError({
|
|
81
|
+
statusCode: 400,
|
|
82
|
+
statusMessage: "Invalid file path",
|
|
83
|
+
message
|
|
84
|
+
});
|
|
85
|
+
}
|
|
58
86
|
throw createError({
|
|
59
87
|
statusCode: 404,
|
|
60
|
-
|
|
88
|
+
statusMessage: "Failed to get file content",
|
|
89
|
+
message
|
|
61
90
|
});
|
|
62
91
|
}
|
|
63
92
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-content.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/file-content.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-content.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/file-content.get.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, g as getQuery } from '../../../../../nitro/nitro.mjs';
|
|
2
|
-
import { i as isGitRepo, v as validatePathInRepo, c as getFileDiff } from '../../../../../_/git.mjs';
|
|
2
|
+
import { i as isGitRepo, f as findRepoForCommit, v as validatePathInRepo, c as getFileDiff } from '../../../../../_/git.mjs';
|
|
3
|
+
import { b as buildRepoLookup, r as resolveRequestedGitRepoPath, n as normalizeErrorMessage } from '../../../../../_/git-api.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -43,28 +44,29 @@ const fileDiff_get = defineEventHandler(async (event) => {
|
|
|
43
44
|
statusMessage: "file query parameter is required"
|
|
44
45
|
});
|
|
45
46
|
}
|
|
47
|
+
const repoLookup = await buildRepoLookup(repo);
|
|
46
48
|
let gitRepoPath = repo.path;
|
|
47
49
|
if (repoPath) {
|
|
48
|
-
|
|
50
|
+
try {
|
|
51
|
+
const resolved = await resolveRequestedGitRepoPath(repoLookup, repoPath);
|
|
52
|
+
gitRepoPath = resolved.gitRepoPath;
|
|
53
|
+
} catch (error) {
|
|
49
54
|
throw createError({
|
|
50
55
|
statusCode: 400,
|
|
51
|
-
statusMessage: "repo
|
|
56
|
+
statusMessage: "Invalid repo path",
|
|
57
|
+
message: normalizeErrorMessage(error.message)
|
|
52
58
|
});
|
|
53
59
|
}
|
|
54
|
-
|
|
55
|
-
|
|
60
|
+
}
|
|
61
|
+
if (!await isGitRepo(gitRepoPath)) {
|
|
62
|
+
const fallback = await findRepoForCommit(repoLookup, commit).catch(() => null);
|
|
63
|
+
if (!fallback) {
|
|
56
64
|
throw createError({
|
|
57
65
|
statusCode: 400,
|
|
58
|
-
statusMessage:
|
|
66
|
+
statusMessage: "Resolved path is not a git repository"
|
|
59
67
|
});
|
|
60
68
|
}
|
|
61
|
-
gitRepoPath =
|
|
62
|
-
}
|
|
63
|
-
if (!await isGitRepo(gitRepoPath)) {
|
|
64
|
-
throw createError({
|
|
65
|
-
statusCode: 400,
|
|
66
|
-
statusMessage: "Resolved path is not a git repository"
|
|
67
|
-
});
|
|
69
|
+
gitRepoPath = fallback.absolutePath;
|
|
68
70
|
}
|
|
69
71
|
if (!validatePathInRepo(gitRepoPath, file)) {
|
|
70
72
|
throw createError({
|
|
@@ -76,22 +78,32 @@ const fileDiff_get = defineEventHandler(async (event) => {
|
|
|
76
78
|
const hunks = await getFileDiff(gitRepoPath, commit, file);
|
|
77
79
|
return hunks;
|
|
78
80
|
} catch (error) {
|
|
79
|
-
const message = error.message;
|
|
81
|
+
const message = normalizeErrorMessage(error.message);
|
|
82
|
+
const fallback = await findRepoForCommit(repoLookup, commit).catch(() => null);
|
|
83
|
+
if (fallback && fallback.absolutePath !== gitRepoPath && validatePathInRepo(fallback.absolutePath, file)) {
|
|
84
|
+
try {
|
|
85
|
+
return await getFileDiff(fallback.absolutePath, commit, file);
|
|
86
|
+
} catch {
|
|
87
|
+
}
|
|
88
|
+
}
|
|
80
89
|
if (message.includes("Invalid commit SHA")) {
|
|
81
90
|
throw createError({
|
|
82
91
|
statusCode: 400,
|
|
83
|
-
statusMessage:
|
|
92
|
+
statusMessage: "Invalid commit SHA",
|
|
93
|
+
message
|
|
84
94
|
});
|
|
85
95
|
}
|
|
86
96
|
if (message.includes("outside repository")) {
|
|
87
97
|
throw createError({
|
|
88
98
|
statusCode: 400,
|
|
89
|
-
statusMessage:
|
|
99
|
+
statusMessage: "Invalid file path",
|
|
100
|
+
message
|
|
90
101
|
});
|
|
91
102
|
}
|
|
92
103
|
throw createError({
|
|
93
104
|
statusCode: 404,
|
|
94
|
-
statusMessage:
|
|
105
|
+
statusMessage: "File not found in commit or commit invalid",
|
|
106
|
+
message
|
|
95
107
|
});
|
|
96
108
|
}
|
|
97
109
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-diff.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/file-diff.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-diff.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/file-diff.get.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo,
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo, f as getPrdState } from '../../../../../../nitro/nitro.mjs';
|
|
2
2
|
import 'node:http';
|
|
3
3
|
import 'node:https';
|
|
4
4
|
import 'node:events';
|
|
@@ -34,7 +34,8 @@ const progress_get = defineEventHandler(async (event) => {
|
|
|
34
34
|
} catch (error) {
|
|
35
35
|
throw createError({
|
|
36
36
|
statusCode: 500,
|
|
37
|
-
statusMessage:
|
|
37
|
+
statusMessage: "Failed to read progress state",
|
|
38
|
+
message: error.message.replace(/\s+/g, " ").trim()
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.get.mjs","sources":["../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/progress.get.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,qBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,0BAAA,IAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,WAAA,CAAA,IAAA,CAAA,IAAA,OAAA,CAAA;AACA,IAAA,OAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,aAAA,IAAA,GAAA,EAAA,GAAA,IAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA
|
|
1
|
+
{"version":3,"file":"progress.get.mjs","sources":["../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/progress.get.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,qBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,0BAAA,IAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,WAAA,CAAA,IAAA,CAAA,IAAA,OAAA,CAAA;AACA,IAAA,OAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,aAAA,IAAA,GAAA,EAAA,GAAA,IAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,+BAAA;AAAA,MACA,SAAA,KAAA,CAAA,OAAA,CAAA,QAAA,MAAA,EAAA,GAAA,EAAA,IAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
|
package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo,
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo, f as getPrdState, e as discoverGitRepos, s as saveRepos } from '../../../../../../../../nitro/nitro.mjs';
|
|
2
2
|
import { r as resolveCommitRepo } from '../../../../../../../../_/git.mjs';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
import 'node:https';
|
|
@@ -38,7 +38,8 @@ const commits_get = defineEventHandler(async (event) => {
|
|
|
38
38
|
} catch (error) {
|
|
39
39
|
throw createError({
|
|
40
40
|
statusCode: 500,
|
|
41
|
-
statusMessage:
|
|
41
|
+
statusMessage: "Failed to read progress state",
|
|
42
|
+
message: error.message.replace(/\s+/g, " ").trim()
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
45
|
if (!progress) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks/[taskId]/commits.get.ts"],"names":["repos"],"mappings":";;;;;;;;;;;;;AAcA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,0BAAA,IAAA,CAAA;AAEA,EAAA,IAAA,QAAA,GAAA,IAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,WAAA,CAAA,IAAA,CAAA,IAAA,OAAA,CAAA;AACA,IAAA,QAAA,GAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,aAAA,IAAA,GAAA,EAAA,GAAA,IAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA
|
|
1
|
+
{"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks/[taskId]/commits.get.ts"],"names":["repos"],"mappings":";;;;;;;;;;;;;AAcA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,0BAAA,IAAA,CAAA;AAEA,EAAA,IAAA,QAAA,GAAA,IAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,WAAA,CAAA,IAAA,CAAA,IAAA,OAAA,CAAA;AACA,IAAA,QAAA,GAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,aAAA,IAAA,GAAA,EAAA,GAAA,IAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,+BAAA;AAAA,MACA,SAAA,KAAA,CAAA,OAAA,CAAA,QAAA,MAAA,EAAA,GAAA,EAAA,IAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA,CAAA,QAAA,EAAA;AACA,IAAA,OAAA,EAAA;AAAA,EACA;AAGA,EAAA,MAAA,QAAA,GAAA,MAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,GAAA,QAAA,CAAA,WAAA,EAAA;AAGA,EAAA,MAAA,UAAA,QAAA,CAAA,IAAA,CAAA,CAAA,GAAA,KAAA,GAAA,CAAA,WAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,OAAA,EAAA;AAAA,EACA;AAGA,EAAA,IAAA,CAAA,OAAA,CAAA,OAAA,IAAA,OAAA,CAAA,OAAA,CAAA,WAAA,CAAA,EAAA;AACA,IAAA,OAAA,EAAA;AAAA,EACA;AAGA,EAAA,MAAA,kBAAA,EAAA;AACA,EAAA,MAAA,gBAAA,EAAA;AAGA,EAAA,KAAA,MAAA,WAAA,IAAA,QAAA,OAAA,EAAA;AACA,IAAA,IAAA;AACA,MAAA,MAAA,QAAA,GAAA,MAAA,iBAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AACA,MAAA,eAAA,CAAA,IAAA,CAAA;AAAA,QACA,KAAA,QAAA,CAAA,GAAA;AAAA,QACA,MAAA,QAAA,CAAA;AAAA,OACA,CAAA;AAAA,IACA,CAAA,CAAA,MAAA;AACA,MAAA,aAAA,CAAA,KAAA,WAAA,CAAA;AAAA,IACA;AAAA,EACA;AAGA,EAAA,IAAA,aAAA,CAAA,SAAA,CAAA,EAAA;AACA,IAAA,MAAA,WAAA,GAAA,MAAA,gBAAA,CAAA,IAAA,CAAA,IAAA,CAAA;AAGA,IAAA,MAAA,aAAA,GAAA,IAAA,GAAA,CAAA,CAAA,IAAA,CAAA,QAAA,IAAA,EAAA,EAAA,GAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,YAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAA,GAAA,YAAA,IAAA,CAAA,CAAA,EAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,EAAA,CAAA,YAAA,CAAA,CAAA;AAEA,IAAA,IAAA,WAAA,EAAA;AAEA,MAAA,MAAAA,MAAAA,GAAA,MAAA,QAAA,EAAA;AACA,MAAA,MAAA,YAAAA,MAAAA,CAAA,SAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AACA,MAAA,IAAA,cAAA,EAAA,EAAA;AACA,QAAA,MAAA,WAAA,GAAA;AAAA,UACA,GAAAA,OAAA,SAAA,CAAA;AAAA,UACA,QAAA,EAAA,WAAA,CAAA,MAAA,GAAA,CAAA,GAAA,WAAA,GAAA;AAAA,SACA;AACA,QAAAA,MAAAA,CAAA,SAAA,CAAA,GAAA,WAAA;AACA,QAAA,MAAA,UAAAA,MAAA,CAAA;AAGA,QAAA,KAAA,MAAA,eAAA,aAAA,EAAA;AACA,UAAA,IAAA;AACA,YAAA,MAAA,QAAA,GAAA,MAAA,iBAAA,CAAA,WAAA,EAAA,WAAA,CAAA;AACA,YAAA,eAAA,CAAA,IAAA,CAAA;AAAA,cACA,KAAA,QAAA,CAAA,GAAA;AAAA,cACA,MAAA,QAAA,CAAA;AAAA,aACA,CAAA;AAAA,UACA,CAAA,CAAA,MAAA;AAEA,YAAA,MAAA,GAAA,GAAA,OAAA,WAAA,KAAA,QAAA,GAAA,cAAA,WAAA,CAAA,GAAA;AACA,YAAA,eAAA,CAAA,IAAA,CAAA;AAAA,cACA,GAAA;AAAA,cACA,IAAA,EAAA;AAAA,aACA,CAAA;AAAA,UACA;AAAA,QACA;AAAA,MACA,CAAA,MAAA;AAEA,QAAA,KAAA,MAAA,eAAA,aAAA,EAAA;AACA,UAAA,MAAA,GAAA,GAAA,OAAA,WAAA,KAAA,QAAA,GAAA,cAAA,WAAA,CAAA,GAAA;AACA,UAAA,eAAA,CAAA,IAAA,CAAA;AAAA,YACA,GAAA;AAAA,YACA,IAAA,EAAA;AAAA,WACA,CAAA;AAAA,QACA;AAAA,MACA;AAAA,IACA,CAAA,MAAA;AAEA,MAAA,KAAA,MAAA,eAAA,aAAA,EAAA;AACA,QAAA,MAAA,GAAA,GAAA,OAAA,WAAA,KAAA,QAAA,GAAA,cAAA,WAAA,CAAA,GAAA;AACA,QAAA,eAAA,CAAA,IAAA,CAAA;AAAA,UACA,GAAA;AAAA,UACA,IAAA,EAAA;AAAA,SACA,CAAA;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAEA,EAAA,OAAA,eAAA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo,
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo, f as getPrdState } from '../../../../../../nitro/nitro.mjs';
|
|
2
2
|
import 'node:http';
|
|
3
3
|
import 'node:https';
|
|
4
4
|
import 'node:events';
|
|
@@ -34,7 +34,8 @@ const tasks_get = defineEventHandler(async (event) => {
|
|
|
34
34
|
} catch (error) {
|
|
35
35
|
throw createError({
|
|
36
36
|
statusCode: 500,
|
|
37
|
-
statusMessage:
|
|
37
|
+
statusMessage: "Failed to read task state",
|
|
38
|
+
message: error.message.replace(/\s+/g, " ").trim()
|
|
38
39
|
});
|
|
39
40
|
}
|
|
40
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.get.mjs","sources":["../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks.get.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,kBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,0BAAA,IAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,WAAA,CAAA,IAAA,CAAA,IAAA,OAAA,CAAA;AACA,IAAA,OAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,UAAA,IAAA,GAAA,EAAA,GAAA,IAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"tasks.get.mjs","sources":["../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks.get.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,kBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,KAAA,GAAA,MAAA,QAAA,EAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,OAAA,MAAA,CAAA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,0BAAA,IAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,WAAA,CAAA,IAAA,CAAA,IAAA,OAAA,CAAA;AACA,IAAA,OAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,UAAA,IAAA,GAAA,EAAA,GAAA,IAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,2BAAA;AAAA,MACA,SAAA,KAAA,CAAA,OAAA,CAAA,QAAA,MAAA,EAAA,GAAA,EAAA,IAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos,
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, e as discoverGitRepos, s as saveRepos } from '../../../../nitro/nitro.mjs';
|
|
2
2
|
import 'node:http';
|
|
3
3
|
import 'node:https';
|
|
4
4
|
import 'node:events';
|
package/dist/host/src/ui.js
CHANGED
|
@@ -42,23 +42,60 @@ export async function runUi(options) {
|
|
|
42
42
|
env
|
|
43
43
|
});
|
|
44
44
|
return await new Promise((resolveExit, reject) => {
|
|
45
|
+
const signalGracePeriodMs = 2000;
|
|
46
|
+
let forceKillTimer = null;
|
|
47
|
+
let signalCount = 0;
|
|
48
|
+
let childExited = false;
|
|
49
|
+
const clearForceKillTimer = () => {
|
|
50
|
+
if (forceKillTimer) {
|
|
51
|
+
clearTimeout(forceKillTimer);
|
|
52
|
+
forceKillTimer = null;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const cleanup = () => {
|
|
56
|
+
process.off('SIGINT', forwardSignal);
|
|
57
|
+
process.off('SIGTERM', forwardSignal);
|
|
58
|
+
clearForceKillTimer();
|
|
59
|
+
};
|
|
60
|
+
const forceKill = () => {
|
|
61
|
+
if (!childExited && child.exitCode === null && child.signalCode === null) {
|
|
62
|
+
child.kill('SIGKILL');
|
|
63
|
+
}
|
|
64
|
+
};
|
|
45
65
|
const forwardSignal = (signal) => {
|
|
46
|
-
if (
|
|
66
|
+
if (childExited) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
signalCount += 1;
|
|
70
|
+
if (signalCount > 1) {
|
|
71
|
+
forceKill();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
47
75
|
child.kill(signal);
|
|
48
76
|
}
|
|
77
|
+
clearForceKillTimer();
|
|
78
|
+
forceKillTimer = setTimeout(forceKill, signalGracePeriodMs);
|
|
49
79
|
};
|
|
50
80
|
process.on('SIGINT', forwardSignal);
|
|
51
81
|
process.on('SIGTERM', forwardSignal);
|
|
52
82
|
child.on('error', (error) => {
|
|
53
|
-
|
|
54
|
-
process.off('SIGTERM', forwardSignal);
|
|
83
|
+
cleanup();
|
|
55
84
|
reject(error);
|
|
56
85
|
});
|
|
57
86
|
child.on('exit', (code, signal) => {
|
|
58
|
-
|
|
59
|
-
|
|
87
|
+
childExited = true;
|
|
88
|
+
cleanup();
|
|
60
89
|
if (signal) {
|
|
61
|
-
|
|
90
|
+
if (signal === 'SIGINT') {
|
|
91
|
+
resolveExit(130);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (signal === 'SIGTERM') {
|
|
95
|
+
resolveExit(143);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
resolveExit(1);
|
|
62
99
|
return;
|
|
63
100
|
}
|
|
64
101
|
resolveExit(code ?? 0);
|
|
@@ -174,7 +174,7 @@ async function isGitRepo(dirPath) {
|
|
|
174
174
|
try {
|
|
175
175
|
const gitPath = join(dirPath, '.git');
|
|
176
176
|
const stats = await fs.stat(gitPath);
|
|
177
|
-
return stats.isDirectory();
|
|
177
|
+
return stats.isDirectory() || stats.isFile();
|
|
178
178
|
}
|
|
179
179
|
catch {
|
|
180
180
|
return false;
|
|
@@ -188,7 +188,7 @@ async function isGitRepo(dirPath) {
|
|
|
188
188
|
* @param maxDepth - Maximum depth to scan (default: 2)
|
|
189
189
|
* @returns Array of discovered git repository info
|
|
190
190
|
*/
|
|
191
|
-
export async function discoverGitRepos(basePath, maxDepth =
|
|
191
|
+
export async function discoverGitRepos(basePath, maxDepth = 4) {
|
|
192
192
|
const resolvedBase = resolve(basePath);
|
|
193
193
|
// If basePath itself is a git repo, return empty (standard repo case)
|
|
194
194
|
if (await isGitRepo(resolvedBase)) {
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"id":"7bb8c982-dc40-47ba-9dfb-5efd6fd086ac","timestamp":1771764393983,"prerendered":[]}
|