@smartledger.technology/openai-claw 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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/agent.js +262 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/autopr/index.js +127 -0
  6. package/dist/autopr/index.js.map +1 -0
  7. package/dist/client.js +199 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/commands/index.js +624 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/config.js +71 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/cost.js +97 -0
  14. package/dist/cost.js.map +1 -0
  15. package/dist/eval/cli.js +32 -0
  16. package/dist/eval/cli.js.map +1 -0
  17. package/dist/eval/index.js +134 -0
  18. package/dist/eval/index.js.map +1 -0
  19. package/dist/hooks/index.js +69 -0
  20. package/dist/hooks/index.js.map +1 -0
  21. package/dist/index.js +246 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/input.js +96 -0
  24. package/dist/input.js.map +1 -0
  25. package/dist/mcp/index.js +135 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/memory/compaction.js +70 -0
  28. package/dist/memory/compaction.js.map +1 -0
  29. package/dist/memory/index.js +56 -0
  30. package/dist/memory/index.js.map +1 -0
  31. package/dist/notifications/index.js +80 -0
  32. package/dist/notifications/index.js.map +1 -0
  33. package/dist/permissions/index.js +104 -0
  34. package/dist/permissions/index.js.map +1 -0
  35. package/dist/planmode.js +12 -0
  36. package/dist/planmode.js.map +1 -0
  37. package/dist/plugins/index.js +239 -0
  38. package/dist/plugins/index.js.map +1 -0
  39. package/dist/prompts/system.js +148 -0
  40. package/dist/prompts/system.js.map +1 -0
  41. package/dist/rag/index.js +158 -0
  42. package/dist/rag/index.js.map +1 -0
  43. package/dist/self-review/index.js +157 -0
  44. package/dist/self-review/index.js.map +1 -0
  45. package/dist/session.js +113 -0
  46. package/dist/session.js.map +1 -0
  47. package/dist/skills/index.js +39 -0
  48. package/dist/skills/index.js.map +1 -0
  49. package/dist/subagent.js +128 -0
  50. package/dist/subagent.js.map +1 -0
  51. package/dist/subagents/index.js +61 -0
  52. package/dist/subagents/index.js.map +1 -0
  53. package/dist/tools/bash.js +94 -0
  54. package/dist/tools/bash.js.map +1 -0
  55. package/dist/tools/edit.js +64 -0
  56. package/dist/tools/edit.js.map +1 -0
  57. package/dist/tools/glob.js +34 -0
  58. package/dist/tools/glob.js.map +1 -0
  59. package/dist/tools/grep.js +87 -0
  60. package/dist/tools/grep.js.map +1 -0
  61. package/dist/tools/index.js +44 -0
  62. package/dist/tools/index.js.map +1 -0
  63. package/dist/tools/ls.js +39 -0
  64. package/dist/tools/ls.js.map +1 -0
  65. package/dist/tools/read.js +126 -0
  66. package/dist/tools/read.js.map +1 -0
  67. package/dist/tools/semantic.js +40 -0
  68. package/dist/tools/semantic.js.map +1 -0
  69. package/dist/tools/shell.js +131 -0
  70. package/dist/tools/shell.js.map +1 -0
  71. package/dist/tools/task.js +91 -0
  72. package/dist/tools/task.js.map +1 -0
  73. package/dist/tools/todo.js +64 -0
  74. package/dist/tools/todo.js.map +1 -0
  75. package/dist/tools/types.js +7 -0
  76. package/dist/tools/types.js.map +1 -0
  77. package/dist/tools/webfetch.js +62 -0
  78. package/dist/tools/webfetch.js.map +1 -0
  79. package/dist/tools/websearch.js +82 -0
  80. package/dist/tools/websearch.js.map +1 -0
  81. package/dist/tools/write.js +39 -0
  82. package/dist/tools/write.js.map +1 -0
  83. package/dist/ui/repl.js +203 -0
  84. package/dist/ui/repl.js.map +1 -0
  85. package/dist/ui/tui/App.js +234 -0
  86. package/dist/ui/tui/App.js.map +1 -0
  87. package/dist/ui/tui/Diff.js +38 -0
  88. package/dist/ui/tui/Diff.js.map +1 -0
  89. package/dist/ui/tui/MessageView.js +50 -0
  90. package/dist/ui/tui/MessageView.js.map +1 -0
  91. package/dist/ui/tui/PermissionPrompt.js +47 -0
  92. package/dist/ui/tui/PermissionPrompt.js.map +1 -0
  93. package/dist/ui/tui/SlashSuggest.js +36 -0
  94. package/dist/ui/tui/SlashSuggest.js.map +1 -0
  95. package/dist/ui/tui/StatusBar.js +31 -0
  96. package/dist/ui/tui/StatusBar.js.map +1 -0
  97. package/dist/ui/tui/highlight.js +66 -0
  98. package/dist/ui/tui/highlight.js.map +1 -0
  99. package/dist/ui/tui/index.js +12 -0
  100. package/dist/ui/tui/index.js.map +1 -0
  101. package/dist/ui/tui/markdown.js +46 -0
  102. package/dist/ui/tui/markdown.js.map +1 -0
  103. package/dist/ui/tui/types.js +2 -0
  104. package/dist/ui/tui/types.js.map +1 -0
  105. package/dist/web/index.js +195 -0
  106. package/dist/web/index.js.map +1 -0
  107. package/package.json +79 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Gregory J. Ward, CTO, SmartLedger.Technology
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,134 @@
1
+ # openai-claw
2
+
3
+ A Claude-Code-style CLI agent powered by **OpenAI's `gpt-5-nano`** (or any chat-completions-compatible model). Built in TypeScript with the official `openai` SDK.
4
+
5
+ It mirrors most of Claude Code's surface area: tool-calling agent loop, REPL, slash commands, permission prompts, subagents, plan mode, hooks, skills, persistent memory, and context compaction.
6
+
7
+ ---
8
+
9
+ ## Features
10
+
11
+ - **Interactive REPL** — readline-based, streaming output, `Ctrl-C` to abort a turn
12
+ - **Core tools** — `Read`, `Write`, `Edit`, `Bash`, `Grep` (ripgrep), `Glob`, `LS`, `WebFetch`, `WebSearch`, `Task`, `TodoWrite`
13
+ - **Permission system** — `ask` / `acceptEdits` / `bypassPermissions` / `plan` modes; allowlist + denylist via `settings.json`
14
+ - **Subagents** — `Task` tool spawns an isolated agent (`general-purpose` or `explore`)
15
+ - **Plan mode** — read-only investigation, no mutations until approved
16
+ - **Hooks** — `PreToolUse` / `PostToolUse` / `UserPromptSubmit` / `Stop` / `SessionStart` / `SessionEnd` shell hooks (exit 2 = block)
17
+ - **Skills** — Markdown skill files with frontmatter, invoked as `/skill-name`
18
+ - **Persistent memory** — `MEMORY.md` index + per-entry frontmatter files (user / feedback / project / reference)
19
+ - **Context compaction** — older turns are summarized when the conversation approaches the model's context window
20
+ - **Slash commands** — `/help`, `/clear`, `/model`, `/mode`, `/plan`, `/memory`, `/remember`, `/cost`, `/config`, `/init`, `/exit`
21
+ - **Shell escape** — prefix any input with `!` to run it directly in the shell
22
+ - **One-shot mode** — `claw -p "your prompt"` runs once and prints the answer
23
+
24
+ ---
25
+
26
+ ## Install
27
+
28
+ ```bash
29
+ git clone <this repo> openai-claw
30
+ cd openai-claw
31
+ npm install
32
+ npm run build
33
+ npm link # makes `claw` available globally
34
+ ```
35
+
36
+ You'll also want `ripgrep` installed for the `Grep` tool:
37
+
38
+ ```bash
39
+ sudo apt install ripgrep # Debian/Ubuntu
40
+ brew install ripgrep # macOS
41
+ ```
42
+
43
+ ## Configure
44
+
45
+ The only required setting is your OpenAI API key:
46
+
47
+ ```bash
48
+ export OPENAI_API_KEY=sk-...
49
+ ```
50
+
51
+ Optional environment overrides:
52
+
53
+ | Variable | Purpose |
54
+ | -------- | ------- |
55
+ | `OPENAI_CLAW_MODEL` | Model to use (default `gpt-5-nano`) |
56
+ | `OPENAI_BASE_URL` | Alternative API base (e.g. Azure, vLLM, OpenRouter) |
57
+ | `OPENAI_CLAW_SEARCH_PROVIDER` | `duckduckgo` (default, no key) or `tavily` |
58
+ | `TAVILY_API_KEY` | API key when using Tavily for web search |
59
+
60
+ Persistent settings live in `~/.openai-claw/settings.json` and (per project) `<workdir>/.claw/settings.json`. Project settings win.
61
+
62
+ Example `settings.json`:
63
+
64
+ ```json
65
+ {
66
+ "model": "gpt-5-nano",
67
+ "permissionMode": "acceptEdits",
68
+ "allowedTools": ["Read", "Grep", "Glob", "LS", "Bash(npm:*)", "Bash(git:*)"],
69
+ "deniedTools": ["Bash(rm:*)"],
70
+ "hooks": {
71
+ "PreToolUse": [
72
+ { "matcher": "Bash", "command": "echo $(date) ran bash >> ~/.openai-claw/audit.log" }
73
+ ]
74
+ }
75
+ }
76
+ ```
77
+
78
+ ## Use
79
+
80
+ Start the REPL in any project directory:
81
+
82
+ ```bash
83
+ cd ~/some-project
84
+ claw
85
+ ```
86
+
87
+ ```
88
+ openai-claw v0.1.0 • model=gpt-5-nano • mode=ask
89
+ workdir: /home/you/some-project
90
+ type /help for commands, /exit to quit, ! <cmd> for one-shot shell
91
+
92
+ > add a CLI flag --verbose to src/main.ts and wire it through to the logger
93
+ ```
94
+
95
+ One-shot:
96
+
97
+ ```bash
98
+ claw -p "summarize what this repo does in one paragraph"
99
+ ```
100
+
101
+ ## Project layout
102
+
103
+ ```
104
+ src/
105
+ ├── index.ts # CLI entry
106
+ ├── agent.ts # tool-calling loop + streaming
107
+ ├── client.ts # OpenAI SDK wrapper
108
+ ├── config.ts # config loading + settings.json merging
109
+ ├── subagent.ts # Task tool runner
110
+ ├── planmode.ts # plan-mode helpers
111
+ ├── prompts/system.ts # system prompt builder
112
+ ├── tools/ # Read, Write, Edit, Bash, Grep, Glob, LS, WebFetch, WebSearch, Task, TodoWrite
113
+ ├── permissions/ # ask/allow/deny + interactive prompt
114
+ ├── memory/ # listMemories/writeMemory + compaction.ts
115
+ ├── hooks/ # shell hooks driven by settings.json
116
+ ├── skills/ # SKILL.md loader
117
+ ├── commands/ # /slash commands
118
+ └── ui/repl.ts # interactive REPL
119
+ ```
120
+
121
+ ## Differences from Claude Code
122
+
123
+ - Powered by OpenAI's API, not Anthropic's — so no anthropic-prompt-caching, no extended thinking, no native MCP servers.
124
+ - No fancy ink-based TUI yet; plain readline + chalk.
125
+ - Web search defaults to scraping DuckDuckGo HTML (rate-limited and fragile); set `OPENAI_CLAW_SEARCH_PROVIDER=tavily` for production use.
126
+ - Permission model is simplified — allowlist patterns support `Tool` or `Bash(prefix:*)`, but not full glob semantics.
127
+
128
+ ## Author
129
+
130
+ **Gregory J. Ward**, CTO, [SmartLedger.Technology](https://smartledger.technology)
131
+
132
+ ## License
133
+
134
+ MIT — see [LICENSE](./LICENSE).
package/dist/agent.js ADDED
@@ -0,0 +1,262 @@
1
+ import { OpenAIClient } from "./client.js";
2
+ import { buildSystemPrompt } from "./prompts/system.js";
3
+ import { compactIfNeeded, estimateTokens } from "./memory/compaction.js";
4
+ import { computeCostUSD, appendCostLog } from "./cost.js";
5
+ import { resolveModel } from "./client.js";
6
+ function truncateForModel(s, cap) {
7
+ if (s.length <= cap)
8
+ return s;
9
+ const dropped = s.length - cap;
10
+ return s.slice(0, cap) + `\n[truncated: ${dropped} chars dropped — re-run with narrower args]`;
11
+ }
12
+ export class Agent {
13
+ opts;
14
+ client;
15
+ messages = [];
16
+ toolsByName;
17
+ totalTokens = 0;
18
+ totalCachedTokens = 0;
19
+ totalPromptTokens = 0;
20
+ totalCompletionTokens = 0;
21
+ totalCostUSD = 0;
22
+ /** Override the default model role for the very next turn (consumed once). */
23
+ nextModelRole = "default";
24
+ constructor(opts) {
25
+ this.opts = opts;
26
+ this.client = opts.client ?? new OpenAIClient(opts.config);
27
+ this.toolsByName = new Map(opts.tools.map((t) => [t.name, t]));
28
+ const sys = buildSystemPrompt({
29
+ config: opts.config,
30
+ tools: opts.tools,
31
+ extras: opts.systemPromptExtras ?? [],
32
+ });
33
+ this.messages.push({ role: "system", content: sys });
34
+ }
35
+ get conversation() {
36
+ return this.messages;
37
+ }
38
+ replaceConversation(messages) {
39
+ // Keep our current system prompt; the resumed session's system prompt may be stale.
40
+ const sys = this.messages[0];
41
+ const incoming = messages.filter((m) => m.role !== "system");
42
+ this.messages = [sys, ...incoming];
43
+ }
44
+ get usage() {
45
+ return {
46
+ totalTokens: this.totalTokens,
47
+ totalCachedTokens: this.totalCachedTokens,
48
+ totalPromptTokens: this.totalPromptTokens,
49
+ totalCompletionTokens: this.totalCompletionTokens,
50
+ totalCostUSD: this.totalCostUSD,
51
+ cacheHitRate: this.totalPromptTokens > 0 ? this.totalCachedTokens / this.totalPromptTokens : 0,
52
+ };
53
+ }
54
+ pushUser(content) {
55
+ this.messages.push({ role: "user", content });
56
+ }
57
+ /** Set the role used for the next agent turn. Reset to "default" automatically. */
58
+ setNextRole(role) {
59
+ this.nextModelRole = role;
60
+ }
61
+ /** Force a compaction pass right now, regardless of threshold. Returns [before, after] tokens or null. */
62
+ async forceCompact() {
63
+ const before = estimateTokens(this.messages);
64
+ const compacted = await compactIfNeeded(this.messages, this.opts.config, this.client, true);
65
+ if (!compacted)
66
+ return null;
67
+ this.messages = compacted;
68
+ return { before, after: estimateTokens(this.messages) };
69
+ }
70
+ clear(keepSystem = true) {
71
+ if (keepSystem && this.messages[0]?.role === "system") {
72
+ this.messages = [this.messages[0]];
73
+ }
74
+ else {
75
+ this.messages = [];
76
+ }
77
+ }
78
+ /**
79
+ * Run the agent loop until the model stops requesting tools or the abort signal fires.
80
+ */
81
+ async run(handler, abortSignal) {
82
+ const ctx = {
83
+ config: this.opts.config,
84
+ abortSignal,
85
+ permissionCheck: this.opts.permissionCheck,
86
+ spawnSubagent: this.opts.spawnSubagent,
87
+ };
88
+ const maxTurns = this.opts.config.maxTurns;
89
+ let turn = 0;
90
+ while (true) {
91
+ if (abortSignal?.aborted) {
92
+ handler({ type: "error", data: "aborted" });
93
+ return;
94
+ }
95
+ if (turn >= maxTurns) {
96
+ handler({
97
+ type: "error",
98
+ data: `max turns reached (${maxTurns}). Use /config or settings.json to raise the limit.`,
99
+ });
100
+ return;
101
+ }
102
+ turn++;
103
+ // Compact context if approaching limit. PreCompact hook may veto.
104
+ const before = estimateTokens(this.messages);
105
+ if (this.opts.runHook) {
106
+ const outcomes = await this.opts.runHook("PreCompact", {
107
+ tokens: before,
108
+ limit: Math.floor(this.opts.config.contextWindow * this.opts.config.compactThreshold),
109
+ });
110
+ const blocked = outcomes.some((o) => o.blocked);
111
+ if (blocked) {
112
+ handler({ type: "compaction", data: { skipped: "blocked by PreCompact hook" } });
113
+ }
114
+ }
115
+ const compacted = await compactIfNeeded(this.messages, this.opts.config, this.client);
116
+ if (compacted) {
117
+ const after = estimateTokens(compacted);
118
+ this.messages = compacted;
119
+ handler({ type: "compaction", data: { beforeTokens: before, afterTokens: after } });
120
+ }
121
+ const role = this.nextModelRole;
122
+ this.nextModelRole = "default";
123
+ const turnModel = resolveModel(this.opts.config, role);
124
+ let completion;
125
+ try {
126
+ completion = await this.client.complete(this.messages, this.opts.tools, {
127
+ abortSignal,
128
+ stream: true,
129
+ modelRole: role,
130
+ onDelta: (text) => handler({ type: "text_delta", data: text }),
131
+ });
132
+ }
133
+ catch (e) {
134
+ handler({ type: "error", data: e?.message ?? String(e) });
135
+ return;
136
+ }
137
+ if (completion.usage) {
138
+ this.totalTokens += completion.usage.total_tokens;
139
+ this.totalPromptTokens += completion.usage.prompt_tokens;
140
+ this.totalCompletionTokens += completion.usage.completion_tokens;
141
+ this.totalCachedTokens += completion.usage.cached_tokens;
142
+ const turnCost = computeCostUSD(turnModel, completion.usage.prompt_tokens, completion.usage.completion_tokens, completion.usage.cached_tokens);
143
+ this.totalCostUSD += turnCost;
144
+ appendCostLog(this.opts.config, {
145
+ model: turnModel,
146
+ role,
147
+ prompt_tokens: completion.usage.prompt_tokens,
148
+ cached_tokens: completion.usage.cached_tokens,
149
+ completion_tokens: completion.usage.completion_tokens,
150
+ costUSD: turnCost,
151
+ });
152
+ handler({
153
+ type: "usage",
154
+ data: {
155
+ ...completion.usage,
156
+ totalCostUSD: this.totalCostUSD,
157
+ model: turnModel,
158
+ role,
159
+ },
160
+ });
161
+ }
162
+ // Append assistant turn (with any tool calls) to the conversation.
163
+ this.messages.push({
164
+ role: "assistant",
165
+ content: completion.content,
166
+ tool_calls: completion.tool_calls.length > 0 ? completion.tool_calls : undefined,
167
+ });
168
+ if (completion.content) {
169
+ handler({ type: "text", data: completion.content });
170
+ }
171
+ if (completion.tool_calls.length === 0) {
172
+ handler({ type: "done" });
173
+ return;
174
+ }
175
+ // Execute all tool calls in parallel; preserve original order when appending tool messages.
176
+ const results = await Promise.all(completion.tool_calls.map((call) => this.executeTool(call, ctx, handler)));
177
+ for (let i = 0; i < completion.tool_calls.length; i++) {
178
+ const call = completion.tool_calls[i];
179
+ this.messages.push({
180
+ role: "tool",
181
+ tool_call_id: call.id,
182
+ name: call.function.name,
183
+ content: truncateForModel(results[i], this.opts.config.maxToolResultChars),
184
+ });
185
+ }
186
+ }
187
+ }
188
+ async executeTool(call, ctx, handler) {
189
+ const tool = this.toolsByName.get(call.function.name);
190
+ if (!tool) {
191
+ const msg = `Tool not found: ${call.function.name}`;
192
+ handler({ type: "tool_result", data: { name: call.function.name, content: msg, isError: true } });
193
+ return msg;
194
+ }
195
+ let parsedInput;
196
+ try {
197
+ parsedInput = call.function.arguments ? JSON.parse(call.function.arguments) : {};
198
+ }
199
+ catch (e) {
200
+ const msg = `Invalid JSON arguments for ${tool.name}: ${e?.message ?? String(e)}`;
201
+ handler({ type: "tool_result", data: { name: tool.name, content: msg, isError: true } });
202
+ return msg;
203
+ }
204
+ handler({
205
+ type: "tool_call",
206
+ data: { name: tool.name, input: parsedInput, preview: tool.preview?.(parsedInput), callId: call.id },
207
+ });
208
+ // PreToolUse hook — exit code 2 vetoes the call entirely.
209
+ if (this.opts.runHook) {
210
+ const outcomes = await this.opts.runHook("PreToolUse", {
211
+ tool_name: tool.name,
212
+ tool_input: parsedInput,
213
+ });
214
+ const blocked = outcomes.find((o) => o.blocked);
215
+ if (blocked) {
216
+ const msg = `Blocked by PreToolUse hook: ${blocked.stderr.trim() || "(no message)"}`;
217
+ handler({ type: "tool_result", data: { name: tool.name, content: msg, isError: true, callId: call.id } });
218
+ return msg;
219
+ }
220
+ }
221
+ // Permission check.
222
+ if (tool.needsPermission) {
223
+ const decision = await ctx.permissionCheck(tool.name, parsedInput);
224
+ if (!decision.allow) {
225
+ const msg = `Permission denied for ${tool.name}: ${decision.reason}`;
226
+ handler({ type: "tool_result", data: { name: tool.name, content: msg, isError: true } });
227
+ return msg;
228
+ }
229
+ }
230
+ let resultContent = "";
231
+ let resultIsError = false;
232
+ try {
233
+ const runCtx = {
234
+ ...ctx,
235
+ callId: call.id,
236
+ onProgress: (chunk) => handler({ type: "tool_progress", data: { callId: call.id, name: tool.name, chunk } }),
237
+ };
238
+ const result = await tool.run(parsedInput, runCtx);
239
+ resultContent = result.content;
240
+ resultIsError = !!result.isError;
241
+ handler({
242
+ type: "tool_result",
243
+ data: { name: tool.name, content: result.content, isError: result.isError, display: result.display, callId: call.id },
244
+ });
245
+ }
246
+ catch (e) {
247
+ resultContent = `Error in ${tool.name}: ${e?.message ?? String(e)}`;
248
+ resultIsError = true;
249
+ handler({ type: "tool_result", data: { name: tool.name, content: resultContent, isError: true } });
250
+ }
251
+ if (this.opts.runHook) {
252
+ await this.opts.runHook("PostToolUse", {
253
+ tool_name: tool.name,
254
+ tool_input: parsedInput,
255
+ tool_output: resultContent,
256
+ is_error: resultIsError,
257
+ });
258
+ }
259
+ return resultContent;
260
+ }
261
+ }
262
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import chalk from "chalk";
3
+ import { Agent } from "../agent.js";
4
+ import { getAllTools } from "../tools/index.js";
5
+ import { PermissionManager } from "../permissions/index.js";
6
+ import { runSubagent } from "../subagent.js";
7
+ import { HookRunner } from "../hooks/index.js";
8
+ function hasGh() {
9
+ const r = spawnSync("gh", ["--version"], { stdio: "ignore" });
10
+ return r.status === 0;
11
+ }
12
+ function isGitRepo(cwd) {
13
+ const r = spawnSync("git", ["rev-parse", "--is-inside-work-tree"], { cwd, stdio: "ignore" });
14
+ return r.status === 0;
15
+ }
16
+ function currentBranch(cwd) {
17
+ return spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { cwd, encoding: "utf8" }).stdout.trim();
18
+ }
19
+ function slugify(s) {
20
+ return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 50) || "task";
21
+ }
22
+ export async function runAutoPr(config, task) {
23
+ if (!isGitRepo(config.workdir)) {
24
+ console.error(chalk.red("not inside a git repository"));
25
+ return false;
26
+ }
27
+ if (!hasGh()) {
28
+ console.error(chalk.red("`gh` (GitHub CLI) is not installed or not in PATH"));
29
+ return false;
30
+ }
31
+ const base = currentBranch(config.workdir);
32
+ const branch = `claw/${slugify(task)}-${Date.now().toString(36)}`;
33
+ // Create a fresh branch off HEAD for the work.
34
+ const checkout = spawnSync("git", ["checkout", "-b", branch], { cwd: config.workdir, encoding: "utf8" });
35
+ if (checkout.status !== 0) {
36
+ console.error(chalk.red(`git checkout failed: ${checkout.stderr || checkout.stdout}`));
37
+ return false;
38
+ }
39
+ const hookRunner = new HookRunner(config);
40
+ const permissions = new PermissionManager(config);
41
+ const tools = getAllTools(config);
42
+ const agent = new Agent({
43
+ config,
44
+ tools,
45
+ permissionCheck: (t, i) => permissions.check(t, i),
46
+ spawnSubagent: (req) => runSubagent(config, (t, i) => permissions.check(t, i), req),
47
+ runHook: (event, payload) => hookRunner.run(event, payload),
48
+ });
49
+ agent.pushUser(`You are running in --auto-pr mode. Complete this task end to end:\n\n${task}\n\nGuidelines:\n` +
50
+ `- Use the tools available to read, edit, and run tests as needed.\n` +
51
+ `- Keep the change minimal and focused on the task.\n` +
52
+ `- Do not commit or push — the wrapper will commit and open a PR.\n` +
53
+ `- End with a one-paragraph summary describing what changed and how to verify.`);
54
+ console.error(chalk.dim(`[auto-pr] branch=${branch} base=${base}`));
55
+ let summary = "";
56
+ let sawError = false;
57
+ await agent.run((evt) => {
58
+ if (evt.type === "text")
59
+ summary = evt.data;
60
+ if (evt.type === "tool_call") {
61
+ const d = evt.data;
62
+ console.error("\n" + chalk.blue(`▸ ${d.preview ?? d.name}`));
63
+ }
64
+ if (evt.type === "tool_result") {
65
+ const d = evt.data;
66
+ if (d.isError)
67
+ console.error(chalk.red(d.content.slice(0, 2000)));
68
+ }
69
+ if (evt.type === "error") {
70
+ console.error(chalk.red(String(evt.data)));
71
+ sawError = true;
72
+ }
73
+ });
74
+ if (sawError) {
75
+ console.error(chalk.red("agent reported an error — leaving branch in place for inspection"));
76
+ return false;
77
+ }
78
+ // Stage and commit any diff the agent produced.
79
+ spawnSync("git", ["add", "-A"], { cwd: config.workdir });
80
+ const status = spawnSync("git", ["status", "--porcelain"], { cwd: config.workdir, encoding: "utf8" });
81
+ if (!status.stdout.trim()) {
82
+ console.error(chalk.yellow("agent produced no diff — aborting PR creation"));
83
+ spawnSync("git", ["checkout", base], { cwd: config.workdir });
84
+ spawnSync("git", ["branch", "-D", branch], { cwd: config.workdir });
85
+ return false;
86
+ }
87
+ const commitMsg = buildCommitMessage(task, summary);
88
+ const commit = spawnSync("git", ["commit", "-m", commitMsg], { cwd: config.workdir, encoding: "utf8" });
89
+ if (commit.status !== 0) {
90
+ console.error(chalk.red(`git commit failed: ${commit.stderr || commit.stdout}`));
91
+ return false;
92
+ }
93
+ const push = spawnSync("git", ["push", "-u", "origin", branch], { cwd: config.workdir, encoding: "utf8" });
94
+ if (push.status !== 0) {
95
+ console.error(chalk.red(`git push failed: ${push.stderr || push.stdout}`));
96
+ return false;
97
+ }
98
+ const prBody = buildPrBody(task, summary);
99
+ const pr = spawnSync("gh", ["pr", "create", "--base", base, "--head", branch, "--title", truncate(task, 70), "--body", prBody, "--draft"], { cwd: config.workdir, encoding: "utf8" });
100
+ if (pr.status !== 0) {
101
+ console.error(chalk.red(`gh pr create failed: ${pr.stderr || pr.stdout}`));
102
+ return false;
103
+ }
104
+ console.error(chalk.green(pr.stdout.trim()));
105
+ return true;
106
+ }
107
+ function buildCommitMessage(task, summary) {
108
+ const subject = truncate(task, 72);
109
+ const body = summary ? `\n\n${summary.trim()}` : "";
110
+ return `${subject}${body}`;
111
+ }
112
+ function buildPrBody(task, summary) {
113
+ return [
114
+ "## Summary",
115
+ summary.trim() || `Automated agent change for: ${task}`,
116
+ "",
117
+ "## Test plan",
118
+ "- [ ] Review the diff",
119
+ "- [ ] Run the relevant tests in your environment",
120
+ "",
121
+ "_(opened by `claw pr` — an agent ran in this branch; please review carefully)_",
122
+ ].join("\n");
123
+ }
124
+ function truncate(s, n) {
125
+ return s.length <= n ? s : s.slice(0, n - 1) + "…";
126
+ }
127
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/autopr/index.ts"],"names":[],"mappings":"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"}