@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.
- package/README.md +31 -448
- package/dist/commands/auth.js +117 -0
- package/dist/generated/commands/deploy/cancel.js +17 -0
- package/dist/generated/commands/deploy/messages.js +17 -0
- package/dist/generated/commands/deploy/run.js +60 -0
- package/dist/generated/commands/index.js +132 -0
- package/dist/generated/commands/preview/get.js +25 -0
- package/dist/generated/commands/preview/health.js +25 -0
- package/dist/generated/commands/preview/reset.js +27 -0
- package/dist/generated/commands/preview/share-create.js +36 -0
- package/dist/generated/commands/preview/share-delete.js +26 -0
- package/dist/generated/commands/preview/share-get.js +26 -0
- package/dist/generated/commands/preview/shared.js +17 -0
- package/dist/generated/commands/projects/create.js +37 -0
- package/dist/generated/commands/projects/delete.js +17 -0
- package/dist/generated/commands/projects/env-vars-add.js +21 -0
- package/dist/generated/commands/projects/env-vars-remove.js +21 -0
- package/dist/generated/commands/projects/get.js +17 -0
- package/dist/generated/commands/projects/list.js +15 -0
- package/dist/generated/commands/projects/services-add.js +87 -0
- package/dist/generated/commands/projects/services-list.js +18 -0
- package/dist/generated/commands/projects/services-remove.js +19 -0
- package/dist/generated/commands/projects/services-update.js +81 -0
- package/dist/generated/commands/projects/settings-get.js +18 -0
- package/dist/generated/commands/projects/settings-import.js +91 -0
- package/dist/generated/commands/projects/settings-update.js +77 -0
- package/dist/generated/commands/projects/skills.js +35 -0
- package/dist/generated/commands/projects/update.js +27 -0
- package/dist/generated/commands/sessions/activate.js +18 -0
- package/dist/generated/commands/sessions/checklist-generate.js +19 -0
- package/dist/generated/commands/sessions/checklist-get.js +19 -0
- package/dist/generated/commands/sessions/comments-add.js +63 -0
- package/dist/generated/commands/sessions/comments-delete.js +20 -0
- package/dist/generated/commands/sessions/comments-list.js +19 -0
- package/dist/generated/commands/sessions/comments-update.js +23 -0
- package/dist/generated/commands/sessions/create.js +126 -0
- package/dist/generated/commands/sessions/delete.js +18 -0
- package/dist/generated/commands/sessions/diff-files.js +19 -0
- package/dist/generated/commands/sessions/diff-patch.js +86 -0
- package/dist/generated/commands/sessions/edit-prompt.js +59 -0
- package/dist/generated/commands/sessions/files-get.js +27 -0
- package/dist/generated/commands/sessions/files-list.js +19 -0
- package/dist/generated/commands/sessions/files-write.js +41 -0
- package/dist/generated/commands/sessions/get.js +18 -0
- package/dist/generated/commands/sessions/git-commit-message.js +19 -0
- package/dist/generated/commands/sessions/git-commit.js +29 -0
- package/dist/generated/commands/sessions/git-push.js +19 -0
- package/dist/generated/commands/sessions/git-state.js +19 -0
- package/dist/generated/commands/sessions/jobs-cancel.js +20 -0
- package/dist/generated/commands/sessions/jobs-get.js +20 -0
- package/dist/generated/commands/sessions/list.js +81 -0
- package/dist/generated/commands/sessions/messages.js +18 -0
- package/dist/generated/commands/sessions/search.js +23 -0
- package/dist/generated/commands/sessions/send.js +98 -0
- package/dist/generated/commands/sessions/update.js +72 -0
- package/dist/generated/commands/workspaces/access-status.js +29 -0
- package/dist/generated/commands/workspaces/ai-provider-get.js +18 -0
- package/dist/generated/commands/workspaces/ai-provider-remove.js +42 -0
- package/dist/generated/commands/workspaces/ai-provider-set.js +21 -0
- package/dist/generated/commands/workspaces/credits.js +17 -0
- package/dist/generated/commands/workspaces/get.js +17 -0
- package/dist/generated/commands/workspaces/getting-started-get.js +18 -0
- package/dist/generated/commands/workspaces/getting-started-update.js +32 -0
- package/dist/generated/commands/workspaces/list.js +15 -0
- package/dist/generated/commands/workspaces/members.js +25 -0
- package/dist/generated/commands/workspaces/sandbox-limit.js +17 -0
- package/dist/generated/commands/workspaces/stop-sandboxes.js +27 -0
- package/dist/generated/commands/workspaces/usage.js +32 -0
- package/dist/index.js +5 -516
- package/dist/program.js +46 -0
- package/dist/runtime/attach.js +139 -0
- package/dist/runtime/attachments.js +58 -0
- package/dist/runtime/client.js +12 -0
- package/dist/runtime/config.js +49 -0
- package/dist/runtime/credentials.js +24 -0
- package/dist/runtime/descriptor.js +7 -0
- package/dist/runtime/invoke.js +152 -0
- package/dist/runtime/runtime.js +41 -0
- package/dist/runtime/version.js +5 -0
- package/openapi.json +5222 -0
- package/package.json +21 -79
- package/LICENSE +0 -21
- package/claude.costs.json +0 -34
- package/dist/__tests__/utils/file-discovery.test.d.ts +0 -5
- package/dist/__tests__/utils/file-discovery.test.d.ts.map +0 -1
- package/dist/__tests__/utils/file-discovery.test.js +0 -51
- package/dist/__tests__/utils/file-discovery.test.js.map +0 -1
- package/dist/__tests__/utils/logger-nologs.test.d.ts +0 -5
- package/dist/__tests__/utils/logger-nologs.test.d.ts.map +0 -1
- package/dist/__tests__/utils/logger-nologs.test.js +0 -34
- package/dist/__tests__/utils/logger-nologs.test.js.map +0 -1
- package/dist/__tests__/utils/logger.test.d.ts +0 -5
- package/dist/__tests__/utils/logger.test.d.ts.map +0 -1
- package/dist/__tests__/utils/logger.test.js +0 -243
- package/dist/__tests__/utils/logger.test.js.map +0 -1
- package/dist/__tests__/utils/validator.test.d.ts +0 -5
- package/dist/__tests__/utils/validator.test.d.ts.map +0 -1
- package/dist/__tests__/utils/validator.test.js +0 -206
- package/dist/__tests__/utils/validator.test.js.map +0 -1
- package/dist/index.d.ts +0 -35
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/kosuke/commands/analyse.d.ts +0 -15
- package/dist/kosuke/commands/analyse.d.ts.map +0 -1
- package/dist/kosuke/commands/analyse.js +0 -273
- package/dist/kosuke/commands/analyse.js.map +0 -1
- package/dist/kosuke/commands/build.d.ts +0 -35
- package/dist/kosuke/commands/build.d.ts.map +0 -1
- package/dist/kosuke/commands/build.js +0 -659
- package/dist/kosuke/commands/build.js.map +0 -1
- package/dist/kosuke/commands/getcode.d.ts +0 -29
- package/dist/kosuke/commands/getcode.d.ts.map +0 -1
- package/dist/kosuke/commands/getcode.js +0 -221
- package/dist/kosuke/commands/getcode.js.map +0 -1
- package/dist/kosuke/commands/lint.d.ts +0 -21
- package/dist/kosuke/commands/lint.d.ts.map +0 -1
- package/dist/kosuke/commands/lint.js +0 -321
- package/dist/kosuke/commands/lint.js.map +0 -1
- package/dist/kosuke/commands/migrate.d.ts +0 -38
- package/dist/kosuke/commands/migrate.d.ts.map +0 -1
- package/dist/kosuke/commands/migrate.js +0 -284
- package/dist/kosuke/commands/migrate.js.map +0 -1
- package/dist/kosuke/commands/plan.d.ts +0 -28
- package/dist/kosuke/commands/plan.d.ts.map +0 -1
- package/dist/kosuke/commands/plan.js +0 -630
- package/dist/kosuke/commands/plan.js.map +0 -1
- package/dist/kosuke/commands/requirements.d.ts +0 -52
- package/dist/kosuke/commands/requirements.d.ts.map +0 -1
- package/dist/kosuke/commands/requirements.js +0 -615
- package/dist/kosuke/commands/requirements.js.map +0 -1
- package/dist/kosuke/commands/review.d.ts +0 -26
- package/dist/kosuke/commands/review.d.ts.map +0 -1
- package/dist/kosuke/commands/review.js +0 -303
- package/dist/kosuke/commands/review.js.map +0 -1
- package/dist/kosuke/commands/serve.d.ts +0 -9
- package/dist/kosuke/commands/serve.d.ts.map +0 -1
- package/dist/kosuke/commands/serve.js +0 -17
- package/dist/kosuke/commands/serve.js.map +0 -1
- package/dist/kosuke/commands/ship.d.ts +0 -37
- package/dist/kosuke/commands/ship.d.ts.map +0 -1
- package/dist/kosuke/commands/ship.js +0 -375
- package/dist/kosuke/commands/ship.js.map +0 -1
- package/dist/kosuke/commands/sync-rules.d.ts +0 -9
- package/dist/kosuke/commands/sync-rules.d.ts.map +0 -1
- package/dist/kosuke/commands/sync-rules.js +0 -379
- package/dist/kosuke/commands/sync-rules.js.map +0 -1
- package/dist/kosuke/commands/test.d.ts +0 -42
- package/dist/kosuke/commands/test.d.ts.map +0 -1
- package/dist/kosuke/commands/test.js +0 -540
- package/dist/kosuke/commands/test.js.map +0 -1
- package/dist/kosuke/commands/tickets.d.ts +0 -43
- package/dist/kosuke/commands/tickets.d.ts.map +0 -1
- package/dist/kosuke/commands/tickets.js +0 -499
- package/dist/kosuke/commands/tickets.js.map +0 -1
- package/dist/kosuke/serve/middleware/error-handler.d.ts +0 -14
- package/dist/kosuke/serve/middleware/error-handler.d.ts.map +0 -1
- package/dist/kosuke/serve/middleware/error-handler.js +0 -42
- package/dist/kosuke/serve/middleware/error-handler.js.map +0 -1
- package/dist/kosuke/serve/middleware/validation.d.ts +0 -13
- package/dist/kosuke/serve/middleware/validation.d.ts.map +0 -1
- package/dist/kosuke/serve/middleware/validation.js +0 -38
- package/dist/kosuke/serve/middleware/validation.js.map +0 -1
- package/dist/kosuke/serve/routes/build.d.ts +0 -6
- package/dist/kosuke/serve/routes/build.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/build.js +0 -226
- package/dist/kosuke/serve/routes/build.js.map +0 -1
- package/dist/kosuke/serve/routes/health.d.ts +0 -6
- package/dist/kosuke/serve/routes/health.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/health.js +0 -11
- package/dist/kosuke/serve/routes/health.js.map +0 -1
- package/dist/kosuke/serve/routes/plan.d.ts +0 -6
- package/dist/kosuke/serve/routes/plan.d.ts.map +0 -1
- package/dist/kosuke/serve/routes/plan.js +0 -106
- package/dist/kosuke/serve/routes/plan.js.map +0 -1
- package/dist/kosuke/serve/server.d.ts +0 -16
- package/dist/kosuke/serve/server.d.ts.map +0 -1
- package/dist/kosuke/serve/server.js +0 -67
- package/dist/kosuke/serve/server.js.map +0 -1
- package/dist/kosuke/serve/validation/build.d.ts +0 -41
- package/dist/kosuke/serve/validation/build.d.ts.map +0 -1
- package/dist/kosuke/serve/validation/build.js +0 -20
- package/dist/kosuke/serve/validation/build.js.map +0 -1
- package/dist/kosuke/serve/validation/plan.d.ts +0 -26
- package/dist/kosuke/serve/validation/plan.d.ts.map +0 -1
- package/dist/kosuke/serve/validation/plan.js +0 -15
- package/dist/kosuke/serve/validation/plan.js.map +0 -1
- package/dist/kosuke/types.d.ts +0 -469
- package/dist/kosuke/types.d.ts.map +0 -1
- package/dist/kosuke/types.js +0 -5
- package/dist/kosuke/types.js.map +0 -1
- package/dist/kosuke/utils/batch-creator.d.ts +0 -14
- package/dist/kosuke/utils/batch-creator.d.ts.map +0 -1
- package/dist/kosuke/utils/batch-creator.js +0 -76
- package/dist/kosuke/utils/batch-creator.js.map +0 -1
- package/dist/kosuke/utils/claude-agent.d.ts +0 -145
- package/dist/kosuke/utils/claude-agent.d.ts.map +0 -1
- package/dist/kosuke/utils/claude-agent.js +0 -504
- package/dist/kosuke/utils/claude-agent.js.map +0 -1
- package/dist/kosuke/utils/constants.d.ts +0 -40
- package/dist/kosuke/utils/constants.d.ts.map +0 -1
- package/dist/kosuke/utils/constants.js +0 -54
- package/dist/kosuke/utils/constants.js.map +0 -1
- package/dist/kosuke/utils/file-discovery.d.ts +0 -15
- package/dist/kosuke/utils/file-discovery.d.ts.map +0 -1
- package/dist/kosuke/utils/file-discovery.js +0 -80
- package/dist/kosuke/utils/file-discovery.js.map +0 -1
- package/dist/kosuke/utils/git.d.ts +0 -41
- package/dist/kosuke/utils/git.d.ts.map +0 -1
- package/dist/kosuke/utils/git.js +0 -145
- package/dist/kosuke/utils/git.js.map +0 -1
- package/dist/kosuke/utils/github.d.ts +0 -17
- package/dist/kosuke/utils/github.d.ts.map +0 -1
- package/dist/kosuke/utils/github.js +0 -22
- package/dist/kosuke/utils/github.js.map +0 -1
- package/dist/kosuke/utils/interactive-input.d.ts +0 -22
- package/dist/kosuke/utils/interactive-input.d.ts.map +0 -1
- package/dist/kosuke/utils/interactive-input.js +0 -124
- package/dist/kosuke/utils/interactive-input.js.map +0 -1
- package/dist/kosuke/utils/logger.d.ts +0 -161
- package/dist/kosuke/utils/logger.d.ts.map +0 -1
- package/dist/kosuke/utils/logger.js +0 -234
- package/dist/kosuke/utils/logger.js.map +0 -1
- package/dist/kosuke/utils/playwright-mcp-client.d.ts +0 -46
- package/dist/kosuke/utils/playwright-mcp-client.d.ts.map +0 -1
- package/dist/kosuke/utils/playwright-mcp-client.js +0 -135
- package/dist/kosuke/utils/playwright-mcp-client.js.map +0 -1
- package/dist/kosuke/utils/pr-orchestrator.d.ts +0 -49
- package/dist/kosuke/utils/pr-orchestrator.d.ts.map +0 -1
- package/dist/kosuke/utils/pr-orchestrator.js +0 -154
- package/dist/kosuke/utils/pr-orchestrator.js.map +0 -1
- package/dist/kosuke/utils/repository-manager.d.ts +0 -13
- package/dist/kosuke/utils/repository-manager.d.ts.map +0 -1
- package/dist/kosuke/utils/repository-manager.js +0 -94
- package/dist/kosuke/utils/repository-manager.js.map +0 -1
- package/dist/kosuke/utils/repository-resolver.d.ts +0 -12
- package/dist/kosuke/utils/repository-resolver.d.ts.map +0 -1
- package/dist/kosuke/utils/repository-resolver.js +0 -186
- package/dist/kosuke/utils/repository-resolver.js.map +0 -1
- package/dist/kosuke/utils/tickets-manager.d.ts +0 -64
- package/dist/kosuke/utils/tickets-manager.d.ts.map +0 -1
- package/dist/kosuke/utils/tickets-manager.js +0 -331
- package/dist/kosuke/utils/tickets-manager.js.map +0 -1
- package/dist/kosuke/utils/validator.d.ts +0 -45
- package/dist/kosuke/utils/validator.d.ts.map +0 -1
- package/dist/kosuke/utils/validator.js +0 -248
- package/dist/kosuke/utils/validator.js.map +0 -1
- package/dist/lib.d.ts +0 -96
- package/dist/lib.d.ts.map +0 -1
- package/dist/lib.js +0 -95
- package/dist/lib.js.map +0 -1
- package/dist/package.json +0 -99
|
@@ -1,499 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tickets command - Generate tickets from requirements document
|
|
3
|
-
*
|
|
4
|
-
* Generates tickets directly from a requirements document.
|
|
5
|
-
* No clarification questions - assumes requirements are complete.
|
|
6
|
-
* Best for: New projects with detailed requirements from `kosuke requirements`.
|
|
7
|
-
*
|
|
8
|
-
* For interactive ticket creation with questions, use: kosuke plan --prompt="..."
|
|
9
|
-
*
|
|
10
|
-
* SCAFFOLD MODE (--scaffold flag):
|
|
11
|
-
* SCAFFOLD BATCH (template adaptation):
|
|
12
|
-
* 1. SCAFFOLD-SCHEMA-1 (ONE ticket for ALL database infrastructure changes)
|
|
13
|
-
* 2. SCAFFOLD-BACKEND-X → SCAFFOLD-FRONTEND-X → SCAFFOLD-WEB-TEST-X (feature-by-feature)
|
|
14
|
-
*
|
|
15
|
-
* LOGIC BATCH (business functionality):
|
|
16
|
-
* 1. LOGIC-SCHEMA-1 (ONE ticket for ALL business entities)
|
|
17
|
-
* 2. LOGIC-BACKEND-X → LOGIC-FRONTEND-X → LOGIC-WEB-TEST-X (feature-by-feature)
|
|
18
|
-
*
|
|
19
|
-
* LOGIC-ONLY MODE (default):
|
|
20
|
-
* Only generates LOGIC tickets for new features
|
|
21
|
-
* 1. LOGIC-SCHEMA-1 (ONE ticket for ALL business entities)
|
|
22
|
-
* 2. LOGIC-BACKEND-X → LOGIC-FRONTEND-X → LOGIC-WEB-TEST-X (feature-by-feature)
|
|
23
|
-
*
|
|
24
|
-
* Workflow:
|
|
25
|
-
* 1. Claude Code Agent explores codebase and generates tickets
|
|
26
|
-
* 2. Review step validates and fixes ticket structure
|
|
27
|
-
* 3. Outputs validated tickets.json
|
|
28
|
-
*
|
|
29
|
-
* Usage:
|
|
30
|
-
* kosuke tickets # Use docs.md
|
|
31
|
-
* kosuke tickets --scaffold # Scaffold + logic from docs.md
|
|
32
|
-
* kosuke tickets --path=custom.md # Custom requirements file
|
|
33
|
-
*/
|
|
34
|
-
import { existsSync, readFileSync, statSync } from 'fs';
|
|
35
|
-
import { join, resolve } from 'path';
|
|
36
|
-
import { formatCostBreakdown, runAgent } from '../utils/claude-agent.js';
|
|
37
|
-
import { logger, setupCancellationHandler } from '../utils/logger.js';
|
|
38
|
-
import { parseTickets, processAndWriteTickets } from '../utils/tickets-manager.js';
|
|
39
|
-
/**
|
|
40
|
-
* Build unified system prompt for comprehensive ticket generation
|
|
41
|
-
*/
|
|
42
|
-
function buildTicketPrompt(requirementsContent, projectPath, isScaffoldMode, noTest = false) {
|
|
43
|
-
const scaffoldGuidance = isScaffoldMode
|
|
44
|
-
? `
|
|
45
|
-
**SCAFFOLD TICKETS - Template Adaptation ONLY:**
|
|
46
|
-
|
|
47
|
-
These tickets focus on removing, changing, or customizing the Kosuke Template baseline.
|
|
48
|
-
DO NOT add new business logic or features from requirements here.
|
|
49
|
-
|
|
50
|
-
Scaffold tickets should:
|
|
51
|
-
- ❌ REMOVE unused template features (e.g., organizations, billing, multi-tenancy)
|
|
52
|
-
- 🔄 CHANGE existing features (e.g., swap Better Auth for Clerk, simplify billing)
|
|
53
|
-
- 🎨 CUSTOMIZE infrastructure (landing page, email templates, branding, navigation)
|
|
54
|
-
|
|
55
|
-
Examples of SCAFFOLD tickets:
|
|
56
|
-
- "Remove organization/multi-tenancy support from auth"
|
|
57
|
-
- "Simplify billing to single tier (remove pro/business tiers)"
|
|
58
|
-
- "Customize landing page for [specific use case]"
|
|
59
|
-
- "Remove landing page entirely (internal tool)"
|
|
60
|
-
- "Update email templates for [brand name]"
|
|
61
|
-
|
|
62
|
-
**SCAFFOLD Ticket Ordering - CRITICAL:**
|
|
63
|
-
1. SCAFFOLD-SCHEMA-1 (ONE ticket for ALL database infrastructure changes, auto-validated)
|
|
64
|
-
2. SCAFFOLD-BACKEND-X → SCAFFOLD-FRONTEND-X → SCAFFOLD-WEB-TEST-X (feature-by-feature)
|
|
65
|
-
3. Each feature follows: backend → frontend → test pattern
|
|
66
|
-
|
|
67
|
-
**SCAFFOLD Web Tests Must Validate:**
|
|
68
|
-
- Authentication flow works without removed features (e.g., no org selection)
|
|
69
|
-
- Navigation doesn't have broken links after removing pages
|
|
70
|
-
- Landing page renders correctly with new branding
|
|
71
|
-
- Signup flow works with simplified structure
|
|
72
|
-
- Settings pages work without removed sections (e.g., billing removed)
|
|
73
|
-
- Any customized templates (emails, landing) render correctly
|
|
74
|
-
`
|
|
75
|
-
: '';
|
|
76
|
-
const webTestGuidance = noTest
|
|
77
|
-
? ''
|
|
78
|
-
: `
|
|
79
|
-
**WEB TEST TICKETS - Playwright MCP E2E Tests:**
|
|
80
|
-
|
|
81
|
-
Web test tickets are executed by Playwright MCP with Claude AI and must follow these guidelines:
|
|
82
|
-
|
|
83
|
-
**Test User Discovery:**
|
|
84
|
-
1. **ALWAYS read seed files** to find test user credentials:
|
|
85
|
-
- Look for files: lib/db/seed.ts, src/lib/db/seed.ts
|
|
86
|
-
- Pattern: Any email ending with "+kosuke_test@example.com" uses OTP code "424242"
|
|
87
|
-
- Example: john+kosuke_test@example.com → OTP: 424242
|
|
88
|
-
- Include all discovered test users in ticket description
|
|
89
|
-
|
|
90
|
-
**Ticket Structure Requirements:**
|
|
91
|
-
Each web test ticket MUST include:
|
|
92
|
-
|
|
93
|
-
1. **Test User Credentials** (at the top)
|
|
94
|
-
- List all test users with their emails
|
|
95
|
-
- Document OTP code (424242)
|
|
96
|
-
- Specify user roles if applicable (admin, regular user, etc.)
|
|
97
|
-
|
|
98
|
-
2. **Test Steps** (numbered, detailed natural language)
|
|
99
|
-
- Navigation instructions ("Navigate to /sign-in")
|
|
100
|
-
- User interactions ("Click button labeled 'New Task'")
|
|
101
|
-
- Input actions ("Enter 'Test Task' in title field")
|
|
102
|
-
- Expected outcomes after each step ("Expected: Task appears in list")
|
|
103
|
-
- Use CLEAR element descriptions (button text, labels, placeholders)
|
|
104
|
-
- Use relative paths only (e.g., /sign-in, /tasks) - base URL provided as test argument
|
|
105
|
-
|
|
106
|
-
3. **Acceptance Criteria**
|
|
107
|
-
- Final expected state
|
|
108
|
-
- Data validation points
|
|
109
|
-
- User feedback confirmation
|
|
110
|
-
|
|
111
|
-
**Playwright MCP Best Practices:**
|
|
112
|
-
- Use natural language, NOT code
|
|
113
|
-
- Be SPECIFIC about element identification (button text, input labels, exact URLs)
|
|
114
|
-
- Include EXPECTED OUTCOMES after each major action
|
|
115
|
-
- Combine related flows into ONE ticket (signup → create → invite = 1 ticket)
|
|
116
|
-
- Authentication steps MUST be explicit:
|
|
117
|
-
1. Navigate to /sign-in
|
|
118
|
-
2. Enter email: {test_user}+kosuke_test@example.com
|
|
119
|
-
3. Click "Send Code" button
|
|
120
|
-
4. Enter OTP: 424242
|
|
121
|
-
5. Click "Verify" button
|
|
122
|
-
6. Expected: Redirected to dashboard/main app
|
|
123
|
-
|
|
124
|
-
**Example Web Test Ticket:**
|
|
125
|
-
|
|
126
|
-
{
|
|
127
|
-
"id": "LOGIC-WEB-TEST-1",
|
|
128
|
-
"title": "E2E: User signup and create first task",
|
|
129
|
-
"description": "**Test User Credentials:**\\n- Email: john+kosuke_test@example.com\\n- OTP Code: 424242\\n\\n**Test Steps:**\\n\\n1. **Sign in with test user**\\n - Navigate to /sign-in\\n - Enter email: john+kosuke_test@example.com\\n - Click button labeled 'Send Code'\\n - Enter OTP code: 424242\\n - Click button labeled 'Verify'\\n - Expected: Redirected to /tasks\\n\\n2. **Create new task**\\n - Click button with text 'New Task'\\n - Enter 'My First Task' in the Title field\\n - Select 'High' from Priority dropdown\\n - Click 'Create Task' button\\n - Expected: Task appears in task list\\n - Expected: Success message shown\\n\\n3. **Verify task persistence**\\n - Refresh the page\\n - Expected: Task 'My First Task' still visible\\n - Expected: Priority shows 'High'\\n\\n**Acceptance Criteria:**\\n- User successfully authenticates with OTP\\n- Task is created and visible\\n- Task persists after page refresh\\n- UI shows appropriate feedback",
|
|
130
|
-
"type": "test",
|
|
131
|
-
"estimatedEffort": 4,
|
|
132
|
-
"status": "Todo",
|
|
133
|
-
"category": "tasks"
|
|
134
|
-
}`;
|
|
135
|
-
return `You are an expert software architect generating implementation tickets.
|
|
136
|
-
|
|
137
|
-
**Requirements Document:**
|
|
138
|
-
${requirementsContent}
|
|
139
|
-
|
|
140
|
-
**Project Context:**
|
|
141
|
-
You have access to the project directory at: ${projectPath}
|
|
142
|
-
|
|
143
|
-
${scaffoldGuidance}
|
|
144
|
-
${webTestGuidance}
|
|
145
|
-
|
|
146
|
-
**LOGIC TICKETS - Business Functionality:**
|
|
147
|
-
|
|
148
|
-
These tickets implement the actual features and requirements from the document.
|
|
149
|
-
|
|
150
|
-
Logic tickets should:
|
|
151
|
-
- 🗄️ Create schema for business entities (tasks, projects, posts, etc.)
|
|
152
|
-
- 🐍 Create Python engine endpoints for algorithms/calculations
|
|
153
|
-
- ⚙️ Build backend APIs for business features
|
|
154
|
-
- 🎨 Create frontend UI for business features
|
|
155
|
-
|
|
156
|
-
**LOGIC Ticket Ordering - CRITICAL RULES:**
|
|
157
|
-
|
|
158
|
-
**RULE 1: ONLY ONE LOGIC-SCHEMA-1 ticket**
|
|
159
|
-
- Combine ALL business entities into ONE schema ticket
|
|
160
|
-
- ❌ WRONG: LOGIC-SCHEMA-1, LOGIC-SCHEMA-2, LOGIC-SCHEMA-3
|
|
161
|
-
- ✅ CORRECT: LOGIC-SCHEMA-1 (all entities: properties, inquiries, favorites, etc.)
|
|
162
|
-
|
|
163
|
-
**RULE 2: Feature-by-Feature Pattern (STRICT)**
|
|
164
|
-
After schema, each feature MUST follow: engine → backend → frontend → test
|
|
165
|
-
|
|
166
|
-
Example with 2 features:
|
|
167
|
-
1. LOGIC-SCHEMA-1 (ALL schemas combined)
|
|
168
|
-
2. LOGIC-ENGINE-1 (feature 1 engine)
|
|
169
|
-
3. LOGIC-BACKEND-1 (feature 1 backend)
|
|
170
|
-
4. LOGIC-FRONTEND-1 (feature 1 frontend)
|
|
171
|
-
5. LOGIC-WEB-TEST-1 (feature 1 test)
|
|
172
|
-
6. LOGIC-BACKEND-2 (feature 2 backend)
|
|
173
|
-
7. LOGIC-FRONTEND-2 (feature 2 frontend)
|
|
174
|
-
8. LOGIC-WEB-TEST-2 (feature 2 test)
|
|
175
|
-
|
|
176
|
-
**RULE 3: Do NOT group by type**
|
|
177
|
-
❌ WRONG: All backends, then all frontends, then all tests
|
|
178
|
-
✅ CORRECT: Feature-by-feature (backend → frontend → test per feature)
|
|
179
|
-
|
|
180
|
-
**Ticket Granularity:**
|
|
181
|
-
- Schema: EXACTLY ONE ticket for LOGIC batch (combines ALL entities)
|
|
182
|
-
- Engine: One ticket per distinct algorithm/endpoint (could be 0-3 tickets)
|
|
183
|
-
- Backend: Let complexity decide (could be 1-5 tickets per batch)
|
|
184
|
-
- Frontend: Let complexity decide (could be 1-5 tickets per batch)
|
|
185
|
-
- Web Tests: 1 test per major user flow (matches feature grouping)
|
|
186
|
-
|
|
187
|
-
**Your Task:**
|
|
188
|
-
1. **Explore the codebase** using read_file, grep, codebase_search to understand:
|
|
189
|
-
- Current tech stack and framework versions
|
|
190
|
-
- Existing architecture patterns
|
|
191
|
-
- Database schema structure
|
|
192
|
-
- API route patterns
|
|
193
|
-
- UI component library and styling
|
|
194
|
-
${isScaffoldMode ? ' - What template features are currently present\n - What needs to be removed, changed, or customized' : ''}
|
|
195
|
-
|
|
196
|
-
2. **Discover test users** for web testing:
|
|
197
|
-
- Read seed files: lib/db/seed.ts, src/lib/db/seed.ts (use read_file or grep)
|
|
198
|
-
- Look for test user pattern: {name}+kosuke_test@example.com
|
|
199
|
-
- Document all test users found (email addresses)
|
|
200
|
-
- Note: All test users use OTP code 424242 for Better Auth
|
|
201
|
-
- Include test user credentials in ALL web test tickets
|
|
202
|
-
|
|
203
|
-
3. **Analyze requirements** to determine:
|
|
204
|
-
- Which layers are needed (schema/backend/frontend)
|
|
205
|
-
- How to break down features into logical batches
|
|
206
|
-
- What user flows need E2E web tests
|
|
207
|
-
|
|
208
|
-
4. **Generate ALL tickets** in the correct order:
|
|
209
|
-
${isScaffoldMode ? ' - SCAFFOLD batch first (template adaptation)\n - LOGIC batches second (business features)' : ' - LOGIC batches only (business features)'}
|
|
210
|
-
- Follow the ticket ordering structure above
|
|
211
|
-
- Schema tickets are automatically validated during build (no separate test tickets needed)
|
|
212
|
-
- For web tests: Include test user credentials, detailed steps, and expected outcomes
|
|
213
|
-
|
|
214
|
-
**When to use ENGINE vs BACKEND:**
|
|
215
|
-
- **Use BACKEND (Next.js)** for: CRUD operations, auth logic, business rules, anything TypeScript handles well (90% of features)
|
|
216
|
-
- **Use ENGINE (Python)** for: ML/AI, data science (numpy/pandas), complex algorithms, PDF/document parsing, image processing, or when Python libraries are required
|
|
217
|
-
|
|
218
|
-
**Ticket Structure:**
|
|
219
|
-
Each ticket must be a JSON object with:
|
|
220
|
-
- id: string (e.g., "SCAFFOLD-SCHEMA-1", "LOGIC-ENGINE-1", "LOGIC-BACKEND-2", "SCAFFOLD-WEB-TEST-1")
|
|
221
|
-
- title: string (clear, concise title)
|
|
222
|
-
- description: string (detailed description with acceptance criteria)
|
|
223
|
-
- type: "schema" | "engine" | "backend" | "frontend" | "test"
|
|
224
|
-
- estimatedEffort: number (1-10, where 1=very easy, 10=very complex)
|
|
225
|
-
- status: "Todo"
|
|
226
|
-
- category: string (e.g., "auth", "billing", "user-management", "tasks")
|
|
227
|
-
|
|
228
|
-
**Output Format:**
|
|
229
|
-
Return ONLY a valid JSON array of ALL tickets in the correct order. No markdown, no code blocks, just raw JSON.
|
|
230
|
-
|
|
231
|
-
Example (Full Ordering Structure - Scaffold Mode):
|
|
232
|
-
[
|
|
233
|
-
{
|
|
234
|
-
"id": "SCAFFOLD-SCHEMA-1",
|
|
235
|
-
"title": "Remove organizations and simplify auth schema",
|
|
236
|
-
"description": "Remove multi-tenancy/organization features from database:\\n- Drop organization tables\\n- Remove org foreign keys from users table\\n- Simplify schema to individual users only\\n\\nAcceptance Criteria:\\n- Organization tables removed\\n- User table simplified\\n- Migrations validated automatically\\n- No schema errors",
|
|
237
|
-
"type": "schema",
|
|
238
|
-
"estimatedEffort": 5,
|
|
239
|
-
"status": "Todo",
|
|
240
|
-
"category": "auth"
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
"id": "SCAFFOLD-BACKEND-1",
|
|
244
|
-
"title": "Remove organization tRPC routers",
|
|
245
|
-
"description": "Remove organization-related backend logic:\\n- Delete lib/trpc/routers/organizations.ts\\n- Remove from main appRouter\\n- Clean up organization schemas\\n\\nAcceptance Criteria:\\n- Organization routers removed\\n- AppRouter compiles without errors\\n- Type safety maintained",
|
|
246
|
-
"type": "backend",
|
|
247
|
-
"estimatedEffort": 4,
|
|
248
|
-
"status": "Todo",
|
|
249
|
-
"category": "auth"
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
"id": "SCAFFOLD-FRONTEND-1",
|
|
253
|
-
"title": "Remove organization pages and navigation",
|
|
254
|
-
"description": "Remove organization-related UI:\\n- Delete app/(logged-in)/org/[slug]/ directory\\n- Remove org switcher from navigation\\n- Simplify layout without org context\\n\\nAcceptance Criteria:\\n- Organization pages removed\\n- Navigation simplified\\n- No broken links",
|
|
255
|
-
"type": "frontend",
|
|
256
|
-
"estimatedEffort": 5,
|
|
257
|
-
"status": "Todo",
|
|
258
|
-
"category": "auth"
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
"id": "SCAFFOLD-WEB-TEST-1",
|
|
262
|
-
"title": "E2E: Validate simplified auth flow",
|
|
263
|
-
"description": "**Test User Credentials:**\\n- Email: john+kosuke_test@example.com\\n- OTP Code: 424242\\n\\n**Test Steps:**\\n\\n1. **Sign up without org selection**\\n - Navigate to /sign-up\\n - Enter email: newuser+kosuke_test@example.com\\n - Click 'Send Code' button\\n - Enter OTP: 424242\\n - Click 'Verify'\\n - Expected: Redirected directly to app (no org setup)\\n\\n2. **Verify navigation**\\n - Expected: No org switcher visible\\n - Expected: All navigation links work\\n\\n**Acceptance Criteria:**\\n- Auth works without org selection\\n- No broken navigation links\\n- No references to removed features",
|
|
264
|
-
"type": "test",
|
|
265
|
-
"estimatedEffort": 4,
|
|
266
|
-
"status": "Todo",
|
|
267
|
-
"category": "auth"
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
"id": "LOGIC-SCHEMA-1",
|
|
271
|
-
"title": "Create tasks schema",
|
|
272
|
-
"description": "Create database schema for tasks feature:\\n- Create taskStatusEnum: 'todo', 'in_progress', 'done'\\n- Create tasks table with userId foreign key\\n- Export inferred types\\n\\nAcceptance Criteria:\\n- Tasks table created\\n- Enums defined at database level\\n- Migrations validated automatically\\n- No schema errors",
|
|
273
|
-
"type": "schema",
|
|
274
|
-
"estimatedEffort": 4,
|
|
275
|
-
"status": "Todo",
|
|
276
|
-
"category": "tasks"
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
"id": "LOGIC-BACKEND-1",
|
|
280
|
-
"title": "Create tasks tRPC router",
|
|
281
|
-
"description": "Create backend API for tasks:\\n- Create lib/trpc/schemas/tasks.ts\\n- Create lib/trpc/routers/tasks.ts\\n- Implement CRUD operations (list, get, create, update, delete)\\n- Server-side filtering and pagination\\n\\nAcceptance Criteria:\\n- All CRUD operations work\\n- Authorization enforced\\n- Type-safe implementation",
|
|
282
|
-
"type": "backend",
|
|
283
|
-
"estimatedEffort": 6,
|
|
284
|
-
"status": "Todo",
|
|
285
|
-
"category": "tasks"
|
|
286
|
-
},
|
|
287
|
-
{
|
|
288
|
-
"id": "LOGIC-FRONTEND-1",
|
|
289
|
-
"title": "Create tasks page with list and filters",
|
|
290
|
-
"description": "Create tasks management UI:\\n- Create app/(logged-in)/tasks/page.tsx\\n- Task list with filters (status, search)\\n- Add new task button\\n- Task cards with edit/delete actions\\n\\nAcceptance Criteria:\\n- Task list displays correctly\\n- Filters work server-side\\n- CRUD operations functional\\n- Responsive design",
|
|
291
|
-
"type": "frontend",
|
|
292
|
-
"estimatedEffort": 7,
|
|
293
|
-
"status": "Todo",
|
|
294
|
-
"category": "tasks"
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
"id": "LOGIC-WEB-TEST-1",
|
|
298
|
-
"title": "E2E: User creates and manages tasks",
|
|
299
|
-
"description": "**Test User Credentials:**\\n- Email: john+kosuke_test@example.com\\n- OTP Code: 424242\\n\\n**Test Steps:**\\n\\n1. **Sign in**\\n - Navigate to /sign-in\\n - Enter email: john+kosuke_test@example.com\\n - Click 'Send Code' button\\n - Enter OTP: 424242\\n - Click 'Verify'\\n - Expected: Redirected to /tasks\\n\\n2. **Create task**\\n - Click 'New Task' button\\n - Enter title: 'Test Task'\\n - Select status: 'Todo'\\n - Click 'Create'\\n - Expected: Task appears in list\\n - Expected: Success toast shown\\n\\n3. **Update task**\\n - Click on task\\n - Change status to 'Done'\\n - Expected: Status updates immediately\\n\\n4. **Delete task**\\n - Click delete button\\n - Confirm in dialog\\n - Expected: Task removed from list\\n\\n**Acceptance Criteria:**\\n- User authenticates successfully\\n- Task CRUD operations work\\n- UI provides appropriate feedback",
|
|
300
|
-
"type": "test",
|
|
301
|
-
"estimatedEffort": 5,
|
|
302
|
-
"status": "Todo",
|
|
303
|
-
"category": "tasks"
|
|
304
|
-
}
|
|
305
|
-
]
|
|
306
|
-
|
|
307
|
-
**Critical Instructions:**
|
|
308
|
-
1. Explore the project directory thoroughly before generating tickets
|
|
309
|
-
2. ${isScaffoldMode ? 'For SCAFFOLD: Focus on template adaptation ONLY (remove/change/customize) + MUST create SCAFFOLD-WEB-TEST tickets' : ''}
|
|
310
|
-
3. For LOGIC: Focus on business features from requirements
|
|
311
|
-
4. **IMPORTANT**: Read seed files (lib/db/seed.ts or src/lib/db/seed.ts) to discover test users
|
|
312
|
-
5. **SCHEMA TICKETS**: No separate test tickets needed - validation happens automatically during build
|
|
313
|
-
6. ${isScaffoldMode ? '**SCAFFOLD-WEB-TEST TICKETS ARE MANDATORY**: Test that removed features are gone, navigation works, landing page updated, auth flow simplified' : ''}
|
|
314
|
-
7. **WEB TESTS MUST INCLUDE**:
|
|
315
|
-
- Test user credentials at the top
|
|
316
|
-
- Clear numbered steps with natural language
|
|
317
|
-
- Expected outcomes after each step
|
|
318
|
-
- Specific element descriptions (button text, labels, URLs)
|
|
319
|
-
- Complete user flows in one ticket (signup → create → invite = 1 ticket)
|
|
320
|
-
8. Follow the exact ticket ordering structure
|
|
321
|
-
9. Make descriptions detailed with clear acceptance criteria
|
|
322
|
-
10. Return ONLY valid JSON - no explanations, no markdown
|
|
323
|
-
11. Ensure sequential ticket IDs match the ordering structure
|
|
324
|
-
|
|
325
|
-
Begin by:
|
|
326
|
-
1. Reading seed files to discover test users
|
|
327
|
-
2. Exploring the project directory structure
|
|
328
|
-
3. Generating ALL tickets in the correct order with test user info in web tests
|
|
329
|
-
${isScaffoldMode ? '4. IMPORTANT: Create SCAFFOLD-WEB-TEST tickets to validate template changes work correctly' : ''}.`;
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Core tickets logic - Simplified to single agent call
|
|
333
|
-
*/
|
|
334
|
-
export async function ticketsCore(options) {
|
|
335
|
-
const { directory, scaffold = false } = options;
|
|
336
|
-
const isScaffoldMode = scaffold;
|
|
337
|
-
// 1. Validate and resolve project directory
|
|
338
|
-
const projectPath = directory ? resolve(directory) : process.cwd();
|
|
339
|
-
if (!existsSync(projectPath)) {
|
|
340
|
-
throw new Error(`Directory not found: ${projectPath}\n` +
|
|
341
|
-
`Please provide a valid directory using --directory=<path>\n` +
|
|
342
|
-
`Example: kosuke tickets --directory=./my-project`);
|
|
343
|
-
}
|
|
344
|
-
const stats = statSync(projectPath);
|
|
345
|
-
if (!stats.isDirectory()) {
|
|
346
|
-
throw new Error(`Path is not a directory: ${projectPath}\n` + `Please provide a valid directory path.`);
|
|
347
|
-
}
|
|
348
|
-
console.log(`📁 Using project directory: ${projectPath}`);
|
|
349
|
-
console.log(`🏗️ Mode: ${isScaffoldMode ? 'Scaffold (template adaptation + business logic)' : 'Logic-only (business features)'}\n`);
|
|
350
|
-
// 2. Get requirements content from file
|
|
351
|
-
let requirementsContent;
|
|
352
|
-
if (options.path) {
|
|
353
|
-
const requirementsPath = join(projectPath, options.path);
|
|
354
|
-
if (!existsSync(requirementsPath)) {
|
|
355
|
-
throw new Error(`Requirements document not found: ${options.path}\n` +
|
|
356
|
-
`Please provide a valid path using --path=<file>\n` +
|
|
357
|
-
`Example: kosuke tickets --path=requirements.md`);
|
|
358
|
-
}
|
|
359
|
-
requirementsContent = readFileSync(requirementsPath, 'utf-8');
|
|
360
|
-
console.log(`📄 Loaded ${options.path} (${requirementsContent.length} characters)\n`);
|
|
361
|
-
}
|
|
362
|
-
else {
|
|
363
|
-
// Default to docs.md if path not provided
|
|
364
|
-
const defaultPath = 'docs.md';
|
|
365
|
-
const requirementsPath = join(projectPath, defaultPath);
|
|
366
|
-
if (!existsSync(requirementsPath)) {
|
|
367
|
-
throw new Error('Requirements document not found. Use either:\n' +
|
|
368
|
-
' --path=requirements.md (custom file)\n' +
|
|
369
|
-
' Or create a docs.md file in the project directory\n\n' +
|
|
370
|
-
'For interactive ticket creation with questions, use:\n' +
|
|
371
|
-
' kosuke plan --prompt="Your feature description"');
|
|
372
|
-
}
|
|
373
|
-
requirementsContent = readFileSync(requirementsPath, 'utf-8');
|
|
374
|
-
console.log(`📄 Loaded ${defaultPath} (${requirementsContent.length} characters)\n`);
|
|
375
|
-
}
|
|
376
|
-
// 3. Determine output path
|
|
377
|
-
const outputFilename = options.output || 'tickets.json';
|
|
378
|
-
const outputPath = join(projectPath, outputFilename);
|
|
379
|
-
// 4. Generate ALL tickets in a single comprehensive agent call
|
|
380
|
-
console.log(`\n${'='.repeat(80)}`);
|
|
381
|
-
console.log('🎯 Generating Tickets with Claude Code Agent');
|
|
382
|
-
console.log(`${'='.repeat(80)}\n`);
|
|
383
|
-
const systemPrompt = buildTicketPrompt(requirementsContent, projectPath, isScaffoldMode, options.noTest ?? false);
|
|
384
|
-
const agentResult = await runAgent('Generate all tickets from requirements', {
|
|
385
|
-
systemPrompt,
|
|
386
|
-
cwd: projectPath,
|
|
387
|
-
maxTurns: 40, // Give Claude enough turns to explore codebase and generate all tickets
|
|
388
|
-
verbosity: 'normal',
|
|
389
|
-
captureConversation: true,
|
|
390
|
-
});
|
|
391
|
-
// 5. Parse initial tickets using shared utility
|
|
392
|
-
const initialTickets = parseTickets(agentResult.response);
|
|
393
|
-
console.log(`\n✅ Initial generation: ${initialTickets.length} tickets created`);
|
|
394
|
-
// 6. Validate, fix, and write tickets using shared utility
|
|
395
|
-
const { tickets: allTickets, validationIssues } = await processAndWriteTickets(initialTickets, outputPath, projectPath, { displaySummary: true });
|
|
396
|
-
// Display additional info about validation
|
|
397
|
-
if (validationIssues.length > 0) {
|
|
398
|
-
console.log(`📝 ${validationIssues.length} issue(s) were automatically fixed`);
|
|
399
|
-
}
|
|
400
|
-
// 10. Separate tickets by phase for compatibility with existing result structure
|
|
401
|
-
const schemaTickets = allTickets.filter((t) => t.type === 'schema');
|
|
402
|
-
const engineTickets = allTickets.filter((t) => t.type === 'engine');
|
|
403
|
-
const backendTickets = allTickets.filter((t) => t.type === 'backend');
|
|
404
|
-
const frontendTickets = allTickets.filter((t) => t.type === 'frontend');
|
|
405
|
-
const testTickets = allTickets.filter((t) => t.type === 'test');
|
|
406
|
-
return {
|
|
407
|
-
schemaTickets,
|
|
408
|
-
engineTickets,
|
|
409
|
-
backendTickets,
|
|
410
|
-
frontendTickets,
|
|
411
|
-
testTickets,
|
|
412
|
-
totalTickets: allTickets.length,
|
|
413
|
-
projectPath,
|
|
414
|
-
tokensUsed: agentResult.tokensUsed,
|
|
415
|
-
cost: agentResult.cost,
|
|
416
|
-
conversationMessages: agentResult.conversationMessages || [],
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Main tickets command
|
|
421
|
-
*/
|
|
422
|
-
export async function ticketsCommand(options) {
|
|
423
|
-
const { noLogs = false } = options;
|
|
424
|
-
console.log('🎫 Starting Ticket Generation...\n');
|
|
425
|
-
// Initialize logging context
|
|
426
|
-
const logContext = logger.createContext('tickets', { noLogs });
|
|
427
|
-
const cleanupHandler = setupCancellationHandler(logContext);
|
|
428
|
-
try {
|
|
429
|
-
// Validate environment
|
|
430
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
431
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
432
|
-
}
|
|
433
|
-
// Execute core logic
|
|
434
|
-
const result = await ticketsCore(options);
|
|
435
|
-
// Track metrics
|
|
436
|
-
logger.trackTokens(logContext, result.tokensUsed);
|
|
437
|
-
logContext.conversationMessages = result.conversationMessages;
|
|
438
|
-
// Get all tickets by batch (scaffold vs logic)
|
|
439
|
-
const scaffoldTickets = [
|
|
440
|
-
...result.schemaTickets,
|
|
441
|
-
...result.engineTickets,
|
|
442
|
-
...result.backendTickets,
|
|
443
|
-
...result.frontendTickets,
|
|
444
|
-
...result.testTickets,
|
|
445
|
-
].filter((t) => t.id.toUpperCase().startsWith('SCAFFOLD-'));
|
|
446
|
-
const logicTickets = [
|
|
447
|
-
...result.schemaTickets,
|
|
448
|
-
...result.engineTickets,
|
|
449
|
-
...result.backendTickets,
|
|
450
|
-
...result.frontendTickets,
|
|
451
|
-
...result.testTickets,
|
|
452
|
-
].filter((t) => t.id.toUpperCase().startsWith('LOGIC-'));
|
|
453
|
-
// Display summary
|
|
454
|
-
console.log(`\n${'='.repeat(80)}`);
|
|
455
|
-
console.log('📊 Ticket Generation Summary');
|
|
456
|
-
console.log(`${'='.repeat(80)}`);
|
|
457
|
-
if (scaffoldTickets.length > 0) {
|
|
458
|
-
console.log(`\n🏗️ Scaffold Tickets (Template Adaptation): ${scaffoldTickets.length}`);
|
|
459
|
-
console.log(` 🗄️ Schema: ${result.schemaTickets.filter((t) => t.id.toUpperCase().startsWith('SCAFFOLD-')).length} (auto-validated)`);
|
|
460
|
-
console.log(` 🐍 Engine: ${result.engineTickets.filter((t) => t.id.toUpperCase().startsWith('SCAFFOLD-')).length} (auto-validated)`);
|
|
461
|
-
console.log(` ⚙️ Backend: ${result.backendTickets.filter((t) => t.id.toUpperCase().startsWith('SCAFFOLD-')).length}`);
|
|
462
|
-
console.log(` 🎨 Frontend: ${result.frontendTickets.filter((t) => t.id.toUpperCase().startsWith('SCAFFOLD-')).length}`);
|
|
463
|
-
console.log(` 🧪 Tests: ${result.testTickets.filter((t) => t.id.toUpperCase().startsWith('SCAFFOLD-')).length}`);
|
|
464
|
-
}
|
|
465
|
-
console.log(`\n💡 Logic Tickets (Business Functionality): ${logicTickets.length}`);
|
|
466
|
-
console.log(` 🗄️ Schema: ${result.schemaTickets.filter((t) => t.id.toUpperCase().startsWith('LOGIC-')).length} (auto-validated)`);
|
|
467
|
-
console.log(` 🐍 Engine: ${result.engineTickets.filter((t) => t.id.toUpperCase().startsWith('LOGIC-')).length} (auto-validated)`);
|
|
468
|
-
console.log(` ⚙️ Backend: ${result.backendTickets.filter((t) => t.id.toUpperCase().startsWith('LOGIC-')).length}`);
|
|
469
|
-
console.log(` 🎨 Frontend: ${result.frontendTickets.filter((t) => t.id.toUpperCase().startsWith('LOGIC-')).length}`);
|
|
470
|
-
console.log(` 🧪 Tests: ${result.testTickets.filter((t) => t.id.toUpperCase().startsWith('LOGIC-')).length}`);
|
|
471
|
-
console.log(`\n📝 Total Tickets: ${result.totalTickets}`);
|
|
472
|
-
console.log(`${'='.repeat(80)}\n`);
|
|
473
|
-
// Display cost breakdown
|
|
474
|
-
const costBreakdown = formatCostBreakdown({
|
|
475
|
-
cost: result.cost,
|
|
476
|
-
tokensUsed: result.tokensUsed,
|
|
477
|
-
fixCount: 0,
|
|
478
|
-
response: '',
|
|
479
|
-
filesReferenced: new Set(),
|
|
480
|
-
});
|
|
481
|
-
console.log(`💰 Total Cost: ${costBreakdown}\n`);
|
|
482
|
-
// Final confirmation
|
|
483
|
-
const outputFilename = options.output || 'tickets.json';
|
|
484
|
-
const outputPath = join(result.projectPath, outputFilename);
|
|
485
|
-
console.log(`✅ All tickets saved to: ${outputPath}\n`);
|
|
486
|
-
console.log('✅ Ticket generation completed successfully!');
|
|
487
|
-
// Log successful execution
|
|
488
|
-
await logger.complete(logContext, 'success');
|
|
489
|
-
cleanupHandler();
|
|
490
|
-
}
|
|
491
|
-
catch (error) {
|
|
492
|
-
console.error('\n❌ Ticket generation failed:', error);
|
|
493
|
-
// Log failed execution
|
|
494
|
-
await logger.complete(logContext, 'error', error);
|
|
495
|
-
cleanupHandler();
|
|
496
|
-
throw error;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
//# sourceMappingURL=tickets.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tickets.js","sourceRoot":"","sources":["../../../kosuke/commands/tickets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error handling middleware
|
|
3
|
-
*/
|
|
4
|
-
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
5
|
-
import type { FastifyError } from 'fastify';
|
|
6
|
-
/**
|
|
7
|
-
* 404 handler for unknown routes
|
|
8
|
-
*/
|
|
9
|
-
export declare function notFoundHandler(req: FastifyRequest, reply: FastifyReply): void;
|
|
10
|
-
/**
|
|
11
|
-
* Global error handler
|
|
12
|
-
*/
|
|
13
|
-
export declare function errorHandler(error: FastifyError, _req: FastifyRequest, reply: FastifyReply): void;
|
|
14
|
-
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAM9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA0BjG"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error handling middleware
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* 404 handler for unknown routes
|
|
6
|
-
*/
|
|
7
|
-
export function notFoundHandler(req, reply) {
|
|
8
|
-
reply.code(404).send({
|
|
9
|
-
error: 'Not Found',
|
|
10
|
-
message: `Route ${req.method} ${req.url} not found`,
|
|
11
|
-
availableRoutes: ['GET /health', 'POST /api/plan', 'POST /api/build'],
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Global error handler
|
|
16
|
-
*/
|
|
17
|
-
export function errorHandler(error, _req, reply) {
|
|
18
|
-
// JSON parsing errors
|
|
19
|
-
if (error.statusCode === 400 && error.code === 'FST_ERR_CTP_INVALID_MEDIA_TYPE') {
|
|
20
|
-
reply.code(400).send({
|
|
21
|
-
error: 'Invalid Content-Type',
|
|
22
|
-
message: 'Expected application/json',
|
|
23
|
-
details: error.message,
|
|
24
|
-
});
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
if (error.statusCode === 400 && error.message.includes('JSON')) {
|
|
28
|
-
reply.code(400).send({
|
|
29
|
-
error: 'Invalid JSON',
|
|
30
|
-
message: 'Request body contains invalid JSON syntax',
|
|
31
|
-
details: error.message,
|
|
32
|
-
});
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
// Generic error handler
|
|
36
|
-
console.error('Server error:', error);
|
|
37
|
-
reply.code(error.statusCode || 500).send({
|
|
38
|
-
error: 'Internal Server Error',
|
|
39
|
-
message: error.message || 'An unexpected error occurred',
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=error-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAmB,EAAE,KAAmB;IACtE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,SAAS,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY;QACnD,eAAe,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;KACtE,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,IAAoB,EAAE,KAAmB;IACzF,sBAAsB;IACtB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,gCAAgC,EAAE,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,2CAA2C;YACpD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,8BAA8B;KACzD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generic validation middleware
|
|
3
|
-
*/
|
|
4
|
-
import type { preHandlerHookHandler } from 'fastify';
|
|
5
|
-
import { z } from 'zod';
|
|
6
|
-
/**
|
|
7
|
-
* Generic validation middleware factory
|
|
8
|
-
*
|
|
9
|
-
* Validates request body against a Zod schema and returns 400 if invalid.
|
|
10
|
-
* Replaces req.body with validated data on success.
|
|
11
|
-
*/
|
|
12
|
-
export declare function validateRequest(schema: z.ZodSchema): preHandlerHookHandler;
|
|
13
|
-
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,GAAG,qBAAqB,CA6B1E"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generic validation middleware
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Generic validation middleware factory
|
|
6
|
-
*
|
|
7
|
-
* Validates request body against a Zod schema and returns 400 if invalid.
|
|
8
|
-
* Replaces req.body with validated data on success.
|
|
9
|
-
*/
|
|
10
|
-
export function validateRequest(schema) {
|
|
11
|
-
return async (req, reply) => {
|
|
12
|
-
try {
|
|
13
|
-
const result = schema.safeParse(req.body);
|
|
14
|
-
if (!result.success) {
|
|
15
|
-
// Format Zod errors into readable format
|
|
16
|
-
const errors = result.error.issues.map((err) => ({
|
|
17
|
-
field: err.path.join('.'),
|
|
18
|
-
message: err.message,
|
|
19
|
-
}));
|
|
20
|
-
reply.code(400).send({
|
|
21
|
-
error: 'Validation Error',
|
|
22
|
-
message: 'Request validation failed',
|
|
23
|
-
details: errors,
|
|
24
|
-
});
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
// Replace req.body with validated data
|
|
28
|
-
req.body = result.data;
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
reply.code(500).send({
|
|
32
|
-
error: 'Internal Server Error',
|
|
33
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAiB,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,yCAAyC;gBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/C,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;oBACzB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC,CAAC;gBAEJ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE,2BAA2B;oBACpC,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|