patchpilots 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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +230 -0
  3. package/dist/bin/demo.d.ts +2 -0
  4. package/dist/bin/demo.js +5 -0
  5. package/dist/bin/demo.js.map +1 -0
  6. package/dist/bin/patchpilots.d.ts +2 -0
  7. package/dist/bin/patchpilots.js +5 -0
  8. package/dist/bin/patchpilots.js.map +1 -0
  9. package/dist/src/agents/base-agent.d.ts +13 -0
  10. package/dist/src/agents/base-agent.js +23 -0
  11. package/dist/src/agents/base-agent.js.map +1 -0
  12. package/dist/src/agents/coder.d.ts +63 -0
  13. package/dist/src/agents/coder.js +59 -0
  14. package/dist/src/agents/coder.js.map +1 -0
  15. package/dist/src/agents/docs.d.ts +40 -0
  16. package/dist/src/agents/docs.js +45 -0
  17. package/dist/src/agents/docs.js.map +1 -0
  18. package/dist/src/agents/index.d.ts +6 -0
  19. package/dist/src/agents/index.js +7 -0
  20. package/dist/src/agents/index.js.map +1 -0
  21. package/dist/src/agents/planner.d.ts +63 -0
  22. package/dist/src/agents/planner.js +59 -0
  23. package/dist/src/agents/planner.js.map +1 -0
  24. package/dist/src/agents/reviewer.d.ts +60 -0
  25. package/dist/src/agents/reviewer.js +46 -0
  26. package/dist/src/agents/reviewer.js.map +1 -0
  27. package/dist/src/agents/tester.d.ts +47 -0
  28. package/dist/src/agents/tester.js +51 -0
  29. package/dist/src/agents/tester.js.map +1 -0
  30. package/dist/src/cli/commands/docs.d.ts +2 -0
  31. package/dist/src/cli/commands/docs.js +40 -0
  32. package/dist/src/cli/commands/docs.js.map +1 -0
  33. package/dist/src/cli/commands/improve.d.ts +2 -0
  34. package/dist/src/cli/commands/improve.js +42 -0
  35. package/dist/src/cli/commands/improve.js.map +1 -0
  36. package/dist/src/cli/commands/plan.d.ts +2 -0
  37. package/dist/src/cli/commands/plan.js +38 -0
  38. package/dist/src/cli/commands/plan.js.map +1 -0
  39. package/dist/src/cli/commands/review.d.ts +2 -0
  40. package/dist/src/cli/commands/review.js +38 -0
  41. package/dist/src/cli/commands/review.js.map +1 -0
  42. package/dist/src/cli/commands/test.d.ts +2 -0
  43. package/dist/src/cli/commands/test.js +40 -0
  44. package/dist/src/cli/commands/test.js.map +1 -0
  45. package/dist/src/cli/index.d.ts +1 -0
  46. package/dist/src/cli/index.js +2 -0
  47. package/dist/src/cli/index.js.map +1 -0
  48. package/dist/src/cli/program.d.ts +2 -0
  49. package/dist/src/cli/program.js +20 -0
  50. package/dist/src/cli/program.js.map +1 -0
  51. package/dist/src/core/config.d.ts +6 -0
  52. package/dist/src/core/config.js +72 -0
  53. package/dist/src/core/config.js.map +1 -0
  54. package/dist/src/core/llm-client.d.ts +19 -0
  55. package/dist/src/core/llm-client.js +70 -0
  56. package/dist/src/core/llm-client.js.map +1 -0
  57. package/dist/src/core/orchestrator.d.ts +27 -0
  58. package/dist/src/core/orchestrator.js +262 -0
  59. package/dist/src/core/orchestrator.js.map +1 -0
  60. package/dist/src/index.d.ts +5 -0
  61. package/dist/src/index.js +6 -0
  62. package/dist/src/index.js.map +1 -0
  63. package/dist/src/types/agent.d.ts +21 -0
  64. package/dist/src/types/agent.js +2 -0
  65. package/dist/src/types/agent.js.map +1 -0
  66. package/dist/src/types/config.d.ts +11 -0
  67. package/dist/src/types/config.js +10 -0
  68. package/dist/src/types/config.js.map +1 -0
  69. package/dist/src/types/index.d.ts +3 -0
  70. package/dist/src/types/index.js +4 -0
  71. package/dist/src/types/index.js.map +1 -0
  72. package/dist/src/types/review.d.ts +61 -0
  73. package/dist/src/types/review.js +2 -0
  74. package/dist/src/types/review.js.map +1 -0
  75. package/dist/src/utils/banner.d.ts +2 -0
  76. package/dist/src/utils/banner.js +65 -0
  77. package/dist/src/utils/banner.js.map +1 -0
  78. package/dist/src/utils/cost.d.ts +15 -0
  79. package/dist/src/utils/cost.js +46 -0
  80. package/dist/src/utils/cost.js.map +1 -0
  81. package/dist/src/utils/files.d.ts +2 -0
  82. package/dist/src/utils/files.js +65 -0
  83. package/dist/src/utils/files.js.map +1 -0
  84. package/dist/src/utils/formatter.d.ts +7 -0
  85. package/dist/src/utils/formatter.js +190 -0
  86. package/dist/src/utils/formatter.js.map +1 -0
  87. package/dist/src/utils/logger.d.ts +9 -0
  88. package/dist/src/utils/logger.js +28 -0
  89. package/dist/src/utils/logger.js.map +1 -0
  90. package/package.json +57 -0
