@thxgg/steward 0.1.6 → 0.1.10

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 (55) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{lAfn4NY4.js → BPaqwWyl.js} +19 -19
  3. package/.output/public/_nuxt/{jgc2Z7xi.js → C8LtDyY4.js} +2 -2
  4. package/.output/public/_nuxt/{BPnSj2YP.js → CQgu_W_k.js} +1 -1
  5. package/.output/public/_nuxt/{Ck5q4LNZ.js → CZKCADv6.js} +2 -2
  6. package/.output/public/_nuxt/{MKpq065x.js → CeO4HNxC.js} +1 -1
  7. package/.output/public/_nuxt/{BklAyl7e.js → Cs5ptsBk.js} +1 -1
  8. package/.output/public/_nuxt/{DuGNRgMW.js → CshyynD6.js} +1 -1
  9. package/.output/public/_nuxt/CzKPXRws.js +1 -0
  10. package/.output/public/_nuxt/{DIeYonPk.js → DOvbLsAq.js} +1 -1
  11. package/.output/public/_nuxt/{CxUtB6on.js → DbloiS5Y.js} +1 -1
  12. package/.output/public/_nuxt/{DZSVDCT3.js → DcRwFvvS.js} +1 -1
  13. package/.output/public/_nuxt/builds/latest.json +1 -1
  14. package/.output/public/_nuxt/builds/meta/7fda7510-94bc-443a-a338-a8d2af142ed9.json +1 -0
  15. package/.output/public/_nuxt/{C3Sxm8SF.js → vr7VLA9A.js} +1 -1
  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_-CkKfJB6U.mjs} +13 -10
  20. package/.output/server/chunks/build/_prd_-CkKfJB6U.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 +585 -585
  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/README.md +22 -4
  41. package/dist/host/src/api/git.js +1 -8
  42. package/dist/host/src/api/prds.js +2 -8
  43. package/dist/host/src/api/repo-context.js +60 -0
  44. package/dist/host/src/api/repos.js +6 -0
  45. package/dist/host/src/api/state.js +20 -21
  46. package/dist/host/src/executor.js +215 -29
  47. package/dist/host/src/help.js +124 -0
  48. package/dist/host/src/mcp.js +49 -25
  49. package/dist/host/src/ui.js +43 -6
  50. package/dist/server/utils/repos.js +2 -2
  51. package/docs/MCP.md +50 -3
  52. package/package.json +1 -1
  53. package/.output/public/_nuxt/builds/meta/7bb8c982-dc40-47ba-9dfb-5efd6fd086ac.json +0 -1
  54. package/.output/public/_nuxt/tuYgPddM.js +0 -1
  55. 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":"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"}
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":"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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
- 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.10",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/README.md CHANGED
@@ -77,9 +77,7 @@ prd mcp
77
77
  Steward exposes one MCP tool: `execute`.
78
78
 
79
79
  ```js
80
- const reposList = await repos.list()
81
- const repo = reposList[0]
82
- if (!repo) return { error: 'No repos configured' }
80
+ const repo = await repos.current()
83
81
 
84
82
  const prdList = await prds.list(repo.id)
85
83
  if (prdList.length === 0) return { repo: repo.name, prds: 0 }
@@ -92,6 +90,26 @@ return {
92
90
  }
93
91
  ```
94
92
 
93
+ Every call returns a structured envelope:
94
+
95
+ ```json
96
+ {
97
+ "ok": true,
98
+ "result": {},
99
+ "logs": [],
100
+ "error": null,
101
+ "meta": {
102
+ "timeoutMs": 30000,
103
+ "durationMs": 10,
104
+ "truncatedResult": false,
105
+ "truncatedLogs": false,
106
+ "resultWasUndefined": false
107
+ }
108
+ }
109
+ ```
110
+
111
+ Use `steward.help()` inside `execute` for runtime API signatures and examples.
112
+
95
113
  ## APIs
96
114
 
97
115
  Inside `execute`, these APIs are available:
@@ -99,7 +117,7 @@ Inside `execute`, these APIs are available:
99
117
  - `repos` - register/list/remove repos and refresh discovered git repos
100
118
  - `prds` - list/read PRD docs, tasks, progress, and task commit refs
101
119
  - `git` - commit metadata, diffs, file diffs, and file contents
102
- - `state` - direct PRD state get/upsert by repo id or path
120
+ - `state` - direct PRD state get/upsert by repo id, path, or current repo
103
121
 
104
122
  Detailed API docs and examples: `docs/MCP.md`
105
123
 
@@ -1,12 +1,5 @@
1
1
  import { getCommitDiff, getCommitInfo, getFileContent, getFileDiff, isGitRepo, validatePathInRepo } from '../../../server/utils/git.js';
2
- import { getRepoById } from '../../../server/utils/repos.js';
3
- async function requireRepo(repoId) {
4
- const repo = await getRepoById(repoId);
5
- if (!repo) {
6
- throw new Error('Repository not found');
7
- }
8
- return repo;
9
- }
2
+ import { requireRepo } from './repo-context.js';
10
3
  function resolveGitRepoPath(repo, repoPath) {
11
4
  if (!repoPath) {
12
5
  return repo.path;
@@ -1,8 +1,9 @@
1
1
  import { promises as fs } from 'node:fs';
2
2
  import { basename, join } from 'node:path';
3
3
  import { resolveCommitRepo } from '../../../server/utils/git.js';
4
- import { discoverGitRepos, getRepoById, getRepos, saveRepos } from '../../../server/utils/repos.js';
4
+ import { discoverGitRepos, getRepos, saveRepos } from '../../../server/utils/repos.js';
5
5
  import { getPrdState, getPrdStateSummaries, migrateLegacyStateForRepo } from '../../../server/utils/prd-state.js';
6
+ import { requireRepo } from './repo-context.js';
6
7
  function parseMetadata(content) {
7
8
  const metadata = {};
8
9
  const authorMatch = content.match(/\*{0,2}Author\*{0,2}:\*{0,2}\s*(.+?)(?:\n|$)/i);
@@ -30,13 +31,6 @@ function parseMetadata(content) {
30
31
  }
31
32
  return metadata;
32
33
  }
33
- async function requireRepo(repoId) {
34
- const repo = await getRepoById(repoId);
35
- if (!repo) {
36
- throw new Error('Repository not found');
37
- }
38
- return repo;
39
- }
40
34
  async function readPrdFile(repo, prdSlug) {
41
35
  const prdPath = join(repo.path, 'docs', 'prd', `${prdSlug}.md`);
42
36
  try {