Skip to content

Commit 1f6bc33

Browse files
committed
Docs update
1 parent 10054b7 commit 1f6bc33

File tree

9 files changed

+36
-148
lines changed

9 files changed

+36
-148
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ concurrency:
1212
cancel-in-progress: true
1313

1414
jobs:
15-
lint:
16-
name: Lint & Format Check
15+
ruff:
16+
name: Ruff Check
1717
runs-on: ubuntu-latest
1818
steps:
1919
- uses: actions/checkout@v4
@@ -26,104 +26,5 @@ jobs:
2626
- name: Install dependencies
2727
run: uv sync --locked --dev
2828

29-
- name: Run ruff linter
29+
- name: Run ruff
3030
run: uv run ruff check rlm_code tests
31-
32-
- name: Run ruff formatter check
33-
run: uv run ruff format --check rlm_code tests
34-
35-
typecheck:
36-
name: Type Check
37-
runs-on: ubuntu-latest
38-
steps:
39-
- uses: actions/checkout@v4
40-
41-
- name: Install uv
42-
uses: astral-sh/setup-uv@v4
43-
with:
44-
version: "latest"
45-
46-
- name: Install dependencies
47-
run: uv sync --locked --dev
48-
49-
- name: Run mypy on core modules
50-
run: |
51-
uv run mypy rlm_code/core/config.py rlm_code/core/debug_logger.py rlm_code/mcp/utils.py rlm_code/mcp/retry.py rlm_code/models/cache.py rlm_code/models/streaming.py rlm_code/validation/security.py --ignore-missing-imports
52-
53-
test:
54-
name: Test - Python ${{ matrix.python-version }} on ${{ matrix.os }}
55-
runs-on: ${{ matrix.os }}
56-
strategy:
57-
fail-fast: false
58-
matrix:
59-
os: [ubuntu-latest, macos-latest]
60-
python-version: ["3.11", "3.12", "3.13"]
61-
62-
steps:
63-
- uses: actions/checkout@v4
64-
65-
- name: Install uv
66-
uses: astral-sh/setup-uv@v4
67-
with:
68-
version: "latest"
69-
70-
- name: Install dependencies
71-
run: uv sync --locked --python ${{ matrix.python-version }} --extra test
72-
73-
- name: Run tests
74-
run: uv run pytest tests/ -v --cov=rlm_code --cov-report=xml --cov-report=term-missing
75-
76-
- name: Upload coverage
77-
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
78-
uses: codecov/codecov-action@v4
79-
with:
80-
file: ./coverage.xml
81-
fail_ci_if_error: false
82-
83-
rlm-benchmark-gate:
84-
name: RLM Benchmark Gate
85-
runs-on: ubuntu-latest
86-
needs: [lint, test]
87-
steps:
88-
- uses: actions/checkout@v4
89-
90-
- name: Install uv
91-
uses: astral-sh/setup-uv@v4
92-
with:
93-
version: "latest"
94-
95-
- name: Install dependencies
96-
run: uv sync --locked --extra test
97-
98-
- name: Run deterministic RLM benchmark gate
99-
run: |
100-
uv run python scripts/rlm_bench_gate.py \
101-
--baseline tests/fixtures/rlm_ci_baseline_generic_smoke.json \
102-
--preset generic_smoke \
103-
--limit 2
104-
105-
build:
106-
name: Build Package
107-
runs-on: ubuntu-latest
108-
needs: [lint, test, rlm-benchmark-gate]
109-
steps:
110-
- uses: actions/checkout@v4
111-
112-
- name: Install uv
113-
uses: astral-sh/setup-uv@v4
114-
with:
115-
version: "latest"
116-
117-
- name: Build package
118-
run: uv build
119-
120-
- name: Check distribution
121-
run: |
122-
uv tool run twine check dist/*
123-
124-
- name: Upload build artifacts
125-
uses: actions/upload-artifact@v4
126-
with:
127-
name: dist
128-
path: dist/
129-
retention-days: 7

.github/workflows/release.yml

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,3 @@ jobs:
3030
name: release-dist
3131
path: dist/
3232
retention-days: 7
33-
34-
publish:
35-
name: Publish to PyPI
36-
needs: build
37-
runs-on: ubuntu-latest
38-
permissions:
39-
id-token: write
40-
environment:
41-
name: pypi
42-
url: https://pypi.org/project/rlm-code/
43-
steps:
44-
- name: Download distributions
45-
uses: actions/download-artifact@v4
46-
with:
47-
name: release-dist
48-
path: dist/
49-
50-
- name: Publish
51-
uses: pypa/gh-action-pypi-publish@release/v1

rlm_code/commands/slash_commands.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,9 +1600,7 @@ def cmd_harness(self, args: list):
16001600
show_warning_message("strategy=codemode requires mcp=on. Enabling MCP.")
16011601
include_mcp = True
16021602
if strategy == "codemode" and allowlist:
1603-
show_warning_message(
1604-
"tools=... allowlist is ignored for strategy=codemode."
1605-
)
1603+
show_warning_message("tools=... allowlist is ignored for strategy=codemode.")
16061604
allowlist = None
16071605

16081606
console.print()

rlm_code/harness/registry.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,10 @@ def _is_mcp_tool_allowed(self, full_name: str) -> tuple[bool, str | None]:
333333
normalized_server = server_name.strip().lower()
334334
normalized_tool = tool_name.strip().lower()
335335

336-
if self._mcp_allowed_servers is not None and normalized_server not in self._mcp_allowed_servers:
336+
if (
337+
self._mcp_allowed_servers is not None
338+
and normalized_server not in self._mcp_allowed_servers
339+
):
337340
return (
338341
False,
339342
f"MCP tool '{full_name}' blocked by MCP policy (server '{server_name}' not allowed).",
@@ -351,11 +354,7 @@ def list_tools(self, *, include_mcp: bool = True) -> list[HarnessToolSpec]:
351354
if include_mcp and self.mcp_manager is not None:
352355
mcp_specs = self._list_mcp_specs()
353356
if self._mcp_allowed_tools is not None or self._mcp_allowed_servers is not None:
354-
mcp_specs = [
355-
row
356-
for row in mcp_specs
357-
if self._is_mcp_tool_allowed(row.name)[0]
358-
]
357+
mcp_specs = [row for row in mcp_specs if self._is_mcp_tool_allowed(row.name)[0]]
359358
specs = list(specs_map.values())
360359
specs.extend(mcp_specs)
361360
alias_candidates: dict[str, list[HarnessToolSpec]] = {}
@@ -985,7 +984,9 @@ def _domain_allowed(*, domain: str, allowed_domains: set[str], blocked_domains:
985984
return False
986985
if blocked_domains and any(domain == d or domain.endswith(f".{d}") for d in blocked_domains):
987986
return False
988-
if allowed_domains and not any(domain == d or domain.endswith(f".{d}") for d in allowed_domains):
987+
if allowed_domains and not any(
988+
domain == d or domain.endswith(f".{d}") for d in allowed_domains
989+
):
989990
return False
990991
return True
991992

rlm_code/harness/runner.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,9 @@ def _run_codemode_strategy(
250250
mcp_tool_allowlist=mcp_tool_allowlist,
251251
mcp_server=mcp_server,
252252
)
253-
server_name = self._resolve_codemode_server(tool_rows=tool_rows, requested_server=mcp_server)
253+
server_name = self._resolve_codemode_server(
254+
tool_rows=tool_rows, requested_server=mcp_server
255+
)
254256
if not server_name:
255257
return HarnessRunResult(
256258
completed=False,

rlm_code/rlm/benchmark_manager.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,11 @@ def run_benchmark(
174174
"""Execute a benchmark preset and persist aggregate summary."""
175175
resolved_mode = self._normalize_benchmark_mode(mode)
176176
resolved_harness_strategy = self._normalize_harness_strategy(harness_strategy)
177-
if resolved_mode == "harness" and resolved_harness_strategy == "codemode" and not include_mcp:
177+
if (
178+
resolved_mode == "harness"
179+
and resolved_harness_strategy == "codemode"
180+
and not include_mcp
181+
):
178182
logger.warning("Harness codemode strategy requires MCP; enabling include_mcp.")
179183
include_mcp = True
180184
benchmark_id = datetime.now(timezone.utc).strftime("bench_%Y%m%d_%H%M%S_%f")
@@ -291,11 +295,7 @@ def run_benchmark(
291295
"mode": resolved_mode,
292296
"mcp_enabled": bool(include_mcp) if resolved_mode == "harness" else False,
293297
"mcp_server": str(mcp_server) if (resolved_mode == "harness" and mcp_server) else None,
294-
"harness_strategy": (
295-
resolved_harness_strategy
296-
if resolved_mode == "harness"
297-
else None
298-
),
298+
"harness_strategy": (resolved_harness_strategy if resolved_mode == "harness" else None),
299299
"source": extra_sources.get(str(preset).strip().lower(), "builtin"),
300300
"description": extra_descriptions.get(str(preset).strip().lower(), ""),
301301
"pack_paths": [str(item) for item in (pack_paths or self._benchmark_pack_paths)],
@@ -961,12 +961,11 @@ def _run_benchmark_case_harness(
961961
for step in tool_steps:
962962
if step.tool_result is None:
963963
continue
964-
metadata = step.tool_result.metadata if isinstance(step.tool_result.metadata, dict) else {}
964+
metadata = (
965+
step.tool_result.metadata if isinstance(step.tool_result.metadata, dict) else {}
966+
)
965967
resolved_name = str(
966-
metadata.get("tool_full_name")
967-
or metadata.get("resolved_tool")
968-
or step.tool
969-
or ""
968+
metadata.get("tool_full_name") or metadata.get("resolved_tool") or step.tool or ""
970969
).strip()
971970
if resolved_name.startswith("mcp:"):
972971
mcp_tool_calls += 1
@@ -982,8 +981,7 @@ def _run_benchmark_case_harness(
982981
):
983982
codemode_discovery_calls += 1
984983
codemode_guardrail_blocked = any(
985-
str(step.action) == "codemode_plan"
986-
and "guardrail" in str(step.reasoning or "").lower()
984+
str(step.action) == "codemode_plan" and "guardrail" in str(step.reasoning or "").lower()
987985
for step in result.steps
988986
)
989987
return {

tests/test_harness_runner.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ def test_harness_run_supports_codemode_strategy(tmp_path: Path) -> None:
156156
manager = _CodeModeMCPManager()
157157
runner = HarnessRunner(llm_connector=connector, mcp_manager=manager, workdir=tmp_path)
158158

159-
result = runner.run(task="Get weather in SF", strategy="codemode", include_mcp=True, max_steps=4)
159+
result = runner.run(
160+
task="Get weather in SF", strategy="codemode", include_mcp=True, max_steps=4
161+
)
160162

161163
assert result.completed is True
162164
assert "San Francisco" in result.final_response

tests/test_provider_registry.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,14 @@ def test_connector_supported_provider_metadata_includes_connection_type(tmp_path
186186
assert isinstance(openai["example_models"], list)
187187

188188

189-
def test_connector_uses_superqode_model_catalog(tmp_path: Path):
189+
def test_connector_uses_superqode_model_catalog(tmp_path: Path, monkeypatch):
190190
"""Provider model list should align with SuperQode catalog where available."""
191191
connector = make_connector(tmp_path)
192+
monkeypatch.setattr(
193+
connector,
194+
"_list_opencode_models_cached",
195+
lambda timeout=0.6: [],
196+
)
192197

193198
openai_models = connector.list_provider_example_models("openai", limit=3)
194199
gemini_models = connector.list_provider_example_models("gemini", limit=2)

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)