@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.
- package/README.md +7 -21
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +245 -4
- package/dist/config.js.map +1 -1
- package/dist/database/migrations/009_create_memory_tables.d.ts +3 -0
- package/dist/database/migrations/009_create_memory_tables.d.ts.map +1 -0
- package/dist/database/migrations/009_create_memory_tables.js +35 -0
- package/dist/database/migrations/009_create_memory_tables.js.map +1 -0
- package/dist/database/migrations/{006_add_comment_url_and_commit_to_tasks.d.ts → 009_create_repository_table.d.ts} +1 -1
- package/dist/database/migrations/009_create_repository_table.d.ts.map +1 -0
- package/dist/database/migrations/009_create_repository_table.js +15 -0
- package/dist/database/migrations/009_create_repository_table.js.map +1 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.d.ts +3 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.d.ts.map +1 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.js +13 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.js.map +1 -0
- package/dist/database/migrations/011_create_learnings_table.d.ts +3 -0
- package/dist/database/migrations/011_create_learnings_table.d.ts.map +1 -0
- package/dist/database/migrations/011_create_learnings_table.js +16 -0
- package/dist/database/migrations/011_create_learnings_table.js.map +1 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.d.ts +3 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.d.ts.map +1 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.js +13 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.js.map +1 -0
- package/dist/database/migrations/index.d.ts.map +1 -1
- package/dist/database/migrations/index.js +5 -1
- package/dist/database/migrations/index.js.map +1 -1
- package/dist/database/types.d.ts +11 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/services/address-executor.d.ts.map +1 -1
- package/dist/services/address-executor.js +8 -21
- package/dist/services/address-executor.js.map +1 -1
- package/dist/services/address-task-executor.d.ts.map +1 -1
- package/dist/services/address-task-executor.js +10 -9
- package/dist/services/address-task-executor.js.map +1 -1
- package/dist/services/embedding-service.d.ts +12 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +51 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/git-interfaces.d.ts +67 -0
- package/dist/services/git-interfaces.d.ts.map +1 -0
- package/dist/services/git-interfaces.js +2 -0
- package/dist/services/git-interfaces.js.map +1 -0
- package/dist/services/git-manager-cli.d.ts +33 -0
- package/dist/services/git-manager-cli.d.ts.map +1 -0
- package/dist/services/git-manager-cli.js +734 -0
- package/dist/services/git-manager-cli.js.map +1 -0
- package/dist/services/git-manager-pat.d.ts +36 -0
- package/dist/services/git-manager-pat.d.ts.map +1 -0
- package/dist/services/git-manager-pat.js +667 -0
- package/dist/services/git-manager-pat.js.map +1 -0
- package/dist/services/git-manager.d.ts +1 -0
- package/dist/services/git-manager.d.ts.map +1 -1
- package/dist/services/git-manager.js +10 -4
- package/dist/services/git-manager.js.map +1 -1
- package/dist/services/github-api-client.d.ts +115 -0
- package/dist/services/github-api-client.d.ts.map +1 -0
- package/dist/services/github-api-client.js +256 -0
- package/dist/services/github-api-client.js.map +1 -0
- package/dist/services/index.d.ts +9 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +12 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/job-manager.d.ts +3 -4
- package/dist/services/job-manager.d.ts.map +1 -1
- package/dist/services/job-manager.js +14 -19
- package/dist/services/job-manager.js.map +1 -1
- package/dist/services/learn-executor.d.ts +13 -0
- package/dist/services/learn-executor.d.ts.map +1 -0
- package/dist/services/learn-executor.js +293 -0
- package/dist/services/learn-executor.js.map +1 -0
- package/dist/services/learning-service.d.ts +30 -0
- package/dist/services/learning-service.d.ts.map +1 -0
- package/dist/services/learning-service.js +88 -0
- package/dist/services/learning-service.js.map +1 -0
- package/dist/services/memory-service.d.ts +26 -0
- package/dist/services/memory-service.d.ts.map +1 -0
- package/dist/services/memory-service.js +128 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/services/pr-service-cli.d.ts +12 -0
- package/dist/services/pr-service-cli.d.ts.map +1 -0
- package/dist/services/pr-service-cli.js +291 -0
- package/dist/services/pr-service-cli.js.map +1 -0
- package/dist/services/pr-service-pat.d.ts +15 -0
- package/dist/services/pr-service-pat.d.ts.map +1 -0
- package/dist/services/pr-service-pat.js +255 -0
- package/dist/services/pr-service-pat.js.map +1 -0
- package/dist/services/repository-manager-cli.d.ts +17 -0
- package/dist/services/repository-manager-cli.d.ts.map +1 -0
- package/dist/services/repository-manager-cli.js +148 -0
- package/dist/services/repository-manager-cli.js.map +1 -0
- package/dist/services/repository-manager-pat.d.ts +17 -0
- package/dist/services/repository-manager-pat.d.ts.map +1 -0
- package/dist/services/repository-manager-pat.js +148 -0
- package/dist/services/repository-manager-pat.js.map +1 -0
- package/dist/services/repository-manager.d.ts +7 -0
- package/dist/services/repository-manager.d.ts.map +1 -1
- package/dist/services/repository-manager.js +47 -0
- package/dist/services/repository-manager.js.map +1 -1
- package/dist/services/service-factory.d.ts +27 -0
- package/dist/services/service-factory.d.ts.map +1 -0
- package/dist/services/service-factory.js +79 -0
- package/dist/services/service-factory.js.map +1 -0
- package/dist/services/task-executor.d.ts.map +1 -1
- package/dist/services/task-executor.js +42 -75
- package/dist/services/task-executor.js.map +1 -1
- package/package.json +2 -2
- package/dist/agent.d.ts +0 -11
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -48
- package/dist/agent.js.map +0 -1
- package/dist/config/config.d.ts +0 -20
- package/dist/config/config.d.ts.map +0 -1
- package/dist/config/config.js +0 -187
- package/dist/config/config.js.map +0 -1
- package/dist/database/database.d.ts +0 -12
- package/dist/database/database.d.ts.map +0 -1
- package/dist/database/database.js +0 -45
- package/dist/database/database.js.map +0 -1
- package/dist/database/migrations/001_initial_schema.d.ts +0 -3
- package/dist/database/migrations/001_initial_schema.d.ts.map +0 -1
- package/dist/database/migrations/001_initial_schema.js +0 -66
- package/dist/database/migrations/001_initial_schema.js.map +0 -1
- package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts.map +0 -1
- package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js +0 -15
- package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js.map +0 -1
- package/dist/scripts/task-executor.d.ts +0 -3
- package/dist/scripts/task-executor.d.ts.map +0 -1
- package/dist/scripts/task-executor.js +0 -139
- package/dist/scripts/task-executor.js.map +0 -1
- package/dist/scripts/task-planner.d.ts +0 -3
- package/dist/scripts/task-planner.d.ts.map +0 -1
- package/dist/scripts/task-planner.js +0 -81
- package/dist/scripts/task-planner.js.map +0 -1
- package/dist/services/claude-planner.d.ts +0 -15
- package/dist/services/claude-planner.d.ts.map +0 -1
- package/dist/services/claude-planner.js +0 -107
- package/dist/services/claude-planner.js.map +0 -1
- package/dist/services/docker-orchestrator.d.ts +0 -11
- package/dist/services/docker-orchestrator.d.ts.map +0 -1
- package/dist/services/docker-orchestrator.js +0 -85
- 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":"
|
|
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"}
|