@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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/index.d.ts +18 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +105 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/kosuke/commands/analyse.d.ts +15 -0
  8. package/dist/kosuke/commands/analyse.d.ts.map +1 -0
  9. package/dist/kosuke/commands/analyse.js +308 -0
  10. package/dist/kosuke/commands/analyse.js.map +1 -0
  11. package/dist/kosuke/commands/sync-rules.d.ts +8 -0
  12. package/dist/kosuke/commands/sync-rules.d.ts.map +1 -0
  13. package/dist/kosuke/commands/sync-rules.js +364 -0
  14. package/dist/kosuke/commands/sync-rules.js.map +1 -0
  15. package/dist/kosuke/types.d.ts +31 -0
  16. package/dist/kosuke/types.d.ts.map +1 -0
  17. package/dist/kosuke/types.js +5 -0
  18. package/dist/kosuke/types.js.map +1 -0
  19. package/dist/kosuke/utils/batch-creator.d.ts +14 -0
  20. package/dist/kosuke/utils/batch-creator.d.ts.map +1 -0
  21. package/dist/kosuke/utils/batch-creator.js +76 -0
  22. package/dist/kosuke/utils/batch-creator.js.map +1 -0
  23. package/dist/kosuke/utils/file-discovery.d.ts +15 -0
  24. package/dist/kosuke/utils/file-discovery.d.ts.map +1 -0
  25. package/dist/kosuke/utils/file-discovery.js +81 -0
  26. package/dist/kosuke/utils/file-discovery.js.map +1 -0
  27. package/dist/kosuke/utils/git.d.ts +29 -0
  28. package/dist/kosuke/utils/git.d.ts.map +1 -0
  29. package/dist/kosuke/utils/git.js +72 -0
  30. package/dist/kosuke/utils/git.js.map +1 -0
  31. package/dist/kosuke/utils/github.d.ts +17 -0
  32. package/dist/kosuke/utils/github.d.ts.map +1 -0
  33. package/dist/kosuke/utils/github.js +22 -0
  34. package/dist/kosuke/utils/github.js.map +1 -0
  35. package/dist/kosuke/utils/validator.d.ts +22 -0
  36. package/dist/kosuke/utils/validator.d.ts.map +1 -0
  37. package/dist/kosuke/utils/validator.js +65 -0
  38. package/dist/kosuke/utils/validator.js.map +1 -0
  39. 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,5 @@
1
+ /**
2
+ * Shared types for Kosuke CLI
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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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"}