attocode-code-intel 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- attocode_code_intel-0.1.0.dist-info/METADATA +221 -0
- attocode_code_intel-0.1.0.dist-info/RECORD +345 -0
- attocode_code_intel-0.1.0.dist-info/WHEEL +4 -0
- attocode_code_intel-0.1.0.dist-info/entry_points.txt +2 -0
- attocode_code_intel-0.1.0.dist-info/licenses/LICENSE +21 -0
- attocode_intel/GUIDELINES.md +432 -0
- attocode_intel/__init__.py +52 -0
- attocode_intel/_internal/__init__.py +1 -0
- attocode_intel/_internal/errors/__init__.py +126 -0
- attocode_intel/_internal/integrations/__init__.py +1 -0
- attocode_intel/_internal/integrations/context/__init__.py +1 -0
- attocode_intel/_internal/integrations/context/architecture_drift.py +354 -0
- attocode_intel/_internal/integrations/context/ast_chunker.py +202 -0
- attocode_intel/_internal/integrations/context/ast_service.py +1483 -0
- attocode_intel/_internal/integrations/context/blob_oid.py +423 -0
- attocode_intel/_internal/integrations/context/cache_manifest.py +221 -0
- attocode_intel/_internal/integrations/context/cas.py +466 -0
- attocode_intel/_internal/integrations/context/code_analyzer.py +528 -0
- attocode_intel/_internal/integrations/context/codebase_ast.py +1461 -0
- attocode_intel/_internal/integrations/context/codebase_context.py +1736 -0
- attocode_intel/_internal/integrations/context/cross_mode.py +263 -0
- attocode_intel/_internal/integrations/context/cross_references.py +616 -0
- attocode_intel/_internal/integrations/context/embedding_rotation.py +597 -0
- attocode_intel/_internal/integrations/context/embeddings.py +282 -0
- attocode_intel/_internal/integrations/context/frecency.py +427 -0
- attocode_intel/_internal/integrations/context/fuzzy.py +320 -0
- attocode_intel/_internal/integrations/context/hierarchical_explorer.py +331 -0
- attocode_intel/_internal/integrations/context/hydration.py +90 -0
- attocode_intel/_internal/integrations/context/index_repair.py +87 -0
- attocode_intel/_internal/integrations/context/index_store.py +586 -0
- attocode_intel/_internal/integrations/context/memory_store.py +602 -0
- attocode_intel/_internal/integrations/context/module_resolution.py +52 -0
- attocode_intel/_internal/integrations/context/query_constraints.py +361 -0
- attocode_intel/_internal/integrations/context/query_history.py +417 -0
- attocode_intel/_internal/integrations/context/reranker.py +351 -0
- attocode_intel/_internal/integrations/context/semantic_search.py +2931 -0
- attocode_intel/_internal/integrations/context/syntax_evidence.py +94 -0
- attocode_intel/_internal/integrations/context/systemone_ranker.py +245 -0
- attocode_intel/_internal/integrations/context/temporal_coupling.py +411 -0
- attocode_intel/_internal/integrations/context/trigram_index.py +820 -0
- attocode_intel/_internal/integrations/context/trigram_regex.py +171 -0
- attocode_intel/_internal/integrations/context/ts_parser.py +2199 -0
- attocode_intel/_internal/integrations/context/vector_store.py +795 -0
- attocode_intel/_internal/integrations/feature_flags/__init__.py +357 -0
- attocode_intel/_internal/integrations/lsp/__init__.py +1 -0
- attocode_intel/_internal/integrations/lsp/client.py +1140 -0
- attocode_intel/_internal/integrations/mcp/__init__.py +1 -0
- attocode_intel/_internal/integrations/mcp/client.py +253 -0
- attocode_intel/_internal/integrations/security/__init__.py +1 -0
- attocode_intel/_internal/integrations/security/custom_rules.py +176 -0
- attocode_intel/_internal/integrations/security/dataflow.py +522 -0
- attocode_intel/_internal/integrations/security/dependency_audit.py +303 -0
- attocode_intel/_internal/integrations/security/matcher.py +44 -0
- attocode_intel/_internal/integrations/security/patterns.py +724 -0
- attocode_intel/_internal/integrations/security/scanner.py +351 -0
- attocode_intel/_internal/integrations/utilities/__init__.py +1 -0
- attocode_intel/_internal/integrations/utilities/ignore.py +64 -0
- attocode_intel/_internal/integrations/utilities/token_estimate.py +51 -0
- attocode_intel/_internal/tricks/__init__.py +1 -0
- attocode_intel/_internal/tricks/recursive_context.py +357 -0
- attocode_intel/_internal/types/__init__.py +1 -0
- attocode_intel/_internal/types/events.py +289 -0
- attocode_intel/_internal/types/severity.py +15 -0
- attocode_intel/_shared.py +341 -0
- attocode_intel/analysis_coverage.py +56 -0
- attocode_intel/api/__init__.py +1 -0
- attocode_intel/api/access.py +32 -0
- attocode_intel/api/app.py +247 -0
- attocode_intel/api/auth/__init__.py +128 -0
- attocode_intel/api/auth/api_keys.py +61 -0
- attocode_intel/api/auth/context.py +34 -0
- attocode_intel/api/auth/jwt.py +66 -0
- attocode_intel/api/auth/oauth.py +146 -0
- attocode_intel/api/auth/passwords.py +15 -0
- attocode_intel/api/deps.py +351 -0
- attocode_intel/api/knowledge_bridge.py +13 -0
- attocode_intel/api/mcp_transport.py +51 -0
- attocode_intel/api/middleware.py +411 -0
- attocode_intel/api/models.py +698 -0
- attocode_intel/api/providers/__init__.py +1 -0
- attocode_intel/api/providers/db_provider.py +1106 -0
- attocode_intel/api/providers/local_provider.py +476 -0
- attocode_intel/api/providers/remote_provider.py +740 -0
- attocode_intel/api/repository_source.py +21 -0
- attocode_intel/api/routes/__init__.py +1 -0
- attocode_intel/api/routes/_pin_helper.py +158 -0
- attocode_intel/api/routes/activity.py +148 -0
- attocode_intel/api/routes/adr.py +102 -0
- attocode_intel/api/routes/analysis.py +515 -0
- attocode_intel/api/routes/api_keys.py +170 -0
- attocode_intel/api/routes/auth.py +428 -0
- attocode_intel/api/routes/branches.py +262 -0
- attocode_intel/api/routes/cross_repo_search.py +198 -0
- attocode_intel/api/routes/embeddings.py +386 -0
- attocode_intel/api/routes/files.py +132 -0
- attocode_intel/api/routes/files_v2.py +388 -0
- attocode_intel/api/routes/gc.py +322 -0
- attocode_intel/api/routes/git_v2.py +433 -0
- attocode_intel/api/routes/graph.py +174 -0
- attocode_intel/api/routes/graph_viz.py +160 -0
- attocode_intel/api/routes/health.py +62 -0
- attocode_intel/api/routes/history.py +175 -0
- attocode_intel/api/routes/jobs.py +84 -0
- attocode_intel/api/routes/learning.py +205 -0
- attocode_intel/api/routes/lsp.py +272 -0
- attocode_intel/api/routes/notify.py +623 -0
- attocode_intel/api/routes/operations.py +27 -0
- attocode_intel/api/routes/orgs.py +924 -0
- attocode_intel/api/routes/preferences.py +100 -0
- attocode_intel/api/routes/presence.py +42 -0
- attocode_intel/api/routes/projects.py +116 -0
- attocode_intel/api/routes/repos.py +47 -0
- attocode_intel/api/routes/search.py +180 -0
- attocode_intel/api/routes/snapshots.py +614 -0
- attocode_intel/api/routes/webhooks.py +313 -0
- attocode_intel/api/routes/websocket.py +116 -0
- attocode_intel/api/static/graph.html +239 -0
- attocode_intel/api/utils.py +96 -0
- attocode_intel/artifacts/__init__.py +45 -0
- attocode_intel/artifacts/hashing.py +230 -0
- attocode_intel/artifacts/provenance.py +190 -0
- attocode_intel/artifacts/retrieval_pin.py +159 -0
- attocode_intel/audit.py +59 -0
- attocode_intel/bug_finder.py +206 -0
- attocode_intel/bundle.py +80 -0
- attocode_intel/catalog.py +242 -0
- attocode_intel/change_review.py +75 -0
- attocode_intel/cli.py +3062 -0
- attocode_intel/community.py +63 -0
- attocode_intel/confidence/__init__.py +144 -0
- attocode_intel/confidence/jev.py +234 -0
- attocode_intel/confidence/llm.py +330 -0
- attocode_intel/confidence/redact.py +44 -0
- attocode_intel/confidence/settings.py +74 -0
- attocode_intel/config.py +256 -0
- attocode_intel/crypto.py +31 -0
- attocode_intel/db/__init__.py +7 -0
- attocode_intel/db/base.py +33 -0
- attocode_intel/db/engine.py +61 -0
- attocode_intel/db/models.py +529 -0
- attocode_intel/entrypoint.py +185 -0
- attocode_intel/focused_evidence.py +130 -0
- attocode_intel/freshness.py +154 -0
- attocode_intel/gateway.py +734 -0
- attocode_intel/git/__init__.py +7 -0
- attocode_intel/git/credentials.py +75 -0
- attocode_intel/git/manager.py +493 -0
- attocode_intel/git/models.py +96 -0
- attocode_intel/git/storage.py +98 -0
- attocode_intel/graph_query_parser.py +761 -0
- attocode_intel/helpers.py +712 -0
- attocode_intel/indexing/__init__.py +29 -0
- attocode_intel/indexing/debouncer.py +136 -0
- attocode_intel/indexing/delta_indexer.py +151 -0
- attocode_intel/indexing/full_indexer.py +323 -0
- attocode_intel/indexing/incremental.py +240 -0
- attocode_intel/indexing/parser.py +403 -0
- attocode_intel/indexing/summarizer.py +264 -0
- attocode_intel/installer.py +1896 -0
- attocode_intel/knowledge.py +269 -0
- attocode_intel/local_knowledge.py +77 -0
- attocode_intel/migrations/alembic.ini +36 -0
- attocode_intel/migrations/env.py +71 -0
- attocode_intel/migrations/script.py.mako +27 -0
- attocode_intel/migrations/versions/001_initial_schema.py +219 -0
- attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +61 -0
- attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +51 -0
- attocode_intel/migrations/versions/004_audit_events.py +38 -0
- attocode_intel/migrations/versions/005_user_preferences.py +30 -0
- attocode_intel/migrations/versions/006_google_oauth.py +27 -0
- attocode_intel/migrations/versions/007_pgvector_embeddings.py +28 -0
- attocode_intel/migrations/versions/008_symbol_references.py +37 -0
- attocode_intel/migrations/versions/009_webhook_secret_encryption.py +25 -0
- attocode_intel/migrations/versions/010_add_commits_table.py +40 -0
- attocode_intel/migrations/versions/011_commit_changed_files.py +25 -0
- attocode_intel/migrations/versions/012_branch_merged_at.py +25 -0
- attocode_intel/migrations/versions/013_revoked_tokens.py +32 -0
- attocode_intel/migrations/versions/014_blame_hunks.py +40 -0
- attocode_intel/migrations/versions/015_commit_file_stats.py +40 -0
- attocode_intel/migrations/versions/016_embedding_provenance_columns.py +179 -0
- attocode_intel/migrations/versions/017_provenance_table.py +102 -0
- attocode_intel/migrations/versions/018_repo_snapshots.py +178 -0
- attocode_intel/migrations/versions/019_symref_caller.py +42 -0
- attocode_intel/migrations/versions/020_shared_knowledge.py +29 -0
- attocode_intel/onboarding.py +258 -0
- attocode_intel/output.py +178 -0
- attocode_intel/precision.py +133 -0
- attocode_intel/presence.py +160 -0
- attocode_intel/probe.py +110 -0
- attocode_intel/project_dir.py +97 -0
- attocode_intel/pubsub.py +113 -0
- attocode_intel/query_ranking.py +242 -0
- attocode_intel/readiness.py +972 -0
- attocode_intel/redis.py +51 -0
- attocode_intel/reference_pages.py +60 -0
- attocode_intel/remote.py +131 -0
- attocode_intel/repo_ranker.py +246 -0
- attocode_intel/request_context.py +82 -0
- attocode_intel/rules/__init__.py +28 -0
- attocode_intel/rules/ci.py +320 -0
- attocode_intel/rules/combinators.py +293 -0
- attocode_intel/rules/enricher.py +127 -0
- attocode_intel/rules/evolution.py +452 -0
- attocode_intel/rules/executor.py +531 -0
- attocode_intel/rules/filters/__init__.py +5 -0
- attocode_intel/rules/filters/pipeline.py +151 -0
- attocode_intel/rules/formatter.py +198 -0
- attocode_intel/rules/hygiene.py +242 -0
- attocode_intel/rules/importers/__init__.py +1 -0
- attocode_intel/rules/importers/semgrep.py +382 -0
- attocode_intel/rules/loader.py +292 -0
- attocode_intel/rules/marketplace.py +375 -0
- attocode_intel/rules/metavar.py +181 -0
- attocode_intel/rules/model.py +317 -0
- attocode_intel/rules/packs/__init__.py +1 -0
- attocode_intel/rules/packs/community/_license_templates/Apache-2.0.txt +176 -0
- attocode_intel/rules/packs/community/_license_templates/MIT.txt +21 -0
- attocode_intel/rules/packs/community/bandit-python/LICENSE +176 -0
- attocode_intel/rules/packs/community/bandit-python/NOTICE +13 -0
- attocode_intel/rules/packs/community/bandit-python/PORTING.md +23 -0
- attocode_intel/rules/packs/community/bandit-python/manifest.yaml +14 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B105-hardcoded-password.yaml +23 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B303-weak-md5.yaml +21 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B304-weak-des.yaml +20 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B307-use-of-eval.yaml +22 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B324-weak-sha1.yaml +21 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B501-no-cert-validation.yaml +23 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B602-shell-true.yaml +22 -0
- attocode_intel/rules/packs/community/bandit-python/rules/B608-sqli.yaml +22 -0
- attocode_intel/rules/packs/community/eslint-typescript/LICENSE +21 -0
- attocode_intel/rules/packs/community/eslint-typescript/NOTICE +13 -0
- attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +23 -0
- attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +14 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +20 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/no-eval.yaml +22 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/no-implied-eval.yaml +20 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/no-new-func.yaml +21 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/no-throw-literal.yaml +19 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/no-var.yaml +20 -0
- attocode_intel/rules/packs/community/eslint-typescript/rules/no-with.yaml +18 -0
- attocode_intel/rules/packs/community/gosec-go/LICENSE +176 -0
- attocode_intel/rules/packs/community/gosec-go/NOTICE +13 -0
- attocode_intel/rules/packs/community/gosec-go/PORTING.md +23 -0
- attocode_intel/rules/packs/community/gosec-go/manifest.yaml +14 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G101-hardcoded-credentials.yaml +22 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G102-bind-all-interfaces.yaml +21 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G103-unsafe-block.yaml +21 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G201-sql-format.yaml +21 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G304-file-inclusion.yaml +23 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G401-weak-cipher.yaml +20 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G402-tls-min-version.yaml +20 -0
- attocode_intel/rules/packs/community/gosec-go/rules/G501-md5-import.yaml +21 -0
- attocode_intel/rules/packs/examples/cpp/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/cpp/rules/security.yaml +90 -0
- attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +42 -0
- attocode_intel/rules/packs/examples/csharp/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/csharp/rules/security.yaml +69 -0
- attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +42 -0
- attocode_intel/rules/packs/examples/go/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/go/rules/performance.yaml +136 -0
- attocode_intel/rules/packs/examples/go/rules/security.yaml +48 -0
- attocode_intel/rules/packs/examples/go/rules/structural.yaml +58 -0
- attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +24 -0
- attocode_intel/rules/packs/examples/go/taint/sinks.yaml +51 -0
- attocode_intel/rules/packs/examples/go/taint/sources.yaml +26 -0
- attocode_intel/rules/packs/examples/java/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/java/rules/correctness.yaml +55 -0
- attocode_intel/rules/packs/examples/java/rules/structural.yaml +48 -0
- attocode_intel/rules/packs/examples/java/taint/sinks.yaml +37 -0
- attocode_intel/rules/packs/examples/java/taint/sources.yaml +21 -0
- attocode_intel/rules/packs/examples/kotlin/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +50 -0
- attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +38 -0
- attocode_intel/rules/packs/examples/php/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/php/rules/security.yaml +66 -0
- attocode_intel/rules/packs/examples/php/rules/structural.yaml +41 -0
- attocode_intel/rules/packs/examples/python/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/python/rules/performance.yaml +90 -0
- attocode_intel/rules/packs/examples/python/rules/structural.yaml +55 -0
- attocode_intel/rules/packs/examples/ruby/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/ruby/rules/security.yaml +73 -0
- attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +41 -0
- attocode_intel/rules/packs/examples/rust/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +51 -0
- attocode_intel/rules/packs/examples/rust/rules/structural.yaml +49 -0
- attocode_intel/rules/packs/examples/typescript/manifest.yaml +4 -0
- attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +70 -0
- attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +48 -0
- attocode_intel/rules/packs/pack_loader.py +244 -0
- attocode_intel/rules/plugins/__init__.py +1 -0
- attocode_intel/rules/plugins/plugin_loader.py +132 -0
- attocode_intel/rules/profiling.py +332 -0
- attocode_intel/rules/registry.py +213 -0
- attocode_intel/rules/sarif.py +187 -0
- attocode_intel/rules/synthesis.py +420 -0
- attocode_intel/rules/testing.py +326 -0
- attocode_intel/server.py +734 -0
- attocode_intel/service.py +3416 -0
- attocode_intel/sharing.py +57 -0
- attocode_intel/storage/__init__.py +6 -0
- attocode_intel/storage/branch_overlay.py +352 -0
- attocode_intel/storage/content_store.py +220 -0
- attocode_intel/storage/dependency_store.py +143 -0
- attocode_intel/storage/diff_engine.py +187 -0
- attocode_intel/storage/embedding_store.py +594 -0
- attocode_intel/storage/provenance_store.py +137 -0
- attocode_intel/storage/security_scanner_db.py +164 -0
- attocode_intel/storage/symbol_store.py +160 -0
- attocode_intel/structural_evidence.py +144 -0
- attocode_intel/symbol_inspection.py +141 -0
- attocode_intel/symbol_links.py +167 -0
- attocode_intel/telemetry.py +42 -0
- attocode_intel/test_ranking.py +73 -0
- attocode_intel/testing/__init__.py +43 -0
- attocode_intel/testing/fixtures.py +122 -0
- attocode_intel/testing/helpers.py +75 -0
- attocode_intel/testing/mocks.py +99 -0
- attocode_intel/tools/__init__.py +2 -0
- attocode_intel/tools/adr_tools.py +628 -0
- attocode_intel/tools/analysis_tools.py +382 -0
- attocode_intel/tools/composite_tools.py +695 -0
- attocode_intel/tools/cross_mode_tools.py +173 -0
- attocode_intel/tools/dead_code_tools.py +582 -0
- attocode_intel/tools/distill_tools.py +353 -0
- attocode_intel/tools/frecency_tools.py +220 -0
- attocode_intel/tools/fuzzy_tools.py +255 -0
- attocode_intel/tools/history_tools.py +486 -0
- attocode_intel/tools/learning_tools.py +222 -0
- attocode_intel/tools/lsp_tools.py +218 -0
- attocode_intel/tools/maintenance_tools.py +1662 -0
- attocode_intel/tools/navigation_tools.py +220 -0
- attocode_intel/tools/overlay_tools.py +540 -0
- attocode_intel/tools/pin_store.py +432 -0
- attocode_intel/tools/pin_tools.py +266 -0
- attocode_intel/tools/query_constraints_tools.py +262 -0
- attocode_intel/tools/query_history_tools.py +158 -0
- attocode_intel/tools/readiness_tools.py +44 -0
- attocode_intel/tools/rule_tools.py +992 -0
- attocode_intel/tools/search_tools.py +770 -0
- attocode_intel/tools/snapshot_tools.py +624 -0
- attocode_intel/workers/__init__.py +1 -0
- attocode_intel/workers/job_utils.py +111 -0
- attocode_intel/workers/jobs.py +573 -0
- attocode_intel/workers/run.py +30 -0
- attocode_intel/workers/settings.py +61 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"""Navigation tools for the code-intel MCP server.
|
|
2
|
+
|
|
3
|
+
Tools: repo_map, symbols, search_symbols, explore_codebase,
|
|
4
|
+
project_summary, bootstrap.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from attocode_intel._shared import (
|
|
10
|
+
_get_ast_service,
|
|
11
|
+
_get_service,
|
|
12
|
+
mcp,
|
|
13
|
+
)
|
|
14
|
+
from attocode_intel.tools.pin_tools import pin_stamped
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@mcp.tool()
|
|
18
|
+
@pin_stamped
|
|
19
|
+
def repo_map(
|
|
20
|
+
include_symbols: bool = True,
|
|
21
|
+
max_tokens: int = 6000,
|
|
22
|
+
) -> str:
|
|
23
|
+
"""Get a token-budgeted repository map showing file structure and key symbols.
|
|
24
|
+
|
|
25
|
+
Returns a tree view of the project with the most important files annotated
|
|
26
|
+
with their top-level symbols (functions, classes). Files are tiered by
|
|
27
|
+
importance: high-importance files show symbols, medium show names only,
|
|
28
|
+
low-importance files are collapsed.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
include_symbols: Whether to annotate files with top-level symbols.
|
|
32
|
+
max_tokens: Token budget for the output (default 6000).
|
|
33
|
+
"""
|
|
34
|
+
return _get_service().repo_map(include_symbols=include_symbols, max_tokens=max_tokens)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@mcp.tool()
|
|
38
|
+
@pin_stamped
|
|
39
|
+
def symbols(path: str) -> str:
|
|
40
|
+
"""List the functions, classes and methods that a file defines."""
|
|
41
|
+
return _get_service().symbols(path)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@mcp.tool()
|
|
45
|
+
@pin_stamped
|
|
46
|
+
def search_symbols(name: str, limit: int = 30, kind: str = "", task_hint: str = "") -> str:
|
|
47
|
+
"""Find symbol definitions by name, best match first: exact, prefix, substring, case-insensitive and camelCase or snake_case parts.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
name: A name or part of one, for example "parse_file" or "Router".
|
|
51
|
+
kind: Optional filter: function, class, method, variable, constant, interface or type.
|
|
52
|
+
task_hint: Optional task text that orders equal matches.
|
|
53
|
+
"""
|
|
54
|
+
service = _get_service()
|
|
55
|
+
if task_hint and hasattr(service, "_task_file_scores"):
|
|
56
|
+
return service.search_symbols(name, limit=limit, kind=kind,
|
|
57
|
+
task_hint=task_hint)
|
|
58
|
+
return service.search_symbols(name, limit=limit, kind=kind)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@mcp.tool()
|
|
62
|
+
def inspect_symbol(symbol_name: str, file_path: str | None = None, line: int | None = None,
|
|
63
|
+
source_start_line: int | None = None, task_hint: str | None = None) -> str:
|
|
64
|
+
"""Get a symbol in one call: definition, source excerpt, references, imports and candidate tests.
|
|
65
|
+
|
|
66
|
+
A name is enough. For an ambiguous name, the result lists choices: give the repository-relative file_path
|
|
67
|
+
and the definition start line to select one. Add task_hint to order the excerpts and tests for your task.
|
|
68
|
+
For a long definition, follow next_source or set source_start_line. Keep each context_ranges group with
|
|
69
|
+
its excerpt. Missing relationships do not prove absence.
|
|
70
|
+
"""
|
|
71
|
+
import json
|
|
72
|
+
|
|
73
|
+
from attocode_intel.symbol_inspection import inspect_symbol_data
|
|
74
|
+
|
|
75
|
+
return json.dumps(inspect_symbol_data(_get_service(), symbol_name, file_path, line, source_start_line, task_hint))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@mcp.tool()
|
|
79
|
+
def explore_codebase(
|
|
80
|
+
path: str = "",
|
|
81
|
+
max_items: int = 30,
|
|
82
|
+
importance_threshold: float = 0.3,
|
|
83
|
+
task_hint: str = "",
|
|
84
|
+
) -> str:
|
|
85
|
+
"""List one directory level: subdirectories with file counts and languages, and files with importance and top symbols.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
path: Directory relative to the project root ("" for the root).
|
|
89
|
+
importance_threshold: Minimum file importance, 0.0 to 1.0.
|
|
90
|
+
task_hint: Optional task text that orders the files.
|
|
91
|
+
"""
|
|
92
|
+
service = _get_service()
|
|
93
|
+
kwargs = {"path": path, "max_items": max_items,
|
|
94
|
+
"importance_threshold": importance_threshold}
|
|
95
|
+
if task_hint and hasattr(service, "_task_file_scores"):
|
|
96
|
+
kwargs["task_hint"] = task_hint
|
|
97
|
+
return service.explore_codebase(**kwargs)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@mcp.tool()
|
|
101
|
+
def project_summary(max_tokens: int = 4000) -> str:
|
|
102
|
+
"""Summarize the project: purpose, size, entry points, architecture, layout, dependency layers, tech stack, tests and build."""
|
|
103
|
+
return _get_service().project_summary(max_tokens=max_tokens)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@mcp.tool()
|
|
107
|
+
def bootstrap(
|
|
108
|
+
task_hint: str = "",
|
|
109
|
+
max_tokens: int = 8000,
|
|
110
|
+
indexing_depth: str = "auto",
|
|
111
|
+
) -> str:
|
|
112
|
+
"""Find where a behavior is implemented in an unfamiliar repository.
|
|
113
|
+
|
|
114
|
+
With task_hint, the result has the code that matches the task, a project summary, a map and the conventions.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
task_hint: What you want to find or change.
|
|
118
|
+
indexing_depth: "auto" (default), "eager", "lazy" or "minimal".
|
|
119
|
+
"""
|
|
120
|
+
return _get_service().bootstrap(
|
|
121
|
+
task_hint=task_hint,
|
|
122
|
+
max_tokens=max_tokens,
|
|
123
|
+
indexing_depth=indexing_depth,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@mcp.tool()
|
|
128
|
+
def hydration_status() -> str:
|
|
129
|
+
"""Report the index progress: tier, phase, parse and reference coverage, and embedding status."""
|
|
130
|
+
svc = _get_service()
|
|
131
|
+
status = svc.hydration_status()
|
|
132
|
+
lines = [
|
|
133
|
+
f"Tier: {status.get('tier', 'unknown')}",
|
|
134
|
+
f"Phase: {status.get('phase', 'unknown')}",
|
|
135
|
+
f"Parse coverage: {status.get('parse_coverage', 0):.0%} "
|
|
136
|
+
f"({status.get('parsed_files', 0)}/{status.get('total_files', 0)} files)",
|
|
137
|
+
f"Reference coverage: {status.get('reference_coverage', 0):.0%}",
|
|
138
|
+
f"Embedding coverage: {status.get('embedding_coverage', 0):.0%}",
|
|
139
|
+
f"Elapsed: {status.get('elapsed_ms', 0):.0f}ms",
|
|
140
|
+
]
|
|
141
|
+
excluded = status.get("excluded_checkout_roots", [])
|
|
142
|
+
if excluded or status.get("excluded_checkout_roots_truncated"):
|
|
143
|
+
lines.append("Git checkouts excluded by this workspace's ignore rules:")
|
|
144
|
+
lines.extend(f" {path}" for path in excluded)
|
|
145
|
+
if status.get("excluded_checkout_roots_truncated"):
|
|
146
|
+
lines.append(" Scan incomplete; other ignored Git checkouts may exist.")
|
|
147
|
+
lines.append("Select a checkout with workspace=<path to checkout> to index its files.")
|
|
148
|
+
return "\n".join(lines)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@mcp.tool()
|
|
152
|
+
def conventions(sample_size: int = 50, path: str = "") -> str:
|
|
153
|
+
"""Detect coding conventions and style patterns in the project.
|
|
154
|
+
|
|
155
|
+
Analyzes function naming, type hints, docstrings, async usage,
|
|
156
|
+
import style, popular decorators, class patterns, and module
|
|
157
|
+
organization across a sample of the most important files.
|
|
158
|
+
|
|
159
|
+
When ``path`` is set, only samples files within that directory subtree
|
|
160
|
+
and appends a comparison to project-wide conventions. This follows
|
|
161
|
+
Stripe's "scoped rules" pattern -- different directories may follow
|
|
162
|
+
different conventions.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
sample_size: Number of files to sample (default 50).
|
|
166
|
+
path: Optional directory path to scope the analysis to (e.g. "src/core").
|
|
167
|
+
When empty, analyzes the entire project.
|
|
168
|
+
"""
|
|
169
|
+
return _get_service().conventions(sample_size=sample_size, path=path)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@mcp.tool()
|
|
173
|
+
def relevant_context(
|
|
174
|
+
files: list[str],
|
|
175
|
+
depth: int = 1,
|
|
176
|
+
max_tokens: int = 4000,
|
|
177
|
+
include_symbols: bool = True,
|
|
178
|
+
task_hint: str = "",
|
|
179
|
+
) -> str:
|
|
180
|
+
"""Show the files around the given files: what they import and what imports them, with their top symbols.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
files: Center file paths.
|
|
184
|
+
depth: Number of hops, 1 or 2 (default 1).
|
|
185
|
+
task_hint: Optional task text that orders the files.
|
|
186
|
+
"""
|
|
187
|
+
service = _get_service()
|
|
188
|
+
kwargs = {"files": files, "depth": depth, "max_tokens": max_tokens,
|
|
189
|
+
"include_symbols": include_symbols}
|
|
190
|
+
if task_hint and hasattr(service, "_task_file_scores"):
|
|
191
|
+
kwargs["task_hint"] = task_hint
|
|
192
|
+
return service.relevant_context(**kwargs)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@mcp.tool()
|
|
196
|
+
def reindex(force: bool = False) -> str:
|
|
197
|
+
"""Trigger a re-index of the codebase symbol database.
|
|
198
|
+
|
|
199
|
+
By default performs an incremental update — only re-parses files whose
|
|
200
|
+
mtime has changed since the last scan. Pass ``force=True`` to rebuild
|
|
201
|
+
the entire index from scratch.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
force: If True, discard the cached index and re-parse every file.
|
|
205
|
+
"""
|
|
206
|
+
svc = _get_ast_service()
|
|
207
|
+
if force:
|
|
208
|
+
svc.force_reindex()
|
|
209
|
+
else:
|
|
210
|
+
svc.initialize(force=False)
|
|
211
|
+
|
|
212
|
+
stats = svc._store.stats() if hasattr(svc, "_store") else {}
|
|
213
|
+
mode = "full rebuild" if force else "incremental"
|
|
214
|
+
return (
|
|
215
|
+
f"Reindex complete ({mode}).\n"
|
|
216
|
+
f" Files: {stats.get('files', '?')}\n"
|
|
217
|
+
f" Symbols: {stats.get('symbols', '?')}\n"
|
|
218
|
+
f" References: {stats.get('references', '?')}\n"
|
|
219
|
+
f" Dependencies: {stats.get('dependencies', '?')}"
|
|
220
|
+
)
|