feat(KIN-010): implement rebuild-frontend post-pipeline hook
- scripts/rebuild-frontend.sh: builds Vue 3 frontend and restarts uvicorn API - cli/main.py: hook group with add/list/remove/logs/setup commands; `hook setup` idempotently registers rebuild-frontend for a project - agents/runner.py: call run_hooks(event="pipeline_completed") after successful pipeline; wrap in try/except so hook errors never block results - tests: 3 tests for hook_setup CLI + 3 tests for pipeline→hooks integration Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
6705b302f7
commit
01b269e2b8
6 changed files with 355 additions and 2 deletions
|
|
@ -249,6 +249,45 @@ class TestRunPipeline:
|
|||
assert result["success"] is False
|
||||
assert "not found" in result["error"]
|
||||
|
||||
@patch("agents.runner.run_hooks")
|
||||
@patch("agents.runner.subprocess.run")
|
||||
def test_hooks_called_after_successful_pipeline(self, mock_run, mock_hooks, conn):
|
||||
mock_run.return_value = _mock_claude_success({"result": "done"})
|
||||
mock_hooks.return_value = []
|
||||
|
||||
steps = [{"role": "debugger", "brief": "find"}]
|
||||
result = run_pipeline(conn, "VDOL-001", steps)
|
||||
|
||||
assert result["success"] is True
|
||||
mock_hooks.assert_called_once()
|
||||
call_kwargs = mock_hooks.call_args
|
||||
assert call_kwargs[1].get("event") == "pipeline_completed" or \
|
||||
call_kwargs[0][3] == "pipeline_completed"
|
||||
|
||||
@patch("agents.runner.run_hooks")
|
||||
@patch("agents.runner.subprocess.run")
|
||||
def test_hooks_not_called_on_failed_pipeline(self, mock_run, mock_hooks, conn):
|
||||
mock_run.return_value = _mock_claude_failure("compilation error")
|
||||
mock_hooks.return_value = []
|
||||
|
||||
steps = [{"role": "debugger", "brief": "find"}]
|
||||
result = run_pipeline(conn, "VDOL-001", steps)
|
||||
|
||||
assert result["success"] is False
|
||||
mock_hooks.assert_not_called()
|
||||
|
||||
@patch("agents.runner.run_hooks")
|
||||
@patch("agents.runner.subprocess.run")
|
||||
def test_hook_failure_does_not_affect_pipeline_result(self, mock_run, mock_hooks, conn):
|
||||
mock_run.return_value = _mock_claude_success({"result": "done"})
|
||||
mock_hooks.side_effect = Exception("hook exploded")
|
||||
|
||||
steps = [{"role": "debugger", "brief": "find"}]
|
||||
# Must not raise — hook failures must not propagate
|
||||
result = run_pipeline(conn, "VDOL-001", steps)
|
||||
|
||||
assert result["success"] is True
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# JSON parsing
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue