@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.
Files changed (45) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{DZSVDCT3.js → B3hkJjmY.js} +1 -1
  3. package/.output/public/_nuxt/{BklAyl7e.js → BNzFoVmP.js} +1 -1
  4. package/.output/public/_nuxt/{Ck5q4LNZ.js → BRDbaJqY.js} +2 -2
  5. package/.output/public/_nuxt/{lAfn4NY4.js → Bo1Fdv48.js} +19 -19
  6. package/.output/public/_nuxt/{DIeYonPk.js → BqmZq_gb.js} +1 -1
  7. package/.output/public/_nuxt/{CxUtB6on.js → Bri1ZtcQ.js} +1 -1
  8. package/.output/public/_nuxt/{MKpq065x.js → CEJOILWG.js} +1 -1
  9. package/.output/public/_nuxt/{DuGNRgMW.js → CFsNy2aC.js} +1 -1
  10. package/.output/public/_nuxt/{BPnSj2YP.js → D0zW6lUK.js} +1 -1
  11. package/.output/public/_nuxt/DYDTtHLR.js +1 -0
  12. package/.output/public/_nuxt/{jgc2Z7xi.js → DhQtydpF.js} +2 -2
  13. package/.output/public/_nuxt/{C3Sxm8SF.js → X6fIXIFO.js} +1 -1
  14. package/.output/public/_nuxt/builds/latest.json +1 -1
  15. package/.output/public/_nuxt/builds/meta/6683a0d9-9c02-4098-b750-bbbc0305261e.json +1 -0
  16. package/.output/server/chunks/_/git-api.mjs +100 -0
  17. package/.output/server/chunks/_/git-api.mjs.map +1 -0
  18. package/.output/server/chunks/_/git.mjs +1 -1
  19. package/.output/server/chunks/build/{_prd_-JbQLT1IJ.mjs → _prd_-CnwhMRyf.mjs} +12 -9
  20. package/.output/server/chunks/build/_prd_-CnwhMRyf.mjs.map +1 -0
  21. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  22. package/.output/server/chunks/build/server.mjs +1 -1
  23. package/.output/server/chunks/nitro/nitro.mjs +618 -618
  24. package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs +41 -22
  25. package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs.map +1 -1
  26. package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs +27 -15
  27. package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs.map +1 -1
  28. package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs +42 -13
  29. package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs.map +1 -1
  30. package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs +29 -17
  31. package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs.map +1 -1
  32. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs +3 -2
  33. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs.map +1 -1
  34. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs +3 -2
  35. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs.map +1 -1
  36. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs +3 -2
  37. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs.map +1 -1
  38. package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs +1 -1
  39. package/.output/server/package.json +1 -1
  40. package/dist/host/src/ui.js +43 -6
  41. package/dist/server/utils/repos.js +2 -2
  42. package/package.json +1 -1
  43. package/.output/public/_nuxt/builds/meta/7bb8c982-dc40-47ba-9dfb-5efd6fd086ac.json +0 -1
  44. package/.output/public/_nuxt/tuYgPddM.js +0 -1
  45. 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
