@kosuke-ai/cli 0.0.57 → 1.0.0

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 (263) hide show
  1. package/README.md +31 -448
  2. package/dist/commands/auth.js +117 -0
  3. package/dist/generated/commands/deploy/cancel.js +17 -0
  4. package/dist/generated/commands/deploy/messages.js +17 -0
  5. package/dist/generated/commands/deploy/run.js +60 -0
  6. package/dist/generated/commands/index.js +132 -0
  7. package/dist/generated/commands/preview/get.js +25 -0
  8. package/dist/generated/commands/preview/health.js +25 -0
  9. package/dist/generated/commands/preview/reset.js +27 -0
  10. package/dist/generated/commands/preview/share-create.js +36 -0
  11. package/dist/generated/commands/preview/share-delete.js +26 -0
  12. package/dist/generated/commands/preview/share-get.js +26 -0
  13. package/dist/generated/commands/preview/shared.js +17 -0
  14. package/dist/generated/commands/projects/create.js +37 -0
  15. package/dist/generated/commands/projects/delete.js +17 -0
  16. package/dist/generated/commands/projects/env-vars-add.js +21 -0
  17. package/dist/generated/commands/projects/env-vars-remove.js +21 -0
  18. package/dist/generated/commands/projects/get.js +17 -0
  19. package/dist/generated/commands/projects/list.js +15 -0
  20. package/dist/generated/commands/projects/services-add.js +87 -0
  21. package/dist/generated/commands/projects/services-list.js +18 -0
  22. package/dist/generated/commands/projects/services-remove.js +19 -0
  23. package/dist/generated/commands/projects/services-update.js +81 -0
  24. package/dist/generated/commands/projects/settings-get.js +18 -0
  25. package/dist/generated/commands/projects/settings-import.js +91 -0
  26. package/dist/generated/commands/projects/settings-update.js +77 -0
  27. package/dist/generated/commands/projects/skills.js +35 -0
  28. package/dist/generated/commands/projects/update.js +27 -0
  29. package/dist/generated/commands/sessions/activate.js +18 -0
  30. package/dist/generated/commands/sessions/checklist-generate.js +19 -0
  31. package/dist/generated/commands/sessions/checklist-get.js +19 -0
  32. package/dist/generated/commands/sessions/comments-add.js +63 -0
  33. package/dist/generated/commands/sessions/comments-delete.js +20 -0
  34. package/dist/generated/commands/sessions/comments-list.js +19 -0
  35. package/dist/generated/commands/sessions/comments-update.js +23 -0
  36. package/dist/generated/commands/sessions/create.js +126 -0
  37. package/dist/generated/commands/sessions/delete.js +18 -0
  38. package/dist/generated/commands/sessions/diff-files.js +19 -0
  39. package/dist/generated/commands/sessions/diff-patch.js +86 -0
  40. package/dist/generated/commands/sessions/edit-prompt.js +59 -0
  41. package/dist/generated/commands/sessions/files-get.js +27 -0
  42. package/dist/generated/commands/sessions/files-list.js +19 -0
  43. package/dist/generated/commands/sessions/files-write.js +41 -0
  44. package/dist/generated/commands/sessions/get.js +18 -0
  45. package/dist/generated/commands/sessions/git-commit-message.js +19 -0
  46. package/dist/generated/commands/sessions/git-commit.js +29 -0
  47. package/dist/generated/commands/sessions/git-push.js +19 -0
  48. package/dist/generated/commands/sessions/git-state.js +19 -0
  49. package/dist/generated/commands/sessions/jobs-cancel.js +20 -0
  50. package/dist/generated/commands/sessions/jobs-get.js +20 -0
  51. package/dist/generated/commands/sessions/list.js +81 -0
  52. package/dist/generated/commands/sessions/messages.js +18 -0
  53. package/dist/generated/commands/sessions/search.js +23 -0
  54. package/dist/generated/commands/sessions/send.js +98 -0
  55. package/dist/generated/commands/sessions/update.js +72 -0
  56. package/dist/generated/commands/workspaces/access-status.js +29 -0
  57. package/dist/generated/commands/workspaces/ai-provider-get.js +18 -0
  58. package/dist/generated/commands/workspaces/ai-provider-remove.js +42 -0
  59. package/dist/generated/commands/workspaces/ai-provider-set.js +21 -0
  60. package/dist/generated/commands/workspaces/credits.js +17 -0
  61. package/dist/generated/commands/workspaces/get.js +17 -0
  62. package/dist/generated/commands/workspaces/getting-started-get.js +18 -0
  63. package/dist/generated/commands/workspaces/getting-started-update.js +32 -0
  64. package/dist/generated/commands/workspaces/list.js +15 -0
  65. package/dist/generated/commands/workspaces/members.js +25 -0
  66. package/dist/generated/commands/workspaces/sandbox-limit.js +17 -0
  67. package/dist/generated/commands/workspaces/stop-sandboxes.js +27 -0
  68. package/dist/generated/commands/workspaces/usage.js +32 -0
  69. package/dist/index.js +5 -595
  70. package/dist/program.js +46 -0
  71. package/dist/runtime/attach.js +139 -0
  72. package/dist/runtime/attachments.js +58 -0
  73. package/dist/runtime/client.js +12 -0
  74. package/dist/runtime/config.js +49 -0
  75. package/dist/runtime/credentials.js +24 -0
  76. package/dist/runtime/descriptor.js +7 -0
  77. package/dist/runtime/invoke.js +152 -0
  78. package/dist/runtime/runtime.js +41 -0
  79. package/dist/runtime/version.js +5 -0
  80. package/openapi.json +5222 -0
  81. package/package.json +21 -79
  82. package/LICENSE +0 -21
  83. package/claude.costs.json +0 -34
  84. package/dist/__tests__/utils/file-discovery.test.d.ts +0 -5
  85. package/dist/__tests__/utils/file-discovery.test.d.ts.map +0 -1
  86. package/dist/__tests__/utils/file-discovery.test.js +0 -51
  87. package/dist/__tests__/utils/file-discovery.test.js.map +0 -1
  88. package/dist/__tests__/utils/logger-nologs.test.d.ts +0 -5
  89. package/dist/__tests__/utils/logger-nologs.test.d.ts.map +0 -1
  90. package/dist/__tests__/utils/logger-nologs.test.js +0 -34
  91. package/dist/__tests__/utils/logger-nologs.test.js.map +0 -1
  92. package/dist/__tests__/utils/logger.test.d.ts +0 -5
  93. package/dist/__tests__/utils/logger.test.d.ts.map +0 -1
  94. package/dist/__tests__/utils/logger.test.js +0 -243
  95. package/dist/__tests__/utils/logger.test.js.map +0 -1
  96. package/dist/__tests__/utils/validator.test.d.ts +0 -5
  97. package/dist/__tests__/utils/validator.test.d.ts.map +0 -1
  98. package/dist/__tests__/utils/validator.test.js +0 -206
  99. package/dist/__tests__/utils/validator.test.js.map +0 -1
  100. package/dist/index.d.ts +0 -37
  101. package/dist/index.d.ts.map +0 -1
  102. package/dist/index.js.map +0 -1
  103. package/dist/kosuke/commands/analyse.d.ts +0 -15
  104. package/dist/kosuke/commands/analyse.d.ts.map +0 -1
  105. package/dist/kosuke/commands/analyse.js +0 -304
  106. package/dist/kosuke/commands/analyse.js.map +0 -1
  107. package/dist/kosuke/commands/build.d.ts +0 -35
  108. package/dist/kosuke/commands/build.d.ts.map +0 -1
  109. package/dist/kosuke/commands/build.js +0 -660
  110. package/dist/kosuke/commands/build.js.map +0 -1
  111. package/dist/kosuke/commands/fix.d.ts +0 -21
  112. package/dist/kosuke/commands/fix.d.ts.map +0 -1
  113. package/dist/kosuke/commands/fix.js +0 -256
  114. package/dist/kosuke/commands/fix.js.map +0 -1
  115. package/dist/kosuke/commands/getcode.d.ts +0 -29
  116. package/dist/kosuke/commands/getcode.d.ts.map +0 -1
  117. package/dist/kosuke/commands/getcode.js +0 -248
  118. package/dist/kosuke/commands/getcode.js.map +0 -1
  119. package/dist/kosuke/commands/lint.d.ts +0 -21
  120. package/dist/kosuke/commands/lint.d.ts.map +0 -1
  121. package/dist/kosuke/commands/lint.js +0 -342
  122. package/dist/kosuke/commands/lint.js.map +0 -1
  123. package/dist/kosuke/commands/migrate.d.ts +0 -38
  124. package/dist/kosuke/commands/migrate.d.ts.map +0 -1
  125. package/dist/kosuke/commands/migrate.js +0 -284
  126. package/dist/kosuke/commands/migrate.js.map +0 -1
  127. package/dist/kosuke/commands/plan.d.ts +0 -28
  128. package/dist/kosuke/commands/plan.d.ts.map +0 -1
  129. package/dist/kosuke/commands/plan.js +0 -684
  130. package/dist/kosuke/commands/plan.js.map +0 -1
  131. package/dist/kosuke/commands/requirements.d.ts +0 -52
  132. package/dist/kosuke/commands/requirements.d.ts.map +0 -1
  133. package/dist/kosuke/commands/requirements.js +0 -615
  134. package/dist/kosuke/commands/requirements.js.map +0 -1
  135. package/dist/kosuke/commands/review.d.ts +0 -26
  136. package/dist/kosuke/commands/review.d.ts.map +0 -1
  137. package/dist/kosuke/commands/review.js +0 -303
  138. package/dist/kosuke/commands/review.js.map +0 -1
  139. package/dist/kosuke/commands/serve.d.ts +0 -9
  140. package/dist/kosuke/commands/serve.d.ts.map +0 -1
  141. package/dist/kosuke/commands/serve.js +0 -17
  142. package/dist/kosuke/commands/serve.js.map +0 -1
  143. package/dist/kosuke/commands/ship.d.ts +0 -37
  144. package/dist/kosuke/commands/ship.d.ts.map +0 -1
  145. package/dist/kosuke/commands/ship.js +0 -375
  146. package/dist/kosuke/commands/ship.js.map +0 -1
  147. package/dist/kosuke/commands/sync-rules.d.ts +0 -9
  148. package/dist/kosuke/commands/sync-rules.d.ts.map +0 -1
  149. package/dist/kosuke/commands/sync-rules.js +0 -414
  150. package/dist/kosuke/commands/sync-rules.js.map +0 -1
  151. package/dist/kosuke/commands/test.d.ts +0 -42
  152. package/dist/kosuke/commands/test.d.ts.map +0 -1
  153. package/dist/kosuke/commands/test.js +0 -540
  154. package/dist/kosuke/commands/test.js.map +0 -1
  155. package/dist/kosuke/commands/tickets.d.ts +0 -43
  156. package/dist/kosuke/commands/tickets.d.ts.map +0 -1
  157. package/dist/kosuke/commands/tickets.js +0 -876
  158. package/dist/kosuke/commands/tickets.js.map +0 -1
  159. package/dist/kosuke/commands/validate-tickets.d.ts +0 -23
  160. package/dist/kosuke/commands/validate-tickets.d.ts.map +0 -1
  161. package/dist/kosuke/commands/validate-tickets.js +0 -360
  162. package/dist/kosuke/commands/validate-tickets.js.map +0 -1
  163. package/dist/kosuke/serve/middleware/error-handler.d.ts +0 -14
  164. package/dist/kosuke/serve/middleware/error-handler.d.ts.map +0 -1
  165. package/dist/kosuke/serve/middleware/error-handler.js +0 -42
  166. package/dist/kosuke/serve/middleware/error-handler.js.map +0 -1
  167. package/dist/kosuke/serve/middleware/validation.d.ts +0 -13
  168. package/dist/kosuke/serve/middleware/validation.d.ts.map +0 -1
  169. package/dist/kosuke/serve/middleware/validation.js +0 -38
  170. package/dist/kosuke/serve/middleware/validation.js.map +0 -1
  171. package/dist/kosuke/serve/routes/build.d.ts +0 -6
  172. package/dist/kosuke/serve/routes/build.d.ts.map +0 -1
  173. package/dist/kosuke/serve/routes/build.js +0 -226
  174. package/dist/kosuke/serve/routes/build.js.map +0 -1
  175. package/dist/kosuke/serve/routes/health.d.ts +0 -6
  176. package/dist/kosuke/serve/routes/health.d.ts.map +0 -1
  177. package/dist/kosuke/serve/routes/health.js +0 -11
  178. package/dist/kosuke/serve/routes/health.js.map +0 -1
  179. package/dist/kosuke/serve/routes/plan.d.ts +0 -6
  180. package/dist/kosuke/serve/routes/plan.d.ts.map +0 -1
  181. package/dist/kosuke/serve/routes/plan.js +0 -106
  182. package/dist/kosuke/serve/routes/plan.js.map +0 -1
  183. package/dist/kosuke/serve/server.d.ts +0 -16
  184. package/dist/kosuke/serve/server.d.ts.map +0 -1
  185. package/dist/kosuke/serve/server.js +0 -67
  186. package/dist/kosuke/serve/server.js.map +0 -1
  187. package/dist/kosuke/serve/validation/build.d.ts +0 -41
  188. package/dist/kosuke/serve/validation/build.d.ts.map +0 -1
  189. package/dist/kosuke/serve/validation/build.js +0 -20
  190. package/dist/kosuke/serve/validation/build.js.map +0 -1
  191. package/dist/kosuke/serve/validation/plan.d.ts +0 -26
  192. package/dist/kosuke/serve/validation/plan.d.ts.map +0 -1
  193. package/dist/kosuke/serve/validation/plan.js +0 -15
  194. package/dist/kosuke/serve/validation/plan.js.map +0 -1
  195. package/dist/kosuke/types.d.ts +0 -539
  196. package/dist/kosuke/types.d.ts.map +0 -1
  197. package/dist/kosuke/types.js +0 -5
  198. package/dist/kosuke/types.js.map +0 -1
  199. package/dist/kosuke/utils/batch-creator.d.ts +0 -14
  200. package/dist/kosuke/utils/batch-creator.d.ts.map +0 -1
  201. package/dist/kosuke/utils/batch-creator.js +0 -76
  202. package/dist/kosuke/utils/batch-creator.js.map +0 -1
  203. package/dist/kosuke/utils/claude-agent.d.ts +0 -140
  204. package/dist/kosuke/utils/claude-agent.d.ts.map +0 -1
  205. package/dist/kosuke/utils/claude-agent.js +0 -388
  206. package/dist/kosuke/utils/claude-agent.js.map +0 -1
  207. package/dist/kosuke/utils/constants.d.ts +0 -40
  208. package/dist/kosuke/utils/constants.d.ts.map +0 -1
  209. package/dist/kosuke/utils/constants.js +0 -54
  210. package/dist/kosuke/utils/constants.js.map +0 -1
  211. package/dist/kosuke/utils/file-discovery.d.ts +0 -15
  212. package/dist/kosuke/utils/file-discovery.d.ts.map +0 -1
  213. package/dist/kosuke/utils/file-discovery.js +0 -80
  214. package/dist/kosuke/utils/file-discovery.js.map +0 -1
  215. package/dist/kosuke/utils/git.d.ts +0 -41
  216. package/dist/kosuke/utils/git.d.ts.map +0 -1
  217. package/dist/kosuke/utils/git.js +0 -145
  218. package/dist/kosuke/utils/git.js.map +0 -1
  219. package/dist/kosuke/utils/github.d.ts +0 -17
  220. package/dist/kosuke/utils/github.d.ts.map +0 -1
  221. package/dist/kosuke/utils/github.js +0 -22
  222. package/dist/kosuke/utils/github.js.map +0 -1
  223. package/dist/kosuke/utils/interactive-input.d.ts +0 -22
  224. package/dist/kosuke/utils/interactive-input.d.ts.map +0 -1
  225. package/dist/kosuke/utils/interactive-input.js +0 -124
  226. package/dist/kosuke/utils/interactive-input.js.map +0 -1
  227. package/dist/kosuke/utils/json-parser.d.ts +0 -14
  228. package/dist/kosuke/utils/json-parser.d.ts.map +0 -1
  229. package/dist/kosuke/utils/json-parser.js +0 -40
  230. package/dist/kosuke/utils/json-parser.js.map +0 -1
  231. package/dist/kosuke/utils/logger.d.ts +0 -161
  232. package/dist/kosuke/utils/logger.d.ts.map +0 -1
  233. package/dist/kosuke/utils/logger.js +0 -234
  234. package/dist/kosuke/utils/logger.js.map +0 -1
  235. package/dist/kosuke/utils/playwright-mcp-client.d.ts +0 -46
  236. package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +0 -1
  237. package/dist/kosuke/utils/playwright-mcp-client.js +0 -135
  238. package/dist/kosuke/utils/playwright-mcp-client.js.map +0 -1
  239. package/dist/kosuke/utils/pr-orchestrator.d.ts +0 -49
  240. package/dist/kosuke/utils/pr-orchestrator.d.ts.map +0 -1
  241. package/dist/kosuke/utils/pr-orchestrator.js +0 -154
  242. package/dist/kosuke/utils/pr-orchestrator.js.map +0 -1
  243. package/dist/kosuke/utils/repository-manager.d.ts +0 -13
  244. package/dist/kosuke/utils/repository-manager.d.ts.map +0 -1
  245. package/dist/kosuke/utils/repository-manager.js +0 -94
  246. package/dist/kosuke/utils/repository-manager.js.map +0 -1
  247. package/dist/kosuke/utils/repository-resolver.d.ts +0 -12
  248. package/dist/kosuke/utils/repository-resolver.d.ts.map +0 -1
  249. package/dist/kosuke/utils/repository-resolver.js +0 -186
  250. package/dist/kosuke/utils/repository-resolver.js.map +0 -1
  251. package/dist/kosuke/utils/tickets-manager.d.ts +0 -34
  252. package/dist/kosuke/utils/tickets-manager.d.ts.map +0 -1
  253. package/dist/kosuke/utils/tickets-manager.js +0 -106
  254. package/dist/kosuke/utils/tickets-manager.js.map +0 -1
  255. package/dist/kosuke/utils/validator.d.ts +0 -45
  256. package/dist/kosuke/utils/validator.d.ts.map +0 -1
  257. package/dist/kosuke/utils/validator.js +0 -248
  258. package/dist/kosuke/utils/validator.js.map +0 -1
  259. package/dist/lib.d.ts +0 -104
  260. package/dist/lib.d.ts.map +0 -1
  261. package/dist/lib.js +0 -104
  262. package/dist/lib.js.map +0 -1
  263. package/dist/package.json +0 -99
