Contributing
June 23, 2026 · View on GitHub
Contributions are welcome — whether you're a security researcher, AI engineer, or someone who cares about making defense better through offense.
Development Setup
Prerequisites: Docker, Docker Compose v2, and uv (for Python tooling locally).
git clone https://github.com/PurpleAILAB/Decepticon.git
cd Decepticon
# Copy and configure environment
cp .env.example .env
# Edit .env — set at least one provider key, or set OLLAMA_API_BASE + OLLAMA_MODEL for local Ollama
# Start services with hot-reload (daily dev loop)
make dev
# Or run the full OSS UX (launcher → onboard → CLI) on local code
make dogfood
make dev uses docker compose watch — source changes sync into containers automatically without rebuilding. make dogfood is the release-shape verification path; see makefile-reference.md for the full target list.
Project Structure
decepticon/ # Core Python package (LangGraph agents, middleware, tools)
├── agents/ # Agent factory functions (create_*_agent)
├── core/ # Config, engagement document schemas, logging, streaming helpers
├── llm/ # Model profiles, LiteLLM configuration
├── middleware/ # Skills, filesystem, OPPLAN, safe command, fallback, etc.
└── tools/ # Bash, research (KG, CVE, chain planning), reporting
skills/ # Skill library (SKILL.md files organized by kill chain phase)
clients/
├── cli/ # TypeScript/Ink terminal UI
├── web/ # Next.js 16 web dashboard
└── shared/ # Shared streaming utilities (@decepticon/streaming)
config/ # LiteLLM proxy config (litellm.yaml)
containers/ # Dockerfile per service
Quality Gates
Before opening a PR, run the quality checks:
make quality # Full gate: Python + CLI + Web (run before opening a PR)
make lint # Python only: ruff check + ruff format --check + basedpyright
make lint-fix # Auto-fix Python lint and formatting
make quality-cli # CLI: typecheck + build + vitest
make web-lint # Web dashboard ESLint
make test # Python tests in Docker
make test-local # Python tests locally (requires uv sync --dev)
Minimum Python version: 3.13
Adding an Agent
- Create the agent module. Pick a bundle:
decepticon/agents/standard/{name}.pyfor OSS-blessed agents shipped by defaultdecepticon/agents/plugins/{name}.pyto demonstrate the community-plugin shape The file exposes acreate_{name}_agent()factory.
- Follow the middleware stack pattern from an existing agent (e.g.,
standard/recon.py) - Define the agent's skill sources in the
SkillsMiddlewareconfiguration - Subagents only: add a module-level
SUBAGENT_SPEC = SubAgentSpec(...)declaringparent_agents=(...),bundle=..., andpriority=.... Register it under[project.entry-points."decepticon.subagents"]inpyproject.toml. The relevant main agent picks it up automatically viaload_subagents_for_parent(...). Seedecepticon/plugin_loader.pyfor the contract. - Create a skills directory at
skills/{bundle}/{name}/mirroring the agent bundle (standard/orplugins/).
Activating plugin bundles
Decepticon defaults to the lean standard bundle. To activate additional
bundles (e.g. the plugins bundle that ships vulnresearch), use the
4-tier hierarchy (highest precedence wins):
DECEPTICON_PLUGINSenv var — runtime override:DECEPTICON_PLUGINS=standard,plugins langgraph dev # or "*" for all.decepticon.tomlin CWD — per-checkout opt-in:[plugins] enabled = ["standard", "plugins"]pyproject.tomlin CWD — project-default opt-in:[tool.decepticon.plugins] enabled = ["standard", "plugins"]- Hardcoded default —
["standard"].
The OSS repo itself ships with both bundles enabled via the project-level
pyproject.toml (so make dev / make benchmark work out of the box).
End-user installs that just pip install decepticon get the lean
standard-only default (neo4j and other heavy features are opt-in extras,
e.g. decepticon[neo4j]). Downstream Docker images override via
ENV DECEPTICON_PLUGINS=standard,vendor to activate their own bundle.
The OSS-shipped langgraph.json matches the lean default — it only
lists the 10 standard graphs. To expose plugin graphs to LangGraph
Platform, emit the manifest dynamically:
LANGSERVE_GRAPHS="$(python -m decepticon.graph_registry)" langgraph dev
That CLI emits the merged manifest of every active bundle plus any
external decepticon.agents entry-points.
Adding a Skill
- Create a directory:
skills/{category}/{skill-name}/ - Write
SKILL.mdfollowing the skill format - Add
references/for content over 100 lines - Add
scripts/for automation the agent should execute - Restart —
SkillsMiddlewarediscovers skills at agent boot
No registration required. Skills are discovered automatically from the agent's configured source paths.
Testing
Python tests live in decepticon/tests/. Run inside Docker for a clean environment:
make test # pytest in container
make test-local # pytest locally (requires: uv sync --dev)
CLI tests run via make quality-cli (typecheck + build + vitest), or directly:
npm run test --workspace=@decepticon/cli
When adding a new agent or tool, add corresponding tests in decepticon/tests/.
Pull Request Process
- Fork the repository
- Create a feature branch from
main:git checkout -b feat/your-feature - Make changes — keep commits focused and descriptive
- Run
make qualityand ensure all checks pass - Open a Pull Request against
main - In the PR description, include:
- What changed and why
- How to test the change
- Any relevant MITRE ATT&CK technique IDs (for new agent capabilities or skills)
Areas Where Help Is Welcome
| Area | What's needed |
|---|---|
| New skills | More OSINT, cloud attack, and post-exploitation skill coverage |
| C2 profiles | Havoc framework support (c2-havoc profile) |
| Web dashboard | UX improvements, new views, mobile responsiveness |
| Documentation | Tutorials, walkthroughs, translated READMEs |
| Bug reports | Open an issue with reproduction steps |
Community
Join the Discord to ask questions, share engagement logs, discuss techniques, or connect with others working on the project.