@morphllm/morphsdk 0.2.27 → 0.2.32

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 (107) hide show
  1. package/README.md +195 -3
  2. package/dist/anthropic-DpEAqqZF.d.ts +88 -0
  3. package/dist/{chunk-LFYQ6GKI.js → chunk-4OBDFXR4.js} +2 -2
  4. package/dist/{chunk-S3HTYGYF.js → chunk-B4H7N4GZ.js} +14 -2
  5. package/dist/chunk-B4H7N4GZ.js.map +1 -0
  6. package/dist/{chunk-HNYSKGCP.js → chunk-BGDEQTRF.js} +2 -2
  7. package/dist/{chunk-PRIYMEI6.js → chunk-JJ5ONKDN.js} +4 -4
  8. package/dist/{chunk-2DXRTGRH.js → chunk-Q7PDN7TS.js} +1 -1
  9. package/dist/chunk-Q7PDN7TS.js.map +1 -0
  10. package/dist/{chunk-DF2ZOO7R.js → chunk-TBVDBQZ2.js} +19 -3
  11. package/dist/chunk-TBVDBQZ2.js.map +1 -0
  12. package/dist/{chunk-22WVN4MC.js → chunk-U6ZHZ5LY.js} +11 -11
  13. package/dist/{chunk-ZKIVLLZY.js → chunk-VD7US3AJ.js} +2 -2
  14. package/dist/client.cjs +18 -2
  15. package/dist/client.cjs.map +1 -1
  16. package/dist/client.d.ts +114 -0
  17. package/dist/client.js +6 -6
  18. package/dist/git/client.cjs +18 -2
  19. package/dist/git/client.cjs.map +1 -1
  20. package/dist/git/client.d.ts +261 -0
  21. package/dist/git/client.js +1 -1
  22. package/dist/git/config.d.ts +11 -0
  23. package/dist/git/index.cjs +18 -2
  24. package/dist/git/index.cjs.map +1 -1
  25. package/dist/git/index.d.ts +5 -0
  26. package/dist/git/index.js +2 -2
  27. package/dist/git/types.cjs.map +1 -1
  28. package/dist/git/types.d.ts +102 -0
  29. package/dist/index.cjs +18 -2
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +14 -0
  32. package/dist/index.js +12 -12
  33. package/dist/modelrouter/core.d.ts +56 -0
  34. package/dist/modelrouter/index.d.ts +2 -0
  35. package/dist/modelrouter/types.d.ts +35 -0
  36. package/dist/openai-BkKsS30n.d.ts +111 -0
  37. package/dist/tools/browser/anthropic.d.ts +51 -0
  38. package/dist/tools/browser/core.d.ts +203 -0
  39. package/dist/tools/browser/index.d.ts +72 -0
  40. package/dist/tools/browser/openai.d.ts +73 -0
  41. package/dist/tools/browser/prompts.d.ts +7 -0
  42. package/dist/tools/browser/types.d.ts +255 -0
  43. package/dist/tools/browser/vercel.d.ts +69 -0
  44. package/dist/tools/codebase_search/anthropic.d.ts +40 -0
  45. package/dist/tools/codebase_search/core.d.ts +40 -0
  46. package/dist/tools/codebase_search/index.d.ts +10 -0
  47. package/dist/tools/codebase_search/index.js +3 -3
  48. package/dist/tools/codebase_search/openai.d.ts +87 -0
  49. package/dist/tools/codebase_search/prompts.d.ts +7 -0
  50. package/dist/tools/codebase_search/types.d.ts +50 -0
  51. package/dist/tools/codebase_search/vercel.d.ts +65 -0
  52. package/dist/tools/fastapply/anthropic.cjs +14 -2
  53. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  54. package/dist/tools/fastapply/anthropic.d.ts +4 -0
  55. package/dist/tools/fastapply/anthropic.js +9 -3
  56. package/dist/tools/fastapply/core.d.ts +41 -0
  57. package/dist/tools/fastapply/index.cjs +18 -9
  58. package/dist/tools/fastapply/index.cjs.map +1 -1
  59. package/dist/tools/fastapply/index.d.ts +10 -0
  60. package/dist/tools/fastapply/index.js +3 -3
  61. package/dist/tools/fastapply/openai.d.ts +4 -0
  62. package/dist/tools/fastapply/prompts.d.ts +7 -0
  63. package/dist/tools/fastapply/types.d.ts +77 -0
  64. package/dist/tools/fastapply/vercel.d.ts +4 -0
  65. package/dist/tools/index.cjs +18 -9
  66. package/dist/tools/index.cjs.map +1 -1
  67. package/dist/tools/index.d.ts +10 -0
  68. package/dist/tools/index.js +3 -3
  69. package/dist/tools/utils/resilience.d.ts +58 -0
  70. package/dist/tools/warp_grep/agent/config.d.ts +8 -0
  71. package/dist/tools/warp_grep/agent/formatter.d.ts +14 -0
  72. package/dist/tools/warp_grep/agent/grep_helpers.d.ts +16 -0
  73. package/dist/tools/warp_grep/agent/parser.d.ts +16 -0
  74. package/dist/tools/warp_grep/agent/prompt.d.ts +4 -0
  75. package/dist/tools/warp_grep/agent/runner.d.ts +10 -0
  76. package/dist/tools/warp_grep/agent/runner.js +2 -2
  77. package/dist/tools/warp_grep/agent/types.cjs.map +1 -1
  78. package/dist/tools/warp_grep/agent/types.d.ts +44 -0
  79. package/dist/tools/warp_grep/anthropic.d.ts +14 -0
  80. package/dist/tools/warp_grep/anthropic.js +6 -6
  81. package/dist/tools/warp_grep/index.d.ts +11 -0
  82. package/dist/tools/warp_grep/index.js +8 -8
  83. package/dist/tools/warp_grep/openai.d.ts +33 -0
  84. package/dist/tools/warp_grep/openai.js +6 -6
  85. package/dist/tools/warp_grep/providers/command.d.ts +48 -0
  86. package/dist/tools/warp_grep/providers/local.d.ts +30 -0
  87. package/dist/tools/warp_grep/providers/types.d.ts +49 -0
  88. package/dist/tools/warp_grep/tools/analyse.d.ts +10 -0
  89. package/dist/tools/warp_grep/tools/finish.d.ts +10 -0
  90. package/dist/tools/warp_grep/tools/grep.d.ts +8 -0
  91. package/dist/tools/warp_grep/tools/read.d.ts +9 -0
  92. package/dist/tools/warp_grep/utils/files.d.ts +3 -0
  93. package/dist/tools/warp_grep/utils/format.d.ts +4 -0
  94. package/dist/tools/warp_grep/utils/paths.d.ts +7 -0
  95. package/dist/tools/warp_grep/utils/ripgrep.d.ts +11 -0
  96. package/dist/tools/warp_grep/vercel.d.ts +33 -0
  97. package/dist/tools/warp_grep/vercel.js +6 -6
  98. package/dist/vercel-B1GZ_g9N.d.ts +69 -0
  99. package/package.json +1 -1
  100. package/dist/chunk-2DXRTGRH.js.map +0 -1
  101. package/dist/chunk-DF2ZOO7R.js.map +0 -1
  102. package/dist/chunk-S3HTYGYF.js.map +0 -1
  103. /package/dist/{chunk-LFYQ6GKI.js.map → chunk-4OBDFXR4.js.map} +0 -0
  104. /package/dist/{chunk-HNYSKGCP.js.map → chunk-BGDEQTRF.js.map} +0 -0
  105. /package/dist/{chunk-PRIYMEI6.js.map → chunk-JJ5ONKDN.js.map} +0 -0
  106. /package/dist/{chunk-22WVN4MC.js.map → chunk-U6ZHZ5LY.js.map} +0 -0
  107. /package/dist/{chunk-ZKIVLLZY.js.map → chunk-VD7US3AJ.js.map} +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Morph SDK
