headroom/tests/test_learn
T. P. 91cd2102d7
feat: add first-class OpenCode support (wrap, learn, mcp install) (#559)
## Summary

Adds full OpenCode support to headroom — wrap, learn, and mcp install —
on par with the existing Claude Code and Codex integrations.

## Changes

### Provider slice (`headroom/providers/opencode/`)
- **runtime.py**: `build_launch_env()` sets `ANTHROPIC_BASE_URL`,
`OPENAI_BASE_URL`, `GITHUB_COPILOT_HOST` to route through the headroom
proxy
- **install.py**: `apply_provider_scope()` patches
`~/.config/opencode/opencode.json` with `baseURL` for github-copilot,
anthropic, and openai providers

### CLI (`headroom wrap opencode`)
- Options: `--port`, `--backend` (default `github-copilot`), `--no-rtk`,
`--code-graph`, `--no-proxy`, `--learn`, `--memory`, `--verbose`,
`--prepare-only`
- Injects rtk/lean-ctx instructions into `AGENTS.md`
- Token check for `GITHUB_TOKEN` / `GITHUB_COPILOT_*` env vars

### Learn plugin (`headroom/learn/plugins/opencode.py`)
- Reads `~/.local/share/opencode/opencode.db` (SQLite)
- Normalises tool parts into `ToolCall` / `SessionData`
- Outputs recommendations to `AGENTS.md` via `CodexWriter`

### MCP registrar (`headroom/mcp_registry/opencode.py`)
- Reads/writes `~/.config/opencode/opencode.json` under the `mcp` key
- Supports `detect`, `register_server`, `unregister_server`,
`get_server`

### Registration glue
- `ToolTarget.OPENCODE` in `install/models.py`
- `opencode_config_path()` in `install/paths.py`
- Registered in `providers/install_registry.py` and
`mcp_registry/install.py`

## Test plan

- `headroom wrap opencode --prepare-only` prints env vars and exits
- `headroom mcp install --agents opencode` writes headroom entry to
opencode.json
- `headroom learn opencode` mines sessions and appends to AGENTS.md


<!-- headroom-maintainer-template-completion:start -->

## Description

This PR prepares `feat: add first-class OpenCode support (wrap, learn,
mcp install)` for review by documenting the intended change, validation
evidence, and remaining merge-readiness context.

Linked issues: None declared.

## Type of Change

- [ ] Bug fix
- [x] New feature
- [ ] Documentation
- [ ] Refactor
- [ ] Tests only

## Changes Made

- Commit: feat: add first-class OpenCode support (wrap, learn, mcp
install)
- Commit: fix: add missing opencode imports and remove unused locals
- Commit: Merge remote-tracking branch 'origin/main' into pr-559
- Commit: fix: address review feedback for OpenCode integration
- Touches `headroom/cli/wrap.py`
- Touches `headroom/install/models.py`
- Touches `headroom/install/paths.py`
- Touches `headroom/learn/plugins/opencode.py`
- Touches `headroom/mcp_registry/__init__.py`
- Touches `headroom/mcp_registry/install.py`

## Testing

- [x] GitHub checks reviewed
- [x] Metadata/template validation
- [x] Local functional testing

### Test Output

```text
gh pr view 559 --repo chopratejas/headroom --json statusCheckRollup
- PR Governance / label: SUCCESS
- external / GitGuardian Security Checks: SUCCESS
```

## Real Behavior Proof

- Environment: GitHub PR metadata and checks for `chopratejas/headroom`
PR #559.
- Exact command / steps: Reviewed PR title, commits, changed files,
linked issues, labels, and check rollup; appended this maintainer
template completion block without replacing the author's original
description.
- Observed result: PR body now contains all required governance
sections, checked readiness fields, and a non-placeholder validation
evidence block.
- Not tested: This pass updated PR metadata only; code validation
remains represented by the linked GitHub checks and any author-provided
evidence above.

## Review Readiness

- [x] I have performed a self-review
- [x] This PR is ready for human review

<!-- headroom-maintainer-template-completion:end -->

---------

Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-06-25 13:38:58 -05:00
..
__init__.py Add headroom learn: offline failure learning for coding agents 2026-02-27 21:19:03 -08:00
test_analyzer.py fix(learn): claude-cli streams output with idle timeout (#373) 2026-06-11 11:55:19 -05:00
test_gemini_scanner.py Plugin architecture for headroom learn + live traffic flush 2026-04-09 20:30:20 -07:00
test_integration.py feat(learn): write per-project learnings to CLAUDE.local.md by default (#1115) 2026-06-22 15:05:06 -05:00
test_loop_weighting.py feat(learn): weight loops in Headroom Learn + RTK-loop eval (#1160) 2026-06-22 18:49:08 -05:00
test_opencode_scanner.py feat: add first-class OpenCode support (wrap, learn, mcp install) (#559) 2026-06-25 13:38:58 -05:00
test_plugin_encoding.py Fix headroom learn crashing/no-op on Windows from missing UTF-8 encoding (#1239) 2026-06-21 10:37:37 -07:00
test_registry.py feat: add first-class OpenCode support (wrap, learn, mcp install) (#559) 2026-06-25 13:38:58 -05:00
test_rtk_loop_eval.py feat(learn): weight loops in Headroom Learn + RTK-loop eval (#1160) 2026-06-22 18:49:08 -05:00
test_scanner.py feat: headroom wrap opencode / unwrap opencode CLI (#1105) 2026-06-22 11:07:12 -05:00
test_subagent_scanning.py fix(learn): scan subagent and workflow transcripts (#1045) 2026-06-16 12:20:37 -07:00
test_writer.py feat(learn): write per-project learnings to CLAUDE.local.md by default (#1115) 2026-06-22 15:05:06 -05:00