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