From 78a197d5c21ad7b76ad06909b97f60ab77b256b2 Mon Sep 17 00:00:00 2001 From: rajkumarsakthivel Date: Tue, 19 May 2026 10:43:03 +0100 Subject: [PATCH 1/6] feat: write output compression rules into instruction files for session-wide savings Output compression directives now go into CLAUDE.md, AGENTS.md, .cursorrules, and other instruction files during cce init. This makes them apply to the entire session, not just CCE tool responses. The level is read from cce.yaml (compression.output, default: standard). CLAUDE.md block version bumped to v4 so existing installs get upgraded. --- src/context_engine/cli.py | 38 +++++++------ .../compression/output_rules.py | 54 +++++++++++++++++++ src/context_engine/editors.py | 24 +++++++-- 3 files changed, 96 insertions(+), 20 deletions(-) diff --git a/src/context_engine/cli.py b/src/context_engine/cli.py index 26bfcca..12e33eb 100644 --- a/src/context_engine/cli.py +++ b/src/context_engine/cli.py @@ -182,12 +182,12 @@ def _configure_mcp(project_dir: Path) -> bool: # Version stamp embedded as an HTML comment so it doesn't render in the final # Markdown but lets `_ensure_claude_md` detect when the installed block is # stale and needs replacing. Bump whenever _CCE_CLAUDE_MD_BLOCK changes. -_CCE_CLAUDE_MD_VERSION = "3" +_CCE_CLAUDE_MD_VERSION = "4" _CCE_CLAUDE_MD_VERSION_TAG = f"" _CCE_CLAUDE_MD_VERSION_PREFIX = "" -_CCE_CLAUDE_MD_BLOCK = f"""\ +_CCE_CLAUDE_MD_BLOCK_TEMPLATE = f"""\ {_CCE_CLAUDE_MD_VERSION_TAG} ## Context Engine (CCE) @@ -268,18 +268,22 @@ def _configure_mcp(project_dir: Path) -> bool: Both are read-only and cheap. Prefer them over re-running tool calls or asking the user to re-paste context. -## Output Style - -Be concise. Lead with the answer or action, not reasoning. Skip filler words, -preamble, and phrases like "I'll help you with that" or "Certainly!". Prefer -fragments over full sentences in explanations. No trailing summaries of what -you just did. One sentence if it fits. - -Code blocks, file paths, commands, and error messages are always written in full. +{{output_style}} {_CCE_CLAUDE_MD_END_MARKER} """ +def _build_claude_md_block(output_level: str = "standard") -> str: + """Generate the CLAUDE.md CCE block with the configured output style.""" + from context_engine.compression.output_rules import get_instruction_output_block + block = get_instruction_output_block(output_level) + return _CCE_CLAUDE_MD_BLOCK_TEMPLATE.replace("{output_style}", block) + + +# Default block for backward compat +_CCE_CLAUDE_MD_BLOCK = _build_claude_md_block("standard") + + def _resolve_cce_cmd() -> str: """Find the globally installed cce binary path.""" from context_engine.utils import resolve_cce_binary @@ -694,7 +698,7 @@ def _preflight_check(config) -> None: click.echo(_dim(" Tip: ollama pull phi3:mini for LLM summarization")) -def _ensure_claude_md(project_dir: Path) -> None: +def _ensure_claude_md(project_dir: Path, output_level: str = "standard") -> None: """Add or upgrade the CCE instructions block in CLAUDE.md. Three states the file can be in: @@ -709,9 +713,10 @@ def _ensure_claude_md(project_dir: Path) -> None: """ from context_engine.utils import atomic_write_text + block = _build_claude_md_block(output_level) claude_md = project_dir / "CLAUDE.md" if not claude_md.exists(): - atomic_write_text(claude_md, _CCE_CLAUDE_MD_BLOCK) + atomic_write_text(claude_md, block) _ok("CLAUDE.md created with CCE instructions") return @@ -726,13 +731,13 @@ def _ensure_claude_md(project_dir: Path) -> None: # survives the upgrade. old_block = _extract_existing_cce_block(existing) if old_block is not None: - new_content = existing.replace(old_block, _CCE_CLAUDE_MD_BLOCK.rstrip(), 1) + new_content = existing.replace(old_block, block.rstrip(), 1) atomic_write_text(claude_md, new_content) _ok("CLAUDE.md upgraded to current CCE instructions") return # No CCE block detected — append. - new_content = existing.rstrip() + "\n\n" + _CCE_CLAUDE_MD_BLOCK + new_content = existing.rstrip() + "\n\n" + block atomic_write_text(claude_md, new_content) _ok("CLAUDE.md updated with CCE instructions") @@ -921,14 +926,15 @@ def init(ctx: click.Context, agent: str) -> None: for file_key, info in INSTRUCTION_FILES.items(): if any((project_dir / marker).exists() for marker in info["detect"]): instruction_targets.add(file_key) + output_level = getattr(config, "output_compression", "standard") for file_key in sorted(instruction_targets): info = INSTRUCTION_FILES[file_key] - if write_instruction_file(project_dir, file_key): + if write_instruction_file(project_dir, file_key, output_level=output_level): _ok(f"CCE instructions added to {info['name']}") # 5. CLAUDE.md + session hook + memory lifecycle hooks if "claude" in editor_targets: - _ensure_claude_md(project_dir) + _ensure_claude_md(project_dir, output_level=output_level) _ensure_session_hook(project_dir) _install_memory_hooks(project_dir) _check_memory_capture_reachable(config, project_dir) diff --git a/src/context_engine/compression/output_rules.py b/src/context_engine/compression/output_rules.py index 6127ae8..347d238 100644 --- a/src/context_engine/compression/output_rules.py +++ b/src/context_engine/compression/output_rules.py @@ -90,3 +90,57 @@ def get_level_description(level: str) -> str: "max": "Telegraphic style with abbreviations and symbols. Diff-only for code. ~80% savings.", } return descriptions.get(level, "Unknown level") + + +# ── Instruction-file blocks ────────────────────────────────────────── +# These go into CLAUDE.md, AGENTS.md, .cursorrules, etc. so they apply +# to the entire session, not just CCE tool responses. + +_INSTRUCTION_OUTPUT_STYLES = { + "lite": """\ +### Output style + +Respond concisely. Remove filler words (just, really, basically, actually, +simply), hedging (I think, it seems, perhaps), and pleasantries (Sure!, +Happy to help, Great question). No trailing summaries. Keep full grammar. + +When suggesting code changes, show only the changed lines with 3 lines of +context. Never rewrite entire files. For new files, show the full file. +For edits, show only what changes.""", + + "standard": """\ +### Output style + +Respond in compressed style. Drop articles (a, an, the) in prose. Use +sentence fragments over full sentences. Use short synonyms (fix not resolve, +check not investigate). Pattern: [thing] [action] [reason]. [next step]. +No filler, hedging, pleasantries, trailing summaries, or restating what +the user said. One sentence if one sentence is enough. + +When suggesting code changes, show only the changed lines with 3 lines of +context. Never rewrite entire files. Multiple changes in one file: show each +change separately. Never echo back unchanged code the user already has. + +Code blocks, file paths, commands, error messages: always written in full. +Security warnings and destructive action confirmations: use full clarity.""", + + "max": """\ +### Output style + +Respond in telegraphic style. Drop articles, pronouns, conjunctions where +meaning survives. Abbreviate common terms: DB, auth, config, fn, dep, impl, +req, resp, init. Use arrows for causality: X → Y. Use symbols: + (add), +- (remove), ~ (change), ! (warning). Max 1-2 sentences per explanation. +Pattern: [thing] → [action]. [reason]. + +When suggesting code changes, show only changed lines. Never rewrite files. +Never echo back unchanged code. + +Code blocks, paths, commands, errors: always full. +Security warnings and destructive actions: full clarity, drop compression.""", +} + + +def get_instruction_output_block(level: str) -> str: + """Return the output style block for instruction files, or empty if off.""" + return _INSTRUCTION_OUTPUT_STYLES.get(level, "") diff --git a/src/context_engine/editors.py b/src/context_engine/editors.py index 1daa723..4811688 100644 --- a/src/context_engine/editors.py +++ b/src/context_engine/editors.py @@ -92,7 +92,7 @@ # ── Instruction file definitions ────────────────────────────────────── # Editor-agnostic CCE instructions (no "Claude Code" references) -_CCE_INSTRUCTIONS = """\ +_CCE_INSTRUCTIONS_BASE = """\ ## Context Engine (CCE) This project uses Code Context Engine for intelligent code retrieval and @@ -122,6 +122,19 @@ Call `record_code_area(file_path="...", description="...")` after meaningful work. """ + +def _build_instructions(output_level: str = "standard") -> str: + """Build CCE instructions with the configured output style.""" + from context_engine.compression.output_rules import get_instruction_output_block + block = get_instruction_output_block(output_level) + if block: + return _CCE_INSTRUCTIONS_BASE + "\n" + block + "\n" + return _CCE_INSTRUCTIONS_BASE + + +# Default instructions (standard output compression) +_CCE_INSTRUCTIONS = _build_instructions("standard") + INSTRUCTION_FILES: dict[str, dict] = { "agents": { "name": "AGENTS.md", @@ -568,21 +581,24 @@ def _remove_toml(config_path: Path, display_path: str, *, section: str) -> str | return None -def write_instruction_file(project_dir: Path, file_key: str) -> bool: +def write_instruction_file( + project_dir: Path, file_key: str, output_level: str = "standard", +) -> bool: """Write CCE instructions to an editor's instruction file. Returns True if written.""" info = INSTRUCTION_FILES[file_key] path = project_dir / info["path"] marker = "## Context Engine (CCE)" path.parent.mkdir(parents=True, exist_ok=True) + instructions = _build_instructions(output_level) if path.exists(): content = path.read_text() if marker in content: return False # already has CCE block # Append - path.write_text(content.rstrip() + "\n\n" + _CCE_INSTRUCTIONS) + path.write_text(content.rstrip() + "\n\n" + instructions) else: - path.write_text(_CCE_INSTRUCTIONS) + path.write_text(instructions) return True From 47475c718faac850ee5145d426525bc662907891 Mon Sep 17 00:00:00 2001 From: rajkumarsakthivel Date: Tue, 19 May 2026 10:52:53 +0100 Subject: [PATCH 2/6] docs: update README, FAQ, and Starlight docs for session-wide output compression --- README.md | 10 +- docs-src/src/content/docs/configuration.md | 15 +- docs-src/src/content/docs/faq.md | 35 +- docs-src/src/content/docs/introduction.md | 2 +- docs-src/src/content/docs/savings-tracking.md | 26 +- docs/guide/collections/docs.schema.json | 643 ++++++++++++++++++ docs/guide/configuration/index.html | 10 +- docs/guide/content-assets.mjs | 1 + docs/guide/content-modules.mjs | 4 + docs/guide/faq/index.html | 56 +- docs/guide/introduction/index.html | 2 +- .../pagefind/fragment/en_27bbe91.pf_fragment | Bin 1288 -> 0 bytes .../pagefind/fragment/en_280a4ac.pf_fragment | Bin 1631 -> 0 bytes .../pagefind/fragment/en_29c695e.pf_fragment | Bin 0 -> 1318 bytes .../pagefind/fragment/en_456eeb3.pf_fragment | Bin 2364 -> 0 bytes .../pagefind/fragment/en_aa33da6.pf_fragment | Bin 0 -> 2503 bytes .../pagefind/fragment/en_aaf2477.pf_fragment | Bin 0 -> 2339 bytes .../pagefind/fragment/en_bfe740b.pf_fragment | Bin 1916 -> 0 bytes .../pagefind/fragment/en_f81f724.pf_fragment | Bin 0 -> 1924 bytes docs/guide/pagefind/index/en_a7d683e.pf_index | Bin 0 -> 19921 bytes docs/guide/pagefind/index/en_e4ae659.pf_index | Bin 19055 -> 0 bytes docs/guide/pagefind/pagefind-entry.json | 2 +- .../pagefind/pagefind.en_15adf94a87.pf_meta | Bin 217 -> 0 bytes .../pagefind/pagefind.en_739fafe83c.pf_meta | Bin 0 -> 220 bytes docs/guide/savings-tracking/index.html | 28 +- 25 files changed, 776 insertions(+), 58 deletions(-) create mode 100644 docs/guide/collections/docs.schema.json create mode 100644 docs/guide/content-assets.mjs create mode 100644 docs/guide/content-modules.mjs delete mode 100644 docs/guide/pagefind/fragment/en_27bbe91.pf_fragment delete mode 100644 docs/guide/pagefind/fragment/en_280a4ac.pf_fragment create mode 100644 docs/guide/pagefind/fragment/en_29c695e.pf_fragment delete mode 100644 docs/guide/pagefind/fragment/en_456eeb3.pf_fragment create mode 100644 docs/guide/pagefind/fragment/en_aa33da6.pf_fragment create mode 100644 docs/guide/pagefind/fragment/en_aaf2477.pf_fragment delete mode 100644 docs/guide/pagefind/fragment/en_bfe740b.pf_fragment create mode 100644 docs/guide/pagefind/fragment/en_f81f724.pf_fragment create mode 100644 docs/guide/pagefind/index/en_a7d683e.pf_index delete mode 100644 docs/guide/pagefind/index/en_e4ae659.pf_index delete mode 100644 docs/guide/pagefind/pagefind.en_15adf94a87.pf_meta create mode 100644 docs/guide/pagefind/pagefind.en_739fafe83c.pf_meta diff --git a/README.md b/README.md index c116b34..01fb563 100644 --- a/README.md +++ b/README.md @@ -449,16 +449,18 @@ No. Quality stays the same or slightly improves. CCE replaces "dump the entire file" with "search for the relevant function." The model still gets the code it needs (0.90 Recall@10 in benchmarks). Less irrelevant context means less noise competing for attention, which can improve the model's focus on your actual question. -### How do I increase output token savings? +### How does output token savings work? -Set the output compression level in your project config (`cce.yaml`): +CCE writes output compression rules directly into your agent's instruction files (`CLAUDE.md`, `AGENTS.md`, `.cursorrules`, etc.) during `cce init`. These rules apply to the **entire session**, not just CCE tool responses, so every reply from the agent follows them. + +Set the level in `cce.yaml`: ```yaml compression: output: max # off | lite | standard | max ``` -Or change it at runtime via the MCP tool: +Then re-run `cce init` to update instruction files. Or change at runtime: ``` set_output_level output_level=max @@ -471,7 +473,7 @@ set_output_level output_level=max | `standard` | ~70% | Drops articles, fragments, short synonyms + diff-only for code | | `max` | ~80% | Telegraphic style + diff-only for code | -Default is `standard`. All levels include **code output rules** that instruct the model to show only changed lines (not full file rewrites), which is where most output tokens go in coding sessions. The `max` level produces very terse prose (similar to "caveman mode"). Code blocks, paths, and commands are never compressed regardless of level. +Default is `standard`. All levels include **code output rules** that tell the model to show only changed lines (not full file rewrites), which is where most output tokens go in coding sessions. The `max` level produces very terse prose (similar to "caveman mode"). Code blocks, paths, and commands are never compressed regardless of level. ### Where do the savings come from? diff --git a/docs-src/src/content/docs/configuration.md b/docs-src/src/content/docs/configuration.md index 56e62cb..80b9978 100644 --- a/docs-src/src/content/docs/configuration.md +++ b/docs-src/src/content/docs/configuration.md @@ -57,22 +57,21 @@ Controls how much CCE compresses code chunks before including them in the agent' ### Output compression (`compression.output`) -Controls how verbose the agent's responses are. Set via the `set_output_compression` MCP tool or config. +Controls how verbose the agent's responses are. During `cce init`, the configured level is written into instruction files (`CLAUDE.md`, `AGENTS.md`, `.cursorrules`, etc.) so it applies to the **entire session**, not just CCE tool responses. | Level | Style | Typical savings | |-------|-------|----------------| | `off` | Full output | 0% | -| `lite` | Removes filler and hedging | ~30% | -| `standard` | Shorter phrasing, fragments where possible | ~65% | -| `max` | Telegraphic, minimal prose | ~75% | +| `lite` | No filler/hedging, diff-only code | ~25% | +| `standard` | Fragments, short synonyms, diff-only code | ~70% | +| `max` | Telegraphic, abbreviations, diff-only code | ~80% | -Code blocks, file paths, commands, and error messages are never compressed regardless of level. +All levels include code output rules: show only changed lines, never rewrite entire files, never echo back unchanged code. Code blocks, paths, commands, and error messages are never compressed. Security warnings use full clarity. -Change at runtime by telling your agent: +Change the level and re-run `cce init` to update instruction files, or change at runtime: ``` -Switch to max output compression -Turn off output compression +set_output_level output_level=max ``` ## Embedding model diff --git a/docs-src/src/content/docs/faq.md b/docs-src/src/content/docs/faq.md index 66a1893..f0afa7b 100644 --- a/docs-src/src/content/docs/faq.md +++ b/docs-src/src/content/docs/faq.md @@ -7,24 +7,45 @@ description: Frequently asked questions about Code Context Engine. No. CCE returns the same code your agent would find by reading files, just compressed and targeted. In practice, answers are often better because the agent receives focused, relevant context instead of entire files full of unrelated code. -## How can I increase output savings? +## How does output token savings work? -Set output compression to a higher level: +CCE writes output compression rules directly into your agent's instruction files (`CLAUDE.md`, `AGENTS.md`, `.cursorrules`, etc.) during `cce init`. These apply to the **entire session**, so every response follows them. + +Set the level in `cce.yaml`, then re-run `cce init`: ```yaml compression: - output: max + output: max # off | lite | standard | max +``` + +Or change at runtime via the MCP tool: + ``` +set_output_level output_level=max +``` + +| Level | Savings | Style | +|-------|---------|-------| +| `off` | 0% | Normal verbosity | +| `lite` | ~25% | No filler/hedging, diff-only code | +| `standard` | ~70% | Fragments, short synonyms, diff-only code | +| `max` | ~80% | Telegraphic, abbreviations, diff-only code | -Or tell your agent at runtime: "Switch to max output compression." The `max` level uses telegraphic phrasing and typically saves ~75% on response tokens. Code blocks and file paths are never affected. +Default is `standard`. All levels include code output rules that tell the model to show only changed lines instead of full file rewrites. Code blocks, paths, and commands are never compressed. Security warnings use full clarity. ## Where do the savings come from? -Three main sources: +**Input tokens** (what goes into the model): -1. **Retrieval.** Only relevant chunks are returned instead of the full codebase. This is the largest contributor (often 80%+ reduction). +1. **Retrieval.** Only relevant chunks are returned instead of the full codebase. This is the largest contributor (often 94% reduction). 2. **Chunk compression.** Retrieved chunks are truncated to signatures and docstrings, or summarized via Ollama if available. -3. **Output compression.** Agent responses are shortened by removing filler, hedging, and verbose phrasing. +3. **Grammar compression.** Articles and filler removed from context. +4. **Turn summarization.** Session history compressed. +5. **Progressive disclosure.** Tool payloads filtered. + +**Output tokens** (what comes back from the model): + +6. **Output compression.** Session-wide style directives in instruction files reduce prose verbosity and enforce diff-only code changes. Output tokens cost 5x more than input (e.g. Opus: $75/1M vs $15/1M), so even moderate output savings have outsized cost impact. ## Is my code sent anywhere? diff --git a/docs-src/src/content/docs/introduction.md b/docs-src/src/content/docs/introduction.md index c79b69b..7f8d168 100644 --- a/docs-src/src/content/docs/introduction.md +++ b/docs-src/src/content/docs/introduction.md @@ -45,5 +45,5 @@ CCE parses your code into semantic chunks (functions, classes, modules) using Tr 1. **Index** — Tree-sitter parses code into semantic chunks. Stored locally with vector embeddings. 2. **Search** — Agent calls `context_search` via MCP. Hybrid vector + BM25 merged with Reciprocal Rank Fusion. Graph expansion adds related imports. -3. **Compress** — Chunks are compressed (truncation or LLM summary with Ollama). Output compression reduces reply tokens. +3. **Compress** — Chunks are compressed (truncation or LLM summary with Ollama). Session-wide output compression rules in instruction files reduce reply tokens (diff-only code, no filler). 4. **Track** — Every query recorded. `cce savings` shows tokens and dollars saved. diff --git a/docs-src/src/content/docs/savings-tracking.md b/docs-src/src/content/docs/savings-tracking.md index 98da24c..b42a310 100644 --- a/docs-src/src/content/docs/savings-tracking.md +++ b/docs-src/src/content/docs/savings-tracking.md @@ -30,28 +30,36 @@ Example output: ## Understanding the input/output split -Savings come from two independent stages: +The report separates input and output token savings because they have different pricing. Output tokens cost 5x more than input (e.g. Opus: $75/1M output vs $15/1M input). -- **Retrieval savings (input).** Instead of sending the entire codebase, CCE returns only the chunks relevant to the query. This is measured as: `1 - (served_tokens / full_codebase_tokens)`. +**Input savings** come from: -- **Compression savings (input).** The retrieved chunks are further compressed (truncation, summarization) before being sent to the agent. This is measured as: `1 - (compressed_tokens / raw_chunk_tokens)`. +- **Retrieval.** Only relevant chunks returned instead of full files (biggest contributor, often 94%). +- **Chunk compression.** Chunks truncated to signatures/docstrings or summarized via Ollama. +- **Grammar compression.** Articles and filler removed from context. +- **Turn summarization.** Session history compressed. +- **Progressive disclosure.** Tool payloads filtered. -The combined effect is multiplicative. If retrieval cuts 90% and compression cuts another 50%, the total savings are 95%. +**Output savings** come from: + +- **Output compression.** Session-wide style directives written into instruction files (`CLAUDE.md`, `AGENTS.md`, etc.) during `cce init`. These tell the agent to use compressed prose and diff-only code changes across the entire session. Configure the level in `cce.yaml` (`compression.output`: off/lite/standard/max). ## Per-bucket breakdown -The `How:` line in the output shows the contribution of each stage: +The breakdown shows each savings layer with its contribution: ``` -How: retrieval 93% + compression 90% + Breakdown: + retrieval 48% ▰▰▰▰▰▰▰▰▰▰ 6.0k $0.09 · 1 call + chunk compression 20% ▰▰▰▰▱▱▱▱▱▱ 2.6k $0.04 · 1 call + output compression* 2% ▰▱▱▱▱▱▱▱▱▱ 325 $0.02 · 1 call ``` -- **retrieval** represents the savings from selecting only relevant chunks. -- **compression** represents the savings from compressing those chunks. +Each row uses the correct pricing (input rate for input buckets, output rate for the output compression bucket). Buckets marked with `*` use estimated values. ## Configuring the pricing model -Cost estimates use model-specific input pricing. Configure which model to estimate for: +Cost estimates use model-specific pricing for both input and output tokens. Configure which model to estimate for: ```yaml # ~/.cce/config.yaml or .context-engine.yaml diff --git a/docs/guide/collections/docs.schema.json b/docs/guide/collections/docs.schema.json new file mode 100644 index 0000000..623835a --- /dev/null +++ b/docs/guide/collections/docs.schema.json @@ -0,0 +1,643 @@ +{ + "$ref": "#/definitions/docs", + "definitions": { + "docs": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "editUrl": { + "anyOf": [ + { + "type": "string", + "format": "uri" + }, + { + "type": "boolean" + } + ], + "default": true + }, + "head": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string", + "enum": [ + "title", + "base", + "link", + "style", + "meta", + "script", + "noscript", + "template" + ] + }, + "attrs": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "not": {} + } + ] + } + }, + "content": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + }, + "default": [] + }, + "tableOfContents": { + "anyOf": [ + { + "type": "object", + "properties": { + "minHeadingLevel": { + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 2 + }, + "maxHeadingLevel": { + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 3 + } + }, + "additionalProperties": false + }, + { + "type": "boolean" + } + ], + "default": { + "minHeadingLevel": 2, + "maxHeadingLevel": 3 + } + }, + "template": { + "type": "string", + "enum": [ + "doc", + "splash" + ], + "default": "doc" + }, + "hero": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "tagline": { + "type": "string" + }, + "image": { + "anyOf": [ + { + "type": "object", + "properties": { + "alt": { + "type": "string", + "default": "" + }, + "file": { + "type": "string" + } + }, + "required": [ + "file" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "alt": { + "type": "string", + "default": "" + }, + "dark": { + "type": "string" + }, + "light": { + "type": "string" + } + }, + "required": [ + "dark", + "light" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "html": { + "type": "string" + } + }, + "required": [ + "html" + ], + "additionalProperties": false + } + ] + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "link": { + "type": "string" + }, + "variant": { + "type": "string", + "enum": [ + "primary", + "secondary", + "minimal" + ], + "default": "primary" + }, + "icon": { + "anyOf": [ + { + "type": "string", + "enum": [ + "up-caret", + "down-caret", + "right-caret", + "left-caret", + "up-arrow", + "down-arrow", + "right-arrow", + "left-arrow", + "bars", + "translate", + "pencil", + "pen", + "document", + "add-document", + "setting", + "external", + "download", + "cloud-download", + "moon", + "sun", + "laptop", + "open-book", + "information", + "magnifier", + "forward-slash", + "close", + "error", + "warning", + "approve-check-circle", + "approve-check", + "rocket", + "star", + "puzzle", + "list-format", + "random", + "comment", + "comment-alt", + "heart", + "github", + "gitlab", + "bitbucket", + "codePen", + "farcaster", + "discord", + "gitter", + "twitter", + "x.com", + "mastodon", + "codeberg", + "youtube", + "threads", + "linkedin", + "twitch", + "azureDevOps", + "microsoftTeams", + "instagram", + "stackOverflow", + "telegram", + "rss", + "facebook", + "email", + "phone", + "reddit", + "patreon", + "signal", + "slack", + "matrix", + "hackerOne", + "openCollective", + "blueSky", + "discourse", + "zulip", + "pinterest", + "tiktok", + "astro", + "alpine", + "pnpm", + "biome", + "bun", + "mdx", + "apple", + "linux", + "homebrew", + "nix", + "starlight", + "pkl", + "node", + "cloudflare", + "vercel", + "netlify", + "deno", + "jsr", + "nostr", + "backstage", + "confluence", + "jira", + "storybook", + "vscode", + "jetbrains", + "zed", + "vim", + "figma", + "sketch", + "npm", + "sourcehut", + "substack", + "seti:folder", + "seti:bsl", + "seti:mdo", + "seti:salesforce", + "seti:asm", + "seti:bicep", + "seti:bazel", + "seti:c", + "seti:c-sharp", + "seti:html", + "seti:cpp", + "seti:clojure", + "seti:coldfusion", + "seti:config", + "seti:crystal", + "seti:crystal_embedded", + "seti:json", + "seti:css", + "seti:csv", + "seti:xls", + "seti:cu", + "seti:cake", + "seti:cake_php", + "seti:d", + "seti:word", + "seti:elixir", + "seti:elixir_script", + "seti:hex", + "seti:elm", + "seti:favicon", + "seti:f-sharp", + "seti:git", + "seti:go", + "seti:godot", + "seti:gradle", + "seti:grails", + "seti:graphql", + "seti:hacklang", + "seti:haml", + "seti:mustache", + "seti:haskell", + "seti:haxe", + "seti:jade", + "seti:java", + "seti:javascript", + "seti:jinja", + "seti:julia", + "seti:karma", + "seti:kotlin", + "seti:dart", + "seti:liquid", + "seti:livescript", + "seti:lua", + "seti:markdown", + "seti:argdown", + "seti:info", + "seti:clock", + "seti:maven", + "seti:nim", + "seti:github", + "seti:notebook", + "seti:nunjucks", + "seti:npm", + "seti:ocaml", + "seti:odata", + "seti:perl", + "seti:php", + "seti:pipeline", + "seti:pddl", + "seti:plan", + "seti:happenings", + "seti:powershell", + "seti:prisma", + "seti:pug", + "seti:puppet", + "seti:purescript", + "seti:python", + "seti:react", + "seti:rescript", + "seti:R", + "seti:ruby", + "seti:rust", + "seti:sass", + "seti:spring", + "seti:slim", + "seti:smarty", + "seti:sbt", + "seti:scala", + "seti:ethereum", + "seti:stylus", + "seti:svelte", + "seti:swift", + "seti:db", + "seti:terraform", + "seti:tex", + "seti:default", + "seti:twig", + "seti:typescript", + "seti:tsconfig", + "seti:vala", + "seti:vite", + "seti:vue", + "seti:wasm", + "seti:wat", + "seti:xml", + "seti:yml", + "seti:prolog", + "seti:zig", + "seti:zip", + "seti:wgt", + "seti:illustrator", + "seti:photoshop", + "seti:pdf", + "seti:font", + "seti:image", + "seti:svg", + "seti:sublime", + "seti:code-search", + "seti:shell", + "seti:video", + "seti:audio", + "seti:windows", + "seti:jenkins", + "seti:babel", + "seti:bower", + "seti:docker", + "seti:code-climate", + "seti:eslint", + "seti:firebase", + "seti:firefox", + "seti:gitlab", + "seti:grunt", + "seti:gulp", + "seti:ionic", + "seti:platformio", + "seti:rollup", + "seti:stylelint", + "seti:yarn", + "seti:webpack", + "seti:lock", + "seti:license", + "seti:makefile", + "seti:heroku", + "seti:todo", + "seti:ignored" + ] + }, + { + "type": "string", + "pattern": "^\\LevelBehaviorminimalTruncation only. Keeps signature and docstring, drops body.standardTruncation plus light summarization if Ollama is available.fullFull LLM summarization via Ollama (requires Ollama running). -

