@kosuke-ai/cli 0.0.56 → 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 (251) 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 -516
  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 -35
  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 -273
  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 -659
  110. package/dist/kosuke/commands/build.js.map +0 -1
  111. package/dist/kosuke/commands/getcode.d.ts +0 -29
  112. package/dist/kosuke/commands/getcode.d.ts.map +0 -1
  113. package/dist/kosuke/commands/getcode.js +0 -221
  114. package/dist/kosuke/commands/getcode.js.map +0 -1
  115. package/dist/kosuke/commands/lint.d.ts +0 -21
  116. package/dist/kosuke/commands/lint.d.ts.map +0 -1
  117. package/dist/kosuke/commands/lint.js +0 -321
  118. package/dist/kosuke/commands/lint.js.map +0 -1
  119. package/dist/kosuke/commands/migrate.d.ts +0 -38
  120. package/dist/kosuke/commands/migrate.d.ts.map +0 -1
  121. package/dist/kosuke/commands/migrate.js +0 -284
  122. package/dist/kosuke/commands/migrate.js.map +0 -1
  123. package/dist/kosuke/commands/plan.d.ts +0 -28
  124. package/dist/kosuke/commands/plan.d.ts.map +0 -1
  125. package/dist/kosuke/commands/plan.js +0 -630
  126. package/dist/kosuke/commands/plan.js.map +0 -1
  127. package/dist/kosuke/commands/requirements.d.ts +0 -52
  128. package/dist/kosuke/commands/requirements.d.ts.map +0 -1
  129. package/dist/kosuke/commands/requirements.js +0 -615
  130. package/dist/kosuke/commands/requirements.js.map +0 -1
  131. package/dist/kosuke/commands/review.d.ts +0 -26
  132. package/dist/kosuke/commands/review.d.ts.map +0 -1
  133. package/dist/kosuke/commands/review.js +0 -303
  134. package/dist/kosuke/commands/review.js.map +0 -1
  135. package/dist/kosuke/commands/serve.d.ts +0 -9
  136. package/dist/kosuke/commands/serve.d.ts.map +0 -1
  137. package/dist/kosuke/commands/serve.js +0 -17
  138. package/dist/kosuke/commands/serve.js.map +0 -1
  139. package/dist/kosuke/commands/ship.d.ts +0 -37
  140. package/dist/kosuke/commands/ship.d.ts.map +0 -1
  141. package/dist/kosuke/commands/ship.js +0 -375
  142. package/dist/kosuke/commands/ship.js.map +0 -1
  143. package/dist/kosuke/commands/sync-rules.d.ts +0 -9
  144. package/dist/kosuke/commands/sync-rules.d.ts.map +0 -1
  145. package/dist/kosuke/commands/sync-rules.js +0 -379
  146. package/dist/kosuke/commands/sync-rules.js.map +0 -1
  147. package/dist/kosuke/commands/test.d.ts +0 -42
  148. package/dist/kosuke/commands/test.d.ts.map +0 -1
  149. package/dist/kosuke/commands/test.js +0 -540
  150. package/dist/kosuke/commands/test.js.map +0 -1
  151. package/dist/kosuke/commands/tickets.d.ts +0 -43
  152. package/dist/kosuke/commands/tickets.d.ts.map +0 -1
  153. package/dist/kosuke/commands/tickets.js +0 -499
  154. package/dist/kosuke/commands/tickets.js.map +0 -1
  155. package/dist/kosuke/serve/middleware/error-handler.d.ts +0 -14
  156. package/dist/kosuke/serve/middleware/error-handler.d.ts.map +0 -1
  157. package/dist/kosuke/serve/middleware/error-handler.js +0 -42
  158. package/dist/kosuke/serve/middleware/error-handler.js.map +0 -1
  159. package/dist/kosuke/serve/middleware/validation.d.ts +0 -13
  160. package/dist/kosuke/serve/middleware/validation.d.ts.map +0 -1
  161. package/dist/kosuke/serve/middleware/validation.js +0 -38
  162. package/dist/kosuke/serve/middleware/validation.js.map +0 -1
  163. package/dist/kosuke/serve/routes/build.d.ts +0 -6
  164. package/dist/kosuke/serve/routes/build.d.ts.map +0 -1
  165. package/dist/kosuke/serve/routes/build.js +0 -226
  166. package/dist/kosuke/serve/routes/build.js.map +0 -1
  167. package/dist/kosuke/serve/routes/health.d.ts +0 -6
  168. package/dist/kosuke/serve/routes/health.d.ts.map +0 -1
  169. package/dist/kosuke/serve/routes/health.js +0 -11
  170. package/dist/kosuke/serve/routes/health.js.map +0 -1
  171. package/dist/kosuke/serve/routes/plan.d.ts +0 -6
  172. package/dist/kosuke/serve/routes/plan.d.ts.map +0 -1
  173. package/dist/kosuke/serve/routes/plan.js +0 -106
  174. package/dist/kosuke/serve/routes/plan.js.map +0 -1
  175. package/dist/kosuke/serve/server.d.ts +0 -16
  176. package/dist/kosuke/serve/server.d.ts.map +0 -1
  177. package/dist/kosuke/serve/server.js +0 -67
  178. package/dist/kosuke/serve/server.js.map +0 -1
  179. package/dist/kosuke/serve/validation/build.d.ts +0 -41
  180. package/dist/kosuke/serve/validation/build.d.ts.map +0 -1
  181. package/dist/kosuke/serve/validation/build.js +0 -20
  182. package/dist/kosuke/serve/validation/build.js.map +0 -1
  183. package/dist/kosuke/serve/validation/plan.d.ts +0 -26
  184. package/dist/kosuke/serve/validation/plan.d.ts.map +0 -1
  185. package/dist/kosuke/serve/validation/plan.js +0 -15
  186. package/dist/kosuke/serve/validation/plan.js.map +0 -1
  187. package/dist/kosuke/types.d.ts +0 -469
  188. package/dist/kosuke/types.d.ts.map +0 -1
  189. package/dist/kosuke/types.js +0 -5
  190. package/dist/kosuke/types.js.map +0 -1
  191. package/dist/kosuke/utils/batch-creator.d.ts +0 -14
  192. package/dist/kosuke/utils/batch-creator.d.ts.map +0 -1
  193. package/dist/kosuke/utils/batch-creator.js +0 -76
  194. package/dist/kosuke/utils/batch-creator.js.map +0 -1
  195. package/dist/kosuke/utils/claude-agent.d.ts +0 -145
  196. package/dist/kosuke/utils/claude-agent.d.ts.map +0 -1
  197. package/dist/kosuke/utils/claude-agent.js +0 -504
  198. package/dist/kosuke/utils/claude-agent.js.map +0 -1
  199. package/dist/kosuke/utils/constants.d.ts +0 -40
  200. package/dist/kosuke/utils/constants.d.ts.map +0 -1
  201. package/dist/kosuke/utils/constants.js +0 -54
  202. package/dist/kosuke/utils/constants.js.map +0 -1
  203. package/dist/kosuke/utils/file-discovery.d.ts +0 -15
  204. package/dist/kosuke/utils/file-discovery.d.ts.map +0 -1
  205. package/dist/kosuke/utils/file-discovery.js +0 -80
  206. package/dist/kosuke/utils/file-discovery.js.map +0 -1
  207. package/dist/kosuke/utils/git.d.ts +0 -41
  208. package/dist/kosuke/utils/git.d.ts.map +0 -1
  209. package/dist/kosuke/utils/git.js +0 -145
  210. package/dist/kosuke/utils/git.js.map +0 -1
  211. package/dist/kosuke/utils/github.d.ts +0 -17
  212. package/dist/kosuke/utils/github.d.ts.map +0 -1
  213. package/dist/kosuke/utils/github.js +0 -22
  214. package/dist/kosuke/utils/github.js.map +0 -1
  215. package/dist/kosuke/utils/interactive-input.d.ts +0 -22
  216. package/dist/kosuke/utils/interactive-input.d.ts.map +0 -1
  217. package/dist/kosuke/utils/interactive-input.js +0 -124
  218. package/dist/kosuke/utils/interactive-input.js.map +0 -1
  219. package/dist/kosuke/utils/logger.d.ts +0 -161
  220. package/dist/kosuke/utils/logger.d.ts.map +0 -1
  221. package/dist/kosuke/utils/logger.js +0 -234
  222. package/dist/kosuke/utils/logger.js.map +0 -1
  223. package/dist/kosuke/utils/playwright-mcp-client.d.ts +0 -46
  224. package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +0 -1
  225. package/dist/kosuke/utils/playwright-mcp-client.js +0 -135
  226. package/dist/kosuke/utils/playwright-mcp-client.js.map +0 -1
  227. package/dist/kosuke/utils/pr-orchestrator.d.ts +0 -49
  228. package/dist/kosuke/utils/pr-orchestrator.d.ts.map +0 -1
  229. package/dist/kosuke/utils/pr-orchestrator.js +0 -154
  230. package/dist/kosuke/utils/pr-orchestrator.js.map +0 -1
  231. package/dist/kosuke/utils/repository-manager.d.ts +0 -13
  232. package/dist/kosuke/utils/repository-manager.d.ts.map +0 -1
  233. package/dist/kosuke/utils/repository-manager.js +0 -94
  234. package/dist/kosuke/utils/repository-manager.js.map +0 -1
  235. package/dist/kosuke/utils/repository-resolver.d.ts +0 -12
  236. package/dist/kosuke/utils/repository-resolver.d.ts.map +0 -1
  237. package/dist/kosuke/utils/repository-resolver.js +0 -186
  238. package/dist/kosuke/utils/repository-resolver.js.map +0 -1
  239. package/dist/kosuke/utils/tickets-manager.d.ts +0 -64
  240. package/dist/kosuke/utils/tickets-manager.d.ts.map +0 -1
  241. package/dist/kosuke/utils/tickets-manager.js +0 -331
  242. package/dist/kosuke/utils/tickets-manager.js.map +0 -1
  243. package/dist/kosuke/utils/validator.d.ts +0 -45
  244. package/dist/kosuke/utils/validator.d.ts.map +0 -1
  245. package/dist/kosuke/utils/validator.js +0 -248
  246. package/dist/kosuke/utils/validator.js.map +0 -1
  247. package/dist/lib.d.ts +0 -96
  248. package/dist/lib.d.ts.map +0 -1
  249. package/dist/lib.js +0 -95
  250. package/dist/lib.js.map +0 -1
  251. package/dist/package.json +0 -99
