Releases: skillicinski/bo
Releases · skillicinski/bo
Release list
v0.0.9
Fixed
- The Google provider no longer rejects unknown model ids — any non-empty id is accepted (matching the custom provider), with the known-model table retained for context-window metadata and a 1M-token assumed window for unknown ids. Google retired the gemini-2.5 models on the Developer API with the hardcoded allowlist still pointing at them, leaving every google-provider configuration unusable. Known table now includes
gemini-3.5-flash,gemini-3.1-pro-preview, and the floatinggemini-flash-latest/gemini-pro-latestaliases.
v0.0.8
Added
- Local markdown ingestion:
bo collect ./note.mdcollects a local.mdfile as a note — frontmatter stripped (with a warning), title from a leading# H1when present, content-addressed source URL (bo://note/<hash>) so identical notes dedupe, no LLM summary call.
Changed
- breaking tree layout: leaves now live in
leaf/and branches inbranch/(was root-level.mdandbranches/). Every domain entity gets its own singular directory. No migration — pre-user break.
Fixed
- Leaf bodies no longer duplicate the title heading when the article's own H1 survives extraction (e.g. a page that leads with a byline before
# Title). bo's prepended heading is skipped when the body already opens with a matching H1. - Code blocks in collected articles are now preserved as fenced markdown instead of being flattened into single-line inline code spans. Multi-line
<pre>/<code>blocks keep their line breaks.
v0.0.7
Added
customprovider — point bo at any OpenAI-compatible endpoint viabo config --provider custom --base-url <url> --model <model>. Any non-empty model id is accepted. Auth viaCUSTOM_API_KEYenv var orcustom_api_keyin~/.bo/auth.json.
Changed
- Compile and collect diagnostics (title-collision warnings, branch-repair notices, pending-recovery notices, per-branch write progress) now print to stderr after the run completes instead of interleaved mid-run. Content and destination unchanged — only the timing shifts.
Fixed
- Tracing/diagnostic output now routes to stderr, keeping stdout clean for command output and
--jsonparsing.
Architecture (non-user-facing)
- The engine is now the public library surface — a vocabulary of capabilities named for what they do, never for the command that invokes them. Query's retrieval, NLP, relevance, context-assembly, and citation-validation layers moved from
clitoengine::retrievalwith a semanticRetrievalErrormapped at the CLI boundary. - Presentation purity across all workflows: nothing below a command's entry point touches stdout/stderr; workflows return typed results and the CLI renders them. A TUI/REPL/web front-end can now compose the same primitives.
- Compile pipeline stages completed: validation extracted into a dedicated I/O-free trust-boundary module owning
CompilePlan, andrepair_stale_branchesdecomposed into a classify → prune → repair → assemble pipeline.
v0.0.6
Added
zaiprovider — Z.ai (GLM) API support via the GLM Coding Plan endpoint (https://api.z.ai/api/coding/paas/v4). Includesglm-4.7(default),glm-4.5-air,glm-5.1,glm-5-turbo, andglm-5.2models. Auth viaZAI_API_KEYenv var orzai_api_keyin~/.bo/auth.json.
Changed
- Untitled leaves now report
title: nullinstead of an empty string in JSON output (bo show,bo status,bo query --json) and in the manifest. Existing manifests load unchanged.
Architecture (non-user-facing)
- Tree/branch/leaf metaphor committed to types —
Leaf/Branchdomain entities (wasLeafRecord/BranchRecord), validatedTitle/Urlnewtypes replace bareStringaliases. - Frontmatter serialization unified on typed structs (
LeafFrontmatter/BranchFrontmatter) with golden-tested byte-stable.mdfile output. - On-disk formats (
manifest.json,config.json,.mdfrontmatter) unchanged — this is an internal type-strengthening, not a format migration.
v0.0.5
Added
googleprovider — Gemini API support viabo config --provider google --model gemini-2.5-flash. Includesgemini-2.5-flash-lite,gemini-2.5-flash, andgemini-2.5-promodels with 1M token context windows. Auth viaGEMINI_API_KEYenv var orgoogle_api_keyin~/.bo/auth.json.bo querynow retrieves compiled branches in addition to raw leaves — the LLM sees synthesized concept pages alongside source documents and may cite either kind.- Compile degenerate-result warning: when a Full compile on a large corpus produces a suspiciously thin branch set, bo warns the user without blocking the output. Retry with
--allor switch models if the warning appears consistently. - Architecture documentation:
docs/architecture.md(design decisions) andsrc/AGENTS.md(code rules for contributors / coding agents). deepseek-v4-promodel entry (1M context, stronger than v4-flash).
Changed
- Fresh trees auto-run Full compile mode. Incremental mode now only activates when branches already exist, fixing a class of validation errors where the LLM was asked to update non-existent branches.
bo seedno longer silently defaults to gpt-4.1-mini when no model is given. The model field is required — either via the--modelflag or the interactive prompt.bo configwithout a model now fails with a clear error instead of silently falling back.- Compile validation hardened: ambiguous leaf title references (two leaves sharing a title) are now rejected rather than silently resolving to the wrong leaf. Leaf slugs are included in the full-compile prompt so models see the canonical identifier.
- Schema generation uses
schemars-derived inline schemas (no$ref/definitions/$schema`) — fixes a Google provider rejection and keeps schemas portable across all three providers. - Type-level schema enforcement: the
LlmProvidercontract now requires normalized schemas at compile time, not runtime. - Compile output (
--json) no longer reports a redundantcontext_modefield (it was always 1:1 withmode). - Three different LLM runtime patterns unified behind a shared
OnceLock-backed runtime. All CLI modules share one long-lived async executor rather than building fresh ones per call.
Fixed
- Branch
.mdfrontmatter now correctly drops deleted leaf filenames from theleaves:list when a leaf is removed. Previously the manifest was updated but the branch file on disk was stale. - Google provider compile returning HTTP 400 on schema fields injected by
schemars— fixed by inlining subschemas. - Duplicate-URL detection on single-URL
bo collect— a regression from an internal refactor that dropped the pre-fetch duplicate check. - Five distinct compile failure modes are now caught by the validation gate and refuse to write, rather than silently producing a corrupted or degraded tree.
Architecture (non-user-facing)
- Compile pipeline refactored: mode-delta logic split into focused functions, duplicated preflight collapsed,
CompileContextModeredundant type removed. God-function eliminated; pipeline reads as a traceable progression. - Retrieval scoring deduplicated: leaf and branch scoring share a single parameterized function.
- Atomic manifest-commit sequence extracted from duplicate collect/compile sites into a shared
engine::pendinghelper. pub(super)visibility discipline enforced throughout compile and query modules — no internal plumbing leaks across commands.
v0.0.4
Fixed
bo collect— LLM summary generation no longer falls back to the deterministic summary on OpenAI providers. The structured-output schema was being rejected by OpenAI's strict-mode validator becausesummarywas missing from the schema'srequiredlist. DeepSeek users were unaffected.
v0.0.3
Fixed
- npm install —
bono longer fails withuse strict: command not found/syntax error near unexpected token '('afternpm install -g @skillicinski/bo. The wrapper script was missing its#!/usr/bin/env nodeshebang, causing the OS to execute it as a shell script.
v0.0.2
Added
- npm distribution — install with
npm install -g @skillicinski/bo. No Rust toolchain needed. Pre-built binaries for macOS (Intel + Apple Silicon) and Linux x86_64. - DeepSeek provider support (
deepseek-v4-flash,deepseek-v4-pro). Select withbo config --provider deepseek. bo statuscommand — shows tree health and compile readiness.bo compile --allflag — recompile the full corpus and allow complete branch graph rewrite.bo collectaccepts multiple URLs in one invocation and.txtfiles containing one URL per line.compile_modelconfig key — pin a heavier model just forbo compile. Set withbo config --compile-model <id>.- Compile validation gate —
bo compilerejects responses that would result in no file changes and surfaces an actionable error. - Interactive confirmation gate on
bo raze— operators must typeyesto proceed. No--force/--yesoverride (by design, so agents cannot bypass it). manifest.jsonis now the canonical record of tree topology and metadata. Lives at{tree}/.bo/manifest.json. Written atomically (tmp + rename) on every mutation.
Changed
bo compileis incremental by default — only processes leaves collected since the last compile. Use--allfor full recompile.bo configis now flag-driven:bo config --provider <name> --model <id> --compile-model <id>. Replaces the previousbo config auth/bo config get/bo config setsubcommands.- Default model changed from
gpt-4otogpt-4.1-mini. bo shownow defaults to a frontmatter card view; use--fullfor the complete body.bo listreworked into a branch-centric tree view by default. New flags:--branch <name>,--recent,--limit <n>.- All read commands (
bo status,bo list,bo show,bo query, plusbo collectduplicate detection) consult the manifest. They no longer readindex.jsonl,state.json, or scan thebranches/directory for metadata. bo collectandbo compilewrite the manifest as the primary commit, then mirror toindex.jsonl/state.json/ branch frontmatter as a transient safety net (removed in v0.0.2 stage 3b).- Branch
.mdfrontmatter renamedcompiled_at→created_atfor clarity.updated_atunchanged. The manifest'sBranchRecordmirrors these names. bo razenow preserves stored provider credentials by default; use--include-authfor a full credential wipe.bo statusno longer counts leaves with unparseable frontmatter as "uncompiled". Such leaves were always also flagged asskippedby health output; the duplicate signal is gone, the explicitskippedsignal stays.- Compile context-overflow and validation errors now reference the new flag-based config (
bo config --compile-model <id>/bo config --model <id>).
Removed
bo searchcommand. Usebo list --terms <terms>for title/slug filtering.bo config authsubcommand. Save API keys via theOPENAI_API_KEY/DEEPSEEK_API_KEYenv vars or by hand-editing~/.bo/auth.jsonwith flat keys (openai_api_key,deepseek_api_key).bo config getandbo config setsubcommands. Replaced by the flag-drivenbo config.
Recovery
- If
manifest.jsonis missing on read, bo reconstructs it from the secondary store (index.jsonl+ branch frontmatter) on the fly, persists the result, and printsmanifest missing; reconstructed from secondary storeto stderr. This affordance is removed in v0.0.2 stage 3b along with the secondary store itself.
v0.0.1
First experimental release.
Added
bo seed,bo collect,bo compile,bo query,bo list,bo search,bo show,bo razebo config auth --provider openai— store API key locallybo config set model/bo config get model--jsonflag on all commands- YouTube transcript collection
- Zero-citation detection (refuses hallucinated answers)
- Install smoke test in CI
Notes
- OpenAI-compatible providers only
- Lexical retrieval (no embeddings)
- Requires Rust toolchain to install