runner.py: use 'from bot_bottle import api' (satisfies R0402) with
type: ignore and pylint disable for the cross-branch dependency on
bot_bottle.api (added in PR #318, which merges before this one).
sidecar.py: add pylint disable for intentional broad-exception-caught.
test_runner.py: annotate _make_api_stub(**overrides: object) -> Any and
type stub variable as Any to allow attribute assignment without
type: ignore per-line.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- test_contrib_gitea_client: remove unused Any import, fix _mock_response
to use return_value instead of lambda (unknown lambda type), narrow
HTTPError hdrs type, add type annotations to fake_urlopen helpers,
suppress protected-access for _request tests
- test_bootstrap: annotate **kw as **kw: object, use dict literal,
unpack server_address via index to avoid tuple type mismatch
- test_main: remove unused MagicMock import
- test_watchdog: guard store.get() result before accessing .status
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Moves the orchestrator into bot_bottle/orchestrator/ so one install gets
everything. Entry point is now `python -m bot_bottle.orchestrator run`.
- Add bot_bottle/orchestrator/ with all 14 modules (verbatim move; internal
imports were already relative, so no changes inside orchestrator modules)
- Rewrite bootstrap.py: remove the lazy bot_bottle import guard, use direct
relative imports from ..contrib.*
- Add bot_bottle/contrib/forge/base.py: ScopedForge (read-anywhere / write-scoped)
- Add bot_bottle/contrib/gitea/client.py: GiteaClient + GiteaForge (urllib.request only)
- Add bot_bottle/contrib/gitea/forge_state.py: ForgeState + SqliteForgeStateStore
- Add tests/unit/orchestrator/ (82 tests: 63 migrated + 19 new for contrib modules)
Closes#321