- let gitRepoPath = repo.path;
47
+ const repoLookup = await buildRepoLookup(repo);
48
+ let fixedGitRepoPath = null;
49
+ let fixedRepoPath = "";
47
50
  if (repoPath) {
48
- if (!repo.gitRepos || repo.gitRepos.length === 0) {
49
- throw createError({
50
- statusCode: 400,
51
- statusMessage: "repo parameter provided but no git repos discovered in this repository"
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: `repo "${repoPath}" is not a discovered git repo. Available: ${repo.gitRepos.map((gr) => gr.relativePath).join(", ")}`
58
+ statusMessage: "Invalid repo path",
59
+ message: normalizeErrorMessage(error.message)
59
60
  });
60
61
  }
61
- gitRepoPath = matchedRepo.absolutePath;
62
- }
63
- if (!await isGitRepo(gitRepoPath)) {
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
- const commit = await getCommitInfo(gitRepoPath, sha);
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: 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: `No valid commits found: ${errors.join("; ")}`
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":";;;;;;;;;;;;;AAIA,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;AAGA,EAAA,IAAA,cAAA,IAAA,CAAA,IAAA;AAEA,EAAA,IAAA,QAAA,EAAA;AAEA,IAAA,IAAA,CAAA,IAAA,CAAA,QAAA,IAAA,IAAA,CAAA,QAAA,CAAA,WAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,cAAA,IAAA,CAAA,QAAA,CAAA,KAAA,CAAA,EAAA,KAAA,EAAA,CAAA,iBAAA,QAAA,CAAA;AACA,IAAA,IAAA,CAAA,WAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,2CAAA,EAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,YAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,WAAA,GAAA,WAAA,CAAA,YAAA;AAAA,EACA;AAGA,EAAA,IAAA,CAAA,MAAA,SAAA,CAAA,WAAA,CAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAGA,EAAA,MAAA,UAAA,EAAA;AACA,EAAA,MAAA,SAAA,EAAA;AAEA,EAAA,KAAA,MAAA,OAAA,IAAA,EAAA;AACA,IAAA,IAAA;AACA,MAAA,MAAA,MAAA,GAAA,MAAA,aAAA,CAAA,WAAA,EAAA,GAAA,CAAA;AAEA,MAAA,OAAA,CAAA,IAAA,CAAA;AAAA,QACA,GAAA,MAAA;AAAA,QACA,UAAA,QAAA,IAAA;AAAA,OACA,CAAA;AAAA,IACA,SAAA,KAAA,EAAA;AACA,MAAA,MAAA,CAAA,KAAA,CAAA,EAAA,GAAA,CAAA,EAAA,EAAA,KAAA,CAAA,OAAA,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,CAAA,wBAAA,EAAA,MAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,OAAA,OAAA;AACA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/commits.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, 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
- if (!repo.gitRepos || repo.gitRepos.length === 0) {
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 parameter provided but no git repos discovered in this repository"
49
+ statusMessage: "Invalid repo path",
50
+ message: normalizeErrorMessage(error.message)
45
51
  });
46
52
  }
47
- const matchedRepo = repo.gitRepos.find((gr) => gr.relativePath === repoPath);
48
- if (!matchedRepo) {
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: `repo "${repoPath}" is not a discovered git repo. Available: ${repo.gitRepos.map((gr) => gr.relativePath).join(", ")}`
59
+ statusMessage: "Resolved path is not a git repository"
52
60
  });
53
61
  }
