Strategic development plan for batless — machine-readable code analysis for AI and automation
batless is the definitive AI-native code analysis tool. It produces structured, machine-readable output that AI assistants, CI/CD pipelines, and automation scripts can consume directly. Its unique value is not file viewing — AI assistants already have native read tools for that — but the outputs they cannot produce themselves: symbol indexes, token-estimated compressed context, semantic chunks, and content hashes.
Each release sharpens this focus: richer analysis data, broader language coverage, and a leaner binary. Interactive and cosmetic features are out of scope.
| Version | Released | Focus |
|---|---|---|
| v0.3.1 | Oct 2025 | UX & CI/CD — AI profiles, cat compatibility, performance suite |
| v0.4.0 | Dec 2025 | AST Summarization — tree-sitter for Rust/Python/JS/TS, SummaryItem with line numbers |
| v0.5.0 | Apr 2026 | AI Efficiency — NDJSON streaming, index mode, semantic chunking, comment stripping |
All items shipped and tagged.
- NDJSON streaming — removed
---separator; each chunk is compact JSON + newline --with-line-numbers— JSONlinesarray entries become{"n": N, "text": "..."}objects--mode=index— machine-readable symbol table:{kind, name, line_start, line_end, signature, visibility}--chunk-strategy=semantic— streaming extends chunks to tree-sitter top-level boundaries--strip-comments/--strip-blank-lines— language-aware content stripping;compression_ratioin JSON output--hash— SHA-256 file hash in JSON output for change detection--include-identifiers— renamed from--include-tokens(deprecated alias kept);tokensfield renamedidentifiersestimated_llm_tokens/token_modelin JSON when a profile or--ai-modelis active--profile=claude-max— new profile: 150K lines, JSON output, no summary- Claude profile raised to 20K lines (was 4K)
Target: Q3 2026
Focus: remove the fluff, fix architectural debt, and extend the AI-specific features. This release makes the strategic pivot concrete in code.
Syntax highlighting (--mode=highlight, syntect crate, --theme, ThemeManager) serves human terminal users — a use case where bat is the better tool. AI assistants don't benefit from ANSI color codes and have native read tools for plain file content.
- Deprecate
--mode=highlight(the default bare invocation) and--theme— emit a warning directing users tobatfor human viewing - Remove
src/highlighter.rs,ThemeManagerfromsrc/language.rs, syntect integration fromsrc/formatter.rs - Remove dependencies:
syntect,is-terminal,termcolor,strip-ansi-escapes - New default mode:
--mode=plain(no colors, no syntect dependency) - Binary size reduction: ~1.5MB off the ~2MB binary
src/wizard.rs (799 lines) is an interactive TUI config setup — the opposite of automation-first. Remove it; config is documented in the README.
- Delete
src/debt_prevention.rsandsrc/performance.rs(never called) - Delete unused traits
FileProcessing,EncodingDetection,ProcessorFactoryfromsrc/traits.rs - Consolidate formatter system: migrate
src/formatters/parallel dead copies into a single trait-based path insrc/formatter.rs
process_stdin is missing four features that process_file has:
- AST summarization (currently regex-only fallback)
--hashsupport (silently ignored on stdin)--strip-comments/--strip-blank-lines(silently ignored on stdin)- Language detection from
--languageflag (partially works)
Fix: extract a shared post_process(lines, language, config) pipeline that both paths call.
Expose the tree-sitter parse tree directly as JSON. Parsers are already in the dependency tree.
batless --mode=ast src/main.rs | jq '.tree.children[0]'Allow batless --mode=index src/ to process a directory and emit one JSON object per file (NDJSON), enabling a project-wide symbol table in one invocation.
batless --mode=index src/ | jq -s 'map(.symbols) | flatten | group_by(.kind)'Target: Q4 2026
Build on the tree-sitter foundation to expose richer per-symbol data.
- Signature extraction improvements — full parameter types and return types from AST nodes (not string stripping)
- Import/dependency listing —
--mode=importsemits a flat list of all imports/requires/use statements - Additional language coverage — Go, Ruby, C, C++ added to AST summarizer (tree-sitter grammars available)
--summary-level=comments— extract doc comments and attach to their symbol in index output
Target: H1 2027
The 1.0 milestone signals API and output schema stability. No major new features — focus on guarantees.
- Stable JSON schema — commit to backwards compatibility for all JSON output fields; add schema version field
- Shell completions — generated completions for bash, zsh, fish, PowerShell included in release artifacts
--validateflag — validate a file's JSON output against the published schema- GitHub Action —
batless-actionfor using batless in CI workflows without installing manually - Homebrew formula — automated tap update on release
- MSRV policy — explicit minimum supported Rust version with a documented update policy
- Syntax highlighting improvements —
batdoes this better; AI assistants don't need ANSI colors - Theme support — cosmetic; no AI value
- Interactive features of any kind — anti-automation by definition
- Plugin architecture — dynamic loading adds complexity (sandboxing, signing, registry) for unclear AI gain
- Language Server Protocol client — LSP is a separate tool category; batless is analysis output, not an IDE backend
- WASM / browser build — not a priority; nothing in the current user base requires it
- Enterprise features (SSO, SAML, audit logging) — out of scope for a CLI tool
Feature requests and design input welcome via GitHub Issues. For roadmap-level discussion, open a Discussion thread — changes to this document go through the same review process as code.