Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
75d0c28
feat: add interactive terminal UI
apresmoi Jul 23, 2026
70abb47
feat: stream and group terminal dashboard
apresmoi Jul 23, 2026
2940fe7
fix: keep terminal copy generic
apresmoi Jul 23, 2026
8f4f509
feat: launch terminal UI with interactive flag
apresmoi Jul 23, 2026
763ce3c
fix: align terminal landing and enrich fire
apresmoi Jul 23, 2026
4111ba7
fix: unify terminal landing insets
apresmoi Jul 23, 2026
4b009de
fix: unify terminal tables and stable activity
apresmoi Jul 23, 2026
b4c678b
fix: clip terminal detail tables above footer
apresmoi Jul 23, 2026
0c206e5
fix: simplify terminal detail hierarchy
apresmoi Jul 23, 2026
def7d3c
fix: keep terminal detail content in viewport
apresmoi Jul 23, 2026
a7a7080
fix: bound terminal detail chrome
apresmoi Jul 23, 2026
48b16c4
feat: add Model Lab terminal protocol (B25)
apresmoi Jul 23, 2026
1fb1c43
feat: inventory console Oven behavior (B34)
apresmoi Jul 23, 2026
48dae92
feat: freeze terminal parity inventory (B1)
apresmoi Jul 23, 2026
6d319b1
feat: add off-screen terminal fixture harness (B6)
apresmoi Jul 23, 2026
8966199
feat: pair terminal frames in Storybook (B22)
apresmoi Jul 23, 2026
b7cff60
feat: assign Storybook parity ownership (B33)
apresmoi Jul 23, 2026
a033413
feat: define terminal Oven contracts (B2)
apresmoi Jul 24, 2026
62d6613
feat: share Oven value evaluation (B3)
apresmoi Jul 24, 2026
eee3a0d
feat: port terminal Oven state runtime (B4)
apresmoi Jul 24, 2026
7b867b3
feat: build responsive terminal layout primitives (B5)
apresmoi Jul 24, 2026
535bc2a
feat: render terminal KPI progress components (B7)
apresmoi Jul 24, 2026
1d51fd4
feat: add interactive terminal catalog (B23)
apresmoi Jul 24, 2026
90421fb
feat: render terminal table and list components (B8)
apresmoi Jul 24, 2026
5270b53
feat: render terminal heading and status surfaces (B9)
apresmoi Jul 24, 2026
4fe1d10
feat: render terminal control surfaces (B10)
apresmoi Jul 24, 2026
e74c4c2
feat: render terminal visual parity media (B11)
apresmoi Jul 24, 2026
e5e45b0
feat: render terminal streaming diff (B12)
apresmoi Jul 24, 2026
17d9475
feat: render terminal differential testing (B13)
apresmoi Jul 24, 2026
a24bc8e
feat: prove terminal performance tracing parity (B32)
apresmoi Jul 24, 2026
d6d79e5
feat: render terminal checklist composites (B14)
apresmoi Jul 24, 2026
dfd9231
feat: render terminal model lab composition (B15)
apresmoi Jul 24, 2026
4719a0e
feat: compose glyphcss oven chiminea (B24)
apresmoi Jul 24, 2026
752a71b
feat: match scoped Oven adapters (B18)
apresmoi Jul 24, 2026
8744804
feat: match terminal Oven transport (B27)
apresmoi Jul 24, 2026
0c4bbe8
feat: match Streaming Diff navigation (B28)
apresmoi Jul 24, 2026
f991d8d
fix: harden terminal text rendering (B19)
apresmoi Jul 24, 2026
8806aff
feat: add terminal accessibility tiers (B30)
apresmoi Jul 24, 2026
64aaf46
feat: couple terminal UI end to end (B38)
apresmoi Jul 24, 2026
a56657d
fix: close terminal interaction blockers (B40)
apresmoi Jul 24, 2026
0748c70
refactor: align terminal visual surfaces (B42)
apresmoi Jul 24, 2026
e5812f2
feat: certify terminal package prototype (B43)
apresmoi Jul 24, 2026
10c9700
fix: close terminal review findings (B44)
apresmoi Jul 25, 2026
60e4937
feat: pair console and terminal component catalogs
apresmoi Jul 25, 2026
44370a6
fix: pair terminal renders in canonical stories
apresmoi Jul 25, 2026
46bcd91
feat: complete terminal component parity
apresmoi Jul 25, 2026
0c5be30
fix: pair Storybook components with live terminal renders
apresmoi Jul 25, 2026
7264688
fix: refine paired terminal component visuals
apresmoi Jul 25, 2026
331e11e
fix: install terminal dependencies in CI
apresmoi Jul 25, 2026
0b6720e
fix: unify production terminal component models
apresmoi Jul 25, 2026
99f4dc8
fix: support Node 18 in terminal architecture tests
apresmoi Jul 25, 2026
cd29ad1
fix: restore visible burnlist item navigation
apresmoi Jul 25, 2026
06b8027
fix: clarify terminal screen hierarchy
apresmoi Jul 26, 2026
827b1c0
fix: render live Oven details in the main pane
apresmoi Jul 26, 2026
6739611
fix: render arbitrary oven compositions in terminal
apresmoi Jul 26, 2026
7fe4a9d
fix: render visual frames as a terminal feed
apresmoi Jul 26, 2026
c55d618
feat: render native images in terminal
apresmoi Jul 26, 2026
b70e212
fix: avoid repeated terminal image uploads
apresmoi Jul 26, 2026
5a59af8
Merge remote-tracking branch 'origin/main' into term-ui-glyphcss
apresmoi Jul 26, 2026
778b2b2
fix: align TUI progress lookup with dashboard
apresmoi Jul 26, 2026
605139e
fix: bound native terminal image rendering
apresmoi Jul 26, 2026
eb4d8fe
test: assert native image triptych placement
apresmoi Jul 26, 2026
abe8654
fix: align terminal oven media and loop views
apresmoi Jul 26, 2026
1ece974
fix: clarify terminal list grouping and focus
apresmoi Jul 26, 2026
fd8b144
fix: preserve terminal focus without color
apresmoi Jul 26, 2026
62e7e50
fix: improve terminal checklist inspection
apresmoi Jul 26, 2026
6f87cdc
fix: render compact live loops in terminal
apresmoi Jul 26, 2026
d9adc2e
fix: match terminal loops to web topology
apresmoi Jul 26, 2026
3aa578f
fix: share compact loop topology across surfaces
apresmoi Jul 26, 2026
47958e9
fix: match terminal checklist loop surface
apresmoi Jul 26, 2026
419a1ff
fix: preserve terminal loop diagram spacing
apresmoi Jul 26, 2026
0efeac2
fix: compose item and loop inspector columns
apresmoi Jul 26, 2026
d04c409
feat: sharpen terminal differential trends
apresmoi Jul 26, 2026
efc1f49
feat: align terminal trend and media composition
apresmoi Jul 26, 2026
036f584
feat: filter terminal burnlist landing
apresmoi Jul 26, 2026
ead2733
fix: clarify terminal landing navigation
apresmoi Jul 26, 2026
d496b10
fix: optimize terminal image loading
apresmoi Jul 26, 2026
74337d9
fix: animate terminal loading and repair CI
apresmoi Jul 26, 2026
dd36840
fix: ship patched Linux terminal runtime
apresmoi Jul 26, 2026
18752b3
feat: compose ASCII tiles in visual parity
apresmoi Jul 26, 2026
591fbd2
feat: manage shared and ephemeral Burnlist services
apresmoi Jul 26, 2026
d3531e2
fix: close terminal release review findings
apresmoi Jul 26, 2026
6370336
feat: publish composable Burnlist Loop skill
apresmoi Jul 26, 2026
d3fdca3
fix: stabilize terminal interaction tests
apresmoi Jul 26, 2026
1e920cd
fix: keep global skill and service lifecycle scoped
apresmoi Jul 27, 2026
8edc858
fix: separate skill and service lifecycle
apresmoi Jul 27, 2026
751a349
fix: serialize terminal pagination test
apresmoi Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
54 changes: 50 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,19 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
cache: npm
cache-dependency-path: package-lock.json
cache-dependency-path: |
package-lock.json
tui/package-lock.json

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.14

