crucible-mcp 1.0.1__tar.gz → 1.2.0__tar.gz
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.
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/PKG-INFO +20 -3
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/README.md +19 -2
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/pyproject.toml +1 -1
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/loader.py +6 -3
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/models.py +0 -13
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/server.py +79 -529
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/PKG-INFO +20 -3
- crucible_mcp-1.2.0/tests/test_full_review.py +227 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_integration.py +18 -14
- crucible_mcp-1.0.1/tests/test_full_review.py +0 -484
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/setup.cfg +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/cli.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/domain/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/domain/detection.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/assertions.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/budget.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/error-handling.yaml +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/security.yaml +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/smart-contract.yaml +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/compliance.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/models.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/patterns.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/errors.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/hooks/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/hooks/claudecode.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/hooks/precommit.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/API_DESIGN.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/COMMITS.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/DATABASE.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/DOCUMENTATION.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/ERROR_HANDLING.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/FP.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/GITIGNORE.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/OBSERVABILITY.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/PRECOMMIT.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SECURITY.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SMART_CONTRACT.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SYSTEM_DESIGN.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/TESTING.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/TYPE_SAFETY.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/review/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/review/core.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/accessibility-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/backend-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/customer-success/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/data-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/devops-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/fde-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/formal-verification/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/gas-optimizer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/incident-responder/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/loader.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/mev-researcher/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/mobile-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/performance-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/product-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/protocol-architect/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/security-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/tech-lead/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/uiux-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/web3-engineer/SKILL.md +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/synthesis/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/tools/__init__.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/tools/delegation.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/tools/git.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/SOURCES.txt +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/dependency_links.txt +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/entry_points.txt +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/requires.txt +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/top_level.txt +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_cli.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_compliance.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_detection.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_enforcement.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_git.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_hooks_cli.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_knowledge.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_precommit.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_server.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_skills.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_skills_loader.py +0 -0
- {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: crucible-mcp
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Code review MCP server for Claude. Not affiliated with Atlassian.
|
|
5
5
|
Author: be.nvy
|
|
6
6
|
License-Expression: MIT
|
|
@@ -58,6 +58,20 @@ That's it. Crucible will now:
|
|
|
58
58
|
2. Review files Claude edits (Claude Code hook)
|
|
59
59
|
3. Block code that violates bundled assertions (security, error handling, smart contracts)
|
|
60
60
|
|
|
61
|
+
## CLAUDE.md Setup
|
|
62
|
+
|
|
63
|
+
Add to your `CLAUDE.md` to inject rules at session start:
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
# Project
|
|
67
|
+
|
|
68
|
+
At session start, call get_assertions() to load enforcement rules.
|
|
69
|
+
|
|
70
|
+
For code review: crucible review
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This tells Claude to load the active assertions *before* writing code, not just catch violations after.
|
|
74
|
+
|
|
61
75
|
## How Enforcement Works
|
|
62
76
|
|
|
63
77
|
```
|
|
@@ -109,13 +123,16 @@ Add to Claude Code (`.mcp.json`):
|
|
|
109
123
|
|
|
110
124
|
| Tool | Purpose |
|
|
111
125
|
|------|---------|
|
|
126
|
+
| `get_assertions()` | **Session start:** Load enforced patterns into context |
|
|
127
|
+
| `get_principles(topic)` | **Session start:** Load engineering knowledge by topic |
|
|
128
|
+
| `load_knowledge(files)` | **Session start:** Load specific knowledge files |
|
|
112
129
|
| `review(path)` | Full review: analysis + skills + knowledge + assertions |
|
|
113
130
|
| `review(mode='staged')` | Review git changes with enforcement |
|
|
114
|
-
| `load_knowledge(files)` | Load specific knowledge files |
|
|
115
|
-
| `get_principles(topic)` | Load engineering knowledge by topic |
|
|
116
131
|
| `delegate_*` | Direct tool access (semgrep, ruff, slither, bandit) |
|
|
117
132
|
| `check_tools()` | Show installed analysis tools |
|
|
118
133
|
|
|
134
|
+
**Tip:** Call `get_assertions()` at the start of a session so Claude knows what patterns to avoid *before* writing code.
|
|
135
|
+
|
|
119
136
|
## CLI
|
|
120
137
|
|
|
121
138
|
```bash
|
|
@@ -40,6 +40,20 @@ That's it. Crucible will now:
|
|
|
40
40
|
2. Review files Claude edits (Claude Code hook)
|
|
41
41
|
3. Block code that violates bundled assertions (security, error handling, smart contracts)
|
|
42
42
|
|
|
43
|
+
## CLAUDE.md Setup
|
|
44
|
+
|
|
45
|
+
Add to your `CLAUDE.md` to inject rules at session start:
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
# Project
|
|
49
|
+
|
|
50
|
+
At session start, call get_assertions() to load enforcement rules.
|
|
51
|
+
|
|
52
|
+
For code review: crucible review
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This tells Claude to load the active assertions *before* writing code, not just catch violations after.
|
|
56
|
+
|
|
43
57
|
## How Enforcement Works
|
|
44
58
|
|
|
45
59
|
```
|
|
@@ -91,13 +105,16 @@ Add to Claude Code (`.mcp.json`):
|
|
|
91
105
|
|
|
92
106
|
| Tool | Purpose |
|
|
93
107
|
|------|---------|
|
|
108
|
+
| `get_assertions()` | **Session start:** Load enforced patterns into context |
|
|
109
|
+
| `get_principles(topic)` | **Session start:** Load engineering knowledge by topic |
|
|
110
|
+
| `load_knowledge(files)` | **Session start:** Load specific knowledge files |
|
|
94
111
|
| `review(path)` | Full review: analysis + skills + knowledge + assertions |
|
|
95
112
|
| `review(mode='staged')` | Review git changes with enforcement |
|
|
96
|
-
| `load_knowledge(files)` | Load specific knowledge files |
|
|
97
|
-
| `get_principles(topic)` | Load engineering knowledge by topic |
|
|
98
113
|
| `delegate_*` | Direct tool access (semgrep, ruff, slither, bandit) |
|
|
99
114
|
| `check_tools()` | Show installed analysis tools |
|
|
100
115
|
|
|
116
|
+
**Tip:** Call `get_assertions()` at the start of a session so Claude knows what patterns to avoid *before* writing code.
|
|
117
|
+
|
|
101
118
|
## CLI
|
|
102
119
|
|
|
103
120
|
```bash
|
|
@@ -247,14 +247,17 @@ def get_custom_knowledge_files() -> set[str]:
|
|
|
247
247
|
|
|
248
248
|
|
|
249
249
|
def load_all_knowledge(
|
|
250
|
-
include_bundled: bool =
|
|
250
|
+
include_bundled: bool = True,
|
|
251
251
|
filenames: set[str] | None = None,
|
|
252
252
|
) -> tuple[list[str], str]:
|
|
253
253
|
"""Load multiple knowledge files.
|
|
254
254
|
|
|
255
|
+
Knowledge follows cascade priority: project > user > bundled.
|
|
256
|
+
Project/user files override bundled files with the same name.
|
|
257
|
+
|
|
255
258
|
Args:
|
|
256
|
-
include_bundled: If True, include bundled knowledge files
|
|
257
|
-
filenames: Specific files to load (if None, loads
|
|
259
|
+
include_bundled: If True, include bundled knowledge files (default: True)
|
|
260
|
+
filenames: Specific files to load (if None, loads all from cascade)
|
|
258
261
|
|
|
259
262
|
Returns:
|
|
260
263
|
Tuple of (list of loaded filenames, combined content)
|
|
@@ -61,16 +61,3 @@ DOMAIN_HEURISTICS: dict[Domain, dict[str, list[str]]] = {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
@dataclass(frozen=True)
|
|
65
|
-
class FullReviewResult:
|
|
66
|
-
"""Result from full_review tool."""
|
|
67
|
-
|
|
68
|
-
domains_detected: tuple[str, ...]
|
|
69
|
-
severity_summary: dict[str, int]
|
|
70
|
-
findings: tuple[ToolFinding, ...]
|
|
71
|
-
applicable_skills: tuple[str, ...]
|
|
72
|
-
skill_triggers_matched: dict[str, tuple[str, ...]]
|
|
73
|
-
principles_loaded: tuple[str, ...]
|
|
74
|
-
principles_content: str
|
|
75
|
-
sage_knowledge: str | None = None
|
|
76
|
-
sage_query_used: str | None = None
|