@iloom/cli 0.1.16 → 0.1.18

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 (120) hide show
  1. package/README.md +20 -7
  2. package/dist/ClaudeContextManager-LD3VB6EM.js +13 -0
  3. package/dist/ClaudeService-CFFI7DD5.js +12 -0
  4. package/dist/{GitHubService-F7Z3XJOS.js → GitHubService-SH4H6VS5.js} +3 -3
  5. package/dist/{LoomLauncher-MODG2SEM.js → LoomLauncher-FB2MV2ZI.js} +7 -7
  6. package/dist/{PromptTemplateManager-7FINLRDE.js → PromptTemplateManager-WM5GIPEF.js} +2 -2
  7. package/dist/{SettingsManager-VAZF26S2.js → SettingsManager-SKLUVE3K.js} +6 -2
  8. package/dist/{add-issue-22JBNOML.js → add-issue-L5HX6LEV.js} +23 -8
  9. package/dist/add-issue-L5HX6LEV.js.map +1 -0
  10. package/dist/{chunk-U3WU5OWO.js → chunk-4XIDC3NF.js} +2 -2
  11. package/dist/chunk-4XIDC3NF.js.map +1 -0
  12. package/dist/{chunk-SSR5AVRJ.js → chunk-6OTVPRXH.js} +21 -8
  13. package/dist/chunk-6OTVPRXH.js.map +1 -0
  14. package/dist/{chunk-KQDEK2ZW.js → chunk-DGEKUT7Q.js} +9 -5
  15. package/dist/chunk-DGEKUT7Q.js.map +1 -0
  16. package/dist/chunk-FXV24OYZ.js +83 -0
  17. package/dist/chunk-FXV24OYZ.js.map +1 -0
  18. package/dist/{chunk-HPJJSYNS.js → chunk-H5LDRGVK.js} +6 -8
  19. package/dist/{chunk-HPJJSYNS.js.map → chunk-H5LDRGVK.js.map} +1 -1
  20. package/dist/{chunk-WKEWRSDB.js → chunk-HURVAQRK.js} +3 -3
  21. package/dist/{chunk-T7QPXANZ.js → chunk-IIPTBZQW.js} +17 -17
  22. package/dist/chunk-IIPTBZQW.js.map +1 -0
  23. package/dist/{chunk-QEPVTTHD.js → chunk-IO4WFTL2.js} +17 -11
  24. package/dist/chunk-IO4WFTL2.js.map +1 -0
  25. package/dist/{chunk-JQ7VOSTC.js → chunk-KOCQAD2E.js} +3 -3
  26. package/dist/{chunk-F3XBU2R7.js → chunk-L4QGC27H.js} +68 -2
  27. package/dist/chunk-L4QGC27H.js.map +1 -0
  28. package/dist/{chunk-YYSKGAZT.js → chunk-LAPY6NAE.js} +17 -8
  29. package/dist/chunk-LAPY6NAE.js.map +1 -0
  30. package/dist/{chunk-O2QWO64Z.js → chunk-PV3GAXQO.js} +56 -3
  31. package/dist/chunk-PV3GAXQO.js.map +1 -0
  32. package/dist/{chunk-CP2NU2JC.js → chunk-Q2KYPAH2.js} +7 -7
  33. package/dist/{chunk-CP2NU2JC.js.map → chunk-Q2KYPAH2.js.map} +1 -1
  34. package/dist/{chunk-Y7SAGNUT.js → chunk-SLIMABFA.js} +2 -2
  35. package/dist/{chunk-W3DQTW63.js → chunk-USVVV3FP.js} +4 -4
  36. package/dist/chunk-VVH3ANF2.js +307 -0
  37. package/dist/chunk-VVH3ANF2.js.map +1 -0
  38. package/dist/{chunk-JBH2ZYYZ.js → chunk-VYQLLHZ7.js} +22 -3
  39. package/dist/chunk-VYQLLHZ7.js.map +1 -0
  40. package/dist/{chunk-SJUQ2NDR.js → chunk-ZMNQBJUI.js} +24 -19
  41. package/dist/chunk-ZMNQBJUI.js.map +1 -0
  42. package/dist/{cleanup-3LUWPSM7.js → cleanup-ZHROIBSQ.js} +12 -16
  43. package/dist/cleanup-ZHROIBSQ.js.map +1 -0
  44. package/dist/cli.js +97 -49
  45. package/dist/cli.js.map +1 -1
  46. package/dist/{enhance-XJIQHVPD.js → enhance-VVMAKMVZ.js} +18 -8
  47. package/dist/enhance-VVMAKMVZ.js.map +1 -0
  48. package/dist/{feedback-23CLXKFT.js → feedback-AKHD7QIM.js} +8 -8
  49. package/dist/{finish-CY4CIH6O.js → finish-WGPISUEH.js} +60 -313
  50. package/dist/finish-WGPISUEH.js.map +1 -0
  51. package/dist/{git-LVRZ57GJ.js → git-OUYMVYJX.js} +2 -2
  52. package/dist/{ignite-WXEF2ID5.js → ignite-JEN3K3OT.js} +7 -7
  53. package/dist/index.d.ts +791 -712
  54. package/dist/index.js +126 -32
  55. package/dist/index.js.map +1 -1
  56. package/dist/init-EVUT4ZQJ.js +339 -0
  57. package/dist/init-EVUT4ZQJ.js.map +1 -0
  58. package/dist/mcp/github-comment-server.js +12 -9
  59. package/dist/mcp/github-comment-server.js.map +1 -1
  60. package/dist/neon-helpers-ZVIRPKCI.js +10 -0
  61. package/dist/{open-X6BTENPV.js → open-ETZUFSE4.js} +15 -17
  62. package/dist/{open-X6BTENPV.js.map → open-ETZUFSE4.js.map} +1 -1
  63. package/dist/prompts/init-prompt.txt +746 -0
  64. package/dist/prompts/issue-prompt.txt +48 -5
  65. package/dist/prompts/pr-prompt.txt +46 -1
  66. package/dist/prompts/regular-prompt.txt +22 -0
  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-2NEZU7SE.js} +54 -53
  74. package/dist/{start-LWVRBJ6S.js.map → start-2NEZU7SE.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-3ZT2XX2G.js → update-4TDDUR5K.js} +11 -5
  78. package/dist/{update-3ZT2XX2G.js.map → update-4TDDUR5K.js.map} +1 -1
  79. package/dist/{update-notifier-QSSEB5KC.js → update-notifier-QEX3CJHA.js} +2 -2
  80. package/package.json +1 -1
  81. package/dist/ClaudeContextManager-XOSXQ67R.js +0 -13
  82. package/dist/ClaudeService-YSZ6EXWP.js +0 -12
  83. package/dist/NeonProvider-PAGPUH7F.js +0 -12
  84. package/dist/add-issue-22JBNOML.js.map +0 -1
  85. package/dist/chunk-37DYYFVK.js +0 -29
  86. package/dist/chunk-37DYYFVK.js.map +0 -1
  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-U3WU5OWO.js.map +0 -1
  96. package/dist/chunk-YYSKGAZT.js.map +0 -1
  97. package/dist/cleanup-3LUWPSM7.js.map +0 -1
  98. package/dist/enhance-XJIQHVPD.js.map +0 -1
  99. package/dist/env-MDFL4ZXL.js +0 -23
  100. package/dist/finish-CY4CIH6O.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-LD3VB6EM.js.map} +0 -0
  104. /package/dist/{ClaudeService-YSZ6EXWP.js.map → ClaudeService-CFFI7DD5.js.map} +0 -0
  105. /package/dist/{GitHubService-F7Z3XJOS.js.map → GitHubService-SH4H6VS5.js.map} +0 -0
  106. /package/dist/{LoomLauncher-MODG2SEM.js.map → LoomLauncher-FB2MV2ZI.js.map} +0 -0
  107. /package/dist/{NeonProvider-PAGPUH7F.js.map → PromptTemplateManager-WM5GIPEF.js.map} +0 -0
  108. /package/dist/{PromptTemplateManager-7FINLRDE.js.map → SettingsManager-SKLUVE3K.js.map} +0 -0
  109. /package/dist/{chunk-WKEWRSDB.js.map → chunk-HURVAQRK.js.map} +0 -0
  110. /package/dist/{chunk-JQ7VOSTC.js.map → chunk-KOCQAD2E.js.map} +0 -0
  111. /package/dist/{chunk-Y7SAGNUT.js.map → chunk-SLIMABFA.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-AKHD7QIM.js.map} +0 -0
  114. /package/dist/{SettingsManager-VAZF26S2.js.map → git-OUYMVYJX.js.map} +0 -0
  115. /package/dist/{ignite-WXEF2ID5.js.map → ignite-JEN3K3OT.js.map} +0 -0
  116. /package/dist/{env-MDFL4ZXL.js.map → neon-helpers-ZVIRPKCI.js.map} +0 -0
  117. /package/dist/{git-LVRZ57GJ.js.map → remote-GJEZWRCC.js.map} +0 -0
  118. /package/dist/{test-git-XPF4SZXJ.js.map → test-git-MKZATGZN.js.map} +0 -0
  119. /package/dist/{test-prefix-XGFXFAYN.js.map → test-prefix-ZNLWDI3K.js.map} +0 -0
  120. /package/dist/{update-notifier-QSSEB5KC.js.map → update-notifier-QEX3CJHA.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
  }