- name: Install dependencies
run: npm ci
run: |
npm ci
npm ci --prefix tui

- name: Build dashboard
run: npm run build:dashboard
Expand All @@ -44,5 +53,42 @@ jobs:
- name: Verify
run: npm run verify

- name: Verify package payload
run: npm run verify:package
terminal-package:
runs-on: macos-14
timeout-minutes: 15
steps:
- name: Check out
uses: actions/checkout@v4

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: |
package-lock.json
tui/package-lock.json

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.14

- name: Install dependencies
run: |
npm ci
npm ci --prefix tui

- name: Build packaged terminal binaries
run: |
npm run build:dashboard
npm run build:tui
npm run build:catalog:tui

- name: Fast terminal verification
run: npm run verify:fast

- name: Verify installed current-host package
run: |
npm run verify:package
npm run test:global-install
15 changes: 13 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,14 @@ jobs:
node-version: 22
registry-url: https://registry.npmjs.org
cache: npm
cache-dependency-path: package-lock.json
cache-dependency-path: |
package-lock.json
tui/package-lock.json

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.14

- name: Refuse to publish from a non-main ref
run: |
Expand Down Expand Up @@ -204,7 +211,9 @@ jobs:

# Install from the RELEASE commit's lockfile so gate + publish match the released tree.
- name: Install dependencies for the release commit
run: npm ci
run: |
npm ci
npm ci --prefix tui

