Commit Graph
100 Commits
Author SHA1 Message Date
Wassim SAMADandClaude Opus 4.7 c683c04c39 Add test script to @pascal-app/core so turbo picks up its unit tests
Without a "test" script the package was invisible to `turbo test` —
private-editor's CI runs `bun run test` (= `turbo test`), which only
walks workspace packages that declare a test runner. Mirrors mcp and
nodes which already do this.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:41:46 -04:00
Wassim SAMADandClaude Opus 4.7 2a8eb3e1de Registry-first dispatch in ToolManager (shim 4/4)
Before mounting any legacy build tool, ToolManager checks whether the
active tool's kind has a registered NodeDefinition with a tool
contribution. If yes, the registry tool wins; the legacy tool map and
special-cased spawn/column/elevator branches are skipped for that kind.

Lazy-loaded via React.lazy (cached by loader) and wrapped in Suspense.

Today the registry is empty, so useRegistryTool is always false and
every code path renders unchanged. The moment a kind registers (Phase
2+), its registry tool takes over without further edits here.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:39:31 -04:00
Wassim SAMADandClaude Opus 4.7 7dd3ffed3f Wrap legacy systems in LegacySystem + mount RegisteredSystems (shim 3/4)
Two additions plus a viewer JSX rewire:

- legacy-system.tsx: <LegacySystem kind="..."> wrapper that renders its
  children only when nodeRegistry.has(kind) is false. Lets one wrapper
  cover all legacy systems for a kind (door has DoorSystem and
  DoorAnimationSystem — both belong to 'door' so they yield together).
- registered-systems.tsx: <RegisteredSystems /> iterates the registry,
  filters entries that contribute a system, sorts by system.priority
  (default 5; e.g. wall mitering at 8 runs after door cuts at 3),
  mounts each via React.lazy. Today empty registry = renders nothing.
- viewer/index.tsx: every existing per-kind system is wrapped in
  LegacySystem. RegisteredSystems is mounted alongside.

With the registry empty (Phase 0), every LegacySystem passes through
unchanged and RegisteredSystems is a no-op — zero behavior change.
Once a kind registers in Phase 2+, its legacy systems yield and its
registry-contributed system runs in their place.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:36:02 -04:00
Wassim SAMADandClaude Opus 4.7 0fd7af216c Registry-first dispatch in NodeRenderer (shim 2/4)
NodeRenderer now checks the registry first. Registered kinds load
their renderer module via React.lazy (cached by RendererSource so the
Suspense boundary is stable across re-renders). Unregistered kinds
fall through to the legacy chain below.

Today the registry is empty (Phase 0 builtinPlugin.nodes is []), so
every node still hits the legacy chain — no behavior change. The
moment a kind registers in @pascal-app/nodes (Phase 2 onward), the
registry path takes over without further edits here.

GLB / instanced-GLB RendererSource kinds are typed but not yet
honored — they get their built-in renderers in Phase 5.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:32:05 -04:00
Wassim SAMADandClaude Opus 4.7 4c3feea052 Proxy-back sceneRegistry.byType for registry/plugin kinds (shim 1/4)
byType was a hardcoded object keyed by the built-in node kinds. With
the registry, kinds can come from @pascal-app/nodes (or future
plugins) — so byType now wraps a Map via a Proxy that auto-creates an
empty Set the first time any kind is touched.

Built-in kinds are still pre-seeded at module init so the fast path
(no Proxy trap) is preserved. clear() iterates the backing Map.

useRegistry's `type` parameter widens from `keyof typeof byType` to
`KnownNodeKind | (string & {})` — preserves autocomplete for
built-ins while accepting plugin-supplied kinds.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:30:55 -04:00
Wassim SAMADandClaude Opus 4.7 4d5226ce10 Wire loadPlugin(builtinPlugin) at editor app bootstrap
Adds apps/editor/lib/bootstrap.ts that calls loadPlugin(builtinPlugin)
as a module-side-effect on first import. Imported from scene-loader.tsx
so it runs on the client side where the editor mounts.

