@ariso-ai/ivan 1.0.4 → 1.0.5

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 (70) hide show
  1. package/README.md +7 -21
  2. package/dist/config.d.ts +4 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +43 -1
  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/index.js +12 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/services/address-task-executor.d.ts.map +1 -1
  13. package/dist/services/address-task-executor.js +5 -3
  14. package/dist/services/address-task-executor.js.map +1 -1
  15. package/dist/services/embedding-service.d.ts +12 -0
  16. package/dist/services/embedding-service.d.ts.map +1 -0
  17. package/dist/services/embedding-service.js +51 -0
  18. package/dist/services/embedding-service.js.map +1 -0
  19. package/dist/services/git-manager.d.ts +1 -0
  20. package/dist/services/git-manager.d.ts.map +1 -1
  21. package/dist/services/git-manager.js +10 -4
  22. package/dist/services/git-manager.js.map +1 -1
  23. package/dist/services/job-manager.d.ts +0 -1
  24. package/dist/services/job-manager.d.ts.map +1 -1
  25. package/dist/services/job-manager.js +0 -9
  26. package/dist/services/job-manager.js.map +1 -1
  27. package/dist/services/memory-service.d.ts +26 -0
  28. package/dist/services/memory-service.d.ts.map +1 -0
  29. package/dist/services/memory-service.js +128 -0
  30. package/dist/services/memory-service.js.map +1 -0
  31. package/dist/services/task-executor.d.ts.map +1 -1
  32. package/dist/services/task-executor.js +3 -7
  33. package/dist/services/task-executor.js.map +1 -1
  34. package/package.json +2 -2
  35. package/dist/agent.d.ts +0 -11
  36. package/dist/agent.d.ts.map +0 -1
  37. package/dist/agent.js +0 -48
  38. package/dist/agent.js.map +0 -1
  39. package/dist/config/config.d.ts +0 -20
  40. package/dist/config/config.d.ts.map +0 -1
  41. package/dist/config/config.js +0 -187
  42. package/dist/config/config.js.map +0 -1
  43. package/dist/database/database.d.ts +0 -12
  44. package/dist/database/database.d.ts.map +0 -1
  45. package/dist/database/database.js +0 -45
  46. package/dist/database/database.js.map +0 -1
  47. package/dist/database/migrations/001_initial_schema.d.ts +0 -3
  48. package/dist/database/migrations/001_initial_schema.d.ts.map +0 -1
  49. package/dist/database/migrations/001_initial_schema.js +0 -66
  50. package/dist/database/migrations/001_initial_schema.js.map +0 -1
  51. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts +0 -3
  52. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts.map +0 -1
  53. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js +0 -15
  54. package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js.map +0 -1
  55. package/dist/scripts/task-executor.d.ts +0 -3
  56. package/dist/scripts/task-executor.d.ts.map +0 -1
  57. package/dist/scripts/task-executor.js +0 -139
  58. package/dist/scripts/task-executor.js.map +0 -1
  59. package/dist/scripts/task-planner.d.ts +0 -3
  60. package/dist/scripts/task-planner.d.ts.map +0 -1
  61. package/dist/scripts/task-planner.js +0 -81
  62. package/dist/scripts/task-planner.js.map +0 -1
  63. package/dist/services/claude-planner.d.ts +0 -15
  64. package/dist/services/claude-planner.d.ts.map +0 -1
  65. package/dist/services/claude-planner.js +0 -107
  66. package/dist/services/claude-planner.js.map +0 -1
  67. package/dist/services/docker-orchestrator.d.ts +0 -11
  68. package/dist/services/docker-orchestrator.d.ts.map +0 -1
  69. package/dist/services/docker-orchestrator.js +0 -85
  70. package/dist/services/docker-orchestrator.js.map +0 -1
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env node
2
- import { spawn } from 'child_process';
3
- import { exec } from 'child_process';
4
- import { promisify } from 'util';
5
- const execAsync = promisify(exec);
6
- async function executeCommand(command) {
7
- try {
8
- const { stdout, stderr } = await execAsync(command);
9
- return { stdout, stderr };
10
- }
11
- catch (error) {
12
- console.error(`Command failed: ${command}`);
13
- console.error(error);
14
- throw error;
15
- }
16
- }
17
- async function main() {
18
- const env = process.env;
19
- console.log('šŸ“‹ Task Planner Starting');
20
- console.log(`Request: ${env.USER_REQUEST}\n`);
21
- try {
22
- // Clone repository
23
- console.log('šŸ“„ Cloning repository...');
24
- await executeCommand(`git clone ${env.REPOSITORY} /workspace/repo`);
25
- process.chdir('/workspace/repo');
26
- const prompt = 'Say the word "maximum"';
27
- console.log('šŸ¤” Planning tasks with Claude...');
28
- // Use spawn to call Claude with real-time output
29
- const claudeProcess = spawn('claude', [
30
- '-p',
31
- `"${prompt}"`,
32
- '--output-format',
33
- 'json',
34
- '--permission-mode',
35
- 'plan'
36
- ]);
37
- let stdout = '';
38
- let stderr = '';
39
- claudeProcess.stdout.on('data', (data) => {
40
- const chunk = data.toString();
41
- stdout += chunk;
42
- process.stdout.write(chunk);
43
- });
44
- claudeProcess.stderr.on('data', (data) => {
45
- const chunk = data.toString();
46
- stderr += chunk;
47
- process.stderr.write(chunk);
48
- });
49
- await new Promise((resolve, reject) => {
50
- claudeProcess.on('close', (code) => {
51
- if (code !== 0) {
52
- reject(new Error(`Claude CLI exited with code ${code}: ${stderr}`));
53
- }
54
- else {
55
- resolve();
56
- }
57
- });
58
- claudeProcess.on('error', (error) => {
59
- reject(new Error(`Failed to start Claude CLI: ${error}`));
60
- });
61
- });
62
- // Parse the Claude CLI response
63
- const claudeResponse = JSON.parse(stdout);
64
- // Extract the JSON from the result field (may be wrapped in ```json blocks)
65
- let resultContent = claudeResponse.result;
66
- // Remove markdown code blocks if present
67
- resultContent = resultContent.replace(/^```json\s*/, '').replace(/\s*```$/, '');
68
- const response = JSON.parse(resultContent);
69
- console.log(`āœ“ Planned ${response.tasks.length} tasks`);
70
- // Output the result as JSON for the parent process to read
71
- console.log('TASK_PLAN_START');
72
- console.log(JSON.stringify(response));
73
- console.log('TASK_PLAN_END');
74
- }
75
- catch (error) {
76
- console.error('āŒ Task planning failed:', error);
77
- process.exit(1);
78
- }
79
- }
80
- main().catch(console.error);
81
- //# sourceMappingURL=task-planner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-planner.js","sourceRoot":"","sources":["../../src/scripts/task-planner.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- export interface TaskPlan {
2
- title: string;
3
- description: string;
4
- order: number;
5
- }
6
- export interface TaskPlanResponse {
7
- tasks: TaskPlan[];
8
- }
9
- export declare class ClaudePlannerService {
10
- private repository;
11
- private anthropicApiKey;
12
- constructor(repository: string, anthropicApiKey: string);
13
- planTasks(userRequest: string): Promise<TaskPlanResponse>;
14
- }
15
- //# sourceMappingURL=claude-planner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-planner.d.ts","sourceRoot":"","sources":["../../src/services/claude-planner.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;gBAEpB,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAKjD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA+GhE"}
@@ -1,107 +0,0 @@
1
- import { exec, spawn } from 'child_process';
2
- import { promisify } from 'util';
3
- import * as path from 'path';
4
- import * as os from 'os';
5
- import chalk from 'chalk';
6
- const execAsync = promisify(exec);
7
- export class ClaudePlannerService {
8
- repository;
9
- anthropicApiKey;
10
- constructor(repository, anthropicApiKey) {
11
- this.repository = repository;
12
- this.anthropicApiKey = anthropicApiKey;
13
- }
14
- async planTasks(userRequest) {
15
- console.log(chalk.gray('šŸ¤” Planning tasks with Claude Code...'));
16
- try {
17
- const homeDir = os.homedir();
18
- const scriptPath = path.join(process.cwd(), 'dist', 'scripts', 'task-planner.js');
19
- console.log(chalk.gray('Starting planning container...'));
20
- // Start container in background
21
- const containerName = `ivan-planner-${Date.now()}`;
22
- const startCommand = `docker run -d --name ${containerName} \
23
- -e USER_REQUEST="${userRequest.replace(/"/g, '\\"')}" \
24
- -e REPOSITORY="${this.repository}" \
25
- -e HOST_HOME="${homeDir}" \
26
- -e ANTHROPIC_API_KEY="${this.anthropicApiKey}" \
27
- -w /workspace \
28
- node:24-alpine \
29
- sleep 300`;
30
- await execAsync(startCommand);
31
- let stdout = '';
32
- let stderr = '';
33
- try {
34
- // Create app directory and copy scripts to container
35
- await execAsync(`docker exec ${containerName} mkdir -p /app`);
36
- await execAsync(`docker cp "${scriptPath}" ${containerName}:/app/task-planner.js`);
37
- const setupScript = path.join(process.cwd(), 'src', 'scripts', 'setup-container.sh');
38
- await execAsync(`docker cp "${setupScript}" ${containerName}:/app/setup-container.sh`);
39
- // Copy SSH and git configs
40
- await execAsync(`docker exec ${containerName} mkdir -p /root/.ssh /root/.claude/plugins`);
41
- await execAsync(`docker cp "${homeDir}/.ssh/." ${containerName}:/root/.ssh/`).catch(() => { });
42
- await execAsync(`docker cp "${homeDir}/.claude/." ${containerName}:/root/.claude/`).catch(() => { });
43
- await execAsync(`docker cp "${homeDir}/.gitconfig" ${containerName}:/root/.gitconfig`).catch(() => { });
44
- console.log('running docker');
45
- // Execute setup and task planning with streaming output
46
- const dockerProcess = spawn('docker', [
47
- 'exec', containerName, 'sh', '-c',
48
- 'chmod +x /app/setup-container.sh && /app/setup-container.sh && echo "Starting task planner..." && CLAUDE_CONFIG_DIR=/root/.claude node /app/task-planner.js'
49
- ]);
50
- dockerProcess.stdout.on('data', (data) => {
51
- const chunk = data.toString();
52
- stdout += chunk;
53
- process.stdout.write(chunk);
54
- });
55
- dockerProcess.stderr.on('data', (data) => {
56
- const chunk = data.toString();
57
- stderr += chunk;
58
- process.stderr.write(chunk);
59
- });
60
- await new Promise((resolve, reject) => {
61
- dockerProcess.on('close', (code) => {
62
- if (code !== 0) {
63
- reject(new Error(`Docker exec exited with code ${code}`));
64
- }
65
- else {
66
- resolve();
67
- }
68
- });
69
- dockerProcess.on('error', (error) => {
70
- reject(new Error(`Failed to execute docker command: ${error}`));
71
- });
72
- });
73
- console.log(chalk.gray('=== CONTAINER OUTPUT START ==='));
74
- console.log(stdout);
75
- console.log(chalk.gray('=== CONTAINER OUTPUT END ==='));
76
- if (stderr) {
77
- console.log(chalk.yellow('=== CONTAINER STDERR START ==='));
78
- console.log(stderr);
79
- console.log(chalk.yellow('=== CONTAINER STDERR END ==='));
80
- }
81
- }
82
- finally {
83
- // Clean up container
84
- await execAsync(`docker rm -f ${containerName}`).catch(() => { });
85
- }
86
- // Extract the JSON response from between the markers
87
- const startMarker = 'TASK_PLAN_START';
88
- const endMarker = 'TASK_PLAN_END';
89
- const startIndex = stdout.indexOf(startMarker);
90
- const endIndex = stdout.indexOf(endMarker);
91
- if (startIndex === -1 || endIndex === -1) {
92
- console.log(chalk.red('Failed to find task plan in output:'));
93
- console.log(stdout);
94
- throw new Error('Task plan markers not found in output');
95
- }
96
- const jsonString = stdout.substring(startIndex + startMarker.length, endIndex).trim();
97
- const response = JSON.parse(jsonString);
98
- console.log(chalk.green(`āœ“ Planned ${response.tasks.length} tasks`));
99
- return response;
100
- }
101
- catch (error) {
102
- console.error(chalk.red('Failed to plan tasks:'), error);
103
- throw new Error('Task planning failed');
104
- }
105
- }
106
- }
107
- //# sourceMappingURL=claude-planner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-planner.js","sourceRoot":"","sources":["../../src/services/claude-planner.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import { TaskTable } from '../database/types.js';
2
- import { JobManager } from './job-manager.js';
3
- export declare class DockerOrchestrator {
4
- private jobManager;
5
- private repository;
6
- private openAiApiKey;
7
- constructor(jobManager: JobManager, repository: string, openAiApiKey: string);
8
- runTask(task: TaskTable): Promise<void>;
9
- runAllTasks(jobId: number): Promise<void>;
10
- }
11
- //# sourceMappingURL=docker-orchestrator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docker-orchestrator.d.ts","sourceRoot":"","sources":["../../src/services/docker-orchestrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAMtE,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA8DvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAchD"}
@@ -1,85 +0,0 @@
1
- import { exec } from 'child_process';
2
- import { promisify } from 'util';
3
- import * as path from 'path';
4
- import * as os from 'os';
5
- import chalk from 'chalk';
6
- const execAsync = promisify(exec);
7
- export class DockerOrchestrator {
8
- jobManager;
9
- repository;
10
- openAiApiKey;
11
- constructor(jobManager, repository, openAiApiKey) {
12
- this.jobManager = jobManager;
13
- this.repository = repository;
14
- this.openAiApiKey = openAiApiKey;
15
- }
16
- async runTask(task) {
17
- console.log(chalk.blue(`\n🐳 Running task: ${task.title}`));
18
- if (!task.id) {
19
- throw new Error('Task ID is required');
20
- }
21
- await this.jobManager.updateTaskStatus(task.id, 'in_progress');
22
- try {
23
- const containerName = `ivan-task-${task.id}`;
24
- const branchName = `ivan/${task.title}`;
25
- const homeDir = os.homedir();
26
- const scriptPath = path.join(process.cwd(), 'dist', 'scripts', 'task-executor.js');
27
- // Build Docker command
28
- const dockerCommand = `docker run --rm \
29
- --name ${containerName} \
30
- -v ${scriptPath}:/app/task-executor.js:ro \
31
- -v ${homeDir}/.ivan/db.sqlite:${homeDir}/.ivan/db.sqlite \
32
- -e TASK_ID="${task.id}" \
33
- -e TASK_TITLE="${task.title}" \
34
- -e TASK_DESCRIPTION="${task.description}" \
35
- -e BRANCH_NAME="${branchName}" \
36
- -e REPOSITORY="${this.repository}" \
37
- -e OPENAI_API_KEY="${this.openAiApiKey}" \
38
- -e IVAN_DB_PATH="${homeDir}/.ivan/db.sqlite" \
39
- -e CLAUDE_DIR="${homeDir}/.claude" \
40
- -e SSH_DIR="${homeDir}/.ssh" \
41
- -e GIT_CONFIG="${homeDir}/.gitconfig" \
42
- -w /workspace \
43
- node:24-alpine \
44
- sh -c "apk add --no-cache git openssh && \
45
- mkdir -p /root/.ssh /root/.claude/plugins && \
46
- cp -r \${CLAUDE_DIR}/* /root/.claude/ 2>/dev/null || true && \
47
- cp -r \${SSH_DIR}/* /root/.ssh/ 2>/dev/null || true && \
48
- cp \${GIT_CONFIG} /root/.gitconfig 2>/dev/null || true && \
49
- chmod 600 /root/.ssh/* 2>/dev/null || true && \
50
- ssh-keyscan -H github.com >> /root/.ssh/known_hosts 2>/dev/null || true && \
51
- git config --global user.name 'Ivan Agent' 2>/dev/null || true && \
52
- git config --global user.email 'ivan@agent.local' 2>/dev/null || true && \
53
- npm i -g @anthropic-ai/claude-code && \
54
- echo 'Starting task executor...' && \
55
- CLAUDE_CONFIG_DIR=/root/.claude node /app/task-executor.js"`;
56
- console.log(chalk.gray('Starting Docker container...'));
57
- const { stdout, stderr } = await execAsync(dockerCommand);
58
- if (stdout)
59
- console.log(chalk.gray(stdout));
60
- if (stderr)
61
- console.error(chalk.yellow(stderr));
62
- await this.jobManager.updateTaskStatus(task.id, 'completed');
63
- console.log(chalk.green(`āœ“ Task ${task.title} completed`));
64
- }
65
- catch (error) {
66
- console.error(chalk.red(`āœ— Task ${task.title} failed:`), error);
67
- await this.jobManager.updateTaskStatus(task.id, 'failed');
68
- throw error;
69
- }
70
- }
71
- async runAllTasks(jobId) {
72
- const tasks = await this.jobManager.getJobTasks(jobId);
73
- console.log(chalk.cyan(`\nšŸš€ Running ${tasks.length} tasks for job #${jobId}\n`));
74
- for (const task of tasks) {
75
- try {
76
- await this.runTask(task);
77
- console.log(chalk.gray('─'.repeat(50)));
78
- }
79
- catch {
80
- console.error(chalk.red(`Failed to run task ${task.title}, continuing with next task...`));
81
- }
82
- }
83
- }
84
- }
85
- //# sourceMappingURL=docker-orchestrator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docker-orchestrator.js","sourceRoot":"","sources":["../../src/services/docker-orchestrator.ts"],"names":[],"mappings":"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"}