@ulpi/cli 0.1.5 → 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 (109) hide show
  1. package/README.md +143 -214
  2. package/dist/{auth-PN7TMQHV-2W4ICG64.js → auth-FWM7MM4Q-VZC3U2XZ.js} +1 -1
  3. package/dist/{auth-BFFBUJUC.js → auth-HDK7ECJL.js} +2 -1
  4. package/dist/{chunk-RJIRWQJD.js → chunk-3BCW6ABU.js} +402 -142
  5. package/dist/{chunk-L3PWNHSA.js → chunk-3WB5CXH4.js} +180 -5
  6. package/dist/{chunk-K4OVPFY2.js → chunk-4UCJIAOU.js} +2 -2
  7. package/dist/chunk-4XTHZVDS.js +109 -0
  8. package/dist/chunk-4ZPOZULQ.js +6522 -0
  9. package/dist/{chunk-SIAQVRKG.js → chunk-5MI5GIXM.js} +48 -2
  10. package/dist/{chunk-KLEASXUR.js → chunk-6ZL6NXMV.js} +1 -1
  11. package/dist/{chunk-AV5RB3N2.js → chunk-76D3BYJD.js} +48 -0
  12. package/dist/{chunk-DOIKS6C5.js → chunk-AWOSRA5F.js} +1 -1
  13. package/dist/{chunk-UCMT5OKP.js → chunk-BFEKZZHM.js} +274 -57
  14. package/dist/chunk-C7CLUQI6.js +1286 -0
  15. package/dist/{chunk-ELTGWMDE.js → chunk-E3B5NROU.js} +7 -7
  16. package/dist/chunk-EJ7TW77N.js +1418 -0
  17. package/dist/{chunk-P2RESJRN.js → chunk-EWLYVXQ4.js} +2 -2
  18. package/dist/{chunk-6OURRFP7.js → chunk-IV6MWETF.js} +383 -168
  19. package/dist/chunk-IZPJHSPX.js +1478 -0
  20. package/dist/chunk-JLHNLM3C.js +228 -0
  21. package/dist/chunk-PO4NUZUU.js +147 -0
  22. package/dist/chunk-S6ANCSYO.js +1271 -0
  23. package/dist/chunk-SEU7WWNQ.js +1251 -0
  24. package/dist/chunk-SNQ7NAIS.js +453 -0
  25. package/dist/{ulpi-RMMCUAGP-EWYUE7RU.js → chunk-TSLDGT5O.js} +73 -35
  26. package/dist/{chunk-EIWYSP3A.js → chunk-UXHCHOWQ.js} +83 -62
  27. package/dist/chunk-WED4LM5N.js +322 -0
  28. package/dist/chunk-WVOZE25N.js +6757 -0
  29. package/dist/{chunk-5SCG7UYM.js → chunk-XKF4DPUM.js} +7 -7
  30. package/dist/{chunk-74WVVWJ4.js → chunk-YOKL7RB5.js} +184 -15
  31. package/dist/chunk-Z53CAR7G.js +298 -0
  32. package/dist/{ci-JQ56YIKC.js → ci-COZRTPGQ.js} +124 -26
  33. package/dist/cloud-2F3NLVHN.js +274 -0
  34. package/dist/{codemap-HMYBXJL2.js → codemap-XNGMAF3F.js} +37 -37
  35. package/dist/codex-MB5YTMRT.js +132 -0
  36. package/dist/{config-YYWEN7U2.js → config-OOELBYTH.js} +1 -1
  37. package/dist/dist-2BJYR5EI.js +59 -0
  38. package/dist/dist-3EIQTZHT.js +1380 -0
  39. package/dist/{dist-WAMAQVPK.js → dist-4U5L2X2C.js} +2 -2
  40. package/dist/{dist-4XTJ6HLM.js → dist-54KAMNLO.js} +16 -15
  41. package/dist/dist-6M4MZWZW.js +58 -0
  42. package/dist/dist-6X576SU2.js +27 -0
  43. package/dist/dist-7QOEYLFX.js +103 -0
  44. package/dist/dist-AYBGHEDY.js +2541 -0
  45. package/dist/dist-EK45QNEM.js +45 -0
  46. package/dist/{dist-U7ZIJMZD.js → dist-FKFEJRPX.js} +16 -15
  47. package/dist/dist-GTEJUBBT.js +66 -0
  48. package/dist/dist-HA74OKJZ.js +40 -0
  49. package/dist/{dist-XG2GG5SD.js → dist-HU5RZAON.js} +14 -2
  50. package/dist/dist-IYE3OBRB.js +374 -0
  51. package/dist/{dist-7WLLPWWB.js → dist-JLU26AB6.js} +12 -9
  52. package/dist/{dist-6G7JC2RA.js → dist-KUCI6JFE.js} +49 -9
  53. package/dist/dist-NUEMFZFL.js +33 -0
  54. package/dist/{dist-GWGTAHNM.js → dist-NUXMDXZ3.js} +31 -3
  55. package/dist/{dist-5R4RYNQO.js → dist-YCNWHSLN.js} +15 -5
  56. package/dist/{dist-6MFVWIFF.js → dist-YFFG2ZD6.js} +9 -16
  57. package/dist/dist-ZG4OKCSR.js +15 -0
  58. package/dist/doctor-FKYSIHER.js +345 -0
  59. package/dist/{export-import-4A5MWLIA.js → export-import-JFQH4KSJ.js} +1 -1
  60. package/dist/{history-RNUWO4JZ.js → history-UMGQNQQ7.js} +7 -7
  61. package/dist/{hooks-installer-K2JXEBNN.js → hooks-installer-YEYTYA6Q.js} +2 -2
  62. package/dist/index.js +398 -622
  63. package/dist/{init-NQWFZPKO.js → init-TJYW5ROZ.js} +78 -12
  64. package/dist/job-HIDMAFW2.js +376 -0
  65. package/dist/jobs.memory-PLMMSFHB-VBECCTHN.js +33 -0
  66. package/dist/kiro-VMUHDFGK.js +153 -0
  67. package/dist/{launchd-OYXUAVW6.js → launchd-U3MSWBRH.js} +9 -17
  68. package/dist/mcp-PDUD7SGP.js +249 -0
  69. package/dist/mcp-installer-PQU3XOGO.js +259 -0
  70. package/dist/mcp-setup-OA7IB3H3.js +263 -0
  71. package/dist/{memory-D6ZFFCI2.js → memory-ZNAEAK3B.js} +17 -17
  72. package/dist/{ollama-3XCUZMZT-FYKHW4TZ.js → ollama-3XCUZMZT-4JMH6B7P.js} +1 -1
  73. package/dist/{openai-E7G2YAHU-IG33BFYF.js → openai-E7G2YAHU-T3HMBPH7.js} +2 -2
  74. package/dist/portal-JYWVHXDU.js +210 -0
  75. package/dist/prd-Q4J5NVAR.js +408 -0
  76. package/dist/repos-WWZXNN3P.js +271 -0
  77. package/dist/review-integration-RQE4KMAV.js +14 -0
  78. package/dist/{rules-3OFGWHP4.js → rules-Y4VSOY5Y.js} +3 -3
  79. package/dist/run-VPNXEIBY.js +687 -0
  80. package/dist/server-COL4AXKU-P7S7NNF6.js +11 -0
  81. package/dist/server-U7PQ6FTS-MG4MJPTS.js +20 -0
  82. package/dist/{skills-GY2CTPWN.js → skills-QEYU2N27.js} +4 -2
  83. package/dist/start-IJKY5RVT.js +303 -0
  84. package/dist/{status-SE43TIFJ.js → status-BHQYYGAL.js} +2 -2
  85. package/dist/{templates-O2XDKB5R.js → templates-CBRUJ66V.js} +6 -5
  86. package/dist/tui-DP7736EX.js +61 -0
  87. package/dist/ulpi-5EN6JCAS-LFE3WSL4.js +10 -0
  88. package/dist/{uninstall-KWGSGZTI.js → uninstall-BX6FOV77.js} +3 -3
  89. package/dist/{update-QYZA4D23.js → update-AQKTHFVQ.js} +3 -3
  90. package/dist/{version-checker-MVB74DEX.js → version-checker-5L5PUOEX.js} +2 -2
  91. package/package.json +13 -4
  92. package/dist/chunk-26LLDX2T.js +0 -553
  93. package/dist/chunk-DDRLI6JU.js +0 -331
  94. package/dist/chunk-IFATANHR.js +0 -453
  95. package/dist/chunk-JWUUVXIV.js +0 -13694
  96. package/dist/chunk-LD52XG3X.js +0 -4273
  97. package/dist/chunk-MIAQVCFW.js +0 -39
  98. package/dist/chunk-YYZOFYS6.js +0 -415
  99. package/dist/dist-XD4YI27T.js +0 -26
  100. package/dist/mcp-installer-TOYDP77X.js +0 -124
  101. package/dist/projects-COUJP4ZC.js +0 -271
  102. package/dist/review-KMGP2S25.js +0 -152
  103. package/dist/server-USLHY6GH-F4JSXCWA.js +0 -18
  104. package/dist/server-X5P6WH2M-ULZF5WHZ.js +0 -11
  105. package/dist/ui-4SM2SUI6.js +0 -167
  106. package/dist/ui.html +0 -698
  107. /package/dist/skills/{ulpi-generate-guardian → ulpi-generate-guards}/SKILL.md +0 -0
  108. /package/dist/skills/{ulpi-generate-guardian → ulpi-generate-guards}/references/framework-rules.md +0 -0
  109. /package/dist/skills/{ulpi-generate-guardian → ulpi-generate-guards}/references/language-rules.md +0 -0