Controls how verbose the agent’s responses are. Set via the set_output_compression MCP tool or config.

+

Controls how verbose the agent’s responses are. During cce init, the configured level is written into instruction files (CLAUDE.md, AGENTS.md, .cursorrules, etc.) so it applies to the entire session, not just CCE tool responses.

@@ -146,10 +146,10 @@ -
LevelStyleTypical savings
offFull output0%
liteRemoves filler and hedging~30%
standardShorter phrasing, fragments where possible~65%
maxTelegraphic, minimal prose~75%
-

Code blocks, file paths, commands, and error messages are never compressed regardless of level.

-

Change at runtime by telling your agent:

-
Switch to max output compression
Turn off output compression
+
LevelStyleTypical savings
offFull output0%
liteNo filler/hedging, diff-only code~25%
standardFragments, short synonyms, diff-only code~70%
maxTelegraphic, abbreviations, diff-only code~80%
+

All levels include code output rules: show only changed lines, never rewrite entire files, never echo back unchanged code. Code blocks, paths, commands, and error messages are never compressed. Security warnings use full clarity.

+

Change the level and re-run cce init to update instruction files, or change at runtime:

+
set_output_level output_level=max
embedding:
model: sentence-transformers/all-mpnet-base-v2

Any model available in fastembed works. Changing the model requires a full re-index:

