feat(webui): align dashboard with re:cinq brand guidelines v1.0#685
Closed
nextlevelshit wants to merge 1496 commits intomainfrom
Closed
feat(webui): align dashboard with re:cinq brand guidelines v1.0#685nextlevelshit wants to merge 1496 commits intomainfrom
nextlevelshit wants to merge 1496 commits intomainfrom
Conversation
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)
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
…ters feat: multi-adapter support — opencode, gemini, codex with --adapter flag
…ader, dedup rules
…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>
cfe0259 to
1b52231
Compare
9bfa984 to
9de03c5
Compare
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.
Summary
#0d1117) to Midnight Navy (#0F1F49)#0014EB)Related to #684
Changes
internal/webui/static/style.css— replaced all colour custom properties in:rootand[data-theme="light"]blocks with brand palette hex values; added Neue Montreal@import; updated button, card, table, and status styles for brand consistencyinternal/webui/templates/layout.html— replaced inline Wave SVG with re:cinq leaf logomark SVG; updated navbar brand textdocs/public/logo.svg— updated logo SVG to re:cinq leaf logomarkspecs/684-webui-brand-guidelines/— spec, plan, and tasks documents for the changeTest Plan
wave serveand verified dashboard loads cleanly in browser#4f46e5,#0d1117,#818cf8,#8b5cf6) remain in CSS