crucible-mcp 1.1.0__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.1.0 → crucible_mcp-1.2.0}/PKG-INFO +15 -1
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/README.md +14 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/pyproject.toml +1 -1
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/loader.py +6 -3
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/models.py +0 -13
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/server.py +7 -528
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/PKG-INFO +15 -1
- crucible_mcp-1.2.0/tests/test_full_review.py +227 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_integration.py +18 -14
- crucible_mcp-1.1.0/tests/test_full_review.py +0 -484
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/setup.cfg +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/cli.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/domain/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/domain/detection.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/assertions.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/budget.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/error-handling.yaml +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/security.yaml +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/smart-contract.yaml +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/compliance.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/models.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/enforcement/patterns.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/errors.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/hooks/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/hooks/claudecode.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/hooks/precommit.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/API_DESIGN.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/COMMITS.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/DATABASE.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/DOCUMENTATION.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/ERROR_HANDLING.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/FP.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/GITIGNORE.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/OBSERVABILITY.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/PRECOMMIT.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SECURITY.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SMART_CONTRACT.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SYSTEM_DESIGN.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/TESTING.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/TYPE_SAFETY.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/review/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/review/core.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/accessibility-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/backend-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/customer-success/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/data-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/devops-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/fde-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/formal-verification/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/gas-optimizer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/incident-responder/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/loader.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/mev-researcher/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/mobile-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/performance-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/product-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/protocol-architect/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/security-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/tech-lead/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/uiux-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/skills/web3-engineer/SKILL.md +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/synthesis/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/tools/__init__.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/tools/delegation.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible/tools/git.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/SOURCES.txt +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/dependency_links.txt +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/entry_points.txt +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/requires.txt +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/top_level.txt +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_cli.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_compliance.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_detection.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_enforcement.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_git.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_hooks_cli.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_knowledge.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_precommit.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_server.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_skills.py +0 -0
- {crucible_mcp-1.1.0 → crucible_mcp-1.2.0}/tests/test_skills_loader.py +0 -0
- {crucible_mcp-1.1.0 → 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.
|
|
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
|
```
|
|
@@ -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
|
```
|
|
@@ -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
|