diff --git a/docs/guide/content-assets.mjs b/docs/guide/content-assets.mjs new file mode 100644 index 0000000..2b8b823 --- /dev/null +++ b/docs/guide/content-assets.mjs @@ -0,0 +1 @@ +export default new Map(); \ No newline at end of file diff --git a/docs/guide/content-modules.mjs b/docs/guide/content-modules.mjs new file mode 100644 index 0000000..e6cec1f --- /dev/null +++ b/docs/guide/content-modules.mjs @@ -0,0 +1,4 @@ + +export default new Map([ +["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")]]); + \ No newline at end of file diff --git a/docs/guide/faq/index.html b/docs/guide/faq/index.html index cc94ca8..fdd0e35 100644 --- a/docs/guide/faq/index.html +++ b/docs/guide/faq/index.html @@ -77,18 +77,58 @@ })();

FAQ

+

FAQ

No. CCE returns the same code your agent would find by reading files, just compressed and targeted. In practice, answers are often better because the agent receives focused, relevant context instead of entire files full of unrelated code.

- -

Set output compression to a higher level:

-
compression:
output: max
-

Or tell your agent at runtime: “Switch to max output compression.” The max level uses telegraphic phrasing and typically saves ~75% on response tokens. Code blocks and file paths are never affected.

+ +

