@kody-ade/kody-engine-lite 0.1.108 → 0.1.109
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/dist/bin/cli.js +1760 -1316
- package/package.json +1 -1
- package/prompts/taskify-ticket.md +112 -0
- package/templates/kody.yml +12 -0
package/package.json
CHANGED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
You are a task decomposition agent. Your job is to break down a product spec into scoped, independently implementable tasks.
|
|
2
|
+
|
|
3
|
+
## Input
|
|
4
|
+
|
|
5
|
+
{{#if TICKET_ID}}
|
|
6
|
+
**Mode: ticket**
|
|
7
|
+
|
|
8
|
+
Use the available MCP tools to fetch ticket **{{TICKET_ID}}**.
|
|
9
|
+
Read everything: title, description, acceptance criteria, sub-tasks, linked issues, attachments.
|
|
10
|
+
{{/if}}
|
|
11
|
+
|
|
12
|
+
{{#if FILE_CONTENT}}
|
|
13
|
+
**Mode: file**
|
|
14
|
+
|
|
15
|
+
The product spec is provided below:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
{{FILE_CONTENT}}
|
|
19
|
+
```
|
|
20
|
+
{{/if}}
|
|
21
|
+
|
|
22
|
+
{{#if PROJECT_CONTEXT}}
|
|
23
|
+
## Existing codebase
|
|
24
|
+
|
|
25
|
+
Use this to avoid suggesting things that already exist and to follow established conventions.
|
|
26
|
+
|
|
27
|
+
{{PROJECT_CONTEXT}}
|
|
28
|
+
{{/if}}
|
|
29
|
+
|
|
30
|
+
## Decomposition rules
|
|
31
|
+
|
|
32
|
+
Break the spec into implementation tasks where each task:
|
|
33
|
+
- Can be implemented and reviewed independently in a single PR
|
|
34
|
+
- Has clear, testable acceptance criteria
|
|
35
|
+
- Contains all the context a developer needs — no references back to the original ticket
|
|
36
|
+
- Is labeled appropriately (e.g. "frontend", "backend", "database", "infra")
|
|
37
|
+
|
|
38
|
+
Each task body must follow this structure:
|
|
39
|
+
```
|
|
40
|
+
## Context
|
|
41
|
+
Why this task exists and how it fits the bigger picture.
|
|
42
|
+
## Acceptance Criteria
|
|
43
|
+
Bulleted list of what "done" looks like.
|
|
44
|
+
## Test Strategy
|
|
45
|
+
What to test and how — unit tests, integration tests, manual verification steps.
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Sizing guide:
|
|
49
|
+
- A task touching 1–3 files with clear requirements = right size
|
|
50
|
+
- A task requiring design decisions or touching many subsystems = too large, split it
|
|
51
|
+
- A task that is just a config change or a one-liner = too small, merge with a related task
|
|
52
|
+
|
|
53
|
+
Priority guidance — assign `priority` to each task:
|
|
54
|
+
- `high` — blocks other tasks or delivers the ticket's core value
|
|
55
|
+
- `medium` — important but not blocking
|
|
56
|
+
- `low` — polish, edge cases, nice-to-have
|
|
57
|
+
|
|
58
|
+
Dependency guidance — use `dependsOn` to express ordering:
|
|
59
|
+
- If implementing task B requires task A's code to exist first, set `dependsOn: [indexOfA]` (0-based index into the tasks array).
|
|
60
|
+
- If a task has no dependencies, omit `dependsOn` or use `[]`.
|
|
61
|
+
|
|
62
|
+
{{#if FEEDBACK}}
|
|
63
|
+
## Answers to previous questions
|
|
64
|
+
|
|
65
|
+
The product team has provided the following answers:
|
|
66
|
+
|
|
67
|
+
{{FEEDBACK}}
|
|
68
|
+
|
|
69
|
+
Use these answers to resolve any previous ambiguities. Do NOT ask questions again — proceed directly to task decomposition.
|
|
70
|
+
{{/if}}
|
|
71
|
+
|
|
72
|
+
## Output
|
|
73
|
+
|
|
74
|
+
Write ONLY to: `{{TASK_DIR}}/taskify-result.json`
|
|
75
|
+
|
|
76
|
+
Do not write any other files. Do not print anything to stdout.
|
|
77
|
+
|
|
78
|
+
The file must be valid JSON matching exactly one of these two schemas:
|
|
79
|
+
|
|
80
|
+
**Schema A — tasks ready:**
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"status": "ready",
|
|
84
|
+
"tasks": [
|
|
85
|
+
{
|
|
86
|
+
"title": "string (max 72 chars, actionable verb phrase e.g. 'Add OAuth login with Google')",
|
|
87
|
+
"body": "string (full markdown spec with required sections: ## Context, ## Acceptance Criteria, ## Test Strategy)",
|
|
88
|
+
"labels": ["optional", "array", "of", "label", "strings"],
|
|
89
|
+
"priority": "high | medium | low",
|
|
90
|
+
"dependsOn": [0, 2]
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Schema B — clarifications needed:**
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"status": "questions",
|
|
100
|
+
"questions": ["string", "..."]
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Rules:
|
|
105
|
+
- Maximum 3 questions. Only ask what genuinely cannot be determined from the spec.
|
|
106
|
+
- Task titles must be actionable verb phrases ("Add X", "Fix Y", "Implement Z", "Migrate X to Y").
|
|
107
|
+
- Each task body must be self-contained and include ## Context, ## Acceptance Criteria, and ## Test Strategy sections.
|
|
108
|
+
- Labels are for categorization only — not implementation details.
|
|
109
|
+
- `priority` must be one of: `high`, `medium`, `low`.
|
|
110
|
+
- `dependsOn` uses 0-based indices into the tasks array. Omit or use `[]` if there are no dependencies.
|
|
111
|
+
- If the spec is already small enough for a single PR, output one task.
|
|
112
|
+
- Maximum 20 tasks. Consolidate related ones if needed.
|
package/templates/kody.yml
CHANGED
|
@@ -64,6 +64,8 @@ jobs:
|
|
|
64
64
|
pr_number: ${{ steps.parse.outputs.pr_number }}
|
|
65
65
|
feedback: ${{ steps.parse.outputs.feedback }}
|
|
66
66
|
ci_run_id: ${{ steps.parse.outputs.ci_run_id }}
|
|
67
|
+
ticket_id: ${{ steps.parse.outputs.ticket_id }}
|
|
68
|
+
prd_file: ${{ steps.parse.outputs.prd_file }}
|
|
67
69
|
dry_run: ${{ steps.parse.outputs.dry_run }}
|
|
68
70
|
valid: ${{ steps.parse.outputs.valid }}
|
|
69
71
|
steps:
|
|
@@ -190,12 +192,22 @@ jobs:
|
|
|
190
192
|
FEEDBACK: ${{ github.event.inputs.feedback || needs.parse.outputs.feedback }}
|
|
191
193
|
COMPLEXITY: ${{ needs.parse.outputs.complexity }}
|
|
192
194
|
CI_RUN_ID: ${{ needs.parse.outputs.ci_run_id }}
|
|
195
|
+
TICKET_ID: ${{ needs.parse.outputs.ticket_id }}
|
|
196
|
+
PRD_FILE: ${{ needs.parse.outputs.prd_file }}
|
|
193
197
|
DRY_RUN: ${{ github.event.inputs.dry_run || needs.parse.outputs.dry_run || 'false' }}
|
|
194
198
|
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
195
199
|
run: |
|
|
196
200
|
if [ "$MODE" = "bootstrap" ]; then
|
|
197
201
|
echo "Running bootstrap..."
|
|
198
202
|
npx kody-engine-lite bootstrap
|
|
203
|
+
elif [ "$MODE" = "taskify" ]; then
|
|
204
|
+
echo "Running taskify..."
|
|
205
|
+
ARGS=""
|
|
206
|
+
[ -n "$TICKET_ID" ] && ARGS="$ARGS --ticket $TICKET_ID"
|
|
207
|
+
[ -n "$PRD_FILE" ] && ARGS="$ARGS --file $PRD_FILE"
|
|
208
|
+
[ -n "$ISSUE_NUMBER" ] && ARGS="$ARGS --issue-number $ISSUE_NUMBER"
|
|
209
|
+
[ -n "$TASK_ID" ] && ARGS="$ARGS --task-id $TASK_ID"
|
|
210
|
+
npx kody-engine-lite taskify $ARGS
|
|
199
211
|
else
|
|
200
212
|
CMD="run"
|
|
201
213
|
[ "$MODE" = "rerun" ] && CMD="rerun"
|