@@ -1835,15 +1859,19 @@ async function fetchGhIssue(issueNumber, repo) {
1835
1859
  }
1836
1860
  return executeGhCommand(args);
1837
1861
  }
1838
- async function fetchGhPR(prNumber) {
1839
- logger.debug("Fetching GitHub PR", { prNumber });
1840
- return executeGhCommand([
1862
+ async function fetchGhPR(prNumber, repo) {
1863
+ logger.debug("Fetching GitHub PR", { prNumber, repo });
1864
+ const args = [
1841
1865
  "pr",
1842
1866
  "view",
1843
1867
  String(prNumber),
1844
1868
  "--json",
1845
1869
  "number,title,body,state,headRefName,baseRefName,url,isDraft,mergeable,createdAt,updatedAt"
1846
- ]);
1870
+ ];
1871
+ if (repo) {
1872
+ args.push("--repo", repo);
1873
+ }
1874
+ return executeGhCommand(args);
1847
1875
  }
1848
1876
  async function fetchProjectList(owner) {
1849
1877
  const result = await executeGhCommand([
@@ -2005,29 +2033,29 @@ var GitHubService = class {
2005
2033
  this.prompter = (options == null ? void 0 : options.prompter) ?? promptConfirmation;
2006
2034
  }
2007
2035
  // Input detection
2008
- async detectInputType(input) {
2036
+ async detectInputType(input, repo) {
2009
2037
  const numberMatch = input.match(/^#?(\d+)$/);
2010
2038
  if (!(numberMatch == null ? void 0 : numberMatch[1])) {
2011
2039
  return { type: "unknown", number: null, rawInput: input };
2012
2040
  }
2013
2041
  const number = parseInt(numberMatch[1], 10);
2014
2042
  logger.debug("Checking if input is a PR", { number });
2015
- const pr = await this.isValidPR(number);
2043
+ const pr = await this.isValidPR(number, repo);
2016
2044
  if (pr) {
2017
2045
  return { type: "pr", number, rawInput: input };
2018
2046
  }
2019
2047
  logger.debug("Checking if input is an issue", { number });
2020
- const issue = await this.isValidIssue(number);
2048
+ const issue = await this.isValidIssue(number, repo);
2021
2049
  if (issue) {
2022
2050
  return { type: "issue", number, rawInput: input };
2023
2051
  }
2024
2052
  return { type: "unknown", number: null, rawInput: input };
2025
2053
  }
2026
2054
  // Issue fetching with validation
2027
- async fetchIssue(issueNumber) {
2055
+ async fetchIssue(issueNumber, repo) {
2028
2056
  var _a;
2029
2057
  try {
2030
- return await this.fetchIssueInternal(issueNumber);
2058
+ return await this.fetchIssueInternal(issueNumber, repo);
2031
2059
  } catch (error) {
2032
2060
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2033
2061
  throw new GitHubError(
@@ -2040,10 +2068,10 @@ var GitHubService = class {
2040
2068
  }
2041
2069
  }
2042
2070
  // Silent issue validation (for detection phase)
2043
- async isValidIssue(issueNumber) {
2071
+ async isValidIssue(issueNumber, repo) {
2044
2072
  var _a;
2045
2073
  try {
2046
- return await this.fetchIssueInternal(issueNumber);
2074
+ return await this.fetchIssueInternal(issueNumber, repo);
2047
2075
  } catch (error) {
2048
2076
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2049
2077
  return false;
@@ -2052,8 +2080,8 @@ var GitHubService = class {
2052
2080
  }
2053
2081
  }
2054
2082
  // Internal issue fetching logic (shared by fetchIssue and isValidIssue)
2055
- async fetchIssueInternal(issueNumber) {
2056
- const ghIssue = await fetchGhIssue(issueNumber);
2083
+ async fetchIssueInternal(issueNumber, repo) {
2084
+ const ghIssue = await fetchGhIssue(issueNumber, repo);
2057
2085
  return this.mapGitHubIssueToIssue(ghIssue);
2058
2086
  }
2059
2087
  async validateIssueState(issue) {
@@ -2070,10 +2098,10 @@ var GitHubService = class {
2070
2098
  }
2071
2099
  }
2072
2100
  // PR fetching with validation
2073
- async fetchPR(prNumber) {
2101
+ async fetchPR(prNumber, repo) {
2074
2102
  var _a;
2075
2103
  try {
2076
- return await this.fetchPRInternal(prNumber);
2104
+ return await this.fetchPRInternal(prNumber, repo);
2077
2105
  } catch (error) {
2078
2106
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2079
2107
  throw new GitHubError(
@@ -2086,10 +2114,10 @@ var GitHubService = class {
2086
2114
  }
2087
2115
  }
2088
2116
  // Silent PR validation (for detection phase)
2089
- async isValidPR(prNumber) {
2117
+ async isValidPR(prNumber, repo) {
2090
2118
  var _a;
2091
2119
  try {
2092
- return await this.fetchPRInternal(prNumber);
2120
+ return await this.fetchPRInternal(prNumber, repo);
2093
2121
  } catch (error) {
2094
2122
  if (error instanceof Error && "stderr" in error && ((_a = error.stderr) == null ? void 0 : _a.includes("Could not resolve"))) {
2095
2123
  return false;
@@ -2098,8 +2126,8 @@ var GitHubService = class {
2098
2126
  }
2099
2127
  }
2100
2128
  // Internal PR fetching logic (shared by fetchPR and isValidPR)
2101
- async fetchPRInternal(prNumber) {
2102
- const ghPR = await fetchGhPR(prNumber);
2129
+ async fetchPRInternal(prNumber, repo) {
2130
+ const ghPR = await fetchGhPR(prNumber, repo);
2103
2131
  return this.mapGitHubPRToPullRequest(ghPR);
2104
2132
  }
2105
2133
  async validatePRState(pr) {
@@ -2811,12 +2839,48 @@ var PromptTemplateManager = class {
2811
2839
  if (variables.PORT !== void 0) {
2812
2840
  result = result.replace(/PORT/g, String(variables.PORT));
2813
2841
  }
2842
+ if (variables.SETTINGS_SCHEMA !== void 0) {
2843
+ result = result.replace(/SETTINGS_SCHEMA/g, variables.SETTINGS_SCHEMA);
2844
+ }
2845
+ if (variables.SETTINGS_JSON !== void 0) {
2846
+ result = result.replace(/SETTINGS_JSON/g, variables.SETTINGS_JSON);
2847
+ }
2848
+ if (variables.SETTINGS_LOCAL_JSON !== void 0) {
2849
+ result = result.replace(/SETTINGS_LOCAL_JSON/g, variables.SETTINGS_LOCAL_JSON);
2850
+ }
2851
+ if (variables.SHELL_TYPE !== void 0) {
2852
+ result = result.replace(/SHELL_TYPE/g, variables.SHELL_TYPE);
2853
+ }
2854
+ if (variables.SHELL_CONFIG_PATH !== void 0) {
2855
+ result = result.replace(/SHELL_CONFIG_PATH/g, variables.SHELL_CONFIG_PATH);
2856
+ }
2857
+ if (variables.SHELL_CONFIG_CONTENT !== void 0) {
2858
+ result = result.replace(/SHELL_CONFIG_CONTENT/g, variables.SHELL_CONFIG_CONTENT);
2859
+ }
2860
+ if (variables.REMOTES_INFO !== void 0) {
2861
+ result = result.replace(/REMOTES_INFO/g, variables.REMOTES_INFO);
2862
+ }
2863
+ if (variables.MULTIPLE_REMOTES !== void 0) {
2864
+ result = result.replace(/MULTIPLE_REMOTES/g, variables.MULTIPLE_REMOTES);
2865
+ }
2866
+ if (variables.SINGLE_REMOTE !== void 0) {
2867
+ result = result.replace(/SINGLE_REMOTE/g, variables.SINGLE_REMOTE);
2868
+ }
2869
+ if (variables.SINGLE_REMOTE_NAME !== void 0) {
2870
+ result = result.replace(/SINGLE_REMOTE_NAME/g, variables.SINGLE_REMOTE_NAME);
2871
+ }
2872
+ if (variables.SINGLE_REMOTE_URL !== void 0) {
2873
+ result = result.replace(/SINGLE_REMOTE_URL/g, variables.SINGLE_REMOTE_URL);
2874
+ }
2875
+ if (variables.NO_REMOTES !== void 0) {
2876
+ result = result.replace(/NO_REMOTES/g, variables.NO_REMOTES);
2877
+ }
2814
2878
  return result;
2815
2879
  }
2816
2880
  /**
2817
2881
  * Process conditional sections in template
2818
2882
  * Format: {{#IF ONE_SHOT_MODE}}content{{/IF ONE_SHOT_MODE}}
2819
- *
2883
+ *
2820
2884
  * Note: /s flag allows . to match newlines
2821
2885
  */
2822
2886
  processConditionalSections(template, variables) {
@@ -2827,6 +2891,36 @@ var PromptTemplateManager = class {
2827
2891
  } else {
2828
2892
  result = result.replace(oneShotRegex, "");
2829
2893
  }
2894
+ const settingsJsonRegex = /\{\{#IF SETTINGS_JSON\}\}(.*?)\{\{\/IF SETTINGS_JSON\}\}/gs;
2895
+ if (variables.SETTINGS_JSON !== void 0 && variables.SETTINGS_JSON !== "") {
2896
+ result = result.replace(settingsJsonRegex, "$1");
2897
+ } else {
2898
+ result = result.replace(settingsJsonRegex, "");
2899
+ }
2900
+ const settingsLocalJsonRegex = /\{\{#IF SETTINGS_LOCAL_JSON\}\}(.*?)\{\{\/IF SETTINGS_LOCAL_JSON\}\}/gs;
2901
+ if (variables.SETTINGS_LOCAL_JSON !== void 0 && variables.SETTINGS_LOCAL_JSON !== "") {
2902
+ result = result.replace(settingsLocalJsonRegex, "$1");
2903
+ } else {
2904
+ result = result.replace(settingsLocalJsonRegex, "");
2905
+ }
2906
+ const multipleRemotesRegex = /\{\{#IF MULTIPLE_REMOTES\}\}(.*?)\{\{\/IF MULTIPLE_REMOTES\}\}/gs;
2907
+ if (variables.MULTIPLE_REMOTES !== void 0 && variables.MULTIPLE_REMOTES !== "") {
2908
+ result = result.replace(multipleRemotesRegex, "$1");
2909
+ } else {
2910
+ result = result.replace(multipleRemotesRegex, "");
2911
+ }
2912
+ const singleRemoteRegex = /\{\{#IF SINGLE_REMOTE\}\}(.*?)\{\{\/IF SINGLE_REMOTE\}\}/gs;
2913
+ if (variables.SINGLE_REMOTE !== void 0 && variables.SINGLE_REMOTE !== "") {
2914
+ result = result.replace(singleRemoteRegex, "$1");
2915
+ } else {
2916
+ result = result.replace(singleRemoteRegex, "");
2917
+ }
2918
+ const noRemotesRegex = /\{\{#IF NO_REMOTES\}\}(.*?)\{\{\/IF NO_REMOTES\}\}/gs;
2919
+ if (variables.NO_REMOTES !== void 0 && variables.NO_REMOTES !== "") {
2920
+ result = result.replace(noRemotesRegex, "$1");
2921
+ } else {
2922
+ result = result.replace(noRemotesRegex, "");
2923
+ }
2830
2924
  return result;
2831
2925
  }
2832
2926
  /**