2
2
 
3
- Production-ready tools for AI coding agents: Fast Apply (10,500 tokens/s)
3
+ Production-ready tools for AI coding agents: Repo Storage with automatic code indexing, semantic search, and Fast Apply (10,500 tokens/s).
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@morphllm/morphsdk.svg)](https://www.npmjs.com/package/@morphllm/morphsdk)
6
6
 
@@ -16,15 +16,57 @@ Get your API key: [morphllm.com/dashboard/api-keys](https://morphllm.com/dashboa
16
16
  export MORPH_API_KEY="sk-your-key-here"
17
17
  ```
18
18
 
19
+ ## Features
20
+
21
+ - **🔍 Semantic Search** - State of the Art Code Search (AST aware chunking, morph-v4-embedding + morph-v4-rerank)
22
+ - **📦 Repo Storage** - Agent native git with automatic code indexing, agent metadata, and chat history
23
+ - **⚡ Fast Apply** - 98% 1st pass accuracy, AI-powered code editing at 10,500 tokens/s
24
+ - **🤖 Agent Tools** - Ready-to-use tools for Anthropic, OpenAI, and Vercel AI SDK
25
+
19
26
  ## Quick Start
20
27
 
28
+ ### Repo Storage + Semantic Search
29
+
21
30
  ```typescript
22
31
  import { MorphClient } from '@morphllm/morphsdk';
23
32
 
24
- const morph = new MorphClient({
25
- apiKey: process.env.MORPH_API_KEY
33
+ const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
34
+
35
+ // Initialize repo
36
+ await morph.git.init({ repoId: 'my-project', dir: './my-project' });
37
+
38
+ // Commit with agent metadata
39
+ await morph.git.add({ dir: './my-project', filepath: '.' });
40
+ await morph.git.commit({
41
+ dir: './my-project',
42
+ message: 'Add authentication',
43
+ chatHistory: [
44
+ { role: 'user', content: 'Add OAuth login' },
45
+ { role: 'assistant', content: 'Implementing Google OAuth' }
46
+ ],
47
+ recordingId: 'rec_123'
26
48
  });
27
49
 
50
+ // Push (triggers automatic code embedding, 3-8s)
51
+ await morph.git.push({ dir: './my-project' });
52
+
53
+ // Search your code with natural language
54
+ const results = await morph.codebaseSearch.search({
55
+ query: "Where is the OAuth login implemented?",
56
+ repoId: 'my-project',
57
+ targetDirectories: [] // or ['src/auth'] to narrow search
58
+ });
59
+
60
+ console.log(results.results[0].content);
61
+ ```
62
+
63
+ ### Fast Apply
64
+
65
+ ```typescript
66
+ import { MorphClient } from '@morphllm/morphsdk';
67
+
68
+ const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });
69
+
28
70
  // AI-powered file editing
29
71
  await morph.fastApply.execute({
30
72
  target_filepath: 'src/app.ts',
@@ -33,7 +75,157 @@ await morph.fastApply.execute({
33
75
  });
34
76
  ```
35
77
 
78
+ ## Repo Storage
79
+
80
+ Git built for AI agents with automatic code indexing and semantic search.
81
+
82
+ ### Git Operations
83
+
84
+ ```typescript
85
+ // Initialize
86
+ await morph.git.init({ repoId: 'my-project', dir: './my-project' });
87
+
88
+ // Clone
89
+ await morph.git.clone({ repoId: 'my-project', dir: './local-copy' });
90
+
91
+ // Stage and commit
92
+ await morph.git.add({ dir: './my-project', filepath: '.' });
93
+ await morph.git.commit({
94
+ dir: './my-project',
95
+ message: 'Add feature'
96
+ });
97
+
98
+ // Push (triggers code embedding in background)
99
+ await morph.git.push({ dir: './my-project' });
100
+
101
+ // Status and history
102
+ const files = await morph.git.statusMatrix({ dir: './my-project' });
103
+ const commits = await morph.git.log({ dir: './my-project', depth: 10 });
104
+
105
+ // Branch operations
106
+ await morph.git.branch({ dir: './my-project', name: 'feature' });
107
+ const branches = await morph.git.listBranches({ dir: './my-project' });
108
+ await morph.git.checkout({ dir: './my-project', ref: 'main' });
109
+ ```
110
+
111
+ ### Agent Metadata
112
+
113
+ Store chat history and browser recordings with commits:
114
+
115
+ ```typescript
116
+ // Commit with metadata
117
+ const sha = await morph.git.commit({
118
+ dir: './my-project',
119
+ message: 'Implement user auth',
120
+ chatHistory: [
121
+ { role: 'user', content: 'Add OAuth' },
122
+ { role: 'assistant', content: 'Adding Google OAuth' }
123
+ ],
124
+ recordingId: 'rec_abc123'
125
+ });
126
+
127
+ // Retrieve metadata later
128
+ const metadata = await morph.git.getCommitMetadata({
129
+ dir: './my-project',
130
+ commitSha: sha
131
+ });
132
+
133
+ console.log(metadata?.chatHistory);
134
+ console.log(metadata?.recordingId);
135
+ ```
136
+
137
+ ### Code Embedding
138
+
139
+ When you push, Morph automatically embeds your code for semantic search. Each commit is indexed separately:
140
+
141
+ ```typescript
142
+ // Search latest code on 'main'
143
+ await morph.codebaseSearch.search({
144
+ query: "auth logic",
145
+ repoId: 'my-project'
146
+ });
147
+
148
+ // Search specific branch
149
+ await morph.codebaseSearch.search({
150
+ query: "auth logic",
151
+ repoId: 'my-project',
152
+ branch: 'develop'
153
+ });
154
+
155
+ // Search exact commit
156
+ await morph.codebaseSearch.search({
157
+ query: "auth logic",
158
+ repoId: 'my-project',
159
+ commitHash: 'abc123...'
160
+ });
161
+ ```
162
+
163
+ ## Semantic Search
164
+
165
+ Two-stage retrieval: embedding similarity (morph-v4-embedding) + reranking (morph-v4-rerank).
166
+
167
+ ### As Agent Tool
168
+
169
+ ```typescript
170
+ import { createCodebaseSearchTool } from '@morphllm/morphsdk/tools/anthropic';
171
+ import Anthropic from '@anthropic-ai/sdk';
172
+
173
+ const client = new Anthropic();
174
+ const tool = createCodebaseSearchTool({ repoId: 'my-project' });
175
+
176
+ const response = await client.messages.create({
177
+ model: "claude-sonnet-4-5-20250929",
178
+ tools: [tool],
179
+ messages: [{ role: "user", content: "Find authentication code" }]
180
+ });
181
+ ```
182
+
183
+ ### Direct Search
184
+
185
+ ```typescript
186
+ const results = await morph.codebaseSearch.search({
187
+ query: "How does authentication work?",
188
+ repoId: 'my-project',
189
+ targetDirectories: ["src/auth"], // or [] for all
190
+ limit: 10
191
+ });
192
+
193
+ results.results.forEach(r => {
194
+ console.log(`${r.filepath} (${(r.rerankScore * 100).toFixed(1)}% relevant)`);
195
+ console.log(r.content);
196
+ });
197
+ ```
198
+
199
+ ### How It Works
200
+
201
+ 1. **Embedding Search**: Query embedded with morph-v4-embedding, vector search retrieves top 50 candidates (~50ms)
202
+ 2. **Reranking**: Candidates scored with morph-v4-rerank for precision (~150ms)
203
+ 3. **Results**: Top 10 most relevant code chunks (~230ms total)
204
+
205
+ ## Fast Apply
206
+
207
+ AI-powered code editing at 10,500 tokens/s. See [tools/fastapply/README.md](./tools/fastapply/README.md) for details.
208
+
209
+ ## Agent Tools
210
+
211
+ Ready-to-use tools for popular AI frameworks:
212
+
213
+ - **Anthropic SDK** - `@morphllm/morphsdk/tools/anthropic`
214
+ - **OpenAI SDK** - `@morphllm/morphsdk/tools/openai`
215
+ - **Vercel AI SDK** - `@morphllm/morphsdk/tools/vercel`
216
+
217
+ Available tools:
218
+ - `createCodebaseSearchTool` - Semantic code search
219
+ - `createFastApplyTool` - AI-powered code editing
220
+ - `createBrowserTool` - Browser automation
221
+ - `createWarpGrepTool` - Fast grep with AI parsing
222
+
36
223
  ## Documentation
37
224
 
38
225
  Full docs: [docs.morphllm.com](https://docs.morphllm.com)
39
226
 
227
+ **Key Pages:**
228
+ - [Repo Storage](https://docs.morphllm.com/sdk/components/git) - Git operations and agent metadata
229
+ - [Semantic Search](https://docs.morphllm.com/sdk/components/semantic-search) - Code search with natural language
230
+ - [Fast Apply](https://docs.morphllm.com/sdk/components/fast-apply) - AI-powered code editing
231
+
@@ -0,0 +1,88 @@
1
+ import { Tool } from '@anthropic-ai/sdk/resources/messages';
2
+ import { EditFileResult, EditFileConfig, EditFileInput } from './tools/fastapply/types.js';
3
+
4
+ /**
5
+ * Anthropic SDK adapter for edit_file tool
6
+ */
7
+
8
+ /**
9
+ * Anthropic-native tool definition for edit_file
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import Anthropic from '@anthropic-ai/sdk';
14
+ * import { editFileTool } from 'morphsdk/tools/anthropic';
15
+ *
16
+ * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
17
+ *
18
+ * const response = await client.messages.create({
19
+ * model: "claude-sonnet-4-5-20250929",
20
+ * tools: [editFileTool],
21
+ * messages: [{ role: "user", content: "Fix the bug in app.ts" }]
22
+ * });
23
+ * ```
24
+ */
25
+ declare const editFileTool: Tool;
26
+ /**
27
+ * Format the result for passing back to Claude
28
+ *
29
+ * @param result - The edit result
30
+ * @returns Formatted string for tool_result
31
+ */
32
+ declare function formatResult(result: EditFileResult): string;
33
+ /**
34
+ * Create a custom edit_file tool with configuration
35
+ *
36
+ * @param config - Configuration options
37
+ * @returns Tool definition with execute and formatResult methods
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const tool = createEditFileTool({
42
+ * baseDir: './src',
43
+ * generateUdiff: true,
44
+ * morphApiKey: 'sk-...',
45
+ * description: 'Custom tool description for your use case'
46
+ * });
47
+ *
48
+ * // Use as Anthropic tool
49
+ * const response = await client.messages.create({
50
+ * tools: [tool], // tool itself is the Tool definition
51
+ * ...
52
+ * });
53
+ *
54
+ * // Execute and format
55
+ * const result = await tool.execute(toolUseBlock.input);
56
+ * const formatted = tool.formatResult(result);
57
+ * ```
58
+ */
59
+ declare function createEditFileTool(config?: EditFileConfig): Tool & {
60
+ execute: (input: EditFileInput) => Promise<EditFileResult>;
61
+ formatResult: (result: EditFileResult) => string;
62
+ getSystemPrompt: () => string;
63
+ };
64
+ /**
65
+ * Execute the edit_file tool with raw input
66
+ *
67
+ * @param input - Tool input from Claude's tool_use
68
+ * @param config - Configuration for Fast Apply
69
+ * @returns Tool result to send back to Claude
70
+ */
71
+ declare function execute(input: EditFileInput, config?: EditFileConfig): Promise<EditFileResult>;
72
+ /**
73
+ * Get the system prompt for the edit_file tool
74
+ *
75
+ * @returns System prompt string
76
+ */
77
+ declare function getSystemPrompt(): string;
78
+
79
+ declare const anthropic_createEditFileTool: typeof createEditFileTool;
80
+ declare const anthropic_editFileTool: typeof editFileTool;
81
+ declare const anthropic_execute: typeof execute;
82
+ declare const anthropic_formatResult: typeof formatResult;
83
+ declare const anthropic_getSystemPrompt: typeof getSystemPrompt;
84
+ declare namespace anthropic {
85
+ export { anthropic_createEditFileTool as createEditFileTool, anthropic_editFileTool as editFileTool, anthropic_execute as execute, anthropic_formatResult as formatResult, anthropic_getSystemPrompt as getSystemPrompt };
86
+ }
87
+
88
+ export { anthropic as a, execute as b, createEditFileTool as c, editFileTool as e, formatResult as f, getSystemPrompt as g };
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-UYBIKZPM.js";
4
4
  import {
5
5
  runWarpGrep
6
- } from "./chunk-PRIYMEI6.js";
6
+ } from "./chunk-JJ5ONKDN.js";
7
7
 
8
8
  // tools/warp_grep/openai.ts
9
9
  import { z } from "zod";
@@ -53,4 +53,4 @@ function createMorphWarpGrepTool(config) {
53
53
  export {
54
54
  createMorphWarpGrepTool
55
55
  };
56
- //# sourceMappingURL=chunk-LFYQ6GKI.js.map
56
+ //# sourceMappingURL=chunk-4OBDFXR4.js.map
@@ -13,7 +13,10 @@ import {
13
13
  var anthropic_exports = {};
14
14
  __export(anthropic_exports, {
15
15
  createEditFileTool: () => createEditFileTool,
16
- editFileTool: () => editFileTool
16
+ editFileTool: () => editFileTool,
17
+ execute: () => execute,
18
+ formatResult: () => formatResult,
19
+ getSystemPrompt: () => getSystemPrompt
17
20
  });
18
21
  var editFileTool = {
19
22
  name: "edit_file",
@@ -73,10 +76,19 @@ function createEditFileTool(config = {}) {
73
76
  }
74
77
  });
75
78
  }
79
+ async function execute(input, config) {
80
+ return executeEditFile(input, config);
81
+ }
82
+ function getSystemPrompt() {
83
+ return EDIT_FILE_SYSTEM_PROMPT;
84
+ }
76
85
 
77
86
  export {
78
87
  editFileTool,
88
+ formatResult,
79
89
  createEditFileTool,
90
+ execute,
91
+ getSystemPrompt,
80
92
  anthropic_exports
81
93
  };
82
- //# sourceMappingURL=chunk-S3HTYGYF.js.map
94
+ //# sourceMappingURL=chunk-B4H7N4GZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/fastapply/anthropic.ts"],"sourcesContent":["/**\n * Anthropic SDK adapter for edit_file tool\n */\n\nimport type { Tool } from '@anthropic-ai/sdk/resources/messages';\nimport { executeEditFile } from './core.js';\nimport { EDIT_FILE_TOOL_DESCRIPTION, EDIT_FILE_SYSTEM_PROMPT } from './prompts.js';\nimport type { EditFileInput, EditFileResult, EditFileConfig } from './types.js';\n\n/**\n * Anthropic-native tool definition for edit_file\n * \n * @example\n * ```ts\n * import Anthropic from '@anthropic-ai/sdk';\n * import { editFileTool } from 'morphsdk/tools/anthropic';\n * \n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * \n * const response = await client.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * tools: [editFileTool],\n * messages: [{ role: \"user\", content: \"Fix the bug in app.ts\" }]\n * });\n * ```\n */\nexport const editFileTool: Tool = {\n name: 'edit_file',\n description: EDIT_FILE_TOOL_DESCRIPTION,\n input_schema: {\n type: 'object',\n properties: {\n target_filepath: {\n type: 'string',\n description: 'The path of the target file to modify',\n },\n instructions: {\n type: 'string',\n description: 'A single sentence describing what you are changing (first person)',\n },\n code_edit: {\n type: 'string',\n description: 'The lazy edit with // ... existing code ... markers',\n },\n },\n required: ['target_filepath', 'instructions', 'code_edit'],\n },\n};\n\n/**\n * Format the result for passing back to Claude\n * \n * @param result - The edit result\n * @returns Formatted string for tool_result\n */\nexport function formatResult(result: EditFileResult): string {\n if (!result.success) {\n return `Error editing file: ${result.error}`;\n }\n \n const { changes } = result;\n const summary = [\n changes.linesAdded && `+${changes.linesAdded} lines`,\n changes.linesRemoved && `-${changes.linesRemoved} lines`,\n changes.linesModified && `~${changes.linesModified} lines modified`,\n ]\n .filter(Boolean)\n .join(', ');\n \n if (result.udiff) {\n return `Successfully applied changes to ${result.filepath}:\\n\\n${result.udiff}\\n\\nSummary: ${summary}`;\n }\n \n return `Successfully applied changes to ${result.filepath}. ${summary}`;\n}\n\n/**\n * Create a custom edit_file tool with configuration\n * \n * @param config - Configuration options\n * @returns Tool definition with execute and formatResult methods\n * \n * @example\n * ```ts\n * const tool = createEditFileTool({\n * baseDir: './src',\n * generateUdiff: true,\n * morphApiKey: 'sk-...',\n * description: 'Custom tool description for your use case'\n * });\n * \n * // Use as Anthropic tool\n * const response = await client.messages.create({\n * tools: [tool], // tool itself is the Tool definition\n * ...\n * });\n * \n * // Execute and format\n * const result = await tool.execute(toolUseBlock.input);\n * const formatted = tool.formatResult(result);\n * ```\n */\nexport function createEditFileTool(config: EditFileConfig = {}) {\n const toolDef: Tool = {\n ...editFileTool,\n ...(config.description && { description: config.description }),\n };\n \n return Object.assign({}, toolDef, {\n execute: async (input: EditFileInput): Promise<EditFileResult> => {\n return executeEditFile(input, config);\n },\n formatResult: (result: EditFileResult): string => {\n return formatResult(result);\n },\n getSystemPrompt: (): string => {\n return EDIT_FILE_SYSTEM_PROMPT;\n },\n });\n}\n\n/**\n * Execute the edit_file tool with raw input\n * \n * @param input - Tool input from Claude's tool_use\n * @param config - Configuration for Fast Apply\n * @returns Tool result to send back to Claude\n */\nexport async function execute(\n input: EditFileInput,\n config?: EditFileConfig\n): Promise<EditFileResult> {\n return executeEditFile(input, config);\n}\n\n/**\n * Get the system prompt for the edit_file tool\n * \n * @returns System prompt string\n */\nexport function getSystemPrompt(): string {\n return EDIT_FILE_SYSTEM_PROMPT;\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BO,IAAM,eAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,mBAAmB,gBAAgB,WAAW;AAAA,EAC3D;AACF;AAQO,SAAS,aAAa,QAAgC;AAC3D,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,uBAAuB,OAAO,KAAK;AAAA,EAC5C;AAEA,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,UAAU;AAAA,IACd,QAAQ,cAAc,IAAI,QAAQ,UAAU;AAAA,IAC5C,QAAQ,gBAAgB,IAAI,QAAQ,YAAY;AAAA,IAChD,QAAQ,iBAAiB,IAAI,QAAQ,aAAa;AAAA,EACpD,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,MAAI,OAAO,OAAO;AAChB,WAAO,mCAAmC,OAAO,QAAQ;AAAA;AAAA,EAAQ,OAAO,KAAK;AAAA;AAAA,WAAgB,OAAO;AAAA,EACtG;AAEA,SAAO,mCAAmC,OAAO,QAAQ,KAAK,OAAO;AACvE;AA4BO,SAAS,mBAAmB,SAAyB,CAAC,GAAG;AAC9D,QAAM,UAAgB;AAAA,IACpB,GAAG;AAAA,IACH,GAAI,OAAO,eAAe,EAAE,aAAa,OAAO,YAAY;AAAA,EAC9D;AAEA,SAAO,OAAO,OAAO,CAAC,GAAG,SAAS;AAAA,IAChC,SAAS,OAAO,UAAkD;AAChE,aAAO,gBAAgB,OAAO,MAAM;AAAA,IACtC;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AASA,eAAsB,QACpB,OACA,QACyB;AACzB,SAAO,gBAAgB,OAAO,MAAM;AACtC;AAOO,SAAS,kBAA0B;AACxC,SAAO;AACT;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-UYBIKZPM.js";
4
4
  import {
5
5
  runWarpGrep
6
- } from "./chunk-PRIYMEI6.js";
6
+ } from "./chunk-JJ5ONKDN.js";
7
7
 
8
8
  // tools/warp_grep/vercel.ts
9
9
  import { tool } from "ai";
@@ -41,4 +41,4 @@ function createMorphWarpGrepTool(config) {
41
41
  export {
42
42
  createMorphWarpGrepTool
43
43
  };
44
- //# sourceMappingURL=chunk-HNYSKGCP.js.map
44
+ //# sourceMappingURL=chunk-BGDEQTRF.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- getSystemPrompt
3
- } from "./chunk-HKZB23U7.js";
4
1
  import {
5
2
  toolAnalyse
6
3
  } from "./chunk-73RQWOQC.js";
@@ -10,6 +7,9 @@ import {
10
7
  import {
11
8
  toolRead
12
9
  } from "./chunk-Z2FBMSNE.js";
10
+ import {
11
+ getSystemPrompt
12
+ } from "./chunk-HKZB23U7.js";
13
13
  import {
14
14
  AGENT_CONFIG,
15
15
  DEFAULT_MODEL
@@ -198,4 +198,4 @@ async function runWarpGrep(config) {
198
198
  export {
199
199
  runWarpGrep
200
200
  };
201
- //# sourceMappingURL=chunk-PRIYMEI6.js.map
201
+ //# sourceMappingURL=chunk-JJ5ONKDN.js.map
@@ -6,4 +6,4 @@ export {
6
6
  default2 as default,
7
7
  default3 as default2
8
8
  };
9
- //# sourceMappingURL=chunk-2DXRTGRH.js.map
9
+ //# sourceMappingURL=chunk-Q7PDN7TS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../git/index.ts"],"sourcesContent":["/**\n * Morph Git SDK\n * \n * Git operations for AI agents using Morph's backend infrastructure.\n * \n * @example\n * ```typescript\n * import { MorphGit } from 'morphsdk/git';\n * \n * const morphGit = new MorphGit({\n * apiKey: process.env.MORPH_API_KEY!\n * });\n * \n * // Initialize and push\n * await morphGit.init({ repoId: 'my-project', dir: './my-project' });\n * await morphGit.add({ dir: './my-project', filepath: 'src/app.ts' });\n * await morphGit.commit({ dir: './my-project', message: 'Update' });\n * await morphGit.push({ dir: './my-project', branch: 'main' });\n * ```\n */\n\nexport { MorphGit } from './client.js';\nexport type {\n MorphGitConfig,\n CloneOptions,\n PushOptions,\n PullOptions,\n AddOptions,\n CommitOptions,\n StatusOptions,\n LogOptions,\n CheckoutOptions,\n BranchOptions,\n DiffOptions,\n CommitObject,\n StatusResult,\n ChatMessage,\n CommitMetadata,\n} from './types.js';\n\n// Re-export isomorphic-git for advanced use cases\nexport { default as git } from 'isomorphic-git';\nexport { default as http } from 'isomorphic-git/http/node';\n\n"],"mappings":";AAyCA,SAAoB,WAAXA,gBAAsB;AAC/B,SAAoB,WAAXA,gBAAuB;","names":["default"]}
@@ -100,11 +100,19 @@ var MorphGit = class {
100
100
  *
101
101
  * @example
102
102
  * ```ts
103
- * await morphGit.push({ dir: './my-project' });
103
+ * await morphGit.push({
104
+ * dir: './my-project',
105
+ * branch: 'main' // Required: explicit branch name
106
+ * });
104
107
  * ```
105
108
  */
106
109
  async push(options) {
107
110
  const { dir, remote = "origin", branch } = options;
111
+ if (!branch) {
112
+ throw new Error(
113
+ 'branch is required for push operations. Specify the branch explicitly: { dir: "./my-project", branch: "main" }'
114
+ );
115
+ }
108
116
  await git.push({
109
117
  fs,
110
118
  http,
@@ -119,11 +127,19 @@ var MorphGit = class {
119
127
  *
120
128
  * @example
121
129
  * ```ts
122
- * await morphGit.pull({ dir: './my-project' });
130
+ * await morphGit.pull({
131
+ * dir: './my-project',
132
+ * branch: 'main' // Required: explicit branch name
133
+ * });
123
134
  * ```
124
135
  */
125
136
  async pull(options) {
126
137
  const { dir, remote = "origin", branch } = options;
138
+ if (!branch) {
139
+ throw new Error(
140
+ 'branch is required for pull operations. Specify the branch explicitly: { dir: "./my-project", branch: "main" }'
141
+ );
142
+ }
127
143
  await git.pull({
128
144
  fs,
129
145
  http,
@@ -440,4 +456,4 @@ var MorphGit = class {
440
456
  export {
441
457
  MorphGit
442
458
  };
443
- //# sourceMappingURL=chunk-DF2ZOO7R.js.map
459
+ //# sourceMappingURL=chunk-TBVDBQZ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../git/client.ts"],"sourcesContent":["/**\n * Morph Git Client - Simple, high-level Git operations\n * Built on isomorphic-git with explicit configuration\n */\n\nimport git from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\nimport fs from 'fs';\nimport type {\n CloneOptions,\n PushOptions,\n PullOptions,\n AddOptions,\n CommitOptions,\n StatusOptions,\n LogOptions,\n CheckoutOptions,\n BranchOptions,\n DiffOptions,\n CommitObject,\n StatusResult,\n MorphGitConfig,\n CommitMetadata,\n} from './types.js';\n\nconst DEFAULT_PROXY_URL = 'https://repos.morphllm.com';\n\n/**\n * MorphGit - Git operations for AI agents with Morph backend\n * \n * @example\n * ```typescript\n * import { MorphGit } from 'morphsdk/git';\n * \n * const morphGit = new MorphGit({\n * apiKey: process.env.MORPH_API_KEY!,\n * proxyUrl: 'https://repos.morphllm.com' // Optional\n * });\n * \n * await morphGit.init({ repoId: 'my-project', dir: './my-project' });\n * await morphGit.push({ dir: './my-project' });\n * ```\n */\nexport class MorphGit {\n private readonly apiKey: string;\n private readonly proxyUrl: string;\n\n constructor(config: MorphGitConfig) {\n // Validate API key\n if (!config.apiKey) {\n throw new Error('API key is required. Get one at https://morphllm.com/dashboard');\n }\n \n if (!config.apiKey.startsWith('sk-') && !config.apiKey.startsWith('morph-')) {\n throw new Error('Invalid API key format. Expected: sk-... or morph-...');\n }\n \n this.apiKey = config.apiKey;\n this.proxyUrl = config.proxyUrl || DEFAULT_PROXY_URL;\n }\n \n /**\n * Get auth callback for isomorphic-git operations\n * @private\n */\n private getAuthCallback() {\n return () => ({\n username: 'morph',\n password: this.apiKey,\n });\n }\n\n /**\n * Initialize a new repository\n * Creates the repo in the database and in the git provider\n * \n * @example\n * ```ts\n * await morphGit.init({\n * repoId: 'my-project',\n * dir: './my-project',\n * defaultBranch: 'main'\n * });\n * ```\n */\n async init(options: {\n repoId: string;\n dir: string;\n defaultBranch?: string;\n }): Promise<void> {\n const { repoId, dir, defaultBranch = 'main' } = options;\n\n // Call backend API to create repository\n const response = await fetch(`${this.proxyUrl}/v1/repos`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repoId,\n name: repoId,\n defaultBranch,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create repository: ${error}`);\n }\n\n // Initialize local git repository (industry standard: no clone needed)\n await git.init({\n fs,\n dir,\n defaultBranch,\n });\n\n // Add remote pointing to Morph git-proxy\n await git.addRemote({\n fs,\n dir,\n remote: 'origin',\n url: `${this.proxyUrl}/v1/repos/${repoId}`,\n });\n\n console.log(`✓ Repository '${repoId}' initialized`);\n }\n\n /**\n * Clone a repository from Morph repos\n * \n * @example\n * ```ts\n * await morphGit.clone({\n * repoId: 'my-project',\n * dir: './my-project'\n * });\n * ```\n */\n async clone(options: CloneOptions): Promise<void> {\n const { repoId, dir, branch = 'main', depth, singleBranch = true } = options;\n\n await git.clone({\n fs,\n http,\n dir,\n corsProxy: this.proxyUrl,\n url: `${this.proxyUrl}/v1/repos/${repoId}`,\n ref: branch,\n singleBranch,\n depth,\n onAuth: this.getAuthCallback(),\n });\n }\n\n /**\n * Push changes to remote repository\n * \n * @example\n * ```ts\n * await morphGit.push({ \n * dir: './my-project',\n * branch: 'main' // Required: explicit branch name\n * });\n * ```\n */\n async push(options: PushOptions): Promise<void> {\n const { dir, remote = 'origin', branch } = options;\n\n if (!branch) {\n throw new Error(\n 'branch is required for push operations. ' +\n 'Specify the branch explicitly: { dir: \"./my-project\", branch: \"main\" }'\n );\n }\n\n await git.push({\n fs,\n http,\n dir,\n remote,\n ref: branch,\n onAuth: this.getAuthCallback(),\n });\n }\n\n /**\n * Pull changes from remote repository\n * \n * @example\n * ```ts\n * await morphGit.pull({ \n * dir: './my-project',\n * branch: 'main' // Required: explicit branch name\n * });\n * ```\n */\n async pull(options: PullOptions): Promise<void> {\n const { dir, remote = 'origin', branch } = options;\n\n if (!branch) {\n throw new Error(\n 'branch is required for pull operations. ' +\n 'Specify the branch explicitly: { dir: \"./my-project\", branch: \"main\" }'\n );\n }\n\n await git.pull({\n fs,\n http,\n dir,\n remote,\n ref: branch,\n onAuth: this.getAuthCallback(),\n author: {\n name: 'Morph Agent',\n email: 'agent@morph.com',\n },\n });\n }\n\n /**\n * Stage a file for commit\n * \n * @example\n * ```ts\n * await morphGit.add({\n * dir: './my-project',\n * filepath: 'src/app.ts'\n * });\n * ```\n */\n async add(options: AddOptions): Promise<void> {\n const { dir, filepath } = options;\n\n await git.add({\n fs,\n dir,\n filepath,\n });\n }\n\n /**\n * Remove a file from staging\n * \n * @example\n * ```ts\n * await morphGit.remove({\n * dir: './my-project',\n * filepath: 'src/old-file.ts'\n * });\n * ```\n */\n async remove(options: AddOptions): Promise<void> {\n const { dir, filepath } = options;\n\n await git.remove({\n fs,\n dir,\n filepath,\n });\n }\n\n /**\n * Commit staged changes\n * \n * @example\n * ```ts\n * await morphGit.commit({\n * dir: './my-project',\n * message: 'Add new feature',\n * author: {\n * name: 'AI Agent',\n * email: 'ai@example.com'\n * },\n * chatHistory: [\n * { role: 'user', content: 'Please add a new feature' },\n * { role: 'assistant', content: 'I will add that feature' }\n * ],\n * recordingId: 'rec_123'\n * });\n * ```\n */\n async commit(options: CommitOptions): Promise<string> {\n const { dir, message, author, chatHistory, recordingId } = options;\n\n // Provide default author if not specified\n const commitAuthor = author || {\n name: 'Morph SDK',\n email: 'sdk@morphllm.com'\n };\n\n const sha = await git.commit({\n fs,\n dir,\n message,\n author: commitAuthor,\n });\n\n // Store metadata as git note if provided\n if (chatHistory || recordingId) {\n const metadata: CommitMetadata = {\n chatHistory,\n recordingId\n };\n \n await git.addNote({\n fs,\n dir,\n ref: 'refs/notes/morph-metadata',\n oid: sha,\n note: JSON.stringify(metadata, null, 2),\n author: commitAuthor\n });\n }\n\n return sha;\n }\n\n /**\n * Get status of a file\n * \n * @example\n * ```ts\n * const status = await morphGit.status({\n * dir: './my-project',\n * filepath: 'src/app.ts'\n * });\n * console.log(status); // 'modified', '*added', etc.\n * ```\n */\n async status(options: StatusOptions): Promise<string> {\n const { dir, filepath } = options;\n\n if (!filepath) {\n throw new Error('filepath is required for status check');\n }\n\n const status = await git.status({\n fs,\n dir,\n filepath,\n });\n\n return status;\n }\n\n /**\n * Get commit history\n * \n * @example\n * ```ts\n * const commits = await morphGit.log({\n * dir: './my-project',\n * depth: 10\n * });\n * ```\n */\n async log(options: LogOptions): Promise<CommitObject[]> {\n const { dir, depth, ref } = options;\n\n const commits = await git.log({\n fs,\n dir,\n depth,\n ref,\n });\n\n return commits as CommitObject[];\n }\n\n /**\n * Checkout a branch or commit\n * \n * @example\n * ```ts\n * await morphGit.checkout({\n * dir: './my-project',\n * ref: 'feature-branch'\n * });\n * ```\n */\n async checkout(options: CheckoutOptions): Promise<void> {\n const { dir, ref } = options;\n\n await git.checkout({\n fs,\n dir,\n ref,\n });\n }\n\n /**\n * Create a new branch\n * \n * @example\n * ```ts\n * await morphGit.branch({\n * dir: './my-project',\n * name: 'feature-branch',\n * checkout: true\n * });\n * ```\n */\n async branch(options: BranchOptions): Promise<void> {\n const { dir, name, checkout = false } = options;\n\n await git.branch({\n fs,\n dir,\n ref: name,\n checkout,\n });\n }\n\n /**\n * List all branches\n * \n * @example\n * ```ts\n * const branches = await morphGit.listBranches({\n * dir: './my-project'\n * });\n * ```\n */\n async listBranches(options: { dir: string }): Promise<string[]> {\n const { dir } = options;\n\n const branches = await git.listBranches({\n fs,\n dir,\n });\n\n return branches;\n }\n\n /**\n * Get the current branch name\n * \n * @example\n * ```ts\n * const branch = await morphGit.currentBranch({\n * dir: './my-project'\n * });\n * ```\n */\n async currentBranch(options: { dir: string }): Promise<string | undefined> {\n const { dir } = options;\n\n const branch = await git.currentBranch({\n fs,\n dir,\n });\n\n return branch || undefined;\n }\n\n /**\n * Get list of changed files (similar to git diff --name-only)\n * \n * @example\n * ```ts\n * const changes = await morphGit.statusMatrix({\n * dir: './my-project'\n * });\n * ```\n */\n async statusMatrix(options: { dir: string }): Promise<StatusResult[]> {\n const { dir } = options;\n\n const matrix = await git.statusMatrix({\n fs,\n dir,\n });\n\n return matrix.map(([filepath, HEADStatus, workdirStatus, stageStatus]) => {\n let status: StatusResult['status'] = 'unmodified';\n\n // Determine status based on statusMatrix values\n if (HEADStatus === 1 && workdirStatus === 2 && stageStatus === 2) {\n status = 'modified';\n } else if (HEADStatus === 1 && workdirStatus === 2 && stageStatus === 1) {\n status = '*modified';\n } else if (HEADStatus === 0 && workdirStatus === 2 && stageStatus === 2) {\n status = 'added';\n } else if (HEADStatus === 0 && workdirStatus === 2 && stageStatus === 0) {\n status = '*added';\n } else if (HEADStatus === 1 && workdirStatus === 0 && stageStatus === 0) {\n status = 'deleted';\n } else if (HEADStatus === 1 && workdirStatus === 0 && stageStatus === 1) {\n status = '*deleted';\n } else if (HEADStatus === 1 && workdirStatus === 1 && stageStatus === 1) {\n status = 'unmodified';\n } else if (HEADStatus === 0 && workdirStatus === 0 && stageStatus === 0) {\n status = 'absent';\n }\n\n return {\n filepath,\n status,\n };\n });\n }\n\n /**\n * Get the current commit hash\n * \n * @example\n * ```ts\n * const hash = await morphGit.resolveRef({\n * dir: './my-project',\n * ref: 'HEAD'\n * });\n * ```\n */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n\n const oid = await git.resolveRef({\n fs,\n dir,\n ref,\n });\n\n return oid;\n }\n\n /**\n * Get metadata (chat history, recording ID) attached to a commit\n * \n * @example\n * ```ts\n * const metadata = await morphGit.getCommitMetadata({\n * dir: './my-project',\n * commitSha: 'abc123...'\n * });\n * \n * if (metadata) {\n * console.log('Chat history:', metadata.chatHistory);\n * console.log('Recording ID:', metadata.recordingId);\n * }\n * ```\n */\n async getCommitMetadata(options: {\n dir: string;\n commitSha: string;\n }): Promise<CommitMetadata | null> {\n try {\n const note = await git.readNote({\n fs,\n dir: options.dir,\n ref: 'refs/notes/morph-metadata',\n oid: options.commitSha\n });\n \n const metadata = JSON.parse(new TextDecoder().decode(note));\n return metadata;\n } catch (err) {\n // No metadata found for this commit\n return null;\n }\n }\n}\n\n"],"mappings":"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","names":[]}
@@ -1,20 +1,20 @@
1
1
  import {
2
- BrowserClient
3
- } from "./chunk-NCVWIW7L.js";
4
- import {
5
- FastApplyClient
6
- } from "./chunk-Q7USYY6R.js";
2
+ AnthropicRouter,
3
+ GeminiRouter,
4
+ OpenAIRouter
5
+ } from "./chunk-AKVAAKRB.js";
7
6
  import {
8
7
  CodebaseSearchClient
9
8
  } from "./chunk-AG3ICTC5.js";
10
9
  import {
11
10
  MorphGit
12
- } from "./chunk-DF2ZOO7R.js";
11
+ } from "./chunk-TBVDBQZ2.js";
13
12
  import {
14
- AnthropicRouter,
15
- GeminiRouter,
16
- OpenAIRouter
17
- } from "./chunk-AKVAAKRB.js";
13
+ FastApplyClient
14
+ } from "./chunk-Q7USYY6R.js";
15
+ import {
16
+ BrowserClient
17
+ } from "./chunk-NCVWIW7L.js";
18
18
 
19
19
  // client.ts
20
20
  var MorphClient = class {
@@ -94,4 +94,4 @@ var MorphClient = class {
94
94
  export {
95
95
  MorphClient
96
96
  };
97
- //# sourceMappingURL=chunk-22WVN4MC.js.map
97
+ //# sourceMappingURL=chunk-U6ZHZ5LY.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-UYBIKZPM.js";
4
4
  import {
5
5
  runWarpGrep
6
- } from "./chunk-PRIYMEI6.js";
6
+ } from "./chunk-JJ5ONKDN.js";
7
7
 
8
8
  // tools/warp_grep/anthropic.ts
9
9
  import { z } from "zod";
@@ -50,4 +50,4 @@ function createMorphWarpGrepTool(config) {
50
50
  export {
51
51
  createMorphWarpGrepTool
52
52
  };
53
- //# sourceMappingURL=chunk-ZKIVLLZY.js.map
53
+ //# sourceMappingURL=chunk-VD7US3AJ.js.map
package/dist/client.cjs CHANGED
@@ -927,11 +927,19 @@ var MorphGit = class {
927
927
  *
928
928
  * @example
929
929
  * ```ts
930
- * await morphGit.push({ dir: './my-project' });
930
+ * await morphGit.push({
931
+ * dir: './my-project',
932
+ * branch: 'main' // Required: explicit branch name
933
+ * });
931
934
  * ```
932
935
  */
933
936
  async push(options) {
934
937
  const { dir, remote = "origin", branch } = options;
938
+ if (!branch) {
939
+ throw new Error(
940
+ 'branch is required for push operations. Specify the branch explicitly: { dir: "./my-project", branch: "main" }'
941
+ );
942
+ }
935
943
  await import_isomorphic_git.default.push({
936
944
  fs: import_fs.default,
937
945
  http: import_node.default,
@@ -946,11 +954,19 @@ var MorphGit = class {
946
954
  *
947
955
  * @example
948
956
  * ```ts
949
- * await morphGit.pull({ dir: './my-project' });
957
+ * await morphGit.pull({
958
+ * dir: './my-project',
959
+ * branch: 'main' // Required: explicit branch name
960
+ * });
950
961
  * ```
951
962
  */
952
963
  async pull(options) {
953
964
  const { dir, remote = "origin", branch } = options;
965
+ if (!branch) {
966
+ throw new Error(
967
+ 'branch is required for pull operations. Specify the branch explicitly: { dir: "./my-project", branch: "main" }'
968
+ );
969
+ }
954
970
  await import_isomorphic_git.default.pull({
955
971
  fs: import_fs.default,
956
972
  http: import_node.default,