feat(dashboard): add multi-level repo shell with searchable loop navigation - #75
Conversation
…gation Replace the flat dashboard loop list with a three-level shell: a repository index, a per-repo view with Loops/Groups/Findings/Plans sections, and a per-loop detail with tabs. Add a searchable loop picker in the breadcrumb that lists every repo loop sorted most recent first with a timestamp, supports type-to-filter and arrow/Enter/Escape keyboard navigation, and preserves the active tab on jump. The recency-ordered options drive both the picker and the prev/next pager so they agree on order. Hide the repo-level section-nav inside a loop detail, leaving only the loop tabs.
Replace the internal scroll box with a full-height body that toggles collapse via an accessible caret, and promote the state-machine graph on the timeline tab out of a <details> block to always-visible.
* feat: add plan-authoring tools, capture, and structure utilities Introduces a plan-authoring tool surface with capture and parsing helpers, section-bootstrap and decomposer updates, plus tests across plan-authoring, capture, structure, fences, and TUI stored-plan state. * refactor: centralize plan-authoring tool names and plan-of-record resolution --------- Co-authored-by: Forge <forge@example.com>
📝 WalkthroughWalkthroughThe PR introduces SQL-backed plan authoring with marker-based fallback, scoped dashboard routing and payloads, role-based usage aggregation, unified Forge database path resolution, feature-group and repository queries, updated TUI plan sourcing, refreshed styling, and extensive regression coverage. ChangesPlan authoring and capture
Scoped dashboard
Usage and storage integration
Estimated code review effort: 5 (Critical) | ~120 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
…d UI refinements (#77) * feat(dashboard): reduce poll/render cost with leaner usage queries and UI refinements * refactor: unify forge-db path and active-loop guards, slim dashboard payload * Update test/utils/tui-client-stored-plan.test.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: Forge <forge@example.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (3)
src/dashboard/data.ts (1)
199-205: 🚀 Performance & Scalability | 🔵 Trivial | ⚖️ Poor tradeoffFindings/usage still fan out one query per loop in the scoped project.
bugCounts/sectionCountswere batched, butlistByLoopNameandgetAggregaterun per loop for every loop in the scoped project (onlyfindings/usagerows are needed, and the repo-level Findings panel consumes all of them). For repos with many loops this is the dominant cost of a scoped poll every 5s. Consider batchedlistByProject/aggregatesByLoopvariants mirroringbugCountsByLoop.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/dashboard/data.ts` around lines 199 - 205, Batch scoped-project findings and usage retrieval before the loop, replacing per-loop calls to reviewFindingsRepo.listByLoopName and loopSessionUsageRepo.getAggregate with project-level listByProject and aggregatesByLoop results keyed by loop name. Preserve empty results for unscoped projects and use the precomputed values when assigning findings and usage inside the loop.src/tools/loop.ts (1)
489-496: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueHoist
formatCumulativeUsageto a static import.The module is already statically imported for
formatPostActionReport/formatAuditResult, so the threeawait import('../utils/loop-format')sites (here, line 599, and line 330) buy nothing and add async work on the status path.Also applies to: 599-606
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/tools/loop.ts` around lines 489 - 496, Replace the dynamic import of formatCumulativeUsage in the status path with a static import from ../utils/loop-format, consolidating it with the existing static imports for formatPostActionReport and formatAuditResult. Apply the same change to the other formatCumulativeUsage usage sites around the referenced lines, while preserving their existing calls and behavior.src/dashboard/render.ts (1)
270-271: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueMonospace stack is duplicated instead of using
var(--mono).
--monois defined in:rootbut several rules still inline'SF Mono','Fira Code',Menlo,Consolas,monospace(also at lines 343, 488, 528, 533, 544). Same drift the hex-token test guards against, just for fonts.Also applies to: 380-381, 408-409
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/dashboard/render.ts` around lines 270 - 271, Replace the duplicated inline monospace font stack in the CSS rules for .section-duration, .section-attempts, and the additional affected rules with the existing var(--mono) token. Update every referenced occurrence while preserving each rule’s other styles unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/agents-and-commands.md`:
- Line 12: Update the auditor exclusion entries in both
docs/agents-and-commands.md:12-12 and
docs/api/_media/agents-and-commands.md:12-12 to include plan-write and plan-edit
alongside plan and plan_exit, matching the shared PLAN_AUTHORING_TOOL_NAMES deny
list. Keep the mirrored tables consistent.
In `@docs/tools.md`:
- Around line 55-57: Update the plan-edit documentation to remove the trailing
space from the inline code span containing the line-number prefix, and describe
that spacing in surrounding prose instead while preserving the documented
behavior.
In `@README.md`:
- Line 128: Update the README statement about execution being dispatched without
additional LLM calls to scope it explicitly to New session and Execute modes.
Clarify that Loop mode remains an exception and requires the architect to invoke
execute-plan, consistent with the existing Loop-mode documentation.
- Line 328: Update the README description of marker-based plan capture to state
that it is used when no stored plan was written, rather than only when
plan-write/plan-edit tools are unavailable. Preserve the existing explanation of
the forge-plan markers and automatic capture behavior.
In `@test/dashboard/app-helpers.test.ts`:
- Around line 465-476: Update the makeDash helper to include default values for
all newly required DashboardLoop fields, including hasPlan, sectionCount, and
bugCount, while preserving the existing overrides supplied through the over
parameter.
In `@test/dashboard/render.test.ts`:
- Around line 76-83: Update the static-class coverage test around
renderDashboardHtml and staticAppClassNames to render the dashboard HTML once,
then check stylesheet selectors with a class-name boundary so a class is not
considered covered by a longer prefixed class. Preserve the existing
UNSTYLED_BY_DESIGN exclusions and empty unstyled assertion.
---
Nitpick comments:
In `@src/dashboard/data.ts`:
- Around line 199-205: Batch scoped-project findings and usage retrieval before
the loop, replacing per-loop calls to reviewFindingsRepo.listByLoopName and
loopSessionUsageRepo.getAggregate with project-level listByProject and
aggregatesByLoop results keyed by loop name. Preserve empty results for unscoped
projects and use the precomputed values when assigning findings and usage inside
the loop.
In `@src/dashboard/render.ts`:
- Around line 270-271: Replace the duplicated inline monospace font stack in the
CSS rules for .section-duration, .section-attempts, and the additional affected
rules with the existing var(--mono) token. Update every referenced occurrence
while preserving each rule’s other styles unchanged.
In `@src/tools/loop.ts`:
- Around line 489-496: Replace the dynamic import of formatCumulativeUsage in
the status path with a static import from ../utils/loop-format, consolidating it
with the existing static imports for formatPostActionReport and
formatAuditResult. Apply the same change to the other formatCumulativeUsage
usage sites around the referenced lines, while preserving their existing calls
and behavior.
🪄 Autofix (Beta)
✅ Autofix completed
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 9bb00837-a0af-43fe-afa7-17bf79c5a23c
📒 Files selected for processing (105)
AGENTS.mdREADME.mddocs/agents-and-commands.mddocs/api/README.mddocs/api/_media/agents-and-commands.mddocs/api/_media/architecture.mddocs/api/_media/loop-system.mddocs/api/_media/tools.mddocs/api/functions/createForgePlugin.mddocs/api/functions/createParentSessionLookup.mddocs/api/functions/createSessionDirectoryLookup.mddocs/api/interfaces/CompactionConfig.mddocs/api/interfaces/CreateParentSessionLookupOptions.mddocs/api/interfaces/CreateSessionDirectoryLookupOptions.mddocs/api/interfaces/PluginConfig.mddocs/api/variables/VERSION.mddocs/api/variables/default.mddocs/architecture.mddocs/loop-system.mddocs/modules.mddocs/tools.mdscripts/dashboard.tssrc/agents/auditor.tssrc/agents/code.tssrc/agents/feature-splitter.tssrc/constants/loop.tssrc/dashboard/app-bundle.tssrc/dashboard/app/app.tssrc/dashboard/app/components.tssrc/dashboard/app/helpers.tssrc/dashboard/app/machine-graph.tssrc/dashboard/app/types.tssrc/dashboard/data.tssrc/dashboard/launch.tssrc/dashboard/render.tssrc/dashboard/server.tssrc/hooks/plan-approval.tssrc/hooks/plan-capture.tssrc/index.tssrc/loop/service.tssrc/loop/token-usage.tssrc/prompts/agents/architect-auto.mdsrc/prompts/agents/architect.mdsrc/services/deterministic-decomposer.tssrc/services/execution.tssrc/services/group-orchestrator.tssrc/services/plan-capture.tssrc/services/section-bootstrap.tssrc/storage/database.tssrc/storage/index.tssrc/storage/repos/feature-groups-repo.tssrc/storage/repos/loop-session-usage-repo.tssrc/storage/repos/loop-transitions-repo.tssrc/storage/repos/plans-repo.tssrc/storage/repos/review-findings-repo.tssrc/storage/repos/section-plans-repo.tssrc/tools/index.tssrc/tools/loop.tssrc/tools/plan-adjust.tssrc/tools/plan-authoring.tssrc/tui.tsxsrc/utils/format.tssrc/utils/logger.tssrc/utils/loop-format.tssrc/utils/markdown-fences.tssrc/utils/marked-plan-parser.tssrc/utils/opencode-paths.tssrc/utils/plan-execution.tssrc/utils/plan-from-messages.tssrc/utils/plan-structure.tssrc/utils/tui-client.tssrc/utils/tui-loop-store.tstest/agent-tools-map.test.tstest/agents.test.tstest/config.test.tstest/constants/loop.test.tstest/dashboard/app-dom.test.tstest/dashboard/app-helpers.test.tstest/dashboard/data.test.tstest/dashboard/launch.test.tstest/dashboard/render.test.tstest/dashboard/server.test.tstest/deterministic-decomposer.test.tstest/hooks/plan-approval-dedupe.test.tstest/hooks/plan-approval-worktree-timing.test.tstest/loop-format.test.tstest/loop-permission-ruleset.test.tstest/loop-session-usage-repo.test.tstest/loop-status-tool.test.tstest/loop-tool-new-session.test.tstest/loop-transitions-repo.test.tstest/loop/token-usage.test.tstest/markdown-fences.test.tstest/plan-approval.test.tstest/plan-capture.test.tstest/plan-structure.test.tstest/plugin.test.tstest/prompts/loader.test.tstest/review-findings-repo.test.tstest/services/group-orchestrator.test.tstest/services/section-bootstrap.test.tstest/tools/plan-authoring.test.tstest/utils/tui-client-stored-plan.test.tstest/utils/tui-stored-plan.test.tstest/worktree-log.test.ts
| |---|---|---| | ||
| | `code` | `all` | Primary implementation agent. | | ||
| | `architect` | `primary` | Read-only planning agent. Produces marked plans for approval and execution. | | ||
| | `architect` | `primary` | Read-only planning agent. Authors the stored plan with `plan-write`/`plan-edit` for approval and execution; marked plans in chat are still captured. | |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bashset -euo pipefail
printf'\n== Files ==\n'
git ls-files 'docs/agents-and-commands.md''docs/api/_media/agents-and-commands.md'| cat
printf'\n== Relevant mentions in docs ==\n'
rg -n 'plan-write|plan-edit|plan_exit|plan\b|AUDITOR_TOOL_EXCLUDES|PLAN_AUTHORING_TOOL_NAMES|auditor' docs/agents-and-commands.md docs/api/_media/agents-and-commands.md
printf'\n== Search repo for tool name constants ==\n'
rg -n 'PLAN_AUTHORING_TOOL_NAMES|AUDITOR_TOOL_EXCLUDES|plan-write|plan-edit|plan_exit|plan'. --glob '!docs/api/_media/agents-and-commands.md' --glob '!docs/agents-and-commands.md'Repository: chriswritescode-dev/opencode-forge
Length of output: 50391
🏁 Script executed:
#!/bin/bashset -euo pipefail
echo'== docs/agents-and-commands.md =='
cat -n docs/agents-and-commands.md | sed -n '1,40p'echoecho'== docs/api/_media/agents-and-commands.md =='
cat -n docs/api/_media/agents-and-commands.md | sed -n '1,40p'echoecho'== targeted source search =='
rg -n 'AUDITOR_TOOL_EXCLUDES|PLAN_AUTHORING_TOOL_NAMES|plan-adjust|plan-write|plan-edit|plan_exit|plan_enter' src test docs -g '!docs/api/_media/agents-and-commands.md' -g '!docs/agents-and-commands.md'Repository: chriswritescode-dev/opencode-forge
Length of output: 36724
Document plan-write and plan-edit in the auditor exclusions.
Both docs still list only plan and plan_exit, but the shared auditor deny list also excludes plan-write and plan-edit via PLAN_AUTHORING_TOOL_NAMES; update the mirrored tables to match.
📍 Affects 2 files
docs/agents-and-commands.md#L12-L12(this comment)docs/api/_media/agents-and-commands.md#L12-L12
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/agents-and-commands.md` at line 12, Update the auditor exclusion entries
in both docs/agents-and-commands.md:12-12 and
docs/api/_media/agents-and-commands.md:12-12 to include plan-write and plan-edit
alongside plan and plan_exit, matching the shared PLAN_AUTHORING_TOOL_NAMES deny
list. Keep the mirrored tables consistent.
Source: Coding guidelines
| ### `plan-edit` | ||
| Edits the stored session plan by exact string replacement, the same way the Edit tool edits a file. Use `plan-read` to inspect the current text first; do not include `plan-read`'s `N: ` line-number prefixes in `oldString`. Subject to the same availability and running-loop guard as `plan-write`. On success the tool rewrites the plan through the shared session-scoped write path and returns a `Replaced N occurrence(s).` line followed by a structure report. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Remove padding inside the inline code span.
Line 57's `N: ` violates MD038. Describe the trailing space in prose instead.
Proposed fix
- do not include `plan-read`'s `N: ` line-number prefixes in `oldString`.+ do not include `plan-read`'s `N:` line-number prefixes (including their trailing space) in `oldString`.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ### `plan-edit` | |
| Edits the stored session plan by exact string replacement, the same way the Edit tool edits a file. Use `plan-read` to inspect the current text first; do not include `plan-read`'s `N:` line-number prefixes in `oldString`. Subject to the same availability and running-loop guard as `plan-write`. On success the tool rewrites the plan through the shared session-scoped write path and returns a `Replaced N occurrence(s).` line followed by a structure report. | |
| ### `plan-edit` | |
| Edits the stored session plan by exact string replacement, the same way the Edit tool edits a file. Use `plan-read` to inspect the current text first; do not include `plan-read`'s `N:` line-number prefixes (including their trailing space) in `oldString`. Subject to the same availability and running-loop guard as `plan-write`. On success the tool rewrites the plan through the shared session-scoped write path and returns a `Replaced N occurrence(s).` line followed by a structure report. |
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 57-57: Spaces inside code span elements
(MD038, no-space-in-code)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/tools.md` around lines 55 - 57, Update the plan-edit documentation to
remove the trailing space from the inline code span containing the line-number
prefix, and describe that spacing in surrounding prose instead while preserving
the documented behavior.
Source: Linters/SAST tools
| **Tool restrictions:** The auditor cannot use file-editing tools, planning tools, or loop-management tools. See [Auditor restrictions](docs/agents-and-commands.md#auditor-restrictions). | ||
| The architect agent operates as a read-only planner with message-level reinforcement via the `experimental.chat.messages.transform` hook. Final plans are rendered once in the assistant response between `<!-- forge-plan:start -->` and `<!-- forge-plan:end -->` markers, then auto-captured into SQL before execution approval. After user approval via the question tool, execution is dispatched programmatically — no additional LLM calls are needed. The user can view and edit the cached plan from the sidebar or command palette before or during execution. | ||
| The architect agent operates as a read-only planner with message-level reinforcement via the `experimental.chat.messages.transform` hook. Final plans are authored straight into SQL storage with the `plan-write` and `plan-edit` tools, which return a structure report the architect uses to fix warnings before asking for approval. A plan emitted in the assistant response between `<!-- forge-plan:start -->` and `<!-- forge-plan:end -->` markers is still auto-captured into the same row, so marker-only architect prompts keep working. After user approval via the question tool, execution is dispatched programmatically — no additional LLM calls are needed. The user can view and edit the stored plan from the sidebar or command palette before or during execution. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Scope the no-extra-call claim to non-loop execution modes.
The same page says Loop mode requires the architect to invoke execute-plan (Line 348, reinforced by src/index.ts Lines 781-782). Clarify that the “no additional LLM calls” behavior applies to New session and Execute here; Loop still requires the tool call.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` at line 128, Update the README statement about execution being
dispatched without additional LLM calls to scope it explicitly to New session
and Execute modes. Clarify that Loop mode remains an exception and requires the
architect to invoke execute-plan, consistent with the existing Loop-mode
documentation.
| ### How Plans Work | ||
| The architect is read-only and must output exactly one final planbetween `<!-- forge-plan:start -->` and `<!-- forge-plan:end -->` markers. Forge auto-captures that marked plan into SQL storage for the current session. | ||
| The architect is read-only and authors the plan into SQL storage for the current session with `plan-write`, appending further phases with `plan-write { append: true }` and revising with `plan-edit`. Every write returns a structure report — line/character counts, the detected `Loop Name:`, the sections the decomposer would emit, and warnings — so structural problems surface before approval. If those tools are unavailable, a plan emitted once between `<!-- forge-plan:start -->` and `<!-- forge-plan:end -->` markers is auto-captured into the same row. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Describe marker capture as a no-stored-plan fallback.
resolveSessionPlanOfRecord and the completion hook inspect marked messages whenever no stored plan exists; they do not check whether plan-write/plan-edit were unavailable. Replace “If those tools are unavailable” with “If no stored plan was written” or equivalent.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` at line 328, Update the README description of marker-based plan
capture to state that it is used when no stored plan was written, rather than
only when plan-write/plan-edit tools are unavailable. Preserve the existing
explanation of the forge-plan markers and automatic capture behavior.
| function makeDash(over: Partial<DashboardLoop> = {}): DashboardLoop { | ||
| return { | ||
| loop: mockLoopRow(), | ||
| lastAuditResult: null, | ||
| plan: null, | ||
| sections: [], | ||
| findings: [], | ||
| usage: null, | ||
| duration: null, | ||
| ...over, | ||
| } | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash# Inspect the DashboardLoop definition to confirm which fields are required.
fd -t f 'data.ts' src/dashboard --exec ast-grep outline {} --items all
rg -nP -A25 'export (interface|type) DashboardLoop\b' src/dashboardRepository: chriswritescode-dev/opencode-forge
Length of output: 3617
makeDash needs the required DashboardLoop fields.
DashboardLoop now includes required fields like hasPlan, sectionCount, and bugCount, but this helper still returns an incomplete object. Add the missing defaults here so typechecking stays green.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@test/dashboard/app-helpers.test.ts` around lines 465 - 476, Update the
makeDash helper to include default values for all newly required DashboardLoop
fields, including hasPlan, sectionCount, and bugCount, while preserving the
existing overrides supplied through the over parameter.
| test('every static class the app emits has a rule in the stylesheet', () => { | ||
| const style = renderDashboardHtml().slice(0, renderDashboardHtml().indexOf('</style>')) | ||
| const unstyled = staticAppClassNames().filter( | ||
| cls => !UNSTYLED_BY_DESIGN.has(cls) && !style.includes('.' + cls), | ||
| ) | ||
| expect(unstyled).toEqual([]) | ||
| }) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Prefix substring match makes the guard leaky.
style.includes('.' + cls) matches any longer selector sharing the prefix, so tab-body is "covered" by .tab-bodies and finding by .findings-panel. Match on a class-name boundary instead. Also renderDashboardHtml() is invoked twice here — hoist it like the other tests do.
💚 Boundary-aware match
test('every static class the app emits has a rule in the stylesheet', () => {
- const style = renderDashboardHtml().slice(0, renderDashboardHtml().indexOf('</style>'))- const unstyled = staticAppClassNames().filter(- cls => !UNSTYLED_BY_DESIGN.has(cls) && !style.includes('.' + cls),- )+ const html = renderDashboardHtml()+ const style = html.slice(html.indexOf('<style>'), html.indexOf('</style>'))+ const unstyled = staticAppClassNames().filter(+ cls =>+ !UNSTYLED_BY_DESIGN.has(cls) &&+ !new RegExp(`\\.${cls.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}(?![\\w-])`).test(style),+ )📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| test('every static class the app emits has a rule in the stylesheet',()=>{ | |
| conststyle=renderDashboardHtml().slice(0,renderDashboardHtml().indexOf('</style>')) | |
| constunstyled=staticAppClassNames().filter( | |
| cls=>!UNSTYLED_BY_DESIGN.has(cls)&&!style.includes('.'+cls), | |
| ) | |
| expect(unstyled).toEqual([]) | |
| }) | |
| test('every static class the app emits has a rule in the stylesheet',()=>{ | |
| consthtml=renderDashboardHtml() | |
| conststyle=html.slice(html.indexOf('<style>'),html.indexOf('</style>')) | |
| constunstyled=staticAppClassNames().filter( | |
| cls=> | |
| !UNSTYLED_BY_DESIGN.has(cls)&& | |
| !newRegExp(`\\.${cls.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')}(?![\\w-])`).test(style), | |
| ) | |
| expect(unstyled).toEqual([]) | |
| }) |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@test/dashboard/render.test.ts` around lines 76 - 83, Update the static-class
coverage test around renderDashboardHtml and staticAppClassNames to render the
dashboard HTML once, then check stylesheet selectors with a class-name boundary
so a class is not considered covered by a longer prefixed class. Preserve the
existing UNSTYLED_BY_DESIGN exclusions and empty unstyled assertion.
Note Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it. Fixes Applied SuccessfullyFixed 7 file(s) based on 6 unresolved review comments. Files modified:
Commit: The changes have been pushed to the Time taken: |
Fixed 7 file(s) based on 6 unresolved review comments. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Summary
Replaces the flat dashboard loop list with a three-level shell: a repository index, a per-repo view with Loops/Groups/Findings/Plans sections, and a per-loop detail with tabs. Adds a searchable loop picker in the breadcrumb and recency-ordered prev/next navigation that share the same loop ordering.
Key changes
Files changed
16 files changed, 6025 insertions(+), 510 deletions(-)
Summary by CodeRabbit