@kosuke-ai/cli 0.0.12 → 0.0.14

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 (55) hide show
  1. package/dist/index.d.ts +14 -6
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +148 -6
  4. package/dist/index.js.map +1 -1
  5. package/dist/kosuke/commands/build.d.ts +22 -0
  6. package/dist/kosuke/commands/build.d.ts.map +1 -0
  7. package/dist/kosuke/commands/build.js +135 -0
  8. package/dist/kosuke/commands/build.js.map +1 -0
  9. package/dist/kosuke/commands/review.d.ts +21 -0
  10. package/dist/kosuke/commands/review.d.ts.map +1 -0
  11. package/dist/kosuke/commands/review.js +185 -0
  12. package/dist/kosuke/commands/review.js.map +1 -0
  13. package/dist/kosuke/commands/ship.d.ts +23 -0
  14. package/dist/kosuke/commands/ship.d.ts.map +1 -0
  15. package/dist/kosuke/commands/ship.js +419 -0
  16. package/dist/kosuke/commands/ship.js.map +1 -0
  17. package/dist/kosuke/commands/test.d.ts +27 -0
  18. package/dist/kosuke/commands/test.d.ts.map +1 -0
  19. package/dist/kosuke/commands/test.js +338 -0
  20. package/dist/kosuke/commands/test.js.map +1 -0
  21. package/dist/kosuke/types.d.ts +82 -2
  22. package/dist/kosuke/types.d.ts.map +1 -1
  23. package/dist/kosuke/utils/error-analyzer.d.ts +32 -0
  24. package/dist/kosuke/utils/error-analyzer.d.ts.map +1 -0
  25. package/dist/kosuke/utils/error-analyzer.js +129 -0
  26. package/dist/kosuke/utils/error-analyzer.js.map +1 -0
  27. package/dist/kosuke/utils/git.d.ts +12 -0
  28. package/dist/kosuke/utils/git.d.ts.map +1 -1
  29. package/dist/kosuke/utils/git.js +39 -0
  30. package/dist/kosuke/utils/git.js.map +1 -1
  31. package/dist/kosuke/utils/log-collector.d.ts +81 -0
  32. package/dist/kosuke/utils/log-collector.d.ts.map +1 -0
  33. package/dist/kosuke/utils/log-collector.js +226 -0
  34. package/dist/kosuke/utils/log-collector.js.map +1 -0
  35. package/dist/kosuke/utils/playwright-agent.d.ts +39 -0
  36. package/dist/kosuke/utils/playwright-agent.d.ts.map +1 -0
  37. package/dist/kosuke/utils/playwright-agent.js +245 -0
  38. package/dist/kosuke/utils/playwright-agent.js.map +1 -0
  39. package/dist/kosuke/utils/test-generator.d.ts +22 -0
  40. package/dist/kosuke/utils/test-generator.d.ts.map +1 -0
  41. package/dist/kosuke/utils/test-generator.js +174 -0
  42. package/dist/kosuke/utils/test-generator.js.map +1 -0
  43. package/dist/kosuke/utils/validator.d.ts +11 -0
  44. package/dist/kosuke/utils/validator.d.ts.map +1 -1
  45. package/dist/kosuke/utils/validator.js +100 -0
  46. package/dist/kosuke/utils/validator.js.map +1 -1
  47. package/dist/kosuke/utils/visual-tester.d.ts +71 -0
  48. package/dist/kosuke/utils/visual-tester.d.ts.map +1 -0
  49. package/dist/kosuke/utils/visual-tester.js +202 -0
  50. package/dist/kosuke/utils/visual-tester.js.map +1 -0
  51. package/dist/lib.d.ts +6 -2
  52. package/dist/lib.d.ts.map +1 -1
  53. package/dist/lib.js +5 -1
  54. package/dist/lib.js.map +1 -1
  55. package/package.json +6 -1
package/dist/index.d.ts CHANGED
@@ -3,12 +3,16 @@
3
3
  * Kosuke CLI - Development Automation Tool
4
4
  *
5
5
  * Commands:
6
- * sync-rules [--force] Sync rules from kosuke-template
7
- * analyse Analyze and fix code quality issues
8
- * lint Fix linting errors with Claude AI
9
- * requirements Interactive requirements gathering
10
- * getcode Explore GitHub repositories and fetch code
11
- * tickets Generate implementation tickets from requirements
6
+ * sync-rules [--force] Sync rules from kosuke-template
7
+ * analyse Analyze and fix code quality issues
8
+ * lint Fix linting errors with Claude AI
9
+ * requirements Interactive requirements gathering
10
+ * getcode Explore GitHub repositories and fetch code
11
+ * tickets Generate implementation tickets from requirements
12
+ * ship --ticket=<ID> Implement a single ticket from tickets.json
13
+ * build Batch process all tickets from tickets.json
14
+ * review Review codebase against CLAUDE.md rules
15
+ * test --ticket=<ID> Run E2E tests with automated fixing
12
16
  *
13
17
  * Usage:
14
18
  * bun run kosuke sync-rules
@@ -17,6 +21,10 @@
17
21
  * bun run kosuke requirements
18
22
  * bun run kosuke getcode "query"
19
23
  * bun run kosuke tickets
24
+ * bun run kosuke ship --ticket=SCHEMA-1
25
+ * bun run kosuke build
26
+ * bun run kosuke review
27
+ * bun run kosuke test --ticket=FRONTEND-1
20
28
  *
21
29
  * Environment Variables:
22
30
  * ANTHROPIC_API_KEY - Required for Claude API
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -3,12 +3,16 @@
3
3
  * Kosuke CLI - Development Automation Tool
4
4
  *
5
5
  * Commands:
6
- * sync-rules [--force] Sync rules from kosuke-template
7
- * analyse Analyze and fix code quality issues
8
- * lint Fix linting errors with Claude AI
9
- * requirements Interactive requirements gathering
10
- * getcode Explore GitHub repositories and fetch code
11
- * tickets Generate implementation tickets from requirements
6
+ * sync-rules [--force] Sync rules from kosuke-template
7
+ * analyse Analyze and fix code quality issues
8
+ * lint Fix linting errors with Claude AI
9
+ * requirements Interactive requirements gathering
10
+ * getcode Explore GitHub repositories and fetch code
11
+ * tickets Generate implementation tickets from requirements
12
+ * ship --ticket=<ID> Implement a single ticket from tickets.json
13
+ * build Batch process all tickets from tickets.json
14
+ * review Review codebase against CLAUDE.md rules
15
+ * test --ticket=<ID> Run E2E tests with automated fixing
12
16
  *
13
17
  * Usage:
14
18
  * bun run kosuke sync-rules
@@ -17,6 +21,10 @@
17
21
  * bun run kosuke requirements
18
22
  * bun run kosuke getcode "query"
19
23
  * bun run kosuke tickets
24
+ * bun run kosuke ship --ticket=SCHEMA-1
25
+ * bun run kosuke build
26
+ * bun run kosuke review
27
+ * bun run kosuke test --ticket=FRONTEND-1
20
28
  *
21
29
  * Environment Variables:
22
30
  * ANTHROPIC_API_KEY - Required for Claude API
@@ -29,6 +37,10 @@ import { lintCommand } from './kosuke/commands/lint.js';
29
37
  import { requirementsCommand } from './kosuke/commands/requirements.js';
30
38
  import { getCodeCommand, parseGetCodeArgs } from './kosuke/commands/getcode.js';
31
39
  import { ticketsCommand } from './kosuke/commands/tickets.js';
