spec-cat 0.1.28 → 0.1.29

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 (49) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{DykekIOz.js → BYSSU_C5.js} +1 -1
  3. package/.output/public/_nuxt/{DXzkgxwX.js → BuAdOXGq.js} +1 -1
  4. package/.output/public/_nuxt/BvFtAA65.js +85 -0
  5. package/.output/public/_nuxt/{DJnEVOKq.js → C3xB8Cgs.js} +1 -1
  6. package/.output/public/_nuxt/{DSUO3OjT.js → C7HUOCmf.js} +1 -1
  7. package/.output/public/_nuxt/{BnjcVEL-.js → CjahVUNV.js} +1 -1
  8. package/.output/public/_nuxt/{XuDblT7a.js → DHRTMwte.js} +1 -1
  9. package/.output/public/_nuxt/{BRd9HFwL.js → DJrEvjo-.js} +2 -2
  10. package/.output/public/_nuxt/{C6ilGlzF.js → DL_gJOgv.js} +1 -1
  11. package/.output/public/_nuxt/{2nXTHzKg.js → DWfl6VER.js} +1 -1
  12. package/.output/public/_nuxt/{DWeUOMg4.js → Dpc_a9DZ.js} +1 -1
  13. package/.output/public/_nuxt/{80f7bXLB.js → WBf5CG5l.js} +1 -1
  14. package/.output/public/_nuxt/builds/latest.json +1 -1
  15. package/.output/public/_nuxt/builds/meta/65ae0c7c-58de-4f20-a97f-c1be9bfe34bb.json +1 -0
  16. package/.output/public/_nuxt/{default.D3bZ26KV.css → default.D9amvrGI.css} +1 -1
  17. package/.output/public/_nuxt/entry.D8StCG4P.css +1 -0
  18. package/.output/public/_nuxt/ggQsoUsu.js +1 -0
  19. package/.output/server/chunks/_/aiProviderSelection.mjs +1 -1
  20. package/.output/server/chunks/_/claude.mjs +1 -1
  21. package/.output/server/chunks/_/claudeService.mjs +1 -1
  22. package/.output/server/chunks/_/conversationStore.mjs +1 -1
  23. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  24. package/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
  25. package/.output/server/chunks/nitro/nitro.mjs +657 -657
  26. package/.output/server/chunks/routes/api/conversations/_conversationId/archive.post.mjs +1 -1
  27. package/.output/server/chunks/routes/api/conversations/archives/_archiveId/restore.post.mjs +1 -1
  28. package/.output/server/chunks/routes/api/conversations/archives/_archiveId_.delete.mjs +1 -1
  29. package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs +1 -1
  30. package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs +1 -1
  31. package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs +1 -1
  32. package/.output/server/chunks/routes/api/jobs/_id_.get.mjs +1 -1
  33. package/.output/server/chunks/routes/api/rebase/ai-resolve.post.mjs +208 -32
  34. package/.output/server/chunks/routes/api/rebase/ai-resolve.post.mjs.map +1 -1
  35. package/.output/server/chunks/routes/api/settings.get.mjs +1 -1
  36. package/.output/server/chunks/routes/api/settings.post.mjs +1 -1
  37. package/.output/server/chunks/routes/api/skills/_skillId/prompt.post.mjs +1 -1
  38. package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.get.mjs +1 -1
  39. package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.put.mjs +1 -1
  40. package/.output/server/chunks/routes/api/specs/traceability/_featureId_.get.mjs +1 -1
  41. package/.output/server/chunks/routes/api/worktrees/_name/switch.post.mjs +1 -1
  42. package/.output/server/chunks/routes/api/worktrees/_name_.delete.mjs +1 -1
  43. package/.output/server/node_modules/onnxruntime-node/bin/napi-v3/linux/x64/libonnxruntime.so.1.14.0 +0 -0
  44. package/.output/server/package.json +1 -1
  45. package/package.json +1 -1
  46. package/.output/public/_nuxt/CoA0shxq.js +0 -93
  47. package/.output/public/_nuxt/builds/meta/28d9e18f-8df1-4f6c-a452-5573f8625b68.json +0 -1
  48. package/.output/public/_nuxt/entry.B1b8QW5b.css +0 -1
  49. package/.output/public/_nuxt/xtHaEzqj.js +0 -1
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError, e as getProjectDir, l as logger } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError, e as getProjectDir, l as logger } from '../../../../nitro/nitro.mjs';
2
2
  import { exec } from 'node:child_process';
3
3
  import { existsSync } from 'node:fs';
4
4
  import { rm } from 'node:fs/promises';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, b as readBody, c as createError, e as getProjectDir, l as logger } from '../../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, b as readBody, c as createError, e as getProjectDir, l as logger } from '../../../../../nitro/nitro.mjs';
2
2
  import { exec } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
4
  import { r as readConversationStorageState, a as generateConversationId, w as writeConversationStorageState } from '../../../../../_/conversationStore.mjs';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
2
2
  import { r as readConversationStorageState, w as writeConversationStorageState } from '../../../../_/conversationStore.mjs';
3
3
  import 'node:http';
4
4
  import 'node:https';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
2
2
  import { h as getCommitDetail } from '../../../../_/git.mjs';
3
3
  import { a as resolveWorkingDirectoryFromQuery, h as handleGitApiError } from '../../../../_/gitApiHelpers.mjs';
4
4
  import 'node:http';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
2
2
  import { V as getTagDetail } from '../../../../_/git.mjs';
3
3
  import { a as resolveWorkingDirectoryFromQuery, h as handleGitApiError } from '../../../../_/gitApiHelpers.mjs';
4
4
  import 'node:http';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
2
2
  import { j as jobQueue } from '../../../../_/jobQueue.mjs';
3
3
  import 'node:http';
4
4
  import 'node:https';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError, f as getQuery } from '../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError, f as getQuery } from '../../../nitro/nitro.mjs';
2
2
  import { j as jobQueue } from '../../../_/jobQueue.mjs';
3
3
  import 'node:http';
4
4
  import 'node:https';
@@ -1,7 +1,8 @@
1
- import { d as defineEventHandler, b as readBody, c as createError } from '../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, b as readBody, c as createError, l as logger } from '../../../nitro/nitro.mjs';
2
2
  import { v as validateWorktreePath, a as validateFilePath } from '../../../_/validateWorktree.mjs';
3
- import { s as sendMessage } from '../../../_/claudeService.mjs';
4
- import { g as getServerProviderSelection, D as DEFAULT_MODEL_KEY } from '../../../_/aiProviderSelection.mjs';
3
+ import { g as getServerProviderSelection } from '../../../_/aiProviderSelection.mjs';
4
+ import { a as getClaudeCliPath, g as getClaudeModelId } from '../../../_/claude.mjs';
5
+ import { spawn } from 'node:child_process';
5
6
  import 'node:http';
6
7
  import 'node:https';
7
8
  import 'node:crypto';
@@ -23,10 +24,182 @@ import 'node:os';
23
24
  import 'node:module';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
- import 'node:child_process';
27
- import '../../../_/claude.mjs';
28
27
  import '../../../_/aiProviderRegistry.mjs';
29
28
 
29
+ const CONTEXT_LINES = 5;
30
+ function extractConflictBlocks(content) {
31
+ const lines = content.split("\n");
32
+ const blocks = [];
33
+ let i = 0;
34
+ while (i < lines.length) {
35
+ if (/^<{7}\s/.test(lines[i])) {
36
+ const startLine = i;
37
+ let separatorLine = -1;
38
+ let endLine = -1;
39
+ for (let j = i + 1; j < lines.length; j++) {
40
+ if (/^={7}$/.test(lines[j]) && separatorLine === -1) {
41
+ separatorLine = j;
42
+ } else if (/^>{7}\s/.test(lines[j])) {
43
+ endLine = j;
44
+ break;
45
+ }
46
+ }
47
+ if (separatorLine !== -1 && endLine !== -1) {
48
+ const ctxStart = Math.max(0, startLine - CONTEXT_LINES);
49
+ const ctxEnd = Math.min(lines.length - 1, endLine + CONTEXT_LINES);
50
+ const contextLines = lines.slice(ctxStart, ctxEnd + 1);
51
+ const ours = lines.slice(startLine + 1, separatorLine).join("\n");
52
+ const theirs = lines.slice(separatorLine + 1, endLine).join("\n");
53
+ blocks.push({
54
+ startLine,
55
+ endLine,
56
+ contextSnippet: contextLines.join("\n"),
57
+ ours,
58
+ theirs
59
+ });
60
+ i = endLine + 1;
61
+ continue;
62
+ }
63
+ }
64
+ i++;
65
+ }
66
+ return { lines, blocks };
67
+ }
68
+ async function resolveWithCli(prompt, cwd, modelKey) {
69
+ const cliPath = getClaudeCliPath();
70
+ const modelId = getClaudeModelId(modelKey);
71
+ const args = [
72
+ "-p",
73
+ prompt,
74
+ "--output-format",
75
+ "stream-json",
76
+ "--verbose",
77
+ "--model",
78
+ modelId,
79
+ "--max-turns",
80
+ "1",
81
+ "--dangerously-skip-permissions"
82
+ ];
83
+ const proc = spawn(cliPath, args, {
84
+ cwd,
85
+ env: { ...process.env, NODE_NO_WARNINGS: "1" },
86
+ stdio: ["pipe", "pipe", "pipe"]
87
+ });
88
+ proc.stdin.end();
89
+ let lineBuffer = "";
90
+ let resultText = "";
91
+ const parseLine = (line) => {
92
+ if (!line.trim()) return;
93
+ try {
94
+ const msg = JSON.parse(line);
95
+ if (msg.type === "assistant" && typeof msg.message === "object" && msg.message) {
96
+ const message = msg.message;
97
+ if (Array.isArray(message.content)) {
98
+ for (const block of message.content) {
99
+ if (block.type === "text" && block.text) {
100
+ resultText += block.text;
101
+ }
102
+ }
103
+ }
104
+ }
105
+ } catch {
106
+ }
107
+ };
108
+ proc.stdout.on("data", (chunk) => {
109
+ lineBuffer += chunk.toString();
110
+ const lines = lineBuffer.split("\n");
111
+ lineBuffer = lines.pop() || "";
112
+ for (const line of lines) parseLine(line);
113
+ });
114
+ const errorChunks = [];
115
+ proc.stderr.on("data", (chunk) => {
116
+ errorChunks.push(chunk.toString());
117
+ });
118
+ return await new Promise((resolve) => {
119
+ proc.on("close", (code) => {
120
+ if (lineBuffer.trim()) parseLine(lineBuffer);
121
+ if (code === 0) {
122
+ resolve({ success: true, text: resultText });
123
+ } else {
124
+ const stderr = errorChunks.join("").trim();
125
+ resolve({ success: false, error: `CLI exited with code ${code}: ${stderr}`, text: resultText });
126
+ }
127
+ });
128
+ });
129
+ }
130
+ function extractResolved(raw, marker) {
131
+ const startTag = `===BLOCK_${marker}_START===`;
132
+ const endTag = `===BLOCK_${marker}_END===`;
133
+ const startIdx = raw.indexOf(startTag);
134
+ const endIdx = raw.indexOf(endTag);
135
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
136
+ return raw.slice(startIdx + startTag.length, endIdx).replace(/^\n/, "").replace(/\n$/, "");
137
+ }
138
+ const codeBlockMatch = raw.match(/```[\w]*\n([\s\S]*?)\n```/);
139
+ if (codeBlockMatch) {
140
+ return codeBlockMatch[1];
141
+ }
142
+ if (/^<{7}\s/m.test(raw)) {
143
+ return null;
144
+ }
145
+ const trimmed = raw.trim();
146
+ if (/^(Now |Here |Let me |I'll |I can |I've |The |This |Looking |Analyzing |Resolved |Conflict )/i.test(trimmed)) {
147
+ return null;
148
+ }
149
+ if (/^\*\*/.test(trimmed) || /^#+\s/.test(trimmed)) {
150
+ return null;
151
+ }
152
+ return trimmed || null;
153
+ }
154
+ function buildBlockPrompt(filePath, blocks, userGuidance) {
155
+ const guidanceLine = userGuidance ? `
156
+ User guidance: ${userGuidance}` : "";
157
+ if (blocks.length === 1) {
158
+ const b = blocks[0];
159
+ return `Resolve this Git merge conflict. Output ONLY the resolved code between the markers.
160
+
161
+ RULES:
162
+ - Remove ALL conflict markers (<<<<<<< ======= >>>>>>>)
163
+ - Merge both sides, preserving the intent of both changes
164
+ - Output only the replacement for the conflict block, not the surrounding context
165
+ ${guidanceLine}
166
+
167
+ OUTPUT FORMAT (strict):
168
+ ===BLOCK_1_START===
169
+ <resolved code replacing the conflict>
170
+ ===BLOCK_1_END===
171
+
172
+ No text before ===BLOCK_1_START=== or after ===BLOCK_1_END===.
173
+
174
+ File: ${filePath}
175
+ Conflict with context:
176
+ ${b.contextSnippet}`;
177
+ }
178
+ const blockSections = blocks.map((b, i) => {
179
+ return `--- CONFLICT ${i + 1} ---
180
+ ${b.contextSnippet}`;
181
+ }).join("\n\n");
182
+ const outputFormat = blocks.map((_, i) => {
183
+ return `===BLOCK_${i + 1}_START===
184
+ <resolved code for conflict ${i + 1}>
185
+ ===BLOCK_${i + 1}_END===`;
186
+ }).join("\n");
187
+ return `Resolve ${blocks.length} Git merge conflicts in file "${filePath}". Output ONLY the resolved code for each block between its markers.
188
+
189
+ RULES:
190
+ - Remove ALL conflict markers (<<<<<<< ======= >>>>>>>)
191
+ - Merge both sides, preserving the intent of both changes
192
+ - Output only the replacement for each conflict block, not surrounding context
193
+ - Maintain output order matching the conflict order
194
+ ${guidanceLine}
195
+
196
+ OUTPUT FORMAT (strict \u2014 one section per conflict):
197
+ ${outputFormat}
198
+
199
+ No text before the first marker or after the last marker. No explanations.
200
+
201
+ ${blockSections}`;
202
+ }
30
203
  const aiResolve_post = defineEventHandler(async (event) => {
31
204
  const body = await readBody(event);
32
205
  if (!(body == null ? void 0 : body.worktreePath) || !(body == null ? void 0 : body.filePath) || !(body == null ? void 0 : body.conflictContent)) {
@@ -35,36 +208,39 @@ const aiResolve_post = defineEventHandler(async (event) => {
35
208
  validateWorktreePath(body.worktreePath);
36
209
  validateFilePath(body.filePath);
37
210
  const selection = await getServerProviderSelection();
38
- const modelKey = selection.providerId === "claude" ? selection.modelKey : DEFAULT_MODEL_KEY;
39
- const prompt = `You are a merge conflict resolution expert. Resolve the following Git merge conflict in the file "${body.filePath}".
40
-
41
- The file contains Git conflict markers:
42
- - \`<<<<<<< HEAD\` marks the start of "ours" (current branch) changes
43
- - \`=======\` separates the two versions
44
- - \`>>>>>>> ...\` marks the end of "theirs" (incoming branch) changes
45
-
46
- Your task:
47
- 1. Analyze both sides of each conflict
48
- 2. Produce the best merged result that preserves the intent of both changes
49
- 3. If both sides add different things, include both in a logical order
50
- 4. If both sides modify the same thing differently, choose the most complete/correct version or combine them
51
- 5. Remove ALL conflict markers (<<<<<<, =======, >>>>>>>)
52
-
53
- IMPORTANT: Output ONLY the complete resolved file content. No explanations, no markdown code blocks, no comments about the resolution. Just the raw file content.
54
-
55
- File content with conflicts:
56
- ${body.conflictContent}`;
211
+ const { lines, blocks } = extractConflictBlocks(body.conflictContent);
212
+ if (blocks.length === 0) {
213
+ return { success: true, resolvedContent: body.conflictContent };
214
+ }
215
+ const prompt = buildBlockPrompt(body.filePath, blocks, body.userGuidance);
57
216
  try {
58
- const result = await sendMessage(prompt, body.worktreePath, modelKey);
59
- if (result.success && result.text) {
60
- let resolved = result.text;
61
- const codeBlockMatch = resolved.match(/^```[\w]*\n([\s\S]*?)\n```$/m);
62
- if (codeBlockMatch) {
63
- resolved = codeBlockMatch[1];
217
+ const result = await resolveWithCli(prompt, body.worktreePath, selection.modelKey);
218
+ if (!result.success || !result.text) {
219
+ return { success: false, error: result.error || "AI resolution failed" };
220
+ }
221
+ const resolvedBlocks = [];
222
+ for (let i = 0; i < blocks.length; i++) {
223
+ const resolved = extractResolved(result.text, String(i + 1));
224
+ if (resolved === null) {
225
+ logger.chat.error("Failed to extract resolved block from AI response", {
226
+ filePath: body.filePath,
227
+ blockIndex: i,
228
+ responsePreview: result.text.slice(0, 300)
229
+ });
230
+ return {
231
+ success: false,
232
+ error: `Failed to extract resolved content for conflict block ${i + 1}/${blocks.length}. AI may have output commentary instead of code.`
233
+ };
64
234
  }
65
- return { success: true, resolvedContent: resolved };
235
+ resolvedBlocks.push(resolved);
236
+ }
237
+ const resultLines = [...lines];
238
+ for (let i = blocks.length - 1; i >= 0; i--) {
239
+ const block = blocks[i];
240
+ const replacementLines = resolvedBlocks[i].split("\n");
241
+ resultLines.splice(block.startLine, block.endLine - block.startLine + 1, ...replacementLines);
66
242
  }
67
- return { success: false, error: result.error || "AI resolution failed" };
243
+ return { success: true, resolvedContent: resultLines.join("\n") };
68
244
  } catch (error) {
69
245
  const message = error instanceof Error ? error.message : String(error);
70
246
  return { success: false, error: message };
@@ -1 +1 @@
1
- {"version":3,"file":"ai-resolve.post.mjs","sources":["../../../../../../server/api/rebase/ai-resolve.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,uBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AAEA,EAAA,IAAA,EAAA,6BAAA,YAAA,CAAA,IAAA,EAAA,6BAAA,QAAA,CAAA,IAAA,EAAA,6BAAA,eAAA,CAAA,EAAA;AACA,IAAA,MAAA,YAAA,EAAA,UAAA,EAAA,GAAA,EAAA,OAAA,EAAA,4DAAA,CAAA;AAAA,EACA;AAEA,EAAA,oBAAA,CAAA,KAAA,YAAA,CAAA;AACA,EAAA,gBAAA,CAAA,KAAA,QAAA,CAAA;AAEA,EAAA,MAAA,SAAA,GAAA,MAAA,0BAAA,EAAA;AACA,EAAA,MAAA,QAAA,GAAA,SAAA,CAAA,UAAA,KAAA,QAAA,GAAA,UAAA,QAAA,GAAA,iBAAA;AAEA,EAAA,MAAA,MAAA,GAAA,CAAA,kGAAA,EAAA,IAAA,CAAA,QAAA,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,EAiBA,KAAA,eAAA,CAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,MAAA,SAAA,MAAA,WAAA,CAAA,MAAA,EAAA,IAAA,CAAA,cAAA,QAAA,CAAA;AAEA,IAAA,IAAA,MAAA,CAAA,OAAA,IAAA,MAAA,CAAA,IAAA,EAAA;AAEA,MAAA,IAAA,WAAA,MAAA,CAAA,IAAA;AACA,MAAA,MAAA,cAAA,GAAA,QAAA,CAAA,KAAA,CAAA,8BAAA,CAAA;AACA,MAAA,IAAA,cAAA,EAAA;AACA,QAAA,QAAA,GAAA,eAAA,CAAA,CAAA;AAAA,MACA;AAEA,MAAA,OAAA,EAAA,OAAA,EAAA,IAAA,EAAA,eAAA,EAAA,QAAA,EAAA;AAAA,IACA;AAEA,IAAA,OAAA,EAAA,OAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,CAAA,SAAA,sBAAA,EAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,UAAA,KAAA,YAAA,KAAA,GAAA,KAAA,CAAA,OAAA,GAAA,OAAA,KAAA,CAAA;AACA,IAAA,OAAA,EAAA,OAAA,EAAA,KAAA,EAAA,KAAA,EAAA,OAAA,EAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"ai-resolve.post.mjs","sources":["../../../../../../server/api/rebase/ai-resolve.post.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, i as readSpecCatStore } from '../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, h as readSpecCatStore } from '../../nitro/nitro.mjs';
2
2
  import { r as resolveServerProviderSelection, D as DEFAULT_MODEL_KEY, c as DEFAULT_PROVIDER_ID } from '../../_/aiProviderSelection.mjs';
3
3
  import 'node:http';
4
4
  import 'node:https';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, b as readBody, c as createError, i as readSpecCatStore, w as writeSpecCatStore } from '../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, b as readBody, c as createError, h as readSpecCatStore, w as writeSpecCatStore } from '../../nitro/nitro.mjs';
2
2
  import { r as resolveServerProviderSelection, c as DEFAULT_PROVIDER_ID } from '../../_/aiProviderSelection.mjs';
3
3
  import 'node:http';
4
4
  import 'node:https';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError, b as readBody, e as getProjectDir } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError, b as readBody, e as getProjectDir } from '../../../../nitro/nitro.mjs';
2
2
  import { readdir } from 'node:fs/promises';
3
3
  import { existsSync } from 'node:fs';
4
4
  import { resolve, join } from 'node:path';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError, e as getProjectDir } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError, e as getProjectDir } from '../../../../nitro/nitro.mjs';
2
2
  import { readFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import 'node:http';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError, b as readBody, e as getProjectDir } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError, b as readBody, e as getProjectDir } from '../../../../nitro/nitro.mjs';
2
2
  import { writeFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import 'node:http';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, c as createError, e as getProjectDir } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, c as createError, e as getProjectDir } from '../../../../nitro/nitro.mjs';
2
2
  import { join } from 'node:path';
3
3
  import { b as buildTraceabilityResponse } from '../../../../_/traceability.mjs';
4
4
  import 'node:http';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, f as getQuery, e as getProjectDir, c as createError, l as logger } from '../../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, f as getQuery, e as getProjectDir, c as createError, l as logger } from '../../../../nitro/nitro.mjs';
2
2
  import { exec } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
4
  import 'node:http';
@@ -1,4 +1,4 @@
1
- import { d as defineEventHandler, h as getRouterParam, f as getQuery, e as getProjectDir, c as createError, l as logger } from '../../../nitro/nitro.mjs';
1
+ import { d as defineEventHandler, i as getRouterParam, f as getQuery, e as getProjectDir, c as createError, l as logger } from '../../../nitro/nitro.mjs';
2
2
  import { exec } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
4
  import { existsSync } from 'node:fs';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-cat-prod",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-cat",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "description": "Spec-driven development workbench",
5
5
  "license": "MIT",
6
6
  "keywords": [