CCE writes output compression rules directly into your agent’s instruction files (CLAUDE.md, AGENTS.md, .cursorrules, etc.) during cce init. These apply to the entire session, so every response follows them.

+

Set the level in cce.yaml, then re-run cce init:

+
compression:
output: max # off | lite | standard | max
+

Or change at runtime via the MCP tool:

+
set_output_level output_level=max
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LevelSavingsStyle
off0%Normal verbosity
lite~25%No filler/hedging, diff-only code
standard~70%Fragments, short synonyms, diff-only code
max~80%Telegraphic, abbreviations, diff-only code
+

Default is standard. All levels include code output rules that tell the model to show only changed lines instead of full file rewrites. Code blocks, paths, and commands are never compressed. Security warnings use full clarity.

-

Three main sources:

+

Input tokens (what goes into the model):

    -
  1. Retrieval. Only relevant chunks are returned instead of the full codebase. This is the largest contributor (often 80%+ reduction).
  2. +
  3. Retrieval. Only relevant chunks are returned instead of the full codebase. This is the largest contributor (often 94% reduction).
  4. Chunk compression. Retrieved chunks are truncated to signatures and docstrings, or summarized via Ollama if available.
  5. -
  6. Output compression. Agent responses are shortened by removing filler, hedging, and verbose phrasing.
  7. +
  8. Grammar compression. Articles and filler removed from context.
  9. +
  10. Turn summarization. Session history compressed.
  11. +
  12. Progressive disclosure. Tool payloads filtered.
  13. +
+

Output tokens (what comes back from the model):

+
    +
  1. Output compression. Session-wide style directives in instruction files reduce prose verbosity and enforce diff-only code changes. Output tokens cost 5x more than input (e.g. Opus: $75/1M vs $15/1M), so even moderate output savings have outsized cost impact.

No. All processing happens locally:

diff --git a/docs/guide/introduction/index.html b/docs/guide/introduction/index.html index 70739aa..f982133 100644 --- a/docs/guide/introduction/index.html +++ b/docs/guide/introduction/index.html @@ -181,6 +181,6 @@
  1. Index — Tree-sitter parses code into semantic chunks. Stored locally with vector embeddings.
  2. Search — Agent calls context_search via MCP. Hybrid vector + BM25 merged with Reciprocal Rank Fusion. Graph expansion adds related imports.
  3. -
  4. Compress — Chunks are compressed (truncation or LLM summary with Ollama). Output compression reduces reply tokens.
  5. +
  6. Compress — Chunks are compressed (truncation or LLM summary with Ollama). Session-wide output compression rules in instruction files reduce reply tokens (diff-only code, no filler).
  7. Track — Every query recorded. cce savings shows tokens and dollars saved.
