@kosuke-ai/cli 0.0.9 → 0.0.11

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 (48) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +51 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/kosuke/commands/analyse.d.ts.map +1 -1
  6. package/dist/kosuke/commands/analyse.js +52 -94
  7. package/dist/kosuke/commands/analyse.js.map +1 -1
  8. package/dist/kosuke/commands/getcode.d.ts +29 -0
  9. package/dist/kosuke/commands/getcode.d.ts.map +1 -0
  10. package/dist/kosuke/commands/getcode.js +204 -0
  11. package/dist/kosuke/commands/getcode.js.map +1 -0
  12. package/dist/kosuke/commands/lint.d.ts +5 -0
  13. package/dist/kosuke/commands/lint.d.ts.map +1 -1
  14. package/dist/kosuke/commands/lint.js +21 -39
  15. package/dist/kosuke/commands/lint.js.map +1 -1
  16. package/dist/kosuke/commands/requirements.d.ts.map +1 -1
  17. package/dist/kosuke/commands/requirements.js +1 -18
  18. package/dist/kosuke/commands/requirements.js.map +1 -1
  19. package/dist/kosuke/commands/sync-rules.d.ts.map +1 -1
  20. package/dist/kosuke/commands/sync-rules.js +56 -48
  21. package/dist/kosuke/commands/sync-rules.js.map +1 -1
  22. package/dist/kosuke/commands/tickets.d.ts +24 -0
  23. package/dist/kosuke/commands/tickets.d.ts.map +1 -0
  24. package/dist/kosuke/commands/tickets.js +298 -0
  25. package/dist/kosuke/commands/tickets.js.map +1 -0
  26. package/dist/kosuke/types.d.ts +50 -0
  27. package/dist/kosuke/types.d.ts.map +1 -1
  28. package/dist/kosuke/utils/claude-agent.d.ts +57 -0
  29. package/dist/kosuke/utils/claude-agent.d.ts.map +1 -0
  30. package/dist/kosuke/utils/claude-agent.js +177 -0
  31. package/dist/kosuke/utils/claude-agent.js.map +1 -0
  32. package/dist/kosuke/utils/repository-manager.d.ts +13 -0
  33. package/dist/kosuke/utils/repository-manager.d.ts.map +1 -0
  34. package/dist/kosuke/utils/repository-manager.js +94 -0
  35. package/dist/kosuke/utils/repository-manager.js.map +1 -0
  36. package/dist/kosuke/utils/repository-resolver.d.ts +12 -0
  37. package/dist/kosuke/utils/repository-resolver.d.ts.map +1 -0
  38. package/dist/kosuke/utils/repository-resolver.js +186 -0
  39. package/dist/kosuke/utils/repository-resolver.js.map +1 -0
  40. package/dist/kosuke/utils/validator.d.ts +19 -7
  41. package/dist/kosuke/utils/validator.d.ts.map +1 -1
  42. package/dist/kosuke/utils/validator.js +103 -16
  43. package/dist/kosuke/utils/validator.js.map +1 -1
  44. package/dist/lib.d.ts +25 -4
  45. package/dist/lib.d.ts.map +1 -1
  46. package/dist/lib.js +22 -3
  47. package/dist/lib.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Tickets command - Generate tickets from requirements document