- name: Verify any existing remote tag
env:
Expand Down Expand Up @@ -232,6 +241,8 @@ jobs:
- name: Gate exact release commit
run: |
npm run build:dashboard
npm run build:tui
npm run build:catalog:tui
npm run verify
npm run verify:package

Expand Down
47 changes: 45 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,25 @@ The global package installs the `burnlist` command and registers the bundled Bur

Ask your agent to create a Burnlist for a goal or continue an existing one. The skill owns that workflow; the CLI provides the dashboard and protocol helpers.

From any repository, the intended first interaction is simply:

```text
Set up Burnlist in this repo.
```

The globally installed skill initializes and registers the repository, briefly
explains the workflow, and asks what you want to burn.

Run the dashboard from any project:

```sh
burnlist
```

The server binds to loopback by default and prints its local URL.
The server binds to loopback by default and prints its local URL. A global
installation starts one persistent shared observer and `burnlist` prints its
discovered URL; `burnlist service start|stop|restart|status` exposes its
lifecycle. Use `burnlist serve` for an explicitly foreground server.

## How It Works

Expand Down Expand Up @@ -192,6 +204,34 @@ Untracked hook configs are added to `.git/info/exclude` by default; tracked conf

Use `burnlist --help` for dashboard ports, scan roots, local state paths, and Oven data bindings.

## Terminal UI

The experimental terminal observer lives in `tui/`. Its landing page is a
responsive full-width Burnlist list. Burnlist detail exposes navigable active
and completed items, marks the latest completion, and opens item-specific Oven
views. OpenTUI React owns layout and input; glyphcss from the adjacent
`../../glyphcss` checkout renders the animated fire and effects. Visual Parity
PNGs use the native image layer in the Burnlist OpenTUI fork on VS Code, iTerm,
and WezTerm, with the 2×2 RGBA glyph renderer retained underneath as a portable
fallback. In VS Code, enable `terminal.integrated.enableImages`. Backgrounds
remain transparent and dividers adapt to the host terminal palette, including
VS Code themes.
The visual-review TUI is currently built from a source checkout rather than
embedded in the universal npm package. This avoids sending large Darwin-only
binaries to every host. Use `npm --prefix tui install && npm run build:tui`,
then open it through the regular CLI with `burnlist -i`. The CLI validates the
shared observer recorded in `~/.burnlist/server.json` and restores it when
needed; `burnlist -i --local` instead owns one ephemeral observer for the TUI
session. Screen layouts are declarative `.glyph` documents under
`tui/screens/`. Pass an explicit dashboard with
`burnlist -i --server http://127.0.0.1:4510`.

Use up/down to navigate Burnlists and inspect their items. `o` opens the
global generic Oven catalog; installed repository-specific Ovens remain scoped
to their Burnlists. In a Burnlist, `[` and `]` move between compatible Oven
lenses. `q` always goes back, and `escape` goes back from nested views or exits
only from the main landing page. `r` refreshes the current data.

## Built-in Loops (Stage 1)

Items may use direct execution or one of exactly three built-in Loops:
Expand Down Expand Up @@ -259,16 +299,19 @@ Burnlist's CLI, server, and dashboard support Node.js 18 or newer. The Storybook
```sh
npm install
npm run build:dashboard
npm run build:tui
npm run storybook
npm run build:storybook
npm run test:differential-testing
npm run test:tui
npm run verify:fast
npm run verify
npm run verify:clean
npm run verify:package
npm run test:global-install
```

