Track requirements, code, and tests in a knowledge graph. Query for coverage gaps and impact analysis.
- Scans any codebase (Python, JavaScript, Go, Rust, etc.)
- Builds a graph linking requirements → code → tests
- Finds untested requirements and orphan tests
- Uses any LLM to understand your code
git clone https://github.com/dromologue/dromo2.git
cd dromo2./scripts/setup.shThe wizard will:
- Check prerequisites
- Let you choose an LLM (Claude, GPT, Ollama, or custom)
- Configure your API key
- Initialize your repository
Edit specs/SPEC.md in your project:
## REQ-001: User Authentication
Users can log in with email and password.
**Acceptance Criteria:**
- [ ] AC-001-01: Valid credentials return session token
- [ ] AC-001-02: Invalid credentials return 401In source files:
// IMPLEMENTS: REQ-001
function login(email, password) {
// ...
}In test files:
// SPEC: AC-001-01
test('returns session token for valid credentials', () => {
// ...
});./scripts/scan-kb.sh?- query_untested(R). % Find untested criteria
?- query_coverage(R). % Get coverage stats
?- query_orphans(R). % Find tests without specs| Provider | Model | API Key |
|---|---|---|
| Anthropic | claude-sonnet-4-20250514 | ANTHROPIC_API_KEY |
| OpenAI | gpt-4o | OPENAI_API_KEY |
| Ollama | llama3 | (none) |
| Custom | (any) | CUSTOM_API_KEY |
If you prefer not to use the wizard:
- SWI-Prolog 8.0+
- jq and curl
# Anthropic
export ANTHROPIC_API_KEY="your-key"
# OpenAI
export OPENAI_API_KEY="your-key"
# Ollama (no key needed)
ollama servecd /path/to/your/project
swipl -g "
use_module('/path/to/dromo2/src/agent'),
init_repo('.')
" -t haltswipl -g "
use_module('/path/to/dromo2/src/agent'),
use_module('/path/to/dromo2/src/kb_llm_parser'),
set_llm_provider(anthropic),
scan_repo('.')
" -t haltyour-project/
├── specs/
│ ├── SPEC.md # Your requirements
│ └── .kb-agent.conf # Agent configuration
├── src/ # Your source code
├── test/ # Your tests
└── scripts/
├── scan-kb.sh # Run scans
└── query-kb.sh # Interactive queries
## REQ-XXX: Requirement Title
Description.
**Acceptance Criteria:**
- [ ] AC-XXX-01: Criterion description
- [x] AC-XXX-02: Completed criterion# IMPLEMENTS: REQ-001
# IMPLEMENTS: REQ-001, REQ-002// IMPLEMENTS: REQ-001
/* IMPLEMENTS: REQ-001 */// IMPLEMENTS: REQ-001# SPEC: AC-001-01
def test_something():
pass// SPEC: AC-001-01, AC-001-02
test('description', () => {});| Query | Description |
|---|---|
status |
Show summary statistics |
query_untested(R) |
Find untested acceptance criteria |
query_unimplemented(R) |
Find requirements without implementations |
query_orphans(R) |
Find tests without SPEC markers |
query_coverage(R) |
Get coverage percentages |
query_impact(module(X), R) |
Find tests affected by changing module X |
query_requirement('REQ-001', R) |
Get details for a requirement |
dump_knowledge_graph |
Print all facts |
export_knowledge_graph_json('out.json') |
Export to JSON |
- Technical Deep Dive — How the agent works internally
MIT