Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
7c7eaba
feat(webui): redesign pipeline detail page with v2 design language
nextlevelshit Apr 6, 2026
2fa7d21
refactor(webui): extract shared CSS to style.css, remove v2- prefix
nextlevelshit Apr 6, 2026
c879b78
feat(webui): redesign PR detail and issue detail with v2 design language
nextlevelshit Apr 6, 2026
b3ac54b
feat(webui): redesign pipelines, issues, PRs list pages with card layout
nextlevelshit Apr 6, 2026
4617488
feat(webui): redesign personas, contracts list+detail with card layout
nextlevelshit Apr 6, 2026
e89898b
fix(webui): move runs list CSS to style.css — fixes missing card styl…
nextlevelshit Apr 6, 2026
8ab4488
fix(webui): pipeline cards full-click, remove box-in-box on issue/PR …
nextlevelshit Apr 6, 2026
a5456ea
feat(webui): styled Load More button with spinner CSS for all list pages
nextlevelshit Apr 6, 2026
17a1e2a
fix(webui): base font 15px, pipeline steps clickable, IN/OUT spacing
nextlevelshit Apr 6, 2026
1cfdf38
fix(webui): audit fixes — badge styling, opacity, font sizes, hover c…
nextlevelshit Apr 6, 2026
26627fa
fix(webui): remove markdown body border, fix grammar, prep for infini…
nextlevelshit Apr 6, 2026
337ecbe
fix(webui): fix step expansion regression, infinite scroll, light mode
nextlevelshit Apr 6, 2026
7d75f1c
fix(webui): bump all remaining font sizes to 0.68rem minimum (WCAG co…
nextlevelshit Apr 6, 2026
f2c4d07
feat(webui): proper infinite scroll + resolved prompt variables
nextlevelshit Apr 6, 2026
4366b0a
fix(webui): IN/OUT badge alignment, tab border, honest prompt display
nextlevelshit Apr 6, 2026
08fac00
fix(webui): escape Go template syntax in JS prompt regex
nextlevelshit Apr 6, 2026
8d29050
fix(webui): resolve input var in prompt, align OUT card tabs with con…
nextlevelshit Apr 6, 2026
c8a3c75
feat(webui): server-side template variable resolution for prompts
nextlevelshit Apr 6, 2026
d196ae2
fix(webui): run detail IN/OUT alignment, step indicator, link styling
nextlevelshit Apr 6, 2026
da65fc8
feat(webui): add pipeline filter dropdown and improve loading indicator
nextlevelshit Apr 6, 2026
c89e1b0
feat(webui): redesign pipeline overview with categories, stats, style…
nextlevelshit Apr 6, 2026
3dd7a72
feat(webui): restyle compose overview, sync pipeline detail dialog
nextlevelshit Apr 6, 2026
bc58369
fix(webui): issue overview toolbar, detail layout, comment card styling
nextlevelshit Apr 6, 2026
a3e718d
feat(webui): PR overview toolbar, detail layout, commits, section cards
nextlevelshit Apr 6, 2026
3d5fdd4
fix(webui): forge fields are values not methods
nextlevelshit Apr 6, 2026
080f40a
feat(webui): wave stats in list cards, smart filter defaults, adapter…
nextlevelshit Apr 6, 2026
e70a418
fix(webui): deduplicate composition badge, fix IN/OUT text alignment
nextlevelshit Apr 6, 2026
adda410
fix(webui): comment card padding, toolbar controls, Wave-centric stats
nextlevelshit Apr 6, 2026
18982e4
fix(webui): alignment polish, commit rows, search, compose stats
nextlevelshit Apr 6, 2026
4ac6292
feat(webui): pipeline list text search with dynamic count
nextlevelshit Apr 6, 2026
a1fb022
fix(webui): run detail IN/OUT layout, detail page section order
nextlevelshit Apr 6, 2026
3a0ef15
feat(webui): search, open/closed counts on issue/PR overviews
nextlevelshit Apr 6, 2026
22c8863
fix(webui): composition pill dedup, code-styled step links, PR merge/…
nextlevelshit Apr 6, 2026
fac6769
fix(webui): remove stats border, inline author, drop OUT artifact tabs
nextlevelshit Apr 6, 2026
f0a6f11
fix(webui): Frequent default filter, persona prompt border cleanup
nextlevelshit Apr 6, 2026
3a7defe
feat(webui): search toolbars for contract and persona list pages
nextlevelshit Apr 7, 2026
239ffe0
fix(webui): log text alignment, infer category from pipeline name prefix
nextlevelshit Apr 7, 2026
c8bec06
fix(webui): runs "All" filter now works (was always defaulting to Run…
nextlevelshit Apr 7, 2026
579771a
docs(pipelines): prose descriptions for top pipelines, cap descriptio…
nextlevelshit Apr 7, 2026
6359809
fix(webui): cap run detail description width to 48rem
nextlevelshit Apr 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .wave/pipelines/audit-dead-code.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: audit-dead-code
description: "Find dead or redundant code, remove it, and commit to a feature branch"
description: >-
Dead code detection pipeline that scans the codebase for unused functions,
unreachable branches, orphaned files, and redundant implementations.
Removes confirmed dead code, verifies tests still pass, and commits
the cleanup to a feature branch.
release: true

requires:
Expand Down
6 changes: 5 additions & 1 deletion .wave/pipelines/impl-issue.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: impl-issue
description: "Implement an issue end-to-end: fetch, assess, plan, implement, create PR"
description: >-
End-to-end issue implementation pipeline that fetches a GitHub issue,
assesses feasibility and complexity, generates an implementation plan,
writes the code in an isolated worktree, and opens a pull request
with the changes.
release: true

chat_context:
Expand Down
5 changes: 4 additions & 1 deletion .wave/pipelines/ops-hello-world.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
kind: WavePipeline
metadata:
name: ops-hello-world
description: "Simple test pipeline to verify Wave is working"
description: >-
Minimal smoke-test pipeline that validates Wave's core execution loop
is functional. Runs a single trivial step to confirm adapter connectivity,
workspace creation, and artifact handling all work end-to-end.
release: true

input:
Expand Down
6 changes: 5 additions & 1 deletion .wave/pipelines/ops-implement-epic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
kind: WavePipeline
metadata:
name: ops-implement-epic
description: "Implement all child issues from a parent epic, gate on CI, then summarise"
description: >-
Epic implementation pipeline that iterates over all child issues of a
parent epic, implementing each one sequentially. Gates on CI passing
between issues, and produces a summary of all changes, PRs created,
and any issues that were skipped or failed.
category: composition
release: true

Expand Down
6 changes: 5 additions & 1 deletion .wave/pipelines/ops-parallel-audit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@
kind: WavePipeline
metadata:
name: ops-parallel-audit
description: "Fan out security, dead-code, and DX audits in parallel then merge findings"
description: >-
Parallel audit pipeline that fans out security vulnerability scanning,
dead-code detection, and developer experience analysis as concurrent
sub-pipelines. Aggregates all findings into a unified report sorted
by severity and actionability.
category: composition
release: true

Expand Down
5 changes: 4 additions & 1 deletion .wave/pipelines/ops-pr-fix-review.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
kind: WavePipeline
metadata:
name: ops-pr-fix-review
description: "Review → triage → fix → push → reply to review comments on a PR"
description: >-
Automated PR review-fix pipeline that fetches review comments, triages
findings by severity, applies code fixes in priority order, pushes the
changes, and replies to each review thread with resolution details.
category: composition
release: true

Expand Down
6 changes: 5 additions & 1 deletion .wave/pipelines/ops-pr-review.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: ops-pr-review
description: "Pull request code review with automated security and quality analysis"
description: >-
Automated pull request review pipeline that performs security scanning,
code quality analysis, and architectural assessment. Reviews each changed
file for vulnerabilities, anti-patterns, and maintainability concerns,
then posts structured findings as review comments on the PR.
release: true

chat_context:
Expand Down
6 changes: 5 additions & 1 deletion .wave/pipelines/ops-rewrite.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: ops-rewrite
description: "Analyze and rewrite poorly documented issues"
description: >-
Issue quality improvement pipeline that analyzes under-specified or
poorly documented issues, researches the codebase for context, and
rewrites the issue body with clear acceptance criteria, technical
details, and implementation guidance.
release: true

skills:
Expand Down
6 changes: 5 additions & 1 deletion internal/defaults/pipelines/audit-dead-code.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: audit-dead-code
description: "Find dead or redundant code, remove it, and commit to a feature branch"
description: >-
Dead code detection pipeline that scans the codebase for unused functions,
unreachable branches, orphaned files, and redundant implementations.
Removes confirmed dead code, verifies tests still pass, and commits
the cleanup to a feature branch.
release: true

requires:
Expand Down
6 changes: 5 additions & 1 deletion internal/defaults/pipelines/impl-issue.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: impl-issue
description: "Implement an issue end-to-end: fetch, assess, plan, implement, create PR"
description: >-
End-to-end issue implementation pipeline that fetches a GitHub issue,
assesses feasibility and complexity, generates an implementation plan,
writes the code in an isolated worktree, and opens a pull request
with the changes.
release: true

chat_context:
Expand Down
5 changes: 4 additions & 1 deletion internal/defaults/pipelines/ops-hello-world.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
kind: WavePipeline
metadata:
name: ops-hello-world
description: "Simple test pipeline to verify Wave is working"
description: >-
Minimal smoke-test pipeline that validates Wave's core execution loop
is functional. Runs a single trivial step to confirm adapter connectivity,
workspace creation, and artifact handling all work end-to-end.
release: true

input:
Expand Down
6 changes: 5 additions & 1 deletion internal/defaults/pipelines/ops-implement-epic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
kind: WavePipeline
metadata:
name: ops-implement-epic
description: "Implement all child issues from a parent epic, gate on CI, then summarise"
description: >-
Epic implementation pipeline that iterates over all child issues of a
parent epic, implementing each one sequentially. Gates on CI passing
between issues, and produces a summary of all changes, PRs created,
and any issues that were skipped or failed.
category: composition
release: true

Expand Down
6 changes: 5 additions & 1 deletion internal/defaults/pipelines/ops-parallel-audit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@
kind: WavePipeline
metadata:
name: ops-parallel-audit
description: "Fan out security, dead-code, and DX audits in parallel then merge findings"
description: >-
Parallel audit pipeline that fans out security vulnerability scanning,
dead-code detection, and developer experience analysis as concurrent
sub-pipelines. Aggregates all findings into a unified report sorted
by severity and actionability.
category: composition
release: true

Expand Down
6 changes: 5 additions & 1 deletion internal/defaults/pipelines/ops-pr-review.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: ops-pr-review
description: "Pull request code review with automated security and quality analysis"
description: >-
Automated pull request review pipeline that performs security scanning,
code quality analysis, and architectural assessment. Reviews each changed
file for vulnerabilities, anti-patterns, and maintainability concerns,
then posts structured findings as review comments on the PR.
release: true

chat_context:
Expand Down
6 changes: 5 additions & 1 deletion internal/defaults/pipelines/ops-rewrite.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
kind: WavePipeline
metadata:
name: ops-rewrite
description: "Analyze and rewrite poorly documented issues"
description: >-
Issue quality improvement pipeline that analyzes under-specified or
poorly documented issues, researches the codebase for context, and
rewrites the issue body with clear acceptance criteria, technical
details, and implementation guidance.
release: true

skills:
Expand Down
3 changes: 3 additions & 0 deletions internal/webui/embed.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package webui
import (
"embed"
"fmt"
"encoding/json"
"html/template"
"io/fs"
"net/http"
Expand Down Expand Up @@ -62,6 +63,8 @@ func parseTemplates(extraFuncs ...template.FuncMap) (map[string]*template.Templa
"formatBytes": formatBytesFunc,
"richInput": richInputFunc,
"friendlyModel": friendlyModelFunc,
"toJSON": func(v interface{}) string { b, _ := json.Marshal(v); return string(b) },
"formatTokensShort": formatTokensShort,
"shortRunID": func(id string) string { if len(id) > 12 { return id[:12] }; return id },
"titleCase": titleCaseFunc,
"contains": strings.Contains,
Expand Down
15 changes: 15 additions & 0 deletions internal/webui/handlers_compose.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,27 @@ import (
"strings"

"github.com/recinq/wave/internal/pipeline"
"github.com/recinq/wave/internal/state"
)

// handleComposePage handles GET /compose - serves the HTML composition pipelines page.
func (s *Server) handleComposePage(w http.ResponseWriter, r *http.Request) {
pipelines := getCompositionPipelines()

// Enrich with run counts
if s.store != nil {
allRuns, err := s.store.ListRuns(state.ListRunsOptions{Limit: 10000})
if err == nil {
counts := make(map[string]int)
for _, run := range allRuns {
counts[run.PipelineName]++
}
for i := range pipelines {
pipelines[i].RunCount = counts[pipelines[i].Name]
}
}
}

data := struct {
ActivePage string
Pipelines []CompositionPipeline
Expand Down
56 changes: 48 additions & 8 deletions internal/webui/handlers_issues.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ import (

// handleIssuesPage handles GET /issues - serves the HTML issues page.
func (s *Server) handleIssuesPage(w http.ResponseWriter, r *http.Request) {
stateFilter := validateStateFilter(r.URL.Query().Get("state"))
stateFilter := r.URL.Query().Get("state")
if stateFilter == "" {
stateFilter = "open"
}
page := parsePageNumber(r)
issueData := s.getIssueListData(stateFilter, page)

Expand Down Expand Up @@ -144,13 +147,27 @@ func (s *Server) handleIssueDetailPage(w http.ResponseWriter, r *http.Request) {
}
}

// Compute aggregate Wave stats
runCount := len(relatedRuns)
totalTokens := 0
lastStatus := ""
for _, r := range relatedRuns {
totalTokens += r.TotalTokens
if lastStatus == "" {
lastStatus = r.Status
}
}

data := struct {
ActivePage string
Issue IssueDetail
Runs []RunSummary
Comments []CommentSummary
ActivePage string
Issue IssueDetail
Runs []RunSummary
Comments []CommentSummary
RunCount int
TotalTokens int
LastStatus string
}{
ActivePage: "issues",
ActivePage: "issues",
Issue: IssueDetail{
Number: issue.Number,
Title: issue.Title,
Expand All @@ -164,8 +181,11 @@ func (s *Server) handleIssueDetailPage(w http.ResponseWriter, r *http.Request) {
UpdatedAt: issue.UpdatedAt.Format("2006-01-02 15:04"),
URL: issue.HTMLURL,
},
Runs: relatedRuns,
Comments: comments,
Runs: relatedRuns,
Comments: comments,
RunCount: runCount,
TotalTokens: totalTokens,
LastStatus: lastStatus,
}

w.Header().Set("Content-Type", "text/html; charset=utf-8")
Expand Down Expand Up @@ -250,12 +270,32 @@ func (s *Server) getIssueListData(stateFilter string, page int) IssueListRespons
summaries = []IssueSummary{}
}

// Enrich with Wave run stats
if s.store != nil {
allRuns, err := s.store.ListRuns(state.ListRunsOptions{Limit: 10000})
if err == nil {
enrichSummariesWithRuns(summaries, allRuns, "issue")
}
}

// Count open/closed from current page
var openCount, closedCount int
for _, s := range summaries {
if s.State == "open" {
openCount++
} else {
closedCount++
}
}

return IssueListResponse{
Issues: summaries,
RepoSlug: s.repoSlug,
FilterState: stateFilter,
Page: page,
HasMore: hasMore,
TotalOpen: openCount,
TotalClosed: closedCount,
}
}

Expand Down
Loading
Loading