Skip to content

feat(vscode): add boards, shared JSON views across engines - #474

Merged
emaarco merged 6 commits into
issue-456from
issue-455
Oct 27, 2026
Merged

emaarco merged 6 commits into
issue-456from
issue-455

Conversation

@emaarco

@emaarco emaarco commented Oct 26, 2026 •

Copy link
Copy Markdown
Member

Why

Pulse for VS Code only has fixed screens, so teams can neither keep nor share the operational questions they ask again and again (orders waiting at a step, incidents across their processes, running instances of a process). Boards let a team keep these views as JSON files in the repository and read them across several engines. The format, the name and the scope come from a consensus of five reviews (architecture, ops on call, process developer, monorepo maintainer, UX), recorded in apps/vscode/docs/adr/boards.md.

What

  • .pulse/boards/*.board.json, parsed by hand in apps/vscode/src/core/boards (BoardParser): title, engines (profile names of .pulse-cli.json), and rows of { "row": [{ "widget", "props" }] }, the layout grammar of the MCP dashboards. It is not interchangeable with them, because data binding, widgets and engine scope differ. Every problem names its JSON path and reason. There is one filter vocabulary: process, activeElement, state, withIncident, businessKey. A board holds at most 12 widgets.
  • Five widgets, each across the board's engines or a subset of them:
    • counter: count per engine and in total, with a warning per engine.
    • instanceList: the first 50 matching instances of each engine in one table with an engine column, plus each engine's total.
    • incidentSummary: instances with incident per engine or per process, read from listDefinitions.
    • processDiagram: the latest deployed version of one process on one engine, with the running and incident badges of the definition panel (ElementBadges, now shared). A click on a count opens that panel at the element.
    • incidentList: the first 50 open incidents of each engine with element and message, optionally of one process. It says when more are open, since the contract has no incident count.
  • Honest numbers. Each engine is probed once with describeEngine before any other read, so a stale password costs one login per engine. Identical reads are made once per engine. A failed read shows "not read", never 0. A total says how many engines it counts ("from 2 of 3 engines"). One strip per engine that failed or is not configured, with Set credentials… or Edit connection….
  • New panel kind BoardPanel: it publishes only ready states, so PanelState and ViewSession stay single-engine.
  • The Copy action of a board list now reaches the clipboard; the board panel used to drop the copy intent.
  • New intents openBoardInstance, openBoardProcess, openBoardEngine, setBoardCredentials and openBoardFile. Each is opened only when the shown board lists the target on that engine, and only with a filter the definition panel can show.
  • Definition panels are now keyed by scope and business key too, so a click from a board never reveals a panel with another filter.
  • Host:
    • the Boards view, shown only when the workspace has a board;
    • a file watcher that reloads an open board on save, keeping the last valid board under the problems of a broken save;
    • "Pulse: New Board…", which writes a starter board and never overwrites one;
    • the hidden pulse.openBoard command.
  • apps/vscode/schemas/board.schema.json gives completion and checks in the editor through jsonValidation. It ships in the .vsix (.vscodeignore and the CI listing). test/architecture/board-schema.test.ts holds it equal to the parser's vocabulary.
  • Sandbox boards apps/vscode/sandbox/.pulse/boards/shop-operations.board.json and order-fulfillment.board.json, six new screenshot use cases, docs page docs/vscode/boards.md, ADR boards.md, and updates to architecture.md and user-interface.md.

Verification

  • pnpm build, pnpm typecheck, pnpm test and pnpm lint (ratchets, dependency rules, knip, docs references) pass at the root.
  • Extension suite: 1,199 tests, including:
    • parser, filter, panel and navigation tests over two fake engines;
    • an older read that answers last, and a closed panel;
    • host tests for the tree, the watcher, the navigation and New Board;
    • browser tests for every widget;
    • the schema drift test.
  • pnpm test:mutation over the changed core files scores 89.21 against the threshold of 79.
  • pnpm --filter pulse-cockpit run package ships extension/schemas/board.schema.json.
  • By hand in VS Code against the shop sandbox (sandbox:up), with shop-dev, shop-test behind a login and the unreachable prod-eu:
    • counts and lists across engines;
    • one strip per failing engine;
    • Set credentials… from the board;
    • clicks into the definition, instance and engine panels on the right engine;
    • reload on save and the last valid board kept under a broken save;
    • stacking in a narrow split, the light theme, and New Board.
  • Two things found by hand were fixed:
    • a click opened the latest version while the board counts every version; the tooltip now says so;
    • the warning colour of the threshold was overridden.
  • A separate review round (correctness, tests, UX) was addressed. A second review of the diagram and incident widgets found three more issues, all fixed: zoom keys reached every diagram on the board, a click on an element without counts did nothing, and an incident list over engines that all failed said "No open incident".

Out of scope / Follow-ups

The issue asked for three things this branch leaves out:

  • No health widget. A status strip per engine replaces it, so there is no green "healthy".
  • No var: columns. They need a variable projection in the contract, so the parser refuses them with a reason.
  • The name is Boards instead of cockpits, because "Cockpit" names Camunda's web app.

Planned as follow-ups:

  • Live updates for boards: one live loop per engine under pulse.liveUpdates.
  • The variable projection behind var: columns.
  • Oldest first and an age filter for instances that are stuck.
  • A real incident count in the contract.
  • One profile schema for .pulse-cli.json, shared with the CLI in a -domain package.

Seen while testing but not changed here: open panels, boards included, do not follow a theme switch until they are reopened.

Screenshots

A board across shop-dev, shop-test and an unreachable prod-eu:

A board across three engines

The board file with the schema:

The board file

A board around one process: the deployed diagram on two engines, their open incidents and the running orders:

A board around one process

A count in a board diagram opens the process filtered to that element:

A count opens the process at its element

A broken board names each problem with its path and reason:

A broken board

Closes #455

@netlify

netlify Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for spectacular-cobbler-f6c85b ready!

Name Link
🔨 Latest commit 8f20a5c
🔍 Latest deploy log https://app.netlify.com/projects/spectacular-cobbler-f6c85b/deploys/6ae0a0504747cb923c59ae22
😎 Deploy Preview https://deploy-preview-474--spectacular-cobbler-f6c85b.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@emaarco
emaarco changed the base branch from main to issue-456 October 27, 2026 12:11
@emaarco
emaarco added this pull request to stack #485 October 27, 2026 12:27
@emaarco
emaarco marked this pull request as ready for review October 27, 2026 12:28
Users keep operational views as .pulse/boards/*.board.json in the
repository. The Boards view lists them, a panel renders counter,
instanceList and incidentSummary widgets across the board's engines,
keeps every row and number with its engine, isolates an engine that
fails, and reloads on save. A JSON schema validates the files in the
editor; a broken file names each problem with its path and reason.

Refs #455
The board counts every version of a process, the definition panel shows
one version at a time. The tooltips say where a click lands, and the
sandbox board names its incident widgets after what they count.

Refs #455
- restore the vendored token files a formatter run had changed
- refuse an engine named twice and an instance list without columns
- keep the latest valid board when an older read answers last
- open a process only with a filter the definition panel can show and
  the shown board offers; key definition panels by scope and key too
- say which engines crossed a threshold, colour incident counts as
  incidents, and show "not read" instead of disabled buttons
- never let New Board overwrite a board
- one label per action, labelled sections and Ctrl/Cmd hints

Refs #455
The instance list of a board offered Copy, but the board panel ignored the copy intent. BoardNavigation now carries it to the clipboard.
Two widgets that need no contract change:
- processDiagram draws the latest deployed version of one process on one engine with the running and incident badges of the definition panel; a count opens that panel at the element.
- incidentList lists the first 50 open incidents of each engine with element and message, optionally of one process, and says when more are open.

The badges move into ElementBadges so the definition panel and the board draw them alike. The sandbox gets an Order fulfillment board, and the screenshots 44 and 45 show it.
@emaarco
emaarco merged commit 237eb97 into main Oct 27, 2026
38 of 57 checks passed
@emaarco
emaarco deleted the issue-455 branch October 27, 2026 13:11
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.

[Feature]: VS Code extension: user-defined cockpits from JSON

1 participant