Idempotency guard handles HMR re-execution (would otherwise throw on
duplicate registerNode). For the empty plugin this commit, the entire
call is a no-op — included now so future commits that add real node
kinds only need to push them onto builtinPlugin.nodes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:28:01 -04:00
Wassim SAMADandClaude Opus 4.7 a41321e193 Lock bun.lock for @pascal-app/nodes workspace + sort registry barrel
Companion changes for the new nodes package: bun.lock entry from
`bun install`, and a Biome-auto-sort of the registry barrel.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:25:27 -04:00
Wassim SAMADandClaude Opus 4.7 fc36b5b600 Add @pascal-app/nodes package skeleton with empty builtinPlugin
New workspace package that owns built-in node bundles, one folder per
kind. Today the plugin is empty — no behavior change. Future commits
will add column/, shelf/, wall/, etc. and append each definition to
builtinPlugin.nodes.

The package depends on core (registry types) at v1; viewer, editor,
react, three are declared as peer deps so future node bundles can use
them without bumping their own version on every monorepo bump.

External plugins land as separate packages with the exact same shape
— this package is the dogfooded reference.

Tests: builtinPlugin shape + loadPlugin succeeds with zero kinds.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:24:59 -04:00
Wassim SAMADandClaude Opus 4.7 1d7ec0b5a7 Block @pascal-app/nodes imports from framework packages
Adds a Biome noRestrictedImports rule scoped to core/, viewer/, and
editor/ packages. Framework code must reach node-specific behavior via
nodeRegistry.get(kind), never via direct import. The @pascal-app/nodes
package doesn't exist yet (lands in the next commit) so the rule is a
no-op today; codifies the boundary ahead of node bundles.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:22:40 -04:00
Wassim SAMADandClaude Opus 4.7 fb91713374 Add node registry primitives (PR 0.1 of node-registry plan)
Introduces the @pascal-app/core/registry surface that future node-bundle
packages (and external plugins) will use to register node kinds with the
host. No runtime behavior changes — registry is empty until subsequent
PRs populate it.

- types.ts: NodeDefinition, Capabilities, Relations, DragAction, Plugin,
  ParametricDescriptor, Affordance, SceneApi, NodeRegistry. Capability
  configs accept an override escape hatch; additive-only after v1.
- registry.ts: nodeRegistry singleton, registerNode, async loadPlugin.
  Validates kind, schemaVersion, apiVersion; rejects duplicate kinds.
- scene-api.ts: createSceneApi factory wrapping the scene store with
  copy-on-write snapshot semantics for pauseHistory/restore/resumeHistory.
- index.ts: barrel re-exporting the public surface.
- core/index.ts + package.json: export * from registry and add the
  ./registry subpath so consumers can import either way.

Tests (27 cases, all bun:test): registry registration / validation /
plugin loading; SceneApi read/write/dirty/history; lazy snapshot capture
with update/upsert/delete reversal via restore and restoreAll.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:18:29 -04:00
Wassim SAMADandGitHub c50a4df8e1 Merge pull request #307 from pascalorg/fix/elevator-opening-use-client
Mark elevator-opening-system as client
2026-05-13 16:51:05 -04:00
Wassim SAMADandClaude Opus 4.7 c5ee1c64d0 Mark elevator-opening-system as client
The file imports useEffect/useRef from React, which Next.js RSC builds
flag as client-only. Other core systems (e.g. elevator-runtime-system)
use useFrame from @react-three/fiber and slip through, but this one
needs the directive explicitly.

Fixes Turbopack build failure in private-editor community app:
"You're importing a module that depends on useEffect into a React
Server Component module."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:49:17 -04:00
Wassim SAMADandGitHub 29fd673860 Merge pull request #305 from sudhir9297/feat/elevator-system
Add procedural elevator system with floorplan, runtime, and first-person support
2026-05-13 16:42:25 -04:00
Wassim SAMADandGitHub 90c948df59 Merge pull request #306 from pascalorg/perf/viewer-render-improvements
perf improvements
2026-05-13 09:24:23 -04:00
Wassim SAMAD 9de7a8ee77 perf improvements 2026-05-13 09:05:09 -04:00
Wassim SAMADandGitHub eeacae568c Merge pull request #304 from pascalorg/fix/panel-overflow
fix max panel height
2026-05-12 12:07:06 -04:00
Wassim SAMAD 9c248b7e0c fix max panel height 2026-05-12 12:06:27 -04:00
Wassim SAMADandGitHub 3a62b8f224 Merge pull request #302 from sudhir9297/fix/fri-8-may
fix: Add procedural column variants, editor copy/paste, and wall junction planning improvements
2026-05-12 11:11:07 -04:00
Wassim SAMADandGitHub 3326517de7 Merge pull request #301 from pascalorg/chore/agents
Restructure agent config: unified .agents/skills + wiki/architecture
2026-05-11 09:59:41 -04:00
Wassim SAMADandClaude Opus 4.7 cf07fcaa97 Restructure agent config: unified .agents/skills + wiki/architecture
Replace per-tool rule trees (.cursor/rules, .claude/rules, .codex/rules)
with a single wiki/architecture/ source — 11 pages + README — readable
as plain markdown by any agent. Canonical skills live in .agents/skills/;
.claude/skills, .cursor/skills, .codex/skills are directory symlinks.

AGENTS.md is the entrypoint (rewritten as a lean overview, no per-tool
path lists). CLAUDE.md, GEMINI.md, and .github/copilot-instructions.md
all point to it.

