- 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