chat-bridge-mcp 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chat_bridge_mcp-0.2.0/.gitignore +42 -0
- chat_bridge_mcp-0.2.0/.gitignore.bak.20260919T080445Z +11 -0
- chat_bridge_mcp-0.2.0/AGENTS.md +103 -0
- chat_bridge_mcp-0.2.0/CHANGELOG.md +152 -0
- chat_bridge_mcp-0.2.0/CLAUDE.md +41 -0
- chat_bridge_mcp-0.2.0/PKG-INFO +340 -0
- chat_bridge_mcp-0.2.0/README.md +312 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/__init__.py +3 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/__main__.py +11 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/_tools.py +242 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/cdp.py +177 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/config.py +79 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/exceptions.py +56 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/guardrail.py +59 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/peers/__init__.py +10 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/peers/base.py +158 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/peers/chatgpt.py +248 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/peers/claude.py +245 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/selectors.py +76 -0
- chat_bridge_mcp-0.2.0/chat_bridge_mcp/server.py +206 -0
- chat_bridge_mcp-0.2.0/docs/superpowers/plans/2026-09-16-chat-bridge-impl.md +3488 -0
- chat_bridge_mcp-0.2.0/docs/superpowers/plans/PLAN_INDEX.md +45 -0
- chat_bridge_mcp-0.2.0/docs/superpowers/specs/2026-09-16-chat-bridge-design.md +1132 -0
- chat_bridge_mcp-0.2.0/pyproject.toml +159 -0
- chat_bridge_mcp-0.2.0/settings/selectors.yaml +32 -0
- chat_bridge_mcp-0.2.0/tests/__init__.py +0 -0
- chat_bridge_mcp-0.2.0/tests/conftest.py +189 -0
- chat_bridge_mcp-0.2.0/tests/e2e/__init__.py +0 -0
- chat_bridge_mcp-0.2.0/tests/e2e/fixtures/__init__.py +0 -0
- chat_bridge_mcp-0.2.0/tests/e2e/fixtures/electron/main.js +47 -0
- chat_bridge_mcp-0.2.0/tests/e2e/fixtures/electron/package.json +12 -0
- chat_bridge_mcp-0.2.0/tests/e2e/fixtures/selectors.yaml +18 -0
- chat_bridge_mcp-0.2.0/tests/e2e/test_headless_electron.py +135 -0
- chat_bridge_mcp-0.2.0/tests/integration/__init__.py +0 -0
- chat_bridge_mcp-0.2.0/tests/integration/_fake_cdp_server.py +226 -0
- chat_bridge_mcp-0.2.0/tests/integration/test_cli_smoke.py +31 -0
- chat_bridge_mcp-0.2.0/tests/integration/test_server_lifecycle.py +709 -0
- chat_bridge_mcp-0.2.0/tests/unit/__init__.py +0 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_cdp.py +305 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_config.py +59 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_exceptions.py +47 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_guardrail.py +44 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_main.py +17 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_peers_base.py +162 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_peers_chatgpt.py +456 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_peers_claude.py +429 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_selectors.py +66 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_selectors_yaml_schema.py +68 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_server_skeleton.py +231 -0
- chat_bridge_mcp-0.2.0/tests/unit/test_server_tools.py +905 -0
- chat_bridge_mcp-0.2.0/uv.lock +4673 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.pyc
|
|
4
|
+
.oneiric_cache/
|
|
5
|
+
.crackerjack/
|
|
6
|
+
.hypothesis/
|
|
7
|
+
htmlcov/
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.mypy_cache/
|
|
10
|
+
.ruff_cache/
|
|
11
|
+
.coverage
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# >>> bodai-shared-gitignore >>>
|
|
15
|
+
# Source of truth: crackerjack/templates/GITIGNORE_BODAI.md
|
|
16
|
+
# Enforced by: crackerjack check `gitignore-conformance`
|
|
17
|
+
# Fleet list: /Users/les/Projects/mahavishnu/BODAI_REPO_REGISTRY.md
|
|
18
|
+
# Do NOT remove the marker line above — `crackerjack gitignore sync` uses it
|
|
19
|
+
# to detect already-applied state.
|
|
20
|
+
|
|
21
|
+
# Editor / pre-edit backups (foo.py.backup, foo.py.backup.json)
|
|
22
|
+
*.backup
|
|
23
|
+
*.backup.*
|
|
24
|
+
*.bak
|
|
25
|
+
*.tmpl
|
|
26
|
+
# XDG mistake dirs (env var expansion failed; literal names)
|
|
27
|
+
# Note: both `{` and `}` are escaped (`{` -> `[{]`, `}` -> `[}]`)
|
|
28
|
+
# because gitignore parsers interpret `${...}` as a brace-expansion
|
|
29
|
+
# alternate group; escaping only the open brace leaves a stray `}`.
|
|
30
|
+
~
|
|
31
|
+
[{]HOME[}]
|
|
32
|
+
[{]XDG_DATA_HOME:-$HOME[}]
|
|
33
|
+
# pytest-benchmark autosave cache (sibling of the tracked `benchmarks/` test suite)
|
|
34
|
+
.benchmarks/
|
|
35
|
+
# Vitest config timestamp cache
|
|
36
|
+
vitest.config.js.timestamp-*.mjs
|
|
37
|
+
# Playwright output cruft
|
|
38
|
+
playwright-junit.xml
|
|
39
|
+
playwright-report/
|
|
40
|
+
playwright-results.json
|
|
41
|
+
test-results/
|
|
42
|
+
# <<< bodai-shared-gitignore <<<
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
> Repo-local edit rules, layout, and validation entry points for chat-bridge-mcp.
|
|
4
|
+
|
|
5
|
+
## Layout
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
chat-bridge-mcp/
|
|
9
|
+
├── chat_bridge_mcp/
|
|
10
|
+
│ ├── __init__.py # __version__
|
|
11
|
+
│ ├── __main__.py # CLI entry: from chat_bridge_mcp.server import app
|
|
12
|
+
│ ├── _tools.py # @mcp.tool() decorators (6 chat-bridge tools)
|
|
13
|
+
│ ├── cdp.py # CDPConnection + CDPSession (WebSocket)
|
|
14
|
+
│ ├── config.py # ChatBridgeConfig (pydantic BaseSettings)
|
|
15
|
+
│ ├── exceptions.py # BridgeError + 6 subclasses
|
|
16
|
+
│ ├── guardrail.py # wrap(source_reply, *, source_peer) — strict-isolation framing
|
|
17
|
+
│ ├── peers/
|
|
18
|
+
│ │ ├── base.py # DesktopPeerAdapter ABC + HealthFeedState + 4-signal
|
|
19
|
+
│ │ ├── claude.py # ClaudeDesktopAdapter (CDP-driven)
|
|
20
|
+
│ │ └── chatgpt.py # ChatGPTDesktopAdapter (CDP-driven)
|
|
21
|
+
│ ├── selectors.py # load_selectors() + SelectorSet (darwin + windows)
|
|
22
|
+
│ └── server.py # ChatBridgeServer + mcp singleton + /health route
|
|
23
|
+
├── settings/
|
|
24
|
+
│ └── selectors.yaml # macOS (darwin) + Windows selectors per peer
|
|
25
|
+
├── tests/
|
|
26
|
+
│ ├── unit/ # Fast isolated tests
|
|
27
|
+
│ ├── integration/ # Subprocess + fake CDP server
|
|
28
|
+
│ └── e2e/ # Gated behind CHAT_BRIDGE_MCP_E2E=1
|
|
29
|
+
├── docs/
|
|
30
|
+
│ └── superpowers/
|
|
31
|
+
│ ├── specs/ # Design contract
|
|
32
|
+
│ └── plans/ # Implementation plan
|
|
33
|
+
├── pyproject.toml # hatchling + [project.urls] + [tool.ruff/mypy/pytest/crackerjack]
|
|
34
|
+
├── README.md # First-install smoke test, OS support, concurrency caveats
|
|
35
|
+
├── CLAUDE.md # One-page pointer for Claude Code
|
|
36
|
+
├── AGENTS.md # This file
|
|
37
|
+
├── CHANGELOG.md # Per-version inventory of changes
|
|
38
|
+
└── .gitignore
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Build & test
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
uv sync --extra dev # install + dev deps
|
|
45
|
+
uv run pytest # 101 passed, 1 skipped (e2e gate)
|
|
46
|
+
uv run pytest -m unit # fast feedback (78 tests)
|
|
47
|
+
uv run pytest tests/integration/ -v # 22 tests, ~50s
|
|
48
|
+
uv run pytest -m e2e # gated; needs real Electron fixture
|
|
49
|
+
uv run ruff check chat_bridge_mcp/
|
|
50
|
+
uv run mypy chat_bridge_mcp/
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Edit rules
|
|
54
|
+
|
|
55
|
+
- **Python 3.14 only.** `requires-python = ">=3.14"`.
|
|
56
|
+
- **`from __future__ import annotations`** first line of every source file.
|
|
57
|
+
- **Modern syntax**: `X | None`, `list[str]`, `pathlib.Path`. No `Optional[X]`,
|
|
58
|
+
`List[X]`, `os.path`.
|
|
59
|
+
- **Function defaults**: `X | None = None`, never `def f(x: int = None)`.
|
|
60
|
+
- **No `assert` in production code** (`chat_bridge_mcp/**`). Tests may use asserts.
|
|
61
|
+
- **No `Any` in MCP tool inputs.** Tool returns may be `Any` (FastMCP envelope).
|
|
62
|
+
- **In `except`**: `logger.exception(...)`, not `logger.error(..., exc_info=True)`.
|
|
63
|
+
- **All I/O is async.** No `time.sleep`, `requests`, sync file I/O in async paths.
|
|
64
|
+
- **`oneiric.logging`**, not stdlib `logging`, not `print()`.
|
|
65
|
+
- **Stable deps use `~=`**, e.g. `mcp-common~=0.25.1`. Early-dev packages
|
|
66
|
+
(`fastmcp>=2`, `pydantic>=2`) keep `>=`.
|
|
67
|
+
|
|
68
|
+
## Validation gates
|
|
69
|
+
|
|
70
|
+
| Gate | Command | Status |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| Tests | `uv run pytest` | ✅ 101 passed, 1 skipped (e2e gate) |
|
|
73
|
+
| Lint | `uv run ruff check chat_bridge_mcp/` | ✅ clean (or 13 trivial style) |
|
|
74
|
+
| Types | `uv run mypy chat_bridge_mcp/` | ✅ clean |
|
|
75
|
+
| Coverage | `--cov-fail-under=89` | ⚠️ 79.48% — gap in peers/{claude,chatgpt}.py streaming-done branches. v0.2.0 fix. |
|
|
76
|
+
|
|
77
|
+
## Wire-up contract reminders
|
|
78
|
+
|
|
79
|
+
Per `.claude/decisions/mcp-backend-wiring-discipline.md`:
|
|
80
|
+
|
|
81
|
+
- Every `@mcp.tool()` MUST have a working data feed (i.e., be backed by a real
|
|
82
|
+
adapter + tests) — stubs that return placeholder strings do not count.
|
|
83
|
+
- `/health` MUST aggregate the 4-signal `HealthFeedState` and return 503 on
|
|
84
|
+
degraded. (T22 still open at v0.1.0.)
|
|
85
|
+
- e2e tests must assert non-empty results per tool. (v0.1.0 ships integration
|
|
86
|
+
tests only; e2e fixture is gated.)
|
|
87
|
+
|
|
88
|
+
## Per-peer collision contract (spec §5.6)
|
|
89
|
+
|
|
90
|
+
Concurrent calls to the same peer do NOT serialize. Expect prompt-drop data
|
|
91
|
+
corruption (both calls return the second call's reply). The integration test
|
|
92
|
+
`test_concurrent_calls_pin_drop` pins this contract by name. Don't "fix" it
|
|
93
|
+
by adding a lock — the test will fail.
|
|
94
|
+
|
|
95
|
+
## Knowledge graph entry points
|
|
96
|
+
|
|
97
|
+
When picking up work, check in this order:
|
|
98
|
+
|
|
99
|
+
1. `docs/superpowers/specs/2026-09-16-chat-bridge-design.md` — design contract
|
|
100
|
+
2. `docs/superpowers/plans/2026-09-16-chat-bridge-impl.md` — implementation history
|
|
101
|
+
3. `CHANGELOG.md` — current version inventory
|
|
102
|
+
4. `git log --oneline -n 20` — recent commits
|
|
103
|
+
5. The 6-agent multi-lens review (see commit history) — known gaps
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to chat-bridge-mcp are documented here. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres
|
|
5
|
+
to [Semantic Versioning](https://semver.org/) within Bodai's pre-1.0 convention
|
|
6
|
+
(surface additions are minor; wire-up fixes are patch; spec-breaking changes
|
|
7
|
+
are major).
|
|
8
|
+
|
|
9
|
+
## [0.2.0] - 2026-09-19
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Bootstrap chat-bridge-mcp package skeleton with CLI entry point
|
|
14
|
+
- chat-bridge-mcp: Add async WebSocket CDP client (Task 6)
|
|
15
|
+
- chat-bridge-mcp: Add BridgeError exception hierarchy (Task 2)
|
|
16
|
+
- chat-bridge-mcp: Add ChatBridgeConfig + DEFAULT_PORT (Task 3)
|
|
17
|
+
- chat-bridge-mcp: Add ChatGPTDesktopAdapter (Task 9)
|
|
18
|
+
- chat-bridge-mcp: Add ClaudeDesktopAdapter (Task 8)
|
|
19
|
+
- chat-bridge-mcp: Add nonce-protected guardrail wrap (Task 5)
|
|
20
|
+
- chat-bridge-mcp: Add peer adapter base (Task 7)
|
|
21
|
+
- chat-bridge-mcp: Add SelectorSet + load_selectors YAML loader (Task 4)
|
|
22
|
+
- chat-bridge-mcp: Add server.py skeleton + module-level mcp singleton (Task 11a)
|
|
23
|
+
- chat-bridge-mcp: Wire server lifecycle + /health + factory + integration tests (Task 11b)
|
|
24
|
+
- server: Register Bodai baseline tools (discover_tools/get_liveness/get_readiness/health_check_all) (T21)
|
|
25
|
+
- tools: Add ask_claude MCP tool (T16)
|
|
26
|
+
- tools: Add forward_chatgpt MCP tool (T17)
|
|
27
|
+
- tools: Add list_peers MCP tool (T19)
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- Cross-llm-mcp → chat-bridge-mcp (directory, files, all references)
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- chat-bridge-mcp: Rename selectors.yaml 'macos' to 'darwin' (T4 bug)
|
|
36
|
+
- peers: Guard _ensure_session with asyncio.Lock to fix WS-leak race (T24)
|
|
37
|
+
- peers: Include timeout in StreamingTimeoutError context (T23)
|
|
38
|
+
- peers: Move sync YAML I/O off the event loop via asyncio.to_thread (T25)
|
|
39
|
+
- pyproject+types: Add license/authors/classifiers/urls + tool config + coverage gate (T20)
|
|
40
|
+
- Resolve crackerjack comprehensive-hook failures (creosote + linkcheckmd + refurb)
|
|
41
|
+
- Resolve crackerjack fast-hook failures (ruff + check-local-links)
|
|
42
|
+
- Revert "fix(peers): guard _ensure_session with asyncio.Lock to fix WS-leak race (T24)"
|
|
43
|
+
- tools: Catch Exception not BaseException so CancelledError propagates (T26)
|
|
44
|
+
- tools: Implement spec §5.1.a — system prompt + empty-question validation (T20a)
|
|
45
|
+
|
|
46
|
+
### Documentation
|
|
47
|
+
|
|
48
|
+
- Add CLAUDE.md + AGENTS.md + CHANGELOG.md (T32+T33)
|
|
49
|
+
- Implementation plan for cross-llm-mcp
|
|
50
|
+
- Mark chat-bridge-mcp implementation plan complete (T34 partial)
|
|
51
|
+
- plan: Apply round-3 criticals (Task 3 env vars, Task 7 feed API, Tasks 8/9 cdp_port + entities_count, Tasks 10/11 split into 11a + 11b)
|
|
52
|
+
- plan: Apply round-5 criticals (errors-as-content, Literal, prompt→question, errors_total increment, load_config signature, extra_components=[], duplicate server.py)
|
|
53
|
+
- plans: Add PLAN_INDEX.md and mark cross-llm-mcp impl plan active
|
|
54
|
+
- readme: Align with v0.1.0 status, fix URL typo, document concurrency + HealthFeedState 4-signal (T31)
|
|
55
|
+
- README: Package overview + first-install manual smoke-test protocol (Task 15)
|
|
56
|
+
- readme: Per-platform install + CDP-launch instructions (mac/win/linux)
|
|
57
|
+
- spec: Apply multi-agent review findings to cross-llm-mcp design
|
|
58
|
+
- spec: Apply round-2 review findings (python + docs lenses)
|
|
59
|
+
- spec: Fix stale cross_llm_mcp.factories import (python-pro round-3 C3)
|
|
60
|
+
- spec: Flip status draft -> complete after approval
|
|
61
|
+
- spec: Initial design for cross-llm-mcp — CDP bridge between Claude Desktop and ChatGPT Desktop
|
|
62
|
+
- Tick all 75 checkboxes + end-of-plan v0.1.0 status note
|
|
63
|
+
|
|
64
|
+
### Testing
|
|
65
|
+
|
|
66
|
+
- Cover streaming-timeout, peer edge cases, and server lifecycle (T27-T29)
|
|
67
|
+
- Headless Electron fixture + gated e2e test (Task 14)
|
|
68
|
+
- integration: Pin list_peers roster round-trip (T19)
|
|
69
|
+
- Pin chat-surface error strings for 6 BridgeError subclasses (Task 13)
|
|
70
|
+
- Push coverage to 100% (Phase 2)
|
|
71
|
+
- TestSelectorsYamlSchemaStable guard for v1.0.0 ship gate (Task 12)
|
|
72
|
+
- tools: Pin forward_chatgpt MCP tool surface (T17)
|
|
73
|
+
|
|
74
|
+
## [0.1.0] - 2026-09-17
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
|
|
78
|
+
- 6-tool MCP surface: `ask_chatgpt`, `ask_claude`, `forward_chatgpt`,
|
|
79
|
+
`forward_claude`, `list_peers`, `get_peer_health` (Streamable HTTP on
|
|
80
|
+
port 3057).
|
|
81
|
+
- 4 Bodai baseline tools: `discover_tools`, `get_liveness`, `get_readiness`,
|
|
82
|
+
`health_check_all`.
|
|
83
|
+
- Chrome DevTools Protocol (CDP) driver layer: `chat_bridge_mcp/cdp.py`
|
|
84
|
+
(CDPConnection, CDPSession; WebSocket via `websockets>=11`).
|
|
85
|
+
- Peer adapters: `chat_bridge_mcp/peers/{claude,chatgpt}.py` — lazy WS open
|
|
86
|
+
on the caller's event loop, 4-signal `HealthFeedState` per peer.
|
|
87
|
+
- Guardrail: `chat_bridge_mcp/guardrail.py` — `wrap(source_reply, *,
|
|
88
|
+
source_peer, ask_for_opinion=True)` with per-call `secrets.token_urlsafe(32)`
|
|
89
|
+
nonce and `<<nonce=base64>>` paired markers.
|
|
90
|
+
- Selectors: `chat_bridge_mcp/selectors.py` + `settings/selectors.yaml`
|
|
91
|
+
(darwin + windows blocks; REQUIRED_KEYS = input_box, send_button,
|
|
92
|
+
response_container).
|
|
93
|
+
- CLI: `chat-bridge-mcp` console script wired to
|
|
94
|
+
`chat_bridge_mcp.__main__:main`.
|
|
95
|
+
|
|
96
|
+
### Wire-up fixes (this version)
|
|
97
|
+
|
|
98
|
+
- **`pydantic-settings~=2.6` added** to runtime deps (was missing →
|
|
99
|
+
`ModuleNotFoundError` on first import).
|
|
100
|
+
- **`pyproject.toml` metadata** complete: `description`, `license = {text = "MIT"}`,
|
|
101
|
+
`authors`, `classifiers` (incl. Python 3.14), `[project.urls]`.
|
|
102
|
+
- **`[tool.ruff]` / `[tool.mypy]` / `[tool.crackerjack]` / `[tool.coverage.*]`**
|
|
103
|
+
config blocks now present (crackerjack `run` can invoke its gates).
|
|
104
|
+
- **`--cov-fail-under=89`** enforcement active in `[tool.pytest.ini_options]`.
|
|
105
|
+
- **Strict mypy clean** (was surfacing type errors in `server.py:80,88`,
|
|
106
|
+
`config.py:81`, `cdp.py:22,104`, `_tools.py` 6 unused suppressions — all fixed).
|
|
107
|
+
- **`StreamingTimeoutError` raise sites carry `context={"timeout": timeout}`**
|
|
108
|
+
at all 4 sites in `peers/{claude,chatgpt}.py` (chat-surface string
|
|
109
|
+
now reports the actual budget instead of `?`).
|
|
110
|
+
- **`except BaseException` → `except Exception`** at 7 sites in `_tools.py`
|
|
111
|
+
(asyncio `CancelledError` propagates correctly per spec §5.6).
|
|
112
|
+
- **Sync YAML I/O off the event loop** via `asyncio.to_thread` in both
|
|
113
|
+
peer adapters' `attach()`.
|
|
114
|
+
|
|
115
|
+
### Spec deviation closed (T20a)
|
|
116
|
+
|
|
117
|
+
- `ask_chatgpt` and `ask_claude` now match spec §5.1.a signature:
|
|
118
|
+
`async def ask_chatgpt(question: str, system: str | None = None) -> str`.
|
|
119
|
+
- Empty `question` validation returns `Empty question. Provide non-empty text.`
|
|
120
|
+
- `system` (when provided) is prepended as `f"{system}\n\n{question}"` before
|
|
121
|
+
passing to `client.send()`.
|
|
122
|
+
|
|
123
|
+
### Known v1 limitations (deferred to v0.2.0)
|
|
124
|
+
|
|
125
|
+
- **WS-leak race under concurrent first-time callers.** Documented in
|
|
126
|
+
`peers/{claude,chatgpt}.py` `_ensure_session` docstrings. Cosmetic on
|
|
127
|
+
subprocess shutdown; the v0.2.0 fix is per-call WS lifecycle (open in
|
|
128
|
+
`_send_uncounted`, close in `finally`).
|
|
129
|
+
- **`/health` does not return 503 on degraded** (T22 still open). The
|
|
130
|
+
mcp-common `register_http_health_route` API lacks a `degraded_status_code`
|
|
131
|
+
parameter; the fix is to wrap or override the route handler. Bodai-wide
|
|
132
|
+
monthly audit will flag this.
|
|
133
|
+
- **Coverage gap at 79.48%** vs the 89% gate. Tests for the streaming-done
|
|
134
|
+
detection paths (indicator + content-hash stability branches in
|
|
135
|
+
`peers/{claude,chatgpt}.py`) need explicit unit tests — the current
|
|
136
|
+
fixtures terminate at the success path.
|
|
137
|
+
- **`/health` envelope is startup-snapshot, not live.** `extra_components`
|
|
138
|
+
captured once at `startup()`; per-call cycle counters and last-updated
|
|
139
|
+
timestamps don't refresh on `curl /health`. Live aggregation via
|
|
140
|
+
`auth_health_provider` callable is the planned v0.2.0 shape.
|
|
141
|
+
|
|
142
|
+
### Repo provenance
|
|
143
|
+
|
|
144
|
+
- Renamed from `cross-llm-mcp` on 2026-09-16 (commit `cafe354`).
|
|
145
|
+
- Listed in the Bodai registry at
|
|
146
|
+
`lesleslie/mahavishnu/BODAI_REPO_REGISTRY.md` line 60.
|
|
147
|
+
- GitHub remote: `https://github.com/lesleslie/chat-bridge-mcp`.
|
|
148
|
+
|
|
149
|
+
### Pre-1.0 policy reminder
|
|
150
|
+
|
|
151
|
+
Per `bodai-pre-1.0-merge-policy.md`, all changes to this repo merge directly
|
|
152
|
+
to `main`. No PRs. No `git push` without explicit user approval.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
> One-page pointer for Claude Code working in this repo. For repo layout, build,
|
|
4
|
+
> test, and edit rules, see [AGENTS.md](AGENTS.md).
|
|
5
|
+
|
|
6
|
+
## What this repo is
|
|
7
|
+
|
|
8
|
+
`chat-bridge-mcp` is a FastMCP server (Bodai MCP, port 3057) that drives
|
|
9
|
+
Claude Desktop and ChatGPT Desktop via Chrome DevTools Protocol. It exposes
|
|
10
|
+
6 chat-bridge tools (`ask_chatgpt`, `ask_claude`, `forward_chatgpt`,
|
|
11
|
+
`forward_claude`, `list_peers`, `get_peer_health`) plus the 4 Bodai baseline
|
|
12
|
+
tools (`discover_tools`, `get_liveness`, `get_readiness`, `health_check_all`).
|
|
13
|
+
|
|
14
|
+
## Pointer
|
|
15
|
+
|
|
16
|
+
- **Spec**: `docs/superpowers/specs/2026-09-16-chat-bridge-design.md` — read this first
|
|
17
|
+
- **Plan**: `docs/superpowers/plans/2026-09-16-chat-bridge-impl.md` — design + spec history
|
|
18
|
+
- **Edit rules / layout**: [AGENTS.md](AGENTS.md)
|
|
19
|
+
- **Version status**: [CHANGELOG.md](CHANGELOG.md) — currently 0.1.0, no stable release scheduled
|
|
20
|
+
- **Wire-up contract**: see `.claude/decisions/wire-up-contract.md` in the
|
|
21
|
+
mahavishnu repo for the Bodai MCP wiring discipline this repo conforms to.
|
|
22
|
+
|
|
23
|
+
## TL;DR
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
uv sync --extra dev # install
|
|
27
|
+
uv run pytest # 101 passed (1 e2e skipped) — coverage gate at 79.48%, target 89%
|
|
28
|
+
uv run ruff check chat_bridge_mcp/
|
|
29
|
+
uv run mypy chat_bridge_mcp/
|
|
30
|
+
uv run python -m chat_bridge_mcp --help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Bridge requires both Claude Desktop and ChatGPT Desktop running with
|
|
34
|
+
`--remote-debugging-port` set (9229 and 9230 by default). See
|
|
35
|
+
[README.md](README.md) for the first-install smoke test.
|
|
36
|
+
|
|
37
|
+
## Status
|
|
38
|
+
|
|
39
|
+
0.1.0 — early development. 6-tool surface complete; several HIGH review
|
|
40
|
+
findings still open (T22 /health 503, spec §5.6 WS-leak race documented as
|
|
41
|
+
v1 limitation, coverage gate at 79.48% below the 89% target).
|