package/dist/index.js CHANGED
@@ -1,597 +1,7 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Kosuke CLI - Development Automation Tool
4
- *
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
- * plan AI-driven ticket planning from feature/bug descriptions
11
- * getcode Explore GitHub repositories and fetch code
12
- * tickets Generate implementation tickets from requirements
13
- * fix Extract and fix malformed JSON from LLM responses
14
- * validate-tickets Validate and fix ticket structure
15
- * build Batch process all tickets from tickets.json
16
- * migrate Apply database migrations and validate schema
17
- * review Review codebase against CLAUDE.md rules
18
- * test Run atomic web E2E tests
19
- *
20
- * Usage:
21
- * bun run kosuke sync-rules
22
- * bun run kosuke analyse
23
- * bun run kosuke lint
24
- * bun run kosuke requirements
25
- * bun run kosuke getcode "query"
26
- * bun run kosuke tickets
27
- * bun run kosuke build
28
- * bun run kosuke migrate
29
- * bun run kosuke review
30
- * bun run kosuke test --prompt="Test user login flow"
31
- *
32
- * Environment Variables:
33
- * ANTHROPIC_API_KEY - Required for Claude API
34
- * GITHUB_TOKEN - Required for creating PRs
35
- */
36
- import 'dotenv/config';
37
- import { analyseCommand } from './kosuke/commands/analyse.js';
38
- import { buildCommand } from './kosuke/commands/build.js';
39
- import { fixCommand } from './kosuke/commands/fix.js';
40
- import { getCodeCommand, parseGetCodeArgs } from './kosuke/commands/getcode.js';
41
- import { lintCommand } from './kosuke/commands/lint.js';
42
- import { migrateCommand } from './kosuke/commands/migrate.js';
43
- import { planCommand } from './kosuke/commands/plan.js';
44
- import { requirementsCommand } from './kosuke/commands/requirements.js';
45
- import { reviewCommand } from './kosuke/commands/review.js';
46
- import { serveCommand } from './kosuke/commands/serve.js';
47
- import { syncRulesCommand } from './kosuke/commands/sync-rules.js';
48
- import { testCommand } from './kosuke/commands/test.js';
49
- import { ticketsCommand } from './kosuke/commands/tickets.js';
50
- import { validateTicketsCommand } from './kosuke/commands/validate-tickets.js';
51
- import { TRACES_DIR } from './kosuke/utils/constants.js';
52
- async function main() {
53
- const args = process.argv.slice(2);
54
- const command = args[0];
55
- if (!command || command === '--help' || command === '-h' || command === 'help') {
56
- showHelp();
57
- process.exit(0);
58
- }
59
- try {
60
- switch (command) {
61
- case 'sync-rules': {
62
- const options = {
63
- force: args.includes('--force'),
64
- pr: args.includes('--pr'),
65
- baseBranch: args.find((arg) => arg.startsWith('--base-branch='))?.split('=')[1],
66
- noLogs: args.includes('--no-logs'),
67
- };
68
- await syncRulesCommand(options);
69
- break;
70
- }
71
- case 'analyse': {
72
- const options = {
73
- pr: args.includes('--pr'),
74
- baseBranch: args.find((arg) => arg.startsWith('--base-branch='))?.split('=')[1],
75
- scope: args.find((arg) => arg.startsWith('--scope='))?.split('=')[1],
76
- types: args
77
- .find((arg) => arg.startsWith('--types='))
78
- ?.split('=')[1]
79
- ?.split(','),
80
- noLogs: args.includes('--no-logs'),
81
- };
82
- await analyseCommand(options);
83
- break;
84
- }
85
- case 'lint': {
86
- const options = {
87
- pr: args.includes('--pr'),
88
- baseBranch: args.find((arg) => arg.startsWith('--base-branch='))?.split('=')[1],
89
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1],
90
- noLogs: args.includes('--no-logs'),
91
- };
92
- await lintCommand(options);
93
- break;
94
- }
95
- case 'requirements': {
96
- await requirementsCommand();
97
- break;
98
- }
99
- case 'plan': {
100
- const options = {
101
- prompt: args.find((arg) => arg.startsWith('--prompt='))?.split('=')[1] || '',
102
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
103
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
104
- noTest: args.includes('--no-test'),
105
- noLogs: args.includes('--no-logs'),
106
- resume: args.find((arg) => arg.startsWith('--resume='))?.split('=')[1],
107
- };
108
- if (!options.prompt) {
109
- console.error('❌ The --prompt flag is required\n');
110
- console.log('Usage: kosuke plan --prompt="..." [OPTIONS]');
111
- console.log('\nOptions:');
112
- console.log(' --prompt="..." Feature or bug description (required)');
113
- console.log(' --directory=PATH Directory with existing code (default: cwd)');
114
- console.log(' --resume=SESSION_ID Resume a previous planning session');
115
- console.log(' --no-test Skip TEST ticket creation');
116
- console.log('\nOutput:');
117
- console.log(' Tickets are saved to tickets/{timestamp}.ticket.json');
118
- console.log('\nExamples:');
119
- console.log(' kosuke plan --prompt="Add dark mode toggle"');
120
- console.log(' kosuke plan --prompt="Fix login timeout bug" --directory=./my-app');
121
- console.log(' kosuke plan --prompt="Add user notifications" --no-test');
122
- console.log(' kosuke plan --prompt="continue" --resume=<session-id>');
123
- process.exit(1);
124
- }
125
- await planCommand(options);
126
- break;
127
- }
128
- case 'getcode': {
129
- const options = parseGetCodeArgs(args);
130
- await getCodeCommand(options);
131
- break;
132
- }
133
- case 'tickets': {
134
- const options = {
135
- path: args.find((arg) => arg.startsWith('--path='))?.split('=')[1],
136
- output: args.find((arg) => arg.startsWith('--output='))?.split('=')[1],
137
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
138
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
139
- scaffold: args.includes('--scaffold'),
140
- prompt: args.find((arg) => arg.startsWith('--prompt='))?.split('=')[1],
141
- noTest: args.includes('--no-test'),
142
- noLogs: args.includes('--no-logs'),
143
- };
144
- await ticketsCommand(options);
145
- break;
146
- }
147
- case 'fix': {
148
- const fileArg = args.find((arg) => arg.startsWith('--file='))?.split('=')[1];
149
- const formatArg = args.find((arg) => arg.startsWith('--format='))?.split('=')[1];
150
- if (!fileArg || !formatArg) {
151
- console.error('❌ Both --file and --format flags are required\n');
152
- console.log('Usage: kosuke fix --format=json --file=FILE [OPTIONS]');
153
- console.log('\nOptions:');
154
- console.log(' --format=json Format to fix (currently only json)');
155
- console.log(' --file=FILE Input file path (required)');
156
- console.log(' --output=FILE Output file path (default: overwrite input)');
157
- console.log(' --directory=PATH Project directory for context (default: cwd)');
158
- console.log('\nExamples:');
159
- console.log(' kosuke fix --format=json --file=raw-response.txt');
160
- console.log(' kosuke fix --format=json --file=response.txt --output=tickets.json');
161
- console.log(' kosuke fix --format=json --file=tickets.json --directory=./project');
162
- process.exit(1);
163
- }
164
- if (formatArg !== 'json') {
165
- console.error('❌ Currently only --format=json is supported\n');
166
- process.exit(1);
167
- }
168
- const options = {
169
- format: 'json',
170
- file: fileArg,
171
- output: args.find((arg) => arg.startsWith('--output='))?.split('=')[1],
172
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
173
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
174
- noLogs: args.includes('--no-logs'),
175
- };
176
- await fixCommand(options);
177
- break;
178
- }
179
- case 'validate-tickets': {
180
- const options = {
181
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
182
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
183
- tickets: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
184
- strict: args.includes('--strict'),
185
- noLogs: args.includes('--no-logs'),
186
- };
187
- await validateTicketsCommand(options);
188
- break;
189
- }
190
- case 'build': {
191
- const options = {
192
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
193
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
194
- ticketsFile: args.find((arg) => arg.startsWith('--tickets='))?.split('=')[1],
195
- dbUrl: args.find((arg) => arg.startsWith('--db-url='))?.split('=')[1],
196
- reset: args.includes('--reset'),
197
- askConfirm: args.includes('--ask-confirm'),
198
- askCommit: args.includes('--ask-commit'),
199
- review: !args.includes('--no-review'), // Default true, disabled with --no-review
200
- test: !args.includes('--no-test'), // Default true, disabled with --no-test
201
- url: args.find((arg) => arg.startsWith('--url='))?.split('=')[1],
202
- headless: args.includes('--headless'),
203
- verbose: args.includes('--verbose'),
204
- playwright: args.includes('--playwright'),
205
- trace: args.includes('--trace'),
206
- noLogs: args.includes('--no-logs'),
207
- };
208
- await buildCommand(options);
209
- break;
210
- }
211
- case 'migrate': {
212
- const options = {
213
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
214
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
215
- dbUrl: args.find((arg) => arg.startsWith('--db-url='))?.split('=')[1],
216
- noLogs: args.includes('--no-logs'),
217
- };
218
- await migrateCommand(options);
219
- break;
220
- }
221
- case 'review': {
222
- const options = {
223
- noLogs: args.includes('--no-logs'),
224
- };
225
- await reviewCommand(options);
226
- break;
227
- }
228
- case 'test': {
229
- const promptArg = args.find((arg) => arg.startsWith('--prompt='))?.split('=')[1];
230
- if (!promptArg) {
231
- console.error('❌ The --prompt flag is required\n');
232
- console.log('Usage: kosuke test --prompt="..." [OPTIONS]');
233
- console.log('\nOptions:');
234
- console.log(' --prompt="..." Test instructions (required)');
235
- console.log(' --url=URL Base URL for web tests (default: http://localhost:3000)');
236
- console.log(' --headless Run in headless mode (invisible browser)');
237
- console.log(' --verbose Enable verbose output');
238
- console.log(' --trace Enable trace recording (saves video/screenshots)');
239
- console.log('\nExamples:');
240
- console.log(' kosuke test --prompt="Test user login flow"');
241
- console.log(' kosuke test --prompt="Test task creation" --verbose --headless');
242
- console.log(' kosuke test --prompt="Test checkout" --trace # With video/screenshots');
243
- console.log(` npx playwright show-trace ${TRACES_DIR}/.../trace.trace`);
244
- console.log('\nNote: This command is mainly used programmatically from kosuke build.');
245
- console.log(' For ticket-based testing with retries, use: kosuke build');
246
- process.exit(1);
247
- }
248
- const options = {
249
- prompt: promptArg,
250
- url: args.find((arg) => arg.startsWith('--url='))?.split('=')[1],
251
- headless: args.includes('--headless'),
252
- verbose: args.includes('--verbose'),
253
- granular: args.includes('--granular'),
254
- playwright: args.includes('--playwright'),
255
- trace: args.includes('--trace'),
256
- directory: args.find((arg) => arg.startsWith('--directory='))?.split('=')[1] ||
257
- args.find((arg) => arg.startsWith('--dir='))?.split('=')[1],
258
- noLogs: args.includes('--no-logs'),
259
- };
260
- await testCommand(options);
261
- break;
262
- }
263
- case 'serve': {
264
- const options = {
265
- port: parseInt(args.find((arg) => arg.startsWith('--port='))?.split('=')[1] || '3000'),
266
- };
267
- await serveCommand(options);
268
- break;
269
- }
270
- default:
271
- console.error(`❌ Unknown command: ${command}\n`);
272
- showHelp();
273
- process.exit(1);
274
- }
275
- }
276
- catch (error) {
277
- console.error('\n❌ Fatal error:', error);
278
- process.exit(1);
279
- }
280
- }
281
- function showHelp() {
282
- console.log(`
283
- ╔═══════════════════════════════════════════════════════════╗
284
- ║ Kosuke CLI - Development Tools ║
285
- ╚═══════════════════════════════════════════════════════════╝
286
-
287
- COMMANDS:
288
-
289
- serve [options]
290
- Start HTTP server for Kosuke CLI commands
291
- Provides SSE endpoints for real-time command execution
292
-
293
- Options:
294
- --port=<number> Port to listen on (default: 3000)
295
-
296
- Examples:
297
- kosuke serve # Start on port 3000
298
- kosuke serve --port=8080 # Start on custom port
299
-
300
- Endpoints:
301
- GET /health # Health check
302
- POST /api/plan # Plan command with SSE
303
-
304
- sync-rules [options]
305
- Sync rules and documentation from kosuke-template
306
-
307
- Options:
308
- --force Compare files regardless of recent commit history
309
- --pr Create a pull request with changes
310
- --base-branch=<name> Base branch for PR (default: current branch)
311
-
312
- Examples:
313
- kosuke sync-rules # Local changes only
314
- kosuke sync-rules --force # Force comparison
315
- kosuke sync-rules --pr # Create PR
316
- kosuke sync-rules --pr --base-branch=develop
317
-
318
- analyse [options]
319
- Analyze and fix code quality issues against CLAUDE.md rules
320
- Applies fixes locally by default
321
-
322
- Options:
323
- --pr Create a pull request with fixes
324
- --base-branch=<name> Base branch for PR (default: current branch)
325
- --scope=<dirs> Analyze specific directories (comma-separated)
326
- --types=<exts> Analyze specific file types (comma-separated)
327
-
328
- Examples:
329
- kosuke analyse # Local fixes only
330
- kosuke analyse --pr # Create PR with fixes
331
- kosuke analyse --scope=hooks,lib/trpc
332
- kosuke analyse --types=ts,tsx
333
- kosuke analyse --pr --base-branch=main
334
-
335
- lint [options]
336
- Use Claude AI to automatically fix linting errors
337
- Applies fixes locally by default
338
-
339
- Options:
340
- --pr Create a pull request with fixes
341
- --base-branch=<name> Base branch for PR (default: current branch)
342
- --directory=<path> Directory to run linting in (default: current directory)
343
-
344
- Examples:
345
- kosuke lint # Local fixes only
346
- kosuke lint --pr # Create PR with fixes
347
- kosuke lint --pr --base-branch=main
348
- kosuke lint --directory=./my-project # Run lint in specific directory
349
-
350
- requirements
351
- Interactive requirements gathering with Claude AI
352
- Generates a comprehensive docs.md file
353
-
354
- Examples:
355
- kosuke requirements
356
-
357
- plan --prompt="..." [options]
358
- AI-driven ticket planning from feature/bug descriptions
359
- Analyzes existing codebase and asks clarification questions
360
- Generates tickets in tickets/{timestamp}.ticket.json
361
-
362
- Options:
363
- --prompt="..." Feature or bug description (required)
364
- --directory=<path> Directory with existing code (default: current directory)
365
- --dir=<path> Alias for --directory
366
- --no-test Skip TEST ticket creation
367
-
368
- Output:
369
- Creates tickets/{timestamp}.ticket.json in project directory
370
-
371
- Examples:
372
- kosuke plan --prompt="Add dark mode toggle"
373
- kosuke plan --prompt="Fix login timeout bug" --directory=./my-app
374
- kosuke plan --prompt="Add user notifications" --no-test
375
- kosuke plan --prompt="continue" --resume=<session-id>
376
-
377
- Features:
378
- - Analyzes codebase to understand existing patterns
379
- - Asks non-technical clarification questions
380
- - Auto-detects ticket types (SCHEMA, BACKEND, FRONTEND, TEST)
381
- - Reply "go with recommendations" to accept all defaults
382
-
383
- getcode [repo] "<query>" [options]
384
- Explore GitHub repositories and fetch code implementations
385
- Uses Claude Code Agent to find and explain code
386
-
387
- Options:
388
- --template, -t Use kosuke-template repository
389
- --output=<file> Save output to file
390
-
391
- Examples:
392
- kosuke getcode "facebook/react" "How does reconciliation work?"
393
- kosuke getcode "How is routing implemented in Next.js?"
394
- kosuke getcode --template "What authentication system is used?"
395
- kosuke getcode -t "Show me pagination examples"
396
-
397
- tickets [options]
398
- Generate implementation tickets from requirements document or prompt
399
-
400
- Two modes of operation:
401
-
402
- PROMPT MODE (--prompt flag):
403
- Uses 'plan' command internally for INTERACTIVE ticket creation.
404
- Claude asks clarification questions before generating tickets.
405
- Best for: Adding features or fixing bugs in existing projects.
406
-
407
- DOCUMENT MODE (--path or docs.md):
408
- Generates tickets directly from requirements document.
409
- No clarification questions - assumes requirements are complete.
410
- Best for: New projects with docs.md from 'kosuke requirements'.
411
-
412
- SCAFFOLD MODE (--scaffold, document mode only):
413
- Generates infrastructure adaptation + business logic tickets.
414
-
415
- Options:
416
- --prompt="..." Feature/bug description (triggers interactive mode)
417
- --path=<file> Path to requirements document (default: docs.md)
418
- --scaffold Enable scaffold mode (document mode only)
419
- --output=<file> Output file for tickets (default: tickets.json)
420
- --directory=<path> Directory for Claude to explore (default: current directory)
421
- --dir=<path> Alias for --directory
422
-
423
- Examples:
424
- # Interactive mode (with clarification questions)
425
- kosuke tickets --prompt="Add dark mode toggle" --dir=./my-app
426
- kosuke tickets --prompt="Fix login timeout bug"
427
-
428
- # Document mode (no questions, from docs.md)
429
- kosuke tickets # Uses docs.md
430
- kosuke tickets --path=feature.md # Custom file
431
- kosuke tickets --scaffold # Scaffold + logic from docs.md
432
-
433
- fix --format=json --file=FILE [options]
434
- Extract and fix malformed JSON from LLM responses
435
- Useful when Claude returns JSON with syntax errors or wrapped in markdown
436
-
437
- Options:
438
- --format=json Format to fix (currently only json supported)
439
- --file=FILE Input file path (required)
440
- --output=FILE Output file path (default: overwrite input)
441
- --directory=PATH Project directory for context (default: cwd)
442
-
443
- Examples:
444
- kosuke fix --format=json --file=raw-response.txt
445
- kosuke fix --format=json --file=response.txt --output=tickets.json
446
- kosuke fix --format=json --file=tickets.json --directory=./project
447
-
448
- validate-tickets [options]
449
- Validate and fix ticket structure using Claude
450
- In normal mode, auto-fixes issues and saves back to file
451
- In strict mode, reports issues without fixing (useful for CI/CD)
452
-
453
- Options:
454
- --directory=PATH Project directory (default: cwd)
455
- --dir=PATH Alias for --directory
456
- --tickets=FILE Path to tickets file (default: tickets.json in directory)
457
- --strict Fail without fixing (default: false, auto-fix enabled)
458
-
459
- Examples:
460
- kosuke validate-tickets # Auto-fix mode (current directory)
461
- kosuke validate-tickets --directory=./idealista-clone
462
- kosuke validate-tickets --tickets=./path/to/tickets.json
463
- kosuke validate-tickets --directory=./project --strict # CI/CD mode
464
-
465
- build [options]
466
- Batch process all "Todo" and "Error" tickets from tickets.json
467
- Implements tickets and runs tests with automatic fixing
468
- Processes tickets in order: Schema (auto-validated) → Backend → Frontend → Web Test
469
- Commits in batches after each web-test completion
470
- Frontend tickets automatically include E2E testing (unless --no-test)
471
- All tickets include code review by default (unless --no-review)
472
-
473
- Options:
474
- --directory=<path> Directory to run build in (default: current directory)
475
- --dir=<path> Alias for --directory
476
- --tickets=<file> Path to tickets file (default: tickets.json, relative to directory)
477
- --db-url=<url> Database URL for migrations (default: postgres://postgres:postgres@postgres:5432/postgres)
478
- --reset Reset all tickets to "Todo" status before processing (start from scratch)
479
- --ask-confirm Ask for confirmation before proceeding to next ticket (useful for review)
480
- --ask-commit Ask before committing each ticket (default: auto-commit after each ticket)
481
- --no-review Skip code review phase (enabled by default)
482
- --no-test Skip testing phase for frontend tickets (enabled by default)
483
- --url=<URL> Base URL for testing (default: http://localhost:3000)
484
- --headless Run tests in headless mode (invisible browser)
485
- --verbose Enable verbose output for tests
486
- --playwright Use Playwright MCP for tests (requires MCP server running)
487
- --trace Enable trace recording for Playwright MCP tests
488
-
489
- Examples:
490
- git checkout -b feat/implement-tickets # Create feature branch first
491
- kosuke build # Process and auto-commit all tickets
492
- gh pr create # Create PR manually
493
-
494
- kosuke build --ask-commit # Ask before committing each ticket
495
- kosuke build --ask-confirm # Ask before processing each ticket
496
- kosuke build --ask-commit --ask-confirm # Fully interactive mode
497
- kosuke build --reset # Reset all tickets and start from scratch
498
- kosuke build --no-review --no-test # Skip review and testing (fastest)
499
- kosuke build --headless # Run tests in headless mode
500
- kosuke build --verbose # Enable verbose test output
501
- kosuke build --playwright # Use Playwright MCP for tests
502
- kosuke build --playwright --trace # Use Playwright MCP with video/screenshots
503
- kosuke build --tickets=custom.json # Use custom tickets file
504
- kosuke build --directory=./my-project # Run build in specific directory
505
- kosuke build --db-url=postgres://user:pass@host:5432/db # Custom DB
506
-
507
- Note: If a ticket fails, fix the issue and run build again to resume
508
-
509
- migrate [options]
510
- Apply database migrations and validate schema changes
511
- Uses Claude Code Agent to run migrations, seed database, and validate
512
-
513
- Note: This command does NOT generate migrations (ship handles that)
514
- Automatically called by build command after SCHEMA tickets
515
-
516
- Options:
517
- --directory=<path> Directory to run migrations in (default: current directory)
518
- --dir=<path> Alias for --directory
519
- --db-url=<url> Database URL (default: postgres://postgres:postgres@localhost:5432/postgres)
520
-
521
- Examples:
522
- kosuke migrate # Apply migrations in current directory
523
- kosuke migrate --directory=./my-app # Apply in specific project
524
- kosuke migrate --db-url=postgres://... # Custom database URL
525
-
526
- review
527
- Review current git diff against CLAUDE.md rules
528
- Identifies and fixes compliance issues in uncommitted changes
529
- Note: Changes applied locally only (no --pr support)
530
-
531
- Examples:
532
- kosuke review # Review uncommitted changes
533
-
534
- test --prompt="..." [options]
535
- Run atomic web E2E tests (no fixing, no retries)
536
-
537
- Test modes:
538
- Uses Playwright MCP with Claude AI for browser automation.
539
-
540
- For iterative test+fix workflow, use: kosuke build
541
-
542
- Options:
543
- --prompt="..." Test instructions (required)
544
- --url=<URL> Base URL for web tests (default: http://localhost:3000)
545
- --headless Run browser in headless mode (invisible)
546
- --verbose Enable verbose output (shows Claude reasoning and tool usage)
547
- --trace Enable trace recording (saves video/screenshots for debugging)
548
-
549
- Examples:
550
- kosuke test --prompt="Test user login flow"
551
- kosuke test --prompt="Test task creation" --url=http://localhost:4000
552
- kosuke test --prompt="Test checkout flow" --verbose --headless
553
- kosuke test --prompt="..." --trace # Save video/screenshots
554
- npx playwright show-trace ${TRACES_DIR}/.../trace.trace
555
-
556
- Playwright MCP:
557
- - Uses Claude SDK with Playwright MCP tools
558
- - Always uses chromium browser
559
- - Single atomic execution (no automatic retries)
560
- - Detailed tool usage tracking (navigations, clicks, types, extracts)
561
- - Separate cost breakdown for text generation vs. tool calls
562
- - Optional trace recording with embedded video playback
563
-
564
- Note: This command is mainly used programmatically from kosuke build.
565
- For ticket-based testing with retries, use: kosuke build
566
-
567
- GLOBAL OPTIONS:
568
-
569
- --no-logs Disable logging to Kosuke API (useful when kosuke-cli is used as library)
570
- By default, logging is enabled if KOSUKE_BASE_URL, KOSUKE_API_KEY,
571
- and KOSUKE_PROJECT_ID environment variables are set.
572
- This flag can be used with any command to prevent API logging calls.
573
-
574
- WORKFLOW:
575
-
576
- By default, all commands apply changes locally without git operations.
577
- Use the --pr flag to create a pull request with the changes.
578
-
579
- ENVIRONMENT VARIABLES:
580
-
581
- ANTHROPIC_API_KEY Required for Claude API access
582
- GITHUB_TOKEN Required when using --pr flag
583
- KOSUKE_BASE_URL Optional: Base URL for Kosuke API logging
584
- KOSUKE_API_KEY Optional: API key for Kosuke API logging
585
- KOSUKE_PROJECT_ID Optional: Project ID for Kosuke API logging
586
-
587
- CONFIGURATION:
588
-
589
- .kosukeignore Exclude files/directories from analysis
590
- (same syntax as .gitignore)
591
- `);
592
- }
593
- main().catch((error) => {
594
- console.error('Fatal error:', error);
595
- process.exit(1);
2
+ import { run } from './program.js';
3
+ run(process.argv).catch((error) => {
4
+ const message = error instanceof Error ? error.message : String(error);
5
+ process.stderr.write(`kosuke: ${message}\n`);
6
+ process.exitCode = 1;
596
7
  });
597
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,46 @@
1
+ import { Command } from 'commander';
2
+ import { attachAuthCommands } from './commands/auth.js';
3
+ import { operations } from './generated/commands/index.js';
4
+ import { attachOperation } from './runtime/attach.js';
5
+ import { createRuntime, ExitSignal } from './runtime/runtime.js';
6
+ import { version } from './runtime/version.js';
7
+ /**
8
+ * The command tree: `auth` by hand, everything else from the generated
9
+ * descriptors. Global flags are read before any subcommand runs, so the
10
+ * runtime the subcommands share is built once, from them.
11
+ */
12
+ export function createProgram(options = {}) {
13
+ const program = new Command('kosuke')
14
+ .description('Drive the Kosuke platform from your own machine.')
15
+ .version(version)
16
+ .option('--api-key <token>', 'Auth token; overrides KOSUKE_API_KEY and the stored one.')
17
+ .option('--api-url <url>', 'Platform URL; overrides KOSUKE_API_URL. Default https://app.kosuke.ai.')
18
+ // commander's default is kept: a program option is read wherever it
19
+ // appears, so `kosuke projects list --api-key X` works as the README shows.
20
+ .showHelpAfterError('(add --help for usage)')
21
+ .configureHelp({ sortSubcommands: true });
22
+ // Built lazily, on the first use, so `--help` and `--version` never touch
23
+ // the credentials file.
24
+ let runtime = null;
25
+ const runtimeFor = () => (runtime ??= (options.runtime ?? ((flags) => createRuntime({ ...options.process, flags })))(program.opts()));
26
+ const lazy = {
27
+ credentials: () => runtimeFor().credentials(),
28
+ client: (o) => runtimeFor().client(o),
29
+ output: (outcome) => runtimeFor().output(outcome),
30
+ };
31
+ attachAuthCommands(program, lazy, options.auth);
32
+ for (const operation of operations)
33
+ attachOperation(program, operation, lazy);
34
+ return program;
35
+ }
36
+ /** Run to completion; an ExitSignal has already reported and set the exit code. */
37
+ export async function run(argv, options) {
38
+ try {
39
+ await createProgram(options).parseAsync([...argv]);
40
+ }
41
+ catch (error) {
42
+ if (error instanceof ExitSignal)
43
+ return;
44
+ throw error;
45
+ }
46
+ }