@kosuke-ai/cli 0.0.1
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/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -0
- package/dist/kosuke/commands/analyse.d.ts +15 -0
- package/dist/kosuke/commands/analyse.d.ts.map +1 -0
- package/dist/kosuke/commands/analyse.js +308 -0
- package/dist/kosuke/commands/analyse.js.map +1 -0
- package/dist/kosuke/commands/sync-rules.d.ts +8 -0
- package/dist/kosuke/commands/sync-rules.d.ts.map +1 -0
- package/dist/kosuke/commands/sync-rules.js +364 -0
- package/dist/kosuke/commands/sync-rules.js.map +1 -0
- package/dist/kosuke/types.d.ts +31 -0
- package/dist/kosuke/types.d.ts.map +1 -0
- package/dist/kosuke/types.js +5 -0
- package/dist/kosuke/types.js.map +1 -0
- package/dist/kosuke/utils/batch-creator.d.ts +14 -0
- package/dist/kosuke/utils/batch-creator.d.ts.map +1 -0
- package/dist/kosuke/utils/batch-creator.js +76 -0
- package/dist/kosuke/utils/batch-creator.js.map +1 -0
- package/dist/kosuke/utils/file-discovery.d.ts +15 -0
- package/dist/kosuke/utils/file-discovery.d.ts.map +1 -0
- package/dist/kosuke/utils/file-discovery.js +81 -0
- package/dist/kosuke/utils/file-discovery.js.map +1 -0
- package/dist/kosuke/utils/git.d.ts +29 -0
- package/dist/kosuke/utils/git.d.ts.map +1 -0
- package/dist/kosuke/utils/git.js +72 -0
- package/dist/kosuke/utils/git.js.map +1 -0
- package/dist/kosuke/utils/github.d.ts +17 -0
- package/dist/kosuke/utils/github.d.ts.map +1 -0
- package/dist/kosuke/utils/github.js +22 -0
- package/dist/kosuke/utils/github.js.map +1 -0
- package/dist/kosuke/utils/validator.d.ts +22 -0
- package/dist/kosuke/utils/validator.d.ts.map +1 -0
- package/dist/kosuke/utils/validator.js +65 -0
- package/dist/kosuke/utils/validator.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync rules command - Syncs rules and documentation from kosuke-template
|
|
3
|
+
*/
|
|
4
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
5
|
+
import simpleGit from 'simple-git';
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, rmSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { getCurrentRepo, isKosukeTemplateRepo } from '../utils/git.js';
|
|
9
|
+
import { createPullRequest } from '../utils/github.js';
|
|
10
|
+
import { runFormat, runLint } from '../utils/validator.js';
|
|
11
|
+
// Constants
|
|
12
|
+
const KOSUKE_TEMPLATE_REPO = 'https://github.com/Kosuke-Org/kosuke-template.git';
|
|
13
|
+
const KOSUKE_TEMPLATE_BRANCH = 'main';
|
|
14
|
+
const TEMP_DIR = '.tmp/kosuke-template';
|
|
15
|
+
const TARGET_BRANCH = 'main';
|
|
16
|
+
const RULES_FILE = '.cursor/rules/general.mdc';
|
|
17
|
+
const CLAUDE_MD_FILE = 'CLAUDE.md';
|
|
18
|
+
/**
|
|
19
|
+
* Clone or update kosuke-template repository
|
|
20
|
+
*/
|
|
21
|
+
async function cloneOrUpdateKosukeTemplate() {
|
|
22
|
+
const git = simpleGit();
|
|
23
|
+
if (existsSync(TEMP_DIR)) {
|
|
24
|
+
console.log('📁 Updating existing kosuke-template clone...');
|
|
25
|
+
const repoGit = simpleGit(TEMP_DIR);
|
|
26
|
+
await repoGit.fetch(['origin', KOSUKE_TEMPLATE_BRANCH, '--depth=100']);
|
|
27
|
+
await repoGit.checkout(KOSUKE_TEMPLATE_BRANCH);
|
|
28
|
+
await repoGit.pull('origin', KOSUKE_TEMPLATE_BRANCH);
|
|
29
|
+
return repoGit;
|
|
30
|
+
}
|
|
31
|
+
console.log('📥 Cloning kosuke-template repository...');
|
|
32
|
+
mkdirSync(TEMP_DIR, { recursive: true });
|
|
33
|
+
await git.clone(KOSUKE_TEMPLATE_REPO, TEMP_DIR, [
|
|
34
|
+
'--depth',
|
|
35
|
+
'100',
|
|
36
|
+
'--branch',
|
|
37
|
+
KOSUKE_TEMPLATE_BRANCH,
|
|
38
|
+
]);
|
|
39
|
+
return simpleGit(TEMP_DIR);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if rules file changed in last 24 hours
|
|
43
|
+
*/
|
|
44
|
+
async function checkRulesChangedInLast24Hours(git) {
|
|
45
|
+
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
|
46
|
+
// Get all commits in last 24 hours
|
|
47
|
+
const log = await git.log({
|
|
48
|
+
maxCount: 100,
|
|
49
|
+
'--since': oneDayAgo,
|
|
50
|
+
});
|
|
51
|
+
for (const commit of log.all) {
|
|
52
|
+
// Check if rules file was modified in this commit
|
|
53
|
+
const diffSummary = await git.diffSummary([`${commit.hash}^`, commit.hash]);
|
|
54
|
+
for (const file of diffSummary.files) {
|
|
55
|
+
if (file.file === RULES_FILE) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Adapt rules conservatively with Claude Agent SDK
|
|
64
|
+
*/
|
|
65
|
+
async function adaptRulesWithClaude(fileName, currentContent) {
|
|
66
|
+
console.log(`🤖 Analyzing ${fileName} with Claude Agent SDK...`);
|
|
67
|
+
const workspaceRoot = process.cwd();
|
|
68
|
+
const kosukeFilePath = join(TEMP_DIR, fileName); // Kosuke-template clone
|
|
69
|
+
const currentFilePath = join(workspaceRoot, fileName); // Current repository
|
|
70
|
+
const systemPrompt = `You are syncing rules/documentation from kosuke-template to a forked repository.
|
|
71
|
+
|
|
72
|
+
TASK:
|
|
73
|
+
Compare kosuke-template's version of ${fileName} with the current repository's version.
|
|
74
|
+
|
|
75
|
+
Your job is to:
|
|
76
|
+
1. Explore the current repository to understand its architecture, tech stack, and features
|
|
77
|
+
2. Read both versions of ${fileName} (kosuke-template vs current)
|
|
78
|
+
3. Adapt the current repository's file with conservative improvements:
|
|
79
|
+
- KEEP repository-specific customizations
|
|
80
|
+
- ADD generic improvements (TypeScript patterns, testing, code quality)
|
|
81
|
+
- SKIP features not present in this repository (discover by exploring the codebase)
|
|
82
|
+
- ADAPT examples to match the repository's domain and features
|
|
83
|
+
|
|
84
|
+
Kosuke-template clone: ${TEMP_DIR}
|
|
85
|
+
Current repository: ${workspaceRoot}
|
|
86
|
+
|
|
87
|
+
Take your time to explore the codebase and understand the context before making changes.`;
|
|
88
|
+
const promptText = `Compare and adapt ${fileName}:
|
|
89
|
+
- Kosuke-template version: ${kosukeFilePath}
|
|
90
|
+
- Current version: ${currentFilePath}
|
|
91
|
+
|
|
92
|
+
Explore the repository, read both files, identify improvements, and update the current version conservatively.`;
|
|
93
|
+
const options = {
|
|
94
|
+
model: 'claude-sonnet-4-5',
|
|
95
|
+
systemPrompt,
|
|
96
|
+
maxTurns: 30,
|
|
97
|
+
cwd: workspaceRoot,
|
|
98
|
+
permissionMode: 'bypassPermissions',
|
|
99
|
+
additionalDirectories: [TEMP_DIR, workspaceRoot],
|
|
100
|
+
};
|
|
101
|
+
try {
|
|
102
|
+
const responseStream = query({ prompt: promptText, options });
|
|
103
|
+
// Display Claude's reasoning and actions
|
|
104
|
+
for await (const message of responseStream) {
|
|
105
|
+
if (message.type === 'assistant') {
|
|
106
|
+
const content = message.message.content;
|
|
107
|
+
for (const block of content) {
|
|
108
|
+
if (block.type === 'text' && block.text.trim()) {
|
|
109
|
+
console.log(` 💭 ${block.text.trim()}`);
|
|
110
|
+
}
|
|
111
|
+
else if (block.type === 'tool_use') {
|
|
112
|
+
const inputStr = JSON.stringify(block.input, null, 0);
|
|
113
|
+
const shortInput = inputStr.length > 100 ? inputStr.substring(0, 97) + '...' : inputStr;
|
|
114
|
+
console.log(` 🔧 ${block.name}: ${shortInput}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Read the adapted content
|
|
120
|
+
const adaptedContent = existsSync(currentFilePath)
|
|
121
|
+
? readFileSync(currentFilePath, 'utf-8')
|
|
122
|
+
: '';
|
|
123
|
+
// Check if content actually changed
|
|
124
|
+
const relevant = adaptedContent !== currentContent;
|
|
125
|
+
const adaptation = {
|
|
126
|
+
relevant,
|
|
127
|
+
adaptedContent,
|
|
128
|
+
summary: relevant ? 'Updated with improvements from kosuke-template' : 'No changes needed',
|
|
129
|
+
};
|
|
130
|
+
console.log(`\n ${relevant ? '✅ File updated' : 'ℹ️ No changes needed'}`);
|
|
131
|
+
return adaptation;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error(`\n ❌ Error during adaptation:`, error);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generate CLAUDE.md from general.mdc (strip frontmatter)
|
|
140
|
+
*/
|
|
141
|
+
function generateClaudeMd(generalMdcContent) {
|
|
142
|
+
const lines = generalMdcContent.split('\n');
|
|
143
|
+
// Detect frontmatter: starts with --- and ends with ---
|
|
144
|
+
if (lines[0] === '---') {
|
|
145
|
+
// Find the closing --- (starts from line 1, not 0)
|
|
146
|
+
for (let i = 1; i < lines.length; i++) {
|
|
147
|
+
if (lines[i] === '---') {
|
|
148
|
+
// Skip the closing --- and any empty lines after it
|
|
149
|
+
let skipLines = i + 1;
|
|
150
|
+
while (skipLines < lines.length && lines[skipLines].trim() === '') {
|
|
151
|
+
skipLines++;
|
|
152
|
+
}
|
|
153
|
+
return lines.slice(skipLines).join('\n');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// No frontmatter detected, return as-is
|
|
158
|
+
return generalMdcContent;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generate concise summary of changes using Claude
|
|
162
|
+
*/
|
|
163
|
+
async function generateChangesSummary(oldContent, newContent) {
|
|
164
|
+
console.log('🤖 Generating changes summary...');
|
|
165
|
+
const prompt = `Compare these two versions of a development rules file and provide a CONCISE summary of what changed.
|
|
166
|
+
|
|
167
|
+
OLD VERSION:
|
|
168
|
+
\`\`\`
|
|
169
|
+
${oldContent.slice(0, 5000)}${oldContent.length > 5000 ? '\n... (truncated)' : ''}
|
|
170
|
+
\`\`\`
|
|
171
|
+
|
|
172
|
+
NEW VERSION:
|
|
173
|
+
\`\`\`
|
|
174
|
+
${newContent.slice(0, 5000)}${newContent.length > 5000 ? '\n... (truncated)' : ''}
|
|
175
|
+
\`\`\`
|
|
176
|
+
|
|
177
|
+
Provide a brief summary (3-5 bullet points) highlighting:
|
|
178
|
+
- New features or guidelines added
|
|
179
|
+
- Significant updates to existing rules
|
|
180
|
+
- Removed or deprecated items
|
|
181
|
+
|
|
182
|
+
Keep it concise and developer-friendly. Use bullet points starting with emojis.`;
|
|
183
|
+
const options = {
|
|
184
|
+
model: 'claude-sonnet-4-5',
|
|
185
|
+
maxTurns: 1,
|
|
186
|
+
cwd: process.cwd(),
|
|
187
|
+
};
|
|
188
|
+
try {
|
|
189
|
+
const responseStream = query({ prompt, options });
|
|
190
|
+
let summary = '';
|
|
191
|
+
for await (const message of responseStream) {
|
|
192
|
+
if (message.type === 'assistant') {
|
|
193
|
+
const content = message.message.content;
|
|
194
|
+
for (const block of content) {
|
|
195
|
+
if (block.type === 'text') {
|
|
196
|
+
summary += block.text;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
console.log(' ✅ Summary generated\n');
|
|
202
|
+
return summary.trim();
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
console.warn(' ⚠️ Failed to generate summary, using fallback');
|
|
206
|
+
return 'Updated rules and documentation from kosuke-template';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Create PR with adapted rules
|
|
211
|
+
*/
|
|
212
|
+
async function createRulesSyncPR(adaptation, claudeMdContent, changesSummary) {
|
|
213
|
+
const { owner, repo } = await getCurrentRepo();
|
|
214
|
+
const git = simpleGit();
|
|
215
|
+
// Generate unique branch name
|
|
216
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('.')[0];
|
|
217
|
+
const branchName = `sync/rules-${timestamp}`;
|
|
218
|
+
console.log(`🌿 Creating branch: ${branchName}`);
|
|
219
|
+
// Create and checkout new branch
|
|
220
|
+
await git.checkout(TARGET_BRANCH);
|
|
221
|
+
await git.pull('origin', TARGET_BRANCH);
|
|
222
|
+
// Check if branch already exists locally and delete it
|
|
223
|
+
try {
|
|
224
|
+
const branches = await git.branchLocal();
|
|
225
|
+
if (branches.all.includes(branchName)) {
|
|
226
|
+
console.log(` Deleting existing local branch: ${branchName}`);
|
|
227
|
+
await git.deleteLocalBranch(branchName, true);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Branch doesn't exist, continue
|
|
232
|
+
}
|
|
233
|
+
await git.checkoutLocalBranch(branchName);
|
|
234
|
+
// Write adapted content to files
|
|
235
|
+
const workspaceRoot = process.cwd();
|
|
236
|
+
console.log('📝 Writing adapted files...');
|
|
237
|
+
// Write general.mdc
|
|
238
|
+
const rulesFile = join(workspaceRoot, RULES_FILE);
|
|
239
|
+
const rulesDir = dirname(rulesFile);
|
|
240
|
+
if (!existsSync(rulesDir)) {
|
|
241
|
+
mkdirSync(rulesDir, { recursive: true });
|
|
242
|
+
}
|
|
243
|
+
writeFileSync(rulesFile, adaptation.adaptedContent, 'utf-8');
|
|
244
|
+
console.log(` ✅ ${RULES_FILE}`);
|
|
245
|
+
// Write CLAUDE.md (stripped version)
|
|
246
|
+
const claudeFile = join(workspaceRoot, CLAUDE_MD_FILE);
|
|
247
|
+
writeFileSync(claudeFile, claudeMdContent, 'utf-8');
|
|
248
|
+
console.log(` ✅ ${CLAUDE_MD_FILE}`);
|
|
249
|
+
// Add files to git
|
|
250
|
+
await git.add([RULES_FILE, CLAUDE_MD_FILE]);
|
|
251
|
+
// Run formatting and linting
|
|
252
|
+
console.log('\n🔧 Running formatting and linting...');
|
|
253
|
+
await runFormat();
|
|
254
|
+
console.log(' ✅ Formatting completed');
|
|
255
|
+
await runLint();
|
|
256
|
+
console.log(' ✅ Linting completed');
|
|
257
|
+
// Add any formatting/linting changes
|
|
258
|
+
await git.add(['-A']);
|
|
259
|
+
// Commit changes
|
|
260
|
+
await git.commit('chore: sync rules and documentation from kosuke-template', ['--no-verify']);
|
|
261
|
+
console.log('\n📤 Pushing branch...');
|
|
262
|
+
await git.push('origin', branchName, ['--set-upstream']);
|
|
263
|
+
// Create PR
|
|
264
|
+
console.log('🔀 Creating pull request...');
|
|
265
|
+
const date = new Date().toISOString().split('T')[0];
|
|
266
|
+
// Build PR body with LLM-generated summary
|
|
267
|
+
const prBody = `## 🔄 Sync Rules from Kosuke Template
|
|
268
|
+
|
|
269
|
+
${changesSummary}
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
🤖 *Auto-generated by \`bun run kosuke sync-rules\`*
|
|
274
|
+
`;
|
|
275
|
+
const prUrl = await createPullRequest({
|
|
276
|
+
owner,
|
|
277
|
+
repo,
|
|
278
|
+
title: `chore: sync rules & docs from kosuke-template (${date})`,
|
|
279
|
+
head: branchName,
|
|
280
|
+
base: TARGET_BRANCH,
|
|
281
|
+
body: prBody,
|
|
282
|
+
});
|
|
283
|
+
console.log(`✅ Pull request created: ${prUrl}`);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Main sync-rules command
|
|
287
|
+
*/
|
|
288
|
+
export async function syncRulesCommand(force = false) {
|
|
289
|
+
console.log('🚀 Starting Rules & Documentation Sync...\n');
|
|
290
|
+
try {
|
|
291
|
+
// Check if running in kosuke-template itself
|
|
292
|
+
if (await isKosukeTemplateRepo()) {
|
|
293
|
+
console.log('⚠️ Detected running in kosuke-template repository itself.');
|
|
294
|
+
console.log(' This script is designed to sync FROM kosuke-template TO forked repos.');
|
|
295
|
+
console.log(' Skipping sync to prevent self-modification.\n');
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// Validate environment
|
|
299
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
300
|
+
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
301
|
+
}
|
|
302
|
+
if (!process.env.GITHUB_TOKEN) {
|
|
303
|
+
throw new Error('GITHUB_TOKEN environment variable is required');
|
|
304
|
+
}
|
|
305
|
+
// Clone/update kosuke-template
|
|
306
|
+
const git = await cloneOrUpdateKosukeTemplate();
|
|
307
|
+
if (force) {
|
|
308
|
+
console.log('⚡ Force mode: Comparing rules file...\n');
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
// Check if rules file changed in last 24 hours
|
|
312
|
+
console.log('📅 Checking for changes in last 24 hours...');
|
|
313
|
+
const hasChanges = await checkRulesChangedInLast24Hours(git);
|
|
314
|
+
if (!hasChanges) {
|
|
315
|
+
console.log('✅ No changes to rules in last 24 hours. Nothing to sync.');
|
|
316
|
+
console.log(' Use --force flag to compare files regardless of recent commits.');
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
console.log(` ✅ Found changes in ${RULES_FILE}\n`);
|
|
320
|
+
}
|
|
321
|
+
// Read current repository versions
|
|
322
|
+
const workspaceRoot = process.cwd();
|
|
323
|
+
const kosukeFile = join(TEMP_DIR, RULES_FILE);
|
|
324
|
+
const currentFile = join(workspaceRoot, RULES_FILE);
|
|
325
|
+
if (!existsSync(kosukeFile)) {
|
|
326
|
+
throw new Error(`${RULES_FILE} not found in kosuke-template`);
|
|
327
|
+
}
|
|
328
|
+
const kosukeContent = readFileSync(kosukeFile, 'utf-8');
|
|
329
|
+
const currentContent = existsSync(currentFile) ? readFileSync(currentFile, 'utf-8') : '';
|
|
330
|
+
// Check if content is actually different
|
|
331
|
+
if (kosukeContent === currentContent) {
|
|
332
|
+
console.log(`ℹ️ No differences detected in ${RULES_FILE}. Nothing to sync.`);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
console.log(`📥 Processing ${RULES_FILE}...`);
|
|
336
|
+
const adaptation = await adaptRulesWithClaude(RULES_FILE, currentContent);
|
|
337
|
+
// Abort if no changes
|
|
338
|
+
if (!adaptation.relevant) {
|
|
339
|
+
console.log('✅ No relevant changes to sync. Aborting.');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
// Generate CLAUDE.md from adapted general.mdc
|
|
343
|
+
console.log(`\n📄 Generating ${CLAUDE_MD_FILE} from ${RULES_FILE}...`);
|
|
344
|
+
const claudeMdContent = generateClaudeMd(adaptation.adaptedContent);
|
|
345
|
+
// Generate LLM summary of changes
|
|
346
|
+
const changesSummary = await generateChangesSummary(currentContent, adaptation.adaptedContent);
|
|
347
|
+
// Create PR with adapted content
|
|
348
|
+
console.log(`\n📋 Creating pull request...\n`);
|
|
349
|
+
await createRulesSyncPR(adaptation, claudeMdContent, changesSummary);
|
|
350
|
+
console.log('\n✅ Rules sync completed successfully!');
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
console.error('\n❌ Sync failed:', error);
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
// Cleanup temp directory
|
|
358
|
+
if (existsSync(TEMP_DIR)) {
|
|
359
|
+
console.log('\n🧹 Cleaning up...');
|
|
360
|
+
rmSync(TEMP_DIR, { recursive: true, force: true });
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=sync-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-rules.js","sourceRoot":"","sources":["../../../kosuke/commands/sync-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for Kosuke CLI
|
|
3
|
+
*/
|
|
4
|
+
export interface Batch {
|
|
5
|
+
name: string;
|
|
6
|
+
directory: string;
|
|
7
|
+
files: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface Fix {
|
|
10
|
+
file: string;
|
|
11
|
+
type: FixType;
|
|
12
|
+
description: string;
|
|
13
|
+
linesChanged: number;
|
|
14
|
+
}
|
|
15
|
+
type FixType = 'type-inference' | 'navigation-pattern' | 'loading-state' | 'component-colocation' | 'server-side-filtering' | 'python-quality' | 'other';
|
|
16
|
+
export interface AnalyseOptions {
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
scope?: string;
|
|
19
|
+
types?: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface RulesAdaptation {
|
|
22
|
+
relevant: boolean;
|
|
23
|
+
adaptedContent: string;
|
|
24
|
+
summary: string;
|
|
25
|
+
}
|
|
26
|
+
export interface GitInfo {
|
|
27
|
+
owner: string;
|
|
28
|
+
repo: string;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../kosuke/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,OAAO,GACR,gBAAgB,GAChB,oBAAoB,GACpB,eAAe,GACf,sBAAsB,GACtB,uBAAuB,GACvB,gBAAgB,GAChB,OAAO,CAAC;AAEZ,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../kosuke/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch creation utilities for Kosuke CLI
|
|
3
|
+
*/
|
|
4
|
+
import type { Batch } from '../types.js';
|
|
5
|
+
interface BatchCreatorOptions {
|
|
6
|
+
maxSize?: number;
|
|
7
|
+
groupBy?: 'directory' | 'flat';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Group files into batches for processing
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBatches(files: string[], options?: BatchCreatorOptions): Batch[];
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=batch-creator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-creator.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/batch-creator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,UAAU,mBAAmB;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,mBAAwB,GAAG,KAAK,EAAE,CAwCzF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch creation utilities for Kosuke CLI
|
|
3
|
+
*/
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
/**
|
|
6
|
+
* Group files into batches for processing
|
|
7
|
+
*/
|
|
8
|
+
export function createBatches(files, options = {}) {
|
|
9
|
+
const maxSize = options.maxSize || 10;
|
|
10
|
+
const groupBy = options.groupBy || 'directory';
|
|
11
|
+
if (groupBy === 'flat') {
|
|
12
|
+
// Simple batching: chunk files into groups of maxSize
|
|
13
|
+
return chunkArray(files, maxSize).map((chunk, index) => ({
|
|
14
|
+
name: `batch-${index + 1}`,
|
|
15
|
+
directory: process.cwd(),
|
|
16
|
+
files: chunk,
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
// Group by directory: keep related files together
|
|
20
|
+
const dirGroups = new Map();
|
|
21
|
+
for (const file of files) {
|
|
22
|
+
const dir = getTopLevelDir(file);
|
|
23
|
+
if (!dirGroups.has(dir)) {
|
|
24
|
+
dirGroups.set(dir, []);
|
|
25
|
+
}
|
|
26
|
+
dirGroups.get(dir).push(file);
|
|
27
|
+
}
|
|
28
|
+
// Create batches from directory groups
|
|
29
|
+
const batches = [];
|
|
30
|
+
for (const [dir, dirFiles] of dirGroups.entries()) {
|
|
31
|
+
const chunks = chunkArray(dirFiles, maxSize);
|
|
32
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
33
|
+
const batchName = chunks.length > 1 ? `${dir} (${i + 1}/${chunks.length})` : dir;
|
|
34
|
+
batches.push({
|
|
35
|
+
name: batchName,
|
|
36
|
+
directory: dirname(chunks[i][0] || '.'),
|
|
37
|
+
files: chunks[i],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return batches;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get top-level directory from a file path
|
|
45
|
+
*/
|
|
46
|
+
function getTopLevelDir(filePath) {
|
|
47
|
+
const parts = filePath.split('/');
|
|
48
|
+
// For engine files
|
|
49
|
+
if (parts[0] === 'engine') {
|
|
50
|
+
return 'engine';
|
|
51
|
+
}
|
|
52
|
+
// For app routes
|
|
53
|
+
if (parts[0] === 'app') {
|
|
54
|
+
if (parts[1] === '(logged-in)' && parts[2]) {
|
|
55
|
+
return `app/${parts[1]}/${parts[2]}`;
|
|
56
|
+
}
|
|
57
|
+
return `app/${parts[1] || ''}`;
|
|
58
|
+
}
|
|
59
|
+
// For lib files
|
|
60
|
+
if (parts[0] === 'lib') {
|
|
61
|
+
return `lib/${parts[1] || ''}`;
|
|
62
|
+
}
|
|
63
|
+
// Default: first directory
|
|
64
|
+
return parts[0] || '.';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Chunk an array into smaller arrays
|
|
68
|
+
*/
|
|
69
|
+
function chunkArray(array, chunkSize) {
|
|
70
|
+
const chunks = [];
|
|
71
|
+
for (let i = 0; i < array.length; i += chunkSize) {
|
|
72
|
+
chunks.push(array.slice(i, i + chunkSize));
|
|
73
|
+
}
|
|
74
|
+
return chunks;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=batch-creator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-creator.js","sourceRoot":"","sources":["../../../kosuke/utils/batch-creator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File discovery utilities for Kosuke CLI
|
|
3
|
+
*/
|
|
4
|
+
interface DiscoverFilesOptions {
|
|
5
|
+
include?: string[];
|
|
6
|
+
scope?: string;
|
|
7
|
+
types?: string[];
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Discover files to analyze, respecting .kosukeignore
|
|
12
|
+
*/
|
|
13
|
+
export declare function discoverFiles(options?: DiscoverFilesOptions): Promise<string[]>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=file-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-discovery.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/file-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA+DzF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File discovery utilities for Kosuke CLI
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
import ignore from 'ignore';
|
|
8
|
+
const KOSUKEIGNORE_FILE = '.kosukeignore';
|
|
9
|
+
/**
|
|
10
|
+
* Read .kosukeignore file and return ignore patterns
|
|
11
|
+
*/
|
|
12
|
+
function readKosukeignore(cwd = process.cwd()) {
|
|
13
|
+
const kosukeignorePath = join(cwd, KOSUKEIGNORE_FILE);
|
|
14
|
+
if (!existsSync(kosukeignorePath)) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
const content = readFileSync(kosukeignorePath, 'utf-8');
|
|
18
|
+
return content
|
|
19
|
+
.split('\n')
|
|
20
|
+
.map((line) => line.trim())
|
|
21
|
+
.filter((line) => line && !line.startsWith('#'));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Discover files to analyze, respecting .kosukeignore
|
|
25
|
+
*/
|
|
26
|
+
export async function discoverFiles(options = {}) {
|
|
27
|
+
const cwd = options.cwd || process.cwd();
|
|
28
|
+
// Default patterns to include
|
|
29
|
+
const defaultPatterns = ['**/*.ts', '**/*.tsx', '**/*.py'];
|
|
30
|
+
// Build include patterns
|
|
31
|
+
let includePatterns;
|
|
32
|
+
if (options.scope) {
|
|
33
|
+
// Scope: specific directories
|
|
34
|
+
const scopes = options.scope.split(',').map((s) => s.trim());
|
|
35
|
+
if (options.types) {
|
|
36
|
+
includePatterns = scopes.flatMap((scope) => options.types.map((type) => `${scope}/**/*.${type}`));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
includePatterns = scopes.flatMap((scope) => defaultPatterns.map((pattern) => `${scope}/${pattern}`));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (options.types) {
|
|
43
|
+
// Types: specific file extensions
|
|
44
|
+
includePatterns = options.types.map((type) => `**/*.${type}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Default: all supported types
|
|
48
|
+
includePatterns = options.include || defaultPatterns;
|
|
49
|
+
}
|
|
50
|
+
// Load .kosukeignore patterns
|
|
51
|
+
const kosukeignorePatterns = readKosukeignore(cwd);
|
|
52
|
+
// Always exclude these
|
|
53
|
+
const alwaysExclude = [
|
|
54
|
+
'node_modules/**',
|
|
55
|
+
'.next/**',
|
|
56
|
+
'dist/**',
|
|
57
|
+
'build/**',
|
|
58
|
+
'**/*.tsbuildinfo',
|
|
59
|
+
'drizzle/**',
|
|
60
|
+
'__pycache__/**',
|
|
61
|
+
'*.pyc',
|
|
62
|
+
'.pytest_cache/**',
|
|
63
|
+
'engine/uv.lock',
|
|
64
|
+
];
|
|
65
|
+
const ig = ignore().add([...kosukeignorePatterns, ...alwaysExclude]);
|
|
66
|
+
// Find all matching files
|
|
67
|
+
const allFiles = [];
|
|
68
|
+
for (const pattern of includePatterns) {
|
|
69
|
+
const files = await glob(pattern, {
|
|
70
|
+
cwd,
|
|
71
|
+
ignore: alwaysExclude,
|
|
72
|
+
nodir: true,
|
|
73
|
+
});
|
|
74
|
+
allFiles.push(...files);
|
|
75
|
+
}
|
|
76
|
+
// Filter with .kosukeignore
|
|
77
|
+
const filteredFiles = allFiles.filter((file) => !ig.ignores(file));
|
|
78
|
+
// Remove duplicates and sort
|
|
79
|
+
return [...new Set(filteredFiles)].sort();
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=file-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-discovery.js","sourceRoot":"","sources":["../../../kosuke/utils/file-discovery.ts"],"names":[],"mappings":"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"}
|