@iloom/cli 0.1.17 → 0.1.19

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 (118) hide show
  1. package/README.md +51 -6
  2. package/dist/ClaudeContextManager-JKR4WGNU.js +13 -0
  3. package/dist/ClaudeService-55DQGB7T.js +12 -0
  4. package/dist/{GitHubService-F7Z3XJOS.js → GitHubService-LWP4GKGH.js} +3 -3
  5. package/dist/{LoomLauncher-MODG2SEM.js → LoomLauncher-UMMLPIZO.js} +7 -7
  6. package/dist/{PromptTemplateManager-7FINLRDE.js → PromptTemplateManager-WII75TKH.js} +2 -2
  7. package/dist/README.md +755 -0
  8. package/dist/{SettingsManager-VAZF26S2.js → SettingsManager-SKLUVE3K.js} +6 -2
  9. package/dist/{add-issue-22JBNOML.js → add-issue-X56V3XPB.js} +23 -8
  10. package/dist/add-issue-X56V3XPB.js.map +1 -0
  11. package/dist/{chunk-Y7SAGNUT.js → chunk-DEPYQRRB.js} +2 -2
  12. package/dist/{chunk-WKEWRSDB.js → chunk-ELFT36PV.js} +3 -3
  13. package/dist/chunk-FXV24OYZ.js +83 -0
  14. package/dist/chunk-FXV24OYZ.js.map +1 -0
  15. package/dist/{chunk-HPJJSYNS.js → chunk-H5LDRGVK.js} +6 -8
  16. package/dist/{chunk-HPJJSYNS.js.map → chunk-H5LDRGVK.js.map} +1 -1
  17. package/dist/{chunk-QEPVTTHD.js → chunk-IO4WFTL2.js} +17 -11
  18. package/dist/chunk-IO4WFTL2.js.map +1 -0
  19. package/dist/{chunk-KQDEK2ZW.js → chunk-JXQXSC45.js} +41 -9
  20. package/dist/chunk-JXQXSC45.js.map +1 -0
  21. package/dist/{chunk-JQ7VOSTC.js → chunk-KOCQAD2E.js} +3 -3
  22. package/dist/{chunk-YYSKGAZT.js → chunk-LAPY6NAE.js} +17 -8
  23. package/dist/chunk-LAPY6NAE.js.map +1 -0
  24. package/dist/{chunk-O2QWO64Z.js → chunk-PV3GAXQO.js} +56 -3
  25. package/dist/chunk-PV3GAXQO.js.map +1 -0
  26. package/dist/chunk-PVAVNJKS.js +188 -0
  27. package/dist/chunk-PVAVNJKS.js.map +1 -0
  28. package/dist/{chunk-CP2NU2JC.js → chunk-Q2KYPAH2.js} +7 -7
  29. package/dist/{chunk-CP2NU2JC.js.map → chunk-Q2KYPAH2.js.map} +1 -1
  30. package/dist/{chunk-W3DQTW63.js → chunk-USVVV3FP.js} +4 -4
  31. package/dist/{chunk-SSR5AVRJ.js → chunk-VCMMAFXQ.js} +21 -8
  32. package/dist/chunk-VCMMAFXQ.js.map +1 -0
  33. package/dist/chunk-VVH3ANF2.js +307 -0
  34. package/dist/chunk-VVH3ANF2.js.map +1 -0
  35. package/dist/{chunk-JBH2ZYYZ.js → chunk-VYQLLHZ7.js} +22 -3
  36. package/dist/chunk-VYQLLHZ7.js.map +1 -0
  37. package/dist/{chunk-SJUQ2NDR.js → chunk-ZMNQBJUI.js} +24 -19
  38. package/dist/chunk-ZMNQBJUI.js.map +1 -0
  39. package/dist/{chunk-T7QPXANZ.js → chunk-ZWXJBSUW.js} +17 -17
  40. package/dist/chunk-ZWXJBSUW.js.map +1 -0
  41. package/dist/{cleanup-3LUWPSM7.js → cleanup-ZHROIBSQ.js} +12 -16
  42. package/dist/cleanup-ZHROIBSQ.js.map +1 -0
  43. package/dist/cli.js +107 -49
  44. package/dist/cli.js.map +1 -1
  45. package/dist/contribute-3MQJ3XAQ.js +256 -0
  46. package/dist/contribute-3MQJ3XAQ.js.map +1 -0
  47. package/dist/{enhance-XJIQHVPD.js → enhance-VGWUX474.js} +18 -8
  48. package/dist/enhance-VGWUX474.js.map +1 -0
  49. package/dist/{feedback-23CLXKFT.js → feedback-ZOUCCHN4.js} +8 -8
  50. package/dist/{finish-3CQZIULO.js → finish-QJSK6Z7J.js} +36 -313
  51. package/dist/finish-QJSK6Z7J.js.map +1 -0
  52. package/dist/{git-LVRZ57GJ.js → git-OUYMVYJX.js} +2 -2
  53. package/dist/{ignite-WXEF2ID5.js → ignite-HICLZEYU.js} +124 -9
  54. package/dist/ignite-HICLZEYU.js.map +1 -0
  55. package/dist/index.d.ts +794 -712
  56. package/dist/index.js +169 -36
  57. package/dist/index.js.map +1 -1
  58. package/dist/init-UMKNHNV5.js +339 -0
  59. package/dist/init-UMKNHNV5.js.map +1 -0
  60. package/dist/mcp/github-comment-server.js +12 -9
  61. package/dist/mcp/github-comment-server.js.map +1 -1
  62. package/dist/neon-helpers-ZVIRPKCI.js +10 -0
  63. package/dist/{open-X6BTENPV.js → open-ETZUFSE4.js} +15 -17
  64. package/dist/{open-X6BTENPV.js.map → open-ETZUFSE4.js.map} +1 -1
  65. package/dist/prompts/init-prompt.txt +748 -0
  66. package/dist/prompts/issue-prompt.txt +141 -9
  67. package/dist/rebase-KBWFDZCN.js +95 -0
  68. package/dist/rebase-KBWFDZCN.js.map +1 -0
  69. package/dist/remote-GJEZWRCC.js +14 -0
  70. package/dist/{run-2JCPQAX3.js → run-4SVQ3WEU.js} +15 -17
  71. package/dist/{run-2JCPQAX3.js.map → run-4SVQ3WEU.js.map} +1 -1
  72. package/dist/schema/settings.schema.json +51 -1
  73. package/dist/{start-LWVRBJ6S.js → start-CT2ZEFP2.js} +54 -53
  74. package/dist/{start-LWVRBJ6S.js.map → start-CT2ZEFP2.js.map} +1 -1
  75. package/dist/{test-git-XPF4SZXJ.js → test-git-MKZATGZN.js} +3 -3
  76. package/dist/{test-prefix-XGFXFAYN.js → test-prefix-ZNLWDI3K.js} +3 -3
  77. package/dist/{update-DN3FSNKY.js → update-4TDDUR5K.js} +10 -4
  78. package/dist/{update-DN3FSNKY.js.map → update-4TDDUR5K.js.map} +1 -1
  79. package/package.json +3 -2
  80. package/dist/ClaudeContextManager-XOSXQ67R.js +0 -13
  81. package/dist/ClaudeService-YSZ6EXWP.js +0 -12
  82. package/dist/NeonProvider-PAGPUH7F.js +0 -12
  83. package/dist/add-issue-22JBNOML.js.map +0 -1
  84. package/dist/chunk-37DYYFVK.js +0 -29
  85. package/dist/chunk-37DYYFVK.js.map +0 -1
  86. package/dist/chunk-F3XBU2R7.js +0 -110
  87. package/dist/chunk-F3XBU2R7.js.map +0 -1
  88. package/dist/chunk-JBH2ZYYZ.js.map +0 -1
  89. package/dist/chunk-KQDEK2ZW.js.map +0 -1
  90. package/dist/chunk-O2QWO64Z.js.map +0 -1
  91. package/dist/chunk-QEPVTTHD.js.map +0 -1
  92. package/dist/chunk-SJUQ2NDR.js.map +0 -1
  93. package/dist/chunk-SSR5AVRJ.js.map +0 -1
  94. package/dist/chunk-T7QPXANZ.js.map +0 -1
  95. package/dist/chunk-YYSKGAZT.js.map +0 -1
  96. package/dist/cleanup-3LUWPSM7.js.map +0 -1
  97. package/dist/enhance-XJIQHVPD.js.map +0 -1
  98. package/dist/env-MDFL4ZXL.js +0 -23
  99. package/dist/finish-3CQZIULO.js.map +0 -1
  100. package/dist/ignite-WXEF2ID5.js.map +0 -1
  101. package/dist/init-RHACUR4E.js +0 -123
  102. package/dist/init-RHACUR4E.js.map +0 -1
  103. /package/dist/{ClaudeContextManager-XOSXQ67R.js.map → ClaudeContextManager-JKR4WGNU.js.map} +0 -0
  104. /package/dist/{ClaudeService-YSZ6EXWP.js.map → ClaudeService-55DQGB7T.js.map} +0 -0
  105. /package/dist/{GitHubService-F7Z3XJOS.js.map → GitHubService-LWP4GKGH.js.map} +0 -0
  106. /package/dist/{LoomLauncher-MODG2SEM.js.map → LoomLauncher-UMMLPIZO.js.map} +0 -0
  107. /package/dist/{NeonProvider-PAGPUH7F.js.map → PromptTemplateManager-WII75TKH.js.map} +0 -0
  108. /package/dist/{PromptTemplateManager-7FINLRDE.js.map → SettingsManager-SKLUVE3K.js.map} +0 -0
  109. /package/dist/{chunk-Y7SAGNUT.js.map → chunk-DEPYQRRB.js.map} +0 -0
  110. /package/dist/{chunk-WKEWRSDB.js.map → chunk-ELFT36PV.js.map} +0 -0
  111. /package/dist/{chunk-JQ7VOSTC.js.map → chunk-KOCQAD2E.js.map} +0 -0
  112. /package/dist/{chunk-W3DQTW63.js.map → chunk-USVVV3FP.js.map} +0 -0
  113. /package/dist/{feedback-23CLXKFT.js.map → feedback-ZOUCCHN4.js.map} +0 -0
  114. /package/dist/{SettingsManager-VAZF26S2.js.map → git-OUYMVYJX.js.map} +0 -0
  115. /package/dist/{env-MDFL4ZXL.js.map → neon-helpers-ZVIRPKCI.js.map} +0 -0
  116. /package/dist/{git-LVRZ57GJ.js.map → remote-GJEZWRCC.js.map} +0 -0
  117. /package/dist/{test-git-XPF4SZXJ.js.map → test-git-MKZATGZN.js.map} +0 -0
  118. /package/dist/{test-prefix-XGFXFAYN.js.map → test-prefix-ZNLWDI3K.js.map} +0 -0
