Skip to content

Latest commit

 

History

History
133 lines (105 loc) · 8.26 KB

File metadata and controls

133 lines (105 loc) · 8.26 KB

Showcase

The window, the launcher, and agents driving both — on camera. Every recording here is generated or recorded against the demo snapshot (examples/demo.db, 534 issues); the spec or tape that produced each one is linked under it, and project/MEDIA.md says how to regenerate them. The README keeps one of these; the rest live here so the front door stays short.

One index

⌘K is the one index — titles, bodies, comments, issues and pages. The chips on the list do not apply. That is why a comment-only word still finds the row.

A Project chip is on the list; ⌘K opens the palette, a comment-only word is typed, and All search fills with rows from other projects, each labelled Comment match with a snippet
Generated from e2e/demo/search-demo.spec.ts against the demo snapshot.

The shell is in the window

In gadak's terminal pane, gadak claim names the shell's tab after the issue and moves the row; then gadak sql piped into gadak views open --keys - turns the list above into those five keys, and gadak views open --jql lands it on project, priority and unresolved chips
Typed into gadak's own pane: gadak claim first, so the tab carries the issue's key, then the pipe and the JQL. gadak views open writes a one-shot hash; the list above applies it. The recording adds a priority clause — in --jql a priority or status name is matched as the literal string your Jira stores, which is localized, so the README example leaves it out. Generated from e2e/demo/terminal-demo.spec.ts (make media-terminal).

gadak sql --no-header "select key from issues_full where status_category = 'inprogress'
                       order by status_changed_at asc limit 5" | gadak views open --keys -
gadak views open --jql 'project = NMA AND resolution is EMPTY'

gadak views open is the "open in gadak" verb; gadak open KEY leaves for Jira. The list box takes the same JQL paste as gadak search --jql; clauses gadak cannot express are listed, never dropped.

Two takes: a wall, and a look

Two takes from the same rig, each following one job to the end. Nothing in either is scripted but the opening sentence — the commands, the HTML and the recovery are the model's:

Asked for a triage dashboard, a live Claude Code session queries the mirror, writes the HTML, saves it with three datasources and opens it; the wall paints status cards, a per-month line chart and a list of the oldest open issues, then an issue key on the wall is clicked and the app opens that issue Asked for the team look, a live Claude Code session sets the accent, the label and issue-type colors and the row height and body size; one write saves with a warning that prints the whole type ladder, and the session reads the warning and restores the step itself
It builds the wall, and the wall links back. A dashboard is one HTML document plus named queries. The keys it puts on the wall are real links — the frame asks the app to navigate, so a click lands on the issue instead of leaving the page. It changes the look, and keeps what you asked for. Token writes apply and then say how they will read; only what the machine cannot honor is refused. Here the warning names the whole type ladder and the session repairs the step on its own.

Recorded from claude-dashboards.tape and claude-tokens.tape against the demo snapshot. Full-resolution MP4s: dashboards · tokens.

Dashboards

When the answer is a wall rather than a list, author a dashboard — one HTML document plus registered datasources, rendered sandboxed in the web tab: DASHBOARDS.md.

A terminal saves a dashboard — one HTML file plus four datasources over the mirror — and the web tab renders the triage wall: status counters and the top open issues by priority; a second save swaps the open frame in place
gadak dashboards save registers the document and its datasources; the host runs the queries and pushes rows in, and a re-save swaps an open frame in about a second. Charts come from a locally served uPlot — no CDN, no CSP widening. Generated from e2e/demo/dashboards-demo.spec.ts.

Colors are config

The window keeps one paper metaphor across four palettes — light, a neutral-cool dark, blue-black ink, and warm ember. The theme follows the system unless you pick one, and it belongs to the workspace, not the browser: gadak config set appearance.theme ink. Every field the settings dialog edits is a CLI verb over the same validation (gadak config list, gadak config set …), so setup is not a screen an agent has to click.

A terminal sets ui.tokens and ui.dataColors and the open tab retints live — accent, chips and breakdown colors change with no reload; a write to the locked bg-base saves with a warning that names the reason
ui.tokens / ui.dataColors flow from the CLI into an open tab with no reload, and the keys a palette owns refuse an override instead of silently breaking the paper. Generated from e2e/demo/tokens-demo.spec.ts.

A launcher is a surface

Two surfaces is not a closed list. Reading the mirror is one binary call (gadak search --json, ~20 ms), and opening anything in the app is one URL (gadak://view?issue=…the scheme), so whatever can do those two things becomes a surface.

Raycast searches the local gadak mirror as you type — a text query shows the matched snippet in bold with a field tag, then typing the bare issue key finds that issue, and Enter opens it in the Gadak app through a gadak:// deep link
Each keystroke is one gadak search --json; Enter is the deep link. A saved view travels the same way — gadak views open prints its link.

That launcher exists: a Raycast extension that searches issues and wiki documents as you type, submitted to the Raycast Store. Until the review lands, one command installs it from the binary you already have (embedded, no checkout):

gadak raycast install

The macOS app has the same install as a button — Settings → Integrations lists Raycast, the agent skill and MCP, shows what is already installed, and runs the exact command it prints. Building on the extension itself: ../contrib/raycast/. With no extension at all, a Raycast Quicklink pointed at gadak://view?issue={argument} covers the open-by-key half.

A live MCP session

For hosts without a shell (Claude Desktop), the same mirror is an MCP server. Ask the thing Jira cannot answer at all, because the wiki is a second search: "what do we know about X?" One index holds both, so the answer can put a ticket and the design doc that drove it in the same sentence.

Claude Code registers gadak as an MCP server, is asked to search Jira and the wiki for idempotency, calls gadak, and answers with an issue and the Confluence brief that drove it
Five tools; no writes to the mirror or to Jira. A host with a shell can use gadak sql instead. Setup: MCP.md.