dravix-agent 0.1.0
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.
- package/.claude/settings.example.json +30 -0
- package/ARCHITECTURE.md +410 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/ROADMAP.md +117 -0
- package/data/vulnkb.json +666 -0
- package/dist/bin/aegis.d.ts +3 -0
- package/dist/bin/aegis.d.ts.map +1 -0
- package/dist/bin/aegis.js +489 -0
- package/dist/bin/aegis.js.map +1 -0
- package/dist/cache.d.ts +9 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +146 -0
- package/dist/cache.js.map +1 -0
- package/dist/engines/ai-sinks.d.ts +52 -0
- package/dist/engines/ai-sinks.d.ts.map +1 -0
- package/dist/engines/ai-sinks.js +204 -0
- package/dist/engines/ai-sinks.js.map +1 -0
- package/dist/engines/eslint.d.ts +9 -0
- package/dist/engines/eslint.d.ts.map +1 -0
- package/dist/engines/eslint.js +245 -0
- package/dist/engines/eslint.js.map +1 -0
- package/dist/engines/joern.d.ts +3 -0
- package/dist/engines/joern.d.ts.map +1 -0
- package/dist/engines/joern.js +98 -0
- package/dist/engines/joern.js.map +1 -0
- package/dist/engines/js-sinks.d.ts +70 -0
- package/dist/engines/js-sinks.d.ts.map +1 -0
- package/dist/engines/js-sinks.js +370 -0
- package/dist/engines/js-sinks.js.map +1 -0
- package/dist/engines/llm-critic.d.ts +130 -0
- package/dist/engines/llm-critic.d.ts.map +1 -0
- package/dist/engines/llm-critic.js +551 -0
- package/dist/engines/llm-critic.js.map +1 -0
- package/dist/engines/pragma.d.ts +20 -0
- package/dist/engines/pragma.d.ts.map +1 -0
- package/dist/engines/pragma.js +83 -0
- package/dist/engines/pragma.js.map +1 -0
- package/dist/engines/property-test.d.ts +3 -0
- package/dist/engines/property-test.d.ts.map +1 -0
- package/dist/engines/property-test.js +134 -0
- package/dist/engines/property-test.js.map +1 -0
- package/dist/engines/pyright.d.ts +10 -0
- package/dist/engines/pyright.d.ts.map +1 -0
- package/dist/engines/pyright.js +143 -0
- package/dist/engines/pyright.js.map +1 -0
- package/dist/engines/pysa.d.ts +3 -0
- package/dist/engines/pysa.d.ts.map +1 -0
- package/dist/engines/pysa.js +83 -0
- package/dist/engines/pysa.js.map +1 -0
- package/dist/engines/python-sinks.d.ts +82 -0
- package/dist/engines/python-sinks.d.ts.map +1 -0
- package/dist/engines/python-sinks.js +459 -0
- package/dist/engines/python-sinks.js.map +1 -0
- package/dist/engines/registry.d.ts +26 -0
- package/dist/engines/registry.d.ts.map +1 -0
- package/dist/engines/registry.js +70 -0
- package/dist/engines/registry.js.map +1 -0
- package/dist/engines/secret-scan.d.ts +22 -0
- package/dist/engines/secret-scan.d.ts.map +1 -0
- package/dist/engines/secret-scan.js +179 -0
- package/dist/engines/secret-scan.js.map +1 -0
- package/dist/engines/semgrep.d.ts +10 -0
- package/dist/engines/semgrep.d.ts.map +1 -0
- package/dist/engines/semgrep.js +200 -0
- package/dist/engines/semgrep.js.map +1 -0
- package/dist/engines/treesitter.d.ts +18 -0
- package/dist/engines/treesitter.d.ts.map +1 -0
- package/dist/engines/treesitter.js +135 -0
- package/dist/engines/treesitter.js.map +1 -0
- package/dist/engines/tsc.d.ts +10 -0
- package/dist/engines/tsc.d.ts.map +1 -0
- package/dist/engines/tsc.js +142 -0
- package/dist/engines/tsc.js.map +1 -0
- package/dist/engines/types.d.ts +47 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +27 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/findings.d.ts +121 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +98 -0
- package/dist/findings.js.map +1 -0
- package/dist/hooks/claude-code.d.ts +3 -0
- package/dist/hooks/claude-code.d.ts.map +1 -0
- package/dist/hooks/claude-code.js +187 -0
- package/dist/hooks/claude-code.js.map +1 -0
- package/dist/index/context.d.ts +127 -0
- package/dist/index/context.d.ts.map +1 -0
- package/dist/index/context.js +267 -0
- package/dist/index/context.js.map +1 -0
- package/dist/index/embeddings.d.ts +68 -0
- package/dist/index/embeddings.d.ts.map +1 -0
- package/dist/index/embeddings.js +570 -0
- package/dist/index/embeddings.js.map +1 -0
- package/dist/index/graph_routing.d.ts +36 -0
- package/dist/index/graph_routing.d.ts.map +1 -0
- package/dist/index/graph_routing.js +170 -0
- package/dist/index/graph_routing.js.map +1 -0
- package/dist/index/joern.d.ts +76 -0
- package/dist/index/joern.d.ts.map +1 -0
- package/dist/index/joern.js +782 -0
- package/dist/index/joern.js.map +1 -0
- package/dist/index/property-test.d.ts +88 -0
- package/dist/index/property-test.d.ts.map +1 -0
- package/dist/index/property-test.js +466 -0
- package/dist/index/property-test.js.map +1 -0
- package/dist/index/proto/scip.proto +897 -0
- package/dist/index/pysa.d.ts +91 -0
- package/dist/index/pysa.d.ts.map +1 -0
- package/dist/index/pysa.js +617 -0
- package/dist/index/pysa.js.map +1 -0
- package/dist/index/scip.d.ts +76 -0
- package/dist/index/scip.d.ts.map +1 -0
- package/dist/index/scip.js +541 -0
- package/dist/index/scip.js.map +1 -0
- package/dist/index/vulrag.d.ts +86 -0
- package/dist/index/vulrag.d.ts.map +1 -0
- package/dist/index/vulrag.js +242 -0
- package/dist/index/vulrag.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install/claude-code.d.ts +31 -0
- package/dist/install/claude-code.d.ts.map +1 -0
- package/dist/install/claude-code.js +447 -0
- package/dist/install/claude-code.js.map +1 -0
- package/dist/lang.d.ts +5 -0
- package/dist/lang.d.ts.map +1 -0
- package/dist/lang.js +52 -0
- package/dist/lang.js.map +1 -0
- package/dist/learning/suppressions.d.ts +70 -0
- package/dist/learning/suppressions.d.ts.map +1 -0
- package/dist/learning/suppressions.js +179 -0
- package/dist/learning/suppressions.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +187 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/explain.d.ts +58 -0
- package/dist/mcp/tools/explain.d.ts.map +1 -0
- package/dist/mcp/tools/explain.js +60 -0
- package/dist/mcp/tools/explain.js.map +1 -0
- package/dist/mcp/tools/precheck.d.ts +29 -0
- package/dist/mcp/tools/precheck.d.ts.map +1 -0
- package/dist/mcp/tools/precheck.js +42 -0
- package/dist/mcp/tools/precheck.js.map +1 -0
- package/dist/mcp/tools/validate.d.ts +73 -0
- package/dist/mcp/tools/validate.d.ts.map +1 -0
- package/dist/mcp/tools/validate.js +66 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/warm.d.ts +88 -0
- package/dist/mcp/warm.d.ts.map +1 -0
- package/dist/mcp/warm.js +331 -0
- package/dist/mcp/warm.js.map +1 -0
- package/dist/orchestrator.d.ts +46 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +596 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/policy.d.ts +51 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +201 -0
- package/dist/policy.js.map +1 -0
- package/dist/risk.d.ts +31 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +92 -0
- package/dist/risk.js.map +1 -0
- package/dist/stats.d.ts +72 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +217 -0
- package/dist/stats.js.map +1 -0
- package/dist/telemetry/collector.d.ts +10 -0
- package/dist/telemetry/collector.d.ts.map +1 -0
- package/dist/telemetry/collector.js +75 -0
- package/dist/telemetry/collector.js.map +1 -0
- package/dist/telemetry/consent.d.ts +9 -0
- package/dist/telemetry/consent.d.ts.map +1 -0
- package/dist/telemetry/consent.js +42 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/installation.d.ts +2 -0
- package/dist/telemetry/installation.d.ts.map +1 -0
- package/dist/telemetry/installation.js +32 -0
- package/dist/telemetry/installation.js.map +1 -0
- package/dist/telemetry/sanitizer.d.ts +5 -0
- package/dist/telemetry/sanitizer.d.ts.map +1 -0
- package/dist/telemetry/sanitizer.js +60 -0
- package/dist/telemetry/sanitizer.js.map +1 -0
- package/dist/telemetry/types.d.ts +39 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +4 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/telemetry/uploader.d.ts +12 -0
- package/dist/telemetry/uploader.d.ts.map +1 -0
- package/dist/telemetry/uploader.js +92 -0
- package/dist/telemetry/uploader.js.map +1 -0
- package/dist/util/logger.d.ts +19 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +58 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/safe-paths.d.ts +8 -0
- package/dist/util/safe-paths.d.ts.map +1 -0
- package/dist/util/safe-paths.js +102 -0
- package/dist/util/safe-paths.js.map +1 -0
- package/dist/util/subprocess.d.ts +32 -0
- package/dist/util/subprocess.d.ts.map +1 -0
- package/dist/util/subprocess.js +137 -0
- package/dist/util/subprocess.js.map +1 -0
- package/package.json +93 -0
package/ROADMAP.md
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Aegis-v2 Roadmap
|
|
2
|
+
|
|
3
|
+
Phase 0 ships in this session. Phase 1-3 ship in their own sessions, each
|
|
4
|
+
phase fully production-ready — no stubs left behind.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Phase 0 — Real-time Phase-0 gate (SHIPPED)
|
|
9
|
+
|
|
10
|
+
**Status:** Done.
|
|
11
|
+
|
|
12
|
+
**What ships:**
|
|
13
|
+
- `aegis` CLI: `mcp`, `hook`, `scan`, `doctor`, `--version`.
|
|
14
|
+
- MCP server (stdio) exposing `precheck_change`, `validate_edit`, `explain_risk`.
|
|
15
|
+
- Engines: `secret-scan` (built-in), `treesitter`, `eslint`, `pyright`, `tsc`, `semgrep`.
|
|
16
|
+
- Orchestrator: parallel run, per-engine + total timeout, LMDB cache.
|
|
17
|
+
- Risk scoring: confidence × severity → ALLOW / WARN / BLOCK; exit 0 / 2.
|
|
18
|
+
- Path safety: deny home-secret + system paths; reject outside-root.
|
|
19
|
+
- Audit log: append-only `.aegis/audit.jsonl`.
|
|
20
|
+
- Claude Code hook config (`.claude/settings.example.json`).
|
|
21
|
+
- Tests: findings schema, lang, risk, secret-scan, tree-sitter, eslint, orchestrator.
|
|
22
|
+
|
|
23
|
+
**Exit criteria (met):**
|
|
24
|
+
- `npm install && npm run build && npm test` passes on this machine.
|
|
25
|
+
- `aegis doctor` prints engine availability.
|
|
26
|
+
- `aegis scan tests/fixtures/with_secret.ts` blocks (exit 2).
|
|
27
|
+
- `aegis scan tests/fixtures/clean.py` allows (exit 0).
|
|
28
|
+
- Hook config attaches to Claude Code and blocks a `Write` with secrets.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Phase 1 — Project-aware context (NEXT)
|
|
33
|
+
|
|
34
|
+
**Goal:** raise recall on cross-file bugs by giving every engine the
|
|
35
|
+
project graph + symbol resolution + similar-code retrieval.
|
|
36
|
+
|
|
37
|
+
**Deliverables:**
|
|
38
|
+
- `src/index/scip.ts` — wrapper around `scip-typescript` and `scip-python`;
|
|
39
|
+
builds an incremental SCIP index of the project; LMDB-backed lookup
|
|
40
|
+
for `defOf(sym)` / `refsOf(sym)` / `callersOf(fn)` in O(log n).
|
|
41
|
+
- `src/index/joern.ts` — Joern CPG: invoke `joern-parse` once per project,
|
|
42
|
+
store CPG in OverflowDB; query API for `dataFlow(src, sink)` and
|
|
43
|
+
`cpg.method.name("X").caller`. Incremental update on file save.
|
|
44
|
+
- `src/index/embeddings.ts` — local `CodeT5p-110M` (ONNX) embedder via
|
|
45
|
+
`@xenova/transformers` (no Python dep); FAISS-style brute-force top-K
|
|
46
|
+
on small projects, `hnswlib-node` on larger ones.
|
|
47
|
+
- `src/engines/context.ts` — uses the three indexes to enrich the
|
|
48
|
+
Tier-1 prompt with focused, per-symbol context (not generic dump).
|
|
49
|
+
- Updated `validate_edit` returns a `project_context` block alongside
|
|
50
|
+
the findings list — the LLM critic in Phase 2 will consume it.
|
|
51
|
+
|
|
52
|
+
**Exit criteria:**
|
|
53
|
+
- Indexing fixme/argus (~100 files) completes in < 5 s cold, < 200 ms incremental.
|
|
54
|
+
- Cross-file lookup (`callers_of("require_admin")`) returns the right call site.
|
|
55
|
+
- Latency budget: p50 ≤ 600 ms (Phase 0 + Phase 1 combined).
|
|
56
|
+
- New tests: SCIP index, Joern query, embedding round-trip, focused-context block.
|
|
57
|
+
|
|
58
|
+
**Cite-tools:** RepoGraph (ICLR 2025), SCIP (Sourcegraph), Joern, CodeT5+.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Phase 2 — Deep semantic + critic
|
|
63
|
+
|
|
64
|
+
**Goal:** catch the bugs no static analyzer alone can — taint reachability,
|
|
65
|
+
race conditions, deep logic — by combining best-of-class OSS analyzers
|
|
66
|
+
with an LLM critic that reasons over a *retrieved evidence trail*
|
|
67
|
+
(Vul-RAG pattern; +16-24% over pure-LLM per Du 2024).
|
|
68
|
+
|
|
69
|
+
**Deliverables:**
|
|
70
|
+
- `src/engines/pysa.ts` — Pyre/Pysa taint analysis for Python; pre-warmed
|
|
71
|
+
function summaries cached per commit; sub-second per-file query.
|
|
72
|
+
- `src/engines/racerd.ts` — Joern-CPGQL race queries for Python/TS/JS
|
|
73
|
+
modeled on RacerD's `NoThread` / `AnyThread` lattice; static candidates
|
|
74
|
+
+ post-filter.
|
|
75
|
+
- `src/engines/vulrag.ts` — local vector store of CVE knowledge (cause +
|
|
76
|
+
vuln-pattern + fix-pattern + CWE), populated from the existing 313K-row
|
|
77
|
+
argus corpus; retrieval by `(cwe, semantic)`.
|
|
78
|
+
- `src/engines/router-150m.ts` — local 150M classifier (ONNX, INT8) that
|
|
79
|
+
routes each edit to `pass` / `lint` / `deep_review`.
|
|
80
|
+
- `src/engines/llm-critic.ts` — calls Claude/GPT with structured evidence
|
|
81
|
+
(diff + Joern path + Vul-RAG knowledge + callers); returns
|
|
82
|
+
`{verdict, cwe, evidence, fix, confidence}`. Ensemble vote with a
|
|
83
|
+
second-vendor model.
|
|
84
|
+
|
|
85
|
+
**Exit criteria:**
|
|
86
|
+
- Catches 4/6 planted bugs in the argus smoke test (vs. 1/6 today).
|
|
87
|
+
- p50 ≤ 1.0 s for non-critic path; p95 ≤ 4 s with critic.
|
|
88
|
+
- LLM critic budget cap: 10% of edits / $0.05 max per call.
|
|
89
|
+
|
|
90
|
+
**Cite-tools:** Pysa, Infer/RacerD, Vul-RAG (arxiv 2406.11147), IRIS (ICLR 2025).
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Phase 3 — Production hardening
|
|
95
|
+
|
|
96
|
+
**Goal:** suppression learning + telemetry + property-based testing gate +
|
|
97
|
+
policy-as-code — what turns a working prototype into something a team can rely on.
|
|
98
|
+
|
|
99
|
+
**Deliverables:**
|
|
100
|
+
- `src/learning/suppressions.ts` — every `accepted` / `rejected` /
|
|
101
|
+
`edited-then-saved` outcome appended; weekly re-tunes the router and
|
|
102
|
+
per-rule confidence priors.
|
|
103
|
+
- `src/learning/telemetry.ts` — local p50/p95/p99 dashboard via a small
|
|
104
|
+
CLI command (`aegis stats`).
|
|
105
|
+
- `src/engines/property-tests.ts` — for high-suspicion functions
|
|
106
|
+
(money/auth/perm), LLM emits a Hypothesis (Python) or fast-check (JS/TS)
|
|
107
|
+
property; runner executes in subprocess sandbox; counterexample = proven bug.
|
|
108
|
+
- `src/policy.ts` — YAML-driven policy: `CWE-89 → BLOCK`,
|
|
109
|
+
`CWE-704 → WARN`, etc.; per-project override.
|
|
110
|
+
|
|
111
|
+
**Exit criteria:**
|
|
112
|
+
- Suppression-aware re-training reduces FP rate by ≥ 20% over baseline.
|
|
113
|
+
- Property-test gate catches at least one of: tax-before-discount,
|
|
114
|
+
cache stampede, off-by-one in argus smoke test.
|
|
115
|
+
- `aegis stats` shows true p50/p95 from real audit log.
|
|
116
|
+
|
|
117
|
+
**Cite-tools:** Hypothesis ghostwriter, fast-check, Fuzz4All (arxiv 2308.04748).
|