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,65 @@
1
+ import chalk from "chalk";
2
+ const FRAMES = [
3
+ // Frame 1: Just you
4
+ `
5
+ ${chalk.cyan("○")}
6
+ ${chalk.cyan("/|\\")}
7
+ ${chalk.cyan("/ \\")}
8
+ ${chalk.gray("just me...")}
9
+ `,
10
+ // Frame 2: Starting to split
11
+ `
12
+ ${chalk.cyan("○")} ${chalk.cyan("○")}
13
+ ${chalk.cyan("/|\\")} ${chalk.cyan("/|\\")}
14
+ ${chalk.cyan("/ \\")} ${chalk.cyan("/ \\")}
15
+ ${chalk.gray("wait... there's two")}
16
+ `,
17
+ // Frame 3: More clones appearing
18
+ `
19
+ ${chalk.cyan("○")} ${chalk.cyan("○")} ${chalk.cyan("○")}
20
+ ${chalk.cyan("/|\\")} ${chalk.cyan("/|\\")} ${chalk.cyan("/|\\")}
21
+ ${chalk.cyan("/ \\")} ${chalk.cyan("/ \\")} ${chalk.cyan("/ \\")}
22
+ ${chalk.gray("we're multiplying!")}
23
+ `,
24
+ // Frame 4: Full crew assembled with roles
25
+ `
26
+ ${chalk.yellow("○")} ${chalk.magenta("○")} ${chalk.green("○")} ${chalk.blue("○")} ${chalk.red("○")} ${chalk.cyan("○")}
27
+ ${chalk.yellow("/|\\")} ${chalk.magenta("/|\\")} ${chalk.green("/|\\")} ${chalk.blue("/|\\")} ${chalk.red("/|\\")} ${chalk.cyan("/|\\")}
28
+ ${chalk.yellow("/ \\")} ${chalk.magenta("/ \\")} ${chalk.green("/ \\")} ${chalk.blue("/ \\")} ${chalk.red("/ \\")} ${chalk.cyan("/ \\")}
29
+ ${chalk.yellow("🧠")} ${chalk.magenta("🔍")} ${chalk.green("✨")} ${chalk.blue("🧪")} ${chalk.red("📝")} ${chalk.cyan("🎯")}
30
+ ${chalk.yellow("Planner")} ${chalk.magenta("Reviewer")} ${chalk.green("Coder")} ${chalk.blue("Tester")} ${chalk.red("Docs")} ${chalk.cyan("Orchestrator")}
31
+ `,
32
+ // Frame 5: Final banner
33
+ `
34
+ ${chalk.bold.cyan(`
35
+ ____ __ __ ____ _ __ __
36
+ / __ \\____ _/ /______/ /_ / __ \\(_) /___ / /______
37
+ / /_/ / __ \`/ __/ ___/ __ \\/ /_/ / / / __ \\/ __/ ___/
38
+ / ____/ /_/ / /_/ /__/ / / / ____/ / / /_/ / /_(__ )
39
+ /_/ \\__,_/\\__/\\___/_/ /_/_/ /_/_/\\____/\\__/____/
40
+ `)}
41
+ ${chalk.yellow("○")} ${chalk.magenta("○")} ${chalk.green("○")} ${chalk.blue("○")} ${chalk.red("○")} ${chalk.cyan("○")}
42
+ ${chalk.yellow("/|\\")} ${chalk.magenta("/|\\")} ${chalk.green("/|\\")} ${chalk.blue("/|\\")} ${chalk.red("/|\\")} ${chalk.cyan("/|\\")}
43
+ ${chalk.yellow("/ \\")} ${chalk.magenta("/ \\")} ${chalk.green("/ \\")} ${chalk.blue("/ \\")} ${chalk.red("/ \\")} ${chalk.cyan("/ \\")}
44
+
45
+ ${chalk.gray("Your code crew is ready.")} ${chalk.bold("One dev. Six agents. Zero bugs.")}
46
+ `,
47
+ ];
48
+ function sleep(ms) {
49
+ return new Promise((resolve) => setTimeout(resolve, ms));
50
+ }
51
+ export async function playBanner() {
52
+ for (let i = 0; i < FRAMES.length; i++) {
53
+ // Clear previous frame (except first)
54
+ if (i > 0) {
55
+ const prevLines = FRAMES[i - 1].split("\n").length;
56
+ process.stdout.write(`\x1b[${prevLines}A\x1b[0J`);
57
+ }
58
+ console.log(FRAMES[i]);
59
+ await sleep(i === FRAMES.length - 1 ? 0 : 800);
60
+ }
61
+ }
62
+ export function printBannerStatic() {
63
+ console.log(FRAMES[FRAMES.length - 1]);
64
+ }
65
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/utils/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class CostTracker {
2
+ private entries;
3
+ private model;
4
+ constructor(model?: string);
5
+ track(agentName: string, usage: {
6
+ input: number;
7
+ output: number;
8
+ }): void;
9
+ get totalCost(): number;
10
+ get totalTokens(): {
11
+ input: number;
12
+ output: number;
13
+ };
14
+ formatSummary(): string;
15
+ }
@@ -0,0 +1,46 @@
1
+ import chalk from "chalk";
2
+ // Pricing per million tokens (USD)
3
+ const MODEL_PRICING = {
4
+ "claude-opus-4-6": { input: 5.0, output: 25.0 },
5
+ "claude-sonnet-4-6": { input: 3.0, output: 15.0 },
6
+ "claude-haiku-4-5": { input: 1.0, output: 5.0 },
7
+ };
8
+ const DEFAULT_PRICING = { input: 3.0, output: 15.0 };
9
+ export class CostTracker {
10
+ entries = [];
11
+ model;
12
+ constructor(model = "claude-sonnet-4-6") {
13
+ this.model = model;
14
+ }
15
+ track(agentName, usage) {
16
+ const pricing = MODEL_PRICING[this.model] ?? DEFAULT_PRICING;
17
+ const cost = (usage.input / 1_000_000) * pricing.input +
18
+ (usage.output / 1_000_000) * pricing.output;
19
+ this.entries.push({ agent: agentName, input: usage.input, output: usage.output, cost });
20
+ }
21
+ get totalCost() {
22
+ return this.entries.reduce((sum, e) => sum + e.cost, 0);
23
+ }
24
+ get totalTokens() {
25
+ return {
26
+ input: this.entries.reduce((sum, e) => sum + e.input, 0),
27
+ output: this.entries.reduce((sum, e) => sum + e.output, 0),
28
+ };
29
+ }
30
+ formatSummary() {
31
+ const lines = [];
32
+ const totals = this.totalTokens;
33
+ const cost = this.totalCost;
34
+ lines.push("");
35
+ lines.push(chalk.bold.underline("Cost Summary"));
36
+ lines.push("");
37
+ for (const entry of this.entries) {
38
+ lines.push(` ${chalk.cyan(entry.agent.padEnd(12))} ${chalk.gray(`${entry.input.toLocaleString()} in / ${entry.output.toLocaleString()} out`)} ${chalk.yellow(`$${entry.cost.toFixed(4)}`)}`);
39
+ }
40
+ lines.push("");
41
+ lines.push(` ${chalk.bold("Total:")} ${totals.input.toLocaleString()} in / ${totals.output.toLocaleString()} out → ${chalk.yellow.bold(`$${cost.toFixed(4)}`)}`);
42
+ lines.push("");
43
+ return lines.join("\n");
44
+ }
45
+ }
46
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../../src/utils/cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,mCAAmC;AACnC,MAAM,aAAa,GAAsD;IACvE,iBAAiB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/C,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACjD,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CAChD,CAAC;AAEF,MAAM,eAAe,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AASrD,MAAM,OAAO,WAAW;IACd,OAAO,GAAiB,EAAE,CAAC;IAC3B,KAAK,CAAS;IAEtB,YAAY,KAAK,GAAG,mBAAmB;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,KAAwC;QAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC;QAC7D,MAAM,IAAI,GACR,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK;YACzC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW;QACb,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SAC3D,CAAC;IACJ,CAAC;IAED,aAAa;QACX,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAE5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAClL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACtJ,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import type { FileContent, PatchPilotsConfig } from "../types/index.js";
2
+ export declare function collectFiles(targetPath: string, config: PatchPilotsConfig): Promise<FileContent[]>;
@@ -0,0 +1,65 @@
1
+ import { readFileSync, statSync } from "node:fs";
2
+ import { resolve, extname, relative } from "node:path";
3
+ import { glob } from "glob";
4
+ const LANGUAGE_MAP = {
5
+ ".ts": "typescript",
6
+ ".tsx": "typescript",
7
+ ".js": "javascript",
8
+ ".jsx": "javascript",
9
+ ".py": "python",
10
+ ".go": "go",
11
+ ".rs": "rust",
12
+ ".java": "java",
13
+ ".rb": "ruby",
14
+ ".php": "php",
15
+ ".c": "c",
16
+ ".cpp": "cpp",
17
+ ".h": "c",
18
+ ".hpp": "cpp",
19
+ ".cs": "csharp",
20
+ ".swift": "swift",
21
+ ".kt": "kotlin",
22
+ ".html": "html",
23
+ ".css": "css",
24
+ ".scss": "scss",
25
+ ".vue": "vue",
26
+ ".svelte": "svelte",
27
+ };
28
+ function inferLanguage(filePath) {
29
+ return LANGUAGE_MAP[extname(filePath)] ?? "plaintext";
30
+ }
31
+ export async function collectFiles(targetPath, config) {
32
+ const absPath = resolve(targetPath);
33
+ const stat = statSync(absPath);
34
+ if (stat.isFile()) {
35
+ const content = readFileSync(absPath, "utf-8");
36
+ return [{ path: relative(process.cwd(), absPath), content, language: inferLanguage(absPath) }];
37
+ }
38
+ const matches = await glob(config.include, {
39
+ cwd: absPath,
40
+ ignore: config.exclude,
41
+ nodir: true,
42
+ absolute: true,
43
+ });
44
+ const files = [];
45
+ for (const match of matches) {
46
+ if (files.length >= config.maxFiles)
47
+ break;
48
+ try {
49
+ const fileStat = statSync(match);
50
+ if (fileStat.size > config.maxFileSize)
51
+ continue;
52
+ const content = readFileSync(match, "utf-8");
53
+ files.push({
54
+ path: relative(process.cwd(), match),
55
+ content,
56
+ language: inferLanguage(match),
57
+ });
58
+ }
59
+ catch {
60
+ // Skip unreadable files
61
+ }
62
+ }
63
+ return files;
64
+ }
65
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/utils/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,YAAY,GAA2B;IAC3C,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,WAAW,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,MAAyB;IAEzB,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QACzC,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ;YAAE,MAAM;QAE3C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,WAAW;gBAAE,SAAS;YAEjD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC;gBACpC,OAAO;gBACP,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReviewResult, CoderResult, TestResult, PlanResult, DocsResult } from "../types/index.js";
2
+ export declare function formatReviewResult(result: ReviewResult): string;
3
+ export declare function formatCoderResult(result: CoderResult): string;
4
+ export declare function formatTestResult(result: TestResult): string;
5
+ export declare function formatPlanResult(result: PlanResult): string;
6
+ export declare function formatDocsResult(result: DocsResult): string;
7
+ export declare function formatJson(data: unknown): string;
@@ -0,0 +1,190 @@
1
+ import chalk from "chalk";
2
+ const SEVERITY_COLORS = {
3
+ critical: chalk.red.bold,
4
+ warning: chalk.yellow,
5
+ info: chalk.blue,
6
+ };
7
+ const SEVERITY_ICONS = {
8
+ critical: "🔴",
9
+ warning: "🟡",
10
+ info: "🔵",
11
+ };
12
+ export function formatReviewResult(result) {
13
+ const lines = [];
14
+ lines.push("");
15
+ lines.push(chalk.bold.underline("Review Results"));
16
+ lines.push("");
17
+ if (result.findings.length === 0) {
18
+ lines.push(chalk.green(" No issues found! Your code looks great."));
19
+ lines.push("");
20
+ return lines.join("\n");
21
+ }
22
+ // Group findings by file
23
+ const byFile = new Map();
24
+ for (const finding of result.findings) {
25
+ const existing = byFile.get(finding.file) ?? [];
26
+ existing.push(finding);
27
+ byFile.set(finding.file, existing);
28
+ }
29
+ for (const [file, findings] of byFile) {
30
+ lines.push(chalk.bold(` 📄 ${file}`));
31
+ for (const f of findings) {
32
+ const color = SEVERITY_COLORS[f.severity];
33
+ const icon = SEVERITY_ICONS[f.severity];
34
+ const lineRef = f.line ? chalk.gray(`:${f.line}`) : "";
35
+ lines.push(` ${icon} ${color(f.title)}${lineRef} ${chalk.gray(`[${f.category}]`)}`);
36
+ lines.push(` ${f.description}`);
37
+ if (f.suggestion) {
38
+ lines.push(` ${chalk.green("→")} ${f.suggestion}`);
39
+ }
40
+ lines.push("");
41
+ }
42
+ }
43
+ // Summary
44
+ const counts = { critical: 0, warning: 0, info: 0 };
45
+ for (const f of result.findings)
46
+ counts[f.severity]++;
47
+ lines.push(chalk.bold(" Summary: ") + [
48
+ counts.critical > 0 ? chalk.red(`${counts.critical} critical`) : null,
49
+ counts.warning > 0 ? chalk.yellow(`${counts.warning} warnings`) : null,
50
+ counts.info > 0 ? chalk.blue(`${counts.info} info`) : null,
51
+ ].filter(Boolean).join(", "));
52
+ lines.push(` ${chalk.gray(result.summary)}`);
53
+ lines.push("");
54
+ return lines.join("\n");
55
+ }
56
+ export function formatCoderResult(result) {
57
+ const lines = [];
58
+ lines.push("");
59
+ lines.push(chalk.bold.underline("Improvements"));
60
+ lines.push("");
61
+ if (result.improvedFiles.length === 0) {
62
+ lines.push(chalk.green(" No changes needed."));
63
+ lines.push("");
64
+ return lines.join("\n");
65
+ }
66
+ let totalPatches = 0;
67
+ for (const file of result.improvedFiles) {
68
+ lines.push(chalk.bold(` 📝 ${file.path}`) + chalk.gray(` (${file.patches.length} patches)`));
69
+ lines.push("");
70
+ for (const patch of file.patches) {
71
+ lines.push(` ${chalk.green("→")} ${patch.description}`);
72
+ // Show compact diff for the patch
73
+ for (const line of patch.find.split("\n").slice(0, 5)) {
74
+ lines.push(chalk.red(` - ${line}`));
75
+ }
76
+ if (patch.find.split("\n").length > 5) {
77
+ lines.push(chalk.gray(` ... (${patch.find.split("\n").length - 5} more lines)`));
78
+ }
79
+ for (const line of patch.replace.split("\n").slice(0, 5)) {
80
+ lines.push(chalk.green(` + ${line}`));
81
+ }
82
+ if (patch.replace.split("\n").length > 5) {
83
+ lines.push(chalk.gray(` ... (${patch.replace.split("\n").length - 5} more lines)`));
84
+ }
85
+ lines.push("");
86
+ totalPatches++;
87
+ }
88
+ }
89
+ lines.push(chalk.bold(" Summary: ") + chalk.green(`${totalPatches} patches`) + ` across ${result.improvedFiles.length} file(s)`);
90
+ lines.push(` ${chalk.gray(result.summary)}`);
91
+ lines.push("");
92
+ return lines.join("\n");
93
+ }
94
+ export function formatTestResult(result) {
95
+ const lines = [];
96
+ lines.push("");
97
+ lines.push(chalk.bold.underline("Generated Tests"));
98
+ lines.push("");
99
+ if (result.testFiles.length === 0) {
100
+ lines.push(chalk.yellow(" No tests generated — source files may be type-only."));
101
+ lines.push("");
102
+ return lines.join("\n");
103
+ }
104
+ for (const file of result.testFiles) {
105
+ lines.push(chalk.bold(` 🧪 ${file.path}`) + chalk.gray(` (${file.testCount} tests, from ${file.sourceFile})`));
106
+ lines.push("");
107
+ // Show the test content with syntax highlighting hint
108
+ for (const line of file.content.split("\n")) {
109
+ lines.push(chalk.gray(" ") + line);
110
+ }
111
+ lines.push("");
112
+ }
113
+ const totalTests = result.testFiles.reduce((sum, f) => sum + f.testCount, 0);
114
+ lines.push(chalk.bold(" Summary: ") + chalk.green(`${totalTests} tests`) + ` across ${result.testFiles.length} file(s)`);
115
+ lines.push(` ${chalk.gray(result.summary)}`);
116
+ lines.push("");
117
+ return lines.join("\n");
118
+ }
119
+ const PRIORITY_COLORS = {
120
+ high: chalk.red,
121
+ medium: chalk.yellow,
122
+ low: chalk.blue,
123
+ };
124
+ const COMPLEXITY_ICONS = {
125
+ simple: "🟢",
126
+ moderate: "🟡",
127
+ complex: "🔴",
128
+ };
129
+ export function formatPlanResult(result) {
130
+ const lines = [];
131
+ lines.push("");
132
+ lines.push(chalk.bold.underline("Implementation Plan"));
133
+ lines.push("");
134
+ if (result.goal) {
135
+ lines.push(chalk.bold(" Goal: ") + result.goal);
136
+ lines.push("");
137
+ }
138
+ if (result.tasks.length === 0) {
139
+ lines.push(chalk.green(" No tasks identified."));
140
+ lines.push("");
141
+ return lines.join("\n");
142
+ }
143
+ for (const task of result.tasks) {
144
+ const priorityColor = PRIORITY_COLORS[task.priority] ?? chalk.white;
145
+ const complexityIcon = COMPLEXITY_ICONS[task.estimatedComplexity] ?? "⚪";
146
+ lines.push(` ${chalk.bold(`${task.id}.`)} ${chalk.bold(task.title)} ${complexityIcon} ${priorityColor(`[${task.priority}]`)}`);
147
+ lines.push(` ${task.description}`);
148
+ if (task.files.length > 0) {
149
+ lines.push(` ${chalk.gray("Files:")} ${task.files.join(", ")}`);
150
+ }
151
+ lines.push("");
152
+ }
153
+ if (result.risks.length > 0) {
154
+ lines.push(chalk.bold(" Risks:"));
155
+ for (const risk of result.risks) {
156
+ lines.push(` ${chalk.yellow("⚠")} ${risk}`);
157
+ }
158
+ lines.push("");
159
+ }
160
+ lines.push(` ${chalk.gray(result.summary)}`);
161
+ lines.push("");
162
+ return lines.join("\n");
163
+ }
164
+ export function formatDocsResult(result) {
165
+ const lines = [];
166
+ lines.push("");
167
+ lines.push(chalk.bold.underline("Generated Documentation"));
168
+ lines.push("");
169
+ if (result.docs.length === 0) {
170
+ lines.push(chalk.yellow(" No documentation generated — files may already be well-documented."));
171
+ lines.push("");
172
+ return lines.join("\n");
173
+ }
174
+ for (const doc of result.docs) {
175
+ lines.push(chalk.bold(` 📝 ${doc.file}`) + chalk.gray(` [${doc.type}]`));
176
+ lines.push("");
177
+ for (const line of doc.content.split("\n")) {
178
+ lines.push(chalk.gray(" ") + line);
179
+ }
180
+ lines.push("");
181
+ }
182
+ lines.push(chalk.bold(" Summary: ") + `${result.docs.length} file(s) documented`);
183
+ lines.push(` ${chalk.gray(result.summary)}`);
184
+ lines.push("");
185
+ return lines.join("\n");
186
+ }
187
+ export function formatJson(data) {
188
+ return JSON.stringify(data, null, 2);
189
+ }
190
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/utils/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function setVerbose(enabled: boolean): void;
2
+ export declare const log: {
3
+ info(message: string): void;
4
+ success(message: string): void;
5
+ warn(message: string): void;
6
+ error(message: string): void;
7
+ verbose(message: string): void;
8
+ step(message: string): void;
9
+ };
@@ -0,0 +1,28 @@
1
+ import chalk from "chalk";
2
+ let verboseMode = false;
3
+ export function setVerbose(enabled) {
4
+ verboseMode = enabled;
5
+ }
6
+ export const log = {
7
+ info(message) {
8
+ console.log(chalk.blue("ℹ"), message);
9
+ },
10
+ success(message) {
11
+ console.log(chalk.green("✓"), message);
12
+ },
13
+ warn(message) {
14
+ console.log(chalk.yellow("⚠"), message);
15
+ },
16
+ error(message) {
17
+ console.error(chalk.red("✗"), message);
18
+ },
19
+ verbose(message) {
20
+ if (verboseMode) {
21
+ console.log(chalk.gray("→"), chalk.gray(message));
22
+ }
23
+ },
24
+ step(message) {
25
+ console.log(chalk.cyan("●"), message);
26
+ },
27
+ };
28
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,OAAe;QACrB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "patchpilots",
3
+ "version": "0.1.0",
4
+ "description": "A team of AI agents that reviews and improves your code automatically",
5
+ "type": "module",
6
+ "bin": {
7
+ "patchpilots": "./dist/bin/patchpilots.js"
8
+ },
9
+ "main": "./dist/src/index.js",
10
+ "types": "./dist/src/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "dev": "tsx bin/patchpilots.ts",
18
+ "build": "tsc",
19
+ "prepublishOnly": "npm run build",
20
+ "test": "vitest run"
21
+ },
22
+ "keywords": [
23
+ "ai",
24
+ "code-review",
25
+ "agents",
26
+ "claude",
27
+ "cli",
28
+ "patchpilots",
29
+ "anthropic",
30
+ "linter",
31
+ "static-analysis"
32
+ ],
33
+ "author": "Piia Alavesa",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/alavesa/patchpilots.git"
38
+ },
39
+ "homepage": "https://github.com/alavesa/patchpilots",
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "dependencies": {
44
+ "@anthropic-ai/sdk": "^0.79.0",
45
+ "chalk": "^5.4.0",
46
+ "commander": "^13.0.0",
47
+ "glob": "^11.0.0",
48
+ "zod": "^3.24.0",
49
+ "zod-to-json-schema": "^3.24.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^22.0.0",
53
+ "tsx": "^4.19.0",
54
+ "typescript": "^5.8.0",
55
+ "vitest": "^3.0.0"
56
+ }
57
+ }