@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,88 @@
1
+ import { OpenAIService } from './openai-service.js';
2
+ import chalk from 'chalk';
3
+ export class LearningService {
4
+ dbManager;
5
+ openaiService;
6
+ constructor(dbManager) {
7
+ this.dbManager = dbManager;
8
+ this.openaiService = new OpenAIService();
9
+ }
10
+ async saveLearning(learning) {
11
+ console.log(chalk.blue('💾 Saving learning to database...'));
12
+ const db = this.dbManager.getKysely();
13
+ // Insert the learning
14
+ const result = await db
15
+ .insertInto('learnings')
16
+ .values({
17
+ repository_id: learning.repositoryId,
18
+ text: `Q: ${learning.question}\n\nA: ${learning.answer}`,
19
+ files: JSON.stringify(learning.files)
20
+ })
21
+ .executeTakeFirst();
22
+ if (result.insertId === undefined) {
23
+ throw new Error('Failed to insert learning: no insertId returned');
24
+ }
25
+ const learningId = Number(result.insertId);
26
+ console.log(chalk.green(`✅ Learning saved with ID: ${learningId}`));
27
+ // Generate and store embeddings
28
+ await this.generateAndStoreEmbedding(learningId, learning.question, learning.answer);
29
+ return learningId;
30
+ }
31
+ async generateAndStoreEmbedding(learningId, question, answer) {
32
+ console.log(chalk.blue('🔮 Generating embeddings...'));
33
+ try {
34
+ const openai = await this.openaiService.getClient();
35
+ // Combine question and answer for embedding
36
+ const textToEmbed = `${question}\n\n${answer}`;
37
+ const embeddingResponse = await openai.embeddings.create({
38
+ model: 'text-embedding-3-large',
39
+ input: textToEmbed,
40
+ dimensions: 3072
41
+ });
42
+ const embedding = embeddingResponse.data[0].embedding;
43
+ console.log(chalk.blue('💾 Storing embeddings...'));
44
+ // Convert to Float32Array for sqlite-vec
45
+ const embeddingArray = new Float32Array(embedding);
46
+ // Use DatabaseManager's vector insert method
47
+ this.dbManager.executeVectorInsert(embeddingArray.buffer, learningId, textToEmbed);
48
+ console.log(chalk.green('✅ Embeddings stored successfully'));
49
+ }
50
+ catch (error) {
51
+ console.error(chalk.red('❌ Failed to generate or store embeddings:'), error);
52
+ throw error;
53
+ }
54
+ }
55
+ async getRepositoryLearnings(repositoryId) {
56
+ const db = this.dbManager.getKysely();
57
+ const learnings = await db
58
+ .selectFrom('learnings')
59
+ .selectAll()
60
+ .where('repository_id', '=', repositoryId)
61
+ .orderBy('created_at', 'desc')
62
+ .execute();
63
+ return learnings;
64
+ }
65
+ async searchSimilarLearnings(repositoryId, queryText, limit = 5) {
66
+ console.log(chalk.blue('🔍 Searching for similar learnings...'));
67
+ try {
68
+ const openai = await this.openaiService.getClient();
69
+ // Generate embedding for the query
70
+ const embeddingResponse = await openai.embeddings.create({
71
+ model: 'text-embedding-3-large',
72
+ input: queryText,
73
+ dimensions: 3072
74
+ });
75
+ const queryEmbedding = embeddingResponse.data[0].embedding;
76
+ const embeddingArray = new Float32Array(queryEmbedding);
77
+ // Use DatabaseManager's vector search method
78
+ const results = this.dbManager.executeVectorSearch(embeddingArray.buffer, repositoryId, limit);
79
+ console.log(chalk.green(`✅ Found ${results.length} similar learnings`));
80
+ return results;
81
+ }
82
+ catch (error) {
83
+ console.error(chalk.red('❌ Failed to search similar learnings:'), error);
84
+ throw error;
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=learning-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-service.js","sourceRoot":"","sources":["../../src/services/learning-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface CaptureMemoryParams {
2
+ prNumber: number;
3
+ commentAuthor: string;
4
+ commentText: string;
5
+ filePath: string | null;
6
+ prDescription: string;
7
+ repository: string;
8
+ }
9
+ export interface MemoryWithContext {
10
+ id: string;
11
+ commentText: string;
12
+ filePath: string | null;
13
+ prDescription: string;
14
+ commentAuthor: string;
15
+ relevantChunk: string;
16
+ distance: number;
17
+ }
18
+ export declare class MemoryService {
19
+ private dbManager;
20
+ private embeddingService;
21
+ constructor();
22
+ captureMemory(params: CaptureMemoryParams): Promise<string>;
23
+ retrieveSimilarMemories(query: string, repository: string, limit?: number): Promise<MemoryWithContext[]>;
24
+ private condensePRDescription;
25
+ }
26
+ //# sourceMappingURL=memory-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.d.ts","sourceRoot":"","sources":["../../src/services/memory-service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,gBAAgB,CAAmB;;IAOrC,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiD3D,uBAAuB,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAyCjB,qBAAqB;CAkCpC"}
@@ -0,0 +1,128 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { sql } from 'kysely';
3
+ import { DatabaseManager } from '../database.js';
4
+ import { EmbeddingService } from './embedding-service.js';
5
+ import { OpenAIService } from './openai-service.js';
6
+ export class MemoryService {
7
+ dbManager;
8
+ embeddingService;
9
+ constructor() {
10
+ this.dbManager = new DatabaseManager();
11
+ this.embeddingService = new EmbeddingService();
12
+ }
13
+ async captureMemory(params) {
14
+ try {
15
+ // 1. Condense PR description if needed
16
+ const condensed = await this.condensePRDescription(params.prDescription);
17
+ // 2. Create memory item
18
+ const memoryId = randomUUID();
19
+ const db = this.dbManager.getKysely();
20
+ await db
21
+ .insertInto('memory_items')
22
+ .values({
23
+ id: memoryId,
24
+ pr_number: params.prNumber,
25
+ comment_author: params.commentAuthor,
26
+ comment_text: params.commentText,
27
+ file_path: params.filePath,
28
+ pr_description: condensed,
29
+ resolution_summary: null,
30
+ repository: params.repository,
31
+ created_at: new Date().toISOString()
32
+ })
33
+ .execute();
34
+ // 3. Chunk and embed combined text
35
+ const combinedText = `${condensed}\n\nComment: ${params.commentText}`;
36
+ const chunks = await this.embeddingService.chunkAndEmbed(combinedText);
37
+ // 4. Store embeddings
38
+ for (let i = 0; i < chunks.length; i++) {
39
+ await db
40
+ .insertInto('memory_embeddings')
41
+ .values({
42
+ id: randomUUID(),
43
+ memory_item_id: memoryId,
44
+ chunk_text: chunks[i].text,
45
+ chunk_index: i,
46
+ embedding: JSON.stringify(chunks[i].embedding)
47
+ })
48
+ .execute();
49
+ }
50
+ return memoryId;
51
+ }
52
+ catch (error) {
53
+ console.error('Error capturing memory:', error);
54
+ throw error;
55
+ }
56
+ }
57
+ async retrieveSimilarMemories(query, repository, limit = 3) {
58
+ try {
59
+ // Generate query embedding
60
+ const queryEmbedding = await this.embeddingService.generateEmbedding(query);
61
+ // Search using cosine similarity
62
+ const db = this.dbManager.getKysely();
63
+ const results = await db
64
+ .selectFrom('memory_embeddings as me')
65
+ .innerJoin('memory_items as mi', 'mi.id', 'me.memory_item_id')
66
+ .select([
67
+ 'mi.id',
68
+ 'mi.comment_text',
69
+ 'mi.file_path',
70
+ 'mi.pr_description',
71
+ 'mi.comment_author',
72
+ 'me.chunk_text',
73
+ sql `vec_distance_cosine(me.embedding, ${JSON.stringify(queryEmbedding)})`.as('distance')
74
+ ])
75
+ .where('mi.repository', '=', repository)
76
+ .orderBy('distance', 'asc')
77
+ .limit(limit)
78
+ .execute();
79
+ return results.map(r => ({
80
+ id: r.id,
81
+ commentText: r.comment_text,
82
+ filePath: r.file_path,
83
+ prDescription: r.pr_description,
84
+ commentAuthor: r.comment_author,
85
+ relevantChunk: r.chunk_text,
86
+ distance: r.distance
87
+ }));
88
+ }
89
+ catch (error) {
90
+ console.error('Error retrieving similar memories:', error);
91
+ // Return empty array on error - memory failures should not block execution
92
+ return [];
93
+ }
94
+ }
95
+ async condensePRDescription(desc) {
96
+ // If description is short enough, return as-is
97
+ if (desc.length <= 500) {
98
+ return desc;
99
+ }
100
+ try {
101
+ const openaiService = new OpenAIService();
102
+ const client = await openaiService.getClient();
103
+ const completion = await client.chat.completions.create({
104
+ model: 'gpt-4o-mini',
105
+ messages: [
106
+ {
107
+ role: 'system',
108
+ content: 'Condense this PR description to 2-3 clear sentences that capture the main purpose and changes.'
109
+ },
110
+ {
111
+ role: 'user',
112
+ content: desc
113
+ }
114
+ ],
115
+ temperature: 0.3,
116
+ max_tokens: 150
117
+ });
118
+ const condensed = completion.choices[0]?.message?.content?.trim();
119
+ return condensed || desc;
120
+ }
121
+ catch (error) {
122
+ console.error('Failed to condense PR description, using original:', error);
123
+ // If condensing fails, just truncate to 500 chars
124
+ return desc.substring(0, 500) + '...';
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=memory-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.js","sourceRoot":"","sources":["../../src/services/memory-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { IPRService, PullRequest, PRComment } from './git-interfaces.js';
2
+ export declare class PRServiceCLI implements IPRService {
3
+ private workingDir;
4
+ constructor(workingDir: string);
5
+ getSpecificPRWithIssues(prNumber: number): Promise<PullRequest[]>;
6
+ getOpenPRsWithIssues(fromUser?: string): Promise<PullRequest[]>;
7
+ getUnaddressedComments(prNumber: number): Promise<PRComment[]>;
8
+ private getFailingChecks;
9
+ checkoutPRBranch(prNumber: number): Promise<void>;
10
+ getFailingActionLogs(prNumber: number): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=pr-service-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-service-cli.d.ts","sourceRoot":"","sources":["../../src/services/pr-service-cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEzE,qBAAa,YAAa,YAAW,UAAU;IAC7C,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAIxB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgEjE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6D/D,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YA0FtD,gBAAgB;IAkDxB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAwD9D"}
@@ -0,0 +1,291 @@
1
+ import { execSync } from 'child_process';
2
+ import chalk from 'chalk';
3
+ export class PRServiceCLI {
4
+ workingDir;
5
+ constructor(workingDir) {
6
+ this.workingDir = workingDir;
7
+ }
8
+ async getSpecificPRWithIssues(prNumber) {
9
+ try {
10
+ // Get specific PR
11
+ const prJson = execSync(`gh pr view ${prNumber} --json number,title,headRefName,url,state`, {
12
+ cwd: this.workingDir,
13
+ encoding: 'utf-8'
14
+ });
15
+ const pr = JSON.parse(prJson);
16
+ // Check if PR is open
17
+ if (pr.state !== 'OPEN') {
18
+ console.log(chalk.yellow(`⚠️ PR #${prNumber} is not open (status: ${pr.state})`));
19
+ return [];
20
+ }
21
+ const pullRequest = {
22
+ number: pr.number,
23
+ title: pr.title,
24
+ branch: pr.headRefName,
25
+ url: pr.url,
26
+ hasUnaddressedComments: false,
27
+ hasFailingChecks: false,
28
+ unaddressedComments: [],
29
+ failingChecks: [],
30
+ hasTestOrLintFailures: false,
31
+ testOrLintFailures: []
32
+ };
33
+ // Check for unaddressed comments
34
+ const comments = await this.getUnaddressedComments(pr.number);
35
+ if (comments.length > 0) {
36
+ pullRequest.hasUnaddressedComments = true;
37
+ pullRequest.unaddressedComments = comments;
38
+ }
39
+ // Check for failing checks
40
+ const { allFailures, testOrLintFailures } = await this.getFailingChecks(pr.number);
41
+ if (allFailures.length > 0) {
42
+ pullRequest.hasFailingChecks = true;
43
+ pullRequest.failingChecks = allFailures;
44
+ }
45
+ if (testOrLintFailures.length > 0) {
46
+ pullRequest.hasTestOrLintFailures = true;
47
+ pullRequest.testOrLintFailures = testOrLintFailures;
48
+ }
49
+ // Only include PR if it has issues
50
+ if (pullRequest.hasUnaddressedComments || pullRequest.hasFailingChecks) {
51
+ return [pullRequest];
52
+ }
53
+ return [];
54
+ }
55
+ catch (error) {
56
+ const errorMessage = error instanceof Error ? error.message : String(error);
57
+ if (errorMessage.includes('no pull requests found')) {
58
+ console.error(chalk.red(`❌ PR #${prNumber} not found`));
59
+ }
60
+ else {
61
+ console.error(chalk.red(`Error fetching PR #${prNumber}:`), error);
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ async getOpenPRsWithIssues(fromUser) {
67
+ try {
68
+ // Get all open PRs, optionally filtered by author
69
+ let command = 'gh pr list --state open --json number,title,headRefName,url,author';
70
+ if (fromUser) {
71
+ command += ` --author ${fromUser}`;
72
+ }
73
+ const prsJson = execSync(command, {
74
+ cwd: this.workingDir,
75
+ encoding: 'utf-8'
76
+ });
77
+ const prs = JSON.parse(prsJson);
78
+ const pullRequests = [];
79
+ for (const pr of prs) {
80
+ const pullRequest = {
81
+ number: pr.number,
82
+ title: pr.title,
83
+ branch: pr.headRefName,
84
+ url: pr.url,
85
+ hasUnaddressedComments: false,
86
+ hasFailingChecks: false,
87
+ unaddressedComments: [],
88
+ failingChecks: [],
89
+ hasTestOrLintFailures: false,
90
+ testOrLintFailures: []
91
+ };
92
+ // Check for unaddressed comments
93
+ const comments = await this.getUnaddressedComments(pr.number);
94
+ if (comments.length > 0) {
95
+ pullRequest.hasUnaddressedComments = true;
96
+ pullRequest.unaddressedComments = comments;
97
+ }
98
+ // Check for failing checks
99
+ const { allFailures, testOrLintFailures } = await this.getFailingChecks(pr.number);
100
+ if (allFailures.length > 0) {
101
+ pullRequest.hasFailingChecks = true;
102
+ pullRequest.failingChecks = allFailures;
103
+ }
104
+ if (testOrLintFailures.length > 0) {
105
+ pullRequest.hasTestOrLintFailures = true;
106
+ pullRequest.testOrLintFailures = testOrLintFailures;
107
+ }
108
+ // Only include PRs that have issues
109
+ if (pullRequest.hasUnaddressedComments || pullRequest.hasFailingChecks) {
110
+ pullRequests.push(pullRequest);
111
+ }
112
+ }
113
+ return pullRequests;
114
+ }
115
+ catch (error) {
116
+ console.error(chalk.red('Error fetching PRs:'), error);
117
+ throw error;
118
+ }
119
+ }
120
+ async getUnaddressedComments(prNumber) {
121
+ try {
122
+ // Get PR owner and repo name
123
+ const repoInfo = execSync('gh repo view --json owner,name', {
124
+ cwd: this.workingDir,
125
+ encoding: 'utf-8'
126
+ });
127
+ const { owner, name: repoName } = JSON.parse(repoInfo);
128
+ // Use GraphQL to get review threads with resolved status
129
+ const graphqlQuery = `
130
+ query {
131
+ repository(owner: "${owner.login}", name: "${repoName}") {
132
+ pullRequest(number: ${prNumber}) {
133
+ reviewThreads(first: 100) {
134
+ nodes {
135
+ isResolved
136
+ comments(first: 100) {
137
+ nodes {
138
+ id
139
+ databaseId
140
+ body
141
+ author {
142
+ login
143
+ }
144
+ createdAt
145
+ path
146
+ line
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ `;
155
+ const graphqlResult = execSync(`gh api graphql -f query='${graphqlQuery}'`, {
156
+ cwd: this.workingDir,
157
+ encoding: 'utf-8'
158
+ });
159
+ const result = JSON.parse(graphqlResult);
160
+ const threads = result.data?.repository?.pullRequest?.reviewThreads?.nodes || [];
161
+ const unaddressedComments = [];
162
+ // Process each thread
163
+ for (const thread of threads) {
164
+ // Skip resolved threads
165
+ if (thread.isResolved) {
166
+ continue;
167
+ }
168
+ const comments = thread.comments?.nodes || [];
169
+ if (comments.length === 0) {
170
+ continue;
171
+ }
172
+ // Get the first comment (the main review comment)
173
+ const firstComment = comments[0];
174
+ // Check if there are replies (more than one comment in thread)
175
+ const hasReplies = comments.length > 1;
176
+ if (!hasReplies && firstComment.path) {
177
+ // Only include if it's an inline code comment (has a path) and has no replies
178
+ unaddressedComments.push({
179
+ id: firstComment.databaseId ? firstComment.databaseId.toString() : firstComment.id,
180
+ author: firstComment.author.login,
181
+ body: firstComment.body,
182
+ createdAt: firstComment.createdAt,
183
+ path: firstComment.path,
184
+ line: firstComment.line
185
+ });
186
+ }
187
+ }
188
+ return unaddressedComments;
189
+ }
190
+ catch {
191
+ // If there's an error fetching comments, return empty array
192
+ return [];
193
+ }
194
+ }
195
+ async getFailingChecks(prNumber) {
196
+ try {
197
+ const checksJson = execSync(`gh pr checks ${prNumber} --json name,state`, {
198
+ cwd: this.workingDir,
199
+ encoding: 'utf-8'
200
+ });
201
+ const checks = JSON.parse(checksJson);
202
+ const failingChecks = [];
203
+ const testOrLintFailures = [];
204
+ for (const check of checks) {
205
+ if (check.state === 'FAILURE' || check.state === 'ERROR') {
206
+ failingChecks.push(check.name);
207
+ // Check if this is a test or lint failure
208
+ const checkNameLower = check.name.toLowerCase();
209
+ if (checkNameLower.includes('test') ||
210
+ checkNameLower.includes('lint') ||
211
+ checkNameLower.includes('eslint') ||
212
+ checkNameLower.includes('prettier') ||
213
+ checkNameLower.includes('jest') ||
214
+ checkNameLower.includes('mocha') ||
215
+ checkNameLower.includes('pytest') ||
216
+ checkNameLower.includes('ruff') ||
217
+ checkNameLower.includes('black') ||
218
+ checkNameLower.includes('flake8') ||
219
+ checkNameLower.includes('mypy') ||
220
+ checkNameLower.includes('typecheck') ||
221
+ checkNameLower.includes('type-check') ||
222
+ checkNameLower.includes('tsc') ||
223
+ checkNameLower.includes('clippy') ||
224
+ checkNameLower.includes('rustfmt')) {
225
+ testOrLintFailures.push(check.name);
226
+ }
227
+ }
228
+ }
229
+ return { allFailures: failingChecks, testOrLintFailures };
230
+ }
231
+ catch {
232
+ // If there's an error fetching checks, return empty arrays
233
+ return { allFailures: [], testOrLintFailures: [] };
234
+ }
235
+ }
236
+ async checkoutPRBranch(prNumber) {
237
+ execSync(`gh pr checkout ${prNumber}`, {
238
+ cwd: this.workingDir,
239
+ stdio: 'inherit'
240
+ });
241
+ }
242
+ async getFailingActionLogs(prNumber) {
243
+ try {
244
+ // Get the checks with their workflow information
245
+ const checksJson = execSync(`gh pr checks ${prNumber} --json name,state,link,workflow`, {
246
+ cwd: this.workingDir,
247
+ encoding: 'utf-8'
248
+ });
249
+ const checks = JSON.parse(checksJson);
250
+ let failingLogs = '';
251
+ for (const check of checks) {
252
+ if (check.state === 'FAILURE' || check.state === 'ERROR') {
253
+ // Extract run ID from the link (format: https://github.com/owner/repo/actions/runs/123456789/job/987654321)
254
+ const runIdMatch = check.link?.match(/\/runs\/(\d+)/);
255
+ if (runIdMatch) {
256
+ const runId = runIdMatch[1];
257
+ try {
258
+ // Get the failed logs for this run
259
+ const logs = execSync(`gh run view ${runId} --log-failed`, {
260
+ cwd: this.workingDir,
261
+ encoding: 'utf-8',
262
+ maxBuffer: 10 * 1024 * 1024 // 10MB buffer for large logs
263
+ });
264
+ if (logs) {
265
+ failingLogs += `\n\n=== Failed logs for ${check.name} ===\n`;
266
+ // Truncate logs if too large (keep last 5000 chars per check)
267
+ if (logs.length > 5000) {
268
+ failingLogs += '... (truncated) ...\n';
269
+ failingLogs += logs.substring(logs.length - 5000);
270
+ }
271
+ else {
272
+ failingLogs += logs;
273
+ }
274
+ }
275
+ }
276
+ catch (error) {
277
+ // If we can't get logs for this specific run, continue with others
278
+ console.error(`Failed to get logs for run ${runId}:`, error);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ return failingLogs;
284
+ }
285
+ catch (error) {
286
+ console.error('Error fetching action logs:', error);
287
+ return '';
288
+ }
289
+ }
290
+ }
291
+ //# sourceMappingURL=pr-service-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-service-cli.js","sourceRoot":"","sources":["../../src/services/pr-service-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { IPRService, PullRequest, PRComment } from './git-interfaces.js';
2
+ export declare class PRServicePAT implements IPRService {
3
+ private workingDir;
4
+ private githubClient;
5
+ private owner;
6
+ private repo;
7
+ constructor(workingDir: string, pat: string);
8
+ getSpecificPRWithIssues(prNumber: number): Promise<PullRequest[]>;
9
+ getOpenPRsWithIssues(fromUser?: string): Promise<PullRequest[]>;
10
+ getUnaddressedComments(prNumber: number): Promise<PRComment[]>;
11
+ private getFailingChecks;
12
+ checkoutPRBranch(prNumber: number): Promise<void>;
13
+ getFailingActionLogs(prNumber: number): Promise<string>;
14
+ }
15
+ //# sourceMappingURL=pr-service-pat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-service-pat.d.ts","sourceRoot":"","sources":["../../src/services/pr-service-pat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGzE,qBAAa,YAAa,YAAW,UAAU;IAC7C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAUrC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA4DjE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAuD/D,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YA4CtD,gBAAgB;IA2CxB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBjD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuC9D"}