@@ -1,630 +0,0 @@
1
- /**
2
- * Plan command - AI-driven ticket planning from feature/bug descriptions
3
- *
4
- * This command takes a prompt describing a feature or bug and an existing codebase,
5
- * asks clarification questions (non-technical, user-focused), and generates tickets.json
6
- * that can be processed by the build command.
7
- *
8
- * Features:
9
- * - Analyzes existing codebase to understand patterns
10
- * - Asks AI-generated clarification questions (non-technical)
11
- * - Auto-detects ticket types (SCHEMA-, BACKEND-, FRONTEND-, WEB-TEST-)
12
- * - Generates tickets.json compatible with build command
13
- *
14
- * Usage:
15
- * kosuke plan --prompt="Add dark mode toggle" --directory=./my-project
16
- * kosuke plan --prompt="Fix login timeout bug" --dir=./app
17
- * kosuke plan --prompt="Add notes feature" --no-test # Skip WEB-TEST tickets
18
- */
19
- import { existsSync, mkdirSync, statSync } from 'fs';
20
- import { join, resolve } from 'path';
21
- import { formatCostBreakdown, runAgent, runAgentStream } from '../utils/claude-agent.js';
22
- import { askQuestion } from '../utils/interactive-input.js';
23
- import { logger, setupCancellationHandler } from '../utils/logger.js';
24
- import { parseTickets, processAndWriteTickets } from '../utils/tickets-manager.js';
25
- /**
26
- * Generate timestamp-based tickets path in tickets/ folder
27
- * Creates the tickets/ folder if it doesn't exist
28
- */
29
- function generateTicketsPath(cwd) {
30
- const ticketsDir = join(cwd, 'tickets');
31
- // Create tickets folder if it doesn't exist
32
- if (!existsSync(ticketsDir)) {
33
- mkdirSync(ticketsDir, { recursive: true });
34
- }
35
- // Generate timestamp: YYYY-MM-DD-HH-mm-ss
36
- const now = new Date();
37
- const timestamp = now
38
- .toISOString()
39
- .replace(/[T:]/g, '-')
40
- .replace(/\.\d{3}Z$/, '');
41
- return join(ticketsDir, `${timestamp}.tickets.json`);
42
- }
43
- /**
44
- * Build system prompt for plan command
45
- *
46
- * Two-phase workflow:
47
- * - Phase 1: Ask clarification questions (non-technical, user-focused)
48
- * - Phase 2: Generate tickets via write_tickets tool
49
- *
50
- * @param noTest - If true, exclude WEB-TEST tickets from generation
51
- */
52
- function buildPlanSystemPrompt(noTest = false) {
53
- const testGuidelines = noTest
54
- ? ''
55
- : `
56
-
57
- **E2E Test Tickets:**
58
- - Find test users in seed files (\`lib/db/seed.ts\`)
59
- - Pattern: \`*+kosuke_test@example.com\` → OTP: \`424242\`
60
- - Required: Test credentials, numbered steps, clear element descriptions, acceptance criteria`;
61
- return `# ROLE: TICKET PLANNER
62
-
63
- **YOUR PRIMARY OBJECTIVE:** Create implementation tickets that developers will use to build the feature. You analyze requirements and break them into structured, actionable tickets.
64
-
65
- **Your Workflow:**
66
-
67
- **Phase 1:** Ask clarification questions (non-technical, user-focused)
68
- **Phase 2:** Output raw JSON tickets array
69
-
70
- **Critical Rules:**
71
- - NEVER start implementation - you only create tickets
72
- - NEVER create/edit files, install packages, or use Task tool
73
- - ALWAYS explore codebase (Read/Grep/Glob) to understand patterns before asking questions
74
- - YOU decide technical implementation details based on existing codebase
75
-
76
- ## Phase 1: Ask Clarification Questions
77
-
78
- When a user describes a feature request, analyze the codebase (Read/Grep/Glob) to understand existing patterns, then ask **ONLY business/UX questions** (not technical implementation questions).
79
-
80
- **Your first response MUST use this exact format:**
81
-
82
- ---
83
- ## Understanding Your Request
84
- [Brief business summary - what the user wants to achieve, NOT implementation details]
85
-
86
- ## Clarification Questions
87
-
88
- For each clarification needed, provide BOTH a question AND a recommended approach:
89
-
90
- 1. **[Topic]**
91
- - Question: [Non-technical user question]
92
- - šŸ’” Recommendation: [Default choice that simplifies scope]
93
-
94
- 2. **[Topic]**
95
- - Question: [Non-technical user question]
96
- - šŸ’” Recommendation: [Default choice that simplifies scope]
97
-
98
- (Add as many questions as needed)
99
-
100
- **Quick Response Option:** You can reply "go for recommendations" to accept all recommended approaches at once.
101
- ---
102
-
103
- **ALLOWED QUESTIONS (User/Business Focus):**
104
- - What data to show/hide, empty state behavior
105
- - Error messages users see
106
- - Permission rules (who can do what)
107
- - User workflow and steps
108
-
109
- **FORBIDDEN QUESTIONS (Technical - YOU decide these):**
110
- - Which library to use (jsPDF, PDFKit, etc.)
111
- - Backend vs client-side generation
112
- - API design (REST, tRPC, GraphQL)
113
- - Database queries or ORM choice
114
- - Component structure or styling
115
- - Performance optimization techniques
116
-
117
- **YOU decide all technical choices** based on existing codebase patterns.
118
-
119
- **Language Reminders:**
120
- - āš ļø NEVER say: "I'll implement", "Let me build", "Now I'll create the files"
121
- - āœ… INSTEAD say: "I'll create tickets for", "The tickets will include"
122
-
123
- ## Phase 2: Generate Tickets
124
-
125
- Once the user answers questions OR says "go for recommendations", immediately output a raw JSON array of tickets.
126
-
127
- **Critical:**
128
- - DO NOT say "Now I'll implement" or show "Implementation Plan" - you're creating TICKETS, not implementing
129
- - DO NOT read more files after Phase 1 completes
130
- - Your ENTIRE response = JSON array (no markdown wrapping, no explanations)
131
- - Output starts with "[" and ends with "]"
132
-
133
- **Required JSON Format:**
134
- [
135
- {
136
- "id": "PLAN-BACKEND-1",
137
- "title": "Add PDF export endpoint to orders router",
138
- "description": "Create tRPC endpoint that generates PDF.\\n\\n**Acceptance Criteria:**\\n- Accepts filter parameters\\n- Returns PDF file\\n- Respects filters",
139
- "type": "backend",
140
- "estimatedEffort": 5,
141
- "status": "Todo",
142
- "category": "orders"
143
- },
144
- {
145
- "id": "PLAN-FRONTEND-1",
146
- "title": "Add PDF export button to orders table",
147
- "description": "Add button to toolbar.\\n\\n**Acceptance Criteria:**\\n- Button visible\\n- Downloads PDF\\n- Shows loading state",
148
- "type": "frontend",
149
- "estimatedEffort": 4,
150
- "status": "Todo",
151
- "category": "orders"
152
- }${noTest
153
- ? ''
154
- : `,
155
- {
156
- "id": "PLAN-WEB-TEST-1",
157
- "title": "E2E: Test PDF export with filters",
158
- "description": "**Test User:** john+kosuke_test@example.com (OTP: 424242)\\n\\n**Steps:**\\n1. Sign in\\n2. Apply filters\\n3. Click PDF export\\n4. Verify download\\n\\n**Acceptance Criteria:**\\n- PDF downloads\\n- Contains filtered data",
159
- "type": "test",
160
- "estimatedEffort": 3,
161
- "status": "Todo",
162
- "category": "orders"
163
- }`}
164
- ]
165
-
166
- **CRITICAL - Exact Ticket ID Format (MUST MATCH):**
167
- - PLAN-SCHEMA-1, PLAN-SCHEMA-2, ... → type: "schema"
168
- - PLAN-ENGINE-1, PLAN-ENGINE-2, ... → type: "engine"
169
- - PLAN-BACKEND-1, PLAN-BACKEND-2, ... → type: "backend"
170
- - PLAN-FRONTEND-1, PLAN-FRONTEND-2, ... → type: "frontend"${noTest ? '' : '\n- PLAN-WEB-TEST-1, PLAN-WEB-TEST-2, ... → type: "test"'}
171
-
172
- **Required Fields (every ticket):**
173
- - id: Exact format above (NOT "PLAN-TEST-1", use "PLAN-WEB-TEST-1")
174
- - title: Short descriptive title
175
- - description: Details with **Acceptance Criteria:** section (use \\n for newlines)
176
- - type: MUST be one of: "schema", "engine", "backend", "frontend"${noTest ? '' : ', "test"'}
177
- - estimatedEffort: Integer from 1 to 10
178
- - status: ALWAYS "Todo"
179
- - category: Optional (e.g., "orders", "auth", "billing")
180
-
181
- **Dependency order:** SCHEMA → ENGINE → BACKEND → FRONTEND${noTest ? '' : ' → WEB-TEST'}
182
- ${testGuidelines}
183
-
184
- 🚨 **WHEN USER SAYS "go for recommendations" OR ANSWERS YOUR QUESTIONS:**
185
-
186
- YOU ARE NOW IN PHASE 2. EXPLORATION IS OVER.
187
-
188
- DO NOT:
189
- - Read more files
190
- - Search for packages
191
- - Say "Now I'll implement" or "Let me create"
192
- - Use Task tool
193
- - Show "Implementation Plan"
194
- - Add any text before or after the JSON
195
-
196
- IMMEDIATELY OUTPUT THE JSON ARRAY. Your ENTIRE response = JSON array starting with "[" and ending with "]".
197
-
198
- **Examples:**
199
-
200
- āŒ WRONG: \`Perfect! Now I'll implement... [shows implementation plan]\`
201
- āŒ WRONG: \`Great! I'll create the tickets. \\\`\\\`\\\`json [...] \\\`\\\`\\\`\` (markdown wrapping)
202
- āŒ WRONG: \`Now I'll update the files...\`
203
-
204
- āœ… CORRECT: \`[{"id": "PLAN-BACKEND-1", "title": "Add PDF export endpoint", ...}]\`
205
-
206
- Just the raw JSON array. No explanatory text. No markdown code fences. No "Now I'll implement" language.`;
207
- }
208
- /**
209
- * Shared setup for plan agent configuration
210
- */
211
- function createPlanAgentConfig(options) {
212
- const { prompt, directory, noTest = false, resume } = options;
213
- // Validate directory
214
- const cwd = directory ? resolve(directory) : process.cwd();
215
- if (!existsSync(cwd)) {
216
- return { error: `Directory not found: ${cwd}` };
217
- }
218
- const stats = statSync(cwd);
219
- if (!stats.isDirectory()) {
220
- return { error: `Path is not a directory: ${cwd}` };
221
- }
222
- const ticketsPath = generateTicketsPath(cwd);
223
- const systemPrompt = buildPlanSystemPrompt(noTest);
224
- const config = {
225
- systemPrompt,
226
- cwd,
227
- maxTurns: 40, // Increased for complex planning sessions with multiple files to analyze
228
- verbosity: 'verbose',
229
- permissionMode: 'bypassPermissions',
230
- // Restrict to read-only tools only
231
- // Block all code editing, execution, task management, and agent control tools
232
- disallowedTools: [
233
- 'Edit', // File editing
234
- 'Write', // File creation
235
- 'Delete', // File deletion
236
- 'NotebookEdit', // Notebook editing
237
- 'Bash', // Shell execution
238
- 'Task', // Sub-agent spawning (prevents implementation subtasks)
239
- 'TodoWrite', // Task management (implementation mode)
240
- 'ExitPlanMode', // Mode transitions
241
- ],
242
- ...(resume && { resume }),
243
- };
244
- return { config, ticketsPath, cwd, prompt };
245
- }
246
- /**
247
- * Plan core stream for server (async generator, no logging)
248
- */
249
- export async function* planCoreStream(options) {
250
- const setup = createPlanAgentConfig(options);
251
- if ('error' in setup) {
252
- yield {
253
- type: 'done',
254
- data: {
255
- status: 'error',
256
- ticketsFile: null,
257
- tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
258
- cost: 0,
259
- error: setup.error,
260
- },
261
- };
262
- return;
263
- }
264
- const { config, ticketsPath, cwd, prompt } = setup;
265
- try {
266
- const stream = runAgentStream(prompt, config);
267
- let sessionId;
268
- let fullResponse = '';
269
- let tokensUsed = { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 };
270
- let cost = 0;
271
- // Yield events from stream
272
- for await (const event of stream) {
273
- if (event.type === 'message') {
274
- const claudeMessage = event.data;
275
- yield { type: 'message', data: claudeMessage };
276
- // Track session ID
277
- if (claudeMessage.session_id) {
278
- sessionId = claudeMessage.session_id;
279
- }
280
- // Accumulate response text and extract tool calls from assistant messages
281
- if (claudeMessage.type === 'assistant' && claudeMessage.message) {
282
- const msg = claudeMessage.message;
283
- if (msg.content && Array.isArray(msg.content)) {
284
- for (const block of msg.content) {
285
- if (block.type === 'text' && block.text) {
286
- fullResponse += block.text;
287
- }
288
- else if (block.type === 'tool_use' && block.name) {
289
- // Yield tool call event
290
- yield {
291
- type: 'tool_call',
292
- data: { name: block.name, input: block.input || {} },
293
- };
294
- }
295
- }
296
- }
297
- }
298
- }
299
- else if (event.type === 'agent_result') {
300
- // Use metrics from final result
301
- tokensUsed = event.data.tokensUsed;
302
- cost = event.data.cost;
303
- if (event.data.sessionId) {
304
- sessionId = event.data.sessionId;
305
- }
306
- }
307
- }
308
- // Try to parse tickets from response (Phase 2)
309
- try {
310
- const tickets = parseTickets(fullResponse);
311
- // If no tickets were parsed, this is Phase 1 (clarification questions)
312
- if (tickets.length === 0) {
313
- yield {
314
- type: 'done',
315
- data: {
316
- status: 'input_required',
317
- ticketsFile: null,
318
- tokensUsed,
319
- cost,
320
- sessionId,
321
- },
322
- };
323
- return;
324
- }
325
- // Use full pipeline: validate, sort, write
326
- await processAndWriteTickets(tickets, ticketsPath, cwd, {
327
- skipValidation: false,
328
- displaySummary: false, // Don't display in stream mode
329
- });
330
- yield {
331
- type: 'done',
332
- data: {
333
- status: 'success',
334
- ticketsFile: ticketsPath,
335
- tokensUsed,
336
- cost,
337
- sessionId,
338
- },
339
- };
340
- }
341
- catch (parseError) {
342
- const errorMsg = parseError instanceof Error ? parseError.message : String(parseError);
343
- // Check if this is a parse/validation error or just Phase 1
344
- if (errorMsg.includes('No JSON array found')) {
345
- // This is Phase 1 (clarification questions)
346
- yield {
347
- type: 'done',
348
- data: {
349
- status: 'input_required',
350
- ticketsFile: null,
351
- tokensUsed,
352
- cost,
353
- sessionId,
354
- },
355
- };
356
- }
357
- else {
358
- // Actual validation error
359
- yield {
360
- type: 'done',
361
- data: {
362
- status: 'error',
363
- ticketsFile: null,
364
- tokensUsed,
365
- cost: 0,
366
- error: errorMsg,
367
- },
368
- };
369
- }
370
- }
371
- }
372
- catch (error) {
373
- yield {
374
- type: 'done',
375
- data: {
376
- status: 'error',
377
- ticketsFile: null,
378
- tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
379
- cost: 0,
380
- error: error instanceof Error ? error.message : String(error),
381
- },
382
- };
383
- }
384
- }
385
- /**
386
- * Plan interactive session for CLI (single turn with logging)
387
- */
388
- async function planInteractiveSession(options) {
389
- const setup = createPlanAgentConfig(options);
390
- if ('error' in setup) {
391
- return {
392
- status: 'error',
393
- ticketsFile: null,
394
- tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
395
- cost: 0,
396
- error: setup.error,
397
- };
398
- }
399
- const { config, ticketsPath, cwd, prompt } = setup;
400
- try {
401
- console.log('\nšŸ¤” Claude is analyzing...\n');
402
- // Run agent with logging
403
- const result = await runAgent(prompt, config);
404
- // Display cost
405
- console.log('\n' + '─'.repeat(90));
406
- console.log(`šŸ’° Cost: ${formatCostBreakdown(result)}`);
407
- console.log('─'.repeat(90) + '\n');
408
- // Try to parse tickets from response (Phase 2)
409
- try {
410
- const tickets = parseTickets(result.response);
411
- // If no tickets were parsed, this is Phase 1 (clarification questions)
412
- if (tickets.length === 0) {
413
- return {
414
- status: 'input_required',
415
- ticketsFile: null,
416
- tokensUsed: result.tokensUsed,
417
- cost: result.cost,
418
- sessionId: result.sessionId,
419
- message: result.response,
420
- };
421
- }
422
- // Use full pipeline: validate, sort, write
423
- await processAndWriteTickets(tickets, ticketsPath, cwd, {
424
- skipValidation: false,
425
- displaySummary: true, // Display summary in interactive mode
426
- });
427
- console.log(`\nāœ… Successfully created ${tickets.length} tickets: ${ticketsPath}\n`);
428
- return {
429
- status: 'success',
430
- ticketsFile: ticketsPath,
431
- tokensUsed: result.tokensUsed,
432
- cost: result.cost,
433
- sessionId: result.sessionId,
434
- message: result.response,
435
- };
436
- }
437
- catch (parseError) {
438
- const errorMsg = parseError instanceof Error ? parseError.message : String(parseError);
439
- // Check if this is a parse/validation error or just Phase 1
440
- if (errorMsg.includes('No JSON array found')) {
441
- // This is Phase 1 (clarification questions)
442
- return {
443
- status: 'input_required',
444
- ticketsFile: null,
445
- tokensUsed: result.tokensUsed,
446
- cost: result.cost,
447
- sessionId: result.sessionId,
448
- message: result.response,
449
- };
450
- }
451
- // Actual validation error - show it
452
- console.error(`\nāŒ Ticket validation failed: ${errorMsg}\n`);
453
- return {
454
- status: 'error',
455
- ticketsFile: null,
456
- tokensUsed: result.tokensUsed,
457
- cost: result.cost,
458
- error: errorMsg,
459
- };
460
- }
461
- }
462
- catch (error) {
463
- return {
464
- status: 'error',
465
- ticketsFile: null,
466
- tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
467
- cost: 0,
468
- error: error instanceof Error ? error.message : String(error),
469
- };
470
- }
471
- }
472
- /**
473
- * Main plan command (interactive CLI wrapper)
474
- */
475
- export async function planCommand(options) {
476
- // Initialize logging
477
- const logContext = logger.createContext('plan', { noLogs: options.noLogs ?? false });
478
- const cleanupHandler = setupCancellationHandler(logContext);
479
- try {
480
- // Validate environment
481
- if (!process.env.ANTHROPIC_API_KEY) {
482
- throw new Error('ANTHROPIC_API_KEY environment variable is required');
483
- }
484
- // Validate prompt
485
- if (!options.prompt) {
486
- throw new Error('Prompt is required. Use --prompt="Your feature or bug description"\n' +
487
- 'Example: kosuke plan --prompt="Add dark mode toggle" --directory=./my-project');
488
- }
489
- // Resolve directory
490
- const cwd = options.directory ? resolve(options.directory) : process.cwd();
491
- if (!existsSync(cwd)) {
492
- throw new Error(`Directory not found: ${cwd}`);
493
- }
494
- const stats = statSync(cwd);
495
- if (!stats.isDirectory()) {
496
- throw new Error(`Path is not a directory: ${cwd}`);
497
- }
498
- console.log(`
499
- ╔══════════════════════════════════════════════════════════════════════════════╗
500
- ā•‘ Kosuke Plan - AI-Driven Ticket Planning ā•‘
501
- ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•
502
- `);
503
- console.log('šŸ’” This tool will help you create implementation tickets from your feature/bug description.\n');
504
- console.log('šŸ¤– Claude will explore your codebase to understand patterns and conventions.\n');
505
- console.log('✨ Tip: Enter to submit, Ctrl+J for new lines.\n');
506
- console.log(`šŸ“ Using project directory: ${cwd}\n`);
507
- // Set up Ctrl+C handler
508
- const handleSigInt = async () => {
509
- console.log('\n\nšŸ‘‹ Exiting planning session...\n');
510
- await logger.complete(logContext, 'cancelled');
511
- cleanupHandler();
512
- process.exit(0);
513
- };
514
- process.on('SIGINT', handleSigInt);
515
- let currentPrompt = options.prompt;
516
- let sessionId = options.resume;
517
- let totalInputTokens = 0;
518
- let totalOutputTokens = 0;
519
- let totalCacheCreationTokens = 0;
520
- let totalCacheReadTokens = 0;
521
- let totalCost = 0;
522
- try {
523
- // Interactive loop
524
- while (true) {
525
- const result = await planInteractiveSession({
526
- prompt: currentPrompt,
527
- directory: cwd,
528
- noTest: options.noTest,
529
- resume: sessionId,
530
- });
531
- // Track cumulative costs
532
- totalInputTokens += result.tokensUsed.input;
533
- totalOutputTokens += result.tokensUsed.output;
534
- totalCacheCreationTokens += result.tokensUsed.cacheCreation;
535
- totalCacheReadTokens += result.tokensUsed.cacheRead;
536
- totalCost += result.cost;
537
- sessionId = result.sessionId;
538
- if (result.status === 'success') {
539
- // Planning complete
540
- console.log('═'.repeat(90));
541
- console.log('šŸ“Š Total Session Cost:');
542
- console.log(`šŸ’° ${formatCostBreakdown({
543
- tokensUsed: {
544
- input: totalInputTokens,
545
- output: totalOutputTokens,
546
- cacheCreation: totalCacheCreationTokens,
547
- cacheRead: totalCacheReadTokens,
548
- },
549
- cost: totalCost,
550
- response: '',
551
- fixCount: 0,
552
- filesReferenced: new Set(),
553
- })}`);
554
- console.log('═'.repeat(90));
555
- const relativeTicketsPath = result.ticketsFile.replace(cwd + '/', '');
556
- console.log('\nšŸŽ‰ Planning complete!\n');
557
- console.log('šŸ’” Next steps:');
558
- console.log(' - Review tickets: cat "' + result.ticketsFile + '"');
559
- console.log(' - Build tickets: kosuke build --directory="' +
560
- cwd +
561
- '" --tickets="' +
562
- relativeTicketsPath +
563
- '"');
564
- console.log(' - List all tickets: ls ' + join(cwd, 'tickets'));
565
- if (sessionId) {
566
- console.log(`\nšŸ’¾ Session ID: ${sessionId}`);
567
- }
568
- logger.trackTokens(logContext, {
569
- input: totalInputTokens,
570
- output: totalOutputTokens,
571
- cacheCreation: totalCacheCreationTokens,
572
- cacheRead: totalCacheReadTokens,
573
- });
574
- await logger.complete(logContext, 'success');
575
- break;
576
- }
577
- else if (result.status === 'input_required') {
578
- // Ask for user response
579
- console.log('šŸ’¬ Your response (type "exit" to quit):\n');
580
- const userResponse = await askQuestion('You: ');
581
- if (!userResponse) {
582
- console.log('\nāš ļø Empty response. Please provide an answer or type "exit".');
583
- continue;
584
- }
585
- if (userResponse.toLowerCase() === 'exit') {
586
- console.log('\nšŸ‘‹ Exiting planning session.\n');
587
- if (sessionId) {
588
- console.log('šŸ’¾ Session ID (to resume later):');
589
- console.log(` ${sessionId}\n`);
590
- console.log(' Resume with: kosuke plan --prompt="continue" --resume=' + sessionId + '\n');
591
- }
592
- console.log('═'.repeat(90));
593
- console.log('šŸ“Š Session Cost:');
594
- console.log(`šŸ’° ${formatCostBreakdown({
595
- tokensUsed: {
596
- input: totalInputTokens,
597
- output: totalOutputTokens,
598
- cacheCreation: totalCacheCreationTokens,
599
- cacheRead: totalCacheReadTokens,
600
- },
601
- cost: totalCost,
602
- response: '',
603
- fixCount: 0,
604
- filesReferenced: new Set(),
605
- })}`);
606
- console.log('═'.repeat(90) + '\n');
607
- await logger.complete(logContext, 'cancelled');
608
- break;
609
- }
610
- currentPrompt = userResponse;
611
- }
612
- else {
613
- // Error
614
- throw new Error(result.error || 'Unknown error during planning');
615
- }
616
- }
617
- }
618
- finally {
619
- process.removeListener('SIGINT', handleSigInt);
620
- }
621
- cleanupHandler();
622
- }
623
- catch (error) {
624
- console.error('\nāŒ Plan command failed:', error);
625
- await logger.complete(logContext, 'error', error);
626
- cleanupHandler();
627
- throw error;
628
- }
629
- }
630
- //# sourceMappingURL=plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../kosuke/commands/plan.ts"],"names":[],"mappings":"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"}