@kosuke-ai/cli 0.0.57 ā 1.0.1-next.2
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 +47 -434
- package/dist/commands/auth.js +117 -0
- package/dist/generated/commands/deploy/cancel.js +17 -0
- package/dist/generated/commands/deploy/messages.js +17 -0
- package/dist/generated/commands/deploy/run.js +60 -0
- package/dist/generated/commands/index.js +132 -0
- package/dist/generated/commands/preview/get.js +25 -0
- package/dist/generated/commands/preview/health.js +25 -0
- package/dist/generated/commands/preview/reset.js +27 -0
- package/dist/generated/commands/preview/share-create.js +36 -0
- package/dist/generated/commands/preview/share-delete.js +26 -0
- package/dist/generated/commands/preview/share-get.js +26 -0
- package/dist/generated/commands/preview/shared.js +17 -0
- package/dist/generated/commands/projects/create.js +37 -0
- package/dist/generated/commands/projects/delete.js +17 -0
- package/dist/generated/commands/projects/env-vars-add.js +21 -0
- package/dist/generated/commands/projects/env-vars-remove.js +21 -0
- package/dist/generated/commands/projects/get.js +17 -0
- package/dist/generated/commands/projects/list.js +15 -0
- package/dist/generated/commands/projects/services-add.js +87 -0
- package/dist/generated/commands/projects/services-list.js +18 -0
- package/dist/generated/commands/projects/services-remove.js +19 -0
- package/dist/generated/commands/projects/services-update.js +81 -0
- package/dist/generated/commands/projects/settings-get.js +18 -0
- package/dist/generated/commands/projects/settings-import.js +91 -0
- package/dist/generated/commands/projects/settings-update.js +77 -0
- package/dist/generated/commands/projects/skills.js +35 -0
- package/dist/generated/commands/projects/update.js +27 -0
- package/dist/generated/commands/sessions/activate.js +18 -0
- package/dist/generated/commands/sessions/checklist-generate.js +19 -0
- package/dist/generated/commands/sessions/checklist-get.js +19 -0
- package/dist/generated/commands/sessions/comments-add.js +63 -0
- package/dist/generated/commands/sessions/comments-delete.js +20 -0
- package/dist/generated/commands/sessions/comments-list.js +19 -0
- package/dist/generated/commands/sessions/comments-update.js +23 -0
- package/dist/generated/commands/sessions/create.js +126 -0
- package/dist/generated/commands/sessions/delete.js +18 -0
- package/dist/generated/commands/sessions/diff-files.js +19 -0
- package/dist/generated/commands/sessions/diff-patch.js +86 -0
- package/dist/generated/commands/sessions/edit-prompt.js +59 -0
- package/dist/generated/commands/sessions/files-get.js +27 -0
- package/dist/generated/commands/sessions/files-list.js +19 -0
- package/dist/generated/commands/sessions/files-write.js +41 -0
- package/dist/generated/commands/sessions/get.js +18 -0
- package/dist/generated/commands/sessions/git-commit-message.js +19 -0
- package/dist/generated/commands/sessions/git-commit.js +29 -0
- package/dist/generated/commands/sessions/git-push.js +19 -0
- package/dist/generated/commands/sessions/git-state.js +19 -0
- package/dist/generated/commands/sessions/jobs-cancel.js +20 -0
- package/dist/generated/commands/sessions/jobs-get.js +20 -0
- package/dist/generated/commands/sessions/list.js +81 -0
- package/dist/generated/commands/sessions/messages.js +18 -0
- package/dist/generated/commands/sessions/search.js +23 -0
- package/dist/generated/commands/sessions/send.js +98 -0
- package/dist/generated/commands/sessions/update.js +72 -0
- package/dist/generated/commands/workspaces/access-status.js +29 -0
- package/dist/generated/commands/workspaces/ai-provider-get.js +18 -0
- package/dist/generated/commands/workspaces/ai-provider-remove.js +42 -0
- package/dist/generated/commands/workspaces/ai-provider-set.js +21 -0
- package/dist/generated/commands/workspaces/credits.js +17 -0
- package/dist/generated/commands/workspaces/get.js +17 -0
- package/dist/generated/commands/workspaces/getting-started-get.js +18 -0
- package/dist/generated/commands/workspaces/getting-started-update.js +32 -0
- package/dist/generated/commands/workspaces/list.js +15 -0
- package/dist/generated/commands/workspaces/members.js +25 -0
- package/dist/generated/commands/workspaces/sandbox-limit.js +17 -0
- package/dist/generated/commands/workspaces/stop-sandboxes.js +27 -0
- package/dist/generated/commands/workspaces/usage.js +32 -0
- package/dist/index.js +5 -595
- package/dist/program.js +46 -0
- package/dist/runtime/attach.js +139 -0
- package/dist/runtime/attachments.js +58 -0
- package/dist/runtime/client.js +12 -0
- package/dist/runtime/config.js +49 -0
- package/dist/runtime/credentials.js +24 -0
- package/dist/runtime/descriptor.js +7 -0
- package/dist/runtime/invoke.js +152 -0
- package/dist/runtime/runtime.js +41 -0
- package/dist/runtime/version.js +5 -0
- package/openapi.json +5222 -0
- package/package.json +21 -79
- package/LICENSE +0 -21
- package/claude.costs.json +0 -34
- package/dist/__tests__/utils/file-discovery.test.d.ts +0 -5
- package/dist/__tests__/utils/file-discovery.test.d.ts.map +0 -1
- package/dist/__tests__/utils/file-discovery.test.js +0 -51
- package/dist/__tests__/utils/file-discovery.test.js.map +0 -1
- package/dist/__tests__/utils/logger-nologs.test.d.ts +0 -5
- package/dist/__tests__/utils/logger-nologs.test.d.ts.map +0 -1
- package/dist/__tests__/utils/logger-nologs.test.js +0 -34
- package/dist/__tests__/utils/logger-nologs.test.js.map +0 -1
- package/dist/__tests__/utils/logger.test.d.ts +0 -5
- package/dist/__tests__/utils/logger.test.d.ts.map +0 -1
- package/dist/__tests__/utils/logger.test.js +0 -243
- package/dist/__tests__/utils/logger.test.js.map +0 -1
- package/dist/__tests__/utils/validator.test.d.ts +0 -5
- package/dist/__tests__/utils/validator.test.d.ts.map +0 -1
- package/dist/__tests__/utils/validator.test.js +0 -206
- package/dist/__tests__/utils/validator.test.js.map +0 -1
- package/dist/index.d.ts +0 -37
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/kosuke/commands/analyse.d.ts +0 -15
- package/dist/kosuke/commands/analyse.d.ts.map +0 -1
- package/dist/kosuke/commands/analyse.js +0 -304
- package/dist/kosuke/commands/analyse.js.map +0 -1
- package/dist/kosuke/commands/build.d.ts +0 -35
- package/dist/kosuke/commands/build.d.ts.map +0 -1
- package/dist/kosuke/commands/build.js +0 -660
- package/dist/kosuke/commands/build.js.map +0 -1
- package/dist/kosuke/commands/fix.d.ts +0 -21
- package/dist/kosuke/commands/fix.d.ts.map +0 -1
- package/dist/kosuke/commands/fix.js +0 -256
- package/dist/kosuke/commands/fix.js.map +0 -1
- package/dist/kosuke/commands/getcode.d.ts +0 -29
- package/dist/kosuke/commands/getcode.d.ts.map +0 -1
- package/dist/kosuke/commands/getcode.js +0 -248
- package/dist/kosuke/commands/getcode.js.map +0 -1
- package/dist/kosuke/commands/lint.d.ts +0 -21
- package/dist/kosuke/commands/lint.d.ts.map +0 -1
- package/dist/kosuke/commands/lint.js +0 -342
- package/dist/kosuke/commands/lint.js.map +0 -1
- package/dist/kosuke/commands/migrate.d.ts +0 -38
- package/dist/kosuke/commands/migrate.d.ts.map +0 -1
- package/dist/kosuke/commands/migrate.js +0 -284
- package/dist/kosuke/commands/migrate.js.map +0 -1
- package/dist/kosuke/commands/plan.d.ts +0 -28
- package/dist/kosuke/commands/plan.d.ts.map +0 -1
- package/dist/kosuke/commands/plan.js +0 -684
- package/dist/kosuke/commands/plan.js.map +0 -1
- package/dist/kosuke/commands/requirements.d.ts +0 -52
- package/dist/kosuke/commands/requirements.d.ts.map +0 -1
- package/dist/kosuke/commands/requirements.js +0 -615
- package/dist/kosuke/commands/requirements.js.map +0 -1
- package/dist/kosuke/commands/review.d.ts +0 -26
- package/dist/kosuke/commands/review.d.ts.map +0 -1
- package/dist/kosuke/commands/review.js +0 -303
- package/dist/kosuke/commands/review.js.map +0 -1
- package/dist/kosuke/commands/serve.d.ts +0 -9
- package/dist/kosuke/commands/serve.d.ts.map +0 -1
- package/dist/kosuke/commands/serve.js +0 -17
- package/dist/kosuke/commands/serve.js.map +0 -1
- package/dist/kosuke/commands/ship.d.ts +0 -37
- package/dist/kosuke/commands/ship.d.ts.map +0 -1
- package/dist/kosuke/commands/ship.js +0 -375
- package/dist/kosuke/commands/ship.js.map +0 -1
- package/dist/kosuke/commands/sync-rules.d.ts +0 -9
- package/dist/kosuke/commands/sync-rules.d.ts.map +0 -1
- package/dist/kosuke/commands/sync-rules.js +0 -414
- package/dist/kosuke/commands/sync-rules.js.map +0 -1
- package/dist/kosuke/commands/test.d.ts +0 -42
- package/dist/kosuke/commands/test.d.ts.map +0 -1
- package/dist/kosuke/commands/test.js +0 -540
- package/dist/kosuke/commands/test.js.map +0 -1
- package/dist/kosuke/commands/tickets.d.ts +0 -43
- package/dist/kosuke/commands/tickets.d.ts.map +0 -1
- package/dist/kosuke/commands/tickets.js +0 -876
- package/dist/kosuke/commands/tickets.js.map +0 -1
- package/dist/kosuke/commands/validate-tickets.d.ts +0 -23
- package/dist/kosuke/commands/validate-tickets.d.ts.map +0 -1
- package/dist/kosuke/commands/validate-tickets.js +0 -360
- package/dist/kosuke/commands/validate-tickets.js.map +0 -1
- package/dist/kosuke/serve/middleware/error-handler.d.ts +0 -14
- package/dist/kosuke/serve/middleware/error-handler.d.ts.map +0 -1
- package/dist/kosuke/serve/middleware/error-handler.js +0 -42
- package/dist/kosuke/serve/middleware/error-handler.js.map +0 -1
- package/dist/kosuke/serve/middleware/validation.d.ts +0 -13
- package/dist/kosuke/serve/middleware/validation.d.ts.map +0 -1
- package/dist/kosuke/serve/middleware/validation.js +0 -38
- package/dist/kosuke/serve/middleware/validation.js.map +0 -1
- package/dist/kosuke/serve/routes/build.d.ts +0 -6
- package/dist/kosuke/serve/routes/build.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/build.js +0 -226
- package/dist/kosuke/serve/routes/build.js.map +0 -1
- package/dist/kosuke/serve/routes/health.d.ts +0 -6
- package/dist/kosuke/serve/routes/health.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/health.js +0 -11
- package/dist/kosuke/serve/routes/health.js.map +0 -1
- package/dist/kosuke/serve/routes/plan.d.ts +0 -6
- package/dist/kosuke/serve/routes/plan.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/plan.js +0 -106
- package/dist/kosuke/serve/routes/plan.js.map +0 -1
- package/dist/kosuke/serve/server.d.ts +0 -16
- package/dist/kosuke/serve/server.d.ts.map +0 -1
- package/dist/kosuke/serve/server.js +0 -67
- package/dist/kosuke/serve/server.js.map +0 -1
- package/dist/kosuke/serve/validation/build.d.ts +0 -41
- package/dist/kosuke/serve/validation/build.d.ts.map +0 -1
- package/dist/kosuke/serve/validation/build.js +0 -20
- package/dist/kosuke/serve/validation/build.js.map +0 -1
- package/dist/kosuke/serve/validation/plan.d.ts +0 -26
- package/dist/kosuke/serve/validation/plan.d.ts.map +0 -1
- package/dist/kosuke/serve/validation/plan.js +0 -15
- package/dist/kosuke/serve/validation/plan.js.map +0 -1
- package/dist/kosuke/types.d.ts +0 -539
- package/dist/kosuke/types.d.ts.map +0 -1
- package/dist/kosuke/types.js +0 -5
- package/dist/kosuke/types.js.map +0 -1
- package/dist/kosuke/utils/batch-creator.d.ts +0 -14
- package/dist/kosuke/utils/batch-creator.d.ts.map +0 -1
- package/dist/kosuke/utils/batch-creator.js +0 -76
- package/dist/kosuke/utils/batch-creator.js.map +0 -1
- package/dist/kosuke/utils/claude-agent.d.ts +0 -140
- package/dist/kosuke/utils/claude-agent.d.ts.map +0 -1
- package/dist/kosuke/utils/claude-agent.js +0 -388
- package/dist/kosuke/utils/claude-agent.js.map +0 -1
- package/dist/kosuke/utils/constants.d.ts +0 -40
- package/dist/kosuke/utils/constants.d.ts.map +0 -1
- package/dist/kosuke/utils/constants.js +0 -54
- package/dist/kosuke/utils/constants.js.map +0 -1
- package/dist/kosuke/utils/file-discovery.d.ts +0 -15
- package/dist/kosuke/utils/file-discovery.d.ts.map +0 -1
- package/dist/kosuke/utils/file-discovery.js +0 -80
- package/dist/kosuke/utils/file-discovery.js.map +0 -1
- package/dist/kosuke/utils/git.d.ts +0 -41
- package/dist/kosuke/utils/git.d.ts.map +0 -1
- package/dist/kosuke/utils/git.js +0 -145
- package/dist/kosuke/utils/git.js.map +0 -1
- package/dist/kosuke/utils/github.d.ts +0 -17
- package/dist/kosuke/utils/github.d.ts.map +0 -1
- package/dist/kosuke/utils/github.js +0 -22
- package/dist/kosuke/utils/github.js.map +0 -1
- package/dist/kosuke/utils/interactive-input.d.ts +0 -22
- package/dist/kosuke/utils/interactive-input.d.ts.map +0 -1
- package/dist/kosuke/utils/interactive-input.js +0 -124
- package/dist/kosuke/utils/interactive-input.js.map +0 -1
- package/dist/kosuke/utils/json-parser.d.ts +0 -14
- package/dist/kosuke/utils/json-parser.d.ts.map +0 -1
- package/dist/kosuke/utils/json-parser.js +0 -40
- package/dist/kosuke/utils/json-parser.js.map +0 -1
- package/dist/kosuke/utils/logger.d.ts +0 -161
- package/dist/kosuke/utils/logger.d.ts.map +0 -1
- package/dist/kosuke/utils/logger.js +0 -234
- package/dist/kosuke/utils/logger.js.map +0 -1
- package/dist/kosuke/utils/playwright-mcp-client.d.ts +0 -46
- package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +0 -1
- package/dist/kosuke/utils/playwright-mcp-client.js +0 -135
- package/dist/kosuke/utils/playwright-mcp-client.js.map +0 -1
- package/dist/kosuke/utils/pr-orchestrator.d.ts +0 -49
- package/dist/kosuke/utils/pr-orchestrator.d.ts.map +0 -1
- package/dist/kosuke/utils/pr-orchestrator.js +0 -154
- package/dist/kosuke/utils/pr-orchestrator.js.map +0 -1
- package/dist/kosuke/utils/repository-manager.d.ts +0 -13
- package/dist/kosuke/utils/repository-manager.d.ts.map +0 -1
- package/dist/kosuke/utils/repository-manager.js +0 -94
- package/dist/kosuke/utils/repository-manager.js.map +0 -1
- package/dist/kosuke/utils/repository-resolver.d.ts +0 -12
- package/dist/kosuke/utils/repository-resolver.d.ts.map +0 -1
- package/dist/kosuke/utils/repository-resolver.js +0 -186
- package/dist/kosuke/utils/repository-resolver.js.map +0 -1
- package/dist/kosuke/utils/tickets-manager.d.ts +0 -34
- package/dist/kosuke/utils/tickets-manager.d.ts.map +0 -1
- package/dist/kosuke/utils/tickets-manager.js +0 -106
- package/dist/kosuke/utils/tickets-manager.js.map +0 -1
- package/dist/kosuke/utils/validator.d.ts +0 -45
- package/dist/kosuke/utils/validator.d.ts.map +0 -1
- package/dist/kosuke/utils/validator.js +0 -248
- package/dist/kosuke/utils/validator.js.map +0 -1
- package/dist/lib.d.ts +0 -104
- package/dist/lib.d.ts.map +0 -1
- package/dist/lib.js +0 -104
- package/dist/lib.js.map +0 -1
- package/dist/package.json +0 -99
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lint command - Comprehensive code quality validation and fixing
|
|
3
|
-
*
|
|
4
|
-
* Strategy: Run all validation steps (format, lint, typecheck, test, knip),
|
|
5
|
-
* give errors to Claude, let it fix them
|
|
6
|
-
*/
|
|
7
|
-
import { execSync } from 'child_process';
|
|
8
|
-
import { runAgentStream, logAssistantMessage, logToolUsage } from '../utils/claude-agent.js';
|
|
9
|
-
import { runWithPR } from '../utils/pr-orchestrator.js';
|
|
10
|
-
import { detectPackageManager, readPackageJsonScripts, runFormat, runLint, runTypecheck, } from '../utils/validator.js';
|
|
11
|
-
/**
|
|
12
|
-
* Run tests using package.json test script
|
|
13
|
-
*/
|
|
14
|
-
async function runTests(cwd = process.cwd()) {
|
|
15
|
-
const { readPackageJsonScripts, detectPackageManager } = await import('../utils/validator.js');
|
|
16
|
-
const scripts = readPackageJsonScripts(cwd);
|
|
17
|
-
if (!scripts || !scripts.test) {
|
|
18
|
-
return {
|
|
19
|
-
success: true,
|
|
20
|
-
warning: 'ā ļø No test script found in package.json. Skipping tests.',
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
const packageManager = detectPackageManager(cwd);
|
|
24
|
-
const command = `${packageManager} run test`;
|
|
25
|
-
try {
|
|
26
|
-
const output = execSync(command, {
|
|
27
|
-
cwd,
|
|
28
|
-
encoding: 'utf-8',
|
|
29
|
-
stdio: 'pipe',
|
|
30
|
-
});
|
|
31
|
-
return { success: true, output };
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
const err = error;
|
|
35
|
-
return {
|
|
36
|
-
success: false,
|
|
37
|
-
error: `$ ${command}\n\n${err.stdout || err.stderr || err.message}`,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Run knip to check for unused exports
|
|
43
|
-
*/
|
|
44
|
-
async function runKnip(cwd = process.cwd()) {
|
|
45
|
-
const { readPackageJsonScripts, detectPackageManager } = await import('../utils/validator.js');
|
|
46
|
-
const scripts = readPackageJsonScripts(cwd);
|
|
47
|
-
if (!scripts || !scripts.knip) {
|
|
48
|
-
return {
|
|
49
|
-
success: true,
|
|
50
|
-
warning: 'ā ļø No knip script found in package.json. Skipping knip check.',
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
const packageManager = detectPackageManager(cwd);
|
|
54
|
-
const command = `${packageManager} run knip`;
|
|
55
|
-
try {
|
|
56
|
-
const output = execSync(command, {
|
|
57
|
-
cwd,
|
|
58
|
-
encoding: 'utf-8',
|
|
59
|
-
stdio: 'pipe',
|
|
60
|
-
});
|
|
61
|
-
return { success: true, output };
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
const err = error;
|
|
65
|
-
return {
|
|
66
|
-
success: false,
|
|
67
|
-
error: `$ ${command}\n\n${err.stdout || err.stderr || err.message}`,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Build command-specific system prompt for fixing errors
|
|
73
|
-
*/
|
|
74
|
-
function buildFixSystemPrompt(stepName, cwd) {
|
|
75
|
-
const packageManager = detectPackageManager(cwd);
|
|
76
|
-
const scripts = readPackageJsonScripts(cwd);
|
|
77
|
-
// Map step names to commands
|
|
78
|
-
const commandMap = {
|
|
79
|
-
'šØ Format': scripts?.format ? `${packageManager} run format` : 'prettier --write .',
|
|
80
|
-
'š Lint': scripts?.lint ? `${packageManager} run lint` : 'eslint . --fix',
|
|
81
|
-
'š TypeCheck': scripts?.typecheck ? `${packageManager} run typecheck` : 'tsc --noEmit',
|
|
82
|
-
'š§Ŗ Tests': scripts?.test ? `${packageManager} run test` : '',
|
|
83
|
-
'šŖ Knip': scripts?.knip ? `${packageManager} run knip` : '',
|
|
84
|
-
};
|
|
85
|
-
const fixCommand = commandMap[stepName] || '';
|
|
86
|
-
const commandGuidance = fixCommand
|
|
87
|
-
? `\n\n**Available Commands:**
|
|
88
|
-
- Package Manager: ${packageManager}
|
|
89
|
-
- Fix Command: \`${fixCommand}\`
|
|
90
|
-
- You can run this command to verify your fixes, but you MUST fix the issues in the code files first.
|
|
91
|
-
`
|
|
92
|
-
: '';
|
|
93
|
-
return `You are a code quality expert specialized in fixing ${stepName} errors.
|
|
94
|
-
|
|
95
|
-
Your task is to analyze errors and fix them according to the project's quality standards.
|
|
96
|
-
${commandGuidance}
|
|
97
|
-
**CRITICAL REQUIREMENTS:**
|
|
98
|
-
- You MUST use the search_replace or write tools to fix ALL errors
|
|
99
|
-
- Simply identifying issues without fixing them is NOT acceptable
|
|
100
|
-
- Focus ONLY on fixing the specific errors provided. Do not make unnecessary changes.
|
|
101
|
-
- Follow the project's coding guidelines (CLAUDE.md will be loaded automatically)
|
|
102
|
-
- Use ${packageManager} commands (NOT npm) if you need to run any commands
|
|
103
|
-
- Make minimal, surgical fixes - don't refactor unrelated code`;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Run Claude to fix code quality errors
|
|
107
|
-
* Exported so other commands can use it
|
|
108
|
-
*/
|
|
109
|
-
export async function fixCodeQualityErrors(stepName, errors, cwd = process.cwd()) {
|
|
110
|
-
console.log(`\nš¤ Using Claude to fix ${stepName} errors...\n`);
|
|
111
|
-
// Build command-specific system prompt
|
|
112
|
-
const systemPrompt = buildFixSystemPrompt(stepName, cwd);
|
|
113
|
-
// User prompt
|
|
114
|
-
const promptText = `The following ${stepName} errors need to be fixed:
|
|
115
|
-
|
|
116
|
-
\`\`\`
|
|
117
|
-
${errors}
|
|
118
|
-
\`\`\`
|
|
119
|
-
|
|
120
|
-
**Your task:**
|
|
121
|
-
1. Analyze each error carefully
|
|
122
|
-
2. Read the files that have errors
|
|
123
|
-
3. **IMMEDIATELY FIX each error using search_replace or write tools**
|
|
124
|
-
4. Make minimal changes - only fix what's broken
|
|
125
|
-
5. Ensure your fixes don't introduce new issues
|
|
126
|
-
6. Follow the project's coding guidelines
|
|
127
|
-
|
|
128
|
-
**IMPORTANT:**
|
|
129
|
-
- Don't just describe errors - FIX them!
|
|
130
|
-
- Every error you identify MUST be fixed
|
|
131
|
-
- Use the project's coding standards
|
|
132
|
-
|
|
133
|
-
Start by reading the files with errors and fixing them one by one.`;
|
|
134
|
-
try {
|
|
135
|
-
const stream = runAgentStream(promptText, {
|
|
136
|
-
systemPrompt,
|
|
137
|
-
maxTurns: 20,
|
|
138
|
-
cwd,
|
|
139
|
-
verbosity: 'normal',
|
|
140
|
-
});
|
|
141
|
-
let fixCount = 0;
|
|
142
|
-
// Process stream
|
|
143
|
-
const filesReferenced = new Set();
|
|
144
|
-
for await (const event of stream) {
|
|
145
|
-
if (event.type === 'message') {
|
|
146
|
-
const message = event.data;
|
|
147
|
-
if (message.type === 'assistant' && message.message?.content) {
|
|
148
|
-
for (const block of message.message.content) {
|
|
149
|
-
if (block.type === 'text' && block.text) {
|
|
150
|
-
logAssistantMessage(block.text, 'normal');
|
|
151
|
-
}
|
|
152
|
-
else if (block.type === 'tool_use' && block.name) {
|
|
153
|
-
logToolUsage(block.name, block.input, filesReferenced);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
else if (event.type === 'agent_result') {
|
|
159
|
-
fixCount = event.data.fixCount;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
console.log(`\n⨠Claude completed (${fixCount} fixes applied)`);
|
|
163
|
-
return fixCount > 0;
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
console.error('\nā Error during Claude fixing:', error);
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Legacy export for backward compatibility
|
|
172
|
-
*/
|
|
173
|
-
export async function fixLintErrors(lintErrors, cwd = process.cwd()) {
|
|
174
|
-
return fixCodeQualityErrors('linting', lintErrors, cwd);
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Core comprehensive validation and fixing logic (git-agnostic)
|
|
178
|
-
* Used internally by lintCommand
|
|
179
|
-
*/
|
|
180
|
-
async function fixLintErrorsCore(cwd = process.cwd()) {
|
|
181
|
-
console.log('š Running comprehensive code quality checks...\n');
|
|
182
|
-
// Define all validation steps
|
|
183
|
-
const validationSteps = [
|
|
184
|
-
{ name: 'šØ Format', run: () => runFormat(cwd), fixable: true },
|
|
185
|
-
{ name: 'š Lint', run: () => runLint(cwd), fixable: true },
|
|
186
|
-
{ name: 'š TypeCheck', run: () => runTypecheck(cwd), fixable: true },
|
|
187
|
-
{ name: 'š§Ŗ Tests', run: () => runTests(cwd), fixable: true },
|
|
188
|
-
{ name: 'šŖ Knip', run: () => runKnip(cwd), fixable: true },
|
|
189
|
-
];
|
|
190
|
-
const stepsFixed = [];
|
|
191
|
-
let totalAttempts = 0;
|
|
192
|
-
let totalFixes = 0;
|
|
193
|
-
// Run each validation step
|
|
194
|
-
for (const step of validationSteps) {
|
|
195
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
196
|
-
console.log(`Running: ${step.name}`);
|
|
197
|
-
console.log(`${'='.repeat(60)}\n`);
|
|
198
|
-
let result = await step.run();
|
|
199
|
-
// Handle warnings (non-blocking)
|
|
200
|
-
if (result.warning) {
|
|
201
|
-
console.log(result.warning);
|
|
202
|
-
console.log(`ā
${step.name} - SKIPPED\n`);
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
// Handle success
|
|
206
|
-
if (result.success) {
|
|
207
|
-
console.log(`ā
${step.name} - PASSED\n`);
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
// Handle errors
|
|
211
|
-
console.log(`ā ${step.name} - FAILED:\n`);
|
|
212
|
-
console.log(result.error);
|
|
213
|
-
if (!step.fixable) {
|
|
214
|
-
console.log(`\nā ļø ${step.name} errors cannot be auto-fixed by Claude`);
|
|
215
|
-
throw new Error(`${step.name} validation failed`);
|
|
216
|
-
}
|
|
217
|
-
// Attempt to fix errors with Claude (max 3 attempts per step)
|
|
218
|
-
let attemptCount = 0;
|
|
219
|
-
const maxAttempts = 3;
|
|
220
|
-
while (!result.success && attemptCount < maxAttempts) {
|
|
221
|
-
attemptCount++;
|
|
222
|
-
totalAttempts++;
|
|
223
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
224
|
-
console.log(`š ${step.name} Fix Attempt ${attemptCount}/${maxAttempts}`);
|
|
225
|
-
console.log(`${'='.repeat(60)}`);
|
|
226
|
-
const fixApplied = await fixCodeQualityErrors(step.name, result.error || '', cwd);
|
|
227
|
-
if (!fixApplied) {
|
|
228
|
-
console.log(`\nā ļø No fixes were applied by Claude for ${step.name}`);
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
totalFixes++;
|
|
232
|
-
// Verify fixes by running validation again
|
|
233
|
-
console.log(`\nš Verifying ${step.name} fixes...\n`);
|
|
234
|
-
result = await step.run();
|
|
235
|
-
if (result.success) {
|
|
236
|
-
console.log(`ā
${step.name} - All errors fixed!\n`);
|
|
237
|
-
stepsFixed.push(step.name);
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
const errorLines = result.error?.split('\n').length || 0;
|
|
242
|
-
console.log(`\nā ļø Some ${step.name} errors remain (${errorLines} lines):`);
|
|
243
|
-
console.log(result.error);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
// Check if step still has errors after attempts
|
|
247
|
-
if (!result.success) {
|
|
248
|
-
console.error(`\nā Could not fix all ${step.name} errors after ${maxAttempts} attempts`);
|
|
249
|
-
console.log('\nRemaining errors:');
|
|
250
|
-
console.log(result.error);
|
|
251
|
-
throw new Error(`${step.name} errors remain after maximum attempts`);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
console.log('\n' + '='.repeat(60));
|
|
255
|
-
console.log('ā
All validation steps passed!');
|
|
256
|
-
console.log('='.repeat(60));
|
|
257
|
-
return {
|
|
258
|
-
success: true,
|
|
259
|
-
attempts: totalAttempts,
|
|
260
|
-
fixesApplied: totalFixes,
|
|
261
|
-
stepsFixed,
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Main lint command (now runs comprehensive validation)
|
|
266
|
-
*/
|
|
267
|
-
export async function lintCommand(options = {}) {
|
|
268
|
-
console.log('š Starting Kosuke Code Quality Check & Fix...\n');
|
|
269
|
-
try {
|
|
270
|
-
// Validate environment
|
|
271
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
272
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
273
|
-
}
|
|
274
|
-
// Resolve directory
|
|
275
|
-
const { resolve } = await import('path');
|
|
276
|
-
const { existsSync, statSync } = await import('fs');
|
|
277
|
-
const cwd = options.directory ? resolve(options.directory) : process.cwd();
|
|
278
|
-
// Validate directory if provided
|
|
279
|
-
if (options.directory) {
|
|
280
|
-
if (!existsSync(cwd)) {
|
|
281
|
-
throw new Error(`Directory not found: ${cwd}\n` +
|
|
282
|
-
`Please provide a valid directory using --directory=<path>\n` +
|
|
283
|
-
`Example: kosuke lint --directory=./my-project`);
|
|
284
|
-
}
|
|
285
|
-
const stats = statSync(cwd);
|
|
286
|
-
if (!stats.isDirectory()) {
|
|
287
|
-
throw new Error(`Path is not a directory: ${cwd}\n` + `Please provide a valid directory path.`);
|
|
288
|
-
}
|
|
289
|
-
console.log(`š Using project directory: ${cwd}\n`);
|
|
290
|
-
}
|
|
291
|
-
// If --pr flag is provided, wrap with PR workflow
|
|
292
|
-
if (options.pr) {
|
|
293
|
-
const { result: fixResult, prInfo } = await runWithPR({
|
|
294
|
-
branchPrefix: 'fix/kosuke-quality',
|
|
295
|
-
baseBranch: options.baseBranch,
|
|
296
|
-
commitMessage: 'chore: fix code quality issues',
|
|
297
|
-
prTitle: 'chore: Fix code quality issues',
|
|
298
|
-
prBody: `## š§ Automated Code Quality Fixes
|
|
299
|
-
|
|
300
|
-
This PR contains automated fixes for code quality issues detected by comprehensive validation.
|
|
301
|
-
|
|
302
|
-
### š Validation Steps Performed
|
|
303
|
-
- šØ **Format**: Code formatting check
|
|
304
|
-
- š **Lint**: ESLint validation
|
|
305
|
-
- š **TypeCheck**: TypeScript type checking
|
|
306
|
-
- š§Ŗ **Tests**: Unit/integration tests
|
|
307
|
-
- šŖ **Knip**: Unused exports detection
|
|
308
|
-
|
|
309
|
-
### ā
Result
|
|
310
|
-
All validation steps passed! Code quality issues have been automatically fixed by Claude.
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
š¤ *Generated by Kosuke CLI (\`kosuke lint --pr\`)*`,
|
|
315
|
-
cwd,
|
|
316
|
-
}, () => fixLintErrorsCore(cwd));
|
|
317
|
-
console.log('\nā
Code quality check complete!');
|
|
318
|
-
console.log(`š Attempts: ${fixResult.attempts}`);
|
|
319
|
-
console.log(`š§ Fixes applied: ${fixResult.fixesApplied}`);
|
|
320
|
-
if (fixResult.stepsFixed.length > 0) {
|
|
321
|
-
console.log(`šÆ Steps fixed: ${fixResult.stepsFixed.join(', ')}`);
|
|
322
|
-
}
|
|
323
|
-
console.log(`š PR: ${prInfo.prUrl}`);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
// Run core logic without PR
|
|
327
|
-
const result = await fixLintErrorsCore(cwd);
|
|
328
|
-
console.log('\nā
Code quality check complete!');
|
|
329
|
-
console.log(`š Attempts: ${result.attempts}`);
|
|
330
|
-
console.log(`š§ Fixes applied: ${result.fixesApplied}`);
|
|
331
|
-
if (result.stepsFixed.length > 0) {
|
|
332
|
-
console.log(`šÆ Steps fixed: ${result.stepsFixed.join(', ')}`);
|
|
333
|
-
}
|
|
334
|
-
console.log('\nā¹ļø Changes applied locally. Use --pr flag to create a pull request.');
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
catch (error) {
|
|
338
|
-
console.error('\nā Code quality check failed:', error);
|
|
339
|
-
throw error;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
//# sourceMappingURL=lint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../kosuke/commands/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Migrate command - Apply database migrations with automatic validation
|
|
3
|
-
*
|
|
4
|
-
* Uses Claude Code Agent to:
|
|
5
|
-
* 1. Apply Drizzle migrations to database (db:migrate)
|
|
6
|
-
* 2. Seed database with initial data (db:seed)
|
|
7
|
-
* 3. Validate migrations applied successfully
|
|
8
|
-
*
|
|
9
|
-
* NOTE: This command does NOT generate migrations (ship handles that)
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* kosuke migrate # Apply migrations in current dir
|
|
13
|
-
* kosuke migrate --directory=./my-app # Apply in specific project
|
|
14
|
-
* kosuke migrate --db-url=postgres://... # Custom database URL
|
|
15
|
-
*
|
|
16
|
-
* Programmatic (from build):
|
|
17
|
-
* const result = await migrateCore({
|
|
18
|
-
* directory: cwd,
|
|
19
|
-
* dbUrl,
|
|
20
|
-
* context: { ticketId, ticketTitle, ticketDescription }
|
|
21
|
-
* });
|
|
22
|
-
*/
|
|
23
|
-
import type { MigrateOptions, MigrateResult, MigrateStreamEvent } from '../types.js';
|
|
24
|
-
/**
|
|
25
|
-
* Streaming version of migrateCore - yields events for SSE integration
|
|
26
|
-
*/
|
|
27
|
-
export declare function migrateCoreStream(options: MigrateOptions): AsyncGenerator<MigrateStreamEvent, void, void>;
|
|
28
|
-
/**
|
|
29
|
-
* Core migrate logic (reusable)
|
|
30
|
-
* Applies migrations, seeds database, and validates schema changes
|
|
31
|
-
* Consumes migrateCoreStream and adds console logging
|
|
32
|
-
*/
|
|
33
|
-
export declare function migrateCore(options: MigrateOptions): Promise<MigrateResult>;
|
|
34
|
-
/**
|
|
35
|
-
* Main migrate command
|
|
36
|
-
*/
|
|
37
|
-
export declare function migrateCommand(options: MigrateOptions): Promise<void>;
|
|
38
|
-
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAqDrF;;GAEG;AACH,wBAAuB,iBAAiB,CACtC,OAAO,EAAE,cAAc,GACtB,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC,CAiHhD;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAiDjF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C3E"}
|
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Migrate command - Apply database migrations with automatic validation
|
|
3
|
-
*
|
|
4
|
-
* Uses Claude Code Agent to:
|
|
5
|
-
* 1. Apply Drizzle migrations to database (db:migrate)
|
|
6
|
-
* 2. Seed database with initial data (db:seed)
|
|
7
|
-
* 3. Validate migrations applied successfully
|
|
8
|
-
*
|
|
9
|
-
* NOTE: This command does NOT generate migrations (ship handles that)
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* kosuke migrate # Apply migrations in current dir
|
|
13
|
-
* kosuke migrate --directory=./my-app # Apply in specific project
|
|
14
|
-
* kosuke migrate --db-url=postgres://... # Custom database URL
|
|
15
|
-
*
|
|
16
|
-
* Programmatic (from build):
|
|
17
|
-
* const result = await migrateCore({
|
|
18
|
-
* directory: cwd,
|
|
19
|
-
* dbUrl,
|
|
20
|
-
* context: { ticketId, ticketTitle, ticketDescription }
|
|
21
|
-
* });
|
|
22
|
-
*/
|
|
23
|
-
import { existsSync, statSync } from 'fs';
|
|
24
|
-
import { resolve } from 'path';
|
|
25
|
-
import { DEFAULT_DB_URL } from '../utils/constants.js';
|
|
26
|
-
import { formatCostBreakdown, logAssistantMessage, logToolUsage, runAgentStream, } from '../utils/claude-agent.js';
|
|
27
|
-
import { logger, setupCancellationHandler } from '../utils/logger.js';
|
|
28
|
-
/**
|
|
29
|
-
* Build system prompt for database migration and validation
|
|
30
|
-
*/
|
|
31
|
-
function buildMigrationPrompt(dbUrl, context) {
|
|
32
|
-
return `You are a database migration specialist.
|
|
33
|
-
|
|
34
|
-
**Your Task:**
|
|
35
|
-
Apply database migrations and validate schema changes.
|
|
36
|
-
|
|
37
|
-
${context ? `**Context:**\nApplying migrations for ticket ${context.ticketId}: ${context.ticketTitle}\n` : ''}
|
|
38
|
-
|
|
39
|
-
**Migration Process (Execute in Order):**
|
|
40
|
-
|
|
41
|
-
1. **Apply Migrations to Database**
|
|
42
|
-
- Run: \`POSTGRES_URL="${dbUrl}" bun run db:migrate\`
|
|
43
|
-
- This applies pending migrations to the database
|
|
44
|
-
- ā ļø CRITICAL: Migrations MUST succeed - fail immediately if errors occur
|
|
45
|
-
- Report any migration errors clearly
|
|
46
|
-
|
|
47
|
-
2. **Seed Database**
|
|
48
|
-
- Run: \`POSTGRES_URL="${dbUrl}" bun run db:seed\`
|
|
49
|
-
- Seeds initial data if seed file exists
|
|
50
|
-
- If seed file doesn't exist, this is OK (not an error)
|
|
51
|
-
|
|
52
|
-
3. **Validate Migration Success**
|
|
53
|
-
- Connect to the database using the POSTGRES_URL
|
|
54
|
-
- Query the database to verify expected tables exist
|
|
55
|
-
- Check that schema changes were applied correctly
|
|
56
|
-
- Use: \`POSTGRES_URL="${dbUrl}" psql -c "\\dt"\` to list tables
|
|
57
|
-
- Or write a Node.js script to validate schema
|
|
58
|
-
|
|
59
|
-
**Success Criteria:**
|
|
60
|
-
- db:migrate completes without errors
|
|
61
|
-
- db:seed runs (success if no seed file is also OK)
|
|
62
|
-
- Database validation confirms tables exist and schema is correct
|
|
63
|
-
|
|
64
|
-
**Failure Handling:**
|
|
65
|
-
- If db:migrate fails ā Report error and STOP immediately
|
|
66
|
-
- If validation fails ā Report which tables/schema are missing
|
|
67
|
-
|
|
68
|
-
Begin by applying migrations and validating the results.`;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Streaming version of migrateCore - yields events for SSE integration
|
|
72
|
-
*/
|
|
73
|
-
export async function* migrateCoreStream(options) {
|
|
74
|
-
const { directory, dbUrl = DEFAULT_DB_URL, context } = options;
|
|
75
|
-
// 1. Validate and resolve directory
|
|
76
|
-
const cwd = directory ? resolve(directory) : process.cwd();
|
|
77
|
-
if (directory) {
|
|
78
|
-
if (!existsSync(cwd)) {
|
|
79
|
-
yield {
|
|
80
|
-
type: 'done',
|
|
81
|
-
data: {
|
|
82
|
-
success: false,
|
|
83
|
-
migrationsApplied: false,
|
|
84
|
-
seedingCompleted: false,
|
|
85
|
-
validationPassed: false,
|
|
86
|
-
tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
|
|
87
|
-
cost: 0,
|
|
88
|
-
error: `Directory not found: ${cwd}`,
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const stats = statSync(cwd);
|
|
94
|
-
if (!stats.isDirectory()) {
|
|
95
|
-
yield {
|
|
96
|
-
type: 'done',
|
|
97
|
-
data: {
|
|
98
|
-
success: false,
|
|
99
|
-
migrationsApplied: false,
|
|
100
|
-
seedingCompleted: false,
|
|
101
|
-
validationPassed: false,
|
|
102
|
-
tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
|
|
103
|
-
cost: 0,
|
|
104
|
-
error: `Path is not a directory: ${cwd}`,
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
// Yield migration started event
|
|
112
|
-
yield {
|
|
113
|
-
type: 'migration_started',
|
|
114
|
-
data: { dbUrl: dbUrl.replace(/:[^:@]+@/, ':****@') }, // Hide password
|
|
115
|
-
};
|
|
116
|
-
// 2. Run migration and validation with Claude Code Agent (streaming)
|
|
117
|
-
const systemPrompt = buildMigrationPrompt(dbUrl, context);
|
|
118
|
-
const stream = runAgentStream('Apply database migrations and validate schema', {
|
|
119
|
-
systemPrompt,
|
|
120
|
-
cwd,
|
|
121
|
-
maxTurns: 20,
|
|
122
|
-
verbosity: 'normal',
|
|
123
|
-
});
|
|
124
|
-
let agentResult = null;
|
|
125
|
-
// Yield events from stream
|
|
126
|
-
for await (const event of stream) {
|
|
127
|
-
if (event.type === 'message') {
|
|
128
|
-
yield { type: 'message', data: event.data };
|
|
129
|
-
}
|
|
130
|
-
else if (event.type === 'agent_result') {
|
|
131
|
-
agentResult = event.data;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
if (!agentResult) {
|
|
135
|
-
throw new Error('Migration stream ended without result');
|
|
136
|
-
}
|
|
137
|
-
// 3. Parse agent output to determine success
|
|
138
|
-
const response = agentResult.response.toLowerCase();
|
|
139
|
-
const migrationsApplied = response.includes('migrat') && response.includes('success');
|
|
140
|
-
const seedingCompleted = response.includes('seed');
|
|
141
|
-
const validationPassed = response.includes('validat') && !response.includes('failed');
|
|
142
|
-
const success = migrationsApplied && validationPassed;
|
|
143
|
-
yield {
|
|
144
|
-
type: 'done',
|
|
145
|
-
data: {
|
|
146
|
-
success,
|
|
147
|
-
migrationsApplied,
|
|
148
|
-
seedingCompleted,
|
|
149
|
-
validationPassed,
|
|
150
|
-
tokensUsed: agentResult.tokensUsed,
|
|
151
|
-
cost: agentResult.cost,
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
156
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
157
|
-
yield {
|
|
158
|
-
type: 'done',
|
|
159
|
-
data: {
|
|
160
|
-
success: false,
|
|
161
|
-
migrationsApplied: false,
|
|
162
|
-
seedingCompleted: false,
|
|
163
|
-
validationPassed: false,
|
|
164
|
-
tokensUsed: {
|
|
165
|
-
input: 0,
|
|
166
|
-
output: 0,
|
|
167
|
-
cacheCreation: 0,
|
|
168
|
-
cacheRead: 0,
|
|
169
|
-
},
|
|
170
|
-
cost: 0,
|
|
171
|
-
error: errorMessage,
|
|
172
|
-
},
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Core migrate logic (reusable)
|
|
178
|
-
* Applies migrations, seeds database, and validates schema changes
|
|
179
|
-
* Consumes migrateCoreStream and adds console logging
|
|
180
|
-
*/
|
|
181
|
-
export async function migrateCore(options) {
|
|
182
|
-
const { directory } = options;
|
|
183
|
-
if (directory) {
|
|
184
|
-
const cwd = directory ? resolve(directory) : process.cwd();
|
|
185
|
-
console.log(`š Using project directory: ${cwd}\n`);
|
|
186
|
-
}
|
|
187
|
-
console.log(`šļø Applying database migrations...\n`);
|
|
188
|
-
let result = null;
|
|
189
|
-
// Consume the stream and add console logging
|
|
190
|
-
for await (const event of migrateCoreStream(options)) {
|
|
191
|
-
if (event.type === 'migration_started') {
|
|
192
|
-
console.log(`š Database URL: ${event.data.dbUrl}\n`);
|
|
193
|
-
}
|
|
194
|
-
else if (event.type === 'message') {
|
|
195
|
-
// Log Claude messages for CLI context
|
|
196
|
-
const msg = event.data;
|
|
197
|
-
if (msg.type === 'assistant' && msg.message?.content) {
|
|
198
|
-
for (const block of msg.message.content) {
|
|
199
|
-
if (block.type === 'text' && block.text) {
|
|
200
|
-
// Use shared logging with verbosity: 'normal'
|
|
201
|
-
logAssistantMessage(block.text, 'normal');
|
|
202
|
-
}
|
|
203
|
-
else if (block.type === 'tool_use' && block.name) {
|
|
204
|
-
// Log tool usage (logToolUsage filters file modifications internally)
|
|
205
|
-
const filesReferenced = new Set();
|
|
206
|
-
logToolUsage(block.name, block.input, filesReferenced);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else if (event.type === 'done') {
|
|
212
|
-
result = event.data;
|
|
213
|
-
console.log(`\n⨠Migration process completed`);
|
|
214
|
-
console.log(`š° Migration cost: ${formatCostBreakdown({
|
|
215
|
-
tokensUsed: result.tokensUsed,
|
|
216
|
-
cost: result.cost,
|
|
217
|
-
response: '',
|
|
218
|
-
fixCount: 0,
|
|
219
|
-
filesReferenced: new Set(),
|
|
220
|
-
})}`);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return result;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Main migrate command
|
|
227
|
-
*/
|
|
228
|
-
export async function migrateCommand(options) {
|
|
229
|
-
console.log('šļø Starting Database Migration...\n');
|
|
230
|
-
// Initialize logging context
|
|
231
|
-
const logContext = logger.createContext('migrate', { noLogs: options.noLogs });
|
|
232
|
-
const cleanupHandler = setupCancellationHandler(logContext);
|
|
233
|
-
try {
|
|
234
|
-
// Validate environment
|
|
235
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
236
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
237
|
-
}
|
|
238
|
-
// Execute core logic
|
|
239
|
-
const result = await migrateCore(options);
|
|
240
|
-
// Track metrics
|
|
241
|
-
logger.trackTokens(logContext, result.tokensUsed);
|
|
242
|
-
// Display summary
|
|
243
|
-
displayMigrationSummary(result);
|
|
244
|
-
// Log execution (success or error based on result)
|
|
245
|
-
await logger.complete(logContext, result.success ? 'success' : 'error', result.error ? new Error(result.error) : undefined);
|
|
246
|
-
cleanupHandler();
|
|
247
|
-
if (!result.success) {
|
|
248
|
-
throw new Error(result.error || 'Migration failed');
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
console.error('\nā Migration command failed:', error);
|
|
253
|
-
// Log failed execution
|
|
254
|
-
await logger.complete(logContext, 'error', error);
|
|
255
|
-
cleanupHandler();
|
|
256
|
-
throw error;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Display migration summary
|
|
261
|
-
*/
|
|
262
|
-
function displayMigrationSummary(result) {
|
|
263
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
264
|
-
console.log('š Migration Summary');
|
|
265
|
-
console.log('='.repeat(60));
|
|
266
|
-
if (result.success) {
|
|
267
|
-
console.log('ā
Status: Migration successful');
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
console.log('ā Status: Migration failed');
|
|
271
|
-
}
|
|
272
|
-
console.log(` ā Migrations applied: ${result.migrationsApplied ? 'Yes' : 'No'}`);
|
|
273
|
-
console.log(` ā Seeding completed: ${result.seedingCompleted ? 'Yes' : 'No'}`);
|
|
274
|
-
console.log(` ā Validation passed: ${result.validationPassed ? 'Yes' : 'No'}`);
|
|
275
|
-
console.log(`š° Cost: $${result.cost.toFixed(4)}`);
|
|
276
|
-
console.log('='.repeat(60));
|
|
277
|
-
if (result.success) {
|
|
278
|
-
console.log('\nā
Database migrations applied and validated successfully!');
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
console.log(`\nā Migration failed: ${result.error || 'See output above for details'}`);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
//# sourceMappingURL=migrate.js.map
|