mindheal 1.0.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 (255) hide show
  1. package/.env.example +48 -0
  2. package/CHANGELOG.md +27 -0
  3. package/LICENSE +21 -0
  4. package/README.md +481 -0
  5. package/dist/cjs/ai/ai-provider.js +46 -0
  6. package/dist/cjs/ai/ai-provider.js.map +1 -0
  7. package/dist/cjs/ai/anthropic-provider.js +106 -0
  8. package/dist/cjs/ai/anthropic-provider.js.map +1 -0
  9. package/dist/cjs/ai/azure-openai-provider.js +130 -0
  10. package/dist/cjs/ai/azure-openai-provider.js.map +1 -0
  11. package/dist/cjs/ai/bedrock-provider.js +183 -0
  12. package/dist/cjs/ai/bedrock-provider.js.map +1 -0
  13. package/dist/cjs/ai/deepseek-provider.js +118 -0
  14. package/dist/cjs/ai/deepseek-provider.js.map +1 -0
  15. package/dist/cjs/ai/gemini-provider.js +129 -0
  16. package/dist/cjs/ai/gemini-provider.js.map +1 -0
  17. package/dist/cjs/ai/groq-provider.js +118 -0
  18. package/dist/cjs/ai/groq-provider.js.map +1 -0
  19. package/dist/cjs/ai/meta-provider.js +118 -0
  20. package/dist/cjs/ai/meta-provider.js.map +1 -0
  21. package/dist/cjs/ai/ollama-provider.js +127 -0
  22. package/dist/cjs/ai/ollama-provider.js.map +1 -0
  23. package/dist/cjs/ai/openai-provider.js +117 -0
  24. package/dist/cjs/ai/openai-provider.js.map +1 -0
  25. package/dist/cjs/ai/perplexity-provider.js +118 -0
  26. package/dist/cjs/ai/perplexity-provider.js.map +1 -0
  27. package/dist/cjs/ai/prompt-templates.js +174 -0
  28. package/dist/cjs/ai/prompt-templates.js.map +1 -0
  29. package/dist/cjs/ai/qwen-provider.js +118 -0
  30. package/dist/cjs/ai/qwen-provider.js.map +1 -0
  31. package/dist/cjs/analytics/healing-analytics.js +263 -0
  32. package/dist/cjs/analytics/healing-analytics.js.map +1 -0
  33. package/dist/cjs/cli/init.js +517 -0
  34. package/dist/cjs/cli/init.js.map +1 -0
  35. package/dist/cjs/config/config-loader.js +135 -0
  36. package/dist/cjs/config/config-loader.js.map +1 -0
  37. package/dist/cjs/config/defaults.js +109 -0
  38. package/dist/cjs/config/defaults.js.map +1 -0
  39. package/dist/cjs/core/dom-snapshot.js +280 -0
  40. package/dist/cjs/core/dom-snapshot.js.map +1 -0
  41. package/dist/cjs/core/enterprise-strategy.js +702 -0
  42. package/dist/cjs/core/enterprise-strategy.js.map +1 -0
  43. package/dist/cjs/core/healer.js +283 -0
  44. package/dist/cjs/core/healer.js.map +1 -0
  45. package/dist/cjs/core/interceptor.js +945 -0
  46. package/dist/cjs/core/interceptor.js.map +1 -0
  47. package/dist/cjs/core/locator-analyzer.js +172 -0
  48. package/dist/cjs/core/locator-analyzer.js.map +1 -0
  49. package/dist/cjs/core/locator-strategies.js +891 -0
  50. package/dist/cjs/core/locator-strategies.js.map +1 -0
  51. package/dist/cjs/core/self-heal-cache.js +178 -0
  52. package/dist/cjs/core/self-heal-cache.js.map +1 -0
  53. package/dist/cjs/core/smart-retry.js +248 -0
  54. package/dist/cjs/core/smart-retry.js.map +1 -0
  55. package/dist/cjs/core/visual-verification.js +262 -0
  56. package/dist/cjs/core/visual-verification.js.map +1 -0
  57. package/dist/cjs/git/code-modifier.js +184 -0
  58. package/dist/cjs/git/code-modifier.js.map +1 -0
  59. package/dist/cjs/git/git-operations.js +145 -0
  60. package/dist/cjs/git/git-operations.js.map +1 -0
  61. package/dist/cjs/git/pr-creator.js +190 -0
  62. package/dist/cjs/git/pr-creator.js.map +1 -0
  63. package/dist/cjs/index.js +97 -0
  64. package/dist/cjs/index.js.map +1 -0
  65. package/dist/cjs/rag/context-retriever.js +289 -0
  66. package/dist/cjs/rag/context-retriever.js.map +1 -0
  67. package/dist/cjs/rag/embeddings.js +82 -0
  68. package/dist/cjs/rag/embeddings.js.map +1 -0
  69. package/dist/cjs/rag/knowledge-store.js +159 -0
  70. package/dist/cjs/rag/knowledge-store.js.map +1 -0
  71. package/dist/cjs/reporters/heal-report.js +279 -0
  72. package/dist/cjs/reporters/heal-report.js.map +1 -0
  73. package/dist/cjs/reporters/heal-reporter.js +294 -0
  74. package/dist/cjs/reporters/heal-reporter.js.map +1 -0
  75. package/dist/cjs/server/review-server.js +166 -0
  76. package/dist/cjs/server/review-server.js.map +1 -0
  77. package/dist/cjs/server/routes.js +92 -0
  78. package/dist/cjs/server/routes.js.map +1 -0
  79. package/dist/cjs/utils/environment.js +57 -0
  80. package/dist/cjs/utils/environment.js.map +1 -0
  81. package/dist/cjs/utils/file-lock.js +136 -0
  82. package/dist/cjs/utils/file-lock.js.map +1 -0
  83. package/dist/cjs/utils/file-utils.js +49 -0
  84. package/dist/cjs/utils/file-utils.js.map +1 -0
  85. package/dist/cjs/utils/logger.js +78 -0
  86. package/dist/cjs/utils/logger.js.map +1 -0
  87. package/dist/esm/ai/ai-provider.js +44 -0
  88. package/dist/esm/ai/ai-provider.js.map +1 -0
  89. package/dist/esm/ai/anthropic-provider.js +104 -0
  90. package/dist/esm/ai/anthropic-provider.js.map +1 -0
  91. package/dist/esm/ai/azure-openai-provider.js +128 -0
  92. package/dist/esm/ai/azure-openai-provider.js.map +1 -0
  93. package/dist/esm/ai/bedrock-provider.js +181 -0
  94. package/dist/esm/ai/bedrock-provider.js.map +1 -0
  95. package/dist/esm/ai/deepseek-provider.js +116 -0
  96. package/dist/esm/ai/deepseek-provider.js.map +1 -0
  97. package/dist/esm/ai/gemini-provider.js +127 -0
  98. package/dist/esm/ai/gemini-provider.js.map +1 -0
  99. package/dist/esm/ai/groq-provider.js +116 -0
  100. package/dist/esm/ai/groq-provider.js.map +1 -0
  101. package/dist/esm/ai/meta-provider.js +116 -0
  102. package/dist/esm/ai/meta-provider.js.map +1 -0
  103. package/dist/esm/ai/ollama-provider.js +125 -0
  104. package/dist/esm/ai/ollama-provider.js.map +1 -0
  105. package/dist/esm/ai/openai-provider.js +115 -0
  106. package/dist/esm/ai/openai-provider.js.map +1 -0
  107. package/dist/esm/ai/perplexity-provider.js +116 -0
  108. package/dist/esm/ai/perplexity-provider.js.map +1 -0
  109. package/dist/esm/ai/prompt-templates.js +171 -0
  110. package/dist/esm/ai/prompt-templates.js.map +1 -0
  111. package/dist/esm/ai/qwen-provider.js +116 -0
  112. package/dist/esm/ai/qwen-provider.js.map +1 -0
  113. package/dist/esm/analytics/healing-analytics.js +261 -0
  114. package/dist/esm/analytics/healing-analytics.js.map +1 -0
  115. package/dist/esm/cli/init.js +495 -0
  116. package/dist/esm/cli/init.js.map +1 -0
  117. package/dist/esm/config/config-loader.js +132 -0
  118. package/dist/esm/config/config-loader.js.map +1 -0
  119. package/dist/esm/config/defaults.js +107 -0
  120. package/dist/esm/config/defaults.js.map +1 -0
  121. package/dist/esm/core/dom-snapshot.js +278 -0
  122. package/dist/esm/core/dom-snapshot.js.map +1 -0
  123. package/dist/esm/core/enterprise-strategy.js +695 -0
  124. package/dist/esm/core/enterprise-strategy.js.map +1 -0
  125. package/dist/esm/core/healer.js +281 -0
  126. package/dist/esm/core/healer.js.map +1 -0
  127. package/dist/esm/core/interceptor.js +940 -0
  128. package/dist/esm/core/interceptor.js.map +1 -0
  129. package/dist/esm/core/locator-analyzer.js +169 -0
  130. package/dist/esm/core/locator-analyzer.js.map +1 -0
  131. package/dist/esm/core/locator-strategies.js +882 -0
  132. package/dist/esm/core/locator-strategies.js.map +1 -0
  133. package/dist/esm/core/self-heal-cache.js +176 -0
  134. package/dist/esm/core/self-heal-cache.js.map +1 -0
  135. package/dist/esm/core/smart-retry.js +246 -0
  136. package/dist/esm/core/smart-retry.js.map +1 -0
  137. package/dist/esm/core/visual-verification.js +260 -0
  138. package/dist/esm/core/visual-verification.js.map +1 -0
  139. package/dist/esm/git/code-modifier.js +182 -0
  140. package/dist/esm/git/code-modifier.js.map +1 -0
  141. package/dist/esm/git/git-operations.js +143 -0
  142. package/dist/esm/git/git-operations.js.map +1 -0
  143. package/dist/esm/git/pr-creator.js +188 -0
  144. package/dist/esm/git/pr-creator.js.map +1 -0
  145. package/dist/esm/index.js +37 -0
  146. package/dist/esm/index.js.map +1 -0
  147. package/dist/esm/rag/context-retriever.js +287 -0
  148. package/dist/esm/rag/context-retriever.js.map +1 -0
  149. package/dist/esm/rag/embeddings.js +77 -0
  150. package/dist/esm/rag/embeddings.js.map +1 -0
  151. package/dist/esm/rag/knowledge-store.js +157 -0
  152. package/dist/esm/rag/knowledge-store.js.map +1 -0
  153. package/dist/esm/reporters/heal-report.js +277 -0
  154. package/dist/esm/reporters/heal-report.js.map +1 -0
  155. package/dist/esm/reporters/heal-reporter.js +290 -0
  156. package/dist/esm/reporters/heal-reporter.js.map +1 -0
  157. package/dist/esm/server/review-server.js +164 -0
  158. package/dist/esm/server/review-server.js.map +1 -0
  159. package/dist/esm/server/routes.js +90 -0
  160. package/dist/esm/server/routes.js.map +1 -0
  161. package/dist/esm/utils/environment.js +53 -0
  162. package/dist/esm/utils/environment.js.map +1 -0
  163. package/dist/esm/utils/file-lock.js +134 -0
  164. package/dist/esm/utils/file-lock.js.map +1 -0
  165. package/dist/esm/utils/file-utils.js +43 -0
  166. package/dist/esm/utils/file-utils.js.map +1 -0
  167. package/dist/esm/utils/logger.js +75 -0
  168. package/dist/esm/utils/logger.js.map +1 -0
  169. package/dist/types/ai/ai-provider.d.ts +4 -0
  170. package/dist/types/ai/ai-provider.d.ts.map +1 -0
  171. package/dist/types/ai/anthropic-provider.d.ts +11 -0
  172. package/dist/types/ai/anthropic-provider.d.ts.map +1 -0
  173. package/dist/types/ai/azure-openai-provider.d.ts +13 -0
  174. package/dist/types/ai/azure-openai-provider.d.ts.map +1 -0
  175. package/dist/types/ai/bedrock-provider.d.ts +14 -0
  176. package/dist/types/ai/bedrock-provider.d.ts.map +1 -0
  177. package/dist/types/ai/deepseek-provider.d.ts +12 -0
  178. package/dist/types/ai/deepseek-provider.d.ts.map +1 -0
  179. package/dist/types/ai/gemini-provider.d.ts +12 -0
  180. package/dist/types/ai/gemini-provider.d.ts.map +1 -0
  181. package/dist/types/ai/groq-provider.d.ts +12 -0
  182. package/dist/types/ai/groq-provider.d.ts.map +1 -0
  183. package/dist/types/ai/meta-provider.d.ts +12 -0
  184. package/dist/types/ai/meta-provider.d.ts.map +1 -0
  185. package/dist/types/ai/ollama-provider.d.ts +10 -0
  186. package/dist/types/ai/ollama-provider.d.ts.map +1 -0
  187. package/dist/types/ai/openai-provider.d.ts +11 -0
  188. package/dist/types/ai/openai-provider.d.ts.map +1 -0
  189. package/dist/types/ai/perplexity-provider.d.ts +12 -0
  190. package/dist/types/ai/perplexity-provider.d.ts.map +1 -0
  191. package/dist/types/ai/prompt-templates.d.ts +11 -0
  192. package/dist/types/ai/prompt-templates.d.ts.map +1 -0
  193. package/dist/types/ai/qwen-provider.d.ts +12 -0
  194. package/dist/types/ai/qwen-provider.d.ts.map +1 -0
  195. package/dist/types/analytics/healing-analytics.d.ts +36 -0
  196. package/dist/types/analytics/healing-analytics.d.ts.map +1 -0
  197. package/dist/types/cli/init.d.ts +15 -0
  198. package/dist/types/cli/init.d.ts.map +1 -0
  199. package/dist/types/config/config-loader.d.ts +4 -0
  200. package/dist/types/config/config-loader.d.ts.map +1 -0
  201. package/dist/types/config/defaults.d.ts +3 -0
  202. package/dist/types/config/defaults.d.ts.map +1 -0
  203. package/dist/types/core/dom-snapshot.d.ts +12 -0
  204. package/dist/types/core/dom-snapshot.d.ts.map +1 -0
  205. package/dist/types/core/enterprise-strategy.d.ts +56 -0
  206. package/dist/types/core/enterprise-strategy.d.ts.map +1 -0
  207. package/dist/types/core/healer.d.ts +52 -0
  208. package/dist/types/core/healer.d.ts.map +1 -0
  209. package/dist/types/core/interceptor.d.ts +64 -0
  210. package/dist/types/core/interceptor.d.ts.map +1 -0
  211. package/dist/types/core/locator-analyzer.d.ts +31 -0
  212. package/dist/types/core/locator-analyzer.d.ts.map +1 -0
  213. package/dist/types/core/locator-strategies.d.ts +45 -0
  214. package/dist/types/core/locator-strategies.d.ts.map +1 -0
  215. package/dist/types/core/self-heal-cache.d.ts +51 -0
  216. package/dist/types/core/self-heal-cache.d.ts.map +1 -0
  217. package/dist/types/core/smart-retry.d.ts +64 -0
  218. package/dist/types/core/smart-retry.d.ts.map +1 -0
  219. package/dist/types/core/visual-verification.d.ts +46 -0
  220. package/dist/types/core/visual-verification.d.ts.map +1 -0
  221. package/dist/types/git/code-modifier.d.ts +51 -0
  222. package/dist/types/git/code-modifier.d.ts.map +1 -0
  223. package/dist/types/git/git-operations.d.ts +40 -0
  224. package/dist/types/git/git-operations.d.ts.map +1 -0
  225. package/dist/types/git/pr-creator.d.ts +27 -0
  226. package/dist/types/git/pr-creator.d.ts.map +1 -0
  227. package/dist/types/index.d.ts +40 -0
  228. package/dist/types/index.d.ts.map +1 -0
  229. package/dist/types/rag/context-retriever.d.ts +69 -0
  230. package/dist/types/rag/context-retriever.d.ts.map +1 -0
  231. package/dist/types/rag/embeddings.d.ts +32 -0
  232. package/dist/types/rag/embeddings.d.ts.map +1 -0
  233. package/dist/types/rag/index.d.ts +12 -0
  234. package/dist/types/rag/index.d.ts.map +1 -0
  235. package/dist/types/rag/knowledge-store.d.ts +38 -0
  236. package/dist/types/rag/knowledge-store.d.ts.map +1 -0
  237. package/dist/types/reporters/heal-report.d.ts +29 -0
  238. package/dist/types/reporters/heal-report.d.ts.map +1 -0
  239. package/dist/types/reporters/heal-reporter.d.ts +49 -0
  240. package/dist/types/reporters/heal-reporter.d.ts.map +1 -0
  241. package/dist/types/server/review-server.d.ts +20 -0
  242. package/dist/types/server/review-server.d.ts.map +1 -0
  243. package/dist/types/server/routes.d.ts +4 -0
  244. package/dist/types/server/routes.d.ts.map +1 -0
  245. package/dist/types/types/index.d.ts +433 -0
  246. package/dist/types/types/index.d.ts.map +1 -0
  247. package/dist/types/utils/environment.d.ts +10 -0
  248. package/dist/types/utils/environment.d.ts.map +1 -0
  249. package/dist/types/utils/file-lock.d.ts +37 -0
  250. package/dist/types/utils/file-lock.d.ts.map +1 -0
  251. package/dist/types/utils/file-utils.d.ts +7 -0
  252. package/dist/types/utils/file-utils.d.ts.map +1 -0
  253. package/dist/types/utils/logger.d.ts +9 -0
  254. package/dist/types/utils/logger.d.ts.map +1 -0
  255. package/package.json +106 -0
@@ -0,0 +1,188 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { getRepoInfo } from '../utils/environment.js';
3
+
4
+ class PRCreator {
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ /**
9
+ * Create a pull/merge request on the configured provider.
10
+ */
11
+ async createPR(details) {
12
+ const repo = this.resolveRepo();
13
+ logger.info(`Creating PR on ${this.config.provider}: "${details.title}"`);
14
+ switch (this.config.provider) {
15
+ case 'github':
16
+ return this.createGitHubPR(repo, details);
17
+ case 'gitlab':
18
+ return this.createGitLabMR(repo, details);
19
+ case 'bitbucket':
20
+ return this.createBitbucketPR(repo, details);
21
+ default: {
22
+ const provider = this.config.provider;
23
+ throw new Error(`[MindHeal] Unsupported git provider: ${provider}`);
24
+ }
25
+ }
26
+ }
27
+ // ── Private helpers ──────────────────────────────────────────────────────────
28
+ /**
29
+ * Resolve the repository owner/name from config or by auto-detecting from
30
+ * the git remote URL.
31
+ */
32
+ resolveRepo() {
33
+ if (this.config.repoOwner && this.config.repoName) {
34
+ return { owner: this.config.repoOwner, name: this.config.repoName };
35
+ }
36
+ const detected = getRepoInfo();
37
+ if (detected) {
38
+ logger.debug('Auto-detected repo info from git remote', detected);
39
+ return detected;
40
+ }
41
+ throw new Error('[MindHeal] Unable to determine repository owner/name. ' +
42
+ 'Set repoOwner and repoName in the git config, or ensure a valid git remote exists.');
43
+ }
44
+ /**
45
+ * Format the PR body with a healing summary markdown table.
46
+ */
47
+ formatBody(rawBody) {
48
+ return [
49
+ '## MindHeal - Automated Locator Fix',
50
+ '',
51
+ rawBody,
52
+ '',
53
+ '---',
54
+ '*This PR was automatically generated by [MindHeal](https://github.com/nicholasgriffintn/mindheal).*',
55
+ ].join('\n');
56
+ }
57
+ // ── GitHub ────────────────────────────────────────────────────────────────────
58
+ async createGitHubPR(repo, details) {
59
+ const url = `https://api.github.com/repos/${repo.owner}/${repo.name}/pulls`;
60
+ const body = {
61
+ title: details.title,
62
+ body: this.formatBody(details.body),
63
+ head: details.sourceBranch,
64
+ base: details.targetBranch,
65
+ };
66
+ const response = await this.request(url, body, {
67
+ Authorization: `Bearer ${this.config.token}`,
68
+ Accept: 'application/vnd.github.v3+json',
69
+ });
70
+ const data = (await response.json());
71
+ if (!response.ok) {
72
+ const errorBody = JSON.stringify(data);
73
+ throw new Error(`[MindHeal] GitHub PR creation failed (${response.status}): ${errorBody}`);
74
+ }
75
+ const prResult = {
76
+ url: data.html_url,
77
+ number: data.number,
78
+ provider: 'github',
79
+ };
80
+ // Best-effort: add labels and reviewers
81
+ await this.addGitHubExtras(repo, prResult.number, details);
82
+ logger.info(`GitHub PR created: ${prResult.url}`);
83
+ return prResult;
84
+ }
85
+ /**
86
+ * Add labels and request reviewers on a GitHub PR (non-critical).
87
+ */
88
+ async addGitHubExtras(repo, prNumber, details) {
89
+ const base = `https://api.github.com/repos/${repo.owner}/${repo.name}`;
90
+ const headers = {
91
+ Authorization: `Bearer ${this.config.token}`,
92
+ Accept: 'application/vnd.github.v3+json',
93
+ };
94
+ // Labels
95
+ if (details.labels.length > 0) {
96
+ try {
97
+ await this.request(`${base}/issues/${prNumber}/labels`, { labels: details.labels }, headers);
98
+ }
99
+ catch (error) {
100
+ logger.warn('[MindHeal] Failed to add labels to PR', error);
101
+ }
102
+ }
103
+ // Reviewers
104
+ if (details.reviewers.length > 0) {
105
+ try {
106
+ await this.request(`${base}/pulls/${prNumber}/requested_reviewers`, { reviewers: details.reviewers }, headers);
107
+ }
108
+ catch (error) {
109
+ logger.warn('[MindHeal] Failed to request reviewers on PR', error);
110
+ }
111
+ }
112
+ }
113
+ // ── GitLab ────────────────────────────────────────────────────────────────────
114
+ async createGitLabMR(repo, details) {
115
+ const encodedPath = encodeURIComponent(`${repo.owner}/${repo.name}`);
116
+ const url = `https://gitlab.com/api/v4/projects/${encodedPath}/merge_requests`;
117
+ const body = {
118
+ title: details.title,
119
+ description: this.formatBody(details.body),
120
+ source_branch: details.sourceBranch,
121
+ target_branch: details.targetBranch,
122
+ labels: details.labels.join(','),
123
+ reviewer_ids: [], // GitLab uses numeric IDs; usernames not directly supported
124
+ };
125
+ const response = await this.request(url, body, {
126
+ 'PRIVATE-TOKEN': this.config.token,
127
+ });
128
+ const data = (await response.json());
129
+ if (!response.ok) {
130
+ const errorBody = JSON.stringify(data);
131
+ throw new Error(`[MindHeal] GitLab MR creation failed (${response.status}): ${errorBody}`);
132
+ }
133
+ const prResult = {
134
+ url: data.web_url,
135
+ number: data.iid,
136
+ provider: 'gitlab',
137
+ };
138
+ logger.info(`GitLab MR created: ${prResult.url}`);
139
+ return prResult;
140
+ }
141
+ // ── Bitbucket ─────────────────────────────────────────────────────────────────
142
+ async createBitbucketPR(repo, details) {
143
+ const url = `https://api.bitbucket.org/2.0/repositories/${repo.owner}/${repo.name}/pullrequests`;
144
+ const body = {
145
+ title: details.title,
146
+ description: this.formatBody(details.body),
147
+ source: { branch: { name: details.sourceBranch } },
148
+ destination: { branch: { name: details.targetBranch } },
149
+ reviewers: details.reviewers.map((username) => ({ username })),
150
+ close_source_branch: true,
151
+ };
152
+ const response = await this.request(url, body, {
153
+ Authorization: `Bearer ${this.config.token}`,
154
+ });
155
+ const data = (await response.json());
156
+ if (!response.ok) {
157
+ const errorBody = JSON.stringify(data);
158
+ throw new Error(`[MindHeal] Bitbucket PR creation failed (${response.status}): ${errorBody}`);
159
+ }
160
+ const prResult = {
161
+ url: data.links.html.href,
162
+ number: data.id,
163
+ provider: 'bitbucket',
164
+ };
165
+ logger.info(`Bitbucket PR created: ${prResult.url}`);
166
+ return prResult;
167
+ }
168
+ // ── HTTP helper ───────────────────────────────────────────────────────────────
169
+ async request(url, body, headers) {
170
+ try {
171
+ return await fetch(url, {
172
+ method: 'POST',
173
+ headers: {
174
+ 'Content-Type': 'application/json',
175
+ ...headers,
176
+ },
177
+ body: JSON.stringify(body),
178
+ });
179
+ }
180
+ catch (error) {
181
+ const message = error instanceof Error ? error.message : String(error);
182
+ throw new Error(`[MindHeal] HTTP request to ${url} failed: ${message}`);
183
+ }
184
+ }
185
+ }
186
+
187
+ export { PRCreator };
188
+ //# sourceMappingURL=pr-creator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-creator.js","sources":["../../../../src/git/pr-creator.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export { createMindHealFixture, getAllHealingSessions, mindHealConfig, autoTest as test } from './core/interceptor.js';
2
+ export { expect } from '@playwright/test';
3
+ export { Healer } from './core/healer.js';
4
+ export { createConfig, loadConfig } from './config/config-loader.js';
5
+ export { DEFAULT_CONFIG } from './config/defaults.js';
6
+ export { createAIProvider } from './ai/ai-provider.js';
7
+ export { AnthropicProvider } from './ai/anthropic-provider.js';
8
+ export { OpenAIProvider } from './ai/openai-provider.js';
9
+ export { AzureOpenAIProvider } from './ai/azure-openai-provider.js';
10
+ export { GeminiProvider } from './ai/gemini-provider.js';
11
+ export { OllamaProvider } from './ai/ollama-provider.js';
12
+ export { BedrockProvider } from './ai/bedrock-provider.js';
13
+ export { DeepSeekProvider } from './ai/deepseek-provider.js';
14
+ export { GroqProvider } from './ai/groq-provider.js';
15
+ export { QwenProvider } from './ai/qwen-provider.js';
16
+ export { MetaProvider } from './ai/meta-provider.js';
17
+ export { PerplexityProvider } from './ai/perplexity-provider.js';
18
+ export { GitOperations } from './git/git-operations.js';
19
+ export { PRCreator } from './git/pr-creator.js';
20
+ export { CodeModifier } from './git/code-modifier.js';
21
+ export { ReviewServer } from './server/review-server.js';
22
+ export { HealReportGenerator } from './reporters/heal-report.js';
23
+ export { SelfHealCache } from './core/self-heal-cache.js';
24
+ export { KnowledgeStore } from './rag/knowledge-store.js';
25
+ export { ContextRetriever } from './rag/context-retriever.js';
26
+ export { buildTermVector, cosineSimilarity, textSimilarity, tokenize } from './rag/embeddings.js';
27
+ export { HealingAnalytics } from './analytics/healing-analytics.js';
28
+ export { SmartRetry } from './core/smart-retry.js';
29
+ export { VisualVerifier } from './core/visual-verification.js';
30
+ export { FileLock } from './utils/file-lock.js';
31
+ export { configureLogger, logger } from './utils/logger.js';
32
+ export { detectGitProvider, getRepoInfo, isCI } from './utils/environment.js';
33
+ export { detectPlatform, enterpriseStrategy, extractStableIdPart, isDynamicId, scrollVirtualContainer, waitForEnterpriseLoad } from './core/enterprise-strategy.js';
34
+ export { captureDOMSnapshot } from './core/dom-snapshot.js';
35
+ export { analyzeLocator, getLocatorHash } from './core/locator-analyzer.js';
36
+ export { runStrategy } from './core/locator-strategies.js';
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,287 @@
1
+ import { logger } from '../utils/logger.js';
2
+
3
+ /**
4
+ * RAG Context Retriever — collects relevant context from all knowledge sources.
5
+ *
6
+ * Before the AI healing strategy runs, the retriever searches the knowledge store
7
+ * for entries that are relevant to the current broken locator. The returned
8
+ * context chunks are injected into the AI prompt so the model can make better
9
+ * decisions based on project-specific knowledge.
10
+ *
11
+ * Six knowledge sources are supported:
12
+ * 1. healing-history — previously healed locators for the same page/selector
13
+ * 2. page-objects — POM class metadata (selectors, method names, file paths)
14
+ * 3. git-changes — recent git diffs that may explain why a locator broke
15
+ * 4. dom-snapshots — historical DOM snapshots of the same page
16
+ * 5. component-docs — component library / design system documentation
17
+ * 6. test-specs — test file context (describe blocks, step descriptions)
18
+ */
19
+ class ContextRetriever {
20
+ constructor(config, store) {
21
+ this.config = config;
22
+ this.store = store;
23
+ }
24
+ /**
25
+ * Retrieve relevant context for a broken locator.
26
+ *
27
+ * Builds a search query from the locator info + page URL, queries the
28
+ * knowledge store, and returns ranked context chunks that meet the
29
+ * similarity threshold.
30
+ */
31
+ retrieve(originalLocator, pageUrl, action, errorMessage) {
32
+ if (!this.config.enabled) {
33
+ return [];
34
+ }
35
+ try {
36
+ // Build a rich query from the healing context
37
+ const query = this.buildQuery(originalLocator, pageUrl, action, errorMessage);
38
+ logger.debug(`[RAG] Searching knowledge store with query: "${query.slice(0, 120)}..."`);
39
+ const chunks = this.store.search(query, {
40
+ sources: this.config.sources.length > 0 ? this.config.sources : undefined,
41
+ maxResults: this.config.maxContextChunks,
42
+ similarityThreshold: this.config.similarityThreshold,
43
+ });
44
+ if (chunks.length > 0) {
45
+ logger.info(`[RAG] Retrieved ${chunks.length} context chunk(s) for healing`);
46
+ for (const chunk of chunks) {
47
+ logger.debug(`[RAG] - ${chunk.source} (score: ${chunk.relevanceScore.toFixed(3)})`);
48
+ }
49
+ }
50
+ else {
51
+ logger.debug('[RAG] No relevant context found in knowledge store');
52
+ }
53
+ return chunks;
54
+ }
55
+ catch (err) {
56
+ const msg = err instanceof Error ? err.message : String(err);
57
+ logger.warn(`[RAG] Context retrieval failed: ${msg}. Continuing without RAG context.`);
58
+ return [];
59
+ }
60
+ }
61
+ // ─── Knowledge Ingestion ──────────────────────────────────────────────────
62
+ /**
63
+ * Ingest a completed healing event into the knowledge store so future
64
+ * healings can learn from it.
65
+ */
66
+ ingestHealingEvent(event) {
67
+ if (!this.config.enabled)
68
+ return;
69
+ if (!this.config.sources.includes('healing-history'))
70
+ return;
71
+ try {
72
+ const content = [
73
+ `Page: ${event.pageUrl}`,
74
+ `Action: ${event.action}`,
75
+ `Original: ${event.originalLocator.playwrightExpression}`,
76
+ event.healedLocator
77
+ ? `Healed: ${event.healedLocator.playwrightExpression}`
78
+ : 'Healing failed',
79
+ `Strategy: ${event.strategy ?? 'none'}`,
80
+ `Confidence: ${event.confidence}`,
81
+ `Status: ${event.status}`,
82
+ ].join('\n');
83
+ this.store.upsert({
84
+ source: 'healing-history',
85
+ content,
86
+ tags: [
87
+ event.originalLocator.selector,
88
+ event.originalLocator.type,
89
+ event.pageUrl,
90
+ event.action,
91
+ ],
92
+ metadata: {
93
+ testFile: event.testFile,
94
+ testTitle: event.testTitle,
95
+ strategy: event.strategy ?? 'none',
96
+ status: event.status,
97
+ },
98
+ });
99
+ logger.debug(`[RAG] Ingested healing event: ${event.id}`);
100
+ }
101
+ catch (err) {
102
+ const msg = err instanceof Error ? err.message : String(err);
103
+ logger.warn(`[RAG] Failed to ingest healing event: ${msg}`);
104
+ }
105
+ }
106
+ /**
107
+ * Ingest page object metadata into the knowledge store.
108
+ * Call this when scanning page object files during initialization.
109
+ */
110
+ ingestPageObject(filePath, selectors, className) {
111
+ if (!this.config.enabled)
112
+ return;
113
+ if (!this.config.sources.includes('page-objects'))
114
+ return;
115
+ try {
116
+ const content = [
117
+ `Page Object: ${className}`,
118
+ `File: ${filePath}`,
119
+ `Selectors:`,
120
+ ...selectors.map((s) => ` - ${s}`),
121
+ ].join('\n');
122
+ this.store.upsert({
123
+ source: 'page-objects',
124
+ content,
125
+ tags: [className, filePath, ...selectors.slice(0, 10)],
126
+ metadata: {
127
+ className,
128
+ filePath,
129
+ selectorCount: String(selectors.length),
130
+ },
131
+ });
132
+ logger.debug(`[RAG] Ingested page object: ${className} (${selectors.length} selectors)`);
133
+ }
134
+ catch (err) {
135
+ const msg = err instanceof Error ? err.message : String(err);
136
+ logger.warn(`[RAG] Failed to ingest page object: ${msg}`);
137
+ }
138
+ }
139
+ /**
140
+ * Ingest git diff context into the knowledge store.
141
+ * Call this when a git change is detected that might affect locators.
142
+ */
143
+ ingestGitChange(filePath, diff, commitMessage) {
144
+ if (!this.config.enabled)
145
+ return;
146
+ if (!this.config.sources.includes('git-changes'))
147
+ return;
148
+ try {
149
+ const content = [
150
+ `File: ${filePath}`,
151
+ `Commit: ${commitMessage}`,
152
+ `Diff:`,
153
+ diff.slice(0, 2000), // Truncate large diffs
154
+ ].join('\n');
155
+ this.store.upsert({
156
+ source: 'git-changes',
157
+ content,
158
+ tags: [filePath, commitMessage.slice(0, 50)],
159
+ metadata: {
160
+ filePath,
161
+ commitMessage: commitMessage.slice(0, 200),
162
+ },
163
+ });
164
+ logger.debug(`[RAG] Ingested git change: ${filePath}`);
165
+ }
166
+ catch (err) {
167
+ const msg = err instanceof Error ? err.message : String(err);
168
+ logger.warn(`[RAG] Failed to ingest git change: ${msg}`);
169
+ }
170
+ }
171
+ /**
172
+ * Ingest a DOM snapshot into the knowledge store.
173
+ * Stores a condensed version for future reference.
174
+ */
175
+ ingestDOMSnapshot(pageUrl, html, title) {
176
+ if (!this.config.enabled)
177
+ return;
178
+ if (!this.config.sources.includes('dom-snapshots'))
179
+ return;
180
+ try {
181
+ const content = [
182
+ `Page: ${pageUrl}`,
183
+ `Title: ${title}`,
184
+ `DOM (condensed):`,
185
+ html.slice(0, 3000), // Store condensed version
186
+ ].join('\n');
187
+ this.store.upsert({
188
+ source: 'dom-snapshots',
189
+ content,
190
+ tags: [pageUrl, title],
191
+ metadata: {
192
+ pageUrl,
193
+ title,
194
+ snapshotSize: String(html.length),
195
+ },
196
+ });
197
+ logger.debug(`[RAG] Ingested DOM snapshot: ${pageUrl}`);
198
+ }
199
+ catch (err) {
200
+ const msg = err instanceof Error ? err.message : String(err);
201
+ logger.warn(`[RAG] Failed to ingest DOM snapshot: ${msg}`);
202
+ }
203
+ }
204
+ /**
205
+ * Ingest component/design-system documentation.
206
+ */
207
+ ingestComponentDoc(componentName, doc, filePath) {
208
+ if (!this.config.enabled)
209
+ return;
210
+ if (!this.config.sources.includes('component-docs'))
211
+ return;
212
+ try {
213
+ this.store.upsert({
214
+ source: 'component-docs',
215
+ content: doc.slice(0, 3000),
216
+ tags: [componentName, filePath],
217
+ metadata: {
218
+ componentName,
219
+ filePath,
220
+ },
221
+ });
222
+ logger.debug(`[RAG] Ingested component doc: ${componentName}`);
223
+ }
224
+ catch (err) {
225
+ const msg = err instanceof Error ? err.message : String(err);
226
+ logger.warn(`[RAG] Failed to ingest component doc: ${msg}`);
227
+ }
228
+ }
229
+ /**
230
+ * Ingest test spec context (describe blocks, test titles, step descriptions).
231
+ */
232
+ ingestTestSpec(testFile, testTitle, steps) {
233
+ if (!this.config.enabled)
234
+ return;
235
+ if (!this.config.sources.includes('test-specs'))
236
+ return;
237
+ try {
238
+ const content = [
239
+ `Test File: ${testFile}`,
240
+ `Test: ${testTitle}`,
241
+ `Steps:`,
242
+ ...steps.map((s, i) => ` ${i + 1}. ${s}`),
243
+ ].join('\n');
244
+ this.store.upsert({
245
+ source: 'test-specs',
246
+ content,
247
+ tags: [testFile, testTitle, ...steps.slice(0, 5)],
248
+ metadata: {
249
+ testFile,
250
+ testTitle,
251
+ stepCount: String(steps.length),
252
+ },
253
+ });
254
+ logger.debug(`[RAG] Ingested test spec: ${testTitle}`);
255
+ }
256
+ catch (err) {
257
+ const msg = err instanceof Error ? err.message : String(err);
258
+ logger.warn(`[RAG] Failed to ingest test spec: ${msg}`);
259
+ }
260
+ }
261
+ // ─── Helpers ──────────────────────────────────────────────────────────────
262
+ /**
263
+ * Build a rich search query from the healing context.
264
+ * Combines locator info, URL, action, and error for best TF-IDF matching.
265
+ */
266
+ buildQuery(locator, pageUrl, action, errorMessage) {
267
+ const parts = [
268
+ locator.selector,
269
+ locator.type,
270
+ locator.playwrightExpression,
271
+ pageUrl,
272
+ action,
273
+ // Include first line of error for context
274
+ errorMessage.split('\n')[0],
275
+ ];
276
+ return parts.filter(Boolean).join(' ');
277
+ }
278
+ /**
279
+ * Get the knowledge store instance (for direct access / testing).
280
+ */
281
+ getStore() {
282
+ return this.store;
283
+ }
284
+ }
285
+
286
+ export { ContextRetriever };
287
+ //# sourceMappingURL=context-retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-retriever.js","sources":["../../../../src/rag/context-retriever.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Lightweight text similarity engine for RAG retrieval.
3
+ *
4
+ * Uses TF-IDF-style term weighting with cosine similarity — no external
5
+ * embedding model or vector DB required. This is intentionally simple so
6
+ * MindHeal works offline (e.g. with Ollama) without any extra infrastructure.
7
+ *
8
+ * For large knowledge bases, consumers can swap in a real vector DB via the
9
+ * `ContextRetriever` interface.
10
+ */
11
+ // ─── Tokenization ────────────────────────────────────────────────────────────
12
+ /**
13
+ * Tokenizes text into lowercase alphanumeric terms, splitting on non-word
14
+ * characters. Also generates bigrams for better matching on locator patterns
15
+ * like "submit-btn" or "getByTestId".
16
+ */
17
+ function tokenize(text) {
18
+ const raw = text.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim().split(/\s+/).filter(Boolean);
19
+ // Add bigrams for compound terms
20
+ const bigrams = [];
21
+ for (let i = 0; i < raw.length - 1; i++) {
22
+ bigrams.push(`${raw[i]}_${raw[i + 1]}`);
23
+ }
24
+ return [...raw, ...bigrams];
25
+ }
26
+ /**
27
+ * Builds a term-frequency vector from a list of tokens.
28
+ */
29
+ function buildTermVector(tokens) {
30
+ const freq = new Map();
31
+ for (const token of tokens) {
32
+ freq.set(token, (freq.get(token) ?? 0) + 1);
33
+ }
34
+ // Normalize by document length
35
+ const len = tokens.length || 1;
36
+ for (const [term, count] of freq) {
37
+ freq.set(term, count / len);
38
+ }
39
+ return freq;
40
+ }
41
+ /**
42
+ * Computes cosine similarity between two term vectors.
43
+ * Returns a value between 0 (completely different) and 1 (identical).
44
+ */
45
+ function cosineSimilarity(a, b) {
46
+ let dotProduct = 0;
47
+ let normA = 0;
48
+ let normB = 0;
49
+ for (const [term, weightA] of a) {
50
+ normA += weightA * weightA;
51
+ const weightB = b.get(term) ?? 0;
52
+ dotProduct += weightA * weightB;
53
+ }
54
+ for (const [, weightB] of b) {
55
+ normB += weightB * weightB;
56
+ }
57
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
58
+ if (denominator === 0)
59
+ return 0;
60
+ return dotProduct / denominator;
61
+ }
62
+ /**
63
+ * Computes similarity between two text strings.
64
+ * Convenience wrapper over tokenize → buildTermVector → cosineSimilarity.
65
+ */
66
+ function textSimilarity(textA, textB) {
67
+ const tokensA = tokenize(textA);
68
+ const tokensB = tokenize(textB);
69
+ if (tokensA.length === 0 || tokensB.length === 0)
70
+ return 0;
71
+ const vecA = buildTermVector(tokensA);
72
+ const vecB = buildTermVector(tokensB);
73
+ return cosineSimilarity(vecA, vecB);
74
+ }
75
+
76
+ export { buildTermVector, cosineSimilarity, textSimilarity, tokenize };
77
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sources":["../../../../src/rag/embeddings.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;AASG;AAEH;AAEA;;;;AAIG;AACG,SAAU,QAAQ,CAAC,IAAY,EAAA;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;;IAG9F,MAAM,OAAO,GAAa,EAAE;AAC5B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACvC,QAAA,OAAO,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,CAAE,CAAC;IACzC;AAEA,IAAA,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;AAC7B;AAMA;;AAEG;AACG,SAAU,eAAe,CAAC,MAAgB,EAAA;AAC9C,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB;AACtC,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C;;AAGA,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,CAAC;IAC7B;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;;AAGG;AACG,SAAU,gBAAgB,CAAC,CAAa,EAAE,CAAa,EAAA;IAC3D,IAAI,UAAU,GAAG,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC;IACb,IAAI,KAAK,GAAG,CAAC;IAEb,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;AAC/B,QAAA,KAAK,IAAI,OAAO,GAAG,OAAO;QAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,QAAA,UAAU,IAAI,OAAO,GAAG,OAAO;IACjC;IAEA,KAAK,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE;AAC3B,QAAA,KAAK,IAAI,OAAO,GAAG,OAAO;IAC5B;AAEA,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACvD,IAAI,WAAW,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC;IAE/B,OAAO,UAAU,GAAG,WAAW;AACjC;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,KAAa,EAAE,KAAa,EAAA;AACzD,IAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC/B,IAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC;AAE1D,IAAA,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC;AACrC,IAAA,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC;AAErC,IAAA,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC;AACrC;;;;"}