#!/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 `.") if __name__ == "__main__": asyncio.run(main())