Files
orca/src/main/plugins/plugin-log-buffer.test.ts
T
Neil b17d408416 Plugin dev loop: TS workers, hot reload with state, orca plugin dev watch, authoring skill (#36982)
* feat(plugins): build-less TypeScript workers

A worker's main may be .ts/.mts. The plugin host installs module.registerHooks scoped to the
plugin folder: .ts files are transpiled with the frames' sucrase options (lines kept, inline
source map, source maps on), relative imports fall back to the frames' candidate files, and a
value import of the type-only 'orca/worker' fails with a clear error. Needs engines.orca
>=1.4.246.

* feat(plugins): components panels hot reload with their state

- In dev folders a save swaps only the hidden guest: keyed memory atoms are handed to the new
  guest (ui.retain → ui.hydrate memory), dropped when an atom's version changes.
- A save that fails to load keeps the last good render and shows an inline file:line:col
  error banner; the next good save clears it. A subtle Reloaded mark follows a reload.
- Transpile and import errors carry line and column; dev worker restarts keep storage.

* feat(plugins): orca plugin dev watch

One command for the inner loop: refreshes .orca/types, dev-loads the folder, follows its frame
and worker logs (plugins.getLogs gains an optional cursor), prints reloads (optional
devChangeCount on list entries) and status changes, and unloads on Ctrl-C. --json streams
NDJSON events for agents.

* feat(skills): orca-plugin-authoring bundled skill guide

A guide for agents to build Orca plugins end to end (decision table, build-less rules, the
dev watch loop, test/check, validate, release-entry, approvals, gotchas) with references
generated from the component catalog, host API table, event schemas, manifest schema and CLI
specs, checked for drift. Fixes the components template's Reset to set(count, 0).

* feat(plugins): orca plugin dev watch --check; test kit details in the authoring skill

- --check runs orca plugin check after the load and after each reload (one at a time; saves
  made meanwhile fold into one rerun) and prints each panel's render or errors inline, as a
  `check` event with --json. Local folders only, since it runs the plugin's code here.
- The orca-plugin-authoring guide's Test and check section now documents orca plugin test and
  check from #36969 exactly (JSON results, exit codes, test placement, the orca/testing kit and
  its common mistakes), and the loop uses dev watch --check.

* refactor(plugins): move the components renderer's timing and helper constants to their own module
2026-11-01 03:32:25 -08:00

25 lines
1.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { PluginLogBuffer } from './plugin-log-buffer'
describe('PluginLogBuffer.since', () => {
it('returns only lines after the cursor, and every line for a stale one', () => {
const logs = new PluginLogBuffer()
logs.append('acme.notes', 'info', 'one')
const first = logs.since('acme.notes')
expect(first.lines.map((line) => line.line)).toEqual(['one'])
logs.append('acme.other', 'info', 'elsewhere')
logs.append('acme.notes', 'warn', 'two')
const second = logs.since('acme.notes', first.cursor)
expect(second.lines).toEqual([{ ts: expect.any(Number), level: 'warn', line: 'two' }])
expect(logs.since('acme.notes', second.cursor).lines).toEqual([])
expect(logs.since('acme.notes', 'other-run:999').lines).toHaveLength(2)
})
it('hands out a cursor before the plugin logged anything', () => {
const logs = new PluginLogBuffer()
const { cursor } = logs.since('acme.quiet')
logs.append('acme.quiet', 'info', 'hello')
expect(logs.since('acme.quiet', cursor).lines.map((line) => line.line)).toEqual(['hello'])
})
})