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())
|