Architectural intelligence for AI coding agents โ one call gives your editor full context before it edits
Project description
๐ฆ Hawkeye
Architectural intelligence for AI coding agents. One call gives your AI editor full context about a file โ dependencies, blast radius, cycles, health โ before it writes a single line.
The Problem
AI coding agents edit files without knowing the architecture. They:
- Break imports they didn't know existed
- Refactor classes used by 20 other modules
- Create circular dependencies
- Miss that a "simple change" cascades through 34 files
Hawkeye fixes this. It gives the AI the same architectural awareness a senior engineer has โ in one deterministic, token-efficient JSON call.
Setup for AI Editors (MCP)
Hawkeye exposes 10 tools via Model Context Protocol. Install and configure in under 60 seconds:
1. Install
pip install "hawkeye-analyzer[mcp]"
2. Add to your editor's MCP config
Claude Code (~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"hawkeye": {
"command": "hawkeye-mcp",
"args": ["--project", "/path/to/your/project"]
}
}
}
Cursor (.cursor/mcp.json in project root):
{
"mcpServers": {
"hawkeye": {
"command": "hawkeye-mcp",
"args": ["--project", "."]
}
}
}
Windsurf / Other MCP clients โ same pattern. The server uses stdio transport and pre-analyzes the project on startup.
3. Done
The AI editor now has access to 10 architectural intelligence tools. The most important one:
hawkeye_file_context("src/core/engine.py")
Returns everything the agent needs in one call:
{
"module": "myapp.core.engine",
"file": "core/engine.py",
"loc": 340,
"dependency_count": 3,
"dependent_count": 8,
"dependencies": [
{"module": "myapp.core.scanner", "file": "core/scanner.py"},
{"module": "myapp.core.analyzer", "file": "core/analyzer.py"}
],
"dependents": [
{"module": "myapp.cli", "file": "cli.py"},
{"module": "myapp.server.mcp", "file": "server/mcp.py"}
],
"impact": {"direct": 8, "transitive": 12},
"metrics": {
"ca": 8, "ce": 3, "instability": 0.273,
"health": "critical",
"cyclomatic_complexity": 45,
"cognitive_complexity": 32
},
"insights": ["extreme_cyclomatic", "critical_blast_radius"],
"risk_profile": "hub",
"in_cycles": false
}
Design Principles
Hawkeye is built specifically for AI agent consumption:
| Principle | How |
|---|---|
| Deterministic | Same code โ same output. No randomness, no LLM in the loop. Pure AST + graph algorithms. |
| Token-efficient | Compact mode (default) strips verbose fields. A healthy module adds ~5 tokens. A problematic one adds ~30. Zero wasted tokens on modules with no issues. |
| One-call context | hawkeye_file_context replaces 5+ separate queries. One tool call = full architectural picture. |
| Fast | Single-pass AST parsing. 281 modules analyzed in ~5 seconds. Results cached for the session. |
| Zero dependencies | Core analysis uses Python stdlib only. No transitive dependency hell. Installs in under a second. |
| Machine-readable | Every output is structured JSON. Insight codes are enumerated strings, not natural language. Risk profiles are single-token labels. |
Token Budget
| Scenario | Tokens added to context |
|---|---|
| Healthy module, no issues | ~80 tokens |
| Module with warnings | ~150 tokens |
| Critical module with cycles | ~250 tokens |
| Batch context (3 files) | ~400 tokens |
Compare this to dumping raw import statements or grep results โ Hawkeye gives the AI structured, pre-analyzed architectural data at a fraction of the token cost.
MCP Tools Reference
After calling hawkeye_analyze(project_path) once, all other tools are available:
| Tool | Purpose | When to use |
|---|---|---|
hawkeye_file_context(file) |
Everything about a file โ deps, dependents, impact, cycles, health, insights, risk | Before editing any file |
hawkeye_context(files) |
Combined context for multi-file edits โ shared deps, combined blast radius | Before editing 2+ related files |
hawkeye_impact(file, symbol) |
Symbol-level blast radius โ who uses class Engine? |
Before renaming/refactoring a class or function |
hawkeye_symbols(file) |
List all classes/functions with usage counts | Understanding what a module exports |
hawkeye_find(pattern) |
Search modules by name | Discovering module names |
hawkeye_cycles() |
All import cycles with severity and break suggestions | Checking for circular dependencies |
hawkeye_metrics(sort_by, limit) |
Coupling + complexity table for all modules | Finding the riskiest modules |
hawkeye_path(source, target) |
Shortest dependency path between two modules | Understanding how modules are connected |
hawkeye_graph(max_depth) |
Full dependency graph as JSON | Structural overview |
Recommended Agent Workflow
1. hawkeye_analyze("/path/to/project") โ scan once on startup
2. hawkeye_file_context("file_to_edit.py") โ before every edit
3. hawkeye_impact("file.py", "ClassName") โ before refactoring a symbol
4. hawkeye_cycles() โ after creating new imports
Interpreting the Output
Insight Codes
Machine-readable labels derived deterministically from metrics. No natural language, no ambiguity:
| Code | Severity | What it means |
|---|---|---|
high_instability |
warning | Many outgoing deps, few incoming โ volatile |
highly_stable |
info | Many incoming deps โ changes here propagate widely |
high_efferent |
warning | Depends on too many modules |
high_afferent |
warning | Too many modules depend on this |
extreme_cyclomatic |
critical | Very high branching complexity (CC โฅ 50) |
extreme_cognitive |
critical | Deeply nested control flow (Cog โฅ 50) |
high_cyclomatic |
warning | Elevated branching complexity (CC โฅ 20) |
high_cognitive |
warning | Moderately nested control flow (Cog โฅ 25) |
critical_blast_radius |
critical | โฅ10 modules directly depend on this |
high_blast_radius |
warning | โฅ5 modules directly depend on this |
very_large_module |
warning | โฅ500 LOC |
in_cycle |
critical/warning | Involved in an import cycle |
zone_of_pain |
warning | Concrete + stable = rigid, hard to extend |
zone_of_uselessness |
warning | Abstract + unstable = possibly unused abstractions |
well_balanced |
info | On the main sequence (good A/I balance) |
isolated |
info | No internal dependencies or dependents |
high_fan_out |
info | Imports many modules (high coordination surface) |
wide_transitive_reach |
info | Transitive impact much wider than direct |
Risk Profiles
Single-token classification of a module's structural role:
| Label | Meaning | Agent should... |
|---|---|---|
hub |
High dependents + high complexity | Edit with extreme care โ many things break |
tangled |
Involved in import cycles | Fix the cycle before adding more imports |
fragile |
High complexity + high instability | Likely to break โ add tests first |
volatile |
High instability + many outgoing deps | Unstable foundation โ minimize changes |
amplifier |
Changes cascade widely (transitive >> direct) | Check transitive dependents before editing |
null |
No structural risk | Safe to edit freely |
Health Labels
Three-state composite assessment:
| Label | Meaning | Thresholds (default profile) |
|---|---|---|
healthy |
No coupling or complexity concerns | CC < 20, Cog < 25, Ca < 8, Ce < 8 |
warning |
Elevated risk in one dimension | CC โฅ 20 or Cog โฅ 25 or coupling โฅ 8 |
critical |
Multiple risk factors or extreme values | CC โฅ 50 or Cog โฅ 50 or both coupling high |
CLI for Humans
Hawkeye also works as a standalone CLI:
pip install hawkeye-analyzer
# Full project analysis
hawkeye analyze ./myproject
# Interactive dependency graph in your browser
hawkeye show ./myproject
# Metrics deep-dive with per-function complexity
hawkeye metrics ./myproject --sort health --functions
# Symbol blast radius
hawkeye impact ./myproject src/engine.py -s Engine
# CI gate โ fails on rule violations or import cycles
hawkeye check ./myproject --no-cycles
# AI-ready JSON context
hawkeye context ./myproject src/engine.py
Output Formats
| Command | Formats |
|---|---|
hawkeye analyze |
--format text (default), json, html, dot |
hawkeye metrics |
text (default), --json, --functions |
hawkeye impact |
text (default), --json, --hotspots, --unused |
hawkeye context |
JSON only (designed for machine consumption) |
Configuration
Place a hawkeye.toml in your project root. Hawkeye auto-discovers it by walking up from the project directory.
Minimal Setup
[project]
name = "MyProject"
[scan]
exclude_patterns = ["*.tests.*", "*.test_*"] # Keep test modules out of coupling analysis
Architecture Rules
# Enforce layered architecture
[rules.layers]
order = ["models", "services", "api", "cli"]
direction = "downward"
# Block specific imports
[[rules.forbidden]]
from = "api.*"
to = ["cli.*", "scripts.*"]
# Module groups must be independent (transitive โ catches indirect paths too)
[[rules.independence]]
modules = ["auth", "billing", "notifications"]
# Only auth may import secrets
[[rules.protected]]
modules = ["core.secrets", "core.tokens"]
allowed_importers = ["auth.*"]
# Sibling services must not form cycles
[[rules.acyclic_siblings]]
ancestor = "services"
Threshold Tuning
All 19 thresholds are configurable. Choose a profile, then override individual values:
[thresholds]
profile = "strict" # "default", "strict", or "relaxed"
cc_critical = 40 # Override: relax cyclomatic critical for this project
loc_critical = 600 # Override: allow larger modules
| Profile | CC warn/crit | Cog warn/crit | LOC warn/crit | Dependents warn/crit |
|---|---|---|---|---|
| default | 20 / 50 | 25 / 50 | 300 / 500 | 5 / 10 |
| strict | 10 / 30 | 15 / 30 | 200 / 300 | 3 / 5 |
| relaxed | 30 / 80 | 40 / 80 | 500 / 1000 | 10 / 20 |
The active profile is embedded in JSON output (threshold_profile field) for reproducibility.
All 19 threshold keys
| Key | Default | Controls |
|---|---|---|
instability_high |
0.8 | high_instability insight trigger |
instability_low |
0.2 | highly_stable insight trigger |
ce_high |
8 | Efferent coupling warning |
ca_high |
8 | Afferent coupling warning |
cc_high |
20 | Cyclomatic โ warning |
cc_critical |
50 | Cyclomatic โ critical |
cog_high |
25 | Cognitive โ warning |
cog_critical |
50 | Cognitive โ critical |
loc_high |
300 | large_module insight |
loc_critical |
500 | very_large_module insight |
dependents_high |
5 | Blast radius โ warning |
dependents_critical |
10 | Blast radius โ critical |
dependencies_high |
6 | high_fan_out insight |
cycle_size_high |
4 | Cycle โ critical severity |
distance_high |
0.5 | Zone of pain / uselessness trigger |
distance_low |
0.2 | well_balanced trigger |
abstract_high |
0.8 | Highly abstract classification |
abstract_low |
0.2 | Concrete classification |
How It Works
Python files โ AST parsing (single pass) โ Import resolution โ Dependency graph
โ
Symbol registry โ Symbol extraction Graph algorithms
โ โ
Symbol-level impact Coupling metrics (Ca/Ce/I/A/D)
Hotspot detection Complexity metrics (CC/Cog)
Dead code detection Cycle detection (Tarjan's SCC)
Health classification
Insight derivation
โ
Deterministic JSON output
- Single AST pass per file โ no re-parsing, no multiple traversals
- Tarjan's SCC for cycle detection โ O(V+E), mathematically optimal
- BFS reachability for transitive impact โ cached per session
- Robert C. Martin's metrics โ Ca, Ce, Instability, Abstractness, Distance
- SonarSource spec for cognitive complexity โ nesting-weighted, not just branch counting
Performance
| Metric | Value |
|---|---|
| 281 modules, 58K LOC | ~5 seconds full analysis |
| Incremental queries after analysis | <10ms per call |
| Memory | Graph + metrics cached in-process |
| Install time | <1 second (zero dependencies) |
| MCP server startup with pre-analysis | ~6 seconds |
Project Structure
src/hawkeye/
โโโ engine.py # Central orchestrator โ the main API
โโโ config.py # TOML config with walk-up discovery
โโโ cli.py # 7 CLI commands
โโโ core/
โ โโโ scanner.py # File discovery + LOC
โ โโโ analyzer.py # AST imports + symbols + complexity
โ โโโ graph.py # Directed graph + algorithms
โ โโโ metrics.py # Ca/Ce/I/A/D + health scoring
โ โโโ cycles.py # Tarjan's SCC + severity
โ โโโ rules.py # 5 architecture rule types
โ โโโ insights.py # Deterministic insight derivation
โ โโโ symbols.py # Cross-file symbol resolution
โโโ server/
โ โโโ mcp.py # 10 MCP tools
โโโ visualizer/
โโโ html_renderer.py # Interactive D3.js graph
โโโ dot_renderer.py # Graphviz DOT
โโโ text_renderer.py # Terminal tables
โโโ json_renderer.py # Structured JSON
271 tests across 11 test files. Zero required dependencies. Python 3.10+.
License
MIT โ see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hawkeye_analyzer-0.1.4.tar.gz.
File metadata
- Download URL: hawkeye_analyzer-0.1.4.tar.gz
- Upload date:
- Size: 78.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02a598598ea95415767a922bf1a16013c96c1767b3240da1e6c58916d4058dc2
|
|
| MD5 |
9385fc9b81910b2d5228eaaa5faca460
|
|
| BLAKE2b-256 |
e7a21f0b4d69a29c3246b271a98c6cfdd0163461f42a31ce7c9a84936c4bbef0
|
Provenance
The following attestation bundles were made for hawkeye_analyzer-0.1.4.tar.gz:
Publisher:
ci.yml on AlexxBenny/Hawkeye-analyze-your-codebase
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hawkeye_analyzer-0.1.4.tar.gz -
Subject digest:
02a598598ea95415767a922bf1a16013c96c1767b3240da1e6c58916d4058dc2 - Sigstore transparency entry: 1396294314
- Sigstore integration time:
-
Permalink:
AlexxBenny/Hawkeye-analyze-your-codebase@11cb639bb9c2d929d8659b1729f1d7670d04d085 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/AlexxBenny
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11cb639bb9c2d929d8659b1729f1d7670d04d085 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hawkeye_analyzer-0.1.4-py3-none-any.whl.
File metadata
- Download URL: hawkeye_analyzer-0.1.4-py3-none-any.whl
- Upload date:
- Size: 65.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c044e8d20cb7155eb4af1484674949bb925807a6a1e7caae5cf824810242fb8
|
|
| MD5 |
21bd049c5e0567e644a157f7a3125cce
|
|
| BLAKE2b-256 |
560068e96138655501de5e74fda49ed60e767164fc1af375c60f006513d5cff0
|
Provenance
The following attestation bundles were made for hawkeye_analyzer-0.1.4-py3-none-any.whl:
Publisher:
ci.yml on AlexxBenny/Hawkeye-analyze-your-codebase
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hawkeye_analyzer-0.1.4-py3-none-any.whl -
Subject digest:
8c044e8d20cb7155eb4af1484674949bb925807a6a1e7caae5cf824810242fb8 - Sigstore transparency entry: 1396294319
- Sigstore integration time:
-
Permalink:
AlexxBenny/Hawkeye-analyze-your-codebase@11cb639bb9c2d929d8659b1729f1d7670d04d085 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/AlexxBenny
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@11cb639bb9c2d929d8659b1729f1d7670d04d085 -
Trigger Event:
push
-
Statement type: