@scottwalker/claude-connector 0.1.0

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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +444 -0
  3. package/dist/builder/args-builder.d.ts +64 -0
  4. package/dist/builder/args-builder.d.ts.map +1 -0
  5. package/dist/builder/args-builder.js +134 -0
  6. package/dist/builder/args-builder.js.map +1 -0
  7. package/dist/builder/index.d.ts +2 -0
  8. package/dist/builder/index.d.ts.map +1 -0
  9. package/dist/builder/index.js +2 -0
  10. package/dist/builder/index.js.map +1 -0
  11. package/dist/client/claude.d.ts +120 -0
  12. package/dist/client/claude.d.ts.map +1 -0
  13. package/dist/client/claude.js +182 -0
  14. package/dist/client/claude.js.map +1 -0
  15. package/dist/client/session.d.ts +64 -0
  16. package/dist/client/session.d.ts.map +1 -0
  17. package/dist/client/session.js +128 -0
  18. package/dist/client/session.js.map +1 -0
  19. package/dist/errors/errors.d.ts +52 -0
  20. package/dist/errors/errors.d.ts.map +1 -0
  21. package/dist/errors/errors.js +78 -0
  22. package/dist/errors/errors.js.map +1 -0
  23. package/dist/errors/index.d.ts +2 -0
  24. package/dist/errors/index.d.ts.map +1 -0
  25. package/dist/errors/index.js +2 -0
  26. package/dist/errors/index.js.map +1 -0
  27. package/dist/executor/cli-executor.d.ts +35 -0
  28. package/dist/executor/cli-executor.d.ts.map +1 -0
  29. package/dist/executor/cli-executor.js +223 -0
  30. package/dist/executor/cli-executor.js.map +1 -0
  31. package/dist/executor/index.d.ts +4 -0
  32. package/dist/executor/index.d.ts.map +1 -0
  33. package/dist/executor/index.js +3 -0
  34. package/dist/executor/index.js.map +1 -0
  35. package/dist/executor/interface.d.ts +65 -0
  36. package/dist/executor/interface.d.ts.map +1 -0
  37. package/dist/executor/interface.js +2 -0
  38. package/dist/executor/interface.js.map +1 -0
  39. package/dist/executor/sdk-executor.d.ts +102 -0
  40. package/dist/executor/sdk-executor.d.ts.map +1 -0
  41. package/dist/executor/sdk-executor.js +256 -0
  42. package/dist/executor/sdk-executor.js.map +1 -0
  43. package/dist/index.d.ts +49 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +49 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/parser/index.d.ts +3 -0
  48. package/dist/parser/index.d.ts.map +1 -0
  49. package/dist/parser/index.js +3 -0
  50. package/dist/parser/index.js.map +1 -0
  51. package/dist/parser/json-parser.d.ts +22 -0
  52. package/dist/parser/json-parser.d.ts.map +1 -0
  53. package/dist/parser/json-parser.js +87 -0
  54. package/dist/parser/json-parser.js.map +1 -0
  55. package/dist/parser/stream-parser.d.ts +21 -0
  56. package/dist/parser/stream-parser.d.ts.map +1 -0
  57. package/dist/parser/stream-parser.js +84 -0
  58. package/dist/parser/stream-parser.js.map +1 -0
  59. package/dist/scheduler/index.d.ts +2 -0
  60. package/dist/scheduler/index.d.ts.map +1 -0
  61. package/dist/scheduler/index.js +2 -0
  62. package/dist/scheduler/index.js.map +1 -0
  63. package/dist/scheduler/scheduler.d.ts +65 -0
  64. package/dist/scheduler/scheduler.d.ts.map +1 -0
  65. package/dist/scheduler/scheduler.js +134 -0
  66. package/dist/scheduler/scheduler.js.map +1 -0
  67. package/dist/types/client.d.ts +184 -0
  68. package/dist/types/client.d.ts.map +1 -0
  69. package/dist/types/client.js +2 -0
  70. package/dist/types/client.js.map +1 -0
  71. package/dist/types/index.d.ts +4 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +2 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/dist/types/result.d.ts +94 -0
  76. package/dist/types/result.d.ts.map +1 -0
  77. package/dist/types/result.js +2 -0
  78. package/dist/types/result.js.map +1 -0
  79. package/dist/types/session.d.ts +37 -0
  80. package/dist/types/session.d.ts.map +1 -0
  81. package/dist/types/session.js +2 -0
  82. package/dist/types/session.js.map +1 -0
  83. package/dist/utils/index.d.ts +2 -0
  84. package/dist/utils/index.d.ts.map +1 -0
  85. package/dist/utils/index.js +2 -0
  86. package/dist/utils/index.js.map +1 -0
  87. package/dist/utils/validation.d.ts +15 -0
  88. package/dist/utils/validation.d.ts.map +1 -0
  89. package/dist/utils/validation.js +45 -0
  90. package/dist/utils/validation.js.map +1 -0
  91. package/package.json +62 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Scott Walker
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,444 @@
1
+ # claude-connector
2
+
3
+ Programmatic Node.js interface for [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) CLI.
4
+
5
+ Use Claude Code from your application code — no terminal required. Works with your existing Max/Team/Enterprise subscription.
6
+
7
+ **[Website](https://scott-walker.github.io/claude-connector/)** | **[API Reference](./docs/API.md)** | **[Architecture](./docs/ARCHITECTURE.md)**
8
+
9
+ ---
10
+
11
+ ## Why
12
+
13
+ Claude Code is a powerful AI coding agent, but it only runs in a terminal. **claude-connector** turns it into a programmable API — so you can embed it into CI pipelines, build custom tools, orchestrate multi-agent workflows, or integrate it with any Node.js application.
14
+
15
+ **Key design decisions:**
16
+
17
+ - **CLI wrapper, not API client** — uses your local `claude` binary and subscription, not the Anthropic HTTP API
18
+ - **Zero runtime dependencies** — only Node.js built-ins (`child_process`, `events`)
19
+ - **Executor abstraction** — swap CLI for SDK or HTTP backend without changing your code
20
+ - **Full CLI parity** — exposes all 45+ Claude Code flags through typed options
21
+
22
+ ## Requirements
23
+
24
+ - **Node.js** >= 18.0.0
25
+ - **Claude Code CLI** installed and authenticated (`claude auth login`)
26
+
27
+ ## Install
28
+
29
+ ```bash
30
+ npm install claude-connector
31
+ ```
32
+
33
+ ## Quick Start
34
+
35
+ ```typescript
36
+ import { Claude } from 'claude-connector'
37
+
38
+ const claude = new Claude()
39
+
40
+ // Simple query
41
+ const result = await claude.query('Find and fix bugs in auth.ts')
42
+ console.log(result.text)
43
+ console.log(result.sessionId) // resume later
44
+ console.log(result.usage) // { inputTokens, outputTokens }
45
+ ```
46
+
47
+ ## Features
48
+
49
+ ### Custom CLI Path
50
+
51
+ Point to a specific Claude Code installation when multiple versions coexist:
52
+
53
+ ```typescript
54
+ const claude = new Claude({
55
+ executable: '/opt/claude-code/v2/bin/claude',
56
+ cwd: '/path/to/project',
57
+ })
58
+ ```
59
+
60
+ ### Streaming
61
+
62
+ Real-time output as Claude works:
63
+
64
+ ```typescript
65
+ for await (const event of claude.stream('Rewrite the auth module')) {
66
+ switch (event.type) {
67
+ case 'text':
68
+ process.stdout.write(event.text)
69
+ break
70
+ case 'tool_use':
71
+ console.log(`[Tool] ${event.toolName}`)
72
+ break
73
+ case 'result':
74
+ console.log(`\nDone in ${event.durationMs}ms`)
75
+ break
76
+ case 'error':
77
+ console.error(event.message)
78
+ break
79
+ }
80
+ }
81
+ ```
82
+
83
+ ### Multi-turn Sessions
84
+
85
+ Maintain conversation context across queries:
86
+
87
+ ```typescript
88
+ const session = claude.session()
89
+ await session.query('Analyze the architecture of this project')
90
+ await session.query('Now refactor the auth module based on your analysis')
91
+ // ^ Claude remembers the previous context
92
+
93
+ // Resume a session later (even across process restarts)
94
+ const s2 = claude.session({ resume: session.sessionId! })
95
+ await s2.query('Continue where we left off')
96
+
97
+ // Fork a session (branch without modifying the original)
98
+ const s3 = claude.session({ resume: session.sessionId!, fork: true })
99
+ ```
100
+
101
+ ### Structured Output
102
+
103
+ Get typed JSON responses via JSON Schema:
104
+
105
+ ```typescript
106
+ const result = await claude.query('Extract all API endpoints from the codebase', {
107
+ schema: {
108
+ type: 'object',
109
+ properties: {
110
+ endpoints: {
111
+ type: 'array',
112
+ items: {
113
+ type: 'object',
114
+ properties: {
115
+ method: { type: 'string' },
116
+ path: { type: 'string' },
117
+ handler: { type: 'string' },
118
+ },
119
+ },
120
+ },
121
+ },
122
+ },
123
+ })
124
+ console.log(result.structured)
125
+ // { endpoints: [{ method: 'GET', path: '/api/users', handler: 'getUsers' }, ...] }
126
+ ```
127
+
128
+ ### Parallel Execution
129
+
130
+ Run independent queries concurrently (each spawns a separate CLI process):
131
+
132
+ ```typescript
133
+ const [bugs, tests, docs] = await claude.parallel([
134
+ { prompt: 'Find bugs in src/', options: { cwd: './src' } },
135
+ { prompt: 'Run the test suite', options: { allowedTools: ['Bash'] } },
136
+ { prompt: 'Review documentation', options: { permissionMode: 'plan' } },
137
+ ])
138
+ ```
139
+
140
+ ### Recurring Tasks
141
+
142
+ Node.js-level equivalent of the `/loop` CLI command:
143
+
144
+ ```typescript
145
+ const job = claude.loop('5m', 'Check CI pipeline status and report failures')
146
+
147
+ job.on('result', (result) => {
148
+ console.log(`[${new Date().toISOString()}] ${result.text}`)
149
+ })
150
+
151
+ job.on('error', (err) => {
152
+ console.error('Check failed:', err.message)
153
+ })
154
+
155
+ // Stop when no longer needed
156
+ job.stop()
157
+ ```
158
+
159
+ Supported intervals: `'30s'`, `'5m'`, `'2h'`, `'1d'`, or raw milliseconds.
160
+
161
+ ### MCP Servers
162
+
163
+ Connect Model Context Protocol servers:
164
+
165
+ ```typescript
166
+ const claude = new Claude({
167
+ // From config file
168
+ mcpConfig: './mcp.json',
169
+
170
+ // Or inline definitions
171
+ mcpServers: {
172
+ playwright: {
173
+ command: 'npx',
174
+ args: ['@playwright/mcp@latest'],
175
+ },
176
+ database: {
177
+ type: 'http',
178
+ url: 'http://localhost:3001/mcp',
179
+ },
180
+ },
181
+ })
182
+ ```
183
+
184
+ ### Custom Subagents
185
+
186
+ Define specialized agents:
187
+
188
+ ```typescript
189
+ const claude = new Claude({
190
+ agents: {
191
+ reviewer: {
192
+ description: 'Code review expert',
193
+ model: 'haiku',
194
+ tools: ['Read', 'Glob', 'Grep'],
195
+ prompt: 'Review code for bugs, security issues, and style',
196
+ },
197
+ deployer: {
198
+ description: 'Deployment automation agent',
199
+ tools: ['Bash', 'Read'],
200
+ permissionMode: 'acceptEdits',
201
+ },
202
+ },
203
+ })
204
+ ```
205
+
206
+ ### Git Worktree Isolation
207
+
208
+ Run operations in an isolated copy of the repository:
209
+
210
+ ```typescript
211
+ const result = await claude.query('Refactor the entire auth module', {
212
+ worktree: 'refactor-auth', // or `true` for auto-generated name
213
+ })
214
+ ```
215
+
216
+ ### Piped Input
217
+
218
+ Pass data alongside the prompt (like `echo data | claude -p "prompt"`):
219
+
220
+ ```typescript
221
+ import { readFileSync } from 'node:fs'
222
+
223
+ const result = await claude.query('Analyze this error log and suggest fixes', {
224
+ input: readFileSync('./error.log', 'utf-8'),
225
+ })
226
+ ```
227
+
228
+ ### Lifecycle Hooks
229
+
230
+ Attach hooks to tool execution:
231
+
232
+ ```typescript
233
+ const claude = new Claude({
234
+ hooks: {
235
+ PostToolUse: [
236
+ {
237
+ matcher: 'Edit|Write',
238
+ hooks: [{ command: 'prettier --write ${file_path}' }],
239
+ },
240
+ ],
241
+ PreToolUse: [
242
+ {
243
+ matcher: 'Bash',
244
+ hooks: [{ command: './scripts/validate-command.sh', timeout: 5 }],
245
+ },
246
+ ],
247
+ },
248
+ })
249
+ ```
250
+
251
+ ### Full Configuration
252
+
253
+ All Claude Code CLI capabilities in one place:
254
+
255
+ ```typescript
256
+ const claude = new Claude({
257
+ // CLI binary
258
+ executable: '/usr/local/bin/claude',
259
+ cwd: '/path/to/project',
260
+
261
+ // Model
262
+ model: 'opus', // 'opus' | 'sonnet' | 'haiku' | full model ID
263
+ effortLevel: 'high', // 'low' | 'medium' | 'high'
264
+ fallbackModel: 'sonnet', // auto-fallback on failure
265
+
266
+ // Permissions
267
+ permissionMode: 'acceptEdits', // 'default' | 'acceptEdits' | 'plan' | 'bypassPermissions'
268
+ allowedTools: ['Read', 'Edit', 'Bash(npm run *)'],
269
+ disallowedTools: ['WebFetch'],
270
+
271
+ // Prompts
272
+ systemPrompt: 'You are a senior TypeScript developer',
273
+ appendSystemPrompt: 'Always write tests for new code',
274
+
275
+ // Limits
276
+ maxTurns: 10, // max agentic turns per query
277
+ maxBudget: 5.0, // max USD per query
278
+
279
+ // Directories
280
+ additionalDirs: ['../shared-lib', '../proto'],
281
+
282
+ // MCP
283
+ mcpConfig: './mcp.json',
284
+ mcpServers: { /* ... */ },
285
+
286
+ // Agents
287
+ agents: { /* ... */ },
288
+
289
+ // Hooks
290
+ hooks: { /* ... */ },
291
+
292
+ // Environment
293
+ env: {
294
+ MAX_THINKING_TOKENS: '50000',
295
+ CLAUDE_CODE_DISABLE_AUTO_MEMORY: '1',
296
+ },
297
+
298
+ // Session
299
+ noSessionPersistence: true, // for CI/automation
300
+ })
301
+
302
+ // Override any option per query
303
+ const result = await claude.query('Analyze this module', {
304
+ model: 'haiku', // cheaper model for this query
305
+ permissionMode: 'plan', // read-only
306
+ maxTurns: 3,
307
+ })
308
+ ```
309
+
310
+ ## Error Handling
311
+
312
+ All errors extend `ClaudeConnectorError` for uniform catching:
313
+
314
+ ```typescript
315
+ import {
316
+ Claude,
317
+ ClaudeConnectorError,
318
+ CliNotFoundError,
319
+ CliExecutionError,
320
+ CliTimeoutError,
321
+ ParseError,
322
+ ValidationError,
323
+ } from 'claude-connector'
324
+
325
+ try {
326
+ const result = await claude.query('Fix the bug')
327
+ } catch (err) {
328
+ if (err instanceof CliNotFoundError) {
329
+ // Claude Code CLI not installed or wrong path
330
+ console.error(`CLI not found: ${err.executable}`)
331
+ } else if (err instanceof CliExecutionError) {
332
+ // Non-zero exit code
333
+ console.error(`Exit ${err.exitCode}: ${err.stderr}`)
334
+ } else if (err instanceof CliTimeoutError) {
335
+ // Exceeded timeout
336
+ console.error(`Timed out after ${err.timeoutMs}ms`)
337
+ } else if (err instanceof ParseError) {
338
+ // Unexpected CLI output
339
+ console.error(`Parse failed: ${err.rawOutput.slice(0, 100)}`)
340
+ } else if (err instanceof ClaudeConnectorError) {
341
+ // Any other library error
342
+ console.error(err.message)
343
+ }
344
+ }
345
+ ```
346
+
347
+ ## Custom Executor
348
+
349
+ The `IExecutor` abstraction lets you swap the CLI backend for testing, mocking, or future SDK integration:
350
+
351
+ ```typescript
352
+ import { Claude, type IExecutor, type ExecuteOptions, type QueryResult, type StreamEvent } from 'claude-connector'
353
+
354
+ class MockExecutor implements IExecutor {
355
+ async execute(args: readonly string[], options: ExecuteOptions): Promise<QueryResult> {
356
+ return {
357
+ text: 'Mocked response',
358
+ sessionId: 'mock-session',
359
+ usage: { inputTokens: 0, outputTokens: 0 },
360
+ cost: null,
361
+ durationMs: 0,
362
+ messages: [],
363
+ structured: null,
364
+ raw: {},
365
+ }
366
+ }
367
+
368
+ async *stream(args: readonly string[], options: ExecuteOptions): AsyncIterable<StreamEvent> {
369
+ yield { type: 'text', text: 'Mocked stream' }
370
+ yield {
371
+ type: 'result',
372
+ text: 'Mocked stream',
373
+ sessionId: 'mock-session',
374
+ usage: { inputTokens: 0, outputTokens: 0 },
375
+ cost: null,
376
+ durationMs: 0,
377
+ }
378
+ }
379
+ }
380
+
381
+ // Use in tests or with future backends
382
+ const claude = new Claude({ model: 'opus' }, new MockExecutor())
383
+ ```
384
+
385
+ ## Architecture
386
+
387
+ ```
388
+ ┌─────────┐ ┌─────────────┐ ┌────────────┐ ┌──────────────┐
389
+ │ Claude │────>│ ArgsBuilder │────>│ IExecutor │────>│ CLI Process │
390
+ │ (facade) │ │ │ │ (abstract) │ │ (claude -p) │
391
+ └─────────┘ └─────────────┘ └────────────┘ └──────────────┘
392
+ │ ^
393
+ v |
394
+ Session CliExecutor (default)
395
+ Scheduler SdkExecutor (future)
396
+ ```
397
+
398
+ - **Zero dependencies** — only `child_process` and `events` from Node.js
399
+ - **Executor pattern** — swap CLI for SDK/HTTP without touching consumer code
400
+ - **Stateless queries** — each `query()` spawns an independent process
401
+ - **Immutable config** — client options frozen at construction, per-query overrides are non-destructive
402
+
403
+ See [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) for detailed design documentation.
404
+
405
+ ## Examples
406
+
407
+ | Example | Description |
408
+ |---------|-------------|
409
+ | [`examples/interactive-chat`](./examples/interactive-chat) | Terminal chat — ask questions, get answers in real time |
410
+ | [`examples/integration-test`](./examples/integration-test) | Package integration test (mock executor) |
411
+
412
+ ```bash
413
+ # Try the interactive chat:
414
+ cd examples/interactive-chat
415
+ npm install
416
+ npm start # standard mode
417
+ npm run stream # streaming mode (word by word)
418
+ ```
419
+
420
+ ## Documentation
421
+
422
+ | Document | Description |
423
+ |----------|-------------|
424
+ | [Architecture](./docs/ARCHITECTURE.md) | Design principles, SOLID breakdown, data flow diagrams |
425
+ | [API Reference](./docs/API.md) | Complete reference for all classes, methods, types, and options |
426
+ | [Changelog](./CHANGELOG.md) | Version history |
427
+ | [Contributing](./CONTRIBUTING.md) | Development setup and guidelines |
428
+
429
+ ## Development
430
+
431
+ ```bash
432
+ git clone git@github.com:scott-walker/claude-connector.git
433
+ cd claude-connector
434
+ npm install
435
+
436
+ npm run build # compile TypeScript
437
+ npm test # run 82 unit tests
438
+ npm run test:integration # build + run integration test
439
+ npm run typecheck # type-check without emitting
440
+ ```
441
+
442
+ ## License
443
+
444
+ [MIT](./LICENSE)
@@ -0,0 +1,64 @@
1
+ import type { ClientOptions, QueryOptions } from '../types/index.js';
2
+ /**
3
+ * Builds the CLI argument array from merged client + query options.
4
+ *
5
+ * ## Separation of concerns
6
+ *
7
+ * ArgsBuilder is purely functional — it takes options and returns `string[]`.
8
+ * It has no side effects, no I/O, and no dependency on the executor.
9
+ * This makes it trivially testable and replaceable.
10
+ *
11
+ * ## Merging strategy
12
+ *
13
+ * Query-level options override client-level options. Arrays are replaced, not merged.
14
+ * This follows the principle of least surprise: if you set `allowedTools` per-query,
15
+ * you get exactly those tools, not a union with client defaults.
16
+ */
17
+ /** Merged options ready for argument building. */
18
+ export interface ResolvedOptions {
19
+ readonly prompt: string;
20
+ readonly outputFormat: 'json' | 'stream-json';
21
+ readonly cwd: string;
22
+ readonly model?: string;
23
+ readonly effortLevel?: string;
24
+ readonly fallbackModel?: string;
25
+ readonly permissionMode?: string;
26
+ readonly allowedTools?: readonly string[];
27
+ readonly disallowedTools?: readonly string[];
28
+ readonly systemPrompt?: string;
29
+ readonly appendSystemPrompt?: string;
30
+ readonly maxTurns?: number;
31
+ readonly maxBudget?: number;
32
+ readonly additionalDirs?: readonly string[];
33
+ readonly mcpConfig?: string | readonly string[];
34
+ readonly mcpServers?: Readonly<Record<string, unknown>>;
35
+ readonly agents?: Readonly<Record<string, unknown>>;
36
+ readonly hooks?: Readonly<Record<string, unknown>>;
37
+ readonly noSessionPersistence?: boolean;
38
+ readonly worktree?: boolean | string;
39
+ readonly sessionId?: string;
40
+ readonly continueSession?: boolean;
41
+ readonly forkSession?: boolean;
42
+ readonly schema?: Record<string, unknown>;
43
+ }
44
+ /**
45
+ * Merge client-level defaults with per-query overrides.
46
+ */
47
+ export declare function mergeOptions(client: ClientOptions, query: QueryOptions | undefined, extra: {
48
+ prompt: string;
49
+ outputFormat: 'json' | 'stream-json';
50
+ sessionId?: string;
51
+ continueSession?: boolean;
52
+ forkSession?: boolean;
53
+ }): ResolvedOptions;
54
+ /**
55
+ * Convert resolved options into a CLI argument array.
56
+ *
57
+ * @returns Array of strings to pass to `spawn('claude', args)`.
58
+ */
59
+ export declare function buildArgs(options: ResolvedOptions): string[];
60
+ /**
61
+ * Resolve environment variables from client + query options.
62
+ */
63
+ export declare function resolveEnv(client: ClientOptions, query: QueryOptions | undefined): Record<string, string>;
64
+ //# sourceMappingURL=args-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args-builder.d.ts","sourceRoot":"","sources":["../../src/builder/args-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AAEH,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,eAAe,CA2BjB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CA4F5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Merge client-level defaults with per-query overrides.
3
+ */
4
+ export function mergeOptions(client, query, extra) {
5
+ return {
6
+ prompt: extra.prompt,
7
+ outputFormat: extra.outputFormat,
8
+ cwd: query?.cwd ?? client.cwd ?? process.cwd(),
9
+ model: query?.model ?? client.model,
10
+ effortLevel: query?.effortLevel ?? client.effortLevel,
11
+ fallbackModel: client.fallbackModel,
12
+ permissionMode: query?.permissionMode ?? client.permissionMode,
13
+ allowedTools: query?.allowedTools ?? client.allowedTools,
14
+ disallowedTools: query?.disallowedTools ?? client.disallowedTools,
15
+ systemPrompt: query?.systemPrompt ?? client.systemPrompt,
16
+ appendSystemPrompt: query?.appendSystemPrompt ?? client.appendSystemPrompt,
17
+ maxTurns: query?.maxTurns ?? client.maxTurns,
18
+ maxBudget: query?.maxBudget ?? client.maxBudget,
19
+ additionalDirs: query?.additionalDirs ?? client.additionalDirs,
20
+ mcpConfig: client.mcpConfig,
21
+ mcpServers: client.mcpServers,
22
+ agents: client.agents,
23
+ hooks: client.hooks,
24
+ noSessionPersistence: client.noSessionPersistence,
25
+ worktree: query?.worktree,
26
+ sessionId: extra.sessionId,
27
+ continueSession: extra.continueSession,
28
+ forkSession: extra.forkSession,
29
+ schema: query?.schema,
30
+ };
31
+ }
32
+ /**
33
+ * Convert resolved options into a CLI argument array.
34
+ *
35
+ * @returns Array of strings to pass to `spawn('claude', args)`.
36
+ */
37
+ export function buildArgs(options) {
38
+ const args = ['--print', '--output-format', options.outputFormat];
39
+ // ── Prompt ──────────────────────────────────────────────────────
40
+ args.push(options.prompt);
41
+ // ── Session ─────────────────────────────────────────────────────
42
+ if (options.continueSession) {
43
+ args.push('--continue');
44
+ }
45
+ if (options.sessionId) {
46
+ args.push('--resume', options.sessionId);
47
+ }
48
+ if (options.forkSession) {
49
+ args.push('--fork-session');
50
+ }
51
+ // ── Model ───────────────────────────────────────────────────────
52
+ if (options.model) {
53
+ args.push('--model', options.model);
54
+ }
55
+ if (options.fallbackModel) {
56
+ args.push('--fallback-model', options.fallbackModel);
57
+ }
58
+ // ── Permissions ─────────────────────────────────────────────────
59
+ if (options.permissionMode) {
60
+ args.push('--permission-mode', options.permissionMode);
61
+ }
62
+ if (options.allowedTools?.length) {
63
+ args.push('--allowedTools', ...options.allowedTools);
64
+ }
65
+ if (options.disallowedTools?.length) {
66
+ args.push('--disallowedTools', ...options.disallowedTools);
67
+ }
68
+ // ── System prompt ───────────────────────────────────────────────
69
+ if (options.systemPrompt) {
70
+ args.push('--system-prompt', options.systemPrompt);
71
+ }
72
+ if (options.appendSystemPrompt) {
73
+ args.push('--append-system-prompt', options.appendSystemPrompt);
74
+ }
75
+ // ── Limits ──────────────────────────────────────────────────────
76
+ if (options.maxTurns !== undefined) {
77
+ args.push('--max-turns', String(options.maxTurns));
78
+ }
79
+ if (options.maxBudget !== undefined) {
80
+ args.push('--max-budget-usd', String(options.maxBudget));
81
+ }
82
+ // ── Directories ─────────────────────────────────────────────────
83
+ if (options.additionalDirs?.length) {
84
+ for (const dir of options.additionalDirs) {
85
+ args.push('--add-dir', dir);
86
+ }
87
+ }
88
+ // ── MCP ─────────────────────────────────────────────────────────
89
+ if (options.mcpConfig) {
90
+ const configs = Array.isArray(options.mcpConfig) ? options.mcpConfig : [options.mcpConfig];
91
+ for (const cfg of configs) {
92
+ args.push('--mcp-config', cfg);
93
+ }
94
+ }
95
+ // ── Agents ──────────────────────────────────────────────────────
96
+ if (options.agents && Object.keys(options.agents).length > 0) {
97
+ args.push('--agents', JSON.stringify(options.agents));
98
+ }
99
+ // ── Structured output ───────────────────────────────────────────
100
+ if (options.schema) {
101
+ args.push('--json-schema', JSON.stringify(options.schema));
102
+ }
103
+ // ── Worktree ────────────────────────────────────────────────────
104
+ if (options.worktree) {
105
+ if (typeof options.worktree === 'string') {
106
+ args.push('--worktree', options.worktree);
107
+ }
108
+ else {
109
+ args.push('--worktree');
110
+ }
111
+ }
112
+ // ── Misc ────────────────────────────────────────────────────────
113
+ if (options.noSessionPersistence) {
114
+ args.push('--no-session-persistence');
115
+ }
116
+ return args;
117
+ }
118
+ /**
119
+ * Resolve environment variables from client + query options.
120
+ */
121
+ export function resolveEnv(client, query) {
122
+ const env = {};
123
+ if (client.env) {
124
+ Object.assign(env, client.env);
125
+ }
126
+ if (query?.env) {
127
+ Object.assign(env, query.env);
128
+ }
129
+ if (client.effortLevel || query?.effortLevel) {
130
+ env['CLAUDE_CODE_EFFORT_LEVEL'] = (query?.effortLevel ?? client.effortLevel);
131
+ }
132
+ return env;
133
+ }
134
+ //# sourceMappingURL=args-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args-builder.js","sourceRoot":"","sources":["../../src/builder/args-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { buildArgs, mergeOptions, resolveEnv, type ResolvedOptions } from './args-builder.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { buildArgs, mergeOptions, resolveEnv } from './args-builder.js';
2
+ //# sourceMappingURL=index.js.map