feat: Add intelligent auto-router and enhanced integrations

- Add intelligent-router.sh hook for automatic agent routing
- Add AUTO-TRIGGER-SUMMARY.md documentation
- Add FINAL-INTEGRATION-SUMMARY.md documentation
- Complete Prometheus integration (6 commands + 4 tools)
- Complete Dexto integration (12 commands + 5 tools)
- Enhanced Ralph with access to all agents
- Fix /clawd command (removed disable-model-invocation)
- Update hooks.json to v5 with intelligent routing
- 291 total skills now available
- All 21 commands with automatic routing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
admin
2026-01-28 00:27:56 +04:00
Unverified
parent 3b128ba3bd
commit b52318eeae
1724 changed files with 351216 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
import pytest
from prometheus.app.services.neo4j_service import Neo4jService
from prometheus.graph.knowledge_graph import KnowledgeGraph
from prometheus.neo4j.knowledge_graph_handler import KnowledgeGraphHandler
from tests.test_utils import test_project_paths
from tests.test_utils.fixtures import ( # noqa: F401
NEO4J_PASSWORD,
NEO4J_USERNAME,
empty_neo4j_container_fixture,
neo4j_container_with_kg_fixture,
)
@pytest.fixture
async def mock_neo4j_service(neo4j_container_with_kg_fixture): # noqa: F811
"""Fixture: provide a clean DatabaseService using the Postgres test container."""
neo4j_container, kg = neo4j_container_with_kg_fixture
service = Neo4jService(neo4j_container.get_connection_url(), NEO4J_USERNAME, NEO4J_PASSWORD)
service.start()
yield service
await service.close()
@pytest.fixture
async def mock_empty_neo4j_service(empty_neo4j_container_fixture): # noqa: F811
"""Fixture: provide a clean DatabaseService using the Postgres test container."""
neo4j_container = empty_neo4j_container_fixture
service = Neo4jService(neo4j_container.get_connection_url(), NEO4J_USERNAME, NEO4J_PASSWORD)
service.start()
yield service
await service.close()
@pytest.mark.slow
async def test_num_ast_nodes(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_ast_nodes = await session.execute_read(handler._read_ast_nodes, root_node_id=0)
assert len(read_ast_nodes) == 7
@pytest.mark.slow
async def test_num_file_nodes(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_file_nodes = await session.execute_read(handler._read_file_nodes, root_node_id=0)
assert len(read_file_nodes) == 7
@pytest.mark.slow
async def test_num_text_nodes(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_text_nodes = await session.execute_read(handler._read_text_nodes, root_node_id=0)
assert len(read_text_nodes) == 1
@pytest.mark.slow
async def test_num_parent_of_edges(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_parent_of_edges = await session.execute_read(
handler._read_parent_of_edges, root_node_id=0
)
assert len(read_parent_of_edges) == 4
@pytest.mark.slow
async def test_num_has_file_edges(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_has_file_edges = await session.execute_read(
handler._read_has_file_edges, root_node_id=0
)
assert len(read_has_file_edges) == 6
@pytest.mark.slow
async def test_num_has_ast_edges(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_has_ast_edges = await session.execute_read(handler._read_has_ast_edges, root_node_id=0)
assert len(read_has_ast_edges) == 3
@pytest.mark.slow
async def test_num_has_text_edges(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_has_text_edges = await session.execute_read(
handler._read_has_text_edges, root_node_id=0
)
assert len(read_has_text_edges) == 1
@pytest.mark.slow
async def test_num_next_chunk_edges(mock_neo4j_service):
handler = KnowledgeGraphHandler(mock_neo4j_service.neo4j_driver, 100)
async with mock_neo4j_service.neo4j_driver.session() as session:
read_next_chunk_edges = await session.execute_read(
handler._read_next_chunk_edges, root_node_id=0
)
assert len(read_next_chunk_edges) == 0
@pytest.mark.slow
async def test_clear_knowledge_graph(mock_empty_neo4j_service):
kg = KnowledgeGraph(1, 1000, 100, 0)
await kg.build_graph(test_project_paths.TEST_PROJECT_PATH)
driver = mock_empty_neo4j_service.neo4j_driver
handler = KnowledgeGraphHandler(driver, 100)
await handler.write_knowledge_graph(kg)
await handler.clear_knowledge_graph(0)
# Verify that the graph is cleared
async with driver.session() as session:
result = await session.run("MATCH (n) RETURN COUNT(n) AS node_count")
record = await result.single()
node_count = record["node_count"]
assert node_count == 0