Repository navigation
feat(docs): docs plugin — velite content pipeline, read-only API + public UI - #450
Open
elliotBraem wants to merge 4 commits into
Open
elliotBraem wants to merge 4 commits into
elliotBraem wants to merge 4 commits into
Conversation
…blic UI (#444) Implements the docs-plugin epic: the repository's own markdown (docs/** + GLOSSARY.md) compiled at build time by velite through a rspack beforeCompile hook, served read-only via oRPC and rendered in a gate-free public UI. - every-plugin: build.config.ts gains extraPlugins — rspack plugin instances appended after the composed defaults (#445) - plugins/docs: velite pipeline, listPublished/getBySlug routes, no DB, no secrets (#446) - docs ui: /docs index + splat reader under the public mount, shared MarkdownRenderer (react-markdown + shiki JS engine), sidebar nav entry via the new book icon (#447) - browser regression spec with trace artifacts; changesets for every-plugin and @everything-dev/docs-plugin (#448) - the plugin documents itself in docs/plugins/docs-plugin.md through its own pipeline (#449) Closes #444
railway-app
Bot
temporarily deployed
to
heartfelt-ambition / everything-dev-pr-450
October 16, 2026 21:57
Destroyed
|
🚅 Deployed to the everything-dev-pr-450 environment in heartfelt-ambition
8 services not affected by this PR
|
Takes the docs plugin's two routes from plain lists to the prototype's
catalog language, still fully shadcn:
- index: search input + tag filter pills + "N / M docs" count, docs as
cards (order number, title, description, tag badges) grouped under
uppercase tracked micro-headers, filtering via listPublished({ q, tag })
- reader: article in a Card with tag badges and prev/next footer nav
following the API's order/slug ordering
- MarkdownRenderer: bordered code panels with a working copy button;
blockquote as note-block styling
- shadcn primitives (card, badge, input, button) added to the plugin ui;
E2E spec extended to 6 tests (search, tag filter, prev/next, copy)
Closes #444
railway-app
Bot
temporarily deployed
to
heartfelt-ambition / everything-dev-pr-450
October 16, 2026 22:17
Destroyed
…stamp-stamped stack lifecycle The start:ssr leg failed for two independent fixture gaps, both fixed generically: - scripts/regression/container-build.ts staged auth's folder-form UI only; ui-ful plugins (docs, ai) resolved with no production URL and the composer dropped their routes. The fixture now stages every local plugin's ui dist with the deploy train's shape (bundle key <key>-ui, production/ssr URL from the variant, pin, built container name). - .dockerignore excluded the repository docs tree, so the docs plugin's velite compile inside the dist-builder only produced GLOSSARY.md (38 docs in the repo → 1 seeded record): the tree stays in the build context (the prod stage strips sources; runtime images never carry it). - ssr-compose.spec asserted exactly 2 manifests (core + auth) — with plugin UIs composing it embeds more; pinned to include the docs-ui manifest instead. - start-container.mjs is replaced by regression-stack.mjs: content-stamped (HEAD + diff + porcelain + lockfile + Dockerfile/ compose + regression environment) detached docker run, reuse on same-stamp healthy, reap otherwise, cleanup-before-probe in the test:regression:browser:start:* scripts, and a global teardown leaving the stack down after every graceful run. No new stale-container class from a SIGKILLed webServer child.
railway-app
Bot
temporarily deployed
to
heartfelt-ambition / everything-dev-pr-450
October 18, 2026 22:29
Destroyed
Playwright treats a webServer command that exits after booting as boot-failed regardless of URL health. Chain a watch step after ensure: tail the detached container, exit non-zero if it dies mid-suite, remove it on the teardown signals. A graceful end still leaves the stack down (global teardown removes the same-stamp container anyway); a SIGKILLed caller leaves only the healthy detached container, reused or reaped by the next run.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #444
Implements #445, #446, #447, #448, #449
Summary
The repository's own markdown becomes the product: the new
docsplugin compilesdocs/**+GLOSSARY.mdat build time with Velite and serves it read-only — no database, no secrets, no publishing pipeline. Content truth is git; edits land via merge → CI deploy → recompile.Enabling change:
createPluginBaseConfiggainsextraPlugins— the sanctioned escape hatch for build-time integrations (build.config.tsappends rspack plugin instances after the composed defaults).Design notes: client-side rendering with one shared
MarkdownRenderer(react-markdown + shiki JS engine — no WASM in the bundle), so any future draft-editor preview gets parity by construction. Editing, drafts, and a publish/PR pipeline are explicit non-goals (follow-up epics at the existing seam). The plugin dogfoods itself: its documentation lives indocs/plugins/docs-plugin.mdand renders through its own pipeline.Evidence
/docsroute;createPluginBaseConfigdroppedoptions.rspack.plugins(hardcoded after the spread).every-plugin buildcompiles content inside the rspack train ([VELITE] build finishedin the log; clean-checkout verified by deleting.velitefirst) — 132 docs, unique slugs, glossary includedPOST /api/rpc/docs/getBySlug→ glossary JSON through the host's plugin RPC; plugin's own OpenAPI surface serves RESTGET /api/docs/{slug}(+ 404s unknown slugs)tests/regression/browser/specs/docs-plugin.spec.ts): 3/3 green with trace artifacts — index lists ≥10 docs, click-through renders reader with highlighted code, unknown slug renders not-foundplugin-base-config.test.ts: 3/3 — extras appended after defaults, order preserved, defaults unchanged without overridesMerge Danger
Door: two-way
Revert the commit and the app returns to the core-only tree; nothing persisted (no migrations, no config state beyond one
bos.app.tsentry).Blast Radius: platform-wide
The composition changes every deploy:
bos.app.tsregisters a new plugin (host loads it in the plugin DAG),every-plugin's build composition gains theextraPluginsmerge point (no behavior change when unused — covered by test), and the core sidebar map adds thebookicon (additive). Velite pinszodv3 internally for its own config — isolated to the build step, no runtime sharing.