@@ -1,331 +0,0 @@
1
- // ../../packages/config/dist/index.js
2
- import { existsSync, readFileSync } from "fs";
3
- import { homedir, userInfo } from "os";
4
- import { join, resolve } from "path";
5
- import { execFileSync } from "child_process";
6
- import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync, mkdirSync } from "fs";
7
- import { dirname } from "path";
8
- var ULPI_GLOBAL_DIR = process.env.ULPI_GLOBAL_DIR || join(homedir(), ".ulpi");
9
- var ULPI_PROJECT_DIR = ".ulpi";
10
- var GUARDS_FILENAME = "guards.yml";
11
- var GUARDS_FILENAME_ALT = "guards.yaml";
12
- var SESSIONS_DIR = join(ULPI_GLOBAL_DIR, "sessions");
13
- var REVIEWS_DIR = join(ULPI_GLOBAL_DIR, "reviews");
14
- var REVIEW_FLAGS_DIR = join(ULPI_GLOBAL_DIR, "review-flags");
15
- var REVIEW_IMAGES_DIR = join(ULPI_GLOBAL_DIR, "review-images");
16
- var PROJECTS_FILE = join(ULPI_GLOBAL_DIR, "projects.json");
17
- var USER_TEMPLATES_DIR = join(ULPI_GLOBAL_DIR, "templates");
18
- var USER_SKILLS_DIR = join(ULPI_GLOBAL_DIR, "skills");
19
- var VERSION_CACHE_FILE = join(ULPI_GLOBAL_DIR, ".version-cache.json");
20
- var SETTINGS_FILE = join(ULPI_GLOBAL_DIR, "settings.json");
21
- var LOGS_DIR = join(ULPI_GLOBAL_DIR, "logs");
22
- var NOTIFICATIONS_LOG_FILE = join(ULPI_GLOBAL_DIR, "notifications.log");
23
- var API_LOCK_FILE = join(ULPI_GLOBAL_DIR, "api.lock");
24
- var HISTORY_BRANCH_PREFIX = "ulpi/history";
25
- var CODEMAP_DIR_NAME = "codemap";
26
- var CODEMAP_DIR = join(ULPI_GLOBAL_DIR, CODEMAP_DIR_NAME);
27
- var CODEMAP_BRANCH_PREFIX = "ulpi/codemap";
28
- function branchToSlug(branch) {
29
- const slug = branch.replace(/\//g, "--").replace(/\.\./g, "__").replace(/[^a-zA-Z0-9_\-]/g, "-").replace(/-{3,}/g, "--").replace(/^-|-$/g, "").toLowerCase();
30
- return slug || "main";
31
- }
32
- function codemapProjectSlug(dir) {
33
- const slug = dir.replace(/^\//, "").replace(/\//g, "-").replace(/\./g, "_").replace(/-{2,}/g, "-").replace(/^-|-$/g, "").toLowerCase();
34
- return slug || "unknown-project";
35
- }
36
- function getCurrentBranch(projectDir) {
37
- try {
38
- const branch = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
39
- cwd: requireProjectDir(projectDir),
40
- encoding: "utf-8",
41
- timeout: 5e3,
42
- stdio: ["pipe", "pipe", "pipe"]
43
- }).trim();
44
- if (branch && branch !== "HEAD") return branch;
45
- } catch {
46
- }
47
- return "main";
48
- }
49
- function projectCodemapDir(projectDir) {
50
- return join(CODEMAP_DIR, codemapProjectSlug(requireProjectDir(projectDir)));
51
- }
52
- function codemapBranchDir(projectDir, branch) {
53
- return join(projectCodemapDir(projectDir), branchToSlug(branch));
54
- }
55
- function resolveUsername() {
56
- try {
57
- if (existsSync(SETTINGS_FILE)) {
58
- const raw = JSON.parse(readFileSync(SETTINGS_FILE, "utf-8"));
59
- if (typeof raw.username === "string" && raw.username) {
60
- return raw.username.toLowerCase();
61
- }
62
- }
63
- } catch {
64
- }
65
- try {
66
- const login = execFileSync("gh", ["api", "user", "--jq", ".login"], {
67
- encoding: "utf-8",
68
- timeout: 5e3,
69
- stdio: ["pipe", "pipe", "pipe"]
70
- }).trim();
71
- if (login) return login.toLowerCase();
72
- } catch {
73
- }
74
- return userInfo().username.toLowerCase();
75
- }
76
- function getCodemapBranch(branch) {
77
- return `${CODEMAP_BRANCH_PREFIX}-${branchToSlug(branch)}`;
78
- }
79
- function getHistoryBranch() {
80
- return `${HISTORY_BRANCH_PREFIX}-${resolveUsername()}`;
81
- }
82
- function codemapConfigFile(projectDir) {
83
- return join(projectCodemapDir(projectDir), "config.json");
84
- }
85
- function codemapManifestFile(projectDir, branch) {
86
- return join(codemapBranchDir(projectDir, branch), "manifest.json");
87
- }
88
- function codemapSchemaFile(projectDir, branch) {
89
- return join(codemapBranchDir(projectDir, branch), "schema.json");
90
- }
91
- function codemapStatsFile(projectDir, branch) {
92
- return join(codemapBranchDir(projectDir, branch), "stats.json");
93
- }
94
- function codemapLanceDir(projectDir, branch) {
95
- return join(codemapBranchDir(projectDir, branch), "index", "lance");
96
- }
97
- function codemapMetadataDir(projectDir, branch) {
98
- return join(codemapBranchDir(projectDir, branch), "index", "metadata");
99
- }
100
- function depgraphDir(projectDir, branch) {
101
- return join(codemapBranchDir(projectDir, branch), "index", "metadata", "depgraph");
102
- }
103
- function depgraphGraphFile(projectDir, branch) {
104
- return join(depgraphDir(projectDir, branch), "graph.json");
105
- }
106
- function depgraphPagerankFile(projectDir, branch) {
107
- return join(depgraphDir(projectDir, branch), "pagerank.json");
108
- }
109
- function depgraphMetricsFile(projectDir, branch) {
110
- return join(depgraphDir(projectDir, branch), "metrics.json");
111
- }
112
- function depgraphCacheFile(projectDir, branch) {
113
- return join(depgraphDir(projectDir, branch), "tags-cache.json");
114
- }
115
- var MEMORY_DIR = join(ULPI_GLOBAL_DIR, "memory");
116
- var MEMORY_BRANCH_PREFIX = "ulpi/memory";
117
- function memoryProjectSlug(dir) {
118
- const slug = dir.replace(/^\//, "").replace(/\//g, "-").replace(/\./g, "_").replace(/-{2,}/g, "-").replace(/^-|-$/g, "").toLowerCase();
119
- return slug || "unknown-project";
120
- }
121
- function getMemoryBranch() {
122
- return `${MEMORY_BRANCH_PREFIX}-${resolveUsername()}`;
123
- }
124
- function projectMemoryDir(projectDir) {
125
- return join(MEMORY_DIR, memoryProjectSlug(requireProjectDir(projectDir)));
126
- }
127
- function memoryConfigFile(projectDir) {
128
- return join(projectMemoryDir(projectDir), "config.json");
129
- }
130
- function memoryIndexDir(projectDir) {
131
- return join(projectMemoryDir(projectDir), "index");
132
- }
133
- function memoryLanceDir(projectDir) {
134
- return join(projectMemoryDir(projectDir), "index", "lance");
135
- }
136
- function memoryEntriesDir(projectDir) {
137
- return join(projectMemoryDir(projectDir), "entries");
138
- }
139
- function memoryHistoryDir(projectDir) {
140
- return join(projectMemoryDir(projectDir), "history");
141
- }
142
- function memoryWatermarksDir(projectDir) {
143
- return join(projectMemoryDir(projectDir), "watermarks");
144
- }
145
- function memoryStatsFile(projectDir) {
146
- return join(projectMemoryDir(projectDir), "stats.json");
147
- }
148
- function memoryPromptsDir(projectDir) {
149
- return join(projectMemoryDir(projectDir), "prompts");
150
- }
151
- var CLI_BIN_NAME = "ulpi";
152
- function getBinaryPath() {
153
- if (process.env.ULPI_CI_MODE) return CLI_BIN_NAME;
154
- if (process.argv[1] && process.argv[1].includes("node_modules")) {
155
- return CLI_BIN_NAME;
156
- }
157
- return `node "${resolve(process.argv[1])}"`;
158
- }
159
- var CLI_NPM_PACKAGE = "@ulpi/cli";
160
- var CLI_REGISTRY_URL = `https://registry.npmjs.org/${CLI_NPM_PACKAGE}/latest`;
161
- var NO_AUTO_GEN_FILE = ".no-auto-gen";
162
- var LAUNCHD_LABEL = "com.ulpi.ui";
163
- function requireProjectDir(projectDir) {
164
- if (!projectDir || !projectDir.trim()) {
165
- throw new Error("projectDir must be a non-empty string");
166
- }
167
- return projectDir;
168
- }
169
- function projectConfigDir(projectDir) {
170
- return join(requireProjectDir(projectDir), ULPI_PROJECT_DIR);
171
- }
172
- function projectGuardsFile(projectDir) {
173
- return join(requireProjectDir(projectDir), ULPI_PROJECT_DIR, GUARDS_FILENAME);
174
- }
175
- function projectGuardsFileAlt(projectDir) {
176
- return join(requireProjectDir(projectDir), ULPI_PROJECT_DIR, GUARDS_FILENAME_ALT);
177
- }
178
- function globalGuardsFile() {
179
- return join(ULPI_GLOBAL_DIR, GUARDS_FILENAME);
180
- }
181
- function projectNoAutoGenFile(projectDir) {
182
- return join(requireProjectDir(projectDir), ULPI_PROJECT_DIR, NO_AUTO_GEN_FILE);
183
- }
184
- function getAnthropicApiKey() {
185
- return process.env.ANTHROPIC_API_KEY;
186
- }
187
- function isDebugMode() {
188
- return process.env.ULPI_DEBUG === "1" || process.env.ULPI_DEBUG === "true";
189
- }
190
- function getApiPort() {
191
- const port = process.env.ULPI_API_PORT;
192
- if (!port) return 9800;
193
- const parsed = parseInt(port, 10);
194
- if (Number.isNaN(parsed) || parsed < 1 || parsed > 65535) return 9800;
195
- return parsed;
196
- }
197
- function getApiHost() {
198
- return process.env.ULPI_API_HOST || "127.0.0.1";
199
- }
200
- function isCI() {
201
- return process.env.CI === "true" || process.env.CI === "1";
202
- }
203
- var DEFAULT_AI_MODEL = "claude-sonnet-4-20250514";
204
- var DEFAULT_SETTINGS = {
205
- review: {
206
- enabled: true,
207
- plan_review: true,
208
- code_review: true,
209
- auto_open_browser: true,
210
- require_server: false,
211
- review_timeout_seconds: 0,
212
- timeout_behavior: "allow",
213
- default_export_format: "markdown",
214
- webhook_url: ""
215
- },
216
- apiKeys: {}
217
- };
218
- function loadUlpiSettings() {
219
- try {
220
- const p = SETTINGS_FILE;
221
- if (!existsSync2(p)) return { ...DEFAULT_SETTINGS };
222
- const raw = JSON.parse(readFileSync2(p, "utf-8"));
223
- return {
224
- review: { ...DEFAULT_SETTINGS.review, ...raw.review },
225
- apiKeys: { ...DEFAULT_SETTINGS.apiKeys, ...raw.apiKeys },
226
- username: typeof raw.username === "string" ? raw.username : void 0,
227
- ulpiUrl: typeof raw.ulpiUrl === "string" ? raw.ulpiUrl : void 0
228
- };
229
- } catch {
230
- return { ...DEFAULT_SETTINGS };
231
- }
232
- }
233
- function resolveApiKey(provider) {
234
- const settings = loadUlpiSettings();
235
- const fromSettings = settings.apiKeys?.[provider];
236
- if (fromSettings) return fromSettings;
237
- const envMap = {
238
- openai: "OPENAI_API_KEY",
239
- anthropic: "ANTHROPIC_API_KEY",
240
- ulpi: "ULPI_API_KEY"
241
- };
242
- return process.env[envMap[provider]];
243
- }
244
- var DEFAULT_ULPI_URL = "http://localhost:10271";
245
- function resolveUlpiUrl() {
246
- const settings = loadUlpiSettings();
247
- if (settings.ulpiUrl) return settings.ulpiUrl;
248
- return process.env.ULPI_EMBED_URL ?? DEFAULT_ULPI_URL;
249
- }
250
- function saveUlpiSettings(settings) {
251
- const p = SETTINGS_FILE;
252
- const dir = dirname(p);
253
- if (!existsSync2(dir)) mkdirSync(dir, { recursive: true });
254
- writeFileSync(p, JSON.stringify(settings, null, 2) + "\n");
255
- }
256
-
257
- export {
258
- ULPI_GLOBAL_DIR,
259
- ULPI_PROJECT_DIR,
260
- GUARDS_FILENAME,
261
- GUARDS_FILENAME_ALT,
262
- SESSIONS_DIR,
263
- REVIEWS_DIR,
264
- REVIEW_FLAGS_DIR,
265
- REVIEW_IMAGES_DIR,
266
- PROJECTS_FILE,
267
- USER_TEMPLATES_DIR,
268
- USER_SKILLS_DIR,
269
- VERSION_CACHE_FILE,
270
- SETTINGS_FILE,
271
- LOGS_DIR,
272
- NOTIFICATIONS_LOG_FILE,
273
- API_LOCK_FILE,
274
- HISTORY_BRANCH_PREFIX,
275
- CODEMAP_DIR_NAME,
276
- CODEMAP_DIR,
277
- CODEMAP_BRANCH_PREFIX,
278
- branchToSlug,
279
- codemapProjectSlug,
280
- getCurrentBranch,
281
- projectCodemapDir,
282
- codemapBranchDir,
283
- resolveUsername,
284
- getCodemapBranch,
285
- getHistoryBranch,
286
- codemapConfigFile,
287
- codemapManifestFile,
288
- codemapSchemaFile,
289
- codemapStatsFile,
290
- codemapLanceDir,
291
- codemapMetadataDir,
292
- depgraphDir,
293
- depgraphGraphFile,
294
- depgraphPagerankFile,
295
- depgraphMetricsFile,
296
- depgraphCacheFile,
297
- MEMORY_DIR,
298
- MEMORY_BRANCH_PREFIX,
299
- memoryProjectSlug,
300
- getMemoryBranch,
301
- projectMemoryDir,
302
- memoryConfigFile,
303
- memoryIndexDir,
304
- memoryLanceDir,
305
- memoryEntriesDir,
306
- memoryHistoryDir,
307
- memoryWatermarksDir,
308
- memoryStatsFile,
309
- memoryPromptsDir,
310
- CLI_BIN_NAME,
311
- getBinaryPath,
312
- CLI_NPM_PACKAGE,
313
- CLI_REGISTRY_URL,
314
- NO_AUTO_GEN_FILE,
315
- LAUNCHD_LABEL,
316
- projectConfigDir,
317
- projectGuardsFile,
318
- projectGuardsFileAlt,
319
- globalGuardsFile,
320
- projectNoAutoGenFile,
321
- getAnthropicApiKey,
322
- isDebugMode,
323
- getApiPort,
324
- getApiHost,
325
- isCI,
326
- DEFAULT_AI_MODEL,
327
- loadUlpiSettings,
328
- resolveApiKey,
329
- resolveUlpiUrl,
330
- saveUlpiSettings
331
- };