40
+ import { shipCommand } from './kosuke/commands/ship.js';
41
+ import { buildCommand } from './kosuke/commands/build.js';
42
+ import { reviewCommand } from './kosuke/commands/review.js';
43
+ import { testCommand } from './kosuke/commands/test.js';
32
44
  async function main() {
33
45
  const args = process.argv.slice(2);
34
46
  const command = args[0];
@@ -86,6 +98,68 @@ async function main() {
86
98
  await ticketsCommand(options);
87
99
  break;
88
100
  }
101
+ case 'ship': {
102
+ const ticketArg = args.find((arg) => arg.startsWith('--ticket='))?.split('=')[1];
103
+ if (!ticketArg) {
104
+ console.error('āŒ --ticket flag is required\n');
105
+ console.log('Usage: kosuke ship --ticket=SCHEMA-1 [--review] [--commit | --pr]');
106
+ console.log('\nExamples:');
107
+ console.log(' kosuke ship --ticket=SCHEMA-1 # Local only');
108
+ console.log(' kosuke ship --ticket=BACKEND-2 --review # With review');
109
+ console.log(' kosuke ship --ticket=FRONTEND-1 --commit # Commit to current branch');
110
+ console.log(' kosuke ship --ticket=BACKEND-3 --pr # Create PR (new branch)');
111
+ process.exit(1);
112
+ }
113
+ const options = {
114
+ ticket: ticketArg,
115
+ review: args.includes('--review'),
116
+ commit: args.includes('--commit'),
117
+ pr: args.includes('--pr'),
118
+ baseBranch: args.find((arg) => arg.startsWith('--base-branch='))?.split('=')[1],
119
+ ticketsFile: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
120
+ };
121
+ await shipCommand(options);
122
+ break;
123
+ }
124
+ case 'build': {
125
+ const options = {
126
+ ticketsFile: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
127
+ };
128
+ await buildCommand(options);
129
+ break;
130
+ }
131
+ case 'review': {
132
+ const options = {};
133
+ await reviewCommand(options);
134
+ break;
135
+ }
136
+ case 'test': {
137
+ const ticketArg = args.find((arg) => arg.startsWith('--ticket='))?.split('=')[1];
138
+ if (!ticketArg) {
139
+ console.error('āŒ --ticket flag is required\n');
140
+ console.log('Usage: kosuke test --ticket=FRONTEND-1 [--url=URL] [--headed] [--pr]');
141
+ console.log('\nExamples:');
142
+ console.log(' kosuke test --ticket=FRONTEND-1 # Test with auto-fix');
143
+ console.log(' kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000');
144
+ console.log(' kosuke test --ticket=FRONTEND-1 --headed # Show browser');
145
+ console.log(' kosuke test --ticket=FRONTEND-1 --update-baseline # Update visuals');
146
+ console.log(' kosuke test --ticket=FRONTEND-1 --pr # Create PR');
147
+ process.exit(1);
148
+ }
149
+ const options = {
150
+ ticket: ticketArg,
151
+ url: args.find((arg) => arg.startsWith('--url='))?.split('=')[1],
152
+ headed: args.includes('--headed'),
153
+ debug: args.includes('--debug'),
154
+ updateBaseline: args.includes('--update-baseline'),
155
+ maxRetries: parseInt(args.find((arg) => arg.startsWith('--max-retries='))?.split('=')[1] || '3'),
156
+ ticketsFile: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
157
+ pr: args.includes('--pr'),
158
+ baseBranch: args.find((arg) => arg.startsWith('--base-branch='))?.split('=')[1],
159
+ };
160
+ await testCommand(options);
161
+ break;
162
+ }
89
163
  default:
90
164
  console.error(`āŒ Unknown command: ${command}\n`);
91
165
  showHelp();
@@ -187,6 +261,74 @@ COMMANDS:
187
261
  kosuke tickets --path=requirements.md # Custom requirements file
188
262
  kosuke tickets --output=my-tickets.json # Custom output file
189
263
 
264
+ ship --ticket=<ID> [options]
265
+ Implement a single ticket from tickets.json
266
+ Follows CLAUDE.md rules, runs linting, and optionally performs review
267
+
268
+ Options:
269
+ --ticket=<ID> Ticket ID to implement (required, e.g., SCHEMA-1)
270
+ --review Perform code review step after implementation
271
+ --commit Commit and push to current branch
272
+ --pr Create new branch and pull request (mutually exclusive with --commit)
273
+ --base-branch=<name> Base branch for PR (default: current branch)
274
+ --tickets=<file> Path to tickets file (default: tickets.json)
275
+
276
+ Examples:
277
+ kosuke ship --ticket=SCHEMA-1 # Implement locally only
278
+ kosuke ship --ticket=BACKEND-2 --review # Implement with review
279
+ kosuke ship --ticket=FRONTEND-1 --commit # Commit to current branch
280
+ kosuke ship --ticket=BACKEND-3 --pr # Create new branch + PR
281
+ kosuke ship --ticket=SCHEMA-1 --tickets=custom.json
282
+
283
+ build [options]
284
+ Batch process all "Todo" and "Error" tickets from tickets.json
285
+ Automatically commits each ticket to current branch
286
+ Processes tickets in order: Schema → Backend → Frontend
287
+
288
+ Options:
289
+ --tickets=<file> Path to tickets file (default: tickets.json)
290
+
291
+ Examples:
292
+ git checkout -b feat/implement-tickets # Create feature branch first
293
+ kosuke build # Process and commit all tickets
294
+ gh pr create # Create PR manually
295
+
296
+ kosuke build --tickets=custom.json # Use custom tickets file
297
+
298
+ Note: If a ticket fails, fix the issue and run build again to resume
299
+
300
+ review
301
+ Review current git diff against CLAUDE.md rules
302
+ Identifies and fixes compliance issues in uncommitted changes
303
+ Note: Changes applied locally only (no --pr support)
304
+
305
+ Examples:
306
+ kosuke review # Review uncommitted changes
307
+
308
+ test --ticket=<ID> [options]
309
+ Run E2E tests for a ticket with automated fixing
310
+ Uses Playwright for testing, Claude AI for analyzing and fixing issues
311
+ Iteratively tests and fixes until passing or max retries reached
312
+
313
+ Options:
314
+ --ticket=<ID> Ticket ID to test (required, e.g., FRONTEND-1)
315
+ --url=<URL> Base URL (default: http://localhost:3000)
316
+ --headed Show browser during testing
317
+ --debug Enable Playwright inspector
318
+ --update-baseline Update visual regression baselines
319
+ --max-retries=<N> Maximum fix-retest iterations (default: 3)
320
+ --tickets=<file> Path to tickets file (default: tickets.json)
321
+ --pr Create pull request with fixes
322
+ --base-branch=<name> Base branch for PR (default: current branch)
323
+
324
+ Examples:
325
+ kosuke test --ticket=FRONTEND-1 # Test with auto-fix
326
+ kosuke test --ticket=FRONTEND-1 --url=http://localhost:4000
327
+ kosuke test --ticket=FRONTEND-1 --headed # Show browser
328
+ kosuke test --ticket=FRONTEND-1 --update-baseline # Update visuals
329
+ kosuke test --ticket=FRONTEND-1 --max-retries=5 # More attempts
330
+ kosuke test --ticket=FRONTEND-1 --pr # Create PR with fixes
331
+
190
332
  WORKFLOW:
191
333
 
192
334
  By default, all commands apply changes locally without git operations.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/E,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,OAAO,GAAG;oBACd,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAC/B,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAChF,CAAC;gBACF,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAChC,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG;oBACd,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC/E,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpE,KAAK,EAAE,IAAI;yBACR,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;wBAC1C,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACf,EAAE,KAAK,CAAC,GAAG,CAAC;iBACf,CAAC;gBACF,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,OAAO,GAAG;oBACd,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAChF,CAAC;gBACF,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YAED,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,mBAAmB,EAAE,CAAC;gBAC5B,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACvC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM;YACR,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC3E,CAAC;gBACF,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;oBACjF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;oBAC5E,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;oBACzF,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;oBACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,OAAO,GAAG;oBACd,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACjC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACjC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC/E,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC7E,CAAC;gBACF,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG;oBACd,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC7E,CAAC;gBACF,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,EAAE,CAAC;gBACnB,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC7B,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;oBACpF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;oBACzF,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;oBAC7E,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;oBACnF,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;oBACrF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;oBAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,OAAO,GAAG;oBACd,MAAM,EAAE,SAAS;oBACjB,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACjC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAC/B,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;oBAClD,UAAU,EAAE,QAAQ,CAClB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAC3E;oBACD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC5E,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAChF,CAAC;gBACF,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YAED;gBACE,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;gBACjD,QAAQ,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Kb,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Build command - Batch process all tickets from tickets.json
3
+ *
4
+ * This command processes all "Todo" and "Error" tickets sequentially,
5
+ * implementing each one using the ship command with --commit flag.
6
+ * Each ticket is committed individually to the current branch.
7
+ *
8
+ * Usage:
9
+ * kosuke build # Process and commit all tickets
10
+ * kosuke build --tickets=path/to/tickets.json
11
+ *
12
+ * Note: Create a feature branch before running build:
13
+ * git checkout -b feat/implement-tickets
14
+ * kosuke build
15
+ * gh pr create
16
+ */
17
+ import type { BuildOptions } from '../types.js';
18
+ /**
19
+ * Main build command - processes all tickets and commits each one
20
+ */
21
+ export declare function buildCommand(options: BuildOptions): Promise<void>;
22
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,aAAa,CAAC;AAyDxD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EvE"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Build command - Batch process all tickets from tickets.json
3
+ *
4
+ * This command processes all "Todo" and "Error" tickets sequentially,
5
+ * implementing each one using the ship command with --commit flag.
6
+ * Each ticket is committed individually to the current branch.
7
+ *
8
+ * Usage:
9
+ * kosuke build # Process and commit all tickets
10
+ * kosuke build --tickets=path/to/tickets.json
11
+ *
12
+ * Note: Create a feature branch before running build:
13
+ * git checkout -b feat/implement-tickets
14
+ * kosuke build
15
+ * gh pr create
16
+ */
17
+ import { readFileSync, existsSync } from 'fs';
18
+ import { join } from 'path';
19
+ import { shipCommand } from './ship.js';
20
+ /**
21
+ * Load tickets from file
22
+ */
23
+ function loadTicketsFile(ticketsPath) {
24
+ if (!existsSync(ticketsPath)) {
25
+ throw new Error(`Tickets file not found: ${ticketsPath}\n` +
26
+ `Please generate tickets first using: kosuke tickets`);
27
+ }
28
+ try {
29
+ const content = readFileSync(ticketsPath, 'utf-8');
30
+ return JSON.parse(content);
31
+ }
32
+ catch (error) {
33
+ throw new Error(`Failed to parse tickets file: ${error instanceof Error ? error.message : String(error)}`);
34
+ }
35
+ }
36
+ /**
37
+ * Filter and sort tickets for processing
38
+ */
39
+ function getTicketsToProcess(ticketsData) {
40
+ // Get all Todo and Error tickets (automatic retry on Error)
41
+ let tickets = ticketsData.tickets.filter((t) => t.status === 'Todo' || t.status === 'Error');
42
+ // Sort by phase: SCHEMA -> BACKEND -> FRONTEND
43
+ tickets.sort((a, b) => {
44
+ const getPhaseOrder = (id) => {
45
+ if (id.startsWith('SCHEMA-'))
46
+ return 1;
47
+ if (id.startsWith('BACKEND-'))
48
+ return 2;
49
+ if (id.startsWith('FRONTEND-'))
50
+ return 3;
51
+ return 4;
52
+ };
53
+ const phaseComparison = getPhaseOrder(a.id) - getPhaseOrder(b.id);
54
+ if (phaseComparison !== 0)
55
+ return phaseComparison;
56
+ // Within same phase, sort by ticket number
57
+ const aNum = parseInt(a.id.split('-')[1] || '0', 10);
58
+ const bNum = parseInt(b.id.split('-')[1] || '0', 10);
59
+ return aNum - bNum;
60
+ });
61
+ return tickets;
62
+ }
63
+ /**
64
+ * Main build command - processes all tickets and commits each one
65
+ */
66
+ export async function buildCommand(options) {
67
+ console.log('šŸ—ļø Starting Build - Batch Ticket Processing\n');
68
+ try {
69
+ // Validate environment
70
+ if (!process.env.ANTHROPIC_API_KEY) {
71
+ throw new Error('ANTHROPIC_API_KEY environment variable is required');
72
+ }
73
+ if (!process.env.GITHUB_TOKEN) {
74
+ throw new Error('GITHUB_TOKEN environment variable is required for build command');
75
+ }
76
+ const { ticketsFile = 'tickets.json' } = options;
77
+ const cwd = process.cwd();
78
+ const ticketsPath = join(cwd, ticketsFile);
79
+ // 1. Load tickets
80
+ console.log('šŸ“‹ Loading tickets...');
81
+ const ticketsData = loadTicketsFile(ticketsPath);
82
+ const ticketsToProcess = getTicketsToProcess(ticketsData);
83
+ if (ticketsToProcess.length === 0) {
84
+ console.log('ā„¹ļø No tickets found with status "Todo" or "Error"');
85
+ return;
86
+ }
87
+ console.log(` āœ… Found ${ticketsToProcess.length} ticket(s) to process\n`);
88
+ // Display tickets to be processed
89
+ console.log('šŸ“¦ Tickets to be processed:');
90
+ ticketsToProcess.forEach((ticket, index) => {
91
+ console.log(` ${index + 1}. ${ticket.id}: ${ticket.title}`);
92
+ });
93
+ console.log('');
94
+ // 2. Process each ticket sequentially with ship --commit
95
+ for (let i = 0; i < ticketsToProcess.length; i++) {
96
+ const ticket = ticketsToProcess[i];
97
+ console.log('\n' + '='.repeat(80));
98
+ console.log(`šŸ“¦ Processing Ticket ${i + 1}/${ticketsToProcess.length}: ${ticket.id}`);
99
+ console.log(`šŸ“ ${ticket.title}`);
100
+ console.log('='.repeat(80) + '\n');
101
+ try {
102
+ // Use ship command with --commit flag
103
+ await shipCommand({
104
+ ticket: ticket.id,
105
+ commit: true,
106
+ ticketsFile,
107
+ });
108
+ console.log(`\nāœ… ${ticket.id} completed and committed successfully\n`);
109
+ }
110
+ catch (error) {
111
+ const errorMessage = error instanceof Error ? error.message : String(error);
112
+ console.error(`\nāŒ Failed to process ${ticket.id}: ${errorMessage}`);
113
+ console.error('\nāŒ Build stopped due to ticket failure');
114
+ console.error('ā„¹ļø Fix the issue and run build again to resume from failed tickets\n');
115
+ throw error;
116
+ }
117
+ }
118
+ // 3. Display final summary
119
+ console.log('\n' + '='.repeat(80));
120
+ console.log('āœ… Build Completed Successfully!');
121
+ console.log('='.repeat(80));
122
+ console.log(`šŸ“¦ Total tickets processed: ${ticketsToProcess.length}`);
123
+ console.log(`āœ… All tickets have been committed to current branch`);
124
+ console.log('='.repeat(80));
125
+ console.log('\nšŸ’” Next steps:');
126
+ console.log(' - Review the commits');
127
+ console.log(' - Create a PR using: gh pr create');
128
+ console.log(' - Or push to a remote branch and create PR manually\n');
129
+ }
130
+ catch (error) {
131
+ console.error('\nāŒ Build failed:', error);
132
+ throw error;
133
+ }
134
+ }
135
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../kosuke/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Review command - Review git diff against CLAUDE.md rules
3
+ *
4
+ * This command reviews only the current git diff (uncommitted changes)
5
+ * for compliance with CLAUDE.md rules, fixes any issues found,
6
+ * and runs comprehensive linting afterwards.
7
+ * Note: This command does NOT support --pr flag (changes applied locally only).
8
+ *
9
+ * Usage:
10
+ * kosuke review # Review current git diff
11
+ */
12
+ import type { ReviewOptions, ReviewResult } from '../types.js';
13
+ /**
14
+ * Core review logic - reviews git diff only
15
+ */
16
+ export declare function reviewCore(options?: ReviewOptions): Promise<ReviewResult>;
17
+ /**
18
+ * Main review command
19
+ */
20
+ export declare function reviewCommand(options?: ReviewOptions): Promise<void>;
21
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../kosuke/commands/review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmE/D;;GAEG;AACH,wBAAsB,UAAU,CAE9B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0FvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B9E"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Review command - Review git diff against CLAUDE.md rules
3
+ *
4
+ * This command reviews only the current git diff (uncommitted changes)
5
+ * for compliance with CLAUDE.md rules, fixes any issues found,
6
+ * and runs comprehensive linting afterwards.
7
+ * Note: This command does NOT support --pr flag (changes applied locally only).
8
+ *
9
+ * Usage:
10
+ * kosuke review # Review current git diff
11
+ */
12
+ import { readFileSync, existsSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { runAgent, formatCostBreakdown } from '../utils/claude-agent.js';
15
+ import { getGitDiff, hasUncommittedChanges } from '../utils/git.js';
16
+ import { runComprehensiveLinting } from '../utils/validator.js';
17
+ /**
18
+ * Load CLAUDE.md rules
19
+ */
20
+ function loadClaudeRules(cwd = process.cwd()) {
21
+ const claudePath = join(cwd, 'CLAUDE.md');
22
+ if (!existsSync(claudePath)) {
23
+ throw new Error(`CLAUDE.md not found in workspace root.\n` +
24
+ `Please ensure CLAUDE.md exists at: ${claudePath}`);
25
+ }
26
+ return readFileSync(claudePath, 'utf-8');
27
+ }
28
+ /**
29
+ * Build system prompt for code review (git diff only)
30
+ */
31
+ function buildReviewSystemPrompt(claudeRules, gitDiff) {
32
+ return `You are a senior code reviewer conducting a code quality review of recent changes.
33
+
34
+ **Your Task:**
35
+ Review the git diff below for compliance with the project's CLAUDE.md rules and best practices.
36
+
37
+ **Project Rules (CLAUDE.md):**
38
+ ${claudeRules}
39
+
40
+ **Git Diff to Review:**
41
+ \`\`\`diff
42
+ ${gitDiff}
43
+ \`\`\`
44
+
45
+ **Review Scope:**
46
+ 1. **Code Quality**: Check for violations of CLAUDE.md guidelines
47
+ 2. **Type Safety**: Ensure proper TypeScript usage
48
+ 3. **Best Practices**: Verify coding patterns and conventions
49
+ 4. **Error Handling**: Ensure proper error handling
50
+ 5. **Documentation**: Check for adequate comments and docs
51
+ 6. **Security**: Identify potential security issues
52
+ 7. **Performance**: Look for obvious performance issues
53
+
54
+ **Critical Instructions:**
55
+ - Focus ONLY on the files and changes shown in the git diff above
56
+ - Identify ALL violations of CLAUDE.md rules in the changed code
57
+ - For EACH issue found, FIX it immediately using search_replace or write tools
58
+ - Don't just report issues - FIX them!
59
+ - Make minimal necessary changes
60
+ - Ensure fixes don't break functionality
61
+ - If you need to see more context from a file, use the read_file tool
62
+
63
+ **What to Look For in the Changes:**
64
+ - Use of \`any\` type (should be avoided)
65
+ - Missing error handling
66
+ - Inconsistent naming conventions
67
+ - Poor code organization
68
+ - Missing JSDoc comments on exported functions
69
+ - Improper use of dependencies
70
+ - Code duplication
71
+ - Overly complex functions
72
+ - Missing type exports
73
+
74
+ Review the changes shown in the diff and fix any issues you find.`;
75
+ }
76
+ /**
77
+ * Core review logic - reviews git diff only
78
+ */
79
+ export async function reviewCore(
80
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
81
+ options = {}) {
82
+ const cwd = process.cwd();
83
+ // 1. Check for uncommitted changes
84
+ console.log('šŸ” Checking for uncommitted changes...');
85
+ const hasChanges = await hasUncommittedChanges();
86
+ if (!hasChanges) {
87
+ console.log(' ā„¹ļø No uncommitted changes found. Nothing to review.\n');
88
+ return {
89
+ success: true,
90
+ issuesFound: 0,
91
+ fixesApplied: 0,
92
+ tokensUsed: {
93
+ input: 0,
94
+ output: 0,
95
+ cacheCreation: 0,
96
+ cacheRead: 0,
97
+ },
98
+ cost: 0,
99
+ };
100
+ }
101
+ console.log(' āœ… Found uncommitted changes\n');
102
+ // 2. Get git diff
103
+ console.log('šŸ“ Getting git diff...');
104
+ const gitDiff = await getGitDiff();
105
+ if (!gitDiff || gitDiff.trim().length === 0) {
106
+ console.log(' ā„¹ļø No diff available. Nothing to review.\n');
107
+ return {
108
+ success: true,
109
+ issuesFound: 0,
110
+ fixesApplied: 0,
111
+ tokensUsed: {
112
+ input: 0,
113
+ output: 0,
114
+ cacheCreation: 0,
115
+ cacheRead: 0,
116
+ },
117
+ cost: 0,
118
+ };
119
+ }
120
+ console.log(` āœ… Got diff (${gitDiff.length} characters)\n`);
121
+ // 3. Load CLAUDE.md rules
122
+ console.log('šŸ“– Loading CLAUDE.md rules...');
123
+ const claudeRules = loadClaudeRules(cwd);
124
+ console.log(` āœ… Loaded rules (${claudeRules.length} characters)\n`);
125
+ // 4. Review phase
126
+ console.log(`\n${'='.repeat(60)}`);
127
+ console.log(`šŸ” Phase 1: Code Review of Git Diff`);
128
+ console.log(`${'='.repeat(60)}\n`);
129
+ const systemPrompt = buildReviewSystemPrompt(claudeRules, gitDiff);
130
+ const reviewResult = await runAgent('Review the git diff for compliance with CLAUDE.md rules and fix all issues found', {
131
+ systemPrompt,
132
+ cwd,
133
+ maxTurns: 30,
134
+ verbosity: 'normal',
135
+ });
136
+ const issuesFound = reviewResult.fixCount;
137
+ console.log(`\n✨ Review completed`);
138
+ console.log(` šŸ” Issues found and fixed: ${issuesFound}`);
139
+ console.log(` šŸ’° Review cost: ${formatCostBreakdown(reviewResult)}`);
140
+ // 5. Linting phase
141
+ console.log(`\n${'='.repeat(60)}`);
142
+ console.log(`šŸ”§ Phase 2: Linting & Quality Checks`);
143
+ console.log(`${'='.repeat(60)}\n`);
144
+ const lintResult = await runComprehensiveLinting();
145
+ console.log(`\nāœ… Linting completed (${lintResult.fixCount} additional fixes applied)`);
146
+ return {
147
+ success: true,
148
+ issuesFound,
149
+ fixesApplied: issuesFound + lintResult.fixCount,
150
+ tokensUsed: reviewResult.tokensUsed,
151
+ cost: reviewResult.cost,
152
+ };
153
+ }
154
+ /**
155
+ * Main review command
156
+ */
157
+ export async function reviewCommand(options = {}) {
158
+ console.log('šŸ” Starting Code Review (Git Diff)...\n');
159
+ try {
160
+ // Validate environment
161
+ if (!process.env.ANTHROPIC_API_KEY) {
162
+ throw new Error('ANTHROPIC_API_KEY environment variable is required');
163
+ }
164
+ // Execute core logic (no PR support for review command)
165
+ const result = await reviewCore(options);
166
+ if (result.issuesFound === 0 && result.fixesApplied === 0) {
167
+ console.log('\nāœ… Review completed - no issues found!');
168
+ return;
169
+ }
170
+ console.log('\n' + '='.repeat(60));
171
+ console.log('šŸ“Š Review Summary');
172
+ console.log('='.repeat(60));
173
+ console.log(`šŸ” Issues found: ${result.issuesFound}`);
174
+ console.log(`šŸ”§ Total fixes applied: ${result.fixesApplied}`);
175
+ console.log(`šŸ’° Total cost: $${result.cost.toFixed(4)}`);
176
+ console.log('='.repeat(60));
177
+ console.log('\nāœ… Review completed successfully!');
178
+ console.log('ā„¹ļø All changes applied locally.');
179
+ }
180
+ catch (error) {
181
+ console.error('\nāŒ Review failed:', error);
182
+ throw error;
183
+ }
184
+ }
185
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../kosuke/commands/review.ts"],"names":[],"mappings":"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"}