@posthog/agent 1.21.0 → 1.24.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 (119) hide show
  1. package/CLAUDE.md +3 -3
  2. package/README.md +3 -3
  3. package/dist/claude-cli/cli.js +1396 -1347
  4. package/dist/index.d.ts +11 -11
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -3
  7. package/dist/src/adapters/claude/claude-adapter.d.ts +3 -3
  8. package/dist/src/adapters/claude/claude-adapter.d.ts.map +1 -1
  9. package/dist/src/adapters/claude/claude-adapter.js +156 -111
  10. package/dist/src/adapters/claude/claude-adapter.js.map +1 -1
  11. package/dist/src/adapters/claude/tool-mapper.d.ts +1 -1
  12. package/dist/src/adapters/claude/tool-mapper.d.ts.map +1 -1
  13. package/dist/src/adapters/claude/tool-mapper.js.map +1 -1
  14. package/dist/src/adapters/types.d.ts +1 -1
  15. package/dist/src/adapters/types.d.ts.map +1 -1
  16. package/dist/src/agent.d.ts +7 -7
  17. package/dist/src/agent.d.ts.map +1 -1
  18. package/dist/src/agent.js +143 -85
  19. package/dist/src/agent.js.map +1 -1
  20. package/dist/src/agents/execution.js.map +1 -1
  21. package/dist/src/agents/planning.js.map +1 -1
  22. package/dist/src/agents/research.js.map +1 -1
  23. package/dist/src/file-manager.d.ts +4 -4
  24. package/dist/src/file-manager.d.ts.map +1 -1
  25. package/dist/src/file-manager.js +59 -58
  26. package/dist/src/file-manager.js.map +1 -1
  27. package/dist/src/git-manager.d.ts +2 -1
  28. package/dist/src/git-manager.d.ts.map +1 -1
  29. package/dist/src/git-manager.js +99 -68
  30. package/dist/src/git-manager.js.map +1 -1
  31. package/dist/src/posthog-api.d.ts +2 -3
  32. package/dist/src/posthog-api.d.ts.map +1 -1
  33. package/dist/src/posthog-api.js +22 -22
  34. package/dist/src/posthog-api.js.map +1 -1
  35. package/dist/src/prompt-builder.d.ts +3 -3
  36. package/dist/src/prompt-builder.d.ts.map +1 -1
  37. package/dist/src/prompt-builder.js +123 -93
  38. package/dist/src/prompt-builder.js.map +1 -1
  39. package/dist/src/task-manager.d.ts +4 -4
  40. package/dist/src/task-manager.d.ts.map +1 -1
  41. package/dist/src/task-manager.js +19 -18
  42. package/dist/src/task-manager.js.map +1 -1
  43. package/dist/src/task-progress-reporter.d.ts +3 -4
  44. package/dist/src/task-progress-reporter.d.ts.map +1 -1
  45. package/dist/src/task-progress-reporter.js +69 -53
  46. package/dist/src/task-progress-reporter.js.map +1 -1
  47. package/dist/src/template-manager.d.ts +1 -1
  48. package/dist/src/template-manager.d.ts.map +1 -1
  49. package/dist/src/template-manager.js +30 -28
  50. package/dist/src/template-manager.js.map +1 -1
  51. package/dist/src/todo-manager.d.ts +3 -3
  52. package/dist/src/todo-manager.d.ts.map +1 -1
  53. package/dist/src/todo-manager.js +29 -24
  54. package/dist/src/todo-manager.js.map +1 -1
  55. package/dist/src/tools/registry.d.ts +1 -1
  56. package/dist/src/tools/registry.js +60 -60
  57. package/dist/src/tools/registry.js.map +1 -1
  58. package/dist/src/tools/types.d.ts +31 -31
  59. package/dist/src/types.d.ts +33 -33
  60. package/dist/src/types.d.ts.map +1 -1
  61. package/dist/src/types.js.map +1 -1
  62. package/dist/src/utils/logger.d.ts +4 -4
  63. package/dist/src/utils/logger.d.ts.map +1 -1
  64. package/dist/src/utils/logger.js +8 -8
  65. package/dist/src/utils/logger.js.map +1 -1
  66. package/dist/src/workflow/config.d.ts +1 -1
  67. package/dist/src/workflow/config.d.ts.map +1 -1
  68. package/dist/src/workflow/config.js +18 -18
  69. package/dist/src/workflow/config.js.map +1 -1
  70. package/dist/src/workflow/steps/build.d.ts +1 -1
  71. package/dist/src/workflow/steps/build.d.ts.map +1 -1
  72. package/dist/src/workflow/steps/build.js +46 -38
  73. package/dist/src/workflow/steps/build.js.map +1 -1
  74. package/dist/src/workflow/steps/finalize.d.ts +1 -1
  75. package/dist/src/workflow/steps/finalize.d.ts.map +1 -1
  76. package/dist/src/workflow/steps/finalize.js +62 -47
  77. package/dist/src/workflow/steps/finalize.js.map +1 -1
  78. package/dist/src/workflow/steps/plan.d.ts +1 -1
  79. package/dist/src/workflow/steps/plan.d.ts.map +1 -1
  80. package/dist/src/workflow/steps/plan.js +58 -46
  81. package/dist/src/workflow/steps/plan.js.map +1 -1
  82. package/dist/src/workflow/steps/research.d.ts +1 -1
  83. package/dist/src/workflow/steps/research.d.ts.map +1 -1
  84. package/dist/src/workflow/steps/research.js +68 -56
  85. package/dist/src/workflow/steps/research.js.map +1 -1
  86. package/dist/src/workflow/types.d.ts +12 -12
  87. package/dist/src/workflow/types.d.ts.map +1 -1
  88. package/dist/src/workflow/utils.d.ts +1 -1
  89. package/dist/src/workflow/utils.d.ts.map +1 -1
  90. package/dist/src/workflow/utils.js +7 -4
  91. package/dist/src/workflow/utils.js.map +1 -1
  92. package/package.json +9 -9
  93. package/src/adapters/claude/claude-adapter.ts +220 -168
  94. package/src/adapters/claude/tool-mapper.ts +2 -2
  95. package/src/adapters/types.ts +1 -1
  96. package/src/agent.ts +579 -444
  97. package/src/agents/execution.ts +1 -1
  98. package/src/agents/planning.ts +1 -1
  99. package/src/agents/research.ts +0 -1
  100. package/src/file-manager.ts +64 -63
  101. package/src/git-manager.ts +159 -86
  102. package/src/posthog-api.ts +122 -82
  103. package/src/prompt-builder.ts +180 -135
  104. package/src/task-manager.ts +38 -30
  105. package/src/task-progress-reporter.ts +80 -58
  106. package/src/template-manager.ts +98 -45
  107. package/src/todo-manager.ts +35 -30
  108. package/src/tools/registry.ts +62 -62
  109. package/src/tools/types.ts +36 -36
  110. package/src/types.ts +93 -71
  111. package/src/utils/logger.ts +62 -56
  112. package/src/workflow/config.ts +48 -48
  113. package/src/workflow/steps/build.ts +122 -113
  114. package/src/workflow/steps/finalize.ts +218 -177
  115. package/src/workflow/steps/plan.ts +151 -131
  116. package/src/workflow/steps/research.ts +205 -186
  117. package/src/workflow/types.ts +38 -36
  118. package/src/workflow/utils.ts +37 -34
  119. package/LICENSE +0 -33
@@ -1,4 +1,4 @@
1
- import { Logger } from './utils/logger.js';
1
+ import { Logger } from "./utils/logger.js";
2
2
  export interface GitConfig {
3
3
  repositoryPath: string;
4
4
  authorName?: string;
@@ -16,6 +16,7 @@ export declare class GitManager {
16
16
  private authorEmail?;
17
17
  private logger;
18
18
  constructor(config: GitConfig);
19
+ private escapeShellArg;
19
20
  private runGitCommand;
20
21
  private runCommand;
21
22
  isGitRepository(): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"git-manager.d.ts","sourceRoot":"","sources":["../../src/git-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-manager.d.ts","sourceRoot":"","sources":["../../src/git-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,SAAS;IAQ7B,OAAO,CAAC,cAAc;YAQR,aAAa;YAWb,UAAU;IAWlB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IASnC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAqBnC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAyBhD,sBAAsB,CAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAWV,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,MAAM,CAAC;IAKZ,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB9B,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;YAU5B,2BAA2B;YAQ3B,wBAAwB;YAcxB,qBAAqB;IAYnC,OAAO,CAAC,kBAAkB;IAwBpB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQtC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3E;;;;;;;;OAQG;IACG,kBAAkB,IAAI,OAAO,CAAC;QAClC,QAAQ,EAAE,CAAC,OAAO,EAAE;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,IAAI,CAAC,EAAE,OAAO,CAAC;SAChB,KAAK,OAAO,CAAC;YAAE,aAAa,EAAE,OAAO,CAAC;YAAC,YAAY,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC;IA2CI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBnD,wBAAwB,CAC5B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAeZ,8BAA8B,CAClC,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,MAAM,CAAC;IAsCZ,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B9D,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC;IAyBZ,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,IAAI,CAAC;IAKV,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAWtD,YAAY,CAAC,GAAG,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,gBAAgB,CAAC,GAAG,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAuBZ,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwBvD,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,IAAI,CAAC;CAoBjB"}
@@ -1,5 +1,5 @@
1
- import { exec } from 'child_process';
2
- import { promisify } from 'util';
1
+ import { exec } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
3
  import { Logger } from './utils/logger.js';
4
4
 
5
5
  const execAsync = promisify(exec);
@@ -12,7 +12,15 @@ class GitManager {
12
12
  this.repositoryPath = config.repositoryPath;
13
13
  this.authorName = config.authorName;
14
14
  this.authorEmail = config.authorEmail;
15
- this.logger = config.logger || new Logger({ debug: false, prefix: '[GitManager]' });
15
+ this.logger =
16
+ config.logger || new Logger({ debug: false, prefix: "[GitManager]" });
17
+ }
18
+ escapeShellArg(str) {
19
+ return str
20
+ .replace(/\\/g, "\\\\")
21
+ .replace(/"/g, '\\"')
22
+ .replace(/`/g, "\\`")
23
+ .replace(/\$/g, "\\$");
16
24
  }
17
25
  async runGitCommand(command) {
18
26
  try {
@@ -34,7 +42,7 @@ class GitManager {
34
42
  }
35
43
  async isGitRepository() {
36
44
  try {
37
- await this.runGitCommand('rev-parse --git-dir');
45
+ await this.runGitCommand("rev-parse --git-dir");
38
46
  return true;
39
47
  }
40
48
  catch {
@@ -42,24 +50,24 @@ class GitManager {
42
50
  }
43
51
  }
44
52
  async getCurrentBranch() {
45
- return await this.runGitCommand('branch --show-current');
53
+ return await this.runGitCommand("branch --show-current");
46
54
  }
47
55
  async getDefaultBranch() {
48
56
  try {
49
57
  // Try to get the default branch from remote
50
- const remoteBranch = await this.runGitCommand('symbolic-ref refs/remotes/origin/HEAD');
51
- return remoteBranch.replace('refs/remotes/origin/', '');
58
+ const remoteBranch = await this.runGitCommand("symbolic-ref refs/remotes/origin/HEAD");
59
+ return remoteBranch.replace("refs/remotes/origin/", "");
52
60
  }
53
61
  catch {
54
62
  // Fallback: check if main exists, otherwise use master
55
- if (await this.branchExists('main')) {
56
- return 'main';
63
+ if (await this.branchExists("main")) {
64
+ return "main";
57
65
  }
58
- else if (await this.branchExists('master')) {
59
- return 'master';
66
+ else if (await this.branchExists("master")) {
67
+ return "master";
60
68
  }
61
69
  else {
62
- throw new Error('Cannot determine default branch. No main or master branch found.');
70
+ throw new Error("Cannot determine default branch. No main or master branch found.");
63
71
  }
64
72
  }
65
73
  }
@@ -73,7 +81,7 @@ class GitManager {
73
81
  }
74
82
  }
75
83
  async createBranch(branchName, baseBranch) {
76
- const base = baseBranch || await this.getCurrentBranch();
84
+ const base = baseBranch || (await this.getCurrentBranch());
77
85
  await this.runGitCommand(`checkout -b ${branchName} ${base}`);
78
86
  }
79
87
  async switchToBranch(branchName) {
@@ -83,22 +91,25 @@ class GitManager {
83
91
  const currentBranch = await this.getCurrentBranch();
84
92
  const defaultBranch = await this.getDefaultBranch();
85
93
  if (currentBranch === defaultBranch) {
86
- this.logger.debug('Already on default branch', { branch: defaultBranch });
94
+ this.logger.debug("Already on default branch", { branch: defaultBranch });
87
95
  return true;
88
96
  }
89
97
  if (await this.hasChanges()) {
90
- this.logger.warn('Skipping branch reset - uncommitted changes present', {
98
+ this.logger.warn("Skipping branch reset - uncommitted changes present", {
91
99
  currentBranch,
92
- defaultBranch
100
+ defaultBranch,
93
101
  });
94
102
  return false;
95
103
  }
96
104
  await this.switchToBranch(defaultBranch);
97
- this.logger.info('Reset to default branch', { from: currentBranch, to: defaultBranch });
105
+ this.logger.info("Reset to default branch", {
106
+ from: currentBranch,
107
+ to: defaultBranch,
108
+ });
98
109
  return true;
99
110
  }
100
111
  async createOrSwitchToBranch(branchName, baseBranch) {
101
- await this.ensureCleanWorkingDirectory('switching branches');
112
+ await this.ensureCleanWorkingDirectory("switching branches");
102
113
  const exists = await this.branchExists(branchName);
103
114
  if (exists) {
104
115
  await this.switchToBranch(branchName);
@@ -108,17 +119,17 @@ class GitManager {
108
119
  }
109
120
  }
110
121
  async addFiles(paths) {
111
- const pathList = paths.map(p => `"${p}"`).join(' ');
122
+ const pathList = paths.map((p) => `"${this.escapeShellArg(p)}"`).join(" ");
112
123
  await this.runGitCommand(`add ${pathList}`);
113
124
  }
114
125
  async addAllPostHogFiles() {
115
126
  try {
116
127
  // Use -A flag to add all changes (including new files) and ignore errors if directory is empty
117
- await this.runGitCommand('add -A .posthog/');
128
+ await this.runGitCommand("add -A .posthog/");
118
129
  }
119
130
  catch (error) {
120
131
  // If the directory doesn't exist or has no files, that's fine - just log and continue
121
- this.logger.debug('No PostHog files to add', { error });
132
+ this.logger.debug("No PostHog files to add", { error });
122
133
  }
123
134
  }
124
135
  async commitChanges(message, options) {
@@ -127,8 +138,15 @@ class GitManager {
127
138
  }
128
139
  async hasChanges() {
129
140
  try {
130
- const status = await this.runGitCommand('status --porcelain');
131
- return status.length > 0;
141
+ const status = await this.runGitCommand("status --porcelain");
142
+ if (!status || status.trim().length === 0) {
143
+ return false;
144
+ }
145
+ const lines = status.split("\n").filter((line) => {
146
+ const trimmed = line.trim();
147
+ return trimmed.length > 0 && !trimmed.includes(".posthog/");
148
+ });
149
+ return lines.length > 0;
132
150
  }
133
151
  catch {
134
152
  return false;
@@ -136,7 +154,7 @@ class GitManager {
136
154
  }
137
155
  async hasStagedChanges() {
138
156
  try {
139
- const status = await this.runGitCommand('diff --cached --name-only');
157
+ const status = await this.runGitCommand("diff --cached --name-only");
140
158
  return status.length > 0;
141
159
  }
142
160
  catch {
@@ -150,7 +168,7 @@ class GitManager {
150
168
  }
151
169
  }
152
170
  async generateUniqueBranchName(baseName) {
153
- if (!await this.branchExists(baseName)) {
171
+ if (!(await this.branchExists(baseName))) {
154
172
  return baseName;
155
173
  }
156
174
  let counter = 1;
@@ -165,15 +183,15 @@ class GitManager {
165
183
  const defaultBranch = await this.getDefaultBranch();
166
184
  const currentBranch = await this.getCurrentBranch();
167
185
  if (currentBranch !== defaultBranch) {
168
- await this.ensureCleanWorkingDirectory('switching to default branch');
186
+ await this.ensureCleanWorkingDirectory("switching to default branch");
169
187
  await this.switchToBranch(defaultBranch);
170
188
  }
171
189
  return defaultBranch;
172
190
  }
173
191
  buildCommitCommand(message, options) {
174
- let command = `commit -m "${message.replace(/"/g, '\\"')}"`;
192
+ let command = `commit -m "${this.escapeShellArg(message)}"`;
175
193
  if (options?.allowEmpty) {
176
- command += ' --allow-empty';
194
+ command += " --allow-empty";
177
195
  }
178
196
  const authorName = options?.authorName || this.authorName;
179
197
  const authorEmail = options?.authorEmail || this.authorEmail;
@@ -184,14 +202,14 @@ class GitManager {
184
202
  }
185
203
  async getRemoteUrl() {
186
204
  try {
187
- return await this.runGitCommand('remote get-url origin');
205
+ return await this.runGitCommand("remote get-url origin");
188
206
  }
189
207
  catch {
190
208
  return null;
191
209
  }
192
210
  }
193
211
  async pushBranch(branchName, force = false) {
194
- const forceFlag = force ? '--force' : '';
212
+ const forceFlag = force ? "--force" : "";
195
213
  await this.runGitCommand(`push ${forceFlag} -u origin ${branchName}`);
196
214
  }
197
215
  /**
@@ -204,10 +222,10 @@ class GitManager {
204
222
  * const result = await tracker.finalize({ commitMessage: 'fallback message', push: true });
205
223
  */
206
224
  async trackCommitsDuring() {
207
- const initialSha = await this.getCommitSha('HEAD');
225
+ const initialSha = await this.getCommitSha("HEAD");
208
226
  return {
209
227
  finalize: async (options) => {
210
- const currentSha = await this.getCommitSha('HEAD');
228
+ const currentSha = await this.getCommitSha("HEAD");
211
229
  const externalCommitsCreated = initialSha !== currentSha;
212
230
  const hasUncommittedChanges = await this.hasChanges();
213
231
  // If no commits and no changes, nothing to do
@@ -217,7 +235,7 @@ class GitManager {
217
235
  let commitCreated = externalCommitsCreated;
218
236
  // Commit any remaining uncommitted changes
219
237
  if (hasUncommittedChanges) {
220
- await this.runGitCommand('add .');
238
+ await this.runGitCommand("add .");
221
239
  const hasStagedChanges = await this.hasStagedChanges();
222
240
  if (hasStagedChanges) {
223
241
  await this.commitChanges(options.commitMessage);
@@ -230,20 +248,22 @@ class GitManager {
230
248
  const currentBranch = await this.getCurrentBranch();
231
249
  await this.pushBranch(currentBranch);
232
250
  pushedBranch = true;
233
- this.logger.info('Pushed branch after operation', { branch: currentBranch });
251
+ this.logger.info("Pushed branch after operation", {
252
+ branch: currentBranch,
253
+ });
234
254
  }
235
255
  return { commitCreated, pushedBranch };
236
- }
256
+ },
237
257
  };
238
258
  }
239
259
  async createTaskBranch(taskSlug) {
240
260
  const branchName = `posthog/task-${taskSlug}`;
241
261
  // Ensure we're on default branch before creating task branch
242
262
  const defaultBranch = await this.ensureOnDefaultBranch();
243
- this.logger.info('Creating task branch from default branch', {
263
+ this.logger.info("Creating task branch from default branch", {
244
264
  branchName,
245
265
  taskSlug,
246
- baseBranch: defaultBranch
266
+ baseBranch: defaultBranch,
247
267
  });
248
268
  await this.createOrSwitchToBranch(branchName, defaultBranch);
249
269
  return branchName;
@@ -251,49 +271,55 @@ class GitManager {
251
271
  async createTaskPlanningBranch(taskId, baseBranch) {
252
272
  const baseName = `posthog/task-${taskId}-planning`;
253
273
  const branchName = await this.generateUniqueBranchName(baseName);
254
- this.logger.debug('Creating unique planning branch', { branchName, taskId });
255
- const base = baseBranch || await this.ensureOnDefaultBranch();
274
+ this.logger.debug("Creating unique planning branch", {
275
+ branchName,
276
+ taskId,
277
+ });
278
+ const base = baseBranch || (await this.ensureOnDefaultBranch());
256
279
  await this.createBranch(branchName, base);
257
280
  return branchName;
258
281
  }
259
282
  async createTaskImplementationBranch(taskId, planningBranchName) {
260
283
  const baseName = `posthog/task-${taskId}-implementation`;
261
284
  const branchName = await this.generateUniqueBranchName(baseName);
262
- this.logger.debug('Creating unique implementation branch', {
285
+ this.logger.debug("Creating unique implementation branch", {
263
286
  branchName,
264
287
  taskId,
265
- currentBranch: await this.getCurrentBranch()
288
+ currentBranch: await this.getCurrentBranch(),
266
289
  });
267
290
  // Determine base branch: explicit param > current planning branch > default
268
291
  let baseBranch = planningBranchName;
269
292
  if (!baseBranch) {
270
293
  const currentBranch = await this.getCurrentBranch();
271
- if (currentBranch.includes('-planning')) {
294
+ if (currentBranch.includes("-planning")) {
272
295
  baseBranch = currentBranch;
273
- this.logger.debug('Using current planning branch', { baseBranch });
296
+ this.logger.debug("Using current planning branch", { baseBranch });
274
297
  }
275
298
  else {
276
299
  baseBranch = await this.ensureOnDefaultBranch();
277
- this.logger.debug('Using default branch', { baseBranch });
300
+ this.logger.debug("Using default branch", { baseBranch });
278
301
  }
279
302
  }
280
- this.logger.debug('Creating implementation branch from base', { baseBranch, branchName });
303
+ this.logger.debug("Creating implementation branch from base", {
304
+ baseBranch,
305
+ branchName,
306
+ });
281
307
  await this.createBranch(branchName, baseBranch);
282
- this.logger.info('Implementation branch created', {
308
+ this.logger.info("Implementation branch created", {
283
309
  branchName,
284
- currentBranch: await this.getCurrentBranch()
310
+ currentBranch: await this.getCurrentBranch(),
285
311
  });
286
312
  return branchName;
287
313
  }
288
314
  async commitPlan(taskId, taskTitle) {
289
315
  const currentBranch = await this.getCurrentBranch();
290
- this.logger.debug('Committing plan', { taskId, currentBranch });
316
+ this.logger.debug("Committing plan", { taskId, currentBranch });
291
317
  await this.addAllPostHogFiles();
292
318
  const hasChanges = await this.hasStagedChanges();
293
- this.logger.debug('Checking for staged changes', { hasChanges });
319
+ this.logger.debug("Checking for staged changes", { hasChanges });
294
320
  if (!hasChanges) {
295
- this.logger.info('No plan changes to commit', { taskId });
296
- return 'No changes to commit';
321
+ this.logger.info("No plan changes to commit", { taskId });
322
+ return "No changes to commit";
297
323
  }
298
324
  const message = `📋 Add plan for task: ${taskTitle}
299
325
 
@@ -303,15 +329,15 @@ Generated by PostHog Agent
303
329
  This commit contains the implementation plan and supporting documentation
304
330
  for the task. Review the plan before proceeding with implementation.`;
305
331
  const result = await this.commitChanges(message);
306
- this.logger.info('Plan committed', { taskId, taskTitle });
332
+ this.logger.info("Plan committed", { taskId, taskTitle });
307
333
  return result;
308
334
  }
309
335
  async commitImplementation(taskId, taskTitle, planSummary) {
310
- await this.runGitCommand('add .');
336
+ await this.runGitCommand("add .");
311
337
  const hasChanges = await this.hasStagedChanges();
312
338
  if (!hasChanges) {
313
- this.logger.warn('No implementation changes to commit', { taskId });
314
- return 'No changes to commit';
339
+ this.logger.warn("No implementation changes to commit", { taskId });
340
+ return "No changes to commit";
315
341
  }
316
342
  let message = `✨ Implement task: ${taskTitle}
317
343
 
@@ -322,11 +348,11 @@ Generated by PostHog Agent`;
322
348
  }
323
349
  message += `\n\nThis commit implements the changes described in the task plan.`;
324
350
  const result = await this.commitChanges(message);
325
- this.logger.info('Implementation committed', { taskId, taskTitle });
351
+ this.logger.info("Implementation committed", { taskId, taskTitle });
326
352
  return result;
327
353
  }
328
354
  async deleteBranch(branchName, force = false) {
329
- const forceFlag = force ? '-D' : '-d';
355
+ const forceFlag = force ? "-D" : "-d";
330
356
  await this.runGitCommand(`branch ${forceFlag} ${branchName}`);
331
357
  }
332
358
  async deleteRemoteBranch(branchName) {
@@ -338,23 +364,23 @@ Generated by PostHog Agent`;
338
364
  return {
339
365
  name: branchName,
340
366
  exists,
341
- isCurrentBranch: branchName === currentBranch
367
+ isCurrentBranch: branchName === currentBranch,
342
368
  };
343
369
  }
344
- async getCommitSha(ref = 'HEAD') {
370
+ async getCommitSha(ref = "HEAD") {
345
371
  return await this.runGitCommand(`rev-parse ${ref}`);
346
372
  }
347
- async getCommitMessage(ref = 'HEAD') {
373
+ async getCommitMessage(ref = "HEAD") {
348
374
  return await this.runGitCommand(`log -1 --pretty=%B ${ref}`);
349
375
  }
350
376
  async createPullRequest(branchName, title, body, baseBranch) {
351
377
  const currentBranch = await this.getCurrentBranch();
352
378
  if (currentBranch !== branchName) {
353
- await this.ensureCleanWorkingDirectory('creating PR');
379
+ await this.ensureCleanWorkingDirectory("creating PR");
354
380
  await this.switchToBranch(branchName);
355
381
  }
356
382
  await this.pushBranch(branchName);
357
- let command = `gh pr create --title "${title.replace(/"/g, '\\"')}" --body "${body.replace(/"/g, '\\"')}"`;
383
+ let command = `gh pr create --title "${this.escapeShellArg(title)}" --body "${this.escapeShellArg(body)}"`;
358
384
  if (baseBranch) {
359
385
  command += ` --base ${baseBranch}`;
360
386
  }
@@ -369,12 +395,14 @@ Generated by PostHog Agent`;
369
395
  async getTaskBranch(taskSlug) {
370
396
  try {
371
397
  // Get all branches matching the task slug pattern
372
- const branches = await this.runGitCommand('branch --list --all');
398
+ const branches = await this.runGitCommand("branch --list --all");
373
399
  const branchPattern = `posthog/task-${taskSlug}`;
374
400
  // Look for exact match or with counter suffix
375
- const lines = branches.split('\n').map(l => l.trim().replace(/^\*\s+/, ''));
401
+ const lines = branches
402
+ .split("\n")
403
+ .map((l) => l.trim().replace(/^\*\s+/, ""));
376
404
  for (const line of lines) {
377
- const cleanBranch = line.replace('remotes/origin/', '');
405
+ const cleanBranch = line.replace("remotes/origin/", "");
378
406
  if (cleanBranch.startsWith(branchPattern)) {
379
407
  return cleanBranch;
380
408
  }
@@ -382,14 +410,14 @@ Generated by PostHog Agent`;
382
410
  return null;
383
411
  }
384
412
  catch (error) {
385
- this.logger.debug('Failed to get task branch', { taskSlug, error });
413
+ this.logger.debug("Failed to get task branch", { taskSlug, error });
386
414
  return null;
387
415
  }
388
416
  }
389
417
  async commitAndPush(message, options) {
390
418
  const hasChanges = await this.hasStagedChanges();
391
419
  if (!hasChanges && !options?.allowEmpty) {
392
- this.logger.debug('No changes to commit, skipping');
420
+ this.logger.debug("No changes to commit, skipping");
393
421
  return;
394
422
  }
395
423
  const command = this.buildCommitCommand(message, options);
@@ -397,7 +425,10 @@ Generated by PostHog Agent`;
397
425
  // Push to origin
398
426
  const currentBranch = await this.getCurrentBranch();
399
427
  await this.pushBranch(currentBranch);
400
- this.logger.info('Committed and pushed changes', { branch: currentBranch, message });
428
+ this.logger.info("Committed and pushed changes", {
429
+ branch: currentBranch,
430
+ message,
431
+ });
401
432
  }
402
433
  }
403
434
 
@@ -1 +1 @@
1
- {"version":3,"file":"git-manager.js","sources":["../../src/git-manager.ts"],"sourcesContent":["import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { Logger } from './utils/logger.js';\n\nconst execAsync = promisify(exec);\n\nexport interface GitConfig {\n repositoryPath: string;\n authorName?: string;\n authorEmail?: string;\n logger?: Logger;\n}\n\nexport interface BranchInfo {\n name: string;\n exists: boolean;\n isCurrentBranch: boolean;\n}\n\nexport class GitManager {\n private repositoryPath: string;\n private authorName?: string;\n private authorEmail?: string;\n private logger: Logger;\n\n constructor(config: GitConfig) {\n this.repositoryPath = config.repositoryPath;\n this.authorName = config.authorName;\n this.authorEmail = config.authorEmail;\n this.logger = config.logger || new Logger({ debug: false, prefix: '[GitManager]' });\n }\n\n private async runGitCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(`cd \"${this.repositoryPath}\" && git ${command}`);\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: ${command}\\n${error}`);\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(`cd \"${this.repositoryPath}\" && ${command}`);\n return stdout.trim();\n } catch (error) {\n throw new Error(`Command failed: ${command}\\n${error}`);\n }\n }\n\n async isGitRepository(): Promise<boolean> {\n try {\n await this.runGitCommand('rev-parse --git-dir');\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n return await this.runGitCommand('branch --show-current');\n }\n\n async getDefaultBranch(): Promise<string> {\n try {\n // Try to get the default branch from remote\n const remoteBranch = await this.runGitCommand('symbolic-ref refs/remotes/origin/HEAD');\n return remoteBranch.replace('refs/remotes/origin/', '');\n } catch {\n // Fallback: check if main exists, otherwise use master\n if (await this.branchExists('main')) {\n return 'main';\n } else if (await this.branchExists('master')) {\n return 'master';\n } else {\n throw new Error('Cannot determine default branch. No main or master branch found.');\n }\n }\n }\n\n async branchExists(branchName: string): Promise<boolean> {\n try {\n await this.runGitCommand(`rev-parse --verify ${branchName}`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createBranch(branchName: string, baseBranch?: string): Promise<void> {\n const base = baseBranch || await this.getCurrentBranch();\n await this.runGitCommand(`checkout -b ${branchName} ${base}`);\n }\n\n async switchToBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`checkout ${branchName}`);\n }\n\n async resetToDefaultBranchIfNeeded(): Promise<boolean> {\n const currentBranch = await this.getCurrentBranch();\n const defaultBranch = await this.getDefaultBranch();\n\n if (currentBranch === defaultBranch) {\n this.logger.debug('Already on default branch', { branch: defaultBranch });\n return true;\n }\n\n if (await this.hasChanges()) {\n this.logger.warn('Skipping branch reset - uncommitted changes present', {\n currentBranch,\n defaultBranch\n });\n return false;\n }\n\n await this.switchToBranch(defaultBranch);\n this.logger.info('Reset to default branch', { from: currentBranch, to: defaultBranch });\n return true;\n }\n\n async createOrSwitchToBranch(branchName: string, baseBranch?: string): Promise<void> {\n await this.ensureCleanWorkingDirectory('switching branches');\n\n const exists = await this.branchExists(branchName);\n if (exists) {\n await this.switchToBranch(branchName);\n } else {\n await this.createBranch(branchName, baseBranch);\n }\n }\n\n async addFiles(paths: string[]): Promise<void> {\n const pathList = paths.map(p => `\"${p}\"`).join(' ');\n await this.runGitCommand(`add ${pathList}`);\n }\n\n async addAllPostHogFiles(): Promise<void> {\n try {\n // Use -A flag to add all changes (including new files) and ignore errors if directory is empty\n await this.runGitCommand('add -A .posthog/');\n } catch (error) {\n // If the directory doesn't exist or has no files, that's fine - just log and continue\n this.logger.debug('No PostHog files to add', { error });\n }\n }\n\n async commitChanges(message: string, options?: {\n authorName?: string;\n authorEmail?: string;\n }): Promise<string> {\n const command = this.buildCommitCommand(message, options);\n return await this.runGitCommand(command);\n }\n\n async hasChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand('status --porcelain');\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n async hasStagedChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand('diff --cached --name-only');\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n // Helper: Centralized safety check for uncommitted changes\n private async ensureCleanWorkingDirectory(operation: string): Promise<void> {\n if (await this.hasChanges()) {\n throw new Error(`Uncommitted changes detected. Please commit or stash changes before ${operation}.`);\n }\n }\n\n private async generateUniqueBranchName(baseName: string): Promise<string> {\n if (!await this.branchExists(baseName)) {\n return baseName;\n }\n\n let counter = 1;\n let uniqueName = `${baseName}-${counter}`;\n while (await this.branchExists(uniqueName)) {\n counter++;\n uniqueName = `${baseName}-${counter}`;\n }\n return uniqueName;\n }\n\n private async ensureOnDefaultBranch(): Promise<string> {\n const defaultBranch = await this.getDefaultBranch();\n const currentBranch = await this.getCurrentBranch();\n\n if (currentBranch !== defaultBranch) {\n await this.ensureCleanWorkingDirectory('switching to default branch');\n await this.switchToBranch(defaultBranch);\n }\n\n return defaultBranch;\n }\n\n private buildCommitCommand(message: string, options?: { allowEmpty?: boolean; authorName?: string; authorEmail?: string }): string {\n let command = `commit -m \"${message.replace(/\"/g, '\\\\\"')}\"`;\n\n if (options?.allowEmpty) {\n command += ' --allow-empty';\n }\n\n const authorName = options?.authorName || this.authorName;\n const authorEmail = options?.authorEmail || this.authorEmail;\n\n if (authorName && authorEmail) {\n command += ` --author=\"${authorName} <${authorEmail}>\"`;\n }\n\n return command;\n }\n\n async getRemoteUrl(): Promise<string | null> {\n try {\n return await this.runGitCommand('remote get-url origin');\n } catch {\n return null;\n }\n }\n\n async pushBranch(branchName: string, force: boolean = false): Promise<void> {\n const forceFlag = force ? '--force' : '';\n await this.runGitCommand(`push ${forceFlag} -u origin ${branchName}`);\n }\n\n /**\n * Tracks whether commits were made during an operation by comparing HEAD SHA\n * before and after. Returns an object with methods to finalize the operation.\n *\n * Usage:\n * const tracker = await gitManager.trackCommitsDuring();\n * // ... do work that might create commits ...\n * const result = await tracker.finalize({ commitMessage: 'fallback message', push: true });\n */\n async trackCommitsDuring(): Promise<{\n finalize: (options: {\n commitMessage: string;\n push?: boolean;\n }) => Promise<{ commitCreated: boolean; pushedBranch: boolean }>;\n }> {\n const initialSha = await this.getCommitSha('HEAD');\n\n return {\n finalize: async (options) => {\n const currentSha = await this.getCommitSha('HEAD');\n const externalCommitsCreated = initialSha !== currentSha;\n const hasUncommittedChanges = await this.hasChanges();\n\n // If no commits and no changes, nothing to do\n if (!externalCommitsCreated && !hasUncommittedChanges) {\n return { commitCreated: false, pushedBranch: false };\n }\n\n let commitCreated = externalCommitsCreated;\n\n // Commit any remaining uncommitted changes\n if (hasUncommittedChanges) {\n await this.runGitCommand('add .');\n const hasStagedChanges = await this.hasStagedChanges();\n\n if (hasStagedChanges) {\n await this.commitChanges(options.commitMessage);\n commitCreated = true;\n }\n }\n\n // Push if requested and commits were made\n let pushedBranch = false;\n if (options.push && commitCreated) {\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n pushedBranch = true;\n this.logger.info('Pushed branch after operation', { branch: currentBranch });\n }\n\n return { commitCreated, pushedBranch };\n }\n };\n }\n\n async createTaskBranch(taskSlug: string): Promise<string> {\n const branchName = `posthog/task-${taskSlug}`;\n\n // Ensure we're on default branch before creating task branch\n const defaultBranch = await this.ensureOnDefaultBranch();\n\n this.logger.info('Creating task branch from default branch', {\n branchName,\n taskSlug,\n baseBranch: defaultBranch\n });\n\n await this.createOrSwitchToBranch(branchName, defaultBranch);\n\n return branchName;\n }\n\n async createTaskPlanningBranch(taskId: string, baseBranch?: string): Promise<string> {\n const baseName = `posthog/task-${taskId}-planning`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug('Creating unique planning branch', { branchName, taskId });\n\n const base = baseBranch || await this.ensureOnDefaultBranch();\n await this.createBranch(branchName, base);\n\n return branchName;\n }\n\n async createTaskImplementationBranch(taskId: string, planningBranchName?: string): Promise<string> {\n const baseName = `posthog/task-${taskId}-implementation`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug('Creating unique implementation branch', {\n branchName,\n taskId,\n currentBranch: await this.getCurrentBranch()\n });\n\n // Determine base branch: explicit param > current planning branch > default\n let baseBranch = planningBranchName;\n\n if (!baseBranch) {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch.includes('-planning')) {\n baseBranch = currentBranch;\n this.logger.debug('Using current planning branch', { baseBranch });\n } else {\n baseBranch = await this.ensureOnDefaultBranch();\n this.logger.debug('Using default branch', { baseBranch });\n }\n }\n\n this.logger.debug('Creating implementation branch from base', { baseBranch, branchName });\n await this.createBranch(branchName, baseBranch);\n\n this.logger.info('Implementation branch created', {\n branchName,\n currentBranch: await this.getCurrentBranch()\n });\n\n return branchName;\n }\n\n async commitPlan(taskId: string, taskTitle: string): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n this.logger.debug('Committing plan', { taskId, currentBranch });\n\n await this.addAllPostHogFiles();\n\n const hasChanges = await this.hasStagedChanges();\n this.logger.debug('Checking for staged changes', { hasChanges });\n\n if (!hasChanges) {\n this.logger.info('No plan changes to commit', { taskId });\n return 'No changes to commit';\n }\n\n const message = `📋 Add plan for task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent\n\nThis commit contains the implementation plan and supporting documentation\nfor the task. Review the plan before proceeding with implementation.`;\n\n const result = await this.commitChanges(message);\n this.logger.info('Plan committed', { taskId, taskTitle });\n return result;\n }\n\n async commitImplementation(taskId: string, taskTitle: string, planSummary?: string): Promise<string> {\n await this.runGitCommand('add .');\n\n const hasChanges = await this.hasStagedChanges();\n if (!hasChanges) {\n this.logger.warn('No implementation changes to commit', { taskId });\n return 'No changes to commit';\n }\n\n let message = `✨ Implement task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent`;\n\n if (planSummary) {\n message += `\\n\\nPlan Summary:\\n${planSummary}`;\n }\n\n message += `\\n\\nThis commit implements the changes described in the task plan.`;\n\n const result = await this.commitChanges(message);\n this.logger.info('Implementation committed', { taskId, taskTitle });\n return result;\n }\n\n async deleteBranch(branchName: string, force: boolean = false): Promise<void> {\n const forceFlag = force ? '-D' : '-d';\n await this.runGitCommand(`branch ${forceFlag} ${branchName}`);\n }\n\n async deleteRemoteBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`push origin --delete ${branchName}`);\n }\n\n async getBranchInfo(branchName: string): Promise<BranchInfo> {\n const exists = await this.branchExists(branchName);\n const currentBranch = await this.getCurrentBranch();\n\n return {\n name: branchName,\n exists,\n isCurrentBranch: branchName === currentBranch\n };\n }\n\n async getCommitSha(ref: string = 'HEAD'): Promise<string> {\n return await this.runGitCommand(`rev-parse ${ref}`);\n }\n\n async getCommitMessage(ref: string = 'HEAD'): Promise<string> {\n return await this.runGitCommand(`log -1 --pretty=%B ${ref}`);\n }\n\n async createPullRequest(\n branchName: string,\n title: string,\n body: string,\n baseBranch?: string\n ): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch !== branchName) {\n await this.ensureCleanWorkingDirectory('creating PR');\n await this.switchToBranch(branchName);\n }\n\n await this.pushBranch(branchName);\n\n let command = `gh pr create --title \"${title.replace(/\"/g, '\\\\\"')}\" --body \"${body.replace(/\"/g, '\\\\\"')}\"`;\n\n if (baseBranch) {\n command += ` --base ${baseBranch}`;\n }\n\n try {\n const prUrl = await this.runCommand(command);\n return prUrl.trim();\n } catch (error) {\n throw new Error(`Failed to create PR: ${error}`);\n }\n }\n\n async getTaskBranch(taskSlug: string): Promise<string | null> {\n try {\n // Get all branches matching the task slug pattern\n const branches = await this.runGitCommand('branch --list --all');\n const branchPattern = `posthog/task-${taskSlug}`;\n \n // Look for exact match or with counter suffix\n const lines = branches.split('\\n').map(l => l.trim().replace(/^\\*\\s+/, ''));\n for (const line of lines) {\n const cleanBranch = line.replace('remotes/origin/', '');\n if (cleanBranch.startsWith(branchPattern)) {\n return cleanBranch;\n }\n }\n \n return null;\n } catch (error) {\n this.logger.debug('Failed to get task branch', { taskSlug, error });\n return null;\n }\n }\n\n async commitAndPush(message: string, options?: { allowEmpty?: boolean }): Promise<void> {\n const hasChanges = await this.hasStagedChanges();\n\n if (!hasChanges && !options?.allowEmpty) {\n this.logger.debug('No changes to commit, skipping');\n return;\n }\n\n const command = this.buildCommitCommand(message, options);\n await this.runGitCommand(command);\n\n // Push to origin\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n\n this.logger.info('Committed and pushed changes', { branch: currentBranch, message });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-manager.js","sources":["../../src/git-manager.ts"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { Logger } from \"./utils/logger.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface GitConfig {\n repositoryPath: string;\n authorName?: string;\n authorEmail?: string;\n logger?: Logger;\n}\n\nexport interface BranchInfo {\n name: string;\n exists: boolean;\n isCurrentBranch: boolean;\n}\n\nexport class GitManager {\n private repositoryPath: string;\n private authorName?: string;\n private authorEmail?: string;\n private logger: Logger;\n\n constructor(config: GitConfig) {\n this.repositoryPath = config.repositoryPath;\n this.authorName = config.authorName;\n this.authorEmail = config.authorEmail;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[GitManager]\" });\n }\n\n private escapeShellArg(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/`/g, \"\\\\`\")\n .replace(/\\$/g, \"\\\\$\");\n }\n\n private async runGitCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n `cd \"${this.repositoryPath}\" && git ${command}`,\n );\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: ${command}\\n${error}`);\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n `cd \"${this.repositoryPath}\" && ${command}`,\n );\n return stdout.trim();\n } catch (error) {\n throw new Error(`Command failed: ${command}\\n${error}`);\n }\n }\n\n async isGitRepository(): Promise<boolean> {\n try {\n await this.runGitCommand(\"rev-parse --git-dir\");\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n return await this.runGitCommand(\"branch --show-current\");\n }\n\n async getDefaultBranch(): Promise<string> {\n try {\n // Try to get the default branch from remote\n const remoteBranch = await this.runGitCommand(\n \"symbolic-ref refs/remotes/origin/HEAD\",\n );\n return remoteBranch.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Fallback: check if main exists, otherwise use master\n if (await this.branchExists(\"main\")) {\n return \"main\";\n } else if (await this.branchExists(\"master\")) {\n return \"master\";\n } else {\n throw new Error(\n \"Cannot determine default branch. No main or master branch found.\",\n );\n }\n }\n }\n\n async branchExists(branchName: string): Promise<boolean> {\n try {\n await this.runGitCommand(`rev-parse --verify ${branchName}`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createBranch(branchName: string, baseBranch?: string): Promise<void> {\n const base = baseBranch || (await this.getCurrentBranch());\n await this.runGitCommand(`checkout -b ${branchName} ${base}`);\n }\n\n async switchToBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`checkout ${branchName}`);\n }\n\n async resetToDefaultBranchIfNeeded(): Promise<boolean> {\n const currentBranch = await this.getCurrentBranch();\n const defaultBranch = await this.getDefaultBranch();\n\n if (currentBranch === defaultBranch) {\n this.logger.debug(\"Already on default branch\", { branch: defaultBranch });\n return true;\n }\n\n if (await this.hasChanges()) {\n this.logger.warn(\"Skipping branch reset - uncommitted changes present\", {\n currentBranch,\n defaultBranch,\n });\n return false;\n }\n\n await this.switchToBranch(defaultBranch);\n this.logger.info(\"Reset to default branch\", {\n from: currentBranch,\n to: defaultBranch,\n });\n return true;\n }\n\n async createOrSwitchToBranch(\n branchName: string,\n baseBranch?: string,\n ): Promise<void> {\n await this.ensureCleanWorkingDirectory(\"switching branches\");\n\n const exists = await this.branchExists(branchName);\n if (exists) {\n await this.switchToBranch(branchName);\n } else {\n await this.createBranch(branchName, baseBranch);\n }\n }\n\n async addFiles(paths: string[]): Promise<void> {\n const pathList = paths.map((p) => `\"${this.escapeShellArg(p)}\"`).join(\" \");\n await this.runGitCommand(`add ${pathList}`);\n }\n\n async addAllPostHogFiles(): Promise<void> {\n try {\n // Use -A flag to add all changes (including new files) and ignore errors if directory is empty\n await this.runGitCommand(\"add -A .posthog/\");\n } catch (error) {\n // If the directory doesn't exist or has no files, that's fine - just log and continue\n this.logger.debug(\"No PostHog files to add\", { error });\n }\n }\n\n async commitChanges(\n message: string,\n options?: {\n authorName?: string;\n authorEmail?: string;\n },\n ): Promise<string> {\n const command = this.buildCommitCommand(message, options);\n return await this.runGitCommand(command);\n }\n\n async hasChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand(\"status --porcelain\");\n if (!status || status.trim().length === 0) {\n return false;\n }\n\n const lines = status.split(\"\\n\").filter((line) => {\n const trimmed = line.trim();\n return trimmed.length > 0 && !trimmed.includes(\".posthog/\");\n });\n\n return lines.length > 0;\n } catch {\n return false;\n }\n }\n\n async hasStagedChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand(\"diff --cached --name-only\");\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n // Helper: Centralized safety check for uncommitted changes\n private async ensureCleanWorkingDirectory(operation: string): Promise<void> {\n if (await this.hasChanges()) {\n throw new Error(\n `Uncommitted changes detected. Please commit or stash changes before ${operation}.`,\n );\n }\n }\n\n private async generateUniqueBranchName(baseName: string): Promise<string> {\n if (!(await this.branchExists(baseName))) {\n return baseName;\n }\n\n let counter = 1;\n let uniqueName = `${baseName}-${counter}`;\n while (await this.branchExists(uniqueName)) {\n counter++;\n uniqueName = `${baseName}-${counter}`;\n }\n return uniqueName;\n }\n\n private async ensureOnDefaultBranch(): Promise<string> {\n const defaultBranch = await this.getDefaultBranch();\n const currentBranch = await this.getCurrentBranch();\n\n if (currentBranch !== defaultBranch) {\n await this.ensureCleanWorkingDirectory(\"switching to default branch\");\n await this.switchToBranch(defaultBranch);\n }\n\n return defaultBranch;\n }\n\n private buildCommitCommand(\n message: string,\n options?: {\n allowEmpty?: boolean;\n authorName?: string;\n authorEmail?: string;\n },\n ): string {\n let command = `commit -m \"${this.escapeShellArg(message)}\"`;\n\n if (options?.allowEmpty) {\n command += \" --allow-empty\";\n }\n\n const authorName = options?.authorName || this.authorName;\n const authorEmail = options?.authorEmail || this.authorEmail;\n\n if (authorName && authorEmail) {\n command += ` --author=\"${authorName} <${authorEmail}>\"`;\n }\n\n return command;\n }\n\n async getRemoteUrl(): Promise<string | null> {\n try {\n return await this.runGitCommand(\"remote get-url origin\");\n } catch {\n return null;\n }\n }\n\n async pushBranch(branchName: string, force: boolean = false): Promise<void> {\n const forceFlag = force ? \"--force\" : \"\";\n await this.runGitCommand(`push ${forceFlag} -u origin ${branchName}`);\n }\n\n /**\n * Tracks whether commits were made during an operation by comparing HEAD SHA\n * before and after. Returns an object with methods to finalize the operation.\n *\n * Usage:\n * const tracker = await gitManager.trackCommitsDuring();\n * // ... do work that might create commits ...\n * const result = await tracker.finalize({ commitMessage: 'fallback message', push: true });\n */\n async trackCommitsDuring(): Promise<{\n finalize: (options: {\n commitMessage: string;\n push?: boolean;\n }) => Promise<{ commitCreated: boolean; pushedBranch: boolean }>;\n }> {\n const initialSha = await this.getCommitSha(\"HEAD\");\n\n return {\n finalize: async (options) => {\n const currentSha = await this.getCommitSha(\"HEAD\");\n const externalCommitsCreated = initialSha !== currentSha;\n const hasUncommittedChanges = await this.hasChanges();\n\n // If no commits and no changes, nothing to do\n if (!externalCommitsCreated && !hasUncommittedChanges) {\n return { commitCreated: false, pushedBranch: false };\n }\n\n let commitCreated = externalCommitsCreated;\n\n // Commit any remaining uncommitted changes\n if (hasUncommittedChanges) {\n await this.runGitCommand(\"add .\");\n const hasStagedChanges = await this.hasStagedChanges();\n\n if (hasStagedChanges) {\n await this.commitChanges(options.commitMessage);\n commitCreated = true;\n }\n }\n\n // Push if requested and commits were made\n let pushedBranch = false;\n if (options.push && commitCreated) {\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n pushedBranch = true;\n this.logger.info(\"Pushed branch after operation\", {\n branch: currentBranch,\n });\n }\n\n return { commitCreated, pushedBranch };\n },\n };\n }\n\n async createTaskBranch(taskSlug: string): Promise<string> {\n const branchName = `posthog/task-${taskSlug}`;\n\n // Ensure we're on default branch before creating task branch\n const defaultBranch = await this.ensureOnDefaultBranch();\n\n this.logger.info(\"Creating task branch from default branch\", {\n branchName,\n taskSlug,\n baseBranch: defaultBranch,\n });\n\n await this.createOrSwitchToBranch(branchName, defaultBranch);\n\n return branchName;\n }\n\n async createTaskPlanningBranch(\n taskId: string,\n baseBranch?: string,\n ): Promise<string> {\n const baseName = `posthog/task-${taskId}-planning`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug(\"Creating unique planning branch\", {\n branchName,\n taskId,\n });\n\n const base = baseBranch || (await this.ensureOnDefaultBranch());\n await this.createBranch(branchName, base);\n\n return branchName;\n }\n\n async createTaskImplementationBranch(\n taskId: string,\n planningBranchName?: string,\n ): Promise<string> {\n const baseName = `posthog/task-${taskId}-implementation`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug(\"Creating unique implementation branch\", {\n branchName,\n taskId,\n currentBranch: await this.getCurrentBranch(),\n });\n\n // Determine base branch: explicit param > current planning branch > default\n let baseBranch = planningBranchName;\n\n if (!baseBranch) {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch.includes(\"-planning\")) {\n baseBranch = currentBranch;\n this.logger.debug(\"Using current planning branch\", { baseBranch });\n } else {\n baseBranch = await this.ensureOnDefaultBranch();\n this.logger.debug(\"Using default branch\", { baseBranch });\n }\n }\n\n this.logger.debug(\"Creating implementation branch from base\", {\n baseBranch,\n branchName,\n });\n await this.createBranch(branchName, baseBranch);\n\n this.logger.info(\"Implementation branch created\", {\n branchName,\n currentBranch: await this.getCurrentBranch(),\n });\n\n return branchName;\n }\n\n async commitPlan(taskId: string, taskTitle: string): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n this.logger.debug(\"Committing plan\", { taskId, currentBranch });\n\n await this.addAllPostHogFiles();\n\n const hasChanges = await this.hasStagedChanges();\n this.logger.debug(\"Checking for staged changes\", { hasChanges });\n\n if (!hasChanges) {\n this.logger.info(\"No plan changes to commit\", { taskId });\n return \"No changes to commit\";\n }\n\n const message = `📋 Add plan for task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent\n\nThis commit contains the implementation plan and supporting documentation\nfor the task. Review the plan before proceeding with implementation.`;\n\n const result = await this.commitChanges(message);\n this.logger.info(\"Plan committed\", { taskId, taskTitle });\n return result;\n }\n\n async commitImplementation(\n taskId: string,\n taskTitle: string,\n planSummary?: string,\n ): Promise<string> {\n await this.runGitCommand(\"add .\");\n\n const hasChanges = await this.hasStagedChanges();\n if (!hasChanges) {\n this.logger.warn(\"No implementation changes to commit\", { taskId });\n return \"No changes to commit\";\n }\n\n let message = `✨ Implement task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent`;\n\n if (planSummary) {\n message += `\\n\\nPlan Summary:\\n${planSummary}`;\n }\n\n message += `\\n\\nThis commit implements the changes described in the task plan.`;\n\n const result = await this.commitChanges(message);\n this.logger.info(\"Implementation committed\", { taskId, taskTitle });\n return result;\n }\n\n async deleteBranch(\n branchName: string,\n force: boolean = false,\n ): Promise<void> {\n const forceFlag = force ? \"-D\" : \"-d\";\n await this.runGitCommand(`branch ${forceFlag} ${branchName}`);\n }\n\n async deleteRemoteBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`push origin --delete ${branchName}`);\n }\n\n async getBranchInfo(branchName: string): Promise<BranchInfo> {\n const exists = await this.branchExists(branchName);\n const currentBranch = await this.getCurrentBranch();\n\n return {\n name: branchName,\n exists,\n isCurrentBranch: branchName === currentBranch,\n };\n }\n\n async getCommitSha(ref: string = \"HEAD\"): Promise<string> {\n return await this.runGitCommand(`rev-parse ${ref}`);\n }\n\n async getCommitMessage(ref: string = \"HEAD\"): Promise<string> {\n return await this.runGitCommand(`log -1 --pretty=%B ${ref}`);\n }\n\n async createPullRequest(\n branchName: string,\n title: string,\n body: string,\n baseBranch?: string,\n ): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch !== branchName) {\n await this.ensureCleanWorkingDirectory(\"creating PR\");\n await this.switchToBranch(branchName);\n }\n\n await this.pushBranch(branchName);\n\n let command = `gh pr create --title \"${this.escapeShellArg(title)}\" --body \"${this.escapeShellArg(body)}\"`;\n\n if (baseBranch) {\n command += ` --base ${baseBranch}`;\n }\n\n try {\n const prUrl = await this.runCommand(command);\n return prUrl.trim();\n } catch (error) {\n throw new Error(`Failed to create PR: ${error}`);\n }\n }\n\n async getTaskBranch(taskSlug: string): Promise<string | null> {\n try {\n // Get all branches matching the task slug pattern\n const branches = await this.runGitCommand(\"branch --list --all\");\n const branchPattern = `posthog/task-${taskSlug}`;\n\n // Look for exact match or with counter suffix\n const lines = branches\n .split(\"\\n\")\n .map((l) => l.trim().replace(/^\\*\\s+/, \"\"));\n for (const line of lines) {\n const cleanBranch = line.replace(\"remotes/origin/\", \"\");\n if (cleanBranch.startsWith(branchPattern)) {\n return cleanBranch;\n }\n }\n\n return null;\n } catch (error) {\n this.logger.debug(\"Failed to get task branch\", { taskSlug, error });\n return null;\n }\n }\n\n async commitAndPush(\n message: string,\n options?: { allowEmpty?: boolean },\n ): Promise<void> {\n const hasChanges = await this.hasStagedChanges();\n\n if (!hasChanges && !options?.allowEmpty) {\n this.logger.debug(\"No changes to commit, skipping\");\n return;\n }\n\n const command = this.buildCommitCommand(message, options);\n await this.runGitCommand(command);\n\n // Push to origin\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n\n this.logger.info(\"Committed and pushed changes\", {\n branch: currentBranch,\n message,\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Task, TaskRun, LogEntry, PostHogAPIConfig, PostHogResource, UrlMention, TaskRunArtifact, TaskArtifactUploadPayload } from './types.js';
1
+ import type { LogEntry, PostHogAPIConfig, PostHogResource, Task, TaskArtifactUploadPayload, TaskRun, TaskRunArtifact, UrlMention } from "./types.js";
2
2
  export interface TaskRunUpdate {
3
3
  status?: TaskRun["status"];
4
4
  branch?: string | null;
@@ -9,7 +9,6 @@ export interface TaskRunUpdate {
9
9
  }
10
10
  export declare class PostHogAPIClient {
11
11
  private config;
12
- private _teamId;
13
12
  constructor(config: PostHogAPIConfig);
14
13
  private get baseUrl();
15
14
  private get headers();
@@ -27,7 +26,7 @@ export declare class PostHogAPIClient {
27
26
  updateTask(taskId: string, updates: Partial<Task>): Promise<Task>;
28
27
  listTaskRuns(taskId: string): Promise<TaskRun[]>;
29
28
  getTaskRun(taskId: string, runId: string): Promise<TaskRun>;
30
- createTaskRun(taskId: string, payload?: Partial<Omit<TaskRun, 'id' | 'task' | 'team' | 'created_at' | 'updated_at' | 'completed_at'>>): Promise<TaskRun>;
29
+ createTaskRun(taskId: string, payload?: Partial<Omit<TaskRun, "id" | "task" | "team" | "created_at" | "updated_at" | "completed_at">>): Promise<TaskRun>;
31
30
  updateTaskRun(taskId: string, runId: string, payload: TaskRunUpdate): Promise<TaskRun>;
32
31
  setTaskRunOutput(taskId: string, runId: string, output: Record<string, unknown>): Promise<TaskRun>;
33
32
  appendTaskRunLog(taskId: string, runId: string, entries: LogEntry[]): Promise<TaskRun>;
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-api.d.ts","sourceRoot":"","sources":["../../src/posthog-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"posthog-api.d.ts","sourceRoot":"","sources":["../../src/posthog-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,IAAI,EACJ,yBAAyB,EACzB,OAAO,EACP,eAAe,EACf,UAAU,EACX,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAIpC,OAAO,KAAK,OAAO,GAKlB;IAED,OAAO,KAAK,OAAO,GAKlB;YAEa,UAAU;IA4BxB,SAAS,IAAI,MAAM;IAInB,UAAU,IAAI,MAAM;IAIpB,SAAS,IAAI,MAAM;IAInB,gBAAgB,IAAI,MAAM;IAKpB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,SAAS,CAAC,OAAO,CAAC,EAAE;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAiBb,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASjE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQhD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3D,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,CACf,IAAI,CACF,OAAO,EACP,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,cAAc,CACtE,CACF,GACA,OAAO,CAAC,OAAO,CAAC;IAWb,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,OAAO,CAAC;IAWb,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAWb,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,EAAE,GAClB,OAAO,CAAC,OAAO,CAAC;IAWb,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,yBAAyB,EAAE,GACrC,OAAO,CAAC,eAAe,EAAE,CAAC;IAiB7B;;;;OAIG;IACG,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgC7D;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC;IA8B3B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;IAsC1E;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAsC3B"}