diff --git a/AGENTS.md b/AGENTS.md index 543ca2f..0dcffa0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -69,6 +69,46 @@ The Hermes loop orchestrator must: --- +## QA Philosophy — File Issues, Don't Stay Quiet + +Every agent is a quality engineer. When you see something wrong, broken, +slow, or missing — **file a Gitea issue**. Don't fix it silently. Don't +ignore it. Don't wait for someone to notice. + +**Escalate bugs:** +- Test failures → file with traceback, tag `[bug]` +- Flaky tests → file with reproduction details +- Runtime errors → file with steps to reproduce +- Broken behavior on main → file IMMEDIATELY + +**Propose improvements — don't be shy:** +- Slow function? File `[optimization]` +- Missing capability? File `[feature]` +- Dead code / tech debt? File `[refactor]` +- Idea to make Timmy smarter? File `[timmy-capability]` +- Gap between SOUL.md and reality? File `[soul-gap]` + +Bad ideas get closed. Good ideas get built. File them all. + +When the issue queue runs low, that's a signal to **look harder**, not relax. + +## Dogfooding — Timmy Is Our Product, Use Him + +Timmy is not just the thing we're building. He's our teammate and our +test subject. Every feature we give him should be **used by the agents +building him**. + +- When Timmy gets a new tool, start using it immediately. +- When Timmy gets a new capability, integrate it into the workflow. +- When Timmy fails at something, file a `[timmy-capability]` issue. +- His failures are our roadmap. + +The goal: Timmy should be so woven into the development process that +removing him would hurt. Triage, review, architecture discussion, +self-testing, reflection — use every tool he has. + +--- + ## Agent Roster ### Build Tier diff --git a/src/config.py b/src/config.py index c27b17c..503d2a2 100644 --- a/src/config.py +++ b/src/config.py @@ -252,7 +252,7 @@ class Settings(BaseSettings): # ── MCP Servers ──────────────────────────────────────────────────── # External tool servers connected via Model Context Protocol (stdio). - mcp_gitea_command: str = "gitea-mcp -t stdio" + mcp_gitea_command: str = "gitea-mcp-server -t stdio" mcp_filesystem_command: str = "npx -y @modelcontextprotocol/server-filesystem" mcp_timeout: int = 15 diff --git a/src/timmy/mcp_tools.py b/src/timmy/mcp_tools.py index 66cc703..128c9b4 100644 --- a/src/timmy/mcp_tools.py +++ b/src/timmy/mcp_tools.py @@ -40,7 +40,7 @@ def _parse_command(command_str: str) -> tuple[str, list[str]]: """Split a command string into (executable, args). Handles ``~/`` expansion and resolves via PATH if needed. - E.g. ``"gitea-mcp -t stdio"`` → ``("/Users/x/go/bin/gitea-mcp", ["-t", "stdio"])`` + E.g. ``"gitea-mcp-server -t stdio"`` → ``("/opt/homebrew/bin/gitea-mcp-server", ["-t", "stdio"])`` """ parts = command_str.split() executable = os.path.expanduser(parts[0]) diff --git a/tests/timmy/test_cli.py b/tests/timmy/test_cli.py index f069048..83c5240 100644 --- a/tests/timmy/test_cli.py +++ b/tests/timmy/test_cli.py @@ -282,7 +282,7 @@ def test_repl_skips_empty_input(): patch("timmy.session.chat") as mock_chat, ): mock_chat.return_value = "Response" - result = runner.invoke(app, ["repl"]) + runner.invoke(app, ["repl"]) # chat should only be called once (for "hello"), empty lines are skipped, exit breaks assert mock_chat.call_count == 1 diff --git a/tests/timmy/test_introspection.py b/tests/timmy/test_introspection.py index c143947..c91989a 100644 --- a/tests/timmy/test_introspection.py +++ b/tests/timmy/test_introspection.py @@ -3,6 +3,7 @@ from unittest.mock import MagicMock, patch import httpx +import pytest def test_get_system_info_returns_dict(): @@ -163,6 +164,7 @@ class TestGetOllamaModelExactMatch: class TestRunSelfTests: """Tests for run_self_tests() — Timmy's self-verification tool.""" + @pytest.mark.slow def test_returns_dict_with_expected_keys(self): """run_self_tests should return structured test results.""" from timmy.tools_intro import run_self_tests