dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
Dead code detection for AI-generated codebases.
AI agents generate code rapidly, leaving behind dead and redundant code that pollutes the LLM's context window and dilutes attention. Graphlint analyzes your codebase's dependency graph to identify entry points and detect dead code — components unreachable from any entry point — so agents can self-clean and keep the codebase lean.
| Language | Status | Parser | Features |
|---|---|---|---|
Python (.py) |
Built-in | ast (stdlib) |
Decorators, type annotations, dynamic imports, framework-aware entry detection |
Rust (.rs) |
Built-in (opt-in deps) | tree-sitter |
Attribute macros, traits, pub visibility, macro_rules! |
C# (.cs) |
Built-in (opt-in deps) | tree-sitter |
Partial classes, properties/indexers/events, attributes, .csproj awareness, test framework entries |
TypeScript / JavaScript (.ts .tsx .js .jsx .mts .cts .mjs .cjs) |
Built-in (opt-in deps) | tree-sitter |
JSX/React components, Next.js pages, NestJS decorators, Jest/Vitest tests, import/export analysis |
Install optional language support:
pip install graphlint[rust] # adds tree-sitter and tree-sitter-rust
pip install graphlint[csharp] # adds tree-sitter and tree-sitter-c-sharp
pip install graphlint[typescript] # adds tree-sitter + tree-sitter-typescript + tree-sitter-javascript
ast, the others use tree-sitter#[tokio::main], #[test]), C# attributes ([Fact], [HttpGet]), TS/JS JSX elements and ES module imports/exports, trait implementations, pub/public visibility, partial classes, and moreread, write, call, inherit, decorateast_pattern prefixes including function_call:, function_def:, decorator:, class_definition: (C#), file_match:, file_is_program (C#), visibility:pub (Rust), visibility:public (C#), trait_impl: (Rust), macro_def: (Rust), jsx_element: (TypeScript), export: (TypeScript), and more--public-as-entry flag — treat all public items (Rust pub, C# public) as entry points for library analysispip install graphlint
Requirements: Python >= 3.9
For Rust support (.rs files), install the optional tree-sitter dependencies:
pip install graphlint[rust]
For C# support (.cs files), install the optional tree-sitter dependencies:
pip install graphlint[csharp]
For TypeScript/JavaScript support (.ts .tsx .js .jsx .mts .cts .mjs .cjs files), install the optional tree-sitter dependencies:
pip install graphlint[typescript]
Graphlint installs its usage guidance into your AI coding tools at the global level:
# Install the graphlint skill (~/.agents/skills/graphlint/SKILL.md) — default, recommended
graphlint install
graphlint install --targets all # also ~/.claude/skills/graphlint/SKILL.md
# Install the DeepSeek Harness plugin (recommended in DSH — tool-based integration)
graphlint install dsh --profile web
# Inject the prompt into agent config files (opencode, cursor, codex, cc)
graphlint install prompt
# Copy the prompt to clipboard for manual paste into your agent
graphlint prompt
# Remove installed skills / prompts
graphlint uninstall
All channels derive from one canonical skill document shipped in the package (graphlint/skill.md), so the skill file, the injected prompt and the DeepSeek Harness plugin's graphlint skill can never drift apart. For details, see Agent Integration. For tools you'd like native support for, feel free to submit an issue — these requests are typically handled quickly.
A plugin bundle for the DeepSeek Harness plugin ecosystem ships in this repository under integrations/dsh:
graphlint_query (dependency-graph queries with structured results), graphlint_build (index build as a background job, polled with job_output), graphlint_config (show/get/set for .graphlint/config.json).graphlint skill teaches the agent when and how to use the tools.Install the bundle from npm:
dsh plugin --profile web add dsh-graphlint
Then restart dsh web. To link a local checkout instead (development):
# 1. Clone the repository and build the bundle (requires Node.js >= 20)
git clone https://github.com/AngelosZou/graphlint.git
cd graphlint/integrations/dsh
npm install
npm run build
# 2. Link the bundle into a profile (run from the repository root)
cd ..
dsh plugin --profile web add link:./integrations/dsh
# 3. Restart dsh web
# Find dead code in current directory
graphlint query --warn-types "dead_code"
# Full analysis with JSON output
graphlint query --json
# View a specific graph detail
graphlint query -g 1 --detail full
# Exit non-zero when dead code or circular refs found (for CI)
graphlint query --json --fail-on dead_code,circular_ref
# Treat all public items as entry points (library analysis mode)
graphlint query --public-as-entry
# Rebuild index
graphlint build --force
# Configure
graphlint config show
graphlint config set --key lang --value en
| Code | Meaning |
|---|---|
0 |
Success — no warnings matched --fail-on |
1 |
Error — invalid parameters, exception, or config error |
2 |
Warnings found — --fail-on matched specified warning types |
Use --fail-on with a comma-separated list of warning types to make graphlint query return exit code 2 when matching warnings are found. This enables CI pipeline integration without blocking on non-critical warnings.
Graphlint is static-analysis based and cannot recognize certain Python dynamic references (e.g., getattr, importlib), which may produce unexpected exit codes. Only use --fail-on for CI blocking behavior when you're confident in your configuration. Agents are better suited for logic that requires contextual judgment. See Limitations for details.
from graphlint.api import query
# Find dead code components
result = query(warn_types="dead_code", json_output=True)
# Full dependency graph analysis
result = query(include_tests=True, json_output=True)
| Warning | Description |
|---|---|
unused_import |
Imported module or name is never used |
dynamic_import |
Dynamic import via importlib or __import__ |
circular_ref |
Circular dependency between functions/classes |
syntax_error |
File contains a syntax error |
write_only |
Variable is written but never read |
deprecated_usage |
Usage of a deprecated function/class |
dead_code |
Component unreachable from any entry point |
type_mismatch |
Suspicious type annotations |
unresolved_ref |
Reference to an undefined name |
unused_variable |
Variable is defined but never used |
file_too_large |
File exceeds the configured size limit |
# Clone the repository
git clone https://github.com/AngelosZou/graphlint.git
cd graphlint
# Create a virtual environment
python -m venv env
env/Scripts/activate # Windows
source env/bin/activate # Unix
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=graphlint
# Run type checking
mypy graphlint/
# Run linting
ruff check graphlint/ tests/
Graphlint stores its configuration in .graphlint/config.json within the analyzed directory. Use graphlint config commands to manage settings, or edit the file directly.
See graphlint config show for the full default configuration.
Full documentation is available in the docs/ directory:
getattr, importlib, or dynamic dispatch patterns, which may result in false positives. This primarily affects Python; Rust's static dispatch model produces fewer false positives. Mitigation: add custom entry rules matching your codebase's conventions. For example, graphlint's own codebase uses function_def:_detect_* and function_def:visit_* patterns to prevent functions discovered via getattr from being flagged as dead.importlib, getattr, metaclasses, etc.), the default entry templates may produce false positives in codebases that rely heavily on runtime dispatch. Users should tune the entry_rules configuration to match their project's conventions.macro_rules! bodies appear as opaque token trees. Some macro-generated call paths may be missed. #[derive] attributes are partially recognized via implicit inherit edges..cs file independently; partial class fragments are merged into a single logical node via part_of edges, but members called only through reflection (Activator.CreateInstance, DI container registration) may be missed, similar to Python's dynamic import limitations.--public-as-entry scope — this flag applies to languages with public visibility declarations (Rust pub, C# public). It has no effect on Python files. Toggling this flag triggers a full re-index. For long-term library analysis, prefer enabling the rust_pub_api entry rule via graphlint config to persist the setting..py files, 1,000+ classes, and 14,000+ functions, a full rebuild takes approximately 200 seconds (actual performance depends on hardware). Small projects (~60 files) complete in ~1 second. This cost is one-time, after the initial full scan, subsequent queries use incremental updates.MIT — see LICENSE for details.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。