1.0.0 graduates the 1.0.0-beta line opened by v1.0.0-beta.1: the scene model, node registry, and package boundaries that the beta stabilized now ship as stable versions on the npm latest tag, and the open capture protocol and viewer runtime ship inside them as @pascal-app/core/capture and @pascal-app/viewer/capture (#713, #851). It also closes the agent distribution surface: public pascal-3d and furniture-fit skills, plugin manifests for Claude Code, Codex, Cursor and Gemini, an entry in the official MCP Registry, and a CLI that can claim and verify a hosted agent key (#777, #829, #808, #815).
✨ Features
Agent skills and distribution
- Public agent skills —
pascal-3dandfurniture-fitteach MCP-capable agents to build, inspect, validate and hand off scenes, and to report measured furniture footprints with evidence-scoped conclusions, fail-closed input gates, blocker-aware next actions, and a no-sign-in footprint pre-check link (#777, #781, #791, #794, #824), with sharper skill discovery and MCP safety metadata across both bundles (#812) - Plugin bundles 0.1.3 → 0.1.8 — one canonical
skills/source ships as a single versioned plugin with a recorded validation ledger per bundle (#782, #795, #802, #811, #825) - Claude Code plugin — this repository installs as
pascal-agent-skills@pascal, with a credential-free localpascal mcp connectserver bundled (#777, #810) and a hostedpascal-hostedStreamable HTTP server whose optional Pascal API key is collected as sensitive plugin user configuration and stored in the OS keychain rather than any file (#835) - Codex, Cursor and Gemini manifests — a portable root
mcp.json(the spec readsmcp.json, not.mcp.json),.cursor-plugin/plugin.json,gemini-extension.json, plated marketplace logos, andbun run skills:validateasserting parity across every descriptor (#829) - OpenAI Agent Plugins manifest — root
plugin.jsonwith listing metadata, branding assets, a With MCP review packet, and per-tool annotation justifications for all 46 MCP tools (#796, #797, #799, #813) - ClawHub publication readiness — scoped
.clawhubignorepolicies with regression tests that reject re-inclusion and legacy-override rules (#798, #806) - Official MCP Registry entry —
io.github.pascalorg/editorpublishes the hosted Streamable HTTP endpoint, with CI validating the manifest against the live API catalog (#808, #809)
CLI
@pascal-app/cli— persistent local editor installation and lifecycle management over a packaged standalone runtime, with update rollback, damaged-runtime recovery, collision-safe startup, flat standalone dependencies, and first-run command setup (#604, #605, #609, #610, #611)- Managed MCP alongside the local editor —
npx @pascal-app/cli editorstarts the editor and an authenticated dynamic-port MCP service together, sopascal mcp connectneeds neither the port nor the private token in client configuration (#612) pascal agent claimandpascal agent status— an agent opens a prefilled 15-minute human handoff and verifies its hosted key without storing or printing it, shipped through the verified GitHub CLI preview channel (#815, #818, #821, #780, #819, #822)
MCP server
- Layout clearance for doors and item overlaps (#569); surface holes subtracted from measured area (#563)
- Tool execution middleware, with cancellation propagated to host executors and callback updates kept inside them (#801, #803, #804)
- Honest tool contracts — returned fields declared in tool output schemas (#575), and skipped persistence reported instead of silently dropping live sync (#736)
Capture
- Open capture protocol and viewer runtime —
@pascal-app/core/capture(formerly the beta-only@pascal-app/capture-protocol, folded in #851) covers extensible capture manifests, artifacts, coordinate frames and live streams;@pascal-app/viewer/capturerenders room models, point clouds, surface meshes and animated device motion; scan nodes gain capture-session references, transforms and per-layer visibility, and capture layers mount as host-provided scene-tree children (#713) - Manifest-first previews — JSON preview artifacts hydrate through a single renderability predicate, so a stream can't be declared renderable without a hydration path (#757); shared local Clay previews and optional dollhouse rendering align validation with the recorder's native face budget (#788)
- Authored camera poses — external camera tools request a still from an explicit world-space pose, including roll and output framing, without moving the working viewport, and receive correlated saved/failed events (#768)
- Capture-mode camera suite — FOV lens, walk/drone framing and keycap hints (#742), walk/drone snapshot framing brought up to orbit's standard (#743), level-follow camera and snapshot suite (#752), WebP snapshot encoding (#622), and a 2048 px long-edge clamp on viewport/area captures (#639)
Editor and modeling
- Custom mesh editing — Blender-style mesh editing, plus block mesh editing UX (#638, #691)
- Roofs — lean-to extensions with automatic drainage (#651), improved materials, drawing and intersections (#690)
- MEP — duct and pipe fittings, routing and system checks (#769), and connected pipe/duct drafting (#827)
- Cabinets — exact sizing with run-aware editing (#753), modular constraints and finishes (#719)
- Synchronized 2D viewer modes (#672)
- Exports — print-ready model exports (#701, #703) and
exportFloorplanPdfon the package entry (#636) - Selection and inspector — shared parameters editable on a homogeneous multi-selection (#680), session multi-select groups via Ctrl+G (#571), arbitrary maxes lifted from inspector dimension fields (#721), room-envelope height caps raised from 6 m to 20 m with the ceiling's level bound surfaced (#642, #650)
- Host integration — guided-tour hooks for targets, a success cue, snapping and camera hints (#728, #730),
noPanelsidebar tabs for stage-driving rail entries (#641), declarativedef.toolOptionswith a sharedToolOptionsPanel(#750), apresentation.findInCatalogopt-out for the action menu (#756), an exportedgetWallHideState(#576), a configurablemaxFpsrender-loop cap (#671), and a single-writer ToolMode FSM for mode/tool (#751) - Plugin ecosystem — Mint (#591) and Streetscape (#628) plugins, the Bones structural X-ray plugin wired into the standalone editor (#649), and per-kind plugin inspector-card extensions on the floating inspector (#667)
- Light WebGPU preview and
/editorscene redirect (#570) - Terrain and collaboration — terrain elevation inherited by rooms, geometry builders and plugins (#568); realtime terrain and scene collaboration primitives repaired (#573)
🐛 Fixes
- Scene materials survive persistence — custom materials are preserved across save, load, clone, fork and live sync, and collections are no longer dropped on MCP import (#597) by @ShiroKSH; materials also carry through Load Build (#729), dangling library material refs re-resolve with the paint picker defaulting to Pascal (#749), and the material list has a stable test hook (#724)
- Deterministic wall junctions — exactly-collinear walls miter in a stable order, so identical scenes produce identical geometry regardless of node iteration order (#596) by @tomatotomata; lean-to roof mitering fixed across connected runs (#739);
calculateLevelMitersreachable throughcore/wall(#732) - Wall drafts and previews — plane-bound defaults restored for draft, panel and self-heal (#630), slab-sourced drafts never coerced to a ground base (#702), node tops stop lifting floor placements while batched walls stay pickable (#686), a hovered wall leaves its batch so it can outline (#687), wall item placement preview no longer drifts off the item (#643), draft preview geometry reused (#550), and wall load fixes for treatment fan-out, one CSG cut per wall, a capture draw leak and converter duplicates (#762)
- Hover, selection and hidden walls — hidden walls stop swallowing pointer events (#683), stay ray targets while a door/window tool is active (#689), and lose to nearest-first hover against the furniture behind them (#697); opening MOVE drags ride the node's own wall with one undo entry per gesture (#694)
- Autosave and scene loading — the autosave wipe guard stays armed after the scene loads (#578, #682), a failed scene load shows an error with retry instead of an empty scene (#759), and null parent links in stored scenes are repaired so they pass authority validation (#574)
- History and dirty state — history command ownership hardened (#627), placement drafts kept out of undo history (#637), a guarded dirty set with undo phantom sweep and animation split (#758), and elevator dirty tracking dropped (#599)
- Core robustness — vertical scene canonicalization shared (#626), numeric sanitize diagnostics fail safe (#615), asset ids no longer depend on
crypto.randomUUID(#681), and room surfaces reconcile after wall topology edits (#624) - zod 4.5 compatibility —
AnyNodemade discriminated-union-proof through bare-literal projection (#745), node metadata typed as a record instead ofz.json()(#746), with the dependency range capped and then lifted to a working 4.5.x (#744, #747) - Sentry-reported crashes — null WebGL context in the 3D viewer (#455), missing roof-segment trim in the ridge-vent geometry key (#530), and a
structuredClonefallback where lingo is imported (#577) - Claude Code plugin root — the plugin root is
skills/instead of the repository root, so installingpascal-agent-skills@pascalcopies the two skill bundles and their MCP configuration instead of caching the whole monorepo and runningbun installagainst the root lockfile (#832) - Plugin integration — plugin node kinds accepted by the scene save API (#490), hover/click subscriptions attached for kinds that register after mount (#665), inspector extension mode either/or with the regular controls (#668), and no empty plugin manager in an empty rail (#741)
- Roof, placement and level details — roof and placement previews corrected (#718), wall editing and roof controls corrected (#738), slab room paint scoped to the clicked slab's level (#592), the function-tree category grid capped so the item list stays reachable (#593), level pill without ground-floor delete and no compass in studio (#723), stable level elevation smoothing (#659), isolation and solo no longer overwriting each other's layer masks (#607), millimetre notation respected in 3D labels (#540), and adjacent IFC wall assemblies no longer merged (#603)
- Experience fix pass — Cmd/Ctrl+S saves instead of opening the browser's page-save dialog, plus placement, selection rotation, roof gable, stairs and capture fixes on three r186 (#807)
⚡ Performance
- Charter rows — initial wall builds drain within the time budget (row 6) (#800), undo/redo invalidation scoped to changed geometry and cleared previews (row 7) (#805), ceiling undersides and slab bodies batched (row 16) (#789)
- Batching and instancing — items, columns, doors and windows draw through BatchedMesh containers (#760), wall batching stays live in cutaway (#761), a level's walls are sewn into one mesh (#608), wall geometry is no longer rebuilt every frame (#556), ceiling corner brackets are instanced per level (#784), and animation mixers are skipped for items without clips (#785)
- Viewer passes — outline reuses scene depth and renders masks from proxies (#772), pointer-event raycasts are cached with a camera-drag throttle (#774), wall cutout facing is cached instead of re-evaluated per camera move (#775), zone and overlay passes render from indexed roots (#776), viewer runtime ownership tightened (#675), and viewer stage mode sets stabilized (#673)
- Schema parsing — lazy per-kind compiled node parsers behind a flag (#748)
- CLI download size — the packed
@pascal-app/clidrops from 107 MB to 65 MB by pruning build-only files from the portable runtime, with every dropped file printed so a future non-conventional asset is reported rather than shipped (#838), and then to 0.5 MB: the runtime ships as a checksummed release asset that the CLI fetches on first use instead of riding inside the npm tarball (#845) - Instrumentation — a
?perfsuite with real WebGPU timestamp queries, system tracks, action receipts and a DOM panel, at zero cost without the flag (#755)
🧰 Tooling / infra
- Release pipeline — a stable bump now graduates a prerelease to its base version (
1.0.0-beta.N→1.0.0) instead of producing2.0.0or publishing a beta tolatest(#837); npm publishing moved to trusted publishing over GitHub OIDC after npm deprecated 2FA-bypass tokens (#839, #853, #856); trusted publishing for MCP and CLI (#779) with npm auth and OIDC repairs (#816, #817); release package tag push fixed (#565); license metadata andLICENSEshipped in tarballs (#732) - CI and tests — the test suite runs in CI (#548), bun pinned to 1.3.14 in the quality gate (#585),
bun installretried on transient GitHub 429s (#674), CI-sized timeout for the every-angle corner-joint sweep (#693) and a 30 s budget for rounded-opening CSG unions (#764), registry leaks across test files fixed (#709), the canopy regression matrix split into independent tests (#790), node source-system probes run from a package-local file with mocks established before any fiber/react import (#792, #793), history probe modules resolved from the packages that depend on them under the isolated linker (#828), and wall batch tests driving the frame function directly (#763) - Architecture — runtime R3F evicted from the core barrel, with an architecture test to keep it out (#692)
- Platform — Next.js 16.3 (#579), the Node runtime for standalone editor Vercel functions (#580), and
bun devworking on Windows without dropping the PORT override (#587) - Docs — the docker workflow (#590), the plugin viewer appearance contract (#625), the MCP north convention in the garden-house template (#584), how
from_briefbinds a scene (#595), CLI package discoverability (#606), a security policy and code of conduct (#575), staleNEXT_PUBLIC_GOOGLE_MAPS_API_KEYdocs dropped (#589), and changelog credit for the junction-determinism and scene-materials fixes (#598) - Bones plugin pin — the pinned structural X-ray plugin advanced 26 times across this window: camera-proof X-ray, dollhouse and blueprint batches (#653, #655, #656, #662, #666, #669, #670), electrical, plumbing and HVAC systems with movable service points (#657, #658, #660, #661, #676, #677, #684, #695, #698), the heat pump becoming a first-class object (#700, #705, #707, #708, #710, #711, #712), and CMU paint plus LGS steel walls and jurisdictions (#714, #716, #717)
📦 Packages
| Package | Version |
|---|---|
@pascal-app/core |
1.0.0 |
@pascal-app/viewer |
1.0.0 |
@pascal-app/editor |
1.0.0 |
@pascal-app/nodes |
1.0.0 |
@pascal-app/mcp |
1.0.0 |
@pascal-app/ifc-converter |
1.0.0 |
@pascal-app/cli |
1.0.0 |
All seven packages move to the npm
latesttag; thebetatag stops at the1.0.0-betaline. The beta-only@pascal-app/capture-protocoland@pascal-app/capture-viewerpackages were never published to npm: before 1.0.0 they were folded into@pascal-app/core/captureand@pascal-app/viewer/capture(#851), so the published surface stays at seven packages instead of nine.
@pascal-app/clidownloads its web runtime from the@pascal-app/cli@1.0.0release asset on first use and verifies it against the SHA-256 recorded in the package.
🙏 Thanks
A huge thank you to everyone who contributed to 1.0.0.
- @wass08 — the batching and viewer performance passes, the capture-mode camera suite, dirty-lifecycle correctness, host tour hooks, the
?perfinstrumentation suite, and the experience fix pass (48 PRs, including #760, #761, #772, #755, #742, #758, #728, #807) - @Snoopy147 — Bones plugin integration and the hover/selection/pointer-correctness wave, plus the plugin inspector-card extensions (37 PRs, including #667, #683, #689, #697, #694, #682, #709, #741)
- @sudhir9297 — roofs, MEP routing, cabinets, and custom mesh editing (#638, #651, #690, #691, #718, #719, #738, #739, #753, #769, #827, #624)
- @ActArtech — MCP layout clearance, the light WebGPU preview, and session multi-select groups (#569, #570, #571)
- @anton-pascal — Sentry-driven null-safety hardening in viewer, nodes and core (#455, #530, #615)
- @toycenterboss-bot — wall geometry performance and viewer layer-mask fixes (#556, #607, #608)
- @JimmyZheng-ZJU — wall draft preview geometry reuse and elevator dirty state (#550, #599)
- @ShiroKSH — diagnosed and layered the scene-material persistence fix (#597)
- @tomatotomata — deterministic collinear wall junction ordering (#596)
- @alxbouchard — scene materials carried through Load Build (#729)
- @SomSamantray —
exportFloorplanPdfon the package entry (#636) - @konevenkatesh — plugin node kinds accepted by the scene save API (#490)
- @maherm — asset ids no longer depending on
crypto.randomUUID(#681) - @rootsbymenda — surface holes subtracted from measured area (#563)
- @tamg — the Mint plugin (#591)
- @tylergibbs1 — millimetre notation in 3D labels (#540)
- @vjureta — running the test suite in CI (#548)
- @yorhodes — IFC adjacent wall assemblies no longer merged (#603)
- @ztffn — configurable
maxFpsrender-loop cap (#671)
Full changelog: v1.0.0-beta.1...v1.0.0