\ No newline at end of file diff --git a/docs/guide/pagefind/fragment/en_27bbe91.pf_fragment b/docs/guide/pagefind/fragment/en_27bbe91.pf_fragment deleted file mode 100644 index 00e3efc0e4ffc00911a7490632010b92673f7133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1288 zcmV+j1^4{gr`$0uCxsj?pxU-xS4l1lUesyX`|!2rF_W zZB6d7dyy;{F8mRFDbW6$zoch&NsChKyvQ_n=giERnKP`#Le7;grbS-d^@1&X$GxG_ z-kKuhUKu^?^?SL|UTTk{N#`V^u_+{eaCqzKL@$(a3*i1qm2ocav;ovljIDICj76`3qnlVJ6H*uFKKQpSy{@J&^{Uf!g(nQGIJb= zXaWOeCCybST}IbSNwqbzQdSvV$rvtq?96us1sW4?J zY(tYXWk}%9^VFU*Q7A3du7Qe(d(LcK z8&iG>wl&@RRf+-c;O)9_ZI zb+{F3nX7qAJW`IsS%9C*_LXUX`A2_{BY9$tgxMrcl5oUzzjgQl|>K$PVZ5SMx? z&^{TRgAd}z*aeRd{~!zm4~~c(H2~8V;4=R0_~J6g&WRXX10F!0k&HfAvj%A%1X46c zlOz1i_AXBiiZIcfz3;M6qvxqPb|B0Ik19{mC9=$-SXrQ^w+N%EZIkeUna_tM$Qi~_ z7q%Ey;`UWSak;4x*qN#@_Dzwv?OU$}6o5;qSOTs>T^q}jmxS!OX4$_Jb*NB)K!|g- zpta@6(8$o+q_>X7r3g`R3&fIDd7b^?q7I*pe*SopRcO**u97Mb@uya$0Snp6G2O%M z{cM5$3bSFJt_)PiNkkb3>x{+4JU( zi2Avf8tTgN-DdRHFypXp5d|llc~hZ4qtla%>#L{hDOGT<`ECPwEoM6QN#@hjFmkx> z`Fix>Vsepa`DE5C*xaVimZN*lrI_%N!olBNm1?!`McHentVo*=`tiJyaR9M{7=ILX zim$spm7tXpygk2Gix1~VZ>W-X0awulW=ui0c->wKh`>)F4gKk^grr3Q$rRjps^SiG zJQQgPVm#v{;F!&)>A>9s^oPzxWDOylot={l6_l~b@iR6`B`_?XzaA_Q5?Gp{tSs7b z8KF8>!eYEKT?j~ANG6Ly{MS$ z9pByedzJJ8PrX?0y|0)a&IMH7@a5m`de|pb`qo*#2CypdH1(#&GuLL{y5Hkk$H(Kt z`~HsoQEQKVG-$pzwlJNKkR6nxx8H(k*YPe+=j|5g?YozN*4R`7X!igcWee2ZUpqjr yk6z5owK6tHGPXtA7r0%-cR#*_h*A%fAH+%AqIKtUmo3Eh`~Cki4P=GJ3IG87JAoYl diff --git a/docs/guide/pagefind/fragment/en_280a4ac.pf_fragment b/docs/guide/pagefind/fragment/en_280a4ac.pf_fragment deleted file mode 100644 index 73ca79763e8c8d17314fac8f83920230735205e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1631 zcmV-l2B7&LiwFP!00002|HW6^Zrer>{gnX|BQ`41k}M~-(3iqU(H2M(#4h^K6vCQZ zS&YeDb}v#K$AS9~eJR@hM*H4R@t5@ME-8|+Z0D_juAJfQT+W;sR_u(=bCJ!mG`ozf zDxzt$tJyLaXF4{DrRVsy8x5jV3d4ng_&7-Eq?RUhbo89Ot|q?Z>Vkf;?z3bWC$mt} zo-Odr>BZ42(p*7>n8--+RH{tVLav}IF38ApE;OyU;z2JX=xWTlQo zi>PkT{uh1eKe8Bt8z zp+{%y`pj)n%$l=i>jWNkN^#5a6C7064yJ2Q7<`^v1t-+HkdSU0Wkt$do(H5YnpoxU z{oft1!CWdw3NCcb+bEDaVeX5fJ)n(5vDM7`(njGNh3aW8a5JCJUGF-3wlFzL>D*d! z6k^_iVrq@{=yOcdMWh!nA$^4V!>xgL)kxE+txLk;{#HV-xQb70dd>}{Z=E^t~ca-`8~J3y`p2wCN@; zn3poOB~tC%Dd3d_T{!d%Bl1Fbr(X%+AcnAU3p z2In%*Ttu|YwS~Q9&R2l!lumpDb;lw}w{0NloVGpu(*;wGcU-fCdD7{rE>i)QsG08y zSs=r>QJj6k;a#v6Xn)xKI>(qt+Z0?tKp8h7Jut4M*6Xo<&w8;@@qrbC;+Pc<-M*h$ z%T(wgsSL5y8Lii|#xznJRw*}Z-tlbUpbZlDHMjlo5|?=b$D;0DgLyZ z)|+U6|MjBfgp;wm&>Ldz@@O(14xPjef%fwF=`dXOQ*MqjcZ8FJS{N?PJocPmZ|@)o z>Of~zaO_z)p`py#C*sLdC+@)Omco8QSM&mehK2cLRA2_ZBFL1AMVFAk1gj07(M3oGDNrNKa!&4+IW&L5()zAZR~vi+(0~ zApDY{|G{<^^S&K(W+?>e|zuPgDIg4>feEi-+~hkJKfPTPU*1F9!y><4Fi#JzLBch-1s z@^D4g7~52nuCQbGV032;-63$h+8bv?zvAONeRfnEhmy4xJ7nFrvwx?L)tW~d2jjpa dF^g*+=@j%~(&?XjIK2A#>OWTq3wEFo002wUHx2** diff --git a/docs/guide/pagefind/fragment/en_29c695e.pf_fragment b/docs/guide/pagefind/fragment/en_29c695e.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..53f989b839841fce688f97cb3a8b65f3ff351d41 GIT binary patch literal 1318 zcmV+>1=;!^iwFP!00002|9w{5ZsRr({gr`%0tsr%*`V9q$eobzbOf7j&DH56<0z>mI#7JL}|31;4>%hg9&6_?_dJl`bm};Dyw%UP?`?Iet8% zik^+mH?@1iIF+sm@1@o_rq)U4@TLtTraHsTs^nPx+*A&c21hFap0cecjvo={l$ksi zwx-FMyo%t*dD@;cQ7A2yuxwTj*}$!n1*)S`O6QecI6B$J?Any(!oj3X1v&>Dol@nv zWFsqO$0_fnZIkoH0u~$;v{HUfOGJah%VHukt}yI5fzU}VGQ@0D^vBq0o-f)C=y&;>8ge<2J64~~c()d1ryzGHmqUWhTb|B1D9#tNrOJtq|v9dsoZxKdO+B)GAGo5yGkkbvL zE^O8<#QHR%xYU#g>_!zB`?^Tn_FJzR6o5;qSOOlZvNV<_FACYQW;whQbSP7RK!{T{ zqm|{!(8$o+sJD*#xu}BTW{4#z(lYtY1s%TW{rG8+6ll_)9-=CD@uyU|0Sn2}G2PwW z{bYvzswUkuUg@ZYlYr8%tTPrD)9}zVjc;rf#O_)aN-OvuGHCdx3%WdyQf+WOxEk!@Ee!XR~6#<~BWAj^;U+V#rGh2Y)tIYO8&3%3eKXS=@ZkkK;{9e#0 zzU~fGf|g3~_WZ9}T-~0(r$X8pTm=`HF$LM;b$c%$0zXu7=&$!BBrXa_rr^d?1$Ut1 zp@>ru;^{{L$85e%2kxGrKXfVrYY5@y=9XMlKpE>CzhI*j;*>KB)6`ihaCBtKLgRou zYV=%Oornvv%ZgsIw#S`ylBwym6VyI#U2XVwE-ieGtVkCj=(xe5^7xH{#e$szt=4sN zb4W^a6V^+RFW@dda#m61D*nznzqn|(;0Hx_t;@%!cB_zH;Hec_=HNr9g>!*LVfgYd zk1edEB7QE--vL-Dl>p=cHSV}vf<_g>cdUyV2W^Sv5ov4I6v_p;DNBsExTZkxi cNBK?|<{esd#P``kY`;GJ3o0FsdI<{v094zCp8x;= literal 0 HcmV?d00001 diff --git a/docs/guide/pagefind/fragment/en_456eeb3.pf_fragment b/docs/guide/pagefind/fragment/en_456eeb3.pf_fragment deleted file mode 100644 index 89bda9f4ce4867e73f8a2ce527d47fe167ae79e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2364 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 diff --git a/docs/guide/pagefind/fragment/en_aa33da6.pf_fragment b/docs/guide/pagefind/fragment/en_aa33da6.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..b74cc10a12377d5a9188922bf1ca307181ffacd6 GIT binary patch literal 2503 zcmV;&2{`s2iwFP!00002|BYDNa@#l({S}l_Gv#cFlx)YjXe$qnbFH-}sl@ZJwb{}@ zBqTB>0S*94Rx+8&Z*0}>&*e+@bc3WsS*ppCX%XFMbe}$bz)CLEJlE+oP0}xe+7^S! zV3Zg=&lk0oJ~w(a7!L4*SK8y<#rCUMTwJ^mD`Rh*SmizwpOrPDXDv+ag_#SVDKRs* zvAE81Co1fUbxUQPkVPTnQs#x66-t4osN3fz9690H%$XVSOp;QM8b%!H7HRdZ#PPSn2R?OjO6OH5f=ZJRN}GRf;CoM;qq;WGGlIVx}053u=aUwvA3}~uz-`HHN00A9f0h( zo4gWfZ7KQej>CyW3{Uh| zw{D!_44uql??zbN3 z$QE!jS}Tu-Oy)N=aZcA#p`#8E&h9E|$2S_Su-%j(naw{jFTB6c-47Yk4j?*jP2m8u zrpJh&+qG(McZV`@e`l(soODh8{o8-Ygh?$Hm$c2ZhJD+f2ce@+l7{Pb0gw>-op6A- z1cDT!IyH&&gyW$|t-G<7(|fyVY0=Lb#ilm`=FW}Mo|cE^B1S{&_pXnq1I^6iJbx*f3C zpG!~aSlJxBfgEY>JS4jgfzr@(;^^Y?{MY9%;xZkI^H(o^x&FY9aZ+1ntR(^&3gwgd zJ`gX!Q?jZGqNIlN5nj%dfX_4p^LX*8Ml%tmpw!s2va-l+2 zVln=Si9Hs-7z(vec9f}f5s;G4=MiCwVH=A-PtJbYg3L=R7bOBipmu`>c zBkaTD;#w7IVI{^zG8A$)vkCy=mfvIb7*^*9Hnea@Xxv2M0D@CDp#WAQm}XKhs4`Fh z@Tp;HksPW|mqxBh`%Wd95i^rR?4v-@6Rz>KL4t#`#x=O*EcL6pO z#IC`Kq^#heCFYw`ei|}04Su)(dCC>pA@_YPwzGs<>F)G^O7S$AB5$R3ptcg~azulq ztU%!`0HWndEY9`1nIjw73D)aoN)WV7P8wcp3_1dlA%Dma&*celWxy#{~hA7KCe7#+;X_1BOUi_WwWP#6JBvsN|YBkgg30k+WWW91Mf^r)R@0=TA?^ zW0GAgW(n2Yw|mt_Zv~Z~aN0=SI4D=po1^huRUlsQU#nu*Ld%i}aa)=W8v*)~?q99G zorsTvzr{$3vUJUgy`#YCHxx4dg#QSx1-N;s0{M}Jv&jeqE|c|$7QE!)#ucD|Nf$Tq z5f#e91r1&8UgL0a3sUhg=kyj(5_ZL9qYUo_rFhiz@%=rTk*~aT#~_M8yekZ!taXf; z-*~28uU*sRca`dvPz~WXgg;k=KUi5)g4@s;21Az}lj>rO@ueU*ek4-4hKEK1{rdiL zuc+zXvT)sVEux#SM45HeGMG$L8aYF1NsU{e8?T729nfKLXG@{#jks%k8wi-T0Xql1wKBJ$0k0!cSS0XsDKX|UeX zGc-}Eyiz0`hMS8n+cAs7_KL}kc5m#%B)OD!0hZdn`Jxa-__f>kpZJ!N8WwNuCl#ud zCwzj>>(CmlUf7q}_8ldZlo8Z`q)69}Kdcn2<5(ZTB~4`71GI&XCmE>hl5u-f>w?lq zA9rYyNz6)9r(4P5BM@Ejz~pVnqYoEx-F~rYzLvOA7^YVj?|2g&nkkxCiij0wa6ZkA zI0|R?G~(}v4@`w5-370+H9*jO-M}|5EJ>${sp+%V!-r3X1E2usaD&O0ufsv9yu{Oh zQ?vVBY=8xr#}K7h{jV3_+ap#*?&-2OYA=iYdsPW%@P};cO`@N~>`oWXKQFk|^D9GyVkaus*J*US{ z9_)BMZN27nL5{Y4Z#}cC%`QK5neHcQJU+B>kh6z&4sSPG|KL@zzxmlg1a#dJakp&t z+0n~Af2R*0AM)3I7m9-N+c@0Sg#BV4pB?g;H&TL8x>f1E#OQl_{NRwcW=`&&wl}GJ zzRr$M4*4?7lo5UK-jt^sdVMcvCxtVC*ypeO|1 zF87wvF1aSTce=VZ{2B$?m-CbKn<4jpNIE(G$6D`^oSARF`DVDCoT*Bi^13X_ccb1l zqsi!?l5Y=2<56KvP$uBb_oqMS;)PXSoSnTCvZ_=OgfxDkoOs*IMu+8}#3f#8YedkY zQKk6w@xPzh@#*9L#7{Qo6;6fT881SugqN)ng)Nm>+TICxXo6VSz9|K{DyB;;m!&o{ z{J&9tEPm^Kz>c}pTedziig1vzUUd|DWM~v>~Asm0lF2a&0eC*71>Jp+b@Gi?Vl=k)lvIM~7To z)e3ORu7fq$B3u(jKDsm(-U>BWj`Ha{Yp}esO=B0#gEj{gf%gG*)!@^RM6~i&`~lgh#J>fIr|`!IP(->CkN7ngZ=5Jr(Q>wHvjWSKIt_*UdGg1hGj!6t8#JpHK^`d*$BitwI2M>*_m8? zc>0`vB*Yu#4r*1-uz8GBRaIsU(2Lv|e8!Gr9QVDGvlf6N0lu~_2){JeEL(qnCp-4x z1e>lv;F*(MtqYXGbm|m>qxHUh-+<$O!}KY5&CwEDil#49r6$5fl7$*528E>r zUyI)xVgTG+h-iSZE&+g1ezScwzz?loeZ@fbAcn*E&j$*HpHV1 z2_Wu(q<~p0q%&M7RNZW#Xr$u={JmD#TiPT$v7T@U);ZfgREnS3L1p;LtZEbmv>+^I zmcvX{z<}&e#4jp14LxbVKSE`#E_H8iVq8%dVS584IwQt`gQn6esx@RuNBL|>_A|ePV7ag`|jD-II)Z+z7J^0&}Px(gHxnfYcHS*reGPPH0qg=@CqSO8cJJ0H3)~X zfF<7}D^C9lYpH(TG>vSf(3OyLsT(4D|7obx-+ z$z>zD?a)`zVZCURPo6rbG|L4Q%0m^jbL}t=ki-Clf)GSQsnJ0wDhPmVn&m{iY^SQ^ z?vH{7UE(iEW=gv-l+Q?2?r*IuYUoTZ{sv!&p-Q@)HD3;C&V@$pB4GaXNG+|m7 zxeiIyE&CVekfAPOGvbzq>Q4=`K$b|iu=yC2T6*d=Ska(hdkkDrR(;=f=-jG&xYInc zei-+-0*@LHu{f9RhWIc}EFFgT zI6jhL4EO35(f3^Vl=_THv0Qn?aV!xa+5=6NsAS5NY9xRV9*qw@oU|J8WBFo}6gP0iXM(M_p zc$MsUS_+*O`{h=s$9HYhEU?s&JLNV<|lAHnRt zf^09Nu&$JAwE@$>DpQ?)4pT{qOIQ(nRIgN$qE$#wDfap~MmpWyvfAMRQjm5> z#Xx(xLHM!8oT`vw+$!Q(=n=ostunD`ueO#ZL;@kc8sBfS`x^nr;exZrEnN;LJ{te- zT|410De44BJi&_@IB?Hr5QL$8EOuYo@ z3^Y3rhho}QD#DEv1`JLQWjL+=rjIC)*0!g^Hu{K=!Q(7`kjdi5kSu+WSs(bB4>w!Jp6oJ)Y-emR&XE~Ur&%IHMqPMq z@OOOS*fRQjr&XRMVK+n0R>o+0&!}A27C&>5+Ya&M*)DV1XYDeh;Vq+SHXEkdwV|E! z?v{yf55IjhX*w`sSsID%r0VXJwte)`$!@S@$X3HZhN{a}ZD$jzM<$UiQ_r4$x64!^ zO{OzcAM=meWj3_S*au-gWYjL#hQFZ2Zo6^v^l?&>C)~%#nY%39ZgShS+a2HP;3%LR zB{3~KSfH?wKh>7fLIvexQ7cqc$eD36 zCNuV6dp4UQ5U)|GeL0?_=h~i4vLw6W4+^vP{W$mBbFVu&S2Jy@H&t1^AN8&oO-46n z^4*P5F)FPI$^?A*`Q*izezMBbg9i^u&St6%B#mDxNAG&s=&<^MPVrG&LqUf|RrLAO zzt`OO{OLdX&5q*tO3}*pju4>qg9C|}Uq z-Ur-hJEy#dZ;4Yuy15Ff8q;G#os$TzR7H-#lXQyg4EfPig@CB0s+7G~F@ogMsZ!}P zq%gB3{!$hA(x@|O*cYHV52TF`2nCi1H#BUB{2D?rG9j{XSHc{Z!&PIk2}sjHpzT)kMPRi{hY zG%HR92R|O)`GycT>~+>~J?ugm50)??rj0EZK3-&?sgt2jwKVYMGSRr`e;{E+mCcNb zIB}q;khASBn6J5!5_5`E(}p}CDwUtmOBI|3D;mIOn$-qJ>fS6;aEaY;v%wek5^2KB zn4+j-nAe_kYJ!I8>l4$Qp7y~yI!J`Qcl6D7Fj@66gF`^Wp0=tmM8(8ghY?W8GO`i% z^LlP1!cqy&%9b8ikaIzB<@>gkPXCRwXIj#;rje~AJtKK0bt9(@!hQB-_30#cPAXn< z>uc)}x5}N{+OyocjdBIms+!~fMT`P9oLUrppa`1RQ@cuP;3FT+YRQG#Rl&Vy2c&I+fmF=E2|aA5s*1uANh{M|sD;G_2rW%xWtHHIEz-)e)&@}gj#wBq zB^|m0Fr$v<;{NH2Cpv&yGRUFOik?1rj`NOL3k2KVXfBN>%U^t`w50=M1Be}#)-6!x zT!f)CGG>3ES$eo2)gj5o+vGi`G)CGHkb=~ZTPpCoUV$JusL*y>*+8@)VV=K{I`0}? z0$_&K%=8?5L0ViyBy?diA(TgiX0dh)aD3Ll+}^=(`5YJNHLE#y1tLG0u`F{hXrqG$ zjvj5)(ZLcTQeTuKwacYY3i^2Wh@SpAA?dW&sv8QjWqKfnw@*D?>g?fYPZr|ah}V-(Z>#W1-%nq#{tP6ArVlW z-k}(sbg4rbfSGL?yX2(SW+PTn;Z9Cp3Ato9QH*eGLeE#BX2JLsf^u3q-33@$b!zzi z{L%9<{eqr-iP@fxp;&>(SX6$@4fr^Cee(24K~JSyFdvG{(qS(E?&HIlANB@yj_mu` z_*{Cytyo<|6!X9k3XmmYU678eF?4i<-xGA0Fac`}KBQ(Mup*5)OgGa*wXxYik>j}L zb%LSf8`Q#p?wY(@cpj|QlsntwD{kkeVVDwixK~JsJiL)hup6z*Lvpn)cCwaJ=fl2^ zb7EM+B5IL@Yqcsc`uGHc>d9EDde(^4IFZo?tyPA!>|mTClMd1sli9c4Ts{_ut#Yk4 zU>bN;@d||O`VKHx!>FvV-<829^~x|>U4J=)eb)(1^ISTj82vdq@Q}s zsToRKt85E1;w>+%nN0_^wF}URK}es9=+31HoY;1_k#HPxsd~ISKryq$EA!ufYcCuo zXPp5_7Cg;aQlkeaX-#S z(>_*O$AcW}f!W-4S-btP-M`7rA8Kd&c^#2i_W|J8m-!liXF|eEQqCb8-P!)LCu9w_`leFm9?hrS18RcIWo}VuWG>a6g*7 z|4@w32ok?W5wY}$8{xAwCH66#`Sbk6Gz zP;6bhHC(GO(gh+GX$2SQoh9;HZ*B0JH{q7EoBN!h+5#^kp~dhb66q--G9lLfu75mj zxxBO2XWS%3Wd$lWxDot35ZtV5hu1tKwi7%$-setx(XIrqZi07NG3>HyM|-#3Z5PM4 zt}K}jg0~it7otmry1b)pnZ9-Vct2P&h>KM~py$NJ(Ak9Qiali8)%|<>TqPc$_aggv zSc+j-rYQ*bLGZ9#JN}9RyA{UmJ6BQ?T>Q(*x_12)YP=o7z2gsmefS@`I%GhH5&!^2 Cjj)IS diff --git a/docs/guide/pagefind/fragment/en_f81f724.pf_fragment b/docs/guide/pagefind/fragment/en_f81f724.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..2073c7b1086ab784af706c5640da72d2fcee9adb GIT binary patch literal 1924 zcmV-~2YdJ*iwFP!00002|HW6`ZsW!kew71d7xAVd^<()@=*`A;(-cj15j*Hbw=hQJ zP@0(Jurou;%EpWBI}`m~KS{nbLrTD(qsWg-K)j z+Cri$9Mic>oYEyZ<#L$1d;hK327xQn89E zqrZV>`uQiCjD5zGgyh|S|B1gJpZq)7f8OQ`RwP{i>m~;@IgW={?fJ7|Jf4Jef4Cn{ zx@W^Ntp4l$Z}_2ej({eU_;AZ}SD3$@UL}=0osUrch(4=$wbtayGyP@H>4`d z&^P5ej+kC`-ek}t0S7l!Xv6P`vazuzW0pl8ru6K{hu)aHMioZ>ftN%oKKE~Q+DKAn zbTOr`+U!G9nXeE}j$d#lS=1$H0oAEZiM*)NIw=rUMp>Qbl&Kui?#7mBcJVJAux=fHWw6Z3v=B0osX$PrJEOfD>+K{c$@* zx9Dr5=iZDjm`!qR;VblLol_-Nxfb9fY_!4r+<0*^&igSBJI=5&(6NQIQL(rOX3%l)~01VRWjOvSw^2k z1sT{FA|(Tj7?YcT0Y!}moJNLcq!}8ChIa|@H|Go|kO%|~4a)O=TV7peYF>M=N&=i@ z4&&@Yyb?uDd)?SuUe#GPKwHUy?>jL1pb$5J&ueL-S)E)-M>8YE6$rZA)w8?g+8$j$ zAd7K?Q74kcx-_|10VOG#-Aa>W2?LG-hgLRgkzJHB8O8RMd5o>|DYBm7+!~?Kpd9=F7YaXgCmRcfi zT`GXZd>0NLeSrb7HBPKI>(3%v$wXx;S---u%rxU-C#Bmi(w7T`EP6%UP3v(59aH*< z-VI{Fe~@_j&;?K)H*^%qa<0nI9dT=Z8nmG^c+he7OIu)?oyov>#=QW zE%wkp)zNd&-P;frk2ui7O4mp?aA=z)6BKj}K14(yep^G|wUSE^#T2aTM835|k>=eL zNtd*jBbUrm#x?vAwvP^doOWOt_{q1u&XM6jaN85V3*#J|484B@_kyZLE=wFxDqTnq zlru4|m&8Yw(Vc=%ETj}gzG=@rkqP!}rg%Izdq_jeVVQ4LBeh}GfI4|2F&uz;3~^uc zdVAUNne`h7=2+c?^yl+eUpCm^6-ej!Y4^Xetnn+qRxk%73-}+QHmR8L+~e&(kc^Xa z6JY8o0-eYu#=ynC^OoN9n(*HAruebh%ir|+_}#4Kd^j2NgK#am44~o1qse$U<8@GM#_o=p`1EUBug|j$LcWzow^y3xng?Bb8Qfd=-2>=*(I;$f z(BXLTvr-sPAFpsyhFck=9BQ-^2SNH{z80psnKy+%|AXyn)PJeX)yK_Eu&z?i(Ozd0 zfWNH*2UZ7tFjd?8_d!4Dsl-m@BWlJ8Zo|-@UM9Nc3-Q75q~8lWo9#{C-u8QibOPUc zK8HJQ%st46GFfPT;cstySeA=$w_c2(T&4I1xK#Mg#J)>IznAO8!@4&e-uAb2j9VQw zGi!tZqbBZ+!h2WPEsgs}5320;d4yy|p5j8=M*dFIG4d;JKwEZ4!-IzmSL@9zT2t`G z(yqO2OY?Yq@{s0aGwXdo&E$;y;M|yabS2ofb#nN0Mb;SGRg>;vrz(@<2V>|Cf&10o zIU}}ppNt;T%~TtOl5I40$a+i9Wb~kq)tX0I2cy6vk%$@|=@j&7(%H6qaCH0k+g||1 KXnbbQ5&!_+1lExN literal 0 HcmV?d00001 diff --git a/docs/guide/pagefind/index/en_a7d683e.pf_index b/docs/guide/pagefind/index/en_a7d683e.pf_index new file mode 100644 index 0000000000000000000000000000000000000000..585a117bf502d865f2cffeacd2c84ab32cd7c3b1 GIT binary patch literal 19921 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\z|;jk>~ihEA`LcT)ZA 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

h(TKtXXfB}=k8eiFc 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 UYS$P+2CxtR2TRo0pGBPj0BMqVTL1t6 literal 0 HcmV?d00001 diff --git a/docs/guide/pagefind/index/en_e4ae659.pf_index b/docs/guide/pagefind/index/en_e4ae659.pf_index deleted file mode 100644 index c5e29996cb75c6c0b4f99b7af1329296902d76e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19055 zcmV(wKEdu(jEAY&V2Y&xd*W=1nl zGtU~$jHjrWCTUb$u#qVVp>7}xq>y9-0YVZ82_XSOAf$&hl7C4^vb*_HNZsT=?Y!;i;x>EnNM^Xg$^G%CG&Gt8pOHMBl@ei)ZfZse7Q zxdIzDU`5D-Pu7|>>(;KLomdiaw~k4P+b;pgCgEZ;~ zXi96k`g9V%=eKme4czy-F4{;Jk3B@yU8~D7srSI2N6Kz`t#hR8r{90!`s&^3IeK%t z){m9FV^R3aNI5j#8FAG|;Rzb0Ys2cwD0`{pS~@*`oI_Jy%k?#5_|8)_<+Vrc06yxb z*2`1X3VPOdjp`<>uBEZouI;Xjbpy9w*Qb*_lU`WYRhCm&A8~CPDF>+H!@9y>(`43l ztuY(+Ykt8T@L#xg?b^Po=bm+D2hQc%bsPGso_p4$^tuXd5&Fr|c*8TU0E}&h2C*ta)*2g&u z8{x;JF3EB0%{@m*qY1$-D(=R2_~{VsMfYlYmP@jVtIZw0fSxwe0ORy3Tmp;eg^j$M z@=Vsc+Y=+;BV=Pg%Qm$v*J3 zVzEQznn}88@Hm_RdAt>6*Axx85*EXWVM15?vD5w7sU_U9=tWj5Mg#H5T-@+rUV>7OcZ|`w+do0LS9fl@V6~ zB0lWQ#?IoULNVKKPV|qwkVL{Rj+Vm{*!b;+?rFZSNi5CtbQz}Hbv$1zE2YiLFG$gD z?9sGZ$VI)qRve2w*kLVP(>=}jH`ZIU@)NScKaFrD+~&s7ZpK;D!$b6Nznlspy#OK= zTK0Vr*R?!%dVesMPmJkp`^iYTjt7nLbdxbVLldF7fvhWOWs1|~ntfPsY9ma-aySn5 zz!!CwK0v?GnfUKb-7s?obixJjO27{{))Qb^SbnGjz88gWbwl&aHt2%$VI9u!(=tPZ z%kyR8wQVi1RSSs>vhO~W4_$(H*!|~noAc`e-Ebf2@qp%Mm*hPJl-|q

UocpU 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 diff --git a/docs/guide/pagefind/pagefind-entry.json b/docs/guide/pagefind/pagefind-entry.json index 3a5556b..2c5ed1c 100644 --- a/docs/guide/pagefind/pagefind-entry.json +++ b/docs/guide/pagefind/pagefind-entry.json @@ -1 +1 @@ -{"version":"1.5.2","languages":{"en":{"hash":"en_15adf94a87","wasm":"en","page_count":16}},"include_characters":["_","‿","⁀","⁔","︳","︴","﹍","﹎","﹏","_"]} \ No newline at end of file +{"version":"1.5.2","languages":{"en":{"hash":"en_739fafe83c","wasm":"en","page_count":16}},"include_characters":["_","‿","⁀","⁔","︳","︴","﹍","﹎","﹏","_"]} \ No newline at end of file diff --git a/docs/guide/pagefind/pagefind.en_15adf94a87.pf_meta b/docs/guide/pagefind/pagefind.en_15adf94a87.pf_meta deleted file mode 100644 index ded77ea3f9a0863ce2a281be718a3a95a1a2e244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmV;~04Dz*iwFP!00002|0T^mN<=Xf#c}dhkzgl+-H=SaHz4j}xXC?{5g9C=t-MjR zb^~@cx&guEhzoJJul&K`{O{=oV}IZscYcN2#Lf2Y=@y4whzV%kOtWxXECuRD{Rs0Y zE~c!nMQtDl+st&fZgXp>&Zu)C$a6;5kD}6h@L>HV8kv|z)ZZd!LvlQfx)8F3=alrP zs19Zn)(`7xuRH*wF4v@wg8}^_@-=%d)u@j(;)rWM@k&TBC91uV;yC&4 zWW>b@(A`~rb(|1=|79FYg_6W~H%6hzDAm1~a;;MocE2qaiAj_DGlgM-!0NjzBM%Z8 z!2OttGD~Ln+(K(%m8IjlRmP+&;@(ZMVB}nU_uWbYaj6S$+u8&`MSXwVztK?t=Yw65 WAxD|#z3eu-M>zvaY!zM^0RRBKgJ&lI literal 0 HcmV?d00001 diff --git a/docs/guide/savings-tracking/index.html b/docs/guide/savings-tracking/index.html index bfa7949..7b31eec 100644 --- a/docs/guide/savings-tracking/index.html +++ b/docs/guide/savings-tracking/index.html @@ -86,25 +86,25 @@

Without CCE 48.0k tokens $0.24
With CCE 3.4k tokens $0.02
──────────────────────────────────────────
Saved 44.6k tokens $0.22
~81 tokens / query ~<$0.01 / query
How: retrieval 93% + compression 90%
Cost estimate based on Opus input pricing ($5/1M tokens)
-

Savings come from two independent stages:

+

The report separates input and output token savings because they have different pricing. Output tokens cost 5x more than input (e.g. Opus: $75/1M output vs $15/1M input).

+

Input savings come from:

    -
  • -

    Retrieval savings (input). Instead of sending the entire codebase, CCE returns only the chunks relevant to the query. This is measured as: 1 - (served_tokens / full_codebase_tokens).

    -
  • -
  • -

    Compression savings (input). The retrieved chunks are further compressed (truncation, summarization) before being sent to the agent. This is measured as: 1 - (compressed_tokens / raw_chunk_tokens).

    -
  • +
  • Retrieval. Only relevant chunks returned instead of full files (biggest contributor, often 94%).
  • +
  • Chunk compression. Chunks truncated to signatures/docstrings or summarized via Ollama.
  • +
  • Grammar compression. Articles and filler removed from context.
  • +
  • Turn summarization. Session history compressed.
  • +
  • Progressive disclosure. Tool payloads filtered.
-

The combined effect is multiplicative. If retrieval cuts 90% and compression cuts another 50%, the total savings are 95%.

- -

The How: line in the output shows the contribution of each stage:

-
How: retrieval 93% + compression 90%
+

Output savings come from:

    -
  • retrieval represents the savings from selecting only relevant chunks.
  • -
  • compression represents the savings from compressing those chunks.
  • +
  • Output compression. Session-wide style directives written into instruction files (CLAUDE.md, AGENTS.md, etc.) during cce init. These tell the agent to use compressed prose and diff-only code changes across the entire session. Configure the level in cce.yaml (compression.output: off/lite/standard/max).
+ +

The breakdown shows each savings layer with its contribution:

+
Breakdown:
retrieval 48% ▰▰▰▰▰▰▰▰▰▰ 6.0k $0.09 · 1 call
chunk compression 20% ▰▰▰▰▱▱▱▱▱▱ 2.6k $0.04 · 1 call
output compression* 2% ▰▱▱▱▱▱▱▱▱▱ 325 $0.02 · 1 call
+

Each row uses the correct pricing (input rate for input buckets, output rate for the output compression bucket). Buckets marked with * use estimated values.

-

Cost estimates use model-specific input pricing. Configure which model to estimate for:

+

Cost estimates use model-specific pricing for both input and output tokens. Configure which model to estimate for:

# ~/.cce/config.yaml or .context-engine.yaml
pricing:
model: opus # opus (default) | sonnet | haiku

Prices are fetched from Anthropic’s documentation and cached for 7 days.

From d1c022958dd6358acc3c0d0dde66a9c48117ab69 Mon Sep 17 00:00:00 2001 From: rajkumarsakthivel Date: Tue, 19 May 2026 10:56:23 +0100 Subject: [PATCH 3/6] docs: add 'Why CCE?' page with cost math, memory problem, and who benefits --- docs-src/astro.config.mjs | 1 + docs-src/src/content/docs/why-cce.md | 79 +++++++++ docs/guide/agents/claude/index.html | 4 +- docs/guide/agents/codex/index.html | 4 +- docs/guide/agents/copilot/index.html | 4 +- docs/guide/agents/cursor/index.html | 4 +- docs/guide/agents/gemini/index.html | 4 +- docs/guide/agents/opencode/index.html | 4 +- docs/guide/agents/overview/index.html | 4 +- docs/guide/agents/tabnine/index.html | 4 +- docs/guide/cli-reference/index.html | 4 +- docs/guide/configuration/index.html | 4 +- docs/guide/faq/index.html | 4 +- docs/guide/getting-started/index.html | 6 +- docs/guide/how-it-works/index.html | 4 +- docs/guide/introduction/index.html | 6 +- .../pagefind/fragment/en_2bb92f1.pf_fragment | Bin 0 -> 2575 bytes docs/guide/pagefind/index/en_8e206e1.pf_index | Bin 0 -> 22631 bytes docs/guide/pagefind/index/en_a7d683e.pf_index | Bin 19921 -> 0 bytes docs/guide/pagefind/pagefind-entry.json | 2 +- .../pagefind/pagefind.en_739fafe83c.pf_meta | Bin 220 -> 0 bytes .../pagefind/pagefind.en_7c21abde5f.pf_meta | Bin 0 -> 230 bytes docs/guide/savings-tracking/index.html | 4 +- docs/guide/sitemap-0.xml | 2 +- docs/guide/why-cce/index.html | 153 ++++++++++++++++++ 25 files changed, 267 insertions(+), 34 deletions(-) create mode 100644 docs-src/src/content/docs/why-cce.md create mode 100644 docs/guide/pagefind/fragment/en_2bb92f1.pf_fragment create mode 100644 docs/guide/pagefind/index/en_8e206e1.pf_index delete mode 100644 docs/guide/pagefind/index/en_a7d683e.pf_index delete mode 100644 docs/guide/pagefind/pagefind.en_739fafe83c.pf_meta create mode 100644 docs/guide/pagefind/pagefind.en_7c21abde5f.pf_meta create mode 100644 docs/guide/why-cce/index.html diff --git a/docs-src/astro.config.mjs b/docs-src/astro.config.mjs index 7cfd597..44a222f 100644 --- a/docs-src/astro.config.mjs +++ b/docs-src/astro.config.mjs @@ -14,6 +14,7 @@ export default defineConfig({ ], sidebar: [ { slug: 'introduction' }, + { slug: 'why-cce' }, { slug: 'getting-started' }, { label: 'Agent Setup', diff --git a/docs-src/src/content/docs/why-cce.md b/docs-src/src/content/docs/why-cce.md new file mode 100644 index 0000000..9a116e4 --- /dev/null +++ b/docs-src/src/content/docs/why-cce.md @@ -0,0 +1,79 @@ +--- +title: Why CCE? +description: The problem CCE solves, with real numbers, and who benefits most. +--- + +## The problem + +Every time an AI coding agent answers a question about your code, it reads entire files. A 200-line file costs 200 lines of input tokens even when the agent only needs one function. Across a session with 20 queries, this adds up fast. + +**Real numbers from a FastAPI project (53 source files, 180K tokens):** + +| | Without CCE | With CCE | +|---|---|---| +| Tokens per query (avg) | 83,681 | 523 | +| Cost per query (Opus) | $1.25 | $0.008 | +| Cost for 20 queries | $25.00 | $0.16 | +| Tokens wasted on irrelevant code | ~95% | ~0% | + +That's $25 vs $0.16 for the same 20 questions. The agent gets the same answers both ways. The difference is how much irrelevant code it had to read to find them. + +## Why this happens + +AI coding agents are designed to be thorough. When you ask "how does authentication work?", the agent reads every file that might be relevant. Most of those files contain code that has nothing to do with authentication, but the agent reads them anyway because it can't know in advance which lines matter. + +This is the right behavior for correctness. But it's wasteful for cost. You're paying for the agent to read thousands of lines of code it immediately ignores. + +## What CCE does differently + +CCE sits between your agent and your codebase as an MCP server. Instead of the agent reading files directly, it calls `context_search("authentication")` and gets back only the relevant functions, classes, and modules. + +**Three layers of savings:** + +1. **Retrieval (94% input savings).** Tree-sitter parses your code into semantic chunks (functions, classes, imports). Vector + keyword search finds the relevant ones. The agent gets 500 tokens of focused code instead of 80,000 tokens of full files. + +2. **Compression (up to 89% additional).** Retrieved chunks are compressed to signatures and docstrings (or LLM-summarized via Ollama). If the agent needs the full source, it calls `expand_chunk`. + +3. **Output compression (up to 80% output savings).** Session-wide style directives in your instruction files tell the agent to use compressed prose and show only code diffs instead of full file rewrites. Output tokens cost 5x more than input tokens on Opus ($75/1M vs $15/1M), so this has outsized cost impact. + +## The memory problem + +Without CCE, every agent session starts from zero. The agent doesn't know what you decided yesterday, what architecture choices you made last week, or what code areas you've been working in. You end up re-explaining context every session. + +CCE adds cross-session memory: + +- **`record_decision`** stores architectural choices ("we chose PostgreSQL over MongoDB because...") +- **`record_code_area`** marks files you've worked on with descriptions +- **`session_recall`** retrieves past decisions at the start of new sessions + +The agent stops re-deriving answers it already figured out. Decisions compound instead of being forgotten. + +## Who benefits most + +**Large codebases.** The more files in your project, the more tokens wasted reading irrelevant code. A 500-file project wastes far more than a 20-file project. + +**Opus users.** Opus input tokens cost $15/1M, output $75/1M. A 94% reduction in input and 70% reduction in output saves real money. Sonnet and Haiku users save less in absolute dollars but still benefit from faster responses (fewer tokens = faster inference). + +**Multi-agent users.** If you use Claude Code, Cursor, and Codex on the same project, the index is shared. One `cce init --agent all` configures everything. Without CCE, each agent independently reads the same files and wastes the same tokens. + +**Teams.** Decisions recorded by one developer are recalled by another. The codebase's institutional knowledge lives in the index, not in individual developers' heads. + +## What CCE is NOT + +**Not a prompt optimizer.** CCE doesn't rewrite your prompts or modify your agent's system prompt. It provides a search tool and writes output style rules into instruction files. + +**Not cloud-based.** Everything runs on your machine. No code, embeddings, or queries leave your system. The only network call is fetching model pricing for cost estimates (cached 7 days). + +**Not a replacement for your agent's tools.** When you need to edit a specific file, use your agent's built-in file editor. CCE handles search and context retrieval. Use `context_search` for understanding code, use `Read`/`Edit` for modifying it. + +**Not language-limited.** Full AST-aware chunking works for Python, JavaScript, TypeScript, PHP, Go, Rust, and Java. Other file types (YAML, Markdown, config) use line-based chunking and still appear in search results. + +## The 60-second test + +```bash +uv tool install code-context-engine +cd /path/to/your/project +cce init +``` + +Ask your agent a question. Then run `cce savings` to see exactly how many tokens and dollars CCE saved. If the numbers don't convince you, run `cce uninstall` to remove everything cleanly. diff --git a/docs/guide/agents/claude/index.html b/docs/guide/agents/claude/index.html index 1bedf0a..9ae8684 100644 --- a/docs/guide/agents/claude/index.html +++ b/docs/guide/agents/claude/index.html @@ -45,7 +45,7 @@ })();