54
- gitRepoPath = matchedRepo.absolutePath;
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: `Commit not found or invalid: ${error.message}`
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":";;;;;;;;;;;;;AAIA,iBAAA,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,SAAA,KAAA,CAAA,MAAA;AACA,EAAA,MAAA,WAAA,KAAA,CAAA,IAAA;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;AAGA,EAAA,IAAA,cAAA,IAAA,CAAA,IAAA;AAEA,EAAA,IAAA,QAAA,EAAA;AAEA,IAAA,IAAA,CAAA,IAAA,CAAA,QAAA,IAAA,IAAA,CAAA,QAAA,CAAA,WAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,cAAA,IAAA,CAAA,QAAA,CAAA,KAAA,CAAA,EAAA,KAAA,EAAA,CAAA,iBAAA,QAAA,CAAA;AACA,IAAA,IAAA,CAAA,WAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,2CAAA,EAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,YAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,WAAA,GAAA,WAAA,CAAA,YAAA;AAAA,EACA;AAGA,EAAA,IAAA,CAAA,MAAA,SAAA,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,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,aAAA,CAAA,WAAA,EAAA,MAAA,CAAA;AACA,IAAA,OAAA,KAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,CAAA,6BAAA,EAAA,KAAA,CAAA,OAAA,CAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"diff.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/git/diff.get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAQA,iBAAA,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,SAAA,KAAA,CAAA,MAAA;AACA,EAAA,MAAA,WAAA,KAAA,CAAA,IAAA;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,UAAA,GAAA,MAAA,eAAA,CAAA,IAAA,CAAA;AAEA,EAAA,IAAA,cAAA,IAAA,CAAA,IAAA;AACA,EAAA,IAAA,QAAA,EAAA;AACA,IAAA,IAAA;AACA,MAAA,MAAA,QAAA,GAAA,MAAA,2BAAA,CAAA,UAAA,EAAA,QAAA,CAAA;AACA,MAAA,WAAA,GAAA,QAAA,CAAA,WAAA;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;AAEA,EAAA,IAAA,CAAA,MAAA,SAAA,CAAA,WAAA,CAAA,EAAA;AACA,IAAA,MAAA,QAAA,GAAA,MAAA,iBAAA,CAAA,UAAA,EAAA,MAAA,CAAA,CAAA,KAAA,CAAA,MAAA,IAAA,CAAA;AACA,IAAA,IAAA,CAAA,QAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AACA,IAAA,WAAA,GAAA,QAAA,CAAA,YAAA;AAAA,EACA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,MAAA,aAAA,CAAA,WAAA,EAAA,MAAA,CAAA;AACA,IAAA,OAAA,KAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,OAAA,GAAA,qBAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AAEA,IAAA,MAAA,QAAA,GAAA,MAAA,iBAAA,CAAA,UAAA,EAAA,MAAA,CAAA,CAAA,KAAA,CAAA,MAAA,IAAA,CAAA;AACA,IAAA,IAAA,QAAA,IAAA,QAAA,CAAA,YAAA,KAAA,WAAA,EAAA;AACA,MAAA,IAAA;AACA,QAAA,OAAA,MAAA,aAAA,CAAA,QAAA,CAAA,YAAA,EAAA,MAAA,CAAA;AAAA,MACA,CAAA,CAAA,MAAA;AAAA,MAEA;AAAA,IACA;AAEA,IAAA,MAAA,eAAA,GAAA,OAAA,CAAA,UAAA,CAAA,oBAAA,CAAA;AAEA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,kBAAA,GAAA,GAAA,GAAA;AAAA,MACA,aAAA,EAAA,kBAAA,oBAAA,GAAA,6BAAA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
@@ -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
- if (!repo.gitRepos || repo.gitRepos.length === 0) {
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
- message: "repo parameter provided but no git repos discovered in this repository"
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
- throw createError({ statusCode: 400, message: "Not a git repository" });
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
- message: error instanceof Error ? error.message : "Failed to get file content"
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":";;;;;;;;;;;;;AAGA,wBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,KAAA,GAAA,SAAA,KAAA,CAAA;AACA,EAAA,MAAA,SAAA,KAAA,CAAA,MAAA;AACA,EAAA,MAAA,OAAA,KAAA,CAAA,IAAA;AACA,EAAA,MAAA,WAAA,KAAA,CAAA,IAAA;AAEA,EAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,YAAA,EAAA,UAAA,EAAA,GAAA,EAAA,OAAA,EAAA,6BAAA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,YAAA,EAAA,UAAA,EAAA,GAAA,EAAA,OAAA,EAAA,0BAAA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,YAAA,EAAA,UAAA,EAAA,GAAA,EAAA,OAAA,EAAA,yBAAA,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,YAAA,EAAA,UAAA,EAAA,GAAA,EAAA,OAAA,EAAA,wBAAA,CAAA;AAAA,EACA;AAGA,EAAA,IAAA,cAAA,IAAA,CAAA,IAAA;AAEA,EAAA,IAAA,QAAA,EAAA;AAEA,IAAA,IAAA,CAAA,IAAA,CAAA,QAAA,IAAA,IAAA,CAAA,QAAA,CAAA,WAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,cAAA,IAAA,CAAA,QAAA,CAAA,KAAA,CAAA,EAAA,KAAA,EAAA,CAAA,iBAAA,QAAA,CAAA;AACA,IAAA,IAAA,CAAA,WAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,2CAAA,EAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,YAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,WAAA,GAAA,WAAA,CAAA,YAAA;AAAA,EACA;AAEA,EAAA,IAAA,CAAA,MAAA,SAAA,CAAA,WAAA,CAAA,EAAA;AACA,IAAA,MAAA,YAAA,EAAA,UAAA,EAAA,GAAA,EAAA,OAAA,EAAA,wBAAA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,OAAA,GAAA,MAAA,cAAA,CAAA,WAAA,EAAA,QAAA,IAAA,CAAA;AACA,IAAA,OAAA,EAAA,OAAA,EAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,OAAA,EAAA,KAAA,YAAA,KAAA,GAAA,KAAA,CAAA,OAAA,GAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
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
- if (!repo.gitRepos || repo.gitRepos.length === 0) {
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 parameter provided but no git repos discovered in this repository"
56
+ statusMessage: "Invalid repo path",
57
+ message: normalizeErrorMessage(error.message)
52
58
  });
