@ariso-ai/ivan 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +412 -0
  2. package/dist/agent.d.ts +11 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +48 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/config/config.d.ts +20 -0
  7. package/dist/config/config.d.ts.map +1 -0
  8. package/dist/config/config.js +187 -0
  9. package/dist/config/config.js.map +1 -0
  10. package/dist/config.d.ts +46 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +414 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/database/database.d.ts +12 -0
  15. package/dist/database/database.d.ts.map +1 -0
  16. package/dist/database/database.js +45 -0
  17. package/dist/database/database.js.map +1 -0
  18. package/dist/database/migration.d.ts +11 -0
  19. package/dist/database/migration.d.ts.map +1 -0
  20. package/dist/database/migration.js +64 -0
  21. package/dist/database/migration.js.map +1 -0
  22. package/dist/database/migrations/001_create_jobs_table.d.ts +3 -0
  23. package/dist/database/migrations/001_create_jobs_table.d.ts.map +1 -0
  24. package/dist/database/migrations/001_create_jobs_table.js +14 -0
  25. package/dist/database/migrations/001_create_jobs_table.js.map +1 -0
  26. package/dist/database/migrations/001_initial_schema.d.ts +3 -0
  27. package/dist/database/migrations/001_initial_schema.d.ts.map +1 -0
  28. package/dist/database/migrations/001_initial_schema.js +66 -0
  29. package/dist/database/migrations/001_initial_schema.js.map +1 -0
  30. package/dist/database/migrations/002_create_tasks_table.d.ts +3 -0
  31. package/dist/database/migrations/002_create_tasks_table.d.ts.map +1 -0
  32. package/dist/database/migrations/002_create_tasks_table.js +16 -0
  33. package/dist/database/migrations/002_create_tasks_table.js.map +1 -0
  34. package/dist/database/migrations/003_add_log_to_tasks.d.ts +3 -0
  35. package/dist/database/migrations/003_add_log_to_tasks.d.ts.map +1 -0
  36. package/dist/database/migrations/003_add_log_to_tasks.js +11 -0
  37. package/dist/database/migrations/003_add_log_to_tasks.js.map +1 -0
  38. package/dist/database/migrations/004_add_branch_to_tasks.d.ts +3 -0
  39. package/dist/database/migrations/004_add_branch_to_tasks.d.ts.map +1 -0
  40. package/dist/database/migrations/004_add_branch_to_tasks.js +11 -0
  41. package/dist/database/migrations/004_add_branch_to_tasks.js.map +1 -0
  42. package/dist/database/migrations/005_add_type_to_tasks.d.ts +3 -0
  43. package/dist/database/migrations/005_add_type_to_tasks.d.ts.map +1 -0
  44. package/dist/database/migrations/005_add_type_to_tasks.js +11 -0
  45. package/dist/database/migrations/005_add_type_to_tasks.js.map +1 -0
  46. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts +3 -0
  47. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts.map +1 -0
  48. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js +15 -0
  49. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js.map +1 -0
  50. package/dist/database/migrations/006_add_comment_url_to_tasks.d.ts +3 -0
  51. package/dist/database/migrations/006_add_comment_url_to_tasks.d.ts.map +1 -0
  52. package/dist/database/migrations/006_add_comment_url_to_tasks.js +14 -0
  53. package/dist/database/migrations/006_add_comment_url_to_tasks.js.map +1 -0
  54. package/dist/database/migrations/007_add_commit_to_tasks.d.ts +3 -0
  55. package/dist/database/migrations/007_add_commit_to_tasks.d.ts.map +1 -0
  56. package/dist/database/migrations/007_add_commit_to_tasks.js +13 -0
  57. package/dist/database/migrations/007_add_commit_to_tasks.js.map +1 -0
  58. package/dist/database/migrations/008_add_lint_and_test_task_type.d.ts +3 -0
  59. package/dist/database/migrations/008_add_lint_and_test_task_type.d.ts.map +1 -0
  60. package/dist/database/migrations/008_add_lint_and_test_task_type.js +42 -0
  61. package/dist/database/migrations/008_add_lint_and_test_task_type.js.map +1 -0
  62. package/dist/database/migrations/index.d.ts +3 -0
  63. package/dist/database/migrations/index.d.ts.map +1 -0
  64. package/dist/database/migrations/index.js +19 -0
  65. package/dist/database/migrations/index.js.map +1 -0
  66. package/dist/database/types.d.ts +34 -0
  67. package/dist/database/types.d.ts.map +1 -0
  68. package/dist/database/types.js +2 -0
  69. package/dist/database/types.js.map +1 -0
  70. package/dist/database.d.ts +13 -0
  71. package/dist/database.d.ts.map +1 -0
  72. package/dist/database.js +32 -0
  73. package/dist/database.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +285 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/scripts/task-executor.d.ts +3 -0
  79. package/dist/scripts/task-executor.d.ts.map +1 -0
  80. package/dist/scripts/task-executor.js +139 -0
  81. package/dist/scripts/task-executor.js.map +1 -0
  82. package/dist/scripts/task-planner.d.ts +3 -0
  83. package/dist/scripts/task-planner.d.ts.map +1 -0
  84. package/dist/scripts/task-planner.js +81 -0
  85. package/dist/scripts/task-planner.js.map +1 -0
  86. package/dist/services/address-executor.d.ts +13 -0
  87. package/dist/services/address-executor.d.ts.map +1 -0
  88. package/dist/services/address-executor.js +202 -0
  89. package/dist/services/address-executor.js.map +1 -0
  90. package/dist/services/address-task-executor.d.ts +19 -0
  91. package/dist/services/address-task-executor.d.ts.map +1 -0
  92. package/dist/services/address-task-executor.js +736 -0
  93. package/dist/services/address-task-executor.js.map +1 -0
  94. package/dist/services/claude-cli-executor.d.ts +14 -0
  95. package/dist/services/claude-cli-executor.d.ts.map +1 -0
  96. package/dist/services/claude-cli-executor.js +241 -0
  97. package/dist/services/claude-cli-executor.js.map +1 -0
  98. package/dist/services/claude-executor.d.ts +14 -0
  99. package/dist/services/claude-executor.d.ts.map +1 -0
  100. package/dist/services/claude-executor.js +274 -0
  101. package/dist/services/claude-executor.js.map +1 -0
  102. package/dist/services/claude-planner.d.ts +15 -0
  103. package/dist/services/claude-planner.d.ts.map +1 -0
  104. package/dist/services/claude-planner.js +107 -0
  105. package/dist/services/claude-planner.js.map +1 -0
  106. package/dist/services/docker-orchestrator.d.ts +11 -0
  107. package/dist/services/docker-orchestrator.d.ts.map +1 -0
  108. package/dist/services/docker-orchestrator.js +85 -0
  109. package/dist/services/docker-orchestrator.js.map +1 -0
  110. package/dist/services/executor-factory.d.ts +14 -0
  111. package/dist/services/executor-factory.d.ts.map +1 -0
  112. package/dist/services/executor-factory.js +14 -0
  113. package/dist/services/executor-factory.js.map +1 -0
  114. package/dist/services/git-manager.d.ts +36 -0
  115. package/dist/services/git-manager.d.ts.map +1 -0
  116. package/dist/services/git-manager.js +728 -0
  117. package/dist/services/git-manager.js.map +1 -0
  118. package/dist/services/index.d.ts +9 -0
  119. package/dist/services/index.d.ts.map +1 -0
  120. package/dist/services/index.js +9 -0
  121. package/dist/services/index.js.map +1 -0
  122. package/dist/services/job-manager.d.ts +30 -0
  123. package/dist/services/job-manager.d.ts.map +1 -0
  124. package/dist/services/job-manager.js +337 -0
  125. package/dist/services/job-manager.js.map +1 -0
  126. package/dist/services/openai-service.d.ts +14 -0
  127. package/dist/services/openai-service.d.ts.map +1 -0
  128. package/dist/services/openai-service.js +186 -0
  129. package/dist/services/openai-service.js.map +1 -0
  130. package/dist/services/pr-service.d.ts +31 -0
  131. package/dist/services/pr-service.d.ts.map +1 -0
  132. package/dist/services/pr-service.js +291 -0
  133. package/dist/services/pr-service.js.map +1 -0
  134. package/dist/services/repository-manager.d.ts +12 -0
  135. package/dist/services/repository-manager.d.ts.map +1 -0
  136. package/dist/services/repository-manager.js +101 -0
  137. package/dist/services/repository-manager.js.map +1 -0
  138. package/dist/services/task-executor.d.ts +20 -0
  139. package/dist/services/task-executor.d.ts.map +1 -0
  140. package/dist/services/task-executor.js +717 -0
  141. package/dist/services/task-executor.js.map +1 -0
  142. package/dist/types/non-interactive-config.d.ts +28 -0
  143. package/dist/types/non-interactive-config.d.ts.map +1 -0
  144. package/dist/types/non-interactive-config.js +2 -0
  145. package/dist/types/non-interactive-config.js.map +1 -0
  146. package/dist/web-server.d.ts +16 -0
  147. package/dist/web-server.d.ts.map +1 -0
  148. package/dist/web-server.js +488 -0
  149. package/dist/web-server.js.map +1 -0
  150. package/package.json +71 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ interface Config {
2
+ openaiApiKey: string;
3
+ anthropicApiKey: string;
4
+ version: string;
5
+ claudeModel?: string;
6
+ executorType?: 'sdk' | 'cli';
7
+ repoInstructions?: {
8
+ [repoPath: string]: string;
9
+ };
10
+ repoAllowedTools?: {
11
+ [repoPath: string]: string[];
12
+ };
13
+ repoInstructionsDeclined?: {
14
+ [repoPath: string]: boolean;
15
+ };
16
+ }
17
+ export declare class ConfigManager {
18
+ private configDir;
19
+ private configPath;
20
+ private dbPath;
21
+ constructor();
22
+ private ensureConfigDir;
23
+ private ensureDatabase;
24
+ isConfigured(): boolean;
25
+ getConfig(): Config | null;
26
+ private saveConfig;
27
+ isClaudeCodeInstalled(): boolean;
28
+ setup(): Promise<void>;
29
+ reconfigure(): Promise<void>;
30
+ getRepoInstructions(repoPath: string): Promise<string | undefined>;
31
+ hasDeclinedRepoInstructions(repoPath: string): Promise<boolean>;
32
+ markRepoInstructionsDeclined(repoPath: string): Promise<void>;
33
+ setRepoInstructions(repoPath: string, instructions: string): Promise<void>;
34
+ promptForMissingConfig(configKey: 'openaiApiKey' | 'anthropicApiKey'): Promise<string>;
35
+ getRepoAllowedTools(repoPath: string): Promise<string[] | undefined>;
36
+ setRepoAllowedTools(repoPath: string, allowedTools: string[]): Promise<void>;
37
+ promptForRepoInstructions(repoPath: string): Promise<string>;
38
+ promptForRepoAllowedTools(repoPath: string): Promise<string[]>;
39
+ promptForModel(): Promise<void>;
40
+ getClaudeModel(): string;
41
+ promptForExecutorType(): Promise<void>;
42
+ getExecutorType(): 'sdk' | 'cli';
43
+ setExecutorType(executorType: 'sdk' | 'cli'): Promise<void>;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,UAAU,MAAM;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC7B,gBAAgB,CAAC,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAClD,gBAAgB,CAAC,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IACpD,wBAAwB,CAAC,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC5D;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;;IAQvB,OAAO,CAAC,eAAe;YAMT,cAAc;IAc5B,YAAY,IAAI,OAAO;IAIvB,SAAS,IAAI,MAAM,GAAG,IAAI;YAcZ,UAAU;IAYxB,qBAAqB,IAAI,OAAO;IAK1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8EtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQlE,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/D,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1E,sBAAsB,CAAC,SAAS,EAAE,cAAc,GAAG,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAwDtF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;IAQpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5E,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsC5D,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0C9D,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CrC,cAAc,IAAI,MAAM;IAKlB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C5C,eAAe,IAAI,KAAK,GAAG,KAAK;IAK1B,eAAe,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CASlE"}
package/dist/config.js ADDED
@@ -0,0 +1,414 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import inquirer from 'inquirer';
5
+ import chalk from 'chalk';
6
+ import { DatabaseManager } from './database.js';
7
+ export class ConfigManager {
8
+ configDir;
9
+ configPath;
10
+ dbPath;
11
+ constructor() {
12
+ this.configDir = path.join(os.homedir(), '.ivan');
13
+ this.configPath = path.join(this.configDir, 'config.json');
14
+ this.dbPath = path.join(this.configDir, 'db.sqlite');
15
+ }
16
+ ensureConfigDir() {
17
+ if (!fs.existsSync(this.configDir)) {
18
+ fs.mkdirSync(this.configDir, { recursive: true });
19
+ }
20
+ }
21
+ async ensureDatabase() {
22
+ if (!fs.existsSync(this.dbPath)) {
23
+ fs.writeFileSync(this.dbPath, '');
24
+ console.log(chalk.green('✅ Database created'));
25
+ }
26
+ const dbManager = new DatabaseManager();
27
+ try {
28
+ await dbManager.runMigrations();
29
+ }
30
+ finally {
31
+ dbManager.close();
32
+ }
33
+ }
34
+ isConfigured() {
35
+ return fs.existsSync(this.configPath);
36
+ }
37
+ getConfig() {
38
+ if (!this.isConfigured()) {
39
+ return null;
40
+ }
41
+ try {
42
+ const configData = fs.readFileSync(this.configPath, 'utf8');
43
+ return JSON.parse(configData);
44
+ }
45
+ catch (error) {
46
+ console.error(chalk.red('Error reading config file:'), error);
47
+ return null;
48
+ }
49
+ }
50
+ async saveConfig(config) {
51
+ this.ensureConfigDir();
52
+ await this.ensureDatabase();
53
+ try {
54
+ fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2));
55
+ console.log(chalk.green('Configuration saved successfully!'));
56
+ }
57
+ catch (error) {
58
+ console.error(chalk.red('Error saving config:'), error);
59
+ throw error;
60
+ }
61
+ }
62
+ isClaudeCodeInstalled() {
63
+ // No longer needed with SDK
64
+ return true;
65
+ }
66
+ async setup() {
67
+ console.log(chalk.blue.bold('🤖 Ivan Configuration Setup'));
68
+ console.log('');
69
+ // First ask about executor type
70
+ const executorAnswers = await inquirer.prompt([
71
+ {
72
+ type: 'list',
73
+ name: 'executorType',
74
+ message: 'How do you want to run Claude Code?',
75
+ choices: [
76
+ {
77
+ name: 'SDK - Use Anthropic API directly (requires API key)',
78
+ value: 'sdk'
79
+ },
80
+ {
81
+ name: 'CLI - Use Claude Code CLI installed on your machine (for Claude Max users)',
82
+ value: 'cli'
83
+ }
84
+ ],
85
+ default: 'sdk'
86
+ }
87
+ ]);
88
+ const executorType = executorAnswers.executorType;
89
+ // Build questions based on executor type
90
+ const questions = [
91
+ {
92
+ type: 'password',
93
+ name: 'openaiApiKey',
94
+ message: 'Enter your OpenAI API key:',
95
+ validate: (input) => {
96
+ if (!input || input.trim().length === 0) {
97
+ return 'OpenAI API key is required';
98
+ }
99
+ if (!input.startsWith('sk-')) {
100
+ return 'OpenAI API key should start with "sk-"';
101
+ }
102
+ return true;
103
+ },
104
+ mask: '*'
105
+ }
106
+ ];
107
+ // Only ask for Anthropic API key if using SDK executor
108
+ if (executorType === 'sdk') {
109
+ questions.push({
110
+ type: 'password',
111
+ name: 'anthropicApiKey',
112
+ message: 'Enter your Anthropic API key:',
113
+ validate: (input) => {
114
+ if (!input || input.trim().length === 0) {
115
+ return 'Anthropic API key is required';
116
+ }
117
+ if (!input.startsWith('sk-ant-')) {
118
+ return 'Anthropic API key should start with "sk-ant-"';
119
+ }
120
+ return true;
121
+ },
122
+ mask: '*'
123
+ });
124
+ }
125
+ const answers = await inquirer.prompt(questions);
126
+ const config = {
127
+ openaiApiKey: answers.openaiApiKey.trim(),
128
+ anthropicApiKey: executorType === 'sdk' ? answers.anthropicApiKey.trim() : '',
129
+ version: '1.0.0',
130
+ executorType: executorType
131
+ };
132
+ await this.saveConfig(config);
133
+ console.log('');
134
+ console.log(chalk.green('🎉 Ivan is now configured and ready to use!'));
135
+ }
136
+ async reconfigure() {
137
+ console.log(chalk.blue.bold('🔧 Ivan Reconfiguration'));
138
+ console.log('');
139
+ if (this.isConfigured()) {
140
+ const currentConfig = this.getConfig();
141
+ if (currentConfig) {
142
+ console.log(chalk.yellow('Current configuration found.'));
143
+ }
144
+ }
145
+ await this.setup();
146
+ }
147
+ async getRepoInstructions(repoPath) {
148
+ const config = this.getConfig();
149
+ if (!config || !config.repoInstructions) {
150
+ return undefined;
151
+ }
152
+ return config.repoInstructions[repoPath];
153
+ }
154
+ async hasDeclinedRepoInstructions(repoPath) {
155
+ const config = this.getConfig();
156
+ if (!config || !config.repoInstructionsDeclined) {
157
+ return false;
158
+ }
159
+ return config.repoInstructionsDeclined[repoPath] === true;
160
+ }
161
+ async markRepoInstructionsDeclined(repoPath) {
162
+ const config = this.getConfig();
163
+ if (!config) {
164
+ throw new Error('Configuration not found');
165
+ }
166
+ if (!config.repoInstructionsDeclined) {
167
+ config.repoInstructionsDeclined = {};
168
+ }
169
+ config.repoInstructionsDeclined[repoPath] = true;
170
+ await this.saveConfig(config);
171
+ }
172
+ async setRepoInstructions(repoPath, instructions) {
173
+ const config = this.getConfig();
174
+ if (!config) {
175
+ throw new Error('Configuration not found');
176
+ }
177
+ if (!config.repoInstructions) {
178
+ config.repoInstructions = {};
179
+ }
180
+ config.repoInstructions[repoPath] = instructions;
181
+ await this.saveConfig(config);
182
+ }
183
+ async promptForMissingConfig(configKey) {
184
+ console.log(chalk.yellow(`⚠️ ${configKey === 'openaiApiKey' ? 'OpenAI' : 'Anthropic'} API key is missing or invalid.`));
185
+ console.log('');
186
+ const promptConfig = configKey === 'openaiApiKey' ? {
187
+ type: 'password',
188
+ name: 'apiKey',
189
+ message: 'Enter your OpenAI API key:',
190
+ validate: (input) => {
191
+ if (!input || input.trim().length === 0) {
192
+ return 'OpenAI API key is required';
193
+ }
194
+ if (!input.startsWith('sk-')) {
195
+ return 'OpenAI API key should start with "sk-"';
196
+ }
197
+ return true;
198
+ },
199
+ mask: '*'
200
+ } : {
201
+ type: 'password',
202
+ name: 'apiKey',
203
+ message: 'Enter your Anthropic API key:',
204
+ validate: (input) => {
205
+ if (!input || input.trim().length === 0) {
206
+ return 'Anthropic API key is required';
207
+ }
208
+ if (!input.startsWith('sk-ant-')) {
209
+ return 'Anthropic API key should start with "sk-ant-"';
210
+ }
211
+ return true;
212
+ },
213
+ mask: '*'
214
+ };
215
+ const answers = await inquirer.prompt([promptConfig]);
216
+ const apiKey = answers.apiKey.trim();
217
+ // Update the configuration
218
+ let config = this.getConfig();
219
+ if (!config) {
220
+ config = {
221
+ openaiApiKey: '',
222
+ anthropicApiKey: '',
223
+ version: '1.0.0'
224
+ };
225
+ }
226
+ config[configKey] = apiKey;
227
+ await this.saveConfig(config);
228
+ console.log(chalk.green(`✅ ${configKey === 'openaiApiKey' ? 'OpenAI' : 'Anthropic'} API key saved successfully!`));
229
+ console.log('');
230
+ return apiKey;
231
+ }
232
+ async getRepoAllowedTools(repoPath) {
233
+ const config = this.getConfig();
234
+ if (!config || !config.repoAllowedTools) {
235
+ return undefined;
236
+ }
237
+ return config.repoAllowedTools[repoPath];
238
+ }
239
+ async setRepoAllowedTools(repoPath, allowedTools) {
240
+ const config = this.getConfig();
241
+ if (!config) {
242
+ throw new Error('Configuration not found');
243
+ }
244
+ if (!config.repoAllowedTools) {
245
+ config.repoAllowedTools = {};
246
+ }
247
+ config.repoAllowedTools[repoPath] = allowedTools;
248
+ await this.saveConfig(config);
249
+ }
250
+ async promptForRepoInstructions(repoPath) {
251
+ console.log(chalk.blue.bold('📝 Repository-Specific Instructions'));
252
+ console.log(chalk.gray(`Repository: ${repoPath}`));
253
+ console.log('');
254
+ console.log(chalk.yellow('You can set repository-specific instructions that will be appended to every task.'));
255
+ console.log(chalk.gray('Examples: coding style guidelines, frameworks to use, patterns to follow, etc.'));
256
+ console.log('');
257
+ const answers = await inquirer.prompt([
258
+ {
259
+ type: 'editor',
260
+ name: 'instructions',
261
+ message: 'Enter repository-specific instructions (press Enter to open editor):',
262
+ default: '# Repository-specific instructions\n# These will be appended to every task in this repository\n# Examples:\n# - Use TypeScript for all new files\n# - Follow existing patterns for error handling\n# - Add comprehensive tests for new features\n',
263
+ validate: (input) => {
264
+ const cleanedInput = input.replace(/^#.*$/gm, '').trim();
265
+ if (cleanedInput.length === 0) {
266
+ return 'Please provide some instructions or press Ctrl+C to skip';
267
+ }
268
+ return true;
269
+ }
270
+ }
271
+ ]);
272
+ const cleanedInstructions = answers.instructions
273
+ .split('\n')
274
+ .filter((line) => !line.trim().startsWith('#'))
275
+ .join('\n')
276
+ .trim();
277
+ if (cleanedInstructions) {
278
+ await this.setRepoInstructions(repoPath, cleanedInstructions);
279
+ console.log(chalk.green('✅ Repository instructions saved'));
280
+ }
281
+ return cleanedInstructions;
282
+ }
283
+ async promptForRepoAllowedTools(repoPath) {
284
+ console.log(chalk.blue.bold('🔧 Repository-Specific Tool Configuration'));
285
+ console.log(chalk.gray(`Repository: ${repoPath}`));
286
+ console.log('');
287
+ console.log(chalk.yellow('Configure which tools Claude Code can use in this repository.'));
288
+ console.log(chalk.gray('Default: All tools allowed (["*"])'));
289
+ console.log(chalk.gray('Examples: ["Bash", "Read", "Write", "Edit"] or ["*"] for all tools'));
290
+ console.log('');
291
+ const answers = await inquirer.prompt([
292
+ {
293
+ type: 'input',
294
+ name: 'allowedTools',
295
+ message: 'Enter allowed tools (comma-separated, or * for all):',
296
+ default: '*',
297
+ validate: (input) => {
298
+ const trimmed = input.trim();
299
+ if (trimmed.length === 0) {
300
+ return 'Please provide at least one tool or * for all';
301
+ }
302
+ return true;
303
+ },
304
+ filter: (input) => {
305
+ const trimmed = input.trim();
306
+ if (trimmed === '*') {
307
+ return ['*'];
308
+ }
309
+ return trimmed.split(',').map(tool => tool.trim()).filter(tool => tool.length > 0);
310
+ }
311
+ }
312
+ ]);
313
+ const allowedTools = answers.allowedTools;
314
+ if (allowedTools.length > 0) {
315
+ await this.setRepoAllowedTools(repoPath, allowedTools);
316
+ console.log(chalk.green('✅ Repository tool configuration saved'));
317
+ }
318
+ return allowedTools;
319
+ }
320
+ async promptForModel() {
321
+ console.log(chalk.blue.bold('🤖 Choose Claude Model'));
322
+ console.log('');
323
+ console.log(chalk.yellow('Select which Claude model to use for code tasks'));
324
+ console.log('');
325
+ const models = [
326
+ {
327
+ name: 'Claude Sonnet 4.5 - Recommended for most tasks',
328
+ value: 'claude-sonnet-4-5-20250929',
329
+ short: 'Claude Sonnet 4.5'
330
+ },
331
+ {
332
+ name: 'Claude 3.5 Haiku - Faster, good for simpler tasks',
333
+ value: 'claude-3-5-haiku-20241022',
334
+ short: 'Claude 3.5 Haiku'
335
+ },
336
+ {
337
+ name: 'Claude Opus 4.1 - Most capable, but slower',
338
+ value: 'claude-opus-4-1-20250805',
339
+ short: 'Claude Opus 4.1'
340
+ }
341
+ ];
342
+ const answers = await inquirer.prompt([
343
+ {
344
+ type: 'list',
345
+ name: 'model',
346
+ message: 'Select Claude model:',
347
+ choices: models,
348
+ default: 'claude-sonnet-4-5-20250929'
349
+ }
350
+ ]);
351
+ const config = this.getConfig();
352
+ if (!config) {
353
+ throw new Error('Configuration not found');
354
+ }
355
+ config.claudeModel = answers.model;
356
+ await this.saveConfig(config);
357
+ const selectedModel = models.find(m => m.value === answers.model);
358
+ console.log('');
359
+ console.log(chalk.green(`✅ Model set to: ${selectedModel?.short || answers.model}`));
360
+ }
361
+ getClaudeModel() {
362
+ const config = this.getConfig();
363
+ return config?.claudeModel || 'claude-3-5-sonnet-latest';
364
+ }
365
+ async promptForExecutorType() {
366
+ console.log(chalk.blue.bold('🔧 Choose Claude Executor'));
367
+ console.log('');
368
+ console.log(chalk.yellow('Select how you want to run Claude Code'));
369
+ console.log('');
370
+ const executors = [
371
+ {
372
+ name: 'SDK - Use Anthropic API directly (requires API key)',
373
+ value: 'sdk',
374
+ short: 'SDK'
375
+ },
376
+ {
377
+ name: 'CLI - Use Claude Code CLI installed on your machine (for Claude Max users)',
378
+ value: 'cli',
379
+ short: 'CLI'
380
+ }
381
+ ];
382
+ const answers = await inquirer.prompt([
383
+ {
384
+ type: 'list',
385
+ name: 'executorType',
386
+ message: 'Select executor type:',
387
+ choices: executors,
388
+ default: 'sdk'
389
+ }
390
+ ]);
391
+ const config = this.getConfig();
392
+ if (!config) {
393
+ throw new Error('Configuration not found');
394
+ }
395
+ config.executorType = answers.executorType;
396
+ await this.saveConfig(config);
397
+ const selectedExecutor = executors.find(e => e.value === answers.executorType);
398
+ console.log('');
399
+ console.log(chalk.green(`✅ Executor set to: ${selectedExecutor?.short || answers.executorType}`));
400
+ }
401
+ getExecutorType() {
402
+ const config = this.getConfig();
403
+ return config?.executorType || 'sdk';
404
+ }
405
+ async setExecutorType(executorType) {
406
+ const config = this.getConfig();
407
+ if (!config) {
408
+ throw new Error('Configuration not found');
409
+ }
410
+ config.executorType = executorType;
411
+ await this.saveConfig(config);
412
+ }
413
+ }
414
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Kysely } from 'kysely';
2
+ import { Database as DatabaseSchema } from './types.js';
3
+ export declare class DatabaseManager {
4
+ private db;
5
+ private dbPath;
6
+ constructor();
7
+ initialize(): Promise<void>;
8
+ private runMigrations;
9
+ getDatabase(): Kysely<DatabaseSchema>;
10
+ close(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAC;AAM/C,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,YAAY,CAAC;AAIxD,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,MAAM,CAAS;;IAmBV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAY1B,aAAa;IAKpB,WAAW,IAAI,MAAM,CAAC,cAAc,CAAC;IAI/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -0,0 +1,45 @@
1
+ import { Kysely, SqliteDialect } from 'kysely';
2
+ import Database from 'better-sqlite3';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import * as os from 'os';
6
+ import chalk from 'chalk';
7
+ import { MigrationRunner } from './migration.js';
8
+ import { migrations } from './migrations/index.js';
9
+ export class DatabaseManager {
10
+ db;
11
+ dbPath;
12
+ constructor() {
13
+ const ivanDir = path.join(os.homedir(), '.ivan');
14
+ this.dbPath = path.join(ivanDir, 'db.sqlite');
15
+ if (!fs.existsSync(ivanDir)) {
16
+ fs.mkdirSync(ivanDir, { recursive: true });
17
+ }
18
+ const sqlite = new Database(this.dbPath);
19
+ this.db = new Kysely({
20
+ dialect: new SqliteDialect({
21
+ database: sqlite
22
+ })
23
+ });
24
+ }
25
+ async initialize() {
26
+ console.log(chalk.gray('🗄️ Initializing database...'));
27
+ const dbExists = fs.existsSync(this.dbPath);
28
+ if (!dbExists) {
29
+ console.log(chalk.gray('📁 Creating database file...'));
30
+ }
31
+ await this.runMigrations();
32
+ console.log(chalk.green('✓ Database initialized'));
33
+ }
34
+ async runMigrations() {
35
+ const migrationRunner = new MigrationRunner(this.db);
36
+ await migrationRunner.runMigrations(migrations);
37
+ }
38
+ getDatabase() {
39
+ return this.db;
40
+ }
41
+ async close() {
42
+ await this.db.destroy();
43
+ }
44
+ }
45
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,OAAO,eAAe;IAClB,EAAE,CAAyB;IAC3B,MAAM,CAAS;IAEvB;QACE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAiB;YACnC,OAAO,EAAE,IAAI,aAAa,CAAC;gBACzB,QAAQ,EAAE,MAAM;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { Kysely } from 'kysely';
2
+ import { Database } from './types.js';
3
+ export declare class MigrationManager {
4
+ private db;
5
+ constructor(db: Kysely<Database>);
6
+ runMigrations(): Promise<void>;
7
+ private createMigrationsTable;
8
+ private hasMigrationRun;
9
+ private recordMigration;
10
+ }
11
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/database/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAmB;gBAEjB,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;IAI1B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBtB,qBAAqB;YAWrB,eAAe;YAcf,eAAe;CAU9B"}
@@ -0,0 +1,64 @@
1
+ import { sql } from 'kysely';
2
+ import chalk from 'chalk';
3
+ import { migrations } from './migrations/index.js';
4
+ export class MigrationManager {
5
+ db;
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ async runMigrations() {
10
+ console.log(chalk.blue('🔄 Running database migrations...'));
11
+ await this.createMigrationsTable();
12
+ for (const migration of migrations) {
13
+ if (!(await this.hasMigrationRun(migration.id))) {
14
+ try {
15
+ const statements = Array.isArray(migration.up) ? migration.up : [migration.up];
16
+ for (const statement of statements) {
17
+ await sql.raw(statement).execute(this.db);
18
+ }
19
+ await this.recordMigration(migration.id, migration.name);
20
+ console.log(chalk.green(`✅ Migration ${migration.id}: ${migration.name}`));
21
+ }
22
+ catch (error) {
23
+ console.error(chalk.red(`❌ Failed to run migration ${migration.id}:`), error);
24
+ throw error;
25
+ }
26
+ }
27
+ }
28
+ console.log(chalk.green('✅ Database migrations completed'));
29
+ }
30
+ async createMigrationsTable() {
31
+ const migrationsSql = `
32
+ CREATE TABLE IF NOT EXISTS migrations (
33
+ id INTEGER PRIMARY KEY,
34
+ name TEXT NOT NULL,
35
+ executed_at DATETIME DEFAULT CURRENT_TIMESTAMP
36
+ )
37
+ `;
38
+ await sql.raw(migrationsSql).execute(this.db);
39
+ }
40
+ async hasMigrationRun(migrationId) {
41
+ try {
42
+ const result = await this.db
43
+ .selectFrom('migrations')
44
+ .select('id')
45
+ .where('id', '=', migrationId)
46
+ .executeTakeFirst();
47
+ return result !== undefined;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ async recordMigration(migrationId, name) {
54
+ await this.db
55
+ .insertInto('migrations')
56
+ .values({
57
+ id: migrationId,
58
+ name,
59
+ executed_at: new Date().toISOString()
60
+ })
61
+ .execute();
62
+ }
63
+ }
64
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/database/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,GAAG,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,OAAO,gBAAgB;IACnB,EAAE,CAAmB;IAE7B,YAAY,EAAoB;QAC9B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAE7D,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEnC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAC/E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;wBACnC,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC5C,CAAC;oBACD,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC9E,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,MAAM,aAAa,GAAG;;;;;;KAMrB,CAAC;QACF,MAAM,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAmB;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;iBACzB,UAAU,CAAC,YAAY,CAAC;iBACxB,MAAM,CAAC,IAAI,CAAC;iBACZ,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC;iBAC7B,gBAAgB,EAAE,CAAC;YAEtB,OAAO,MAAM,KAAK,SAAS,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,IAAY;QAC7D,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,YAAY,CAAC;aACxB,MAAM,CAAC;YACN,EAAE,EAAE,WAAW;YACf,IAAI;YACJ,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;aACD,OAAO,EAAE,CAAC;IACf,CAAC;CACF"}