3
+ *
4
+ * This command analyzes a requirements document (default: docs.md) and generates
5
+ * structured tickets in three phases:
6
+ * 1. Schema tickets (database design)
7
+ * 2. Backend tickets (API, services, business logic)
8
+ * 3. Frontend tickets (pages, components, UI)
9
+ *
10
+ * Usage:
11
+ * kosuke tickets # Use docs.md
12
+ * kosuke tickets --path=custom.md # Custom requirements file
13
+ * kosuke tickets --output=my-tickets.json # Custom output file
14
+ */
15
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
16
+ import { join } from 'path';
17
+ import { ensureRepoReady } from '../utils/repository-manager.js';
18
+ import { runAgent, formatCostBreakdown } from '../utils/claude-agent.js';
19
+ /**
20
+ * Build system prompt for ticket generation
21
+ */
22
+ function buildTicketGenerationPrompt(phase, requirementsContent, repoPath) {
23
+ const phaseInstructions = {
24
+ schema: `
25
+ **PHASE 1: DATABASE SCHEMA TICKETS**
26
+
27
+ Generate ONE comprehensive schema ticket that includes:
28
+ - All database tables needed
29
+ - Relationships between tables
30
+ - Indexes and constraints
31
+ - Data types and validation rules
32
+ - Any special considerations (soft deletes, timestamps, etc.)
33
+
34
+ The schema should follow the patterns used in kosuke-template (Prisma ORM).
35
+
36
+ Ticket ID: SCHEMA-1
37
+ `,
38
+ backend: `
39
+ **PHASE 2: BACKEND/API TICKETS**
40
+
41
+ Generate backend tickets for:
42
+ - API endpoints and routes
43
+ - Service layer logic
44
+ - Authentication and authorization
45
+ - Business logic implementation
46
+ - Data validation and processing
47
+ - Third-party integrations
48
+
49
+ Create ONE ticket per feature/module. Each ticket should be independently implementable.
50
+
51
+ Ticket IDs: BACKEND-1, BACKEND-2, BACKEND-3, etc. (sequential)
52
+
53
+ The implementation should follow the patterns used in kosuke-template (tRPC, Next.js API routes).
54
+ `,
55
+ frontend: `
56
+ **PHASE 3: FRONTEND/UI TICKETS**
57
+
58
+ Generate frontend tickets for:
59
+ - Pages and routing
60
+ - UI components
61
+ - Forms and validation
62
+ - State management
63
+ - User interactions
64
+ - Responsive design
65
+
66
+ Create ONE ticket per PAGE. Each ticket should cover all components and functionality for that page.
67
+
68
+ Ticket IDs: FRONTEND-1, FRONTEND-2, FRONTEND-3, etc. (sequential)
69
+
70
+ The implementation should follow the patterns used in kosuke-template (Next.js, React, TailwindCSS).
71
+ `,
72
+ };
73
+ return `You are an expert software architect and project planner analyzing a requirements document to generate implementation tickets.
74
+
75
+ **Your Task:**
76
+ ${phaseInstructions[phase]}
77
+
78
+ **Requirements Document:**
79
+ ${requirementsContent}
80
+
81
+ **Context:**
82
+ You have access to the kosuke-template repository at: ${repoPath}
83
+ Use this to understand the tech stack, architecture patterns, and coding conventions.
84
+ DO NOT reference specific files in your tickets - use the template only for general understanding.
85
+
86
+ **Ticket Structure:**
87
+ Each ticket must be a JSON object with:
88
+ - id: string (e.g., "SCHEMA-1", "BACKEND-1", "FRONTEND-1")
89
+ - title: string (clear, concise title)
90
+ - description: string (detailed description with acceptance criteria)
91
+ - estimatedEffort: number (1-10, where 1=very easy, 10=very complex)
92
+ - status: "Todo" (all tickets start as Todo)
93
+
94
+ **Output Format:**
95
+ Return ONLY a valid JSON array of tickets. No markdown, no code blocks, just raw JSON.
96
+
97
+ Example:
98
+ [
99
+ {
100
+ "id": "SCHEMA-1",
101
+ "title": "Design and implement complete database schema",
102
+ "description": "Create Prisma schema including:\\n- Users table with authentication fields\\n- Organizations table with multi-tenant support\\n- Posts table for social media content\\n- Automations table for campaign configuration\\n- Leads table with status tracking\\n\\nRelationships:\\n- User belongs to many Organizations\\n- Posts and Automations belong to Organization\\n- Leads belong to Automation and Post\\n\\nAcceptance Criteria:\\n- Schema validates with Prisma\\n- Migrations run successfully\\n- All relationships properly defined\\n- Indexes on foreign keys and frequently queried fields",
103
+ "estimatedEffort": 8,
104
+ "status": "Todo"
105
+ }
106
+ ]
107
+
108
+ **Critical Instructions:**
109
+ 1. Analyze the requirements thoroughly
110
+ 2. Explore kosuke-template to understand patterns (use read_file, grep, codebase_search tools)
111
+ 3. Generate tickets that are actionable and specific
112
+ 4. Return ONLY valid JSON - no explanations, no markdown formatting
113
+ 5. Ensure ticket IDs follow the naming convention (${phase.toUpperCase()}-N)
114
+ 6. Make descriptions detailed with clear acceptance criteria
115
+ 7. Estimate effort realistically (consider complexity, dependencies, testing)
116
+
117
+ Begin by exploring the kosuke-template repository, then generate the tickets.`;
118
+ }
119
+ /**
120
+ * Parse tickets from Claude's response
121
+ */
122
+ function parseTicketsFromResponse(response, phase) {
123
+ try {
124
+ // Extract JSON from response (in case Claude includes extra text)
125
+ const jsonMatch = response.match(/\[[\s\S]*\]/);
126
+ if (!jsonMatch) {
127
+ throw new Error(`No JSON array found in ${phase} response`);
128
+ }
129
+ const tickets = JSON.parse(jsonMatch[0]);
130
+ // Validate tickets
131
+ if (!Array.isArray(tickets)) {
132
+ throw new Error(`Expected array of tickets, got ${typeof tickets}`);
133
+ }
134
+ for (const ticket of tickets) {
135
+ if (!ticket.id || !ticket.title || !ticket.description) {
136
+ throw new Error(`Invalid ticket structure: ${JSON.stringify(ticket)}`);
137
+ }
138
+ if (typeof ticket.estimatedEffort !== 'number' ||
139
+ ticket.estimatedEffort < 1 ||
140
+ ticket.estimatedEffort > 10) {
141
+ throw new Error(`Invalid estimatedEffort for ticket ${ticket.id}: ${ticket.estimatedEffort}`);
142
+ }
143
+ if (!ticket.status) {
144
+ ticket.status = 'Todo';
145
+ }
146
+ }
147
+ return tickets;
148
+ }
149
+ catch (error) {
150
+ console.error(`\n❌ Failed to parse tickets from ${phase} phase:`);
151
+ console.error(`Raw response:\n${response.substring(0, 500)}...\n`);
152
+ throw new Error(`Failed to parse ${phase} tickets: ${error instanceof Error ? error.message : String(error)}`);
153
+ }
154
+ }
155
+ /**
156
+ * Generate tickets for a specific phase
157
+ */
158
+ async function generatePhaseTickets(phase, requirementsContent, repoPath) {
159
+ const phaseEmoji = {
160
+ schema: '🗄️',
161
+ backend: '⚙️',
162
+ frontend: '🎨',
163
+ };
164
+ const phaseName = {
165
+ schema: 'Schema',
166
+ backend: 'Backend',
167
+ frontend: 'Frontend',
168
+ };
169
+ console.log(`\n${'='.repeat(60)}`);
170
+ console.log(`${phaseEmoji[phase]} Phase ${phase === 'schema' ? '1' : phase === 'backend' ? '2' : '3'}: ${phaseName[phase]} Tickets`);
171
+ console.log(`${'='.repeat(60)}\n`);
172
+ const systemPrompt = buildTicketGenerationPrompt(phase, requirementsContent, repoPath);
173
+ const agentResult = await runAgent(`Generate ${phaseName[phase]} tickets from the requirements document.`, {
174
+ systemPrompt,
175
+ cwd: repoPath,
176
+ maxTurns: 25,
177
+ verbosity: 'normal',
178
+ });
179
+ // Parse tickets from response
180
+ const tickets = parseTicketsFromResponse(agentResult.response, phase);
181
+ console.log(`\n✅ Generated ${tickets.length} ${phaseName[phase]} ticket${tickets.length === 1 ? '' : 's'}`);
182
+ tickets.forEach((ticket) => {
183
+ console.log(` ${phaseEmoji[phase]} ${ticket.id}: ${ticket.title} (Effort: ${ticket.estimatedEffort}/10)`);
184
+ });
185
+ return {
186
+ tickets,
187
+ tokensUsed: agentResult.tokensUsed,
188
+ cost: agentResult.cost,
189
+ };
190
+ }
191
+ /**
192
+ * Core tickets logic
193
+ */
194
+ export async function ticketsCore(options) {
195
+ const { path = 'docs.md', template = 'Kosuke-Org/kosuke-template' } = options;
196
+ // 1. Read requirements document
197
+ console.log('📄 Reading requirements document...');
198
+ const requirementsPath = join(process.cwd(), path);
199
+ if (!existsSync(requirementsPath)) {
200
+ throw new Error(`Requirements document not found: ${path}\n` +
201
+ `Please provide a valid path using --path=<file>\n` +
202
+ `Example: kosuke tickets --path=requirements.md`);
203
+ }
204
+ const requirementsContent = readFileSync(requirementsPath, 'utf-8');
205
+ console.log(` ✅ Loaded ${path} (${requirementsContent.length} characters)\n`);
206
+ // 2. Fetch kosuke-template for context
207
+ console.log('📥 Fetching kosuke-template for context...');
208
+ const repoInfo = await ensureRepoReady(template);
209
+ console.log(` ✅ Template repository ready at ${repoInfo.localPath}\n`);
210
+ // 3. Generate tickets in three phases
211
+ let totalInputTokens = 0;
212
+ let totalOutputTokens = 0;
213
+ let totalCacheCreationTokens = 0;
214
+ let totalCacheReadTokens = 0;
215
+ let totalCost = 0;
216
+ // Phase 1: Schema
217
+ const schemaResult = await generatePhaseTickets('schema', requirementsContent, repoInfo.localPath);
218
+ totalInputTokens += schemaResult.tokensUsed.input;
219
+ totalOutputTokens += schemaResult.tokensUsed.output;
220
+ totalCacheCreationTokens += schemaResult.tokensUsed.cacheCreation;
221
+ totalCacheReadTokens += schemaResult.tokensUsed.cacheRead;
222
+ totalCost += schemaResult.cost;
223
+ // Phase 2: Backend
224
+ const backendResult = await generatePhaseTickets('backend', requirementsContent, repoInfo.localPath);
225
+ totalInputTokens += backendResult.tokensUsed.input;
226
+ totalOutputTokens += backendResult.tokensUsed.output;
227
+ totalCacheCreationTokens += backendResult.tokensUsed.cacheCreation;
228
+ totalCacheReadTokens += backendResult.tokensUsed.cacheRead;
229
+ totalCost += backendResult.cost;
230
+ // Phase 3: Frontend
231
+ const frontendResult = await generatePhaseTickets('frontend', requirementsContent, repoInfo.localPath);
232
+ totalInputTokens += frontendResult.tokensUsed.input;
233
+ totalOutputTokens += frontendResult.tokensUsed.output;
234
+ totalCacheCreationTokens += frontendResult.tokensUsed.cacheCreation;
235
+ totalCacheReadTokens += frontendResult.tokensUsed.cacheRead;
236
+ totalCost += frontendResult.cost;
237
+ const totalTickets = schemaResult.tickets.length + backendResult.tickets.length + frontendResult.tickets.length;
238
+ return {
239
+ schemaTickets: schemaResult.tickets,
240
+ backendTickets: backendResult.tickets,
241
+ frontendTickets: frontendResult.tickets,
242
+ totalTickets,
243
+ tokensUsed: {
244
+ input: totalInputTokens,
245
+ output: totalOutputTokens,
246
+ cacheCreation: totalCacheCreationTokens,
247
+ cacheRead: totalCacheReadTokens,
248
+ },
249
+ cost: totalCost,
250
+ };
251
+ }
252
+ /**
253
+ * Main tickets command
254
+ */
255
+ export async function ticketsCommand(options) {
256
+ console.log('🎫 Starting Ticket Generation...\n');
257
+ try {
258
+ // Validate environment
259
+ if (!process.env.ANTHROPIC_API_KEY) {
260
+ throw new Error('ANTHROPIC_API_KEY environment variable is required');
261
+ }
262
+ // Execute core logic
263
+ const result = await ticketsCore(options);
264
+ // Display summary
265
+ console.log(`\n${'='.repeat(60)}`);
266
+ console.log('📊 Summary');
267
+ console.log(`${'='.repeat(60)}`);
268
+ console.log(`🗄️ Schema Tickets: ${result.schemaTickets.length}`);
269
+ console.log(`⚙️ Backend Tickets: ${result.backendTickets.length}`);
270
+ console.log(`🎨 Frontend Tickets: ${result.frontendTickets.length}`);
271
+ console.log(`📝 Total Tickets: ${result.totalTickets}`);
272
+ console.log(`${'='.repeat(60)}\n`);
273
+ // Display cost breakdown
274
+ const costBreakdown = formatCostBreakdown({
275
+ cost: result.cost,
276
+ tokensUsed: result.tokensUsed,
277
+ fixCount: 0,
278
+ response: '',
279
+ filesReferenced: new Set(),
280
+ });
281
+ console.log(`💰 Total Cost: ${costBreakdown}\n`);
282
+ // Save to file
283
+ const outputPath = options.output || 'tickets.json';
284
+ const outputData = {
285
+ generatedAt: new Date().toISOString(),
286
+ totalTickets: result.totalTickets,
287
+ tickets: [...result.schemaTickets, ...result.backendTickets, ...result.frontendTickets],
288
+ };
289
+ writeFileSync(outputPath, JSON.stringify(outputData, null, 2), 'utf-8');
290
+ console.log(`💾 Tickets saved to: ${outputPath}\n`);
291
+ console.log('✅ Ticket generation completed successfully!');
292
+ }
293
+ catch (error) {
294
+ console.error('\n❌ Ticket generation failed:', error);
295
+ throw error;
296
+ }
297
+ }
298
+ //# sourceMappingURL=tickets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.js","sourceRoot":"","sources":["../../../kosuke/commands/tickets.ts"],"names":[],"mappings":"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"}
@@ -37,5 +37,55 @@ export interface GitInfo {
37
37
  owner: string;
38
38
  repo: string;
39
39
  }