`verify:clean` checks the source, npm payload, and isolated global install from a temporary copy.
`verify:fast` is the non-mutating inner loop for TUI types, tests, generated-frame freshness, and prototype coverage audits; it intentionally does not claim final 100% coverage. `verify` remains the required full gate (`verify:gate` is an alias). `verify:clean` checks the source, npm payload, and isolated global install from a temporary copy.

## Oven events

Expand Down
57 changes: 56 additions & 1 deletion bin/burnlist.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ const knownSubcommands = new Set([
"unregister",
"roots",
"init",
"service",
"serve",
]);

function printSkillUsage(command) {
Expand All @@ -51,12 +53,49 @@ function printLifecycleUsage(command) {
}

async function main() {
if (args.includes("-i") || args.includes("--interactive")) {
const { runInteractiveCli } = await import("../src/cli/interactive-cli.mjs");
process.exitCode = await runInteractiveCli({ args, packageRoot });
return;
}

if (args[0] === "service") {
const { runServiceCli } = await import("../src/cli/service-cli.mjs");
process.exitCode = await runServiceCli({ args, packageRoot });
return;
}

if (args[0] === "install" || args[0] === "uninstall") {
if (args.includes("--help") || args.includes("-h")) {
printSkillUsage(args[0]);
return;
}
let cleanupPurgedService;
if (args[0] === "uninstall" && args.includes("--global") && args.includes("--purge")
&& !args.includes("--dry-run")) {
const packageJson = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf8"));
const { ownedGlobalInstall, removeInstallMarker } = await import("../src/service/runtime.mjs");
const { serviceStatus, stopRuntime } = await import("../src/service/supervisor.mjs");
if (ownedGlobalInstall(packageRoot, packageJson.version)) {
cleanupPurgedService = async () => {
const status = await serviceStatus();
if (status.running && !await stopRuntime(status.runtime)) {
throw new Error("the owned global service did not stop");
}
removeInstallMarker(packageRoot);
};
}
}
process.exitCode = runSkillsInstallCli({ args, packageRoot });
if (process.exitCode === 0 && cleanupPurgedService) {
try {
await cleanupPurgedService();
console.log("Burnlist: stopped and removed the global service registration.");
} catch (error) {
console.error(`Burnlist: ${error.message}`);
process.exitCode = 1;
}
}
return;
}

Expand Down Expand Up @@ -111,6 +150,9 @@ if (!["oven", "hooks", "loop", "agent", "route"].includes(args[0]) && (args.incl

Usage:
burnlist [--port <port>] [--scan-root <repo[,repo...]>]
burnlist -i [--server <url>]
burnlist service <start|stop|restart|status>
burnlist serve [dashboard options]
burnlist --plan <burnlist.md> --check
burnlist --plan <burnlist.md> --digest
burnlist --close-completed [--scan-root <repo[,repo...]>]
Expand Down Expand Up @@ -154,6 +196,8 @@ Usage:
burnlist uninstall [--global] [--agent codex,claude] [--dry-run] [--purge]

Options:
-i, --interactive Open the interactive terminal UI.
--local With -i, force an ephemeral local server.
--auto-port Try the next available loopback port.
--host <host> Bind host; loopback is required by default.
--state-dir <path> Override ignored dashboard observer state.
Expand Down Expand Up @@ -190,8 +234,19 @@ if (args[0] === "oven") {
await runLoopCliEntry(args.slice(1));
} else if (["register", "unregister", "roots", "init"].includes(args[0])) {
await import("../src/cli/registry-cli.mjs");
} else {
} else if (args[0] === "serve") {
process.argv.splice(2, 1);
await import("../src/server/burnlist-dashboard-server.mjs");
} else {
const packageJson = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf8"));
const { ownedGlobalInstall } = await import("../src/service/runtime.mjs");
if (args.length === 0 && ownedGlobalInstall(packageRoot, packageJson.version)) {
const { ensureSharedService } = await import("../src/service/supervisor.mjs");
const runtime = await ensureSharedService({ packageRoot, version: packageJson.version });
console.log(runtime.url);
} else {
await import("../src/server/burnlist-dashboard-server.mjs");
}
}
}

Expand Down
Loading
Loading