@@ -0,0 +1,72 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { resolve, dirname } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { z } from "zod";
5
+ import { DEFAULT_CONFIG } from "../types/index.js";
6
+ const configSchema = z.object({
7
+ apiKey: z.string().optional(),
8
+ model: z.string().optional(),
9
+ maxTokens: z.number().positive().optional(),
10
+ temperature: z.number().min(0).max(1).optional(),
11
+ include: z.array(z.string()).optional(),
12
+ exclude: z.array(z.string()).optional(),
13
+ maxFileSize: z.number().positive().optional(),
14
+ maxFiles: z.number().positive().optional(),
15
+ });
16
+ function findConfigFile(startDir) {
17
+ let dir = resolve(startDir);
18
+ while (true) {
19
+ const configPath = resolve(dir, ".patchpilots.json");
20
+ if (existsSync(configPath))
21
+ return configPath;
22
+ const parent = dirname(dir);
23
+ if (parent === dir)
24
+ break;
25
+ dir = parent;
26
+ }
27
+ return null;
28
+ }
29
+ function loadGlobalConfig() {
30
+ const globalPath = resolve(homedir(), ".patchpilots.json");
31
+ if (!existsSync(globalPath))
32
+ return {};
33
+ try {
34
+ return configSchema.parse(JSON.parse(readFileSync(globalPath, "utf-8")));
35
+ }
36
+ catch {
37
+ return {};
38
+ }
39
+ }
40
+ function loadFileConfig(startDir) {
41
+ const configPath = findConfigFile(startDir);
42
+ if (!configPath)
43
+ return {};
44
+ try {
45
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
46
+ return configSchema.parse(raw);
47
+ }
48
+ catch {
49
+ return {};
50
+ }
51
+ }
52
+ export function loadConfig(targetPath, cliOptions = {}) {
53
+ const globalConfig = loadGlobalConfig();
54
+ const fileConfig = cliOptions.config
55
+ ? configSchema.parse(JSON.parse(readFileSync(resolve(cliOptions.config), "utf-8")))
56
+ : loadFileConfig(targetPath);
57
+ const apiKey = fileConfig.apiKey ??
58
+ globalConfig.apiKey ??
59
+ process.env.ANTHROPIC_API_KEY ??
60
+ "";
61
+ if (!apiKey) {
62
+ throw new Error("Missing API key. Set ANTHROPIC_API_KEY environment variable or add apiKey to .patchpilots.json");
63
+ }
64
+ return {
65
+ ...DEFAULT_CONFIG,
66
+ ...globalConfig,
67
+ ...fileConfig,
68
+ ...(cliOptions.model ? { model: cliOptions.model } : {}),
69
+ apiKey,
70
+ };
71
+ }
72
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { z } from "zod";
2
+ export interface LLMResponse<T = string> {
3
+ data: T;
4
+ usage: {
5
+ input: number;
6
+ output: number;
7
+ };
8
+ }
9
+ export interface ChatOptions {
10
+ maxTokens: number;
11
+ temperature: number;
12
+ model?: string;
13
+ }
14
+ export declare class LLMClient {
15
+ private client;
16
+ private defaultModel;
17
+ constructor(apiKey: string, defaultModel?: string);
18
+ chatStructured<T>(systemPrompt: string, userMessage: string, schema: z.ZodType<T>, options: ChatOptions, onToken?: (text: string) => void): Promise<LLMResponse<T>>;
19
+ }
@@ -0,0 +1,70 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import { zodToJsonSchema } from "zod-to-json-schema";
3
+ import { log } from "../utils/logger.js";
4
+ export class LLMClient {
5
+ client;
6
+ defaultModel;
7
+ constructor(apiKey, defaultModel = "claude-sonnet-4-6") {
8
+ this.client = new Anthropic({ apiKey });
9
+ this.defaultModel = defaultModel;
10
+ }
11
+ async chatStructured(systemPrompt, userMessage, schema, options, onToken) {
12
+ const model = options.model ?? this.defaultModel;
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ const jsonSchema = zodToJsonSchema(schema);
15
+ try {
16
+ const stream = this.client.messages.stream({
17
+ model,
18
+ max_tokens: options.maxTokens,
19
+ temperature: 1,
20
+ thinking: { type: "adaptive" },
21
+ system: [{ type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }],
22
+ messages: [{ role: "user", content: userMessage }],
23
+ output_config: {
24
+ format: {
25
+ type: "json_schema",
26
+ schema: jsonSchema,
27
+ },
28
+ },
29
+ });
30
+ for await (const event of stream) {
31
+ if (event.type === "content_block_delta") {
32
+ if (event.delta.type === "thinking_delta" && onToken) {
33
+ onToken(event.delta.thinking);
34
+ }
35
+ else if (event.delta.type === "text_delta" && onToken) {
36
+ onToken(event.delta.text);
37
+ }
38
+ }
39
+ }
40
+ const finalMessage = await stream.finalMessage();
41
+ const text = finalMessage.content
42
+ .filter((block) => block.type === "text")
43
+ .map((block) => block.text)
44
+ .join("\n");
45
+ const parsed = schema.parse(JSON.parse(text));
46
+ return {
47
+ data: parsed,
48
+ usage: {
49
+ input: finalMessage.usage.input_tokens,
50
+ output: finalMessage.usage.output_tokens,
51
+ },
52
+ };
53
+ }
54
+ catch (error) {
55
+ if (error instanceof Anthropic.RateLimitError) {
56
+ log.warn("Rate limited — waiting 10s before retry...");
57
+ await new Promise((resolve) => setTimeout(resolve, 10_000));
58
+ return this.chatStructured(systemPrompt, userMessage, schema, options, onToken);
59
+ }
60
+ if (error instanceof Anthropic.AuthenticationError) {
61
+ throw new Error("Invalid API key. Check your ANTHROPIC_API_KEY.");
62
+ }
63
+ if (error instanceof Anthropic.APIError) {
64
+ throw new Error(`Claude API error (${error.status}): ${error.message}`);
65
+ }
66
+ throw error;
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=llm-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../../src/core/llm-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { PatchPilotsConfig } from "../types/index.js";
2
+ import type { ReviewResult, CoderResult, TestResult, PlanResult, DocsResult } from "../types/review.js";
3
+ export interface OrchestratorOptions {
4
+ json?: boolean;
5
+ verbose?: boolean;
6
+ write?: boolean;
7
+ backup?: boolean;
8
+ severity?: string;
9
+ framework?: string;
10
+ task?: string;
11
+ }
12
+ export declare class Orchestrator {
13
+ private llmClient;
14
+ private config;
15
+ private costTracker;
16
+ constructor(config: PatchPilotsConfig);
17
+ private printCost;
18
+ private createStreamCallback;
19
+ review(targetPath: string, options?: OrchestratorOptions): Promise<ReviewResult>;
20
+ improve(targetPath: string, options?: OrchestratorOptions): Promise<{
21
+ review: ReviewResult;
22
+ coder: CoderResult;
23
+ }>;
24
+ generateTests(targetPath: string, options?: OrchestratorOptions): Promise<TestResult>;
25
+ plan(targetPath: string, options?: OrchestratorOptions): Promise<PlanResult>;
26
+ generateDocs(targetPath: string, options?: OrchestratorOptions): Promise<DocsResult>;
27
+ }
@@ -0,0 +1,262 @@
1
+ import { readFileSync, writeFileSync, copyFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { LLMClient } from "./llm-client.js";
4
+ import { ReviewerAgent } from "../agents/reviewer.js";
5
+ import { CoderAgent } from "../agents/coder.js";
6
+ import { TesterAgent } from "../agents/tester.js";
7
+ import { PlannerAgent } from "../agents/planner.js";
8
+ import { DocsAgent } from "../agents/docs.js";
9
+ import { collectFiles } from "../utils/files.js";
10
+ import { formatReviewResult, formatCoderResult, formatTestResult, formatPlanResult, formatDocsResult, formatJson } from "../utils/formatter.js";
11
+ import { log } from "../utils/logger.js";
12
+ import { CostTracker } from "../utils/cost.js";
13
+ export class Orchestrator {
14
+ llmClient;
15
+ config;
16
+ costTracker;
17
+ constructor(config) {
18
+ this.config = config;
19
+ this.llmClient = new LLMClient(config.apiKey, config.model);
20
+ this.costTracker = new CostTracker(config.model);
21
+ }
22
+ printCost(json) {
23
+ if (!json) {
24
+ console.log(this.costTracker.formatSummary());
25
+ }
26
+ }
27
+ createStreamCallback(verbose) {
28
+ let thinkingStarted = false;
29
+ return (token) => {
30
+ if (verbose) {
31
+ if (!thinkingStarted) {
32
+ log.verbose("Agent is thinking...");
33
+ thinkingStarted = true;
34
+ }
35
+ process.stderr.write(".");
36
+ }
37
+ };
38
+ }
39
+ async review(targetPath, options = {}) {
40
+ log.step("Collecting files...");
41
+ const files = await collectFiles(targetPath, this.config);
42
+ if (files.length === 0) {
43
+ log.warn("No matching files found.");
44
+ return { findings: [], summary: "No files to review." };
45
+ }
46
+ log.info(`Found ${files.length} file(s) to review`);
47
+ if (options.verbose) {
48
+ for (const f of files)
49
+ log.verbose(` ${f.path}`);
50
+ }
51
+ log.step("🔍 Reviewer agent analyzing code...");
52
+ const onToken = this.createStreamCallback(options.verbose ?? false);
53
+ const reviewer = new ReviewerAgent(this.llmClient);
54
+ const result = await reviewer.execute({ files, config: this.config }, onToken);
55
+ const reviewResult = result.data;
56
+ this.costTracker.track("Reviewer", result.tokensUsed);
57
+ if (options.verbose) {
58
+ console.error(""); // newline after dots
59
+ log.verbose(`Tokens used: ${result.tokensUsed.input} in / ${result.tokensUsed.output} out`);
60
+ }
61
+ // Filter by severity if specified
62
+ if (options.severity) {
63
+ const levels = { critical: 3, warning: 2, info: 1 };
64
+ const minLevel = levels[options.severity] ?? 1;
65
+ reviewResult.findings = reviewResult.findings.filter((f) => (levels[f.severity] ?? 1) >= minLevel);
66
+ }
67
+ if (options.json) {
68
+ console.log(formatJson(reviewResult));
69
+ }
70
+ else {
71
+ console.log(formatReviewResult(reviewResult));
72
+ }
73
+ this.printCost(options.json);
74
+ return reviewResult;
75
+ }
76
+ async improve(targetPath, options = {}) {
77
+ // Step 1: Review
78
+ const reviewResult = await this.review(targetPath, { ...options, json: false });
79
+ if (reviewResult.findings.length === 0) {
80
+ log.success("No issues found — nothing to improve!");
81
+ return { review: reviewResult, coder: { improvedFiles: [], summary: "No changes needed." } };
82
+ }
83
+ // Step 2: Improve
84
+ log.step("✨ Coder agent improving code...");
85
+ const onToken = this.createStreamCallback(options.verbose ?? false);
86
+ const files = await collectFiles(targetPath, this.config);
87
+ const coder = new CoderAgent(this.llmClient);
88
+ const coderResultRaw = await coder.execute({
89
+ files,
90
+ config: this.config,
91
+ previousResults: {
92
+ agentName: "Reviewer",
93
+ success: true,
94
+ data: reviewResult,
95
+ rawResponse: "",
96
+ tokensUsed: { input: 0, output: 0 },
97
+ },
98
+ }, onToken);
99
+ const coderResult = coderResultRaw.data;
100
+ this.costTracker.track("Coder", coderResultRaw.tokensUsed);
101
+ if (options.verbose) {
102
+ console.error(""); // newline after dots
103
+ log.verbose(`Tokens used: ${coderResultRaw.tokensUsed.input} in / ${coderResultRaw.tokensUsed.output} out`);
104
+ }
105
+ if (options.json) {
106
+ console.log(formatJson({ review: reviewResult, improvements: coderResult }));
107
+ }
108
+ else {
109
+ console.log(formatCoderResult(coderResult));
110
+ }
111
+ // Apply patches if requested
112
+ if (options.write && coderResult.improvedFiles.length > 0) {
113
+ for (const file of coderResult.improvedFiles) {
114
+ const absPath = resolve(file.path);
115
+ if (options.backup) {
116
+ copyFileSync(absPath, absPath + ".bak");
117
+ log.verbose(`Backed up ${file.path} → ${file.path}.bak`);
118
+ }
119
+ let content = readFileSync(absPath, "utf-8");
120
+ let applied = 0;
121
+ for (const patch of file.patches) {
122
+ if (content.includes(patch.find)) {
123
+ content = content.replace(patch.find, patch.replace);
124
+ applied++;
125
+ }
126
+ else {
127
+ log.warn(`Patch skipped (no match): ${patch.description}`);
128
+ }
129
+ }
130
+ if (applied > 0) {
131
+ writeFileSync(absPath, content, "utf-8");
132
+ log.success(`Updated ${file.path} (${applied}/${file.patches.length} patches applied)`);
133
+ }
134
+ }
135
+ }
136
+ else if (!options.write && coderResult.improvedFiles.length > 0) {
137
+ log.info("Dry run — use --write to apply changes to disk.");
138
+ }
139
+ this.printCost(options.json);
140
+ return { review: reviewResult, coder: coderResult };
141
+ }
142
+ async generateTests(targetPath, options = {}) {
143
+ log.step("Collecting files...");
144
+ const files = await collectFiles(targetPath, this.config);
145
+ if (files.length === 0) {
146
+ log.warn("No matching files found.");
147
+ return { testFiles: [], summary: "No files to test." };
148
+ }
149
+ log.info(`Found ${files.length} file(s) to generate tests for`);
150
+ if (options.verbose) {
151
+ for (const f of files)
152
+ log.verbose(` ${f.path}`);
153
+ }
154
+ log.step("🧪 Tester agent generating tests...");
155
+ const onToken = this.createStreamCallback(options.verbose ?? false);
156
+ const tester = new TesterAgent(this.llmClient, options.framework ?? "vitest");
157
+ const result = await tester.execute({ files, config: this.config }, onToken);
158
+ const testResult = result.data;
159
+ this.costTracker.track("Tester", result.tokensUsed);
160
+ if (options.verbose) {
161
+ console.error("");
162
+ log.verbose(`Tokens used: ${result.tokensUsed.input} in / ${result.tokensUsed.output} out`);
163
+ }
164
+ if (options.json) {
165
+ console.log(formatJson(testResult));
166
+ }
167
+ else {
168
+ console.log(formatTestResult(testResult));
169
+ }
170
+ // Write test files if requested
171
+ if (options.write && testResult.testFiles.length > 0) {
172
+ for (const file of testResult.testFiles) {
173
+ const absPath = resolve(file.path);
174
+ writeFileSync(absPath, file.content, "utf-8");
175
+ log.success(`Created ${file.path}`);
176
+ }
177
+ }
178
+ else if (!options.write && testResult.testFiles.length > 0) {
179
+ log.info("Dry run — use --write to write test files to disk.");
180
+ }
181
+ this.printCost(options.json);
182
+ return testResult;
183
+ }
184
+ async plan(targetPath, options = {}) {
185
+ log.step("Collecting files...");
186
+ const files = await collectFiles(targetPath, this.config);
187
+ if (files.length === 0) {
188
+ log.warn("No matching files found.");
189
+ return { goal: "", tasks: [], risks: [], summary: "No files to analyze." };
190
+ }
191
+ log.info(`Found ${files.length} file(s) to analyze`);
192
+ if (options.verbose) {
193
+ for (const f of files)
194
+ log.verbose(` ${f.path}`);
195
+ }
196
+ log.step("🧠 Planner agent creating plan...");
197
+ const onToken = this.createStreamCallback(options.verbose ?? false);
198
+ const planner = new PlannerAgent(this.llmClient, options.task);
199
+ const result = await planner.execute({ files, config: this.config }, onToken);
200
+ const planResult = result.data;
201
+ this.costTracker.track("Planner", result.tokensUsed);
202
+ if (options.verbose) {
203
+ console.error("");
204
+ log.verbose(`Tokens used: ${result.tokensUsed.input} in / ${result.tokensUsed.output} out`);
205
+ }
206
+ if (options.json) {
207
+ console.log(formatJson(planResult));
208
+ }
209
+ else {
210
+ console.log(formatPlanResult(planResult));
211
+ }
212
+ this.printCost(options.json);
213
+ return planResult;
214
+ }
215
+ async generateDocs(targetPath, options = {}) {
216
+ log.step("Collecting files...");
217
+ const files = await collectFiles(targetPath, this.config);
218
+ if (files.length === 0) {
219
+ log.warn("No matching files found.");
220
+ return { docs: [], summary: "No files to document." };
221
+ }
222
+ log.info(`Found ${files.length} file(s) to document`);
223
+ if (options.verbose) {
224
+ for (const f of files)
225
+ log.verbose(` ${f.path}`);
226
+ }
227
+ log.step("📝 Docs agent generating documentation...");
228
+ const onToken = this.createStreamCallback(options.verbose ?? false);
229
+ const docs = new DocsAgent(this.llmClient);
230
+ const result = await docs.execute({ files, config: this.config }, onToken);
231
+ const docsResult = result.data;
232
+ this.costTracker.track("Docs", result.tokensUsed);
233
+ if (options.verbose) {
234
+ console.error("");
235
+ log.verbose(`Tokens used: ${result.tokensUsed.input} in / ${result.tokensUsed.output} out`);
236
+ }
237
+ if (options.json) {
238
+ console.log(formatJson(docsResult));
239
+ }
240
+ else {
241
+ console.log(formatDocsResult(docsResult));
242
+ }
243
+ // Write documented files if requested
244
+ if (options.write && docsResult.docs.length > 0) {
245
+ for (const doc of docsResult.docs) {
246
+ const absPath = resolve(doc.file);
247
+ if (options.backup) {
248
+ copyFileSync(absPath, absPath + ".bak");
249
+ log.verbose(`Backed up ${doc.file} → ${doc.file}.bak`);
250
+ }
251
+ writeFileSync(absPath, doc.content, "utf-8");
252
+ log.success(`Updated ${doc.file}`);
253
+ }
254
+ }
255
+ else if (!options.write && docsResult.docs.length > 0) {
256
+ log.info("Dry run — use --write to write documented files to disk.");
257
+ }
258
+ this.printCost(options.json);
259
+ return docsResult;
260
+ }
261
+ }
262
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { Orchestrator } from "./core/orchestrator.js";
2
+ export { LLMClient } from "./core/llm-client.js";
3
+ export { loadConfig } from "./core/config.js";
4
+ export { ReviewerAgent, CoderAgent, TesterAgent, PlannerAgent, DocsAgent, BaseAgent } from "./agents/index.js";
5
+ export * from "./types/index.js";
@@ -0,0 +1,6 @@
1
+ export { Orchestrator } from "./core/orchestrator.js";
2
+ export { LLMClient } from "./core/llm-client.js";
3
+ export { loadConfig } from "./core/config.js";
4
+ export { ReviewerAgent, CoderAgent, TesterAgent, PlannerAgent, DocsAgent, BaseAgent } from "./agents/index.js";
5
+ export * from "./types/index.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/G,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { PatchPilotsConfig } from "./config.js";
2
+ export interface FileContent {
3
+ path: string;
4
+ content: string;
5
+ language: string;
6
+ }
7
+ export interface AgentContext {
8
+ files: FileContent[];
9
+ previousResults?: AgentResult;
10
+ config: PatchPilotsConfig;
11
+ }
12
+ export interface AgentResult {
13
+ agentName: string;
14
+ success: boolean;
15
+ data: unknown;
16
+ rawResponse: string;
17
+ tokensUsed: {
18
+ input: number;
19
+ output: number;
20
+ };
21
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/types/agent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ export interface PatchPilotsConfig {
2
+ apiKey: string;
3
+ model: string;
4
+ maxTokens: number;
5
+ temperature: number;
6
+ include: string[];
7
+ exclude: string[];
8
+ maxFileSize: number;
9
+ maxFiles: number;
10
+ }
11
+ export declare const DEFAULT_CONFIG: Omit<PatchPilotsConfig, "apiKey">;
@@ -0,0 +1,10 @@
1
+ export const DEFAULT_CONFIG = {
2
+ model: "claude-sonnet-4-6",
3
+ maxTokens: 64000,
4
+ temperature: 0.3,
5
+ include: ["**/*.ts", "**/*.js", "**/*.tsx", "**/*.jsx", "**/*.py", "**/*.go", "**/*.rs", "**/*.java"],
6
+ exclude: ["node_modules/**", "dist/**", ".git/**", "*.min.js", "*.bundle.js"],
7
+ maxFileSize: 100_000,
8
+ maxFiles: 20,
9
+ };
10
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/types/config.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,cAAc,GAAsC;IAC/D,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,GAAG;IAChB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;IACrG,OAAO,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC;IAC7E,WAAW,EAAE,OAAO;IACpB,QAAQ,EAAE,EAAE;CACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./agent.js";
2
+ export * from "./review.js";
3
+ export * from "./config.js";
@@ -0,0 +1,4 @@
1
+ export * from "./agent.js";
2
+ export * from "./review.js";
3
+ export * from "./config.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,61 @@
1
+ export type Severity = "critical" | "warning" | "info";
2
+ export type Category = "bug" | "security" | "performance" | "code-smell" | "style";
3
+ export interface ReviewFinding {
4
+ file: string;
5
+ line?: number;
6
+ severity: Severity;
7
+ category: Category;
8
+ title: string;
9
+ description: string;
10
+ suggestion?: string;
11
+ }
12
+ export interface ReviewResult {
13
+ findings: ReviewFinding[];
14
+ summary: string;
15
+ }
16
+ export interface FilePatch {
17
+ find: string;
18
+ replace: string;
19
+ description: string;
20
+ }
21
+ export interface ImprovedFile {
22
+ path: string;
23
+ patches: FilePatch[];
24
+ }
25
+ export interface CoderResult {
26
+ improvedFiles: ImprovedFile[];
27
+ summary: string;
28
+ }
29
+ export interface TestFile {
30
+ path: string;
31
+ sourceFile: string;
32
+ content: string;
33
+ testCount: number;
34
+ }
35
+ export interface TestResult {
36
+ testFiles: TestFile[];
37
+ summary: string;
38
+ }
39
+ export interface PlanTask {
40
+ id: number;
41
+ title: string;
42
+ description: string;
43
+ files: string[];
44
+ priority: "high" | "medium" | "low";
45
+ estimatedComplexity: "simple" | "moderate" | "complex";
46
+ }
47
+ export interface PlanResult {
48
+ goal: string;
49
+ tasks: PlanTask[];
50
+ risks: string[];
51
+ summary: string;
52
+ }
53
+ export interface DocEntry {
54
+ file: string;
55
+ content: string;
56
+ type: "jsdoc" | "readme" | "inline";
57
+ }
58
+ export interface DocsResult {
59
+ docs: DocEntry[];
60
+ summary: string;
61
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/types/review.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function playBanner(): Promise<void>;
2
+ export declare function printBannerStatic(): void;