package/dist/index.js CHANGED
@@ -147,7 +147,9 @@ var SettingsManager_exports = {};
147
147
  __export(SettingsManager_exports, {
148
148
  AgentSettingsSchema: () => AgentSettingsSchema,
149
149
  CapabilitiesSettingsSchema: () => CapabilitiesSettingsSchema,
150
+ DatabaseProvidersSettingsSchema: () => DatabaseProvidersSettingsSchema,
150
151
  IloomSettingsSchema: () => IloomSettingsSchema,
152
+ NeonSettingsSchema: () => NeonSettingsSchema,
151
153
  SettingsManager: () => SettingsManager,
152
154
  WorkflowPermissionSchema: () => WorkflowPermissionSchema,
153
155
  WorkflowsSettingsSchema: () => WorkflowsSettingsSchema
@@ -156,7 +158,7 @@ import { readFile } from "fs/promises";
156
158
  import path from "path";
157
159
  import { z } from "zod";
158
160
  import deepmerge from "deepmerge";
159
- var AgentSettingsSchema, WorkflowPermissionSchema, WorkflowsSettingsSchema, CapabilitiesSettingsSchema, IloomSettingsSchema, SettingsManager;
161
+ var AgentSettingsSchema, WorkflowPermissionSchema, WorkflowsSettingsSchema, CapabilitiesSettingsSchema, NeonSettingsSchema, DatabaseProvidersSettingsSchema, IloomSettingsSchema, SettingsManager;
160
162
  var init_SettingsManager = __esm({
161
163
  "src/lib/SettingsManager.ts"() {
162
164
  "use strict";
@@ -186,6 +188,15 @@ var init_SettingsManager = __esm({
186
188
  databaseUrlEnvVarName: z.string().min(1, "Database URL variable name cannot be empty").regex(/^[A-Z_][A-Z0-9_]*$/, "Must be valid env var name (uppercase, underscores)").optional().default("DATABASE_URL").describe("Name of environment variable for database connection URL")
187
189
  }).optional()
188
190
  }).optional();
191
+ NeonSettingsSchema = z.object({
192
+ projectId: z.string().min(1).regex(/^[a-zA-Z0-9-]+$/, "Neon project ID must contain only letters, numbers, and hyphens").describe('Neon project ID found in your project URL (e.g., "fantastic-fox-3566354")'),
193
+ parentBranch: z.string().min(1).describe("Branch from which new database branches are created")
194
+ });
195
+ DatabaseProvidersSettingsSchema = z.object({
196
+ neon: NeonSettingsSchema.optional().describe(
197
+ "Neon database configuration. Requires Neon CLI installed and authenticated for database branching."
198
+ )
199
+ }).optional();
189
200
  IloomSettingsSchema = z.object({
190
201
  mainBranch: z.string().min(1, "Settings 'mainBranch' cannot be empty").optional().describe("Name of the main/primary branch for the repository"),
191
202
  worktreePrefix: z.string().optional().refine(
@@ -211,8 +222,16 @@ var init_SettingsManager = __esm({
211
222
  ),
212
223
  protectedBranches: z.array(z.string().min(1, "Protected branch name cannot be empty")).optional().describe('List of branches that cannot be deleted (defaults to [mainBranch, "main", "master", "develop"])'),
213
224
  workflows: WorkflowsSettingsSchema.describe("Per-workflow-type permission configurations"),
214
- agents: z.record(z.string(), AgentSettingsSchema).optional().nullable().describe("Per-agent configuration overrides"),
215
- capabilities: CapabilitiesSettingsSchema.describe("Project capability configurations")
225
+ agents: z.record(z.string(), AgentSettingsSchema).optional().nullable().describe(
226
+ "Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-issue-reviewer (reviews code changes against requirements)"
227
+ ),
228
+ capabilities: CapabilitiesSettingsSchema.describe("Project capability configurations"),
229
+ databaseProviders: DatabaseProvidersSettingsSchema.describe("Database provider configurations"),
230
+ issueManagement: z.object({
231
+ github: z.object({
232
+ remote: z.string().min(1, "Remote name cannot be empty").describe("Git remote name to use for GitHub operations")
233
+ }).optional()
234
+ }).optional().describe("Issue management configuration")
216
235
  });
217
236
  SettingsManager = class {
218
237
  /**
@@ -1445,14 +1464,15 @@ var GitWorktreeManager = class {
1445
1464
  }
1446
1465
  /**
1447
1466
  * Check if a worktree is the main repository worktree
1448
- * The main worktree is the first one listed by git worktree list (Git guarantee)
1449
- * This cannot be determined by path comparison because --show-toplevel returns
1450
- * the same value for all worktrees.
1467
+ * Uses findMainWorktreePathWithSettings to determine the main worktree based on settings.
1468
+ *
1469
+ * @param worktree - The worktree to check
1470
+ * @param settingsManager - SettingsManager instance for loading settings
1471
+ * @returns true if the worktree is the main worktree
1451
1472
  */
1452
- async isMainWorktree(worktree) {
1453
- const worktrees = await this.listWorktrees();
1454
- const mainWorktree = worktrees[0];
1455
- return mainWorktree !== void 0 && mainWorktree.path === worktree.path;
1473
+ async isMainWorktree(worktree, settingsManager) {
1474
+ const mainWorktreePath = await findMainWorktreePathWithSettings(worktree.path, settingsManager);
1475
+ return worktree.path === mainWorktreePath;
1456
1476
  }
1457
1477
  /**
1458
1478
  * Check if a worktree is a PR worktree based on naming patterns
@@ -1735,13 +1755,17 @@ var GitWorktreeManager = class {
1735
1755
  * Remove multiple worktrees
1736
1756
  * Returns a summary of successes and failures
1737
1757
  * Automatically filters out the main worktree
1758
+ *
1759
+ * @param worktrees - Array of worktrees to remove
1760
+ * @param settingsManager - SettingsManager instance for determining main worktree
1761
+ * @param options - Cleanup options
1738
1762
  */
1739
- async removeWorktrees(worktrees, options = {}) {
1763
+ async removeWorktrees(worktrees, settingsManager, options = {}) {
1740
1764
  const successes = [];
1741
1765
  const failures = [];
1742
1766
  const skipped = [];
1743
1767
  for (const worktree of worktrees) {
1744
- if (await this.isMainWorktree(worktree)) {
1768
+ if (await this.isMainWorktree(worktree, settingsManager)) {
1745
1769
  skipped.push({ worktree, reason: "Cannot remove main worktree" });
1746
1770
  continue;
1747
1771
  }
@@ -1802,12 +1826,39 @@ async function checkGhAuth() {
1802
1826
  var _a, _b;
1803
1827
  try {
1804
1828
  const output = await executeGhCommand(["auth", "status"]);
1805
- const scopeMatch = output.match(/Token scopes: (.+)/);
1806
- const userMatch = output.match(/Logged in to github\.com as ([^\s]+)/);
1807
- const username = userMatch == null ? void 0 : userMatch[1];
1829
+ const lines = output.split("\n");
1830
+ let username;
1831
+ let scopes = [];
1832
+ for (let i = 0; i < lines.length; i++) {
1833
+ const line = lines[i];
1834
+ const newFormatMatch = line == null ? void 0 : line.match(/Logged in to github\.com account ([^\s(]+)/);
1835
+ if (newFormatMatch) {
1836
+ const accountName = newFormatMatch[1];
1837
+ const nextFewLines = lines.slice(i + 1, i + 5).join("\n");
1838
+ const isActive = nextFewLines.includes("Active account: true");
1839
+ if (isActive || !username && !output.includes("Active account:")) {
1840
+ username = accountName;
1841
+ const scopeMatch = nextFewLines.match(/Token scopes: (.+)/);
1842
+ if (scopeMatch == null ? void 0 : scopeMatch[1]) {
1843
+ scopes = scopeMatch[1].split(", ").map((scope) => scope.replace(/^'|'$/g, ""));
1844
+ }
1845
+ if (isActive) break;
1846
+ }
1847
+ }
1848
+ if (!username) {
1849
+ const oldFormatMatch = line == null ? void 0 : line.match(/Logged in to github\.com as ([^\s]+)/);
1850
+ if (oldFormatMatch) {
1851
+ username = oldFormatMatch[1];
1852
+ }
1853
+ }
1854
+ }
1855
+ if (scopes.length === 0) {
1856
+ const scopeMatch = output.match(/Token scopes: (.+)/);
1857
+ scopes = ((_a = scopeMatch == null ? void 0 : scopeMatch[1]) == null ? void 0 : _a.split(", ").map((scope) => scope.replace(/^'|'$/g, ""))) ?? [];
1858
+ }
1808
1859
  return {
1809
1860
  hasAuth: true,
1810
- scopes: ((_a = scopeMatch == null ? void 0 : scopeMatch[1]) == null ? void 0 : _a.split(", ").map((scope) => scope.replace(/^'|'$/g, ""))) ?? [],
1861
+ scopes,
1811
1862
  ...username && { username }
1812
1863
  };
1813
1864
  } catch (error) {
@@ -1835,15 +1886,19 @@ async function fetchGhIssue(issueNumber, repo) {
1835
1886
  }
1836
1887
  return executeGhCommand(args);
1837
1888
  }
1838
- async function fetchGhPR(prNumber) {
1839
- logger.debug("Fetching GitHub PR", { prNumber });
1840
- return executeGhCommand([
1889
+ async function fetchGhPR(prNumber, repo) {
1890
+ logger.debug("Fetching GitHub PR", { prNumber, repo });
1891
+ const args = [
1841
1892
  "pr",
1842
1893
  "view",
1843
1894
  String(prNumber),
1844
1895
  "--json",
1845
1896
  "number,title,body,state,headRefName,baseRefName,url,isDraft,mergeable,createdAt,updatedAt"
1846
- ]);
1897
+ ];
1898
+ if (repo) {
1899
+ args.push("--repo", repo);
1900
+ }
1901
+ return executeGhCommand(args);
1847
1902
  }
1848
1903
  async function fetchProjectList(owner) {
1849
1904
  const result = await executeGhCommand([
@@ -2005,29 +2060,29 @@ var GitHubService = class {
2005
2060
  this.prompter = (options == null ? void 0 : options.prompter) ?? promptConfirmation;
2006
2061
  }
2007
2062
  // Input detection
2008
- async detectInputType(input) {
2063
+ async detectInputType(input, repo) {
2009
2064
  const numberMatch = input.match(/^#?(\d+)$/);
2010
2065
  if (!(numberMatch == null ? void 0 : numberMatch[1])) {
2011
2066
  return { type: "unknown", number: null, rawInput: input };
2012
2067
  }
2013
2068
  const number = parseInt(numberMatch[1], 10);
2014
2069
  logger.debug("Checking if input is a PR", { number });
2015
- const pr = await this.isValidPR(number);
2070
+ const pr = await this.isValidPR(number, repo);
2016
2071
  if (pr) {
2017
2072
  return { type: "pr", number, rawInput: input };
2018
2073
  }
2019
2074
  logger.debug("Checking if input is an issue", { number });
2020
- const issue = await this.isValidIssue(number);
2075
+ const issue = await this.isValidIssue(number, repo);
2021
2076
  if (issue) {
2022
2077
  return { type: "issue", number, rawInput: input };
2023
2078
  }
2024
2079
  return { type: "unknown", number: null, rawInput: input };
2025
2080
  }
2026
2081
  // Issue fetching with validation
2027
- async fetchIssue(issueNumber) {
2082
+ async fetchIssue(issueNumber, repo) {
2028
2083
  var _a;
2029
2084
  try {
2030
- return await this.fetchIssueInternal(issueNumber);
2085
+ return await this.fetchIssueInternal(issueNumber, repo);
2031
2086
  } catch (error) {
2032
2087
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2033
2088
  throw new GitHubError(
@@ -2040,10 +2095,10 @@ var GitHubService = class {
2040
2095
  }
2041
2096
  }
2042
2097
  // Silent issue validation (for detection phase)
2043
- async isValidIssue(issueNumber) {
2098
+ async isValidIssue(issueNumber, repo) {
2044
2099
  var _a;
2045
2100
  try {
2046
- return await this.fetchIssueInternal(issueNumber);
2101
+ return await this.fetchIssueInternal(issueNumber, repo);
2047
2102
  } catch (error) {
2048
2103
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2049
2104
  return false;
@@ -2052,8 +2107,8 @@ var GitHubService = class {
2052
2107
  }
2053
2108
  }
2054
2109
  // Internal issue fetching logic (shared by fetchIssue and isValidIssue)
2055
- async fetchIssueInternal(issueNumber) {
2056
- const ghIssue = await fetchGhIssue(issueNumber);
2110
+ async fetchIssueInternal(issueNumber, repo) {
2111
+ const ghIssue = await fetchGhIssue(issueNumber, repo);
2057
2112
  return this.mapGitHubIssueToIssue(ghIssue);
2058
2113
  }
2059
2114
  async validateIssueState(issue) {
@@ -2070,10 +2125,10 @@ var GitHubService = class {
2070
2125
  }
2071
2126
  }
2072
2127
  // PR fetching with validation
2073
- async fetchPR(prNumber) {
2128
+ async fetchPR(prNumber, repo) {
2074
2129
  var _a;
2075
2130
  try {
2076
- return await this.fetchPRInternal(prNumber);
2131
+ return await this.fetchPRInternal(prNumber, repo);
2077
2132
  } catch (error) {
2078
2133
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2079
2134
  throw new GitHubError(
@@ -2086,10 +2141,10 @@ var GitHubService = class {
2086
2141
  }
2087
2142
  }
2088
2143
  // Silent PR validation (for detection phase)
2089
- async isValidPR(prNumber) {
2144
+ async isValidPR(prNumber, repo) {
2090
2145
  var _a;
2091
2146
  try {
2092
- return await this.fetchPRInternal(prNumber);
2147
+ return await this.fetchPRInternal(prNumber, repo);
2093
2148
  } catch (error) {
2094
2149
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2095
2150
  return false;
@@ -2098,8 +2153,8 @@ var GitHubService = class {
2098
2153
  }
2099
2154
  }
2100
2155
  // Internal PR fetching logic (shared by fetchPR and isValidPR)
2101
- async fetchPRInternal(prNumber) {
2102
- const ghPR = await fetchGhPR(prNumber);
2156
+ async fetchPRInternal(prNumber, repo) {
2157
+ const ghPR = await fetchGhPR(prNumber, repo);
2103
2158
  return this.mapGitHubPRToPullRequest(ghPR);
2104
2159
  }
2105
2160
  async validatePRState(pr) {
@@ -2811,12 +2866,54 @@ var PromptTemplateManager = class {
2811
2866
  if (variables.PORT !== void 0) {
2812
2867
  result = result.replace(/PORT/g, String(variables.PORT));
2813
2868
  }
2869
+ if (variables.SETTINGS_SCHEMA !== void 0) {
2870
+ result = result.replace(/SETTINGS_SCHEMA/g, variables.SETTINGS_SCHEMA);
2871
+ }
2872
+ if (variables.SETTINGS_JSON !== void 0) {
2873
+ result = result.replace(/SETTINGS_JSON/g, variables.SETTINGS_JSON);
2874
+ }
2875
+ if (variables.SETTINGS_LOCAL_JSON !== void 0) {
2876
+ result = result.replace(/SETTINGS_LOCAL_JSON/g, variables.SETTINGS_LOCAL_JSON);
2877
+ }
2878
+ if (variables.SHELL_TYPE !== void 0) {
2879
+ result = result.replace(/SHELL_TYPE/g, variables.SHELL_TYPE);
2880
+ }
2881
+ if (variables.SHELL_CONFIG_PATH !== void 0) {
2882
+ result = result.replace(/SHELL_CONFIG_PATH/g, variables.SHELL_CONFIG_PATH);
2883
+ }
2884
+ if (variables.SHELL_CONFIG_CONTENT !== void 0) {
2885
+ result = result.replace(/SHELL_CONFIG_CONTENT/g, variables.SHELL_CONFIG_CONTENT);
2886
+ }
2887
+ if (variables.REMOTES_INFO !== void 0) {
2888
+ result = result.replace(/REMOTES_INFO/g, variables.REMOTES_INFO);
2889
+ }
2890
+ if (variables.MULTIPLE_REMOTES !== void 0) {
2891
+ result = result.replace(/MULTIPLE_REMOTES/g, variables.MULTIPLE_REMOTES);
2892
+ }
2893
+ if (variables.SINGLE_REMOTE !== void 0) {
2894
+ result = result.replace(/SINGLE_REMOTE/g, variables.SINGLE_REMOTE);
2895
+ }
2896
+ if (variables.SINGLE_REMOTE_NAME !== void 0) {
2897
+ result = result.replace(/SINGLE_REMOTE_NAME/g, variables.SINGLE_REMOTE_NAME);
2898
+ }
2899
+ if (variables.SINGLE_REMOTE_URL !== void 0) {
2900
+ result = result.replace(/SINGLE_REMOTE_URL/g, variables.SINGLE_REMOTE_URL);
2901
+ }
2902
+ if (variables.NO_REMOTES !== void 0) {
2903
+ result = result.replace(/NO_REMOTES/g, variables.NO_REMOTES);
2904
+ }
2905
+ if (variables.README_CONTENT !== void 0) {
2906
+ result = result.replace(/README_CONTENT/g, variables.README_CONTENT);
2907
+ }
2908
+ if (variables.SETTINGS_SCHEMA_CONTENT !== void 0) {
2909
+ result = result.replace(/SETTINGS_SCHEMA_CONTENT/g, variables.SETTINGS_SCHEMA_CONTENT);
2910
+ }
2814
2911
  return result;
2815
2912
  }
2816
2913
  /**
2817
2914
  * Process conditional sections in template
2818
2915
  * Format: {{#IF ONE_SHOT_MODE}}content{{/IF ONE_SHOT_MODE}}
2819
- *
2916
+ *
2820
2917
  * Note: /s flag allows . to match newlines
2821
2918
  */
2822
2919
  processConditionalSections(template, variables) {
@@ -2827,6 +2924,42 @@ var PromptTemplateManager = class {
2827
2924
  } else {
2828
2925
  result = result.replace(oneShotRegex, "");
2829
2926
  }
2927
+ const settingsJsonRegex = /\{\{#IF SETTINGS_JSON\}\}(.*?)\{\{\/IF SETTINGS_JSON\}\}/gs;
2928
+ if (variables.SETTINGS_JSON !== void 0 && variables.SETTINGS_JSON !== "") {
2929
+ result = result.replace(settingsJsonRegex, "$1");
2930
+ } else {
2931
+ result = result.replace(settingsJsonRegex, "");
2932
+ }
2933
+ const settingsLocalJsonRegex = /\{\{#IF SETTINGS_LOCAL_JSON\}\}(.*?)\{\{\/IF SETTINGS_LOCAL_JSON\}\}/gs;
2934
+ if (variables.SETTINGS_LOCAL_JSON !== void 0 && variables.SETTINGS_LOCAL_JSON !== "") {
2935
+ result = result.replace(settingsLocalJsonRegex, "$1");
2936
+ } else {
2937
+ result = result.replace(settingsLocalJsonRegex, "");
2938
+ }
2939
+ const multipleRemotesRegex = /\{\{#IF MULTIPLE_REMOTES\}\}(.*?)\{\{\/IF MULTIPLE_REMOTES\}\}/gs;
2940
+ if (variables.MULTIPLE_REMOTES !== void 0 && variables.MULTIPLE_REMOTES !== "") {
2941
+ result = result.replace(multipleRemotesRegex, "$1");
2942
+ } else {
2943
+ result = result.replace(multipleRemotesRegex, "");
2944
+ }
2945
+ const singleRemoteRegex = /\{\{#IF SINGLE_REMOTE\}\}(.*?)\{\{\/IF SINGLE_REMOTE\}\}/gs;
2946
+ if (variables.SINGLE_REMOTE !== void 0 && variables.SINGLE_REMOTE !== "") {
2947
+ result = result.replace(singleRemoteRegex, "$1");
2948
+ } else {
2949
+ result = result.replace(singleRemoteRegex, "");
2950
+ }
2951
+ const noRemotesRegex = /\{\{#IF NO_REMOTES\}\}(.*?)\{\{\/IF NO_REMOTES\}\}/gs;
2952
+ if (variables.NO_REMOTES !== void 0 && variables.NO_REMOTES !== "") {
2953
+ result = result.replace(noRemotesRegex, "$1");
2954
+ } else {
2955
+ result = result.replace(noRemotesRegex, "");
2956
+ }
2957
+ const firstTimeUserRegex = /\{\{#IF FIRST_TIME_USER\}\}(.*?)\{\{\/IF FIRST_TIME_USER\}\}/gs;
2958
+ if (variables.FIRST_TIME_USER === true) {
2959
+ result = result.replace(firstTimeUserRegex, "$1");
2960
+ } else {
2961
+ result = result.replace(firstTimeUserRegex, "");
2962
+ }
2830
2963
  return result;
2831
2964
  }
2832
2965
  /**