53
59
  }
54
- const matchedRepo = repo.gitRepos.find((gr) => gr.relativePath === repoPath);
55
- if (!matchedRepo) {
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: `repo "${repoPath}" is not a discovered git repo. Available: ${repo.gitRepos.map((gr) => gr.relativePath).join(", ")}`
66
+ statusMessage: "Resolved path is not a git repository"
59
67
  });
60
68
  }
61
- gitRepoPath = matchedRepo.absolutePath;
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: message
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: message
99
+ statusMessage: "Invalid file path",
100
+ message
90
101
  });
91
102
  }
92
103
  throw createError({
93
104
  statusCode: 404,
94
- statusMessage: `File not found in commit or commit invalid: ${message}`
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":"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"}
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, e as getPrdState } from '../../../../../../nitro/nitro.mjs';
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: `Failed to read progress state: ${error.message}`
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,CAAA,+BAAA,EAAA,KAAA,CAAA,OAAA,CAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
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;;;;"}
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, a as getRouterParam, c as createError, b as getRepos, m as migrateLegacyStateForRepo, e as getPrdState, f as discoverGitRepos, s as saveRepos } from '../../../../../../../../nitro/nitro.mjs';
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: `Failed to read progress state: ${error.message}`
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":"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"}
1
+ {"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks/[taskId]/commits.get.ts"],"names":["repos"],"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, e as getPrdState } from '../../../../../../nitro/nitro.mjs';
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: `Failed to read task state: ${error.message}`
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,CAAA,2BAAA,EAAA,KAAA,CAAA,OAAA,CAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
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, f as discoverGitRepos, s as saveRepos } from '../../../../nitro/nitro.mjs';
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';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thxgg/steward-prod",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
@@ -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 (!child.killed) {
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
- process.off('SIGINT', forwardSignal);
54
- process.off('SIGTERM', forwardSignal);
83
+ cleanup();
55
84
  reject(error);
56
85
  });
57
86
  child.on('exit', (code, signal) => {
58
- process.off('SIGINT', forwardSignal);
59
- process.off('SIGTERM', forwardSignal);
87
+ childExited = true;
88
+ cleanup();
60
89
  if (signal) {
61
- process.kill(process.pid, signal);
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 = 2) {
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@thxgg/steward",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Local-first PRD workflow steward with codemode MCP and web UI.",
5
5
  "type": "module",
6
6
  "author": "thxgg",
@@ -1 +0,0 @@
1
- {"id":"7bb8c982-dc40-47ba-9dfb-5efd6fd086ac","timestamp":1771764393983,"prerendered":[]}