Add open-pr skill (uses .github/pull_request_template.md as the source
of truth for the PR body) and remove the dangling .claude/CLAUDE.md
relative symlink.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:51:25 -04:00
Wassim SAMADandGitHub ca333dd912 Merge pull request #299 from pascalorg/fix/release-peerdep-sync
Fix/release peerdep sync
2026-05-10 20:25:40 -04:00
Wassim SAMADandGitHub 747d8c9ad4 Merge pull request #298 from pascalorg/chore/community-merge
Chore/community merge
2026-05-09 20:37:12 -04:00
Wassim SAMADandGitHub e348ccdb08 Merge pull request #296 from sudhir9297/wed-6-may-bug-fix
fix: Improve item surface placement, floorplan resizing, and placement preview stability
2026-05-07 13:09:20 -04:00
Wassim SAMADandGitHub 485ad745ac Merge pull request #295 from sudhir9297/feat/window-improvement
feat: Expand window types, animations, and first-person behavior
2026-05-07 11:52:45 -04:00
Wassim SAMADandGitHub 25566f9182 Merge pull request #293 from sudhir9297/feat/door-improvement
Feat/door improvement
2026-05-07 08:47:57 -04:00
Wassim SAMADandGitHub 5f57e9bb09 Merge pull request #292 from sudhir9297/feat/mon-4-feat-fix
feat: column node with door/window nodes improvement
2026-05-05 16:39:21 -04:00
Wassim SAMADandGitHub 27b18af56c Merge pull request #294 from pascalorg/chore/items-catalog-update
Chore/items catalog update
2026-05-05 09:10:03 -04:00
wass08 3a181e57da remove override 2026-05-05 09:09:18 -04:00
wass08 823168ddf4 default catalog update 2026-05-05 09:04:49 -04:00
Wassim SAMADandGitHub fe34126d00 Merge pull request #290 from pascalorg/feat/precise-dimensions-sync
feat(editor): precise item dimensions — static bounding boxes, grid-aligned placement
2026-05-04 16:10:20 -04:00
Wassim SAMADandGitHub fa38b4af76 Merge pull request #286 from sudhir9297/feat/improvement-and-fixes
Feat/improvement and fixes
2026-05-04 09:30:03 -04:00
Wassim SAMADandGitHub acc9b1dfbc Merge pull request #281 from sudhir9297/feat/upgrade-and-bug-fix
Feat/upgrade and bug fix
2026-04-29 12:25:38 -04:00
Wassim SAMADandGitHub e615815e65 Merge pull request #283 from pascalorg/chore/floorplan-thumbnails
items catalog + floorplan image update
2026-04-28 10:15:40 -04:00
wass08 a017c112e7 items catalog + floorplan image update 2026-04-28 10:14:36 -04:00
Wassim SAMADandGitHub 010c874963 Merge pull request #277 from sudhir9297/feat/2d-editor
Feat/2d editor
2026-04-28 07:36:05 -04:00
wass08 758f06454c Rename mesh metadata polygon key to drop floorplan prefix 2026-04-28 07:31:52 -04:00
Wassim SAMADandGitHub 5607671d25 Merge pull request #280 from pascalorg/chore/review-architecture-skill
review architecture skill
2026-04-27 08:11:44 -04:00
wass08 f7d65acd0d review architecture skill 2026-04-27 08:08:15 -04:00
Wassim SAMADandGitHub 47d6a70192 Merge pull request #271 from sudhir9297/feat/color-picker-tool
Feat/color picker tool
2026-04-24 14:54:33 -04:00
Wassim SAMADandGitHub 5fbab1af26 Merge pull request #267 from sudhir9297/fix/minor-bug-fixes
Fix/minor bug fixes
2026-04-21 08:34:38 -04:00
Wassim SAMADandGitHub 86a4a82a92 Merge pull request #266 from sudhir9297/feat/nodes-material-system
feat: nodes material system and bug fix
2026-04-20 15:10:28 -04:00
Wassim SAMADandGitHub 783b2e0c33 Merge pull request #259 from pascalorg/fix/move-tools
Fix/move tools
2026-04-17 17:34:47 -04:00
wass08 3fcb9cfb6b fix stair building rotation 2026-04-17 17:32:25 -04:00
wass08 28bbf14836 fix perfs and broken undo stack by various move tools 2026-04-17 17:26:38 -04:00
Wassim SAMADandGitHub d948f09b2c Merge pull request #257 from sudhir9297/feat/wall-room-creation
Add auto cutout toggle to stair panel
2026-04-17 13:05:59 -04:00
Wassim SAMADandGitHub e0162606d3 Merge pull request #255 from sudhir9297/feat/wall-room-creation
Feat: wall room creation and snap, stairs system
2026-04-17 12:44:06 -04:00
Wassim SAMADandGitHub 4824bcd031 Merge pull request #142 from pascalorg/chore/carving-out-community
Chore/carving out community
2026-03-13 09:08:25 +01:00
wass08 f2501be2bf remove community 2026-03-13 09:07:46 +01:00
wass08 3eeba322a8 rename before moving to monorepo 2026-03-11 15:12:41 +01:00
wass08 5bd9c21dbc split community from editor 2026-03-11 13:29:25 +01:00
wass08 3df8a006f2 clean impl 2026-03-11 13:08:33 +01:00
wass08 a97ed42578 presets community / non community 2026-03-11 13:02:17 +01:00
wass08 7359c1fcbf splitting editor and community 2026-03-11 12:16:26 +01:00
Wassim SAMADandGitHub 5108636d49 Merge pull request #140 from pascalorg/feat/zone-fix-layer
Feat/zone fix layer
2026-03-11 07:49:43 +01:00
wass08 8d02e5191b rule for layers 2026-03-11 07:47:10 +01:00
wass08 32406e5a20 enhance hover zone 2026-03-11 07:47:10 +01:00
wass08 6719f34a89 clean zone handling code 2026-03-11 07:47:10 +01:00
wass08 918ec46a93 bring back ground occluder 2026-03-11 07:47:10 +01:00
wass08 30b9e3ccb2 move zones to separate layers todo: fix hardcoded 2 and zone floor 2026-03-11 07:47:10 +01:00
Wassim SAMADandGitHub 208e56d46a Merge pull request #139 from pascalorg/feat/project-switch-and-spotlight
Feat/project switch and spotlight
2026-03-10 18:26:22 +01:00
wass08 551f38fea3 fix build 2026-03-10 18:22:28 +01:00
wass08 d0f2a1a06f actions command K 2026-03-10 13:35:05 +01:00
wass08 175040232a theme switch minimalist 2026-03-10 12:25:30 +01:00
wass08 52bc82d6e1 project switch 2026-03-10 12:13:04 +01:00
wass08 433eaa2e02 project edit name change 2026-03-10 10:56:09 +01:00
Wassim SAMADandGitHub 636d315e85 Merge pull request #138 from pascalorg/chore/skills-md
Chore/skills md
2026-03-10 09:58:57 +01:00
wass08 bf1d350338 adjust agents.md 2026-03-10 09:58:27 +01:00
wass08 97b3c53ea5 skills polish 2026-03-10 09:51:49 +01:00
wass08 03f452d4d1 key skills 2026-03-10 09:40:07 +01:00
Wassim SAMADandGitHub 727934fd38 Merge pull request #136 from pascalorg/feat/items-interactivity
Feat/items interactivity
2026-03-06 13:11:33 +01:00
wass08 8d26a4d81c fix issue when switching phase/structure layer 2026-03-06 13:09:25 +01:00
wass08 ca0a3acf17 fixed local thumbnails 2026-03-06 13:09:25 +01:00
wass08 5143d3f0e5 adding new items 2026-03-06 13:09:25 +01:00
wass08 7e6684bbc8 zone label edition 2026-03-06 13:09:23 +01:00
wass08 849baa0a0e default value 2026-03-06 13:08:24 +01:00
wass08 202fc41f42 fade timescale for smooth item anims 2026-03-06 13:08:24 +01:00
wass08 88d0231a95 collection controls 2026-03-06 13:08:24 +01:00
wass08 bc57afb8fa collections + unify color picker 2026-03-06 13:08:23 +01:00
wass08 8f65daa853 handling lights 2026-03-06 13:08:23 +01:00
wass08 e2de931aa7 adjust fan anim 2026-03-06 13:08:23 +01:00
wass08 54051b11fa item system controls 2026-03-06 13:08:21 +01:00
wass08 927ecba054 schema and interactive store 2026-03-06 13:06:33 +01:00
Wassim SAMADandGitHub 3e40c1dde0 Merge pull request #135 from pascalorg/revert-134-fix/bugs
Revert "Restore inline zone label editing on canvas"
2026-03-06 13:05:42 +01:00
Wassim SAMADandGitHub e0d97df8c8 Revert "Restore inline zone label editing on canvas (#134)"
This reverts commit 036344d705.
2026-03-06 13:04:52 +01:00
Wassim SAMADandGitHub 862798b5e7 Merge pull request #132 from pascalorg/feat/items-community
Feat/items community
2026-03-05 00:45:18 +09:00
wass08 299cbdb0b3 fix build 2026-03-04 16:29:55 +01:00
wass08 47747495e5 polish listing 2026-03-04 15:46:18 +01:00
wass08 799cf2f56c remove issue esc key 2026-03-04 15:28:12 +01:00
wass08 25908ecfc6 square shape 2026-03-04 15:20:43 +01:00
wass08 d79d54c4d8 evader for preset 2026-03-04 15:17:01 +01:00
wass08 23ed54cb6a thumbnail generation 2026-03-04 15:13:07 +01:00
wass08 ba2dfa8caa presets community 2026-03-04 13:38:51 +01:00
wass08 a86609aa5c community presets draft 2026-03-04 13:18:18 +01:00
wass08 c26c7da091 remove logs 2026-03-04 11:25:42 +01:00
Wassim SAMADandGitHub 92f15e28f1 Merge pull request #131 from pascalorg/feat/zone-labels-polish
Feat/zone labels polish
2026-03-04 19:24:53 +09:00
wass08 5e0c64b760 remove position hack for zone + fade-in-out anims 2026-03-04 11:22:01 +01:00
wass08 add637e11c pin for zones on hover 2026-03-04 11:13:20 +01:00
Wassim SAMADandGitHub efeea1719c Merge pull request #129 from pascalorg/fix/thumbnails-and-doors
Fix/thumbnails and doors
2026-03-02 10:16:54 +09:00
wass08 267fd3960e hide guides and scans before thumbnails 2026-03-02 10:14:36 +09:00
wass08 85232d6b0d hide tools from thumbnail 2026-03-02 10:10:58 +09:00