40
+ export interface GetCodeOptions {
41
+ repo?: string;
42
+ query: string;
43
+ template?: boolean;
44
+ output?: string;
45
+ }
46
+ export interface RepositoryInfo {
47
+ owner: string;
48
+ repo: string;
49
+ fullName: string;
50
+ localPath: string;
51
+ }
52
+ export interface CodeExplorationResult {
53
+ repository: string;
54
+ query: string;
55
+ response: string;
56
+ filesReferenced: string[];
57
+ tokensUsed: {
58
+ input: number;
59
+ output: number;
60
+ cacheCreation: number;
61
+ cacheRead: number;
62
+ };
63
+ cost: number;
64
+ }
65
+ export interface TicketsOptions {
66
+ path?: string;
67
+ output?: string;
68
+ template?: string;
69
+ }
70
+ export interface Ticket {
71
+ id: string;
72
+ title: string;
73
+ description: string;
74
+ estimatedEffort: number;
75
+ status: 'Todo' | 'Done';
76
+ }
77
+ export interface TicketsResult {
78
+ schemaTickets: Ticket[];
79
+ backendTickets: Ticket[];
80
+ frontendTickets: Ticket[];
81
+ totalTickets: number;
82
+ tokensUsed: {
83
+ input: number;
84
+ output: number;
85
+ cacheCreation: number;
86
+ cacheRead: number;
87
+ };
88
+ cost: number;
89
+ }
40
90
  export {};
41
91
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../kosuke/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Claude Agent - Centralized Claude SDK integration
3
+ *
4
+ * Provides unified agent initialization, execution, logging, and cost tracking
5
+ * for all commands that use Claude Code Agent SDK.
6
+ */
7
+ import { type PermissionMode } from '@anthropic-ai/claude-agent-sdk';
8
+ /**
9
+ * Verbosity levels for agent execution
10
+ * - minimal: Only show tool usage (fixes, file reads)
11
+ * - normal: Show tool usage + key insights
12
+ * - verbose: Show all text output + tool usage
13
+ */
14
+ export type AgentVerbosity = 'minimal' | 'normal' | 'verbose';
15
+ /**
16
+ * Configuration for agent execution
17
+ */
18
+ export interface AgentConfig {
19
+ systemPrompt: string;
20
+ maxTurns?: number;
21
+ model?: string;
22
+ cwd?: string;
23
+ verbosity?: AgentVerbosity;
24
+ permissionMode?: PermissionMode;
25
+ }
26
+ /**
27
+ * Result from agent execution
28
+ */
29
+ export interface AgentResult {
30
+ response: string;
31
+ tokensUsed: {
32
+ input: number;
33
+ output: number;
34
+ cacheCreation: number;
35
+ cacheRead: number;
36
+ };
37
+ cost: number;
38
+ fixCount: number;
39
+ filesReferenced: Set<string>;
40
+ }
41
+ /**
42
+ * Calculate cost based on Claude Sonnet 4.5 pricing
43
+ * - $3 per million input tokens
44
+ * - $15 per million output tokens
45
+ * - $3.75 per million cache creation tokens (input + 25% overhead)
46
+ * - $0.30 per million cache read tokens (90% discount from input)
47
+ */
48
+ export declare function calculateCost(inputTokens: number, outputTokens: number, cacheCreationTokens?: number, cacheReadTokens?: number): number;
49
+ /**
50
+ * Format cost breakdown as human-readable string
51
+ */
52
+ export declare function formatCostBreakdown(result: AgentResult): string;
53
+ /**
54
+ * Run Claude agent with unified configuration and logging
55
+ */
56
+ export declare function runAgent(prompt: string, config: AgentConfig): Promise<AgentResult>;
57
+ //# sourceMappingURL=claude-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-agent.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/claude-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,mBAAmB,GAAE,MAAU,EAC/B,eAAe,GAAE,MAAU,GAC1B,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgB/D;AAuED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAwExF"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Claude Agent - Centralized Claude SDK integration
3
+ *
4
+ * Provides unified agent initialization, execution, logging, and cost tracking
5
+ * for all commands that use Claude Code Agent SDK.
6
+ */
7
+ import { query } from '@anthropic-ai/claude-agent-sdk';
8
+ /**
9
+ * Calculate cost based on Claude Sonnet 4.5 pricing
10
+ * - $3 per million input tokens
11
+ * - $15 per million output tokens
12
+ * - $3.75 per million cache creation tokens (input + 25% overhead)
13
+ * - $0.30 per million cache read tokens (90% discount from input)
14
+ */
15
+ export function calculateCost(inputTokens, outputTokens, cacheCreationTokens = 0, cacheReadTokens = 0) {
16
+ const INPUT_COST_PER_MILLION = 3.0;
17
+ const OUTPUT_COST_PER_MILLION = 15.0;
18
+ const CACHE_CREATION_COST_PER_MILLION = 3.75;
19
+ const CACHE_READ_COST_PER_MILLION = 0.3;
20
+ const inputCost = (inputTokens / 1000000) * INPUT_COST_PER_MILLION;
21
+ const outputCost = (outputTokens / 1000000) * OUTPUT_COST_PER_MILLION;
22
+ const cacheCreationCost = (cacheCreationTokens / 1000000) * CACHE_CREATION_COST_PER_MILLION;
23
+ const cacheReadCost = (cacheReadTokens / 1000000) * CACHE_READ_COST_PER_MILLION;
24
+ return inputCost + outputCost + cacheCreationCost + cacheReadCost;
25
+ }
26
+ /**
27
+ * Format cost breakdown as human-readable string
28
+ */
29
+ export function formatCostBreakdown(result) {
30
+ const tokenBreakdown = [];
31
+ if (result.tokensUsed.input > 0) {
32
+ tokenBreakdown.push(`${result.tokensUsed.input.toLocaleString()} input`);
33
+ }
34
+ if (result.tokensUsed.output > 0) {
35
+ tokenBreakdown.push(`${result.tokensUsed.output.toLocaleString()} output`);
36
+ }
37
+ if (result.tokensUsed.cacheCreation > 0) {
38
+ tokenBreakdown.push(`${result.tokensUsed.cacheCreation.toLocaleString()} cache write`);
39
+ }
40
+ if (result.tokensUsed.cacheRead > 0) {
41
+ tokenBreakdown.push(`${result.tokensUsed.cacheRead.toLocaleString()} cache read`);
42
+ }
43
+ return `$${result.cost.toFixed(4)} (${tokenBreakdown.join(' + ')} tokens)`;
44
+ }
45
+ /**
46
+ * Determine if text should be logged based on verbosity level
47
+ */
48
+ function shouldLogText(text, verbosity) {
49
+ if (verbosity === 'verbose') {
50
+ return true;
51
+ }
52
+ if (verbosity === 'minimal') {
53
+ return false;
54
+ }
55
+ // Normal: Log key insights only
56
+ const keywords = [
57
+ 'violation',
58
+ 'fix',
59
+ 'issue',
60
+ 'error',
61
+ 'found',
62
+ 'located',
63
+ 'implementation',
64
+ '✅',
65
+ '❌',
66
+ ];
67
+ const lowerText = text.toLowerCase();
68
+ return keywords.some((keyword) => lowerText.includes(keyword)) || text.length < 200;
69
+ }
70
+ /**
71
+ * Log assistant message based on verbosity
72
+ */
73
+ function logAssistantMessage(text, verbosity) {
74
+ const trimmed = text.trim();
75
+ if (!trimmed || !shouldLogText(trimmed, verbosity)) {
76
+ return;
77
+ }
78
+ // Truncate long messages for readability
79
+ const maxLength = verbosity === 'verbose' ? 500 : 100;
80
+ const display = trimmed.length > maxLength ? `${trimmed.substring(0, maxLength)}...` : trimmed;
81
+ console.log(` 💭 ${display}`);
82
+ }
83
+ /**
84
+ * Log tool usage
85
+ */
86
+ function logToolUsage(toolName, toolInput, filesReferenced) {
87
+ if (toolName === 'read_file' && toolInput && typeof toolInput === 'object') {
88
+ const input = toolInput;
89
+ if (input.target_file) {
90
+ console.log(` 🔧 Reading ${input.target_file}`);
91
+ filesReferenced.add(input.target_file);
92
+ }
93
+ }
94
+ else if (toolName === 'grep' && toolInput && typeof toolInput === 'object') {
95
+ const input = toolInput;
96
+ console.log(` 🔍 Searching for: ${input.pattern || 'pattern'}`);
97
+ }
98
+ else if (toolName === 'glob_file_search' && toolInput && typeof toolInput === 'object') {
99
+ const input = toolInput;
100
+ console.log(` 📁 Finding files: ${input.glob_pattern || '*'}`);
101
+ }
102
+ else if (toolName === 'codebase_search' && toolInput && typeof toolInput === 'object') {
103
+ const input = toolInput;
104
+ console.log(` 🔎 Searching codebase: ${input.query || 'query'}`);
105
+ }
106
+ else if (toolName === 'write' || toolName === 'search_replace') {
107
+ // Don't log here - fixCount will handle it
108
+ }
109
+ else {
110
+ console.log(` 🔧 Using ${toolName}`);
111
+ }
112
+ }
113
+ /**
114
+ * Run Claude agent with unified configuration and logging
115
+ */
116
+ export async function runAgent(prompt, config) {
117
+ const { systemPrompt, maxTurns = 20, model = 'claude-sonnet-4-5', cwd = process.cwd(), verbosity = 'normal', permissionMode = 'bypassPermissions', } = config;
118
+ const options = {
119
+ model,
120
+ systemPrompt,
121
+ maxTurns,
122
+ cwd,
123
+ permissionMode,
124
+ };
125
+ const responseStream = query({ prompt, options });
126
+ let response = '';
127
+ let inputTokens = 0;
128
+ let outputTokens = 0;
129
+ let cacheCreationTokens = 0;
130
+ let cacheReadTokens = 0;
131
+ let fixCount = 0;
132
+ const filesReferenced = new Set();
133
+ // Process the response stream
134
+ for await (const message of responseStream) {
135
+ if (message.type === 'assistant') {
136
+ const content = message.message.content;
137
+ for (const block of content) {
138
+ if (block.type === 'text' && block.text) {
139
+ response += block.text;
140
+ logAssistantMessage(block.text, verbosity);
141
+ }
142
+ else if (block.type === 'tool_use') {
143
+ // Track fixes
144
+ if (block.name === 'write' || block.name === 'search_replace') {
145
+ fixCount++;
146
+ console.log(` 🔧 Applying fix ${fixCount}...`);
147
+ }
148
+ else {
149
+ logToolUsage(block.name, block.input, filesReferenced);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ // Track token usage
155
+ if (message.type === 'result' && message.subtype === 'success') {
156
+ inputTokens += message.usage.input_tokens || 0;
157
+ outputTokens += message.usage.output_tokens || 0;
158
+ cacheCreationTokens += message.usage.cache_creation_input_tokens || 0;
159
+ cacheReadTokens += message.usage.cache_read_input_tokens || 0;
160
+ }
161
+ }
162
+ // Calculate cost
163
+ const cost = calculateCost(inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens);
164
+ return {
165
+ response: response.trim(),
166
+ tokensUsed: {
167
+ input: inputTokens,
168
+ output: outputTokens,
169
+ cacheCreation: cacheCreationTokens,
170
+ cacheRead: cacheReadTokens,
171
+ },
172
+ cost,
173
+ fixCount,
174
+ filesReferenced,
175
+ };
176
+ }
177
+ //# sourceMappingURL=claude-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-agent.js","sourceRoot":"","sources":["../../../kosuke/utils/claude-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Repository Manager - Clone and update GitHub repositories
3
+ */
4
+ import type { RepositoryInfo } from '../types.js';
5
+ /**
6
+ * Ensure repository is cloned and up-to-date
7
+ */
8
+ export declare function ensureRepoReady(repoIdentifier: string): Promise<RepositoryInfo>;
9
+ /**
10
+ * Get local path for a repository (without ensuring it exists)
11
+ */
12
+ export declare function getRepoLocalPath(repoIdentifier: string): string;
13
+ //# sourceMappingURL=repository-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-manager.d.ts","sourceRoot":"","sources":["../../../kosuke/utils/repository-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD;;GAEG;AACH,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAYrF;AAiFD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAG/D"}