7.4 KiB
detz — C++23 port of tai.py — Plan (v1)
App name:
detz. Future: subcommand ofmolo(moloapp framework). Source of truth to port:../tai.py(~40k lines) + tests../test_tai.py,../tai_test.py. Original must remain untouched — no downgrades in functionality. Coding standard / reuse:moloapp(/home/retoor/projects/moloapp) — components, providers, clients (HTTP client w/ streaming), header-only style, per-part.mkfiles, root Makefile,build/outputs only.
1. Goals & non-goals
Goals:
- Full-featured structured C++23 port of tai.py as
detzbinary in this dir (taicpp/). - Max depth/layering in file structure; maximally object-oriented.
- argparse/CLI done well so it later plugs in as
molo detz ...subcommand. - Reuse moloapp: HTTP client (+SSE streaming), LLM provider types (
src/llm,src/clients), app errors/middleware patterns where applicable. - Docs: README.md, AGENTS.md, SPEC per module, workflow + versioning/tagging/git automation via AGENTS.md + Makefile targets.
Non-goals: modifying ../tai.py; rewriting moloapp itself (vendor/link only).
2. Source inventory (from ../tai.py)
~40k lines. Key classes/functions to port (grouped):
| Group | Symbols |
|---|---|
| Constants/config | Consts, Config, settings fns (validate_setting_scope, normalize_setting_value, parse_setting_env/stored, export_settings_to_env, boot_settings), dir_key, orientation_block, capability_block |
| Text/ANSI/utils | Ansi, paint, now_iso, short_error, truncate, capped_text, read_capped, chunk_lines, collapse_repeated_lines, split_leading_tags, expand_file_mentions, complete_files, known_model_ids, resolve_tag |
| Shell/sandbox | Sandbox, ShellSession, shell_target_paths, segment_targets, curl_hint, speak, Spinner, LiveStream, PtyProc, LaneBoard, Glow |
| Crypto/vault | SealError, Seal |
| Persistence | Store (sqlite+FTS5), spill_output, spilled_view, spill_or_truncate, DebugLog, ensure_column, fts_* |
| LLM backends | BackendError, Opencode, ModelHealth, ChatClient, providers (openai/anthropic/google/deepseek/xai/openrouter via moloapp), streaming SSE |
| Agents/tools | Tools, Agent, Approval, Denied, AgentsFull, GoalFailure, GoalVerdict, GoalVerifier, RetrievalEval, RagStats |
| Comms/ops | Telegram, Install, SysInfo, plexer (PlexerError, PlexerController, Native/TmuxPlexerController), TUI (TuiTheme/Watched/Style/Span/Event/Key/Click, see tui.md), MCP server (mcp.md, --serve-mcp), cap orchestrator (cap.md) |
| CLI | argparse tree (~--cap, --serve-mcp, --mcp-port, …) → port to structured CLI layer |
Full class list: extract with grep -n "^class " ../../tai.py during milestone M0 and pin counts in SPEC.
3. Target structure (deep, layered)
taicpp/
plan.md README.md AGENTS.md SPEC.md CHANGELOG.md VERSION
Makefile (includes src/*/[*.mk]) .clang-format
src/
cli/ arg parser tree, detz_main, future molo_subcommand.{h,cpp}
config/ consts, settings, env, boot
util/ ansi, text, time, truncate, files_mention, complete
shell/ sandbox, session, pty, spinner, livestream, lanaboard, glow
seal/ seal (vault crypto)
store/ sqlite store, fts, spill, debuglog, migrations
llm/ thin adapters over moloapp src/llm + src/clients (streaming); model_health, chat_client, backends
agent/ tools registry, approvals, agent loop, goal_verifier, retrieval_eval, rag
comms/ telegram, install, sysinfo, speak
plexer/ controller iface, native, tmux
tui/ theme/style/span/events/keys/render (per tui.md)
mcp/ serve-mcp http (per mcp.md), auth bearer
cap/ orchestrator (per cap.md)
tests/ README.md + per-module *_test.cpp mirroring ../test_tai.py + ../tai_test.py cases
docs/ specs per module (cli.md, store.md, llm.md, agent.md, tui.md, mcp.md, cap.md), workflow.md, versioning.md
tools/ version-bump.sh, tag.sh, changelog.sh
build/ (generated only)
Rules: headers .h + impl .cpp; one class per file pair where feasible; no outputs outside build/; -std=c++23 -Wall -Wextra, warning-free.
4. moloapp reuse map
- HTTP/SSE streaming:
moloapp/src/clients/*(client.h,sse.h, transports) — use directly, do not reimplement. - Provider/model types:
moloapp/src/llm/*,src/openai|anthropic|google|deepseek|xai|openrouter/*. - App patterns (errors, middleware, routing) for MCP HTTP serve:
moloapp/src/app/**/*. - CLI conventions:
moloappCLI part (tests/...cli,src/cli) +audit/MOLO-CLI-001. - Build pattern: per-part
*.mk+ root Makefile;example/example.mkas template.
5. CLI design (molo-ready)
detzbinary with same flags as tai.py argparse tree (parity table indocs/cli.md).- Implementation:
src/cli::{Parser, Command, DetzCli}returning aCommandvalue object;main.cpponly wires DI + dispatches. Futuremolo detz= registerDetzCommandas subcommand (adapter headermolo_subcommand.hstubbed in M1). - Golden test:
--helpoutput diff vspython ../tai.py --help.
6. Milestones & acceptance
- M0 scaffold: dirs, root Makefile +
src/*/[*.mk],main.cppprinting version,make,make testgreen, AGENTS.md workflow live. Accept: warning-free build, outputs only inbuild/. - M1 CLI parity: full argparse tree ported +
--helpgolden test + molo subcommand stub. Accept: flag-for-flag table complete. - M2 util+config: consts/settings/ansi/text/files. Accept: unit tests mirror python edge cases.
- M3 store: sqlite+FTS5, spill, debuglog, migrations. Accept: CRUD/FTS tests pass.
- M4 shell: sandbox/session/pty/speak. Accept: sandboxed exec tests.
- M5 llm: adapters over moloapp clients + streaming + health. Accept: mocked-transport chat/stream tests, no real network.
- M6 agent/tools: registry, approvals, loop, goal verifier, rag eval. Accept: ported
test_tai.pyscenarios (mocked backends). - M7 plexer/tui/comms: native+tmux controllers, TUI render, telegram/install/sysinfo. Accept: headless render + controller tests.
- M8 mcp+cap: serve-mcp (bearer), cap orchestrator. Accept: route-level tests through real stack.
- M9 docs/release automation: README, SPECs, CHANGELOG, version bump/tag targets. Accept:
make releasepath documented & dry-runnable.
Order per AGENTS.md workflow: spec delta → code → tests → changelog, per milestone.
7. Build/test/lint (mirrors moloapp AGENTS.md)
g++ --version # need C++23 (g++ ≥ 13, moloapp expects 15.2)
make # whole repo
make test
make lint # -Wall -Wextra clean; zero findings
make release PART=patch|minor|major MSG="..."
8. Versioning/tagging/git automation
VERSIONfile (0.1.0start, semver);src/cli/version.hppgenerated from it at build.- Targets:
make version-bump PART=x,make tag(annotateddetz-vX.Y.Z),make changelog(prepend CHANGELOG entry),make release PART=x MSG=...= bump+changelog+commit+tag. Never push unless asked. - First: write root
AGENTS.md(workflow above) before M1 code — per original request.
9. Risks
- tai.py size (~40k lines): mitigate by module-by-module parity tables + ported test counts per milestone.
- moloapp API drift: pin moloapp commit in SPEC; thin adapter layer in
src/llm/. - sqlite/FTS5 + pty in C++: reuse system sqlite3, forkpty; isolate in
store/+shell/.
10. Next action
Write AGENTS.md (workflow + commands), then M0 scaffold.