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.
Files changed (86) hide show
  1. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/PKG-INFO +20 -3
  2. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/README.md +19 -2
  3. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/pyproject.toml +1 -1
  4. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/loader.py +6 -3
  5. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/models.py +0 -13
  6. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/server.py +79 -529
  7. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/PKG-INFO +20 -3
  8. crucible_mcp-1.2.0/tests/test_full_review.py +227 -0
  9. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_integration.py +18 -14
  10. crucible_mcp-1.0.1/tests/test_full_review.py +0 -484
  11. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/setup.cfg +0 -0
  12. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/__init__.py +0 -0
  13. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/cli.py +0 -0
  14. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/domain/__init__.py +0 -0
  15. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/domain/detection.py +0 -0
  16. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/__init__.py +0 -0
  17. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/assertions.py +0 -0
  18. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/budget.py +0 -0
  19. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/error-handling.yaml +0 -0
  20. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/security.yaml +0 -0
  21. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/bundled/smart-contract.yaml +0 -0
  22. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/compliance.py +0 -0
  23. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/models.py +0 -0
  24. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/enforcement/patterns.py +0 -0
  25. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/errors.py +0 -0
  26. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/hooks/__init__.py +0 -0
  27. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/hooks/claudecode.py +0 -0
  28. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/hooks/precommit.py +0 -0
  29. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/__init__.py +0 -0
  30. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/API_DESIGN.md +0 -0
  31. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/COMMITS.md +0 -0
  32. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/DATABASE.md +0 -0
  33. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/DOCUMENTATION.md +0 -0
  34. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/ERROR_HANDLING.md +0 -0
  35. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/FP.md +0 -0
  36. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/GITIGNORE.md +0 -0
  37. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/OBSERVABILITY.md +0 -0
  38. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/PRECOMMIT.md +0 -0
  39. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SECURITY.md +0 -0
  40. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SMART_CONTRACT.md +0 -0
  41. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/SYSTEM_DESIGN.md +0 -0
  42. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/TESTING.md +0 -0
  43. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/knowledge/principles/TYPE_SAFETY.md +0 -0
  44. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/review/__init__.py +0 -0
  45. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/review/core.py +0 -0
  46. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/__init__.py +0 -0
  47. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/accessibility-engineer/SKILL.md +0 -0
  48. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/backend-engineer/SKILL.md +0 -0
  49. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/customer-success/SKILL.md +0 -0
  50. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/data-engineer/SKILL.md +0 -0
  51. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/devops-engineer/SKILL.md +0 -0
  52. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/fde-engineer/SKILL.md +0 -0
  53. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/formal-verification/SKILL.md +0 -0
  54. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/gas-optimizer/SKILL.md +0 -0
  55. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/incident-responder/SKILL.md +0 -0
  56. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/loader.py +0 -0
  57. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/mev-researcher/SKILL.md +0 -0
  58. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/mobile-engineer/SKILL.md +0 -0
  59. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/performance-engineer/SKILL.md +0 -0
  60. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/product-engineer/SKILL.md +0 -0
  61. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/protocol-architect/SKILL.md +0 -0
  62. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/security-engineer/SKILL.md +0 -0
  63. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/tech-lead/SKILL.md +0 -0
  64. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/uiux-engineer/SKILL.md +0 -0
  65. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/skills/web3-engineer/SKILL.md +0 -0
  66. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/synthesis/__init__.py +0 -0
  67. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/tools/__init__.py +0 -0
  68. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/tools/delegation.py +0 -0
  69. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible/tools/git.py +0 -0
  70. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/SOURCES.txt +0 -0
  71. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/dependency_links.txt +0 -0
  72. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/entry_points.txt +0 -0
  73. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/requires.txt +0 -0
  74. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/src/crucible_mcp.egg-info/top_level.txt +0 -0
  75. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_cli.py +0 -0
  76. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_compliance.py +0 -0
  77. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_detection.py +0 -0
  78. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_enforcement.py +0 -0
  79. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_git.py +0 -0
  80. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_hooks_cli.py +0 -0
  81. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_knowledge.py +0 -0
  82. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_precommit.py +0 -0
  83. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_server.py +0 -0
  84. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_skills.py +0 -0
  85. {crucible_mcp-1.0.1 → crucible_mcp-1.2.0}/tests/test_skills_loader.py +0 -0
  86. {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.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
  ```
@@ -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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "crucible-mcp"
3
- version = "1.0.1"
3
+ version = "1.2.0"
4
4
  description = "Code review MCP server for Claude. Not affiliated with Atlassian."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -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 = False,
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 based on include_bundled)
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