File size: 1,962 Bytes
587a933
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3
"""
Seed the board with KanBot's OWN remaining faces — it bootstraps itself.

Drops one planner card ("Build KanBot's remaining faces") that, once the
Conductor is running, the planner will decompose into executor subtasks. In
DRY-RUN those subtasks will propose tool calls and park for your approval — so
you literally watch the board plan its own construction, safely.

Run:  python cli/seed.py
"""
import asyncio
import json
import sys

sys.path.insert(0, ".")

from core.mcp_server import create_card  # noqa: E402


ROOT_SPEC = (
    "Build the three remaining faces of KanBot on top of the existing headless "
    "core (Conductor + MCP server + card schema + kb CLI, all working). "
    "Deliver: (1) a Next.js + Tailwind web view that subscribes to Postgres "
    "LISTEN/NOTIFY over a websocket and renders live drag-and-drop columns with "
    "streaming per-card agent threads; (2) a hardened MCP stdio+http CLI client "
    "so kb can talk to a remote conductor; (3) Telegram bot polish: inline "
    "approve/reject buttons on human-needed cards. Keep everything local-first "
    "and behind the same 9-tool MCP contract. Follow DevRev/Computer branding on "
    "the web view (black/white/yellow, Chip fonts, pill CTAs)."
)


async def main() -> None:
    res = json.loads(await create_card(
        title="Build KanBot's remaining faces",
        spec=ROOT_SPEC,
        role="planner",
        acceptance_criteria=[
            "web view renders live board from NOTIFY with drag-and-drop",
            "kb CLI works against a remote conductor over MCP",
            "telegram bot has inline approve/reject on human-needed cards",
        ],
    ))
    print(f"seeded planner card {res['id']} in backlog.")
    print("start the Conductor (`make conductor`) and watch it decompose itself.")
    print("in DRY-RUN, executor subtasks will park for `kb approve <id>`.")


if __name__ == "__main__":
    asyncio.run(main())