feat: console board view — two-tab Issues/PRs panel (themed)#8
Merged
Conversation
|
👀 Quinn is reviewing — verdict (PASS / WARN / FAIL) + findings to follow. |
There was a problem hiding this comment.
QA Audit — PR #8 | feat: console board view — two-tab Issues/PRs panel (themed)
VERDICT: WARN (CI non-terminal; observations below)
CI Status
- test: queued ⏳
Diff Review
__init__.py: Board view registration via dual-guard (hasattr+try/except), degrade-safe on older hosts. Clean.api.py(new): Two routers — public PAGE + gated DATA, the notes-plugin pattern. Data fns (fetch_issues/fetch_prs) are plain async + testable,bad_repovalidates beforerun_gh, state filter uses an allow-list, error output truncated. Lazy FastAPI imports.PROTO.md: Docs updated to reflect new modules + ADR cross-refs.
Observations
- GAP: Diff truncated at 200/627 lines —
view.pyPAGE,POST /issueroute inbuild_data_router, and all test files are outside the review window. - GAP: Clawpatch structural review unavailable (repo not in project registry).
- LOW:
_norm_stateallows"merged"for both issues and PRs;gh issue listdoesn't support--state merged, but the error surfaces via non-zero exit (not silent). - LOW:
shutil.which("gh")is sync in an async context — only called at config-time, negligible impact.
— Quinn, QA Engineer
|
Submitted COMMENT review on #8. |
52b25ba to
aeb53b1
Compare
Adds the plugin's own console view: a quick read of a project's board, modelled on protoMaker's github-view but rebuilt in our design system. - view.py: a self-contained, --pl-*-themed PAGE (vanilla JS, no host build) — two tabs (Issues / Pull Requests), a repo picker fed from the configured github.repos, an open/closed/all state filter, list rows (state dot, #number, title, author/date, label pills; PRs add draft/review/branch), and a "New issue" form. - api.py: two routers (the notes pattern) — the PAGE on the PUBLIC /plugins/github prefix (iframe-loadable) and the DATA routes on the GATED /api/plugins/github prefix (config/issues/prs/issue), fetched with the DS plugin-kit's bearer handshake. POST /issue reuses the SAME file_issue gate path as the /issue command, so they can't diverge. Data logic is in plain async fns (host-free testable); fastapi imports lazy. - __init__.py: register both routers when the host exposes register_router (guarded — an older host still loads tools + /issue). manifest: views: entry (placement: right). - tests: data fns + routes via FastAPI TestClient + register wiring + legacy-host degrade + page-references-the-gated-endpoints. requirements-dev adds fastapi + httpx. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9288219 to
5327fb9
Compare
There was a problem hiding this comment.
QA Audit — PR #8 | feat: console board view — two-tab Issues/PRs panel (themed)
VERDICT: WARN (CI non-terminal; comment-only pending test completion)
CI Status
test: queued — non-terminal; formal PASS/FAIL after checks settle
Diff Review
- New
api.py(153 lines): clean separation — data fns (fetch_issues/fetch_prs) in plain async (host-free testable), FastAPI imports lazy insidebuild_*routers __init__.py: router registrationhasattr-guarded, degrade-safe; lazy imports; log line correctly reflects theviewflagPROTO.md: docs updated with ADR references- Input validation solid:
bad_repocheck,_norm_statewhitelist, limit capped 1–100, error output truncated, JSON parse in try/except
Observations
- LOW (clawpatch): repo not in project registry — structural review skipped; diff-based review only
- NOTE:
POST /issuereuses the samefile_issuegate path as the/issuecommand — good, prevents divergence - NOTE:
view.py+ test files are in the remaining ~400 lines of diff not shown in the summary; no findings from what's visible
— Quinn, QA Engineer
|
Submitted COMMENT review on #8. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The plugin's own console board view — a quick read of a project's board, modelled on protoMaker's
github-viewbut rebuilt in our design system (--pl-*tokens, no host build).view.py— a self-contained, themed PAGE (vanilla JS): two tabs Issues / Pull Requests, a repo picker fed from the configuredgithub.repos, an open/closed/all state filter, list rows (state dot,#number, title, author·date, label pills; PRs add draft/review/branch), and a New issue form.api.py— two routers (the notes-plugin pattern): the PAGE on the PUBLIC/plugins/githubprefix (iframe-loadable — a page-load can't carry a bearer) and the GATED DATA routes on/api/plugins/github(config/issues/prs/issue), fetched with the DS plugin-kit'sapiFetchbearer handshake.POST /issuereuses the samefile_issuegate path as the/issuecommand, so the dialog and the command can't diverge. Data logic lives in plain async fns (host-free testable); fastapi imports are lazy.__init__.py— registers both routers when the host exposesregister_router, guarded so an older host still loads the tools +/issue. The manifest'sviews:entry opens it in the right dock (placement: right; views are drag-sortable in the console).Theming
Page links the DS
plugin-kit.css/.js;initPluginViewapplies the operator's live--pl-*theme (and re-themes),apiFetchattaches the bearer + is slug-aware (works through the fleet/agents/<slug>proxy). Slug-aware base, escape-on-render.Tests
fetch_issues/fetch_prs) withrun_ghmocked; the routes via FastAPITestClient(config/issues/prs/issue, incl. the gate + default-repo path); register wires both routers; legacy-host (noregister_router) still loads tools; the page references the gated endpoints + the DS kit.ruff check .,ruff format --check .,pytest -q→ 78 passed.requirements-devaddsfastapi+httpx(test-only; the host provides fastapi at runtime).🤖 Generated with Claude Code