Skip to content

feat(webui): align dashboard with re:cinq brand guidelines v1.0#685

Closed
nextlevelshit wants to merge 1496 commits intomainfrom
684-webui-brand-guidelines
Closed

feat(webui): align dashboard with re:cinq brand guidelines v1.0#685
nextlevelshit wants to merge 1496 commits intomainfrom
684-webui-brand-guidelines

Conversation

@nextlevelshit
Copy link
Copy Markdown
Collaborator

Summary

  • Replace all CSS color variables with re:cinq brand palette (Midnight Navy, Quantum Blue, Pulse Blue, Soft Indigo, Aurora gradient)
  • Update dark mode backgrounds from GitHub-dark (#0d1117) to Midnight Navy (#0F1F49)
  • Update light mode backgrounds to Crystal White / Neutral Fog, buttons and links to Quantum Blue (#0014EB)
  • Add Neue Montreal font via CDN with sensible sans-serif fallbacks
  • Replace inline Wave SVG logo with re:cinq leaf logomark in navbar

Related to #684

Changes

  • internal/webui/static/style.css — replaced all colour custom properties in :root and [data-theme="light"] blocks with brand palette hex values; added Neue Montreal @import; updated button, card, table, and status styles for brand consistency
  • internal/webui/templates/layout.html — replaced inline Wave SVG with re:cinq leaf logomark SVG; updated navbar brand text
  • docs/public/logo.svg — updated logo SVG to re:cinq leaf logomark
  • specs/684-webui-brand-guidelines/ — spec, plan, and tasks documents for the change

Test Plan

  • Ran wave serve and verified dashboard loads cleanly in browser
  • Confirmed dark mode uses Midnight Navy backgrounds
  • Confirmed light mode uses Crystal White / Neutral Fog
  • Verified Neue Montreal font renders with fallback
  • Verified navbar displays re:cinq leaf logomark
  • Checked status colours (completed/running/failed) remain distinguishable against new backgrounds
  • No legacy colour values (#4f46e5, #0d1117, #818cf8, #8b5cf6) remain in CSS

Table-driven tests covering all 16 timeout getters with nil receiver,
zero field, positive field, and negative field cases. Also tests
negative validation rejection and zero/positive acceptance.
Checks telos presence, bounded context count, context skill
provisioning (.wave/skills/wave-ctx-*/SKILL.md), and staleness
sentinel (.wave/.ontology-stale). Integrates into wave doctor,
TUI health, and WebUI health views.
Introduce a forge.Client interface with forge-neutral domain types
(Issue, PullRequest) and a GitHub adapter wrapping the existing
github.Client. Includes token resolution for GitHub, GitLab, Bitbucket,
and Gitea, plus an UnsupportedClient stub for non-GitHub forges.

Replace all *github.Client usage in webui, doctor, and TUI packages
with forge.Client, consolidating duplicated resolveGitHubToken() and
detectRepoSlug() functions into the forge package.

Closes #600
Add comprehensive test coverage for Bitbucket and Gitea forge variable
injection and resolution, matching the existing GitHub/GitLab tests.

New tests in context_test.go:
- TestInjectForgeVariables_Bitbucket (10 sub-tests)
- TestInjectForgeVariables_Gitea (10 sub-tests)
- TestInjectForgeVariables_Unknown (edge case: empty/fallback values)
- TestInjectForgeVariables_EmptyForgeInfo (zero-value handling)
- TestForgeVariables_AllForgeTypes_ConsistentStructure (cross-forge parity)
- TestForgeVariables_MixedProjectAndForgeVars (namespace coexistence)
- TestForgeVariables_ConcurrentAccess (race condition coverage)

New file forge_integration_test.go:
- TestForgeIntegration_PromptResolution (4 forges)
- TestForgeIntegration_PersonaResolution (4 forges)
- TestForgeIntegration_ContractCommandResolution (4 forges)
- TestForgeIntegration_SourcePathResolution (4 forges)
- TestForgeIntegration_FullExecutorFlow_GitHub (native env)

New edge cases in detect_test.go:
- FilterPipelinesByForge with empty input and no-prefix pipelines
- Subdomain variant detection (enterprise.github.com, etc.)
- SSH URLs with ports
- Slug generation for all forge types

Closes #560
…lient

Fixes review finding: UnsupportedClient broke nil-guard pattern causing
cryptic errors for non-GitHub forge users. Also removes unused
ErrNotConfigured, adds nil validation to NewGitHubClient, and fixes
gofmt alignment.
Remove t.Skip() without linked issue by restructuring full executor flow
test to use synthetic ForgeInfo for all 4 forge types. Add post-completion
assertions to concurrent access test verifying forge.type and
forge.cli_tool are internally consistent.
feat(forge): add forge.Client interface for forge-agnostic API access
test(forge): add end-to-end multi-forge pipeline tests
- Remove duplicate replaceBoth block in context.go (lines 110-113)
- Hoist 4 regexes to package-level vars in context.go (compiled once)
- Log forge API errors in doctor instead of silently swallowing
- Add assertions to SSH-with-port test (was a no-op)
- Add 5s timeout to `gh auth token` subprocess via CommandContext
- Simplify TUI forge detection (remove redundant Detect call)
fix: address PR review tech debt from #602 and #603
Planning artifacts for per-step adapter/model selection, Codex and
Gemini CLI adapters, AdapterRegistry, fallback chains, and preflight
validation. No implementation code yet.
… and guardrails

Add pipeline-level lifecycle hooks system with 10 lifecycle events,
4 hook types (command, HTTP, LLM judge, script), regex-based step
matchers, blocking/non-blocking semantics, and fail-open/fail-closed
behavior.

New package internal/hooks/ with HookRunner interface integrated into
the pipeline executor at all lifecycle boundaries (run start/complete/fail,
step start/complete/fail/retry, workspace created, contract validated,
artifact created).
…l assignment

Add per-step adapter and model selection to Wave pipelines:

- Add Adapter and Model fields to Step struct for step-level overrides
- Create AdapterRegistry for per-step adapter resolution (step > persona > manifest)
- Implement Codex CLI adapter (internal/adapter/codex.go)
- Implement Gemini CLI adapter (internal/adapter/gemini.go)
- Extend resolveModel with four-tier precedence: CLI > step > persona > empty
- Add fallback chain config (runtime.fallbacks) with retry on transient errors
- Validate fallback config, step adapter references, and multi-adapter binaries
- Extend preflight to check all adapter binaries referenced by pipeline steps
- Wire AdapterRegistry through executor options and run.go
Add spec, implementation plan, and task breakdown for extending Wave's
DAG executor to support directed graphs with backward edges, conditional
routing, command steps, and visit tracking safety limits.
…reaker and intelligent retry

Add 6-class failure taxonomy (transient, deterministic, budget_exhausted,
contract_failure, test_failure, canceled) with classification-aware retry
decisions in the executor. Non-retryable failures (deterministic, budget,
canceled) skip remaining retry attempts immediately.

Circuit breaker tracks normalized failure fingerprints and terminates
steps when the same failure repeats N times (configurable, default 3).
Fingerprints strip timestamps, line numbers, UUIDs, and temp paths for
stable matching.

Four retry policy presets (none, standard, aggressive, patient) resolve
to concrete RetryConfig values at pipeline load time. Explicit values
override policy defaults.

Stall watchdog monitors step execution for activity and cancels the
context if no progress events are received within a configurable timeout.

Adds FailureClass field to event.Event for failure analytics and bridges
pipeline failure classes to recovery ErrorClass for hint generation.
…ment workflows #580

Add interactive choice-based approval gates to the pipeline executor,
enabling supervised workflows where humans review and approve at
critical decision points before execution proceeds.

Key changes:
- GateChoice/GateConfig extensions with choices, freeform, default fields
- GateHandler interface with CLI, TUI, WebUI, and AutoApprove implementations
- GateDecision value type with template variable resolution (gate.<step>.choice etc.)
- Choice routing: _fail aborts pipeline, prior step re-queues for revision loops
- --auto-approve CLI flag for CI/detached mode
- POST /api/runs/{id}/gates/{step}/approve REST endpoint
- plan-approve-implement example pipeline
- Fix DecisionSkip causing false pipeline failure: RunHooks() now treats
  DecisionSkip alongside DecisionProceed as a non-failure outcome
- Fix full environment inheritance bypassing sandbox: command and script
  hooks now use a curated env (HOME, PATH, TERM, TMPDIR, WAVE_HOOK_*)
  instead of passing os.Environ()
- Fix SSRF via unrestricted HTTP hook URLs: block RFC 1918, link-local,
  loopback, and cloud metadata addresses before making requests
- Fix run_failed/run_completed hooks receiving cancelled context: terminal
  lifecycle hooks now use a detached context with 30s timeout
- Fix unbounded HTTP response body: use io.LimitReader with 1MB cap
- Remove redundant os.ExpandEnv from command.go (shell handles expansion)
- Add duplicate hook name validation in manifest parser
- Extract shared exit code handling into exitcode.go
- Extract shared hook environment building into env.go
)

Add directed graph execution mode to Wave's pipeline executor, enabling
implement-test-fix cycles with backward edges, conditional routing, and
command steps.

New features:
- GraphWalker: edge-following executor with visit tracking
- Condition parser: outcome=success/failure, context.KEY=VALUE expressions
- Command steps: type=command with shell script execution via os/exec
- Conditional steps: type=conditional for routing without adapter execution
- Circuit breaker: terminates loops after 3 identical error signatures
- Safety limits: per-step max_visits (default 10), pipeline max_step_visits (default 50)

Dual-mode execution: existing DAG pipelines unchanged (backward compatible),
graph mode activates only when steps define edges or type=conditional.

State persistence: visit counts stored in step_state table (migration 12)
for resume support.
- Wire NotifyActivity() into OnStreamEvent callback so stall watchdog
  receives heartbeats on tool_use events (was never called, watchdog dead)
- Pass stepCtx.Err() instead of ctx.Err() to ClassifyStepFailure so
  watchdog cancellation is properly detected as stall timeout
- Parse and apply MaxDelay in ComputeDelay() across all backoff strategies
  instead of only using the package-level RetryMaxDelay constant
- Tighten pattern matching: "429" -> "status 429"/"http 429"/"error 429",
  "fail:" -> "--- fail:", "go test"/"npm test"/"pytest" require delimiter
- Return empty string from ClassifyStepFailure(nil, nil, nil) instead of
  "transient" — no failure to classify means no class
- Add CircuitBreaker.Limit() getter with mutex protection; use it in
  executor instead of direct field access
- Remove dead ClassifyFromFailureClass from recovery/classify.go (unused
  outside its own test)
- Add maxGateRequeues counter (default 10) to the scheduling loop to
  prevent unbounded revision loops when gate re-queuing bypasses
  LoopConfig.MaxIterations
- Wire GateConfig.Validate(stepIDs) into ValidateDAG so gate choice
  keys, targets, and defaults are validated during pipeline loading
- Fix artifact path in executeGateStep to use workspace root via
  filepath.Join instead of a relative .wave/artifacts/ path
Add opt-in conversation continuity to Wave's pipeline executor via
thread and fidelity step attributes. Steps sharing a thread group
receive prior conversation context based on configurable fidelity
levels (full/compact/summary/fresh), enabling fix loops to see what
prior steps did without breaking Wave's fresh-memory-by-default
security model.

Key changes:
- Thread and Fidelity fields on Step struct (types.go)
- ThreadManager with transcript storage, fidelity formatting, and
  size-capped truncation (thread.go)
- Executor integration: transcript injection before adapter call,
  stdout capture after adapter call (executor.go)
- DAG validation: thread groups must form dependency chains,
  mixed-persona warnings, fidelity value validation (dag.go)
- Summary fidelity uses relay CompactionAdapter with compact fallback
- Comprehensive tests: 21 new tests covering ThreadManager, DAG
  validation, and executor integration
…ity assessment #584

Add new llm_judge contract type that uses a cheap LLM to evaluate step
output against human-defined criteria with threshold-based pass/fail.

- Add Model, Criteria, Threshold fields to contract and pipeline configs
- Implement llmJudgeValidator with Anthropic Messages API integration
- Wire new fields through executor validation block
- Add llm_judge case to buildContractPrompt for persona guidance
- Comprehensive tests with httptest mock server
#585

Add SubPipelineConfig struct with bidirectional artifact flow (inject/extract),
lifecycle management (timeout, max_cycles, stop_condition), parent-child state
tracking in SQLite, and context merging between parent and child pipelines.

Key changes:
- SubPipelineConfig type with Validate() and ParseTimeout() methods
- Artifact inject/extract functions in subpipeline.go
- PipelineContext.MergeFrom() for child->parent context merge
- Enhanced executeCompositionStep() with artifact flow and lifecycle timeout
- Parent-child run linkage in SQLite (migration 12)
- Circular sub-pipeline detection via DFS graph walk
- Dry run validation for new config fields
- Atomic InjectForgeVariables to fix pre-existing race condition
nextlevelshit and others added 26 commits April 1, 2026 18:27
…ters

feat: multi-adapter support — opencode, gemini, codex with --adapter flag
…oss templates

- Replace nonexistent .data-table/.table-container with .table (the actual
  CSS class) in webhooks, webhook_detail, admin, and personas templates
- Fix display:flex on <td> breaking table-cell layout in webhooks actions
  column — replaced with .pipeline-actions-cell (white-space: nowrap)
- Replace undefined CSS variables (--success, --muted, --danger, --surface,
  --border, --text) with correct --color-* equivalents across 6 templates
- Clean up indentation in webhook table markup

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the flat 14-item horizontal navbar with a persistent left sidebar
containing 5 collapsible navigation groups (Operate, Forge, Insights,
Configure, System), each with inline SVG icons.

- Desktop (>1024px): Full 220px sidebar with icons + labels
- Tablet (768-1024px): Collapsed 56px sidebar with icons only
- Mobile (<768px): Hidden sidebar with hamburger toggle + overlay
- Nav group collapse state persisted via localStorage
- Keyboard shortcuts preserved (g+r, g+p, g+h, t, ?)
…CI failure

The click command in TestIntegrationFormInteraction fired before the DOM
was ready, causing subsequent commands to be skipped (only 1 result
instead of 4). Adding WaitFor: "#result" ensures get_text runs after
the JS onclick handler updates the DOM.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…run detail redesign

Phase 1 — Start form enhancement:
- Add adapter dropdown, model input, dry-run checkbox, timeout input
- Fetch and display step list preview with personas and artifacts
- Add step selection checkboxes (run all, individual include/exclude)
- Wire model/adapter/timeout/dry-run/step-filter through executor options
- Add GET /api/adapters endpoint for populating adapter dropdown
- Extend StartPipelineRequest and SubmitRunRequest with new fields

Phase 2 — Run detail redesign:
- Split summary bar into primary strip (duration, steps, tokens, adapters,
  models) and collapsible secondary strip (started, finished, category,
  skills, input)
- Step card hierarchy: running expanded, completed collapsed, pending dimmed
- Add collapse all / expand all buttons to steps toolbar

Phase 3 — Step selection:
- Per-step checkboxes in pipeline preview with "Run all steps" toggle
- Smart steps/exclude mode selection based on checked count

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@nextlevelshit nextlevelshit force-pushed the 684-webui-brand-guidelines branch from cfe0259 to 1b52231 Compare April 3, 2026 18:15
@nextlevelshit nextlevelshit force-pushed the main branch 2 times, most recently from 9bfa984 to 9de03c5 Compare April 12, 2026 14:21
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