Skip to content

Add roborev config: pi agent with GLM-5.3 via Fireworks - #117

Closed
elviskahoro wants to merge 19 commits into
LineIndent:mainfrom
elviskahoro:conductor/roborev-toml-setup
Closed

elviskahoro wants to merge 19 commits into
LineIndent:mainfrom
elviskahoro:conductor/roborev-toml-setup

Conversation

@elviskahoro

Copy link
Copy Markdown
Collaborator

Sets up .roborev.toml matching the gtm-sdk setup:

  • agent = "pi"
  • model = "fireworks/accounts/fireworks/models/glm-5p3"

Repo-specific review_guidelines from the gtm-sdk reference were intentionally omitted — they describe gtm-sdk git hooks that don't exist here. The header comment explaining the mechanism is kept so guidelines can be added later.

Verified:

  • roborev config get agent → pi, roborev config get model → fireworks/accounts/fireworks/models/glm-5p3
  • roborev check-agents → pi healthy
  • Roborev gate (git roborev review --wait) passed on this commit — the review itself ran through pi + GLM-5.3 via Fireworks

detail-app Bot and others added 19 commits October 2, 2026 21:42
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
…ed, toBase62) (#5)

Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Fixes copy buttons in chart_util_wrapper and file_codeblock being
absolutely positioned without a positioned ancestor, which caused
them to anchor to the page root instead of the codeblock. Matches
the pattern already used in demo_wrapper. Closes AI-342.
Collapsible panels snap open and closed because the height state selectors have no transition. Match Accordion timing so both interactions animate consistently.
* chore: remove dead menu.py constants and type aliases

* Regenerate menu.md after dead-code removal

---------

Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
* chore(tools): add gtm-linear and issue-fetch CLI

gtm-linear is a Python SDK with no executable, so
scripts/linear_cli.py wraps LinearWorkflow as read-only
commands (viewer/teams/issues/issue/search) for fetching
Linear issues. Auth resolves LINEAR_API_KEY from env or
gitignored .env.local.

* refactor(tools): port Linear CLI to Typer

Type-hint-driven commands, enum state choices, rich --help,
typer.echo/secho output. Typer added as a dev dependency.

* fix(tools): harden Linear CLI after review

- Disable Typer pretty exceptions (locals in tracebacks could
  expose the API key)
- One _fail() error style for all failure paths
- Bound --limit to 1-100 via option validation instead of
  silent clamping
- Add CliRunner tests covering state enum, exit codes, auth
  failure, and LinearAPIError mapping

* test(tools): tighten Linear CLI tests after review

Assert main() prints the API error to stderr, cover
ValidationError handling with from_env patched, document
the verified settings sources on the missing-key test, use
result.output directly (click 8.2+ interleaves stderr), note
the --limit validation behavior in the CLI docstring.

* test(tools): finish Linear CLI test polish after review

Clear every LINEAR_* env var in the missing-key smoke test,
drop the version-pinned comment, add a case proving
unrelated from_env exceptions are not misreported.

* test(tools): match LINEAR_ env vars case-insensitively

pydantic-settings resolves env names case-insensitively;
also assert the original exception message survives and
document why ValueError guards a ValidationError regression.
…es (#23)

Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
@elviskahoro

Copy link
Copy Markdown
Collaborator Author

Closing — created against the wrong repo by mistake (intended for our fork, not upstream). Apologies for the noise.

@elviskahoro elviskahoro closed this Oct 3, 2026
elviskahoro added a commit that referenced this pull request Oct 25, 2026
…ment (#119)

**Detail bug report:** [View on
Detail](https://app.detail.dev/org_d38a878f-9df9-4c4b-a96a-f5180b860085/bugs/bug_4375577e-69b1-42f0-ba52-a019cfccbfd9)

Closes #117

## Bug

The documentation TOC scrollspy never highlighted the active heading.
`setActive(id)` in `app/templates/toc.py` compared each link's full
rendered `href` against the bare fragment `"#" + id`:

```js
link => link.getAttribute('href') === '#' + id
```

But TOC entries render through `rx.el.a`, which is a React Router
`<Link>`. React Router renders a hash-only `to` (e.g. `"#dev"`) as an
`<a>` whose `href` is path-prefixed (e.g.
`/docs/getting-started/dev#dev`). The equality was therefore never true,
so no `.toc-link` was ever marked `data-active="true"` — clicking a TOC
entry still scrolled, but never highlighted, and scrolling through a
page never highlighted the corresponding entry.

This was introduced in `5efe74b` (PR #75), which replaced the original
substring selector
`document.querySelector(\`.toc-link[href*="#${id}"]\`)` with the
exact-`===` comparison to fix a `dev`-vs-`dev.py` prefix collision. That
over-corrected a partial mis-highlight into a total loss of highlight,
and the accompanying static-only test baked in the buggy shape, giving a
false green.

## Fix

Compare the rendered href's trailing fragment against `id`, matching
what the click/scroll handlers already do:

```js
link => link.getAttribute('href').split('#')[1] === id
```

This compares the actual rendered fragment (`dev` vs `dev.py`), so
`setActive("dev")` highlights the `#dev` link rather than nothing, and
`setActive("dev.py")` still highlights `#dev.py` (the `dev`-vs-`dev.py`
prefix collision from #75 stays resolved). It also removes the
inconsistency the report flagged: `setActive` now interprets the
rendered href the same way the click/scroll paths already did.

## Testing

The scrollspy is embedded JS executed under React Router at runtime, so
static source-shape checks alone cannot catch this regression (the
original tests gave a false green). Added runtime coverage that
exercises the real `setActive` source under a production-shaped React
Router renderer:

- **Static shape tests** (`tests/test_toc_scrollspy.py`): assert the
comparison uses `getAttribute('href').split('#')[1] === id` (either
operand order), forbids `querySelector`/attribute-substring selectors,
and forbids `includes`/`indexOf`/`startsWith`/`endsWith` — keeping the
#75 collision from reappearing.
- **Runtime jsdom + react-router-dom test**: renders `<Link
to="#dev.py">` before `<Link to="#dev">` (the ordering that exposes the
#75 collision) via `createBrowserRouter` + `RouterProvider` in jsdom at
the production pathname, then runs the **real** `setActive` source
extracted from `toc.py` and asserts the rendered hrefs are path-prefixed
and that `setActive("dev")` → `#dev` and `setActive("dev.py")` →
`#dev.py`. The harness deps are pinned to `reflex.lock/package.json`
versions in `tests/toc_scrollspy_repro/` (`npm ci` to install; test
skips with an instruction if deps or Node are absent).

Verification:
- Unit tests, typecheck (`uv run pyright`), and lint/format (`ruff`) all
pass; the full suite is 825 passed.
- Mutation-checked the suite: reverting to the buggy `=== '#' + id`
fails both the static and runtime tests (`after_dev == None`); reverting
to the original substring selector fails the runtime test (`after_dev ==
'devpytoc'`, the #75 collision) and the no-selector static test. Neither
regression can recur silently.
- End-to-end in real Chromium via Playwright against the running Reflex
docs app on the `dev.md` page (which has both `# dev.py` and `## Dev`
headings): all 12 `.toc-link` hrefs are path-prefixed
(`/docs/getting-started/dev#<id>`); clicking `#dev` highlights "Dev" and
clicking `#dev.py` highlights "dev.py"; scrolling each heading into the
IntersectionObserver's active band highlights the matching entry;
reloading with `#dev` scrolls to and highlights "Dev" on mount. The
`dev`-vs-`dev.py` prefix collision is resolved in the real browser.

---
_Automatic Fixes PRs can be [configured
here](https://app.detail.dev/org_d38a878f-9df9-4c4b-a96a-f5180b860085/settings/repos/repo_04b9d58c-daa0-46b6-9560-7f39569ec6eb/bugs)._

---------

Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Co-authored-by: elvis kahoro <github@elvis.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant