New Architecture rules in v0.6.0

Stop your agent
grepping around.

One call gives your coding agent the map: where to start, what a change breaks, which tests to run.

sprout — pallets/click

Impact

Every file a change reaches, and the tests to run

pallets/click
$ sprout impact src/click/core.py
Impact of 1 file   src/click/core.py Affected: 12 files, 8 directly  src/click/__init__.py          imports .core  src/click/decorators.py        imports .core  src/click/exceptions.py        imports .core  src/click/globals.py           imports .core  src/click/parser.py            imports .core  src/click/shell_completion.py  imports .core  src/click/testing.py           imports .core  src/click/types.py             imports .core  … and 4 more files through them (--all lists them) Tests: 43 files  python -m pytest tests/test_abort_interrupt.py tests/test_arguments.py tests/test_basic.py tests/test_chain.py tests/test_command_decorators.py tests/test_commands.py tests/test_compat.py tests/test_context.py tests/test_custom_classes.py tests/test_defaults.py tests/test_deprecations.py tests/test_exceptions/test_FileError.py  (runs 12 of 43; --all prints the full command)

Maps all 31,412 files of Kubernetes in 0.23 s. From a weekend script to a monorepo, one binary and no account.

Reads:

  • Go
  • TypeScript
  • JavaScript
  • Python
  • Rust
  • Java
  • Kotlin

Works with:

  • Claude Code
  • Cursor
  • VS Code
  • Claude Desktop
  • any MCP client

Which tests run after I change src/click/core.py?

grep, hit by hit42 calls · 5,992 tokens
sprout impact1 call · 225 tokens

pallets/click · Sprout v0.4.2 · tokens = characters ÷ 4

1 call, not 42

Every test a change reaches, in 225 tokens

Benchmarks
.sproutrules
# the library never imports its testssrc/ -> tests/# low-level helpers stay below the command layersrc/click/utils.py -> src/click/core.pysrc/click/formatting.py -> src/click/parser.py
$ sprout check exit 1
1 import breaks .sproutrules (18 files checked) .sproutrules:5  src/click/formatting.py -> src/click/parser.py  src/click/formatting.py -> src/click/parser.py  imports .parser

Rules for CI

Fail the build on a forbidden import

Guide
src/click├── __init__.py├── _compat.py├── _termui_impl.py├── _textwrap.py├── _utils.py├── _winconsole.py├── core.py├── decorators.py├── exceptions.py├── formatting.py├── globals.py├── parser.py├── py.typed

The tree

Respects .gitignore, counts what it hides

Guide
  • project_mapThe map, key files and signatures
  • reading_orderWhere to start, and why
  • impactWhat could break, and the tests to run
  • contextWhat a file uses, its users and tests
  • depsWhat a file uses
  • dependentsWhat uses a file
  • treeAny folder as a tree
  • diff_treeWhat a branch changed

8 MCP tools

One server, any agent

Setup
# src/click/decorators.py3 dependencies · 2 direct users · 12 affected through them · 43 tests reach it ## depends on (and what it uses from each)src/click/core.py — imports .core  class Context  class Command  class Group(Command)  class Parameter(ABC)  +2 moresrc/click/globals.py — imports .globals  def get_current_context(silent: t.Literal[False] = False) -> Context: ...  def get_current_context(silent: bool = ...) -> Context | None: ...  def get_current_context(silent: bool = False) -> Context | None

Context

What to know before editing a file

Guide

Above groundThe files you can see.

Below groundHow they connect. Sprout maps it.

Same answer. For you and your agent.

sprout impact src/click/core.py
1Impact of 1 file
2
3 src/click/core.py
4
5Affected: 12 files, 8 directly
6 src/click/__init__.py imports .core
7 src/click/decorators.py imports .core
8 src/click/exceptions.py imports .core
9 src/click/globals.py imports .core
10 src/click/parser.py imports .core
11 src/click/shell_completion.py imports .core
12 src/click/testing.py imports .core
13 src/click/types.py imports .core
14 … and 4 more files through them (--all lists them)
15
16Tests: 43 files
17 python -m pytest tests/test_abort_interrupt.py tests/test_arguments.py tests/test_basic.py tests/test_chain.py tests/test_command_decorators.py tests/test_commands.py tests/test_compat.py tests/test_context.py tests/test_custom_classes.py tests/test_defaults.py tests/test_deprecations.py tests/test_exceptions/test_FileError.py
18 (runs 12 of 43; --all prints the full command)

The CLI prints it for you

Plain text in your terminal, or --json for scripts. The MCP server hands your agent the same answer.

1Claude Code
2Cursor
3VS Code
4Claude Desktop

Read-only. Paths stay inside the project, and every call reads the disk again.

One line to connect

Any MCP client works. Setup and safety →

Questions

More in the FAQ.

Does Sprout send my code anywhere?

No. It makes no network requests except to clone a repository you asked it to map. The map holds names and signatures, never function bodies.

How is it different from grep?

grep finds text. Sprout resolves imports the way each language does, so it knows which files depend on which, including tests that reach a file through other files.

Which languages does it read?

Go, TypeScript, JavaScript, Python, Rust, Java and Kotlin. Any other file still shows in the tree.

Does it work with my agent?

Any MCP client: Claude Code, Cursor, VS Code and Claude Desktop have one-line setups. Without MCP, paste sprout --ai into any chat.

What does it cost?

Nothing. Sprout is MIT licensed, a single binary with no account and no telemetry.

Plant it in your next repo.

macOS, Linux and Windows. MIT licensed.