@ariso-ai/ivan 1.0.4 → 1.0.6

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 (145) hide show
  1. package/README.md +7 -21
  2. package/dist/config.d.ts +14 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +245 -4
  5. package/dist/config.js.map +1 -1
  6. package/dist/database/migrations/009_create_memory_tables.d.ts +3 -0
  7. package/dist/database/migrations/009_create_memory_tables.d.ts.map +1 -0
  8. package/dist/database/migrations/009_create_memory_tables.js +35 -0
  9. package/dist/database/migrations/009_create_memory_tables.js.map +1 -0
  10. package/dist/database/migrations/{006_add_comment_url_and_commit_to_tasks.d.ts → 009_create_repository_table.d.ts} +1 -1
  11. package/dist/database/migrations/009_create_repository_table.d.ts.map +1 -0
  12. package/dist/database/migrations/009_create_repository_table.js +15 -0
  13. package/dist/database/migrations/009_create_repository_table.js.map +1 -0
  14. package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.d.ts +3 -0
  15. package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.d.ts.map +1 -0
  16. package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.js +13 -0
  17. package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.js.map +1 -0
  18. package/dist/database/migrations/011_create_learnings_table.d.ts +3 -0
  19. package/dist/database/migrations/011_create_learnings_table.d.ts.map +1 -0
  20. package/dist/database/migrations/011_create_learnings_table.js +16 -0
  21. package/dist/database/migrations/011_create_learnings_table.js.map +1 -0
  22. package/dist/database/migrations/012_create_learning_embeddings_table.d.ts +3 -0
  23. package/dist/database/migrations/012_create_learning_embeddings_table.d.ts.map +1 -0
  24. package/dist/database/migrations/012_create_learning_embeddings_table.js +13 -0
  25. package/dist/database/migrations/012_create_learning_embeddings_table.js.map +1 -0
  26. package/dist/database/migrations/index.d.ts.map +1 -1
  27. package/dist/database/migrations/index.js +5 -1
  28. package/dist/database/migrations/index.js.map +1 -1
  29. package/dist/database/types.d.ts +11 -0
  30. package/dist/database/types.d.ts.map +1 -1
  31. package/dist/index.js +12 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/services/address-executor.d.ts.map +1 -1
  34. package/dist/services/address-executor.js +8 -21
  35. package/dist/services/address-executor.js.map +1 -1
  36. package/dist/services/address-task-executor.d.ts.map +1 -1
  37. package/dist/services/address-task-executor.js +10 -9
  38. package/dist/services/address-task-executor.js.map +1 -1
  39. package/dist/services/embedding-service.d.ts +12 -0
  40. package/dist/services/embedding-service.d.ts.map +1 -0
  41. package/dist/services/embedding-service.js +51 -0
  42. package/dist/services/embedding-service.js.map +1 -0
  43. package/dist/services/git-interfaces.d.ts +67 -0
  44. package/dist/services/git-interfaces.d.ts.map +1 -0
  45. package/dist/services/git-interfaces.js +2 -0
  46. package/dist/services/git-interfaces.js.map +1 -0
  47. package/dist/services/git-manager-cli.d.ts +33 -0
  48. package/dist/services/git-manager-cli.d.ts.map +1 -0
  49. package/dist/services/git-manager-cli.js +734 -0
  50. package/dist/services/git-manager-cli.js.map +1 -0
  51. package/dist/services/git-manager-pat.d.ts +36 -0
  52. package/dist/services/git-manager-pat.d.ts.map +1 -0
  53. package/dist/services/git-manager-pat.js +667 -0
  54. package/dist/services/git-manager-pat.js.map +1 -0
  55. package/dist/services/git-manager.d.ts +1 -0
  56. package/dist/services/git-manager.d.ts.map +1 -1
  57. package/dist/services/git-manager.js +10 -4
  58. package/dist/services/git-manager.js.map +1 -1
  59. package/dist/services/github-api-client.d.ts +115 -0
  60. package/dist/services/github-api-client.d.ts.map +1 -0
  61. package/dist/services/github-api-client.js +256 -0
  62. package/dist/services/github-api-client.js.map +1 -0
  63. package/dist/services/index.d.ts +9 -2
  64. package/dist/services/index.d.ts.map +1 -1
  65. package/dist/services/index.js +12 -2
  66. package/dist/services/index.js.map +1 -1
  67. package/dist/services/job-manager.d.ts +3 -4
  68. package/dist/services/job-manager.d.ts.map +1 -1
  69. package/dist/services/job-manager.js +14 -19
  70. package/dist/services/job-manager.js.map +1 -1
  71. package/dist/services/learn-executor.d.ts +13 -0
  72. package/dist/services/learn-executor.d.ts.map +1 -0
  73. package/dist/services/learn-executor.js +293 -0
  74. package/dist/services/learn-executor.js.map +1 -0
  75. package/dist/services/learning-service.d.ts +30 -0
  76. package/dist/services/learning-service.d.ts.map +1 -0
  77. package/dist/services/learning-service.js +88 -0
  78. package/dist/services/learning-service.js.map +1 -0
  79. package/dist/services/memory-service.d.ts +26 -0
  80. package/dist/services/memory-service.d.ts.map +1 -0
  81. package/dist/services/memory-service.js +128 -0
  82. package/dist/services/memory-service.js.map +1 -0
  83. package/dist/services/pr-service-cli.d.ts +12 -0
  84. package/dist/services/pr-service-cli.d.ts.map +1 -0
  85. package/dist/services/pr-service-cli.js +291 -0
  86. package/dist/services/pr-service-cli.js.map +1 -0
  87. package/dist/services/pr-service-pat.d.ts +15 -0
  88. package/dist/services/pr-service-pat.d.ts.map +1 -0
  89. package/dist/services/pr-service-pat.js +255 -0
  90. package/dist/services/pr-service-pat.js.map +1 -0
  91. package/dist/services/repository-manager-cli.d.ts +17 -0
  92. package/dist/services/repository-manager-cli.d.ts.map +1 -0
  93. package/dist/services/repository-manager-cli.js +148 -0
  94. package/dist/services/repository-manager-cli.js.map +1 -0
  95. package/dist/services/repository-manager-pat.d.ts +17 -0
  96. package/dist/services/repository-manager-pat.d.ts.map +1 -0
  97. package/dist/services/repository-manager-pat.js +148 -0
  98. package/dist/services/repository-manager-pat.js.map +1 -0
  99. package/dist/services/repository-manager.d.ts +7 -0
  100. package/dist/services/repository-manager.d.ts.map +1 -1
  101. package/dist/services/repository-manager.js +47 -0
  102. package/dist/services/repository-manager.js.map +1 -1
  103. package/dist/services/service-factory.d.ts +27 -0
  104. package/dist/services/service-factory.d.ts.map +1 -0
  105. package/dist/services/service-factory.js +79 -0
  106. package/dist/services/service-factory.js.map +1 -0
  107. package/dist/services/task-executor.d.ts.map +1 -1
  108. package/dist/services/task-executor.js +42 -75
  109. package/dist/services/task-executor.js.map +1 -1
  110. package/package.json +2 -2
  111. package/dist/agent.d.ts +0 -11
  112. package/dist/agent.d.ts.map +0 -1
  113. package/dist/agent.js +0 -48
  114. package/dist/agent.js.map +0 -1
  115. package/dist/config/config.d.ts +0 -20
  116. package/dist/config/config.d.ts.map +0 -1
  117. package/dist/config/config.js +0 -187
  118. package/dist/config/config.js.map +0 -1
  119. package/dist/database/database.d.ts +0 -12
  120. package/dist/database/database.d.ts.map +0 -1
  121. package/dist/database/database.js +0 -45
  122. package/dist/database/database.js.map +0 -1
  123. package/dist/database/migrations/001_initial_schema.d.ts +0 -3
  124. package/dist/database/migrations/001_initial_schema.d.ts.map +0 -1
  125. package/dist/database/migrations/001_initial_schema.js +0 -66
  126. package/dist/database/migrations/001_initial_schema.js.map +0 -1
  127. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts.map +0 -1
  128. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js +0 -15
  129. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js.map +0 -1
  130. package/dist/scripts/task-executor.d.ts +0 -3
  131. package/dist/scripts/task-executor.d.ts.map +0 -1
  132. package/dist/scripts/task-executor.js +0 -139
  133. package/dist/scripts/task-executor.js.map +0 -1
  134. package/dist/scripts/task-planner.d.ts +0 -3
  135. package/dist/scripts/task-planner.d.ts.map +0 -1
  136. package/dist/scripts/task-planner.js +0 -81
  137. package/dist/scripts/task-planner.js.map +0 -1
  138. package/dist/services/claude-planner.d.ts +0 -15
  139. package/dist/services/claude-planner.d.ts.map +0 -1
  140. package/dist/services/claude-planner.js +0 -107
  141. package/dist/services/claude-planner.js.map +0 -1
  142. package/dist/services/docker-orchestrator.d.ts +0 -11
  143. package/dist/services/docker-orchestrator.d.ts.map +0 -1
  144. package/dist/services/docker-orchestrator.js +0 -85
  145. package/dist/services/docker-orchestrator.js.map +0 -1
