specweave 0.30.11 → 0.30.13

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 (134) hide show
  1. package/dist/src/cli/commands/init.d.ts.map +1 -1
  2. package/dist/src/cli/commands/init.js +25 -2
  3. package/dist/src/cli/commands/init.js.map +1 -1
  4. package/dist/src/cli/helpers/ado-area-selector.d.ts.map +1 -1
  5. package/dist/src/cli/helpers/ado-area-selector.js +13 -0
  6. package/dist/src/cli/helpers/ado-area-selector.js.map +1 -1
  7. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +5 -1
  8. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
  9. package/dist/src/cli/helpers/init/living-docs-preflight.js +80 -28
  10. package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
  11. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  12. package/dist/src/cli/helpers/issue-tracker/index.js +7 -2
  13. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  14. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts +7 -0
  15. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -1
  16. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +33 -2
  17. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -1
  18. package/dist/src/cli/workers/brownfield-worker.d.ts +13 -0
  19. package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -1
  20. package/dist/src/cli/workers/brownfield-worker.js +154 -0
  21. package/dist/src/cli/workers/brownfield-worker.js.map +1 -1
  22. package/dist/src/cli/workers/clone-worker.js +19 -3
  23. package/dist/src/cli/workers/clone-worker.js.map +1 -1
  24. package/dist/src/cli/workers/living-docs-worker.js +272 -11
  25. package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
  26. package/dist/src/core/background/brownfield-launcher.d.ts +2 -1
  27. package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -1
  28. package/dist/src/core/background/brownfield-launcher.js.map +1 -1
  29. package/dist/src/core/background/types.d.ts +10 -2
  30. package/dist/src/core/background/types.d.ts.map +1 -1
  31. package/dist/src/core/discrepancy/brownfield-types.d.ts +3 -1
  32. package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -1
  33. package/dist/src/core/living-docs/board-matcher.d.ts +120 -0
  34. package/dist/src/core/living-docs/board-matcher.d.ts.map +1 -0
  35. package/dist/src/core/living-docs/board-matcher.js +466 -0
  36. package/dist/src/core/living-docs/board-matcher.js.map +1 -0
  37. package/dist/src/core/living-docs/feature-archiver.d.ts +39 -0
  38. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  39. package/dist/src/core/living-docs/feature-archiver.js +197 -0
  40. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  41. package/dist/src/core/living-docs/foundation-builder.js +1 -1
  42. package/dist/src/core/living-docs/foundation-builder.js.map +1 -1
  43. package/dist/src/core/living-docs/living-docs-sync.d.ts +19 -8
  44. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  45. package/dist/src/core/living-docs/living-docs-sync.js +148 -52
  46. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  47. package/dist/src/core/living-docs/suggestions-generator.js +1 -1
  48. package/dist/src/core/living-docs/suggestions-generator.js.map +1 -1
  49. package/dist/src/core/living-docs/umbrella-detector.d.ts +4 -0
  50. package/dist/src/core/living-docs/umbrella-detector.d.ts.map +1 -1
  51. package/dist/src/core/living-docs/umbrella-detector.js +20 -1
  52. package/dist/src/core/living-docs/umbrella-detector.js.map +1 -1
  53. package/dist/src/core/living-docs/workitem-matcher.js +5 -5
  54. package/dist/src/core/living-docs/workitem-matcher.js.map +1 -1
  55. package/dist/src/core/llm/availability-messages.d.ts +33 -0
  56. package/dist/src/core/llm/availability-messages.d.ts.map +1 -0
  57. package/dist/src/core/llm/availability-messages.js +170 -0
  58. package/dist/src/core/llm/availability-messages.js.map +1 -0
  59. package/dist/src/core/llm/index.d.ts +34 -0
  60. package/dist/src/core/llm/index.d.ts.map +1 -0
  61. package/dist/src/core/llm/index.js +35 -0
  62. package/dist/src/core/llm/index.js.map +1 -0
  63. package/dist/src/core/llm/provider-factory.d.ts +48 -0
  64. package/dist/src/core/llm/provider-factory.d.ts.map +1 -0
  65. package/dist/src/core/llm/provider-factory.js +274 -0
  66. package/dist/src/core/llm/provider-factory.js.map +1 -0
  67. package/dist/src/core/llm/providers/anthropic-provider.d.ts +66 -0
  68. package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -0
  69. package/dist/src/core/llm/providers/anthropic-provider.js +195 -0
  70. package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -0
  71. package/dist/src/core/llm/providers/azure-openai-provider.d.ts +47 -0
  72. package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -0
  73. package/dist/src/core/llm/providers/azure-openai-provider.js +116 -0
  74. package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -0
  75. package/dist/src/core/llm/providers/bedrock-provider.d.ts +44 -0
  76. package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -0
  77. package/dist/src/core/llm/providers/bedrock-provider.js +149 -0
  78. package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -0
  79. package/dist/src/core/llm/providers/claude-code-provider.d.ts +115 -0
  80. package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -0
  81. package/dist/src/core/llm/providers/claude-code-provider.js +379 -0
  82. package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -0
  83. package/dist/src/core/llm/providers/ollama-provider.d.ts +40 -0
  84. package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -0
  85. package/dist/src/core/llm/providers/ollama-provider.js +116 -0
  86. package/dist/src/core/llm/providers/ollama-provider.js.map +1 -0
  87. package/dist/src/core/llm/providers/openai-provider.d.ts +44 -0
  88. package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -0
  89. package/dist/src/core/llm/providers/openai-provider.js +119 -0
  90. package/dist/src/core/llm/providers/openai-provider.js.map +1 -0
  91. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts +46 -0
  92. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -0
  93. package/dist/src/core/llm/providers/vertex-ai-provider.js +123 -0
  94. package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -0
  95. package/dist/src/core/llm/types.d.ts +181 -0
  96. package/dist/src/core/llm/types.d.ts.map +1 -0
  97. package/dist/src/core/llm/types.js +56 -0
  98. package/dist/src/core/llm/types.js.map +1 -0
  99. package/dist/src/importers/item-converter.d.ts +4 -0
  100. package/dist/src/importers/item-converter.d.ts.map +1 -1
  101. package/dist/src/importers/item-converter.js +73 -12
  102. package/dist/src/importers/item-converter.js.map +1 -1
  103. package/dist/src/init/repo/types.d.ts +1 -1
  104. package/dist/src/living-docs/enterprise-analyzer.d.ts +160 -0
  105. package/dist/src/living-docs/enterprise-analyzer.d.ts.map +1 -0
  106. package/dist/src/living-docs/enterprise-analyzer.js +887 -0
  107. package/dist/src/living-docs/enterprise-analyzer.js.map +1 -0
  108. package/dist/src/living-docs/epic-id-allocator.d.ts +4 -0
  109. package/dist/src/living-docs/epic-id-allocator.d.ts.map +1 -1
  110. package/dist/src/living-docs/epic-id-allocator.js +4 -0
  111. package/dist/src/living-docs/epic-id-allocator.js.map +1 -1
  112. package/dist/src/living-docs/fs-id-allocator.d.ts +9 -0
  113. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  114. package/dist/src/living-docs/fs-id-allocator.js +16 -5
  115. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  116. package/dist/src/living-docs/smart-doc-organizer.d.ts +114 -0
  117. package/dist/src/living-docs/smart-doc-organizer.d.ts.map +1 -0
  118. package/dist/src/living-docs/smart-doc-organizer.js +535 -0
  119. package/dist/src/living-docs/smart-doc-organizer.js.map +1 -0
  120. package/package.json +1 -1
  121. package/plugins/specweave/commands/specweave-archive.md +69 -2
  122. package/plugins/specweave/commands/specweave-judge.md +265 -0
  123. package/plugins/specweave/commands/specweave-organize-docs.md +185 -0
  124. package/plugins/specweave/hooks/hooks.json +3 -3
  125. package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -0
  126. package/plugins/specweave/hooks/universal/hook-wrapper.sh +67 -0
  127. package/plugins/specweave-docs/commands/build.md +158 -0
  128. package/plugins/specweave-docs/commands/{docs-generate.md → generate.md} +7 -2
  129. package/plugins/specweave-docs/commands/health.md +268 -0
  130. package/plugins/specweave-docs/commands/{docs-init.md → init.md} +7 -2
  131. package/plugins/specweave-docs/commands/organize.md +184 -0
  132. package/plugins/specweave-docs/commands/preview.md +138 -0
  133. package/plugins/specweave-docs/skills/preview/SKILL.md +105 -0
  134. package/plugins/specweave-release/commands/specweave-release-npm.md +22 -235
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Claude Code Native Provider
3
+ *
4
+ * Uses the Claude Code CLI (`claude --print`) as an LLM provider.
5
+ * This leverages the user's existing MAX subscription - NO API KEY NEEDED!
6
+ *
7
+ * How it works:
8
+ * 1. User is authenticated to Claude Code (MAX subscription)
9
+ * 2. Auth is cached in ~/.claude/ (Unix) or %USERPROFILE%\.claude\ (Windows)
10
+ * 3. We spawn `claude --print` subprocesses
11
+ * 4. These use the cached auth automatically
12
+ * 5. Result: Full Claude capabilities at no extra cost!
13
+ *
14
+ * Cross-platform support:
15
+ * - macOS: Uses `which claude` for detection
16
+ * - Linux: Uses `which claude` or `command -v claude`
17
+ * - Windows: Uses `where claude` for detection
18
+ *
19
+ * Best for:
20
+ * - Claude MAX subscribers
21
+ * - Background processing without API costs
22
+ * - Full Claude capabilities (Opus, Sonnet, Haiku)
23
+ */
24
+ import { execSync, spawn } from 'child_process';
25
+ import * as os from 'os';
26
+ import * as path from 'path';
27
+ import * as fs from 'fs';
28
+ import { consoleLogger } from '../../../utils/logger.js';
29
+ /**
30
+ * Detect platform for cross-platform support
31
+ */
32
+ const IS_WINDOWS = process.platform === 'win32';
33
+ const IS_MACOS = process.platform === 'darwin';
34
+ const IS_LINUX = process.platform === 'linux';
35
+ /**
36
+ * Claude Code Native Provider
37
+ *
38
+ * Uses `claude --print` CLI for LLM calls - leverages MAX subscription!
39
+ */
40
+ export class ClaudeCodeProvider {
41
+ constructor(config = {}) {
42
+ this.name = 'claude-code';
43
+ this.model = config.model || 'opus'; // Use Opus 4.5 by default for best quality
44
+ this.defaultModel = this.model;
45
+ this.maxTokens = config.maxTokens || 4096;
46
+ this.timeout = config.timeout || 120000;
47
+ this.logger = config.logger || consoleLogger;
48
+ this.cwd = config.cwd;
49
+ // Default to true for background processing - essential for non-interactive use
50
+ this.skipPermissions = config.skipPermissions ?? true;
51
+ }
52
+ /**
53
+ * Execute claude --print command
54
+ *
55
+ * Cross-platform: Works on Windows, macOS, and Linux
56
+ * Background-safe: Uses --dangerously-skip-permissions for non-interactive use
57
+ */
58
+ async executeClaudeCommand(prompt, options = {}) {
59
+ const model = options.model || this.model;
60
+ const timeout = options.timeout || this.timeout;
61
+ // Build command arguments
62
+ const args = [];
63
+ // CRITICAL: Add --dangerously-skip-permissions FIRST for non-interactive background use
64
+ // Without this flag, claude may hang waiting for permission prompts
65
+ if (this.skipPermissions) {
66
+ args.push('--dangerously-skip-permissions');
67
+ }
68
+ args.push('--print', prompt, '--output-format', 'json', '--model', model);
69
+ // Add system prompt if provided
70
+ if (options.systemPrompt) {
71
+ args.push('--system-prompt', options.systemPrompt);
72
+ }
73
+ // Determine the command name (cross-platform)
74
+ const command = IS_WINDOWS ? 'claude.cmd' : 'claude';
75
+ return new Promise((resolve, reject) => {
76
+ let stdout = '';
77
+ let stderr = '';
78
+ const proc = spawn(command, args, {
79
+ cwd: this.cwd || process.cwd(),
80
+ env: process.env,
81
+ // Use 'ignore' for stdin to prevent Claude from waiting for input
82
+ // This is essential for non-interactive background use
83
+ stdio: ['ignore', 'pipe', 'pipe'],
84
+ // Windows-specific: use shell to resolve .cmd files
85
+ shell: IS_WINDOWS,
86
+ });
87
+ // Set timeout
88
+ const timeoutId = setTimeout(() => {
89
+ proc.kill('SIGTERM');
90
+ reject(new Error(`Claude Code command timed out after ${timeout}ms`));
91
+ }, timeout);
92
+ proc.stdout.on('data', (data) => {
93
+ stdout += data.toString();
94
+ });
95
+ proc.stderr.on('data', (data) => {
96
+ stderr += data.toString();
97
+ });
98
+ proc.on('close', (code) => {
99
+ clearTimeout(timeoutId);
100
+ if (code !== 0) {
101
+ reject(new Error(`Claude Code exited with code ${code}: ${stderr}`));
102
+ return;
103
+ }
104
+ try {
105
+ const output = JSON.parse(stdout);
106
+ resolve(output);
107
+ }
108
+ catch (parseError) {
109
+ // Sometimes output has extra text, try to extract JSON
110
+ const jsonMatch = stdout.match(/\{[\s\S]*\}/);
111
+ if (jsonMatch) {
112
+ try {
113
+ const output = JSON.parse(jsonMatch[0]);
114
+ resolve(output);
115
+ }
116
+ catch {
117
+ reject(new Error(`Failed to parse Claude Code output: ${stdout}`));
118
+ }
119
+ }
120
+ else {
121
+ reject(new Error(`Failed to parse Claude Code output: ${stdout}`));
122
+ }
123
+ }
124
+ });
125
+ proc.on('error', (err) => {
126
+ clearTimeout(timeoutId);
127
+ reject(err);
128
+ });
129
+ });
130
+ }
131
+ /**
132
+ * Analyze text using Claude Code CLI
133
+ */
134
+ async analyze(prompt, options = {}) {
135
+ const startTime = Date.now();
136
+ const model = options.model || this.model;
137
+ let lastError = null;
138
+ const retries = options.retries ?? 2;
139
+ let wasRetry = false;
140
+ for (let attempt = 0; attempt <= retries; attempt++) {
141
+ try {
142
+ const output = await this.executeClaudeCommand(prompt, options);
143
+ if (output.is_error) {
144
+ throw new Error(`Claude Code returned error: ${output.result}`);
145
+ }
146
+ // Extract actual content from result (may be wrapped in markdown)
147
+ let content = output.result;
148
+ // Calculate tokens (Claude Code provides this)
149
+ const inputTokens = output.usage?.input_tokens || 0;
150
+ const outputTokens = output.usage?.output_tokens || 0;
151
+ return {
152
+ content,
153
+ usage: {
154
+ inputTokens,
155
+ outputTokens,
156
+ totalTokens: inputTokens + outputTokens,
157
+ },
158
+ // Note: MAX subscription means this is already paid!
159
+ estimatedCost: 0, // Free with MAX
160
+ model,
161
+ durationMs: Date.now() - startTime,
162
+ wasRetry,
163
+ };
164
+ }
165
+ catch (error) {
166
+ lastError = error;
167
+ wasRetry = true;
168
+ if (attempt < retries) {
169
+ const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
170
+ this.logger.warn(`Claude Code request failed, retrying in ${delay}ms...`);
171
+ await new Promise(resolve => setTimeout(resolve, delay));
172
+ }
173
+ }
174
+ }
175
+ throw lastError || new Error('Claude Code request failed after retries');
176
+ }
177
+ /**
178
+ * Analyze with structured JSON output
179
+ */
180
+ async analyzeStructured(prompt, options) {
181
+ // Add JSON instruction to prompt
182
+ const jsonPrompt = `${prompt}
183
+
184
+ IMPORTANT: Respond with valid JSON matching this schema:
185
+ ${JSON.stringify(options.schema, null, 2)}
186
+
187
+ Return ONLY the JSON object, no markdown formatting, no explanation, no code blocks.`;
188
+ const result = await this.analyze(jsonPrompt, {
189
+ ...options,
190
+ });
191
+ try {
192
+ // Extract JSON from response (handle markdown code blocks)
193
+ let jsonContent = result.content.trim();
194
+ // Remove markdown code block if present
195
+ if (jsonContent.startsWith('```json')) {
196
+ jsonContent = jsonContent.slice(7);
197
+ }
198
+ else if (jsonContent.startsWith('```')) {
199
+ jsonContent = jsonContent.slice(3);
200
+ }
201
+ if (jsonContent.endsWith('```')) {
202
+ jsonContent = jsonContent.slice(0, -3);
203
+ }
204
+ jsonContent = jsonContent.trim();
205
+ const data = JSON.parse(jsonContent);
206
+ return {
207
+ data,
208
+ usage: result.usage,
209
+ estimatedCost: 0, // Free with MAX
210
+ };
211
+ }
212
+ catch (parseError) {
213
+ if (options.strict) {
214
+ throw new Error(`Failed to parse structured response: ${parseError.message}\nRaw: ${result.content}`);
215
+ }
216
+ return {
217
+ data: { error: 'parse_failed', raw: result.content },
218
+ usage: result.usage,
219
+ estimatedCost: 0,
220
+ };
221
+ }
222
+ }
223
+ /**
224
+ * Estimate cost - always 0 for MAX subscription!
225
+ */
226
+ estimateCost() {
227
+ return 0; // MAX subscription = already paid!
228
+ }
229
+ /**
230
+ * Check if Claude Code CLI is available and authenticated
231
+ */
232
+ async isAvailable() {
233
+ try {
234
+ const status = await this.getStatus();
235
+ return status.available;
236
+ }
237
+ catch {
238
+ return false;
239
+ }
240
+ }
241
+ /**
242
+ * Get provider status
243
+ */
244
+ async getStatus() {
245
+ const startTime = Date.now();
246
+ try {
247
+ // Quick test with minimal prompt
248
+ // Note: First call can take 15-20s due to cache creation, so use longer timeout
249
+ const output = await this.executeClaudeCommand('Reply with just: ok', { timeout: 45000 });
250
+ return {
251
+ available: !output.is_error,
252
+ latencyMs: Date.now() - startTime,
253
+ };
254
+ }
255
+ catch (error) {
256
+ return {
257
+ available: false,
258
+ error: error.message || 'Claude Code CLI not available',
259
+ };
260
+ }
261
+ }
262
+ }
263
+ /**
264
+ * Get the Claude auth directory path (cross-platform)
265
+ */
266
+ function getClaudeAuthDir() {
267
+ if (IS_WINDOWS) {
268
+ return path.join(process.env.USERPROFILE || os.homedir(), '.claude');
269
+ }
270
+ return path.join(os.homedir(), '.claude');
271
+ }
272
+ /**
273
+ * Check if Claude Code CLI is installed (cross-platform)
274
+ */
275
+ function isClaudeCliInstalled() {
276
+ try {
277
+ if (IS_WINDOWS) {
278
+ // Windows: use 'where' command
279
+ execSync('where claude', { stdio: 'pipe' });
280
+ }
281
+ else {
282
+ // Unix (macOS/Linux): use 'which' or 'command -v'
283
+ try {
284
+ execSync('which claude', { stdio: 'pipe' });
285
+ }
286
+ catch {
287
+ // Fallback to command -v (more POSIX compliant)
288
+ execSync('command -v claude', { stdio: 'pipe', shell: '/bin/sh' });
289
+ }
290
+ }
291
+ return true;
292
+ }
293
+ catch {
294
+ return false;
295
+ }
296
+ }
297
+ /**
298
+ * Check if Claude auth credentials exist
299
+ */
300
+ function hasClaudeAuth() {
301
+ const authDir = getClaudeAuthDir();
302
+ // Check for auth file or credentials
303
+ return fs.existsSync(authDir) && (fs.existsSync(path.join(authDir, 'credentials.json')) ||
304
+ fs.existsSync(path.join(authDir, 'auth.json')) ||
305
+ fs.existsSync(path.join(authDir, '.credentials')));
306
+ }
307
+ /**
308
+ * Check if Claude Code CLI is installed and authenticated
309
+ *
310
+ * Cross-platform support:
311
+ * - Windows: Uses `where claude` and checks %USERPROFILE%\.claude\
312
+ * - macOS/Linux: Uses `which claude` and checks ~/.claude/
313
+ */
314
+ export async function isClaudeCodeAvailable() {
315
+ try {
316
+ // Step 1: Check if CLI is installed
317
+ if (!isClaudeCliInstalled()) {
318
+ return false;
319
+ }
320
+ // Step 2: Quick check for auth directory (fast, no subprocess)
321
+ // Note: Auth might be stored differently, so this is just a hint
322
+ const hasAuth = hasClaudeAuth();
323
+ if (!hasAuth) {
324
+ // Auth directory doesn't exist, but CLI might still work
325
+ // (e.g., auth stored elsewhere or in environment)
326
+ }
327
+ // Step 3: Actually test if it works (slow but definitive)
328
+ // Note: First call can take 15-20s due to cache creation, so use 45s timeout
329
+ const provider = new ClaudeCodeProvider({
330
+ timeout: 45000, // 45s for first-time cache creation
331
+ skipPermissions: true, // Essential for non-interactive check
332
+ });
333
+ return await provider.isAvailable();
334
+ }
335
+ catch {
336
+ return false;
337
+ }
338
+ }
339
+ /**
340
+ * Get detailed Claude Code availability info
341
+ */
342
+ export async function getClaudeCodeStatus() {
343
+ const platform = IS_WINDOWS ? 'windows' : IS_MACOS ? 'macos' : IS_LINUX ? 'linux' : 'unknown';
344
+ const cliInstalled = isClaudeCliInstalled();
345
+ if (!cliInstalled) {
346
+ return {
347
+ available: false,
348
+ cliInstalled: false,
349
+ authExists: false,
350
+ error: `Claude CLI not found. Install from: https://claude.ai/download`,
351
+ platform,
352
+ };
353
+ }
354
+ const authExists = hasClaudeAuth();
355
+ try {
356
+ const provider = new ClaudeCodeProvider({
357
+ timeout: 45000, // 45s for first-time cache creation
358
+ skipPermissions: true,
359
+ });
360
+ const status = await provider.getStatus();
361
+ return {
362
+ available: status.available,
363
+ cliInstalled: true,
364
+ authExists,
365
+ error: status.error,
366
+ platform,
367
+ };
368
+ }
369
+ catch (error) {
370
+ return {
371
+ available: false,
372
+ cliInstalled: true,
373
+ authExists,
374
+ error: error.message || 'Failed to check Claude Code status',
375
+ platform,
376
+ };
377
+ }
378
+ }
379
+ //# sourceMappingURL=claude-code-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-provider.js","sourceRoot":"","sources":["../../../../../src/core/llm/providers/claude-code-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Ollama Provider (Local LLM)
3
+ *
4
+ * Implements LLMProvider interface for local Ollama models.
5
+ * Uses HTTP API directly (no SDK needed).
6
+ *
7
+ * Best for: Local development, privacy-sensitive analysis, cost-free operation
8
+ */
9
+ import type { LLMProvider, AnalyzeOptions, AnalyzeResult, StructuredOptions } from '../types.js';
10
+ import { Logger } from '../../../utils/logger.js';
11
+ export interface OllamaProviderConfig {
12
+ baseUrl?: string;
13
+ model?: string;
14
+ maxTokens?: number;
15
+ temperature?: number;
16
+ logger?: Logger;
17
+ }
18
+ export declare class OllamaProvider implements LLMProvider {
19
+ readonly name: "ollama";
20
+ readonly defaultModel: string;
21
+ private baseUrl;
22
+ private maxTokens;
23
+ private temperature;
24
+ private logger;
25
+ constructor(config: OllamaProviderConfig);
26
+ analyze(prompt: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
27
+ analyzeStructured<T>(prompt: string, options: StructuredOptions<T>): Promise<{
28
+ data: T;
29
+ usage: AnalyzeResult['usage'];
30
+ estimatedCost: number;
31
+ }>;
32
+ estimateCost(): number;
33
+ isAvailable(): Promise<boolean>;
34
+ getStatus(): Promise<{
35
+ available: boolean;
36
+ latencyMs?: number;
37
+ error?: string;
38
+ }>;
39
+ }
40
+ //# sourceMappingURL=ollama-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/ollama-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,oBAAoB;IAQlC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+C7E,iBAAiB,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B7E,YAAY,IAAI,MAAM;IAIhB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA0BvF"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Ollama Provider (Local LLM)
3
+ *
4
+ * Implements LLMProvider interface for local Ollama models.
5
+ * Uses HTTP API directly (no SDK needed).
6
+ *
7
+ * Best for: Local development, privacy-sensitive analysis, cost-free operation
8
+ */
9
+ import { consoleLogger } from '../../../utils/logger.js';
10
+ export class OllamaProvider {
11
+ constructor(config) {
12
+ this.name = 'ollama';
13
+ this.baseUrl = config.baseUrl || 'http://localhost:11434';
14
+ this.defaultModel = config.model || 'llama3.1:8b';
15
+ this.maxTokens = config.maxTokens || 4096;
16
+ this.temperature = config.temperature ?? 0.3;
17
+ this.logger = config.logger || consoleLogger;
18
+ }
19
+ async analyze(prompt, options = {}) {
20
+ const startTime = Date.now();
21
+ const model = options.model || this.defaultModel;
22
+ const systemPrompt = options.systemPrompt || '';
23
+ const fullPrompt = systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt;
24
+ const response = await fetch(`${this.baseUrl}/api/generate`, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({
28
+ model,
29
+ prompt: fullPrompt,
30
+ stream: false,
31
+ options: {
32
+ num_predict: options.maxTokens || this.maxTokens,
33
+ temperature: options.temperature ?? this.temperature,
34
+ },
35
+ }),
36
+ signal: AbortSignal.timeout(options.timeout || 120000),
37
+ });
38
+ if (!response.ok) {
39
+ const error = await response.text();
40
+ throw new Error(`Ollama request failed: ${error}`);
41
+ }
42
+ const data = await response.json();
43
+ // Ollama doesn't provide exact token counts, estimate from response
44
+ const inputTokens = Math.ceil(fullPrompt.length / 4);
45
+ const outputTokens = Math.ceil((data.response?.length || 0) / 4);
46
+ return {
47
+ content: data.response || '',
48
+ usage: {
49
+ inputTokens,
50
+ outputTokens,
51
+ totalTokens: inputTokens + outputTokens,
52
+ },
53
+ estimatedCost: 0, // Local = free
54
+ model,
55
+ durationMs: Date.now() - startTime,
56
+ wasRetry: false,
57
+ };
58
+ }
59
+ async analyzeStructured(prompt, options) {
60
+ const jsonPrompt = `${prompt}
61
+
62
+ Respond with valid JSON matching this schema:
63
+ ${JSON.stringify(options.schema, null, 2)}
64
+
65
+ Return ONLY the JSON object.`;
66
+ const result = await this.analyze(jsonPrompt, {
67
+ ...options,
68
+ temperature: 0.1,
69
+ });
70
+ let jsonContent = result.content.trim();
71
+ if (jsonContent.startsWith('```')) {
72
+ jsonContent = jsonContent.replace(/^```json?\n?/, '').replace(/\n?```$/, '');
73
+ }
74
+ const data = JSON.parse(jsonContent);
75
+ return {
76
+ data,
77
+ usage: result.usage,
78
+ estimatedCost: 0,
79
+ };
80
+ }
81
+ estimateCost() {
82
+ return 0; // Local = free
83
+ }
84
+ async isAvailable() {
85
+ try {
86
+ const status = await this.getStatus();
87
+ return status.available;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ async getStatus() {
94
+ const startTime = Date.now();
95
+ try {
96
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
97
+ method: 'GET',
98
+ signal: AbortSignal.timeout(5000),
99
+ });
100
+ if (response.ok) {
101
+ const data = await response.json();
102
+ const hasModel = data.models?.some((m) => m.name === this.defaultModel || m.name.startsWith(this.defaultModel.split(':')[0]));
103
+ return {
104
+ available: hasModel,
105
+ latencyMs: Date.now() - startTime,
106
+ error: hasModel ? undefined : `Model ${this.defaultModel} not found`,
107
+ };
108
+ }
109
+ return { available: false, error: 'Ollama server not responding' };
110
+ }
111
+ catch (error) {
112
+ return { available: false, error: error.message };
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=ollama-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../../../../src/core/llm/providers/ollama-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * OpenAI Provider
3
+ *
4
+ * Implements LLMProvider interface for OpenAI's GPT models.
5
+ * Uses openai SDK for API calls.
6
+ *
7
+ * TODO: Implement following the same pattern as anthropic-provider.ts
8
+ */
9
+ import type { LLMProvider, AnalyzeOptions, AnalyzeResult, StructuredOptions } from '../types.js';
10
+ import { Logger } from '../../../utils/logger.js';
11
+ export interface OpenAIProviderConfig {
12
+ apiKey: string;
13
+ model?: string;
14
+ maxTokens?: number;
15
+ temperature?: number;
16
+ baseUrl?: string;
17
+ logger?: Logger;
18
+ }
19
+ export declare class OpenAIProvider implements LLMProvider {
20
+ readonly name: "openai";
21
+ readonly defaultModel: string;
22
+ private apiKey;
23
+ private maxTokens;
24
+ private temperature;
25
+ private baseUrl;
26
+ private logger;
27
+ private client;
28
+ constructor(config: OpenAIProviderConfig);
29
+ private getClient;
30
+ analyze(prompt: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
31
+ analyzeStructured<T>(prompt: string, options: StructuredOptions<T>): Promise<{
32
+ data: T;
33
+ usage: AnalyzeResult['usage'];
34
+ estimatedCost: number;
35
+ }>;
36
+ estimateCost(inputTokens: number, outputTokens: number, model?: string): number;
37
+ isAvailable(): Promise<boolean>;
38
+ getStatus(): Promise<{
39
+ available: boolean;
40
+ latencyMs?: number;
41
+ error?: string;
42
+ }>;
43
+ }
44
+ //# sourceMappingURL=openai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,oBAAoB;YAS1B,SAAS;IAWjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAqC7E,iBAAiB,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAqC7E,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAQzE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAUvF"}