yoyo-pi 0.1.4
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/LICENSE +21 -0
- package/README.md +91 -0
- package/README.zh-CN.md +91 -0
- package/docs/previews/agent-status.svg +83 -0
- package/docs/previews/filetree.png +0 -0
- package/docs/previews/multiple-choice.png +0 -0
- package/docs/previews/pi-tui-agent-status.html +379 -0
- package/docs/previews/pi-tui-status-bar.html +481 -0
- package/docs/previews/single-choice.png +0 -0
- package/docs/previews/status-bar.png +0 -0
- package/docs/previews/todo-sidebar.png +0 -0
- package/extensions/choice-picker.ts +1404 -0
- package/extensions/clear-context.ts +164 -0
- package/extensions/gr0k-hack/index.ts +1231 -0
- package/extensions/kenx-infra/index.ts +1601 -0
- package/extensions/kenx-infra/themes/dark.json +80 -0
- package/extensions/kenx-infra/themes/light.json +80 -0
- package/extensions/kenx-infra/themes/paper.json +80 -0
- package/extensions/plan-mode/README.md +58 -0
- package/extensions/plan-mode/agents/plan-agent.md +98 -0
- package/extensions/plan-mode/index.ts +1956 -0
- package/extensions/plan-mode/sandbox.ts +332 -0
- package/extensions/vim-mode.ts +561 -0
- package/package.json +58 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "dark",
|
|
4
|
+
"vars": {
|
|
5
|
+
"bg": "#2E322E",
|
|
6
|
+
"edge": "#272A27",
|
|
7
|
+
"ink": "#ECE7DC",
|
|
8
|
+
"ink2": "#B0B0A5",
|
|
9
|
+
"ink3": "#777768",
|
|
10
|
+
"red": "#D89B7E",
|
|
11
|
+
"yellow": "#D9B670",
|
|
12
|
+
"green": "#ADC79A",
|
|
13
|
+
"blue": "#8FB4CE",
|
|
14
|
+
"purple": "#BCA0C5",
|
|
15
|
+
"selection": "#50473E",
|
|
16
|
+
"redBg": "#464139",
|
|
17
|
+
"yellowBg": "#494739",
|
|
18
|
+
"greenBg": "#40473D",
|
|
19
|
+
"blueBg": "#3A4241",
|
|
20
|
+
"purpleBg": "#424143"
|
|
21
|
+
},
|
|
22
|
+
"colors": {
|
|
23
|
+
"accent": "red",
|
|
24
|
+
"border": "ink3",
|
|
25
|
+
"borderAccent": "red",
|
|
26
|
+
"borderMuted": "ink3",
|
|
27
|
+
"success": "green",
|
|
28
|
+
"error": "red",
|
|
29
|
+
"warning": "yellow",
|
|
30
|
+
"muted": "ink2",
|
|
31
|
+
"dim": "ink3",
|
|
32
|
+
"text": "ink",
|
|
33
|
+
"thinkingText": "ink2",
|
|
34
|
+
"selectedBg": "selection",
|
|
35
|
+
"userMessageBg": "edge",
|
|
36
|
+
"userMessageText": "ink",
|
|
37
|
+
"customMessageBg": "purpleBg",
|
|
38
|
+
"customMessageText": "ink",
|
|
39
|
+
"customMessageLabel": "red",
|
|
40
|
+
"toolPendingBg": "blueBg",
|
|
41
|
+
"toolSuccessBg": "greenBg",
|
|
42
|
+
"toolErrorBg": "redBg",
|
|
43
|
+
"toolTitle": "red",
|
|
44
|
+
"toolOutput": "ink2",
|
|
45
|
+
"mdHeading": "yellow",
|
|
46
|
+
"mdLink": "blue",
|
|
47
|
+
"mdLinkUrl": "ink3",
|
|
48
|
+
"mdCode": "red",
|
|
49
|
+
"mdCodeBlock": "ink",
|
|
50
|
+
"mdCodeBlockBorder": "ink3",
|
|
51
|
+
"mdQuote": "ink2",
|
|
52
|
+
"mdQuoteBorder": "ink3",
|
|
53
|
+
"mdHr": "ink3",
|
|
54
|
+
"mdListBullet": "red",
|
|
55
|
+
"toolDiffAdded": "green",
|
|
56
|
+
"toolDiffRemoved": "red",
|
|
57
|
+
"toolDiffContext": "ink3",
|
|
58
|
+
"syntaxComment": "ink3",
|
|
59
|
+
"syntaxKeyword": "blue",
|
|
60
|
+
"syntaxFunction": "yellow",
|
|
61
|
+
"syntaxVariable": "ink",
|
|
62
|
+
"syntaxString": "green",
|
|
63
|
+
"syntaxNumber": "purple",
|
|
64
|
+
"syntaxType": "blue",
|
|
65
|
+
"syntaxOperator": "red",
|
|
66
|
+
"syntaxPunctuation": "ink2",
|
|
67
|
+
"thinkingOff": "ink3",
|
|
68
|
+
"thinkingMinimal": "ink2",
|
|
69
|
+
"thinkingLow": "blue",
|
|
70
|
+
"thinkingMedium": "green",
|
|
71
|
+
"thinkingHigh": "purple",
|
|
72
|
+
"thinkingXhigh": "red",
|
|
73
|
+
"bashMode": "yellow"
|
|
74
|
+
},
|
|
75
|
+
"export": {
|
|
76
|
+
"pageBg": "#272A27",
|
|
77
|
+
"cardBg": "#2E322E",
|
|
78
|
+
"infoBg": "yellowBg"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "light",
|
|
4
|
+
"vars": {
|
|
5
|
+
"bg": "#F5F1EA",
|
|
6
|
+
"edge": "#ECE7DC",
|
|
7
|
+
"ink": "#2A2D28",
|
|
8
|
+
"ink2": "#6B6B60",
|
|
9
|
+
"ink3": "#9A9A8E",
|
|
10
|
+
"red": "#A8734F",
|
|
11
|
+
"yellow": "#A88A50",
|
|
12
|
+
"green": "#6F8A68",
|
|
13
|
+
"blue": "#5F8880",
|
|
14
|
+
"purple": "#8A6E9C",
|
|
15
|
+
"selection": "#E9DDD1",
|
|
16
|
+
"redBg": "#EDE4DA",
|
|
17
|
+
"yellowBg": "#EDE7DB",
|
|
18
|
+
"greenBg": "#E8E7DD",
|
|
19
|
+
"blueBg": "#E6E6DF",
|
|
20
|
+
"purpleBg": "#EAE4E2"
|
|
21
|
+
},
|
|
22
|
+
"colors": {
|
|
23
|
+
"accent": "red",
|
|
24
|
+
"border": "ink3",
|
|
25
|
+
"borderAccent": "red",
|
|
26
|
+
"borderMuted": "ink3",
|
|
27
|
+
"success": "green",
|
|
28
|
+
"error": "red",
|
|
29
|
+
"warning": "yellow",
|
|
30
|
+
"muted": "ink2",
|
|
31
|
+
"dim": "ink3",
|
|
32
|
+
"text": "ink",
|
|
33
|
+
"thinkingText": "ink2",
|
|
34
|
+
"selectedBg": "selection",
|
|
35
|
+
"userMessageBg": "edge",
|
|
36
|
+
"userMessageText": "ink",
|
|
37
|
+
"customMessageBg": "purpleBg",
|
|
38
|
+
"customMessageText": "ink",
|
|
39
|
+
"customMessageLabel": "red",
|
|
40
|
+
"toolPendingBg": "blueBg",
|
|
41
|
+
"toolSuccessBg": "greenBg",
|
|
42
|
+
"toolErrorBg": "redBg",
|
|
43
|
+
"toolTitle": "red",
|
|
44
|
+
"toolOutput": "ink2",
|
|
45
|
+
"mdHeading": "yellow",
|
|
46
|
+
"mdLink": "blue",
|
|
47
|
+
"mdLinkUrl": "ink3",
|
|
48
|
+
"mdCode": "red",
|
|
49
|
+
"mdCodeBlock": "ink",
|
|
50
|
+
"mdCodeBlockBorder": "ink3",
|
|
51
|
+
"mdQuote": "ink2",
|
|
52
|
+
"mdQuoteBorder": "ink3",
|
|
53
|
+
"mdHr": "ink3",
|
|
54
|
+
"mdListBullet": "red",
|
|
55
|
+
"toolDiffAdded": "green",
|
|
56
|
+
"toolDiffRemoved": "red",
|
|
57
|
+
"toolDiffContext": "ink3",
|
|
58
|
+
"syntaxComment": "ink3",
|
|
59
|
+
"syntaxKeyword": "blue",
|
|
60
|
+
"syntaxFunction": "yellow",
|
|
61
|
+
"syntaxVariable": "ink",
|
|
62
|
+
"syntaxString": "green",
|
|
63
|
+
"syntaxNumber": "purple",
|
|
64
|
+
"syntaxType": "blue",
|
|
65
|
+
"syntaxOperator": "red",
|
|
66
|
+
"syntaxPunctuation": "ink2",
|
|
67
|
+
"thinkingOff": "ink3",
|
|
68
|
+
"thinkingMinimal": "ink2",
|
|
69
|
+
"thinkingLow": "blue",
|
|
70
|
+
"thinkingMedium": "green",
|
|
71
|
+
"thinkingHigh": "purple",
|
|
72
|
+
"thinkingXhigh": "red",
|
|
73
|
+
"bashMode": "yellow"
|
|
74
|
+
},
|
|
75
|
+
"export": {
|
|
76
|
+
"pageBg": "#F5F1EA",
|
|
77
|
+
"cardBg": "#FFFFFF",
|
|
78
|
+
"infoBg": "yellowBg"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
|
|
3
|
+
"name": "paper",
|
|
4
|
+
"vars": {
|
|
5
|
+
"bg": "#EFE7D4",
|
|
6
|
+
"edge": "#E5DBC2",
|
|
7
|
+
"ink": "#1D1916",
|
|
8
|
+
"ink2": "#5B524A",
|
|
9
|
+
"ink3": "#8C8175",
|
|
10
|
+
"red": "#8C2A1F",
|
|
11
|
+
"yellow": "#8A6A1F",
|
|
12
|
+
"green": "#3F5C45",
|
|
13
|
+
"blue": "#2F5A78",
|
|
14
|
+
"purple": "#6E4A78",
|
|
15
|
+
"selection": "#DDC5B3",
|
|
16
|
+
"redBg": "#E5D4C2",
|
|
17
|
+
"yellowBg": "#E3D8BE",
|
|
18
|
+
"greenBg": "#DAD6C3",
|
|
19
|
+
"blueBg": "#DCD9CB",
|
|
20
|
+
"purpleBg": "#E2D7CB"
|
|
21
|
+
},
|
|
22
|
+
"colors": {
|
|
23
|
+
"accent": "red",
|
|
24
|
+
"border": "ink3",
|
|
25
|
+
"borderAccent": "red",
|
|
26
|
+
"borderMuted": "ink3",
|
|
27
|
+
"success": "green",
|
|
28
|
+
"error": "red",
|
|
29
|
+
"warning": "yellow",
|
|
30
|
+
"muted": "ink2",
|
|
31
|
+
"dim": "ink3",
|
|
32
|
+
"text": "ink",
|
|
33
|
+
"thinkingText": "ink2",
|
|
34
|
+
"selectedBg": "selection",
|
|
35
|
+
"userMessageBg": "edge",
|
|
36
|
+
"userMessageText": "ink",
|
|
37
|
+
"customMessageBg": "purpleBg",
|
|
38
|
+
"customMessageText": "ink",
|
|
39
|
+
"customMessageLabel": "red",
|
|
40
|
+
"toolPendingBg": "blueBg",
|
|
41
|
+
"toolSuccessBg": "greenBg",
|
|
42
|
+
"toolErrorBg": "redBg",
|
|
43
|
+
"toolTitle": "red",
|
|
44
|
+
"toolOutput": "ink2",
|
|
45
|
+
"mdHeading": "yellow",
|
|
46
|
+
"mdLink": "blue",
|
|
47
|
+
"mdLinkUrl": "ink3",
|
|
48
|
+
"mdCode": "red",
|
|
49
|
+
"mdCodeBlock": "ink",
|
|
50
|
+
"mdCodeBlockBorder": "ink3",
|
|
51
|
+
"mdQuote": "ink2",
|
|
52
|
+
"mdQuoteBorder": "ink3",
|
|
53
|
+
"mdHr": "ink3",
|
|
54
|
+
"mdListBullet": "red",
|
|
55
|
+
"toolDiffAdded": "green",
|
|
56
|
+
"toolDiffRemoved": "red",
|
|
57
|
+
"toolDiffContext": "ink3",
|
|
58
|
+
"syntaxComment": "ink3",
|
|
59
|
+
"syntaxKeyword": "blue",
|
|
60
|
+
"syntaxFunction": "yellow",
|
|
61
|
+
"syntaxVariable": "ink",
|
|
62
|
+
"syntaxString": "green",
|
|
63
|
+
"syntaxNumber": "purple",
|
|
64
|
+
"syntaxType": "blue",
|
|
65
|
+
"syntaxOperator": "red",
|
|
66
|
+
"syntaxPunctuation": "ink2",
|
|
67
|
+
"thinkingOff": "ink3",
|
|
68
|
+
"thinkingMinimal": "ink2",
|
|
69
|
+
"thinkingLow": "blue",
|
|
70
|
+
"thinkingMedium": "green",
|
|
71
|
+
"thinkingHigh": "purple",
|
|
72
|
+
"thinkingXhigh": "red",
|
|
73
|
+
"bashMode": "yellow"
|
|
74
|
+
},
|
|
75
|
+
"export": {
|
|
76
|
+
"pageBg": "#EFE7D4",
|
|
77
|
+
"cardBg": "#F6F0E2",
|
|
78
|
+
"infoBg": "yellowBg"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Plan mode extension
|
|
2
|
+
|
|
3
|
+
Packaged extension in `extensions/plan-mode/`.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
- `/plan` - enter plan mode. The UI offers to spawn `plan-agent` immediately.
|
|
8
|
+
- `/plan <request>` - enter plan mode and spawn `plan-agent` for the request.
|
|
9
|
+
- `/plan spawn <request>` - same as above.
|
|
10
|
+
- `/plan status` - show whether plan mode is active.
|
|
11
|
+
- `/plan off` - leave plan mode, first showing the latest generated plan when available, then restoring previous active tools and opening the todo sidebar for the latest `.plan/*.jsonl` todo file.
|
|
12
|
+
- `/todo` - toggle the right-side todo timeline sidebar.
|
|
13
|
+
- `/todo show` - open the latest `.plan/*.jsonl` todo sidebar.
|
|
14
|
+
- `/todo off` - close the todo sidebar.
|
|
15
|
+
- `/todo status` - show the active/latest todo file.
|
|
16
|
+
- `/todo <goal>` - ask the main agent to decompose the goal into `.plan/todo.jsonl`, open the sidebar, and execute while updating todo statuses.
|
|
17
|
+
- `Ctrl+Shift+T` - toggle the todo sidebar.
|
|
18
|
+
|
|
19
|
+
## Tool
|
|
20
|
+
|
|
21
|
+
In plan mode the main agent can use `plan_agent`.
|
|
22
|
+
|
|
23
|
+
`plan_agent` spawns a separate pi process using the bundled agent at `agents/plan-agent.md` and the sandbox extension at `sandbox.ts`.
|
|
24
|
+
|
|
25
|
+
The child agent can:
|
|
26
|
+
|
|
27
|
+
- read/search/list only inside the current repo;
|
|
28
|
+
- use read-only bash commands only;
|
|
29
|
+
- use `plan_web_search` for external research;
|
|
30
|
+
- write/edit under `.plan/` only, including the markdown plan and `.plan/todo.jsonl`;
|
|
31
|
+
- delete under `.plan/` only through `plan_delete`.
|
|
32
|
+
|
|
33
|
+
Plans are written to `.plan/<timestamp>-<slug>.md` unless an output path under `.plan/` is provided.
|
|
34
|
+
|
|
35
|
+
Each `plan-agent` run must also rewrite `.plan/todo.jsonl` with one JSON object per implementation todo derived from the plan's numbered steps. The todo lines use `type: "plan_todo"`, `schemaVersion: 1`, `planPath`, `step`, `title`, `description`, `status: "pending"`, `priority`, `dependencies`, `validation`, and `createdAt` fields.
|
|
36
|
+
|
|
37
|
+
## Plan review and exit handoff
|
|
38
|
+
|
|
39
|
+
After a successful `plan-agent` run, the parent `plan-mode` extension displays the markdown plan content before asking whether to exit plan mode. The review choices are:
|
|
40
|
+
|
|
41
|
+
- `plan没问题,允许退出plan mode,开始执行` — exit plan mode, open the todo sidebar, and send a kickoff message to execute the approved plan while updating `.plan/todo.jsonl` statuses.
|
|
42
|
+
- `允许退出plan mode,先搁置` — exit plan mode and open the todo sidebar without starting execution.
|
|
43
|
+
- `不允许退出,需要修改:{修改意见}` — stay in plan mode, collect modification feedback, and ask the main agent to rerun `plan_agent` with the same output path.
|
|
44
|
+
|
|
45
|
+
When plan mode really exits with an approved/shelved plan, future LLM context is pruned to a hidden handoff containing only the user's original planning prompt, the plan path/content, the todo path, and newer messages. The old planning conversation and `plan_agent` tool history remain in the session file but are not sent as active LLM context.
|
|
46
|
+
|
|
47
|
+
## Todo sidebar
|
|
48
|
+
|
|
49
|
+
The todo sidebar reuses the right-side overlay slot used by `/filetree`; opening todo closes/switches away from an active file tree. It renders a V3-style timeline, sizes itself from the current todo content, and watches `.plan/todo.jsonl` (or the latest todo-like `.jsonl` under `.plan/`) for changes.
|
|
50
|
+
|
|
51
|
+
During `/todo <goal>`, the agent is instructed to update todo statuses as it works:
|
|
52
|
+
|
|
53
|
+
- `pending` - queued work
|
|
54
|
+
- `in_progress` - current work
|
|
55
|
+
- `done` - completed work
|
|
56
|
+
- `blocked` - cannot proceed; explain the blocker in `description`
|
|
57
|
+
|
|
58
|
+
`skipped`/`cancelled` are also treated as terminal states by the sidebar.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-agent
|
|
3
|
+
description: Researches the current repo and writes implementation plans plus plan todos under .plan/ only
|
|
4
|
+
tools: read, grep, find, ls, bash, write, edit, plan_web_search, plan_delete
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are `plan-agent`, a planning-only specialist.
|
|
8
|
+
|
|
9
|
+
Your job is to research the user's request, write a concrete markdown plan in `.plan/`, and write matching implementation todos to `.plan/todo.jsonl`. Do not implement the plan.
|
|
10
|
+
|
|
11
|
+
The parent `plan-mode` extension owns the exit/review flow. After you finish successfully, the parent will display the plan to the user, ask whether to execute, shelve, or revise it, and prune future LLM context to the original prompt plus plan only if the user approves exiting plan mode.
|
|
12
|
+
|
|
13
|
+
## Permissions and boundaries
|
|
14
|
+
|
|
15
|
+
- You may read/search/list only inside the current repository.
|
|
16
|
+
- You may create/edit/delete only inside `.plan/`.
|
|
17
|
+
- Do not modify source files, config files, tests, lockfiles, git state, or anything outside `.plan/`.
|
|
18
|
+
- Use `write` and `edit` only for `.plan/...` paths.
|
|
19
|
+
- Use `plan_delete` only for `.plan/...` paths if you need to remove an obsolete plan file.
|
|
20
|
+
- Use `bash` only for read-only inspection commands. If a useful command could write outside `.plan/`, skip it and note the limitation.
|
|
21
|
+
- Use `plan_web_search` for external documentation, APIs, libraries, framework behavior, known issues, or error messages when relevant.
|
|
22
|
+
- Every planning run must produce both required outputs: the requested markdown plan path and `.plan/todo.jsonl`.
|
|
23
|
+
|
|
24
|
+
The sandbox extension enforces these permissions. If a tool call is blocked, adapt rather than trying to bypass it.
|
|
25
|
+
|
|
26
|
+
## Required inputs to consider
|
|
27
|
+
|
|
28
|
+
Base the plan on all of the following:
|
|
29
|
+
|
|
30
|
+
1. The user's prompt.
|
|
31
|
+
2. The parent session's system prompt/context included in the task.
|
|
32
|
+
3. Repository guidance files, especially `AGENTS.md`, `agent.md`, `Agent.md`, `CLAUDE.md`, and related instructions if present.
|
|
33
|
+
4. Code searching and code reading in the current repository.
|
|
34
|
+
5. Web search when external behavior or documentation matters.
|
|
35
|
+
6. Code checks by inspection, and read-only commands where safe.
|
|
36
|
+
|
|
37
|
+
## Workflow
|
|
38
|
+
|
|
39
|
+
1. Read the task carefully, including the required output path.
|
|
40
|
+
2. Locate repo instructions and relevant code with `find`, `grep`, `ls`, and `read`.
|
|
41
|
+
3. Follow imports/callers enough to make the plan actionable.
|
|
42
|
+
4. Use `plan_web_search` if the plan depends on external APIs, package behavior, framework docs, or current best practices.
|
|
43
|
+
5. Identify risks, unknowns, validation steps, and the implementation todo breakdown.
|
|
44
|
+
6. Write the final plan to the exact `.plan/...` path requested by the task.
|
|
45
|
+
7. Derive todos from the final plan's `## Plan` steps and write `.plan/todo.jsonl`.
|
|
46
|
+
8. Return a concise summary with the plan path and todo path.
|
|
47
|
+
|
|
48
|
+
## Plan file format
|
|
49
|
+
|
|
50
|
+
Write markdown with this structure:
|
|
51
|
+
|
|
52
|
+
```markdown
|
|
53
|
+
# Plan: <short title>
|
|
54
|
+
|
|
55
|
+
## Request
|
|
56
|
+
<user request in your own words>
|
|
57
|
+
|
|
58
|
+
## Context Used
|
|
59
|
+
- Parent/system instructions considered: <brief summary>
|
|
60
|
+
- Repo instructions read: <files or "none found beyond loaded context">
|
|
61
|
+
- Code searched/read: <important files and why>
|
|
62
|
+
- Web research: <queries/results or "not needed">
|
|
63
|
+
|
|
64
|
+
## Findings
|
|
65
|
+
<relevant current behavior, architecture, constraints>
|
|
66
|
+
|
|
67
|
+
## Plan
|
|
68
|
+
1. <specific actionable step, including target file/function when known>
|
|
69
|
+
2. <specific actionable step>
|
|
70
|
+
3. ...
|
|
71
|
+
|
|
72
|
+
## Validation
|
|
73
|
+
- <checks/tests/review steps to run during implementation>
|
|
74
|
+
|
|
75
|
+
## Risks and Open Questions
|
|
76
|
+
- <risk/question, or "None identified">
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Todo JSONL format
|
|
80
|
+
|
|
81
|
+
Write `.plan/todo.jsonl` for the same plan before you finish. Treat it as the current plan's todo list: replace stale contents with todos for this run only unless the task explicitly says otherwise.
|
|
82
|
+
|
|
83
|
+
Rules:
|
|
84
|
+
|
|
85
|
+
- Derive todos directly from the markdown plan's `## Plan` numbered steps.
|
|
86
|
+
- Write one compact, valid JSON object per line; do not wrap the JSONL in markdown fences.
|
|
87
|
+
- Keep `step` values aligned with the markdown plan order and start at 1.
|
|
88
|
+
- Use `status: "pending"` for new todos.
|
|
89
|
+
- Include concrete validation guidance per todo when possible.
|
|
90
|
+
- If the task prompt gives an exact schema or timestamp, follow that exactly.
|
|
91
|
+
|
|
92
|
+
Required fields per line:
|
|
93
|
+
|
|
94
|
+
```jsonl
|
|
95
|
+
{"type":"plan_todo","schemaVersion":1,"planPath":".plan/example-plan.md","step":1,"title":"Short actionable title","description":"Concrete implementation task tied to the plan step","status":"pending","priority":"medium","dependencies":[],"validation":["Check or test for this step"],"createdAt":"<ISO timestamp from task>"}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Keep the plan concrete enough that an implementation agent can execute it without repeating all research. Prefer file paths, symbols, exact sequencing, and todo items over generic advice.
|