@@ -0,0 +1,255 @@
1
+ import { execSync } from 'child_process';
2
+ import chalk from 'chalk';
3
+ import { GitHubAPIClient } from './github-api-client.js';
4
+ export class PRServicePAT {
5
+ workingDir;
6
+ githubClient;
7
+ owner;
8
+ repo;
9
+ constructor(workingDir, pat) {
10
+ this.workingDir = workingDir;
11
+ this.githubClient = new GitHubAPIClient(pat);
12
+ // Get repository info from git remote
13
+ const repoInfo = GitHubAPIClient.getRepoInfoFromRemote(workingDir);
14
+ this.owner = repoInfo.owner;
15
+ this.repo = repoInfo.repo;
16
+ }
17
+ async getSpecificPRWithIssues(prNumber) {
18
+ try {
19
+ // Get specific PR
20
+ const pr = await this.githubClient.getPR(this.owner, this.repo, prNumber);
21
+ // Check if PR is open
22
+ // GitHub REST API returns lowercase state: "open", "closed", or "merged"
23
+ if (pr.state.toUpperCase() !== 'OPEN') {
24
+ console.log(chalk.yellow(`⚠️ PR #${prNumber} is not open (status: ${pr.state})`));
25
+ return [];
26
+ }
27
+ const pullRequest = {
28
+ number: pr.number,
29
+ title: pr.title,
30
+ branch: pr.headRefName,
31
+ url: pr.url,
32
+ hasUnaddressedComments: false,
33
+ hasFailingChecks: false,
34
+ unaddressedComments: [],
35
+ failingChecks: [],
36
+ hasTestOrLintFailures: false,
37
+ testOrLintFailures: []
38
+ };
39
+ // Check for unaddressed comments
40
+ const comments = await this.getUnaddressedComments(pr.number);
41
+ if (comments.length > 0) {
42
+ pullRequest.hasUnaddressedComments = true;
43
+ pullRequest.unaddressedComments = comments;
44
+ }
45
+ // Check for failing checks
46
+ const { allFailures, testOrLintFailures } = await this.getFailingChecks(pr.number);
47
+ if (allFailures.length > 0) {
48
+ pullRequest.hasFailingChecks = true;
49
+ pullRequest.failingChecks = allFailures;
50
+ }
51
+ if (testOrLintFailures.length > 0) {
52
+ pullRequest.hasTestOrLintFailures = true;
53
+ pullRequest.testOrLintFailures = testOrLintFailures;
54
+ }
55
+ // Only include PR if it has issues
56
+ if (pullRequest.hasUnaddressedComments || pullRequest.hasFailingChecks) {
57
+ return [pullRequest];
58
+ }
59
+ return [];
60
+ }
61
+ catch (error) {
62
+ const errorMessage = error instanceof Error ? error.message : String(error);
63
+ if (errorMessage.includes('no pull requests found') || errorMessage.includes('404')) {
64
+ console.error(chalk.red(`❌ PR #${prNumber} not found`));
65
+ }
66
+ else {
67
+ console.error(chalk.red(`Error fetching PR #${prNumber}:`), error);
68
+ }
69
+ throw error;
70
+ }
71
+ }
72
+ async getOpenPRsWithIssues(fromUser) {
73
+ try {
74
+ // Get all open PRs, optionally filtered by author
75
+ const prs = await this.githubClient.listPRs(this.owner, this.repo, {
76
+ state: 'open',
77
+ author: fromUser
78
+ });
79
+ const pullRequests = [];
80
+ for (const pr of prs) {
81
+ const pullRequest = {
82
+ number: pr.number,
83
+ title: pr.title,
84
+ branch: pr.headRefName,
85
+ url: pr.url,
86
+ hasUnaddressedComments: false,
87
+ hasFailingChecks: false,
88
+ unaddressedComments: [],
89
+ failingChecks: [],
90
+ hasTestOrLintFailures: false,
91
+ testOrLintFailures: []
92
+ };
93
+ // Check for unaddressed comments
94
+ const comments = await this.getUnaddressedComments(pr.number);
95
+ if (comments.length > 0) {
96
+ pullRequest.hasUnaddressedComments = true;
97
+ pullRequest.unaddressedComments = comments;
98
+ }
99
+ // Check for failing checks
100
+ const { allFailures, testOrLintFailures } = await this.getFailingChecks(pr.number);
101
+ if (allFailures.length > 0) {
102
+ pullRequest.hasFailingChecks = true;
103
+ pullRequest.failingChecks = allFailures;
104
+ }
105
+ if (testOrLintFailures.length > 0) {
106
+ pullRequest.hasTestOrLintFailures = true;
107
+ pullRequest.testOrLintFailures = testOrLintFailures;
108
+ }
109
+ // Only include PRs that have issues
110
+ if (pullRequest.hasUnaddressedComments || pullRequest.hasFailingChecks) {
111
+ pullRequests.push(pullRequest);
112
+ }
113
+ }
114
+ return pullRequests;
115
+ }
116
+ catch (error) {
117
+ console.error(chalk.red('Error fetching PRs:'), error);
118
+ throw error;
119
+ }
120
+ }
121
+ async getUnaddressedComments(prNumber) {
122
+ try {
123
+ // Get review threads using GraphQL
124
+ const threads = await this.githubClient.getReviewThreads(this.owner, this.repo, prNumber);
125
+ const unaddressedComments = [];
126
+ // Process each thread
127
+ for (const thread of threads) {
128
+ // Skip resolved threads
129
+ if (thread.isResolved) {
130
+ continue;
131
+ }
132
+ const comments = thread.comments?.nodes || [];
133
+ if (comments.length === 0) {
134
+ continue;
135
+ }
136
+ // Get the first comment (the main review comment)
137
+ const firstComment = comments[0];
138
+ // Check if there are replies (more than one comment in thread)
139
+ const hasReplies = comments.length > 1;
140
+ if (!hasReplies && firstComment.path) {
141
+ // Only include if it's an inline code comment (has a path) and has no replies
142
+ unaddressedComments.push({
143
+ id: firstComment.databaseId ? firstComment.databaseId.toString() : firstComment.id,
144
+ author: firstComment.author.login,
145
+ body: firstComment.body,
146
+ createdAt: firstComment.createdAt,
147
+ path: firstComment.path,
148
+ line: firstComment.line
149
+ });
150
+ }
151
+ }
152
+ return unaddressedComments;
153
+ }
154
+ catch {
155
+ // If there's an error fetching comments, return empty array
156
+ return [];
157
+ }
158
+ }
159
+ async getFailingChecks(prNumber) {
160
+ try {
161
+ const checks = await this.githubClient.getPRChecks(this.owner, this.repo, prNumber);
162
+ const failingChecks = [];
163
+ const testOrLintFailures = [];
164
+ for (const check of checks) {
165
+ if (check.state === 'FAILURE' || check.state === 'ERROR') {
166
+ failingChecks.push(check.name);
167
+ // Check if this is a test or lint failure
168
+ const checkNameLower = check.name.toLowerCase();
169
+ if (checkNameLower.includes('test') ||
170
+ checkNameLower.includes('lint') ||
171
+ checkNameLower.includes('eslint') ||
172
+ checkNameLower.includes('prettier') ||
173
+ checkNameLower.includes('jest') ||
174
+ checkNameLower.includes('mocha') ||
175
+ checkNameLower.includes('pytest') ||
176
+ checkNameLower.includes('ruff') ||
177
+ checkNameLower.includes('black') ||
178
+ checkNameLower.includes('flake8') ||
179
+ checkNameLower.includes('mypy') ||
180
+ checkNameLower.includes('typecheck') ||
181
+ checkNameLower.includes('type-check') ||
182
+ checkNameLower.includes('tsc') ||
183
+ checkNameLower.includes('clippy') ||
184
+ checkNameLower.includes('rustfmt')) {
185
+ testOrLintFailures.push(check.name);
186
+ }
187
+ }
188
+ }
189
+ return { allFailures: failingChecks, testOrLintFailures };
190
+ }
191
+ catch {
192
+ // If there's an error fetching checks, return empty arrays
193
+ return { allFailures: [], testOrLintFailures: [] };
194
+ }
195
+ }
196
+ async checkoutPRBranch(prNumber) {
197
+ // For PAT implementation, we need to fetch the PR branch and check it out manually
198
+ try {
199
+ const pr = await this.githubClient.getPR(this.owner, this.repo, prNumber);
200
+ const branchName = pr.headRefName;
201
+ // Fetch the PR branch
202
+ execSync(`git fetch origin ${branchName}:${branchName}`, {
203
+ cwd: this.workingDir,
204
+ stdio: 'inherit'
205
+ });
206
+ // Checkout the branch
207
+ execSync(`git checkout ${branchName}`, {
208
+ cwd: this.workingDir,
209
+ stdio: 'inherit'
210
+ });
211
+ }
212
+ catch (error) {
213
+ throw new Error(`Failed to checkout PR branch: ${error}`);
214
+ }
215
+ }
216
+ async getFailingActionLogs(prNumber) {
217
+ try {
218
+ const checks = await this.githubClient.getPRChecks(this.owner, this.repo, prNumber);
219
+ let failingLogs = '';
220
+ for (const check of checks) {
221
+ if (check.state === 'FAILURE' || check.state === 'ERROR') {
222
+ // Extract run ID from the link
223
+ const runIdMatch = check.link?.match(/\/runs\/(\d+)/);
224
+ if (runIdMatch) {
225
+ const runId = parseInt(runIdMatch[1], 10);
226
+ try {
227
+ // Get the failed logs for this run
228
+ const logs = await this.githubClient.getWorkflowRunLogs(this.owner, this.repo, runId);
229
+ if (logs) {
230
+ failingLogs += `\n\n=== Failed logs for ${check.name} ===\n`;
231
+ // Truncate logs if too large (keep last 5000 chars per check)
232
+ if (logs.length > 5000) {
233
+ failingLogs += '... (truncated) ...\n';
234
+ failingLogs += logs.substring(logs.length - 5000);
235
+ }
236
+ else {
237
+ failingLogs += logs;
238
+ }
239
+ }
240
+ }
241
+ catch (error) {
242
+ console.error(`Failed to get logs for run ${runId}:`, error);
243
+ }
244
+ }
245
+ }
246
+ }
247
+ return failingLogs;
248
+ }
249
+ catch (error) {
250
+ console.error('Error fetching action logs:', error);
251
+ return '';
252
+ }
253
+ }
254
+ }
255
+ //# sourceMappingURL=pr-service-pat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-service-pat.js","sourceRoot":"","sources":["../../src/services/pr-service-pat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Selectable } from 'kysely';
2
+ import { Repository } from '../database.js';
3
+ import type { IRepositoryManager, RepositoryInfo } from './git-interfaces.js';
4
+ export declare class RepositoryManagerCLI implements IRepositoryManager {
5
+ private dbManager;
6
+ constructor();
7
+ getValidWorkingDirectory(): Promise<string>;
8
+ private isGitRepository;
9
+ private isIvanRepository;
10
+ private isValidTargetRepository;
11
+ private promptForRepositoryPath;
12
+ getRepositoryInfo(workingDir: string): RepositoryInfo;
13
+ private getRemoteUrl;
14
+ getOrCreateRepository(workingDir: string): Promise<Selectable<Repository>>;
15
+ close(): void;
16
+ }
17
+ //# sourceMappingURL=repository-manager-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-manager-cli.d.ts","sourceRoot":"","sources":["../../src/services/repository-manager-cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAmB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9E,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,SAAS,CAAkB;;IAK7B,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBjD,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,uBAAuB;YAIjB,uBAAuB;IA8CrC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc;IAcrD,OAAO,CAAC,YAAY;IAYd,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAkChF,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,148 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import inquirer from 'inquirer';
5
+ import chalk from 'chalk';
6
+ import { DatabaseManager } from '../database.js';
7
+ export class RepositoryManagerCLI {
8
+ dbManager;
9
+ constructor() {
10
+ this.dbManager = new DatabaseManager();
11
+ }
12
+ async getValidWorkingDirectory() {
13
+ const currentDir = process.cwd();
14
+ if (this.isValidTargetRepository(currentDir)) {
15
+ return currentDir;
16
+ }
17
+ console.log(chalk.yellow('⚠️ Current directory is not a valid target repository'));
18
+ if (!this.isGitRepository(currentDir)) {
19
+ console.log(chalk.red('❌ Not a git repository'));
20
+ }
21
+ else if (this.isIvanRepository(currentDir)) {
22
+ console.log(chalk.red('❌ Cannot run Ivan on itself'));
23
+ }
24
+ return await this.promptForRepositoryPath();
25
+ }
26
+ isGitRepository(dir) {
27
+ try {
28
+ execSync('git rev-parse --git-dir', {
29
+ cwd: dir,
30
+ stdio: 'ignore'
31
+ });
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ isIvanRepository(dir) {
39
+ try {
40
+ const packageJsonPath = path.join(dir, 'package.json');
41
+ if (!fs.existsSync(packageJsonPath)) {
42
+ return false;
43
+ }
44
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
45
+ return packageJson.name === '@ariso-ai/ivan' || packageJson.name === 'ivan';
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ isValidTargetRepository(dir) {
52
+ return this.isGitRepository(dir) && !this.isIvanRepository(dir);
53
+ }
54
+ async promptForRepositoryPath() {
55
+ console.log('');
56
+ console.log(chalk.blue('📁 Please specify the repository where Ivan should work'));
57
+ while (true) {
58
+ const { repositoryPath } = await inquirer.prompt([
59
+ {
60
+ type: 'input',
61
+ name: 'repositoryPath',
62
+ message: 'Enter the path to your target repository:',
63
+ validate: (input) => {
64
+ if (!input || input.trim().length === 0) {
65
+ return 'Please enter a valid path';
66
+ }
67
+ return true;
68
+ }
69
+ }
70
+ ]);
71
+ const fullPath = path.resolve(repositoryPath.trim());
72
+ if (!fs.existsSync(fullPath)) {
73
+ console.log(chalk.red('❌ Path does not exist'));
74
+ continue;
75
+ }
76
+ if (!fs.statSync(fullPath).isDirectory()) {
77
+ console.log(chalk.red('❌ Path is not a directory'));
78
+ continue;
79
+ }
80
+ if (!this.isGitRepository(fullPath)) {
81
+ console.log(chalk.red('❌ Path is not a git repository'));
82
+ continue;
83
+ }
84
+ if (this.isIvanRepository(fullPath)) {
85
+ console.log(chalk.red('❌ Cannot run Ivan on itself'));
86
+ continue;
87
+ }
88
+ console.log(chalk.green(`✅ Using repository: ${fullPath}`));
89
+ return fullPath;
90
+ }
91
+ }
92
+ getRepositoryInfo(workingDir) {
93
+ try {
94
+ const repoName = path.basename(workingDir);
95
+ const branch = execSync('git branch --show-current', {
96
+ cwd: workingDir,
97
+ encoding: 'utf8'
98
+ }).trim();
99
+ return { name: repoName, branch };
100
+ }
101
+ catch {
102
+ return { name: path.basename(workingDir), branch: 'unknown' };
103
+ }
104
+ }
105
+ getRemoteUrl(workingDir) {
106
+ try {
107
+ const remoteUrl = execSync('git config --get remote.origin.url', {
108
+ cwd: workingDir,
109
+ encoding: 'utf8'
110
+ }).trim();
111
+ return remoteUrl || null;
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ async getOrCreateRepository(workingDir) {
118
+ const db = this.dbManager.getKysely();
119
+ // Check if repository exists
120
+ const existingRepo = await db
121
+ .selectFrom('repositories')
122
+ .selectAll()
123
+ .where('directory', '=', workingDir)
124
+ .executeTakeFirst();
125
+ if (existingRepo) {
126
+ return existingRepo;
127
+ }
128
+ // Create new repository
129
+ const { name } = this.getRepositoryInfo(workingDir);
130
+ const remoteUrl = this.getRemoteUrl(workingDir);
131
+ await db.insertInto('repositories').values({
132
+ remote_url: remoteUrl,
133
+ directory: workingDir,
134
+ name
135
+ }).execute();
136
+ // Fetch the created repository with its id
137
+ const createdRepo = await db
138
+ .selectFrom('repositories')
139
+ .selectAll()
140
+ .where('directory', '=', workingDir)
141
+ .executeTakeFirstOrThrow();
142
+ return createdRepo;
143
+ }
144
+ close() {
145
+ this.dbManager.close();
146
+ }
147
+ }
148
+ //# sourceMappingURL=repository-manager-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-manager-cli.js","sourceRoot":"","sources":["../../src/services/repository-manager-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Selectable } from 'kysely';
2
+ import { Repository } from '../database.js';
3
+ import { IRepositoryManager, RepositoryInfo } from './git-interfaces.js';
4
+ export declare class RepositoryManagerPAT implements IRepositoryManager {
5
+ private dbManager;
6
+ constructor();
7
+ getValidWorkingDirectory(): Promise<string>;
8
+ private isGitRepository;
9
+ private isIvanRepository;
10
+ private isValidTargetRepository;
11
+ private promptForRepositoryPath;
12
+ getRepositoryInfo(workingDir: string): RepositoryInfo;
13
+ private getRemoteUrl;
14
+ getOrCreateRepository(workingDir: string): Promise<Selectable<Repository>>;
15
+ close(): void;
16
+ }
17
+ //# sourceMappingURL=repository-manager-pat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-manager-pat.d.ts","sourceRoot":"","sources":["../../src/services/repository-manager-pat.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAmB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEzE,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,SAAS,CAAkB;;IAM7B,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBjD,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,uBAAuB;YAIjB,uBAAuB;IA8CrC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc;IAcrD,OAAO,CAAC,YAAY;IAYd,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAkChF,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,148 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import inquirer from 'inquirer';
5
+ import chalk from 'chalk';
6
+ import { DatabaseManager } from '../database.js';
7
+ export class RepositoryManagerPAT {
8
+ dbManager;
9
+ constructor() {
10
+ this.dbManager = new DatabaseManager();
11
+ }
12
+ async getValidWorkingDirectory() {
13
+ const currentDir = process.cwd();
14
+ if (this.isValidTargetRepository(currentDir)) {
15
+ return currentDir;
16
+ }
17
+ console.log(chalk.yellow('⚠️ Current directory is not a valid target repository'));
18
+ if (!this.isGitRepository(currentDir)) {
19
+ console.log(chalk.red('❌ Not a git repository'));
20
+ }
21
+ else if (this.isIvanRepository(currentDir)) {
22
+ console.log(chalk.red('❌ Cannot run Ivan on itself'));
23
+ }
24
+ return await this.promptForRepositoryPath();
25
+ }
26
+ isGitRepository(dir) {
27
+ try {
28
+ execSync('git rev-parse --git-dir', {
29
+ cwd: dir,
30
+ stdio: 'ignore'
31
+ });
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ isIvanRepository(dir) {
39
+ try {
40
+ const packageJsonPath = path.join(dir, 'package.json');
41
+ if (!fs.existsSync(packageJsonPath)) {
42
+ return false;
43
+ }
44
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
45
+ return packageJson.name === '@ariso-ai/ivan' || packageJson.name === 'ivan';
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ isValidTargetRepository(dir) {
52
+ return this.isGitRepository(dir) && !this.isIvanRepository(dir);
53
+ }
54
+ async promptForRepositoryPath() {
55
+ console.log('');
56
+ console.log(chalk.blue('📁 Please specify the repository where Ivan should work'));
57
+ while (true) {
58
+ const { repositoryPath } = await inquirer.prompt([
59
+ {
60
+ type: 'input',
61
+ name: 'repositoryPath',
62
+ message: 'Enter the path to your target repository:',
63
+ validate: (input) => {
64
+ if (!input || input.trim().length === 0) {
65
+ return 'Please enter a valid path';
66
+ }
67
+ return true;
68
+ }
69
+ }
70
+ ]);
71
+ const fullPath = path.resolve(repositoryPath.trim());
72
+ if (!fs.existsSync(fullPath)) {
73
+ console.log(chalk.red('❌ Path does not exist'));
74
+ continue;
75
+ }
76
+ if (!fs.statSync(fullPath).isDirectory()) {
77
+ console.log(chalk.red('❌ Path is not a directory'));
78
+ continue;
79
+ }
80
+ if (!this.isGitRepository(fullPath)) {
81
+ console.log(chalk.red('❌ Path is not a git repository'));
82
+ continue;
83
+ }
84
+ if (this.isIvanRepository(fullPath)) {
85
+ console.log(chalk.red('❌ Cannot run Ivan on itself'));
86
+ continue;
87
+ }
88
+ console.log(chalk.green(`✅ Using repository: ${fullPath}`));
89
+ return fullPath;
90
+ }
91
+ }
92
+ getRepositoryInfo(workingDir) {
93
+ try {
94
+ const repoName = path.basename(workingDir);
95
+ const branch = execSync('git branch --show-current', {
96
+ cwd: workingDir,
97
+ encoding: 'utf8'
98
+ }).trim();
99
+ return { name: repoName, branch };
100
+ }
101
+ catch {
102
+ return { name: path.basename(workingDir), branch: 'unknown' };
103
+ }
104
+ }
105
+ getRemoteUrl(workingDir) {
106
+ try {
107
+ const remoteUrl = execSync('git config --get remote.origin.url', {
108
+ cwd: workingDir,
109
+ encoding: 'utf8'
110
+ }).trim();
111
+ return remoteUrl || null;
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ async getOrCreateRepository(workingDir) {
118
+ const db = this.dbManager.getKysely();
119
+ // Check if repository exists
120
+ const existingRepo = await db
121
+ .selectFrom('repositories')
122
+ .selectAll()
123
+ .where('directory', '=', workingDir)
124
+ .executeTakeFirst();
125
+ if (existingRepo) {
126
+ return existingRepo;
127
+ }
128
+ // Create new repository
129
+ const { name } = this.getRepositoryInfo(workingDir);
130
+ const remoteUrl = this.getRemoteUrl(workingDir);
131
+ await db.insertInto('repositories').values({
132
+ remote_url: remoteUrl,
133
+ directory: workingDir,
134
+ name
135
+ }).execute();
136
+ // Fetch the created repository with its id
137
+ const createdRepo = await db
138
+ .selectFrom('repositories')
139
+ .selectAll()
140
+ .where('directory', '=', workingDir)
141
+ .executeTakeFirstOrThrow();
142
+ return createdRepo;
143
+ }
144
+ close() {
145
+ this.dbManager.close();
146
+ }
147
+ }
148
+ //# sourceMappingURL=repository-manager-pat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-manager-pat.js","sourceRoot":"","sources":["../../src/services/repository-manager-pat.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
+ import { Selectable } from 'kysely';
2
+ import { Repository } from '../database.js';
1
3
  export declare class RepositoryManager {
4
+ private dbManager;
5
+ constructor();
2
6
  getValidWorkingDirectory(): Promise<string>;
3
7
  private isGitRepository;
4
8
  private isIvanRepository;
@@ -8,5 +12,8 @@ export declare class RepositoryManager {
8
12
  name: string;
9
13
  branch: string;
10
14
  };
15
+ private getRemoteUrl;
16
+ getOrCreateRepository(workingDir: string): Promise<Selectable<Repository>>;
17
+ close(): void;
11
18
  }
12
19
  //# sourceMappingURL=repository-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-manager.d.ts","sourceRoot":"","sources":["../../src/services/repository-manager.ts"],"names":[],"mappings":"AAMA,qBAAa,iBAAiB;IACtB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBjD,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,uBAAuB;YAIjB,uBAAuB;IA8CrC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAaxE"}
1
+ {"version":3,"file":"repository-manager.d.ts","sourceRoot":"","sources":["../../src/services/repository-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAmB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE7D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAkB;;IAK7B,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBjD,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,uBAAuB;YAIjB,uBAAuB;IA8CrC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAcvE,OAAO,CAAC,YAAY;IAYd,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAkChF,KAAK,IAAI,IAAI;CAGd"}