castle-web-cli 0.4.169 → 0.4.170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/agent.js +23 -13
  2. package/dist/atomicFile.d.ts +29 -0
  3. package/dist/atomicFile.js +120 -0
  4. package/dist/castle-host/host.js +37 -0
  5. package/dist/get-deck.js +2 -11
  6. package/dist/headlessCover.d.ts +4 -0
  7. package/dist/headlessCover.js +7 -5
  8. package/dist/ide.js +14 -6
  9. package/dist/index.js +10 -6
  10. package/dist/init.d.ts +1 -1
  11. package/dist/init.js +11 -1
  12. package/dist/remix.js +2 -14
  13. package/dist/save-deck.d.ts +3 -0
  14. package/dist/save-deck.js +40 -73
  15. package/dist/saveCover.d.ts +18 -0
  16. package/dist/saveCover.js +61 -0
  17. package/dist/serve.js +18 -5
  18. package/dist/serveSecurity.d.ts +11 -1
  19. package/dist/serveSecurity.js +38 -4
  20. package/dist/shell/assets/index-BvQmVwlO.css +1 -0
  21. package/dist/shell/assets/index-CV5sBby1.js +445 -0
  22. package/dist/shell/index.html +2 -2
  23. package/dist/versionStore.js +13 -4
  24. package/kits/base/CLAUDE.md +9 -0
  25. package/kits/base/castle.json +16 -11
  26. package/kits/base/sdk/README.md +66 -1
  27. package/kits/base/sdk/commands.d.ts +23 -1
  28. package/kits/base/sdk/commands.js +9 -0
  29. package/kits/base/sdk/lifecycle.d.ts +20 -0
  30. package/kits/base/sdk/lifecycle.js +7 -1
  31. package/kits/base/sdk/resumeState.d.ts +2 -0
  32. package/kits/base/sdk/resumeState.js +84 -0
  33. package/kits/base/sdk/runtime.js +65 -0
  34. package/kits/base/sdk/transport.d.ts +3 -0
  35. package/kits/base/sdk/transport.js +39 -5
  36. package/kits/base/sdk/unloadHandshake.d.ts +6 -0
  37. package/kits/base/sdk/unloadHandshake.js +47 -0
  38. package/kits/multiplayer-2d/castle.json +3 -3
  39. package/kits/multiplayer-2d/package-lock.json +0 -27
  40. package/kits/multiplayer-2d/package.json +0 -1
  41. package/kits/multiplayer-3d/castle.json +4 -4
  42. package/kits/multiplayer-3d/package-lock.json +0 -27
  43. package/kits/multiplayer-3d/package.json +0 -1
  44. package/kits/physics-2d/CLAUDE.md +75 -43
  45. package/kits/physics-2d/behaviors/AnalogStick.jsx +75 -45
  46. package/kits/physics-2d/behaviors/Slingshot.jsx +1 -2
  47. package/kits/physics-2d/castle.json +6 -6
  48. package/kits/physics-2d/editors/PxArtEditor.jsx +83 -180
  49. package/kits/physics-2d/editors/SceneEditor.jsx +25 -4
  50. package/kits/physics-2d/editors/StyleEditor.jsx +6 -2
  51. package/kits/physics-2d/editors/overlayCanvas.js +77 -0
  52. package/kits/physics-2d/editors/pathOverlay.js +5 -13
  53. package/kits/physics-2d/editors/pixelEditorChrome.jsx +5 -1
  54. package/kits/physics-2d/editors/pixelInspector.jsx +4 -4
  55. package/kits/physics-2d/editors/pxArtTimeline.jsx +8 -36
  56. package/kits/physics-2d/editors/pxArtTimeline.module.css +4 -28
  57. package/kits/physics-2d/editors/styleEditor.module.css +23 -4
  58. package/kits/physics-2d/editors/useArtboardZoomPan.js +322 -0
  59. package/kits/physics-2d/engine/SceneUI.jsx +6 -12
  60. package/kits/physics-2d/engine/icons.js +56 -0
  61. package/kits/physics-2d/engine/panelSorting.jsx +7 -14
  62. package/kits/physics-2d/engine/physics/PhysicsSystem.js +66 -11
  63. package/kits/physics-2d/engine/physics/controls.js +76 -12
  64. package/kits/physics-2d/engine/scene.js +47 -9
  65. package/kits/physics-2d/engine/ui.jsx +13 -125
  66. package/kits/physics-2d/engine/ui.module.css +53 -28
  67. package/kits/physics-2d/package-lock.json +0 -29
  68. package/kits/physics-2d/package.json +3 -1
  69. package/kits/physics-2d/pnpm-lock.yaml +1 -17
  70. package/kits/physics-3d/castle.json +5 -5
  71. package/kits/physics-3d/package-lock.json +0 -29
  72. package/kits/physics-3d/package.json +0 -1
  73. package/kits/physics-3d/pnpm-lock.yaml +0 -17
  74. package/kits/turn-based/castle.json +3 -3
  75. package/kits/turn-based/package-lock.json +0 -27
  76. package/kits/turn-based/package.json +0 -1
  77. package/package.json +5 -4
  78. package/dist/shell/assets/index-CVHj503j.css +0 -1
  79. package/dist/shell/assets/index-x_QkP3Xq.js +0 -444
@@ -823,10 +823,10 @@
823
823
  margin-top: 14px;
824
824
  }
825
825
 
826
- /* The blueprint's thumbnail, doubling as the way into the sprite editor. The
827
- pencil sits in the corner rather than replacing the art on hover: on touch
828
- there is no hover, and the affordance has to be visible before it is
829
- touched. */
826
+ /* Thumbnail that opens the sprite editor (blueprint header + actor instance
827
+ header). The pencil sits in the corner rather than replacing the art on
828
+ hover: on touch there is no hover, and the affordance has to be visible
829
+ before it is touched. */
830
830
  .editSpriteButton {
831
831
  position: relative;
832
832
  display: inline-flex;
@@ -1161,9 +1161,9 @@
1161
1161
  height: 300%;
1162
1162
  }
1163
1163
 
1164
- /* Game-time UI overlay -- sits exactly over the canvas and clips to the card.
1165
- Behavior `ui` output lands in `.sceneUiLayer`, which is sized in card units
1166
- and scaled onto the canvas box. */
1164
+ /* Deprecated React `ui` overlay -- prefer behavior `drawUi`. Sits over the
1165
+ canvas and clips to the card. Behavior `ui` output lands in `.sceneUiLayer`,
1166
+ sized in card units and scaled onto the canvas box. */
1167
1167
  .sceneUiRoot {
1168
1168
  position: absolute;
1169
1169
  inset: 0;
@@ -1477,9 +1477,10 @@
1477
1477
  row, expanded leaves a smaller gap before the body. */
1478
1478
  padding: 10px 16px 6px;
1479
1479
  border-bottom: 0;
1480
- /* The row owns the hold-then-drag gesture; without this the browser claims
1481
- the press for scrolling before the hold completes. */
1482
- touch-action: none;
1480
+ /* pan-y: a vertical flick on the title / summary scrolls the inspector.
1481
+ Reorder lives on the grip (touch-action: none), not the whole row — that
1482
+ split is what lets scroll and reorder both work on phones. */
1483
+ touch-action: pan-y;
1483
1484
  color: var(--castle-inspector-text);
1484
1485
  font-size: 14px;
1485
1486
  font-weight: 650;
@@ -1539,9 +1540,6 @@
1539
1540
  font-weight: 400;
1540
1541
  }
1541
1542
 
1542
- /* Grab handle, left of the disclosure. `touch-action: none` is what makes the
1543
- hold-then-drag possible on touch: without it the browser claims the gesture
1544
- for scrolling before the hold completes and the drag never starts. */
1545
1543
  /* The behavior's source file. Sits at the right end of the header row, inset
1546
1544
  far enough to clear the remove button the inspector positions absolutely over
1547
1545
  the panel's top-right corner. */
@@ -1640,28 +1638,37 @@
1640
1638
  flex: 0 0 auto;
1641
1639
  }
1642
1640
 
1643
- /* Affordance only: the whole header row carries the drag listeners, so this is
1644
- a hint rather than a target and can be small. */
1641
+ /* Drag handle for panel reorder. Owns the gesture (`touch-action: none`) so
1642
+ the browser does not steal it for scroll; the rest of the header stays
1643
+ pan-y. Hit target is larger than the glyph for fingers. */
1645
1644
  .panelGrip {
1646
1645
  display: inline-flex;
1647
1646
  align-items: center;
1648
1647
  justify-content: center;
1649
1648
  flex: 0 0 auto;
1650
- margin-left: -2px;
1651
- font-size: 7px;
1649
+ box-sizing: content-box;
1650
+ margin: -6px 0 -6px -6px;
1651
+ padding: 10px 8px;
1652
+ border: 0;
1653
+ background: none;
1654
+ /* Icon sizes itself in `em` via an inline style. */
1655
+ font-size: 11px;
1652
1656
  color: var(--castle-inspector-muted);
1653
- opacity: 0.4;
1657
+ opacity: 0.55;
1658
+ cursor: grab;
1659
+ touch-action: none;
1660
+ -webkit-user-select: none;
1661
+ user-select: none;
1654
1662
  }
1655
1663
 
1656
- .panelGrip:hover {
1664
+ .panelGrip:hover,
1665
+ .panelGrip:focus-visible {
1657
1666
  opacity: 1;
1667
+ color: var(--castle-text);
1658
1668
  }
1659
1669
 
1660
- /* `Icon` sizes itself in `em` via an inline style, which no class rule can
1661
- beat -- so every one of these is sized by the button's font-size, not by a
1662
- width on the svg. */
1663
- .panelGrip {
1664
- font-size: 9px;
1670
+ .panelGrip:active {
1671
+ cursor: grabbing;
1665
1672
  }
1666
1673
 
1667
1674
  /* Every behavior row. Positioned so the lifted one can be raised above its
@@ -2786,12 +2793,17 @@
2786
2793
  linear-gradient(45deg, transparent 75%, #1a1a1a 75%),
2787
2794
  linear-gradient(-45deg, transparent 75%, #1a1a1a 75%);
2788
2795
  background-color: #121212;
2789
- background-size: 16px 16px;
2796
+ /* The check travels with the artboard: PxArtEditor overrides --checker-size
2797
+ with the fit size times the current zoom, so a pinch scales the
2798
+ transparency pattern along with the art instead of re-tiling a fixed 16px
2799
+ grid underneath it. */
2800
+ --checker-size: 16px;
2801
+ background-size: var(--checker-size) var(--checker-size);
2790
2802
  background-position:
2791
2803
  0 0,
2792
- 0 8px,
2793
- 8px -8px,
2794
- -8px 0;
2804
+ 0 calc(var(--checker-size) / 2),
2805
+ calc(var(--checker-size) / 2) calc(var(--checker-size) / -2),
2806
+ calc(var(--checker-size) / -2) 0;
2795
2807
  border: 1px solid var(--castle-inspector-border);
2796
2808
  }
2797
2809
 
@@ -2803,6 +2815,19 @@
2803
2815
  pointer-events: none;
2804
2816
  }
2805
2817
 
2818
+ /* Behind the smooth canvas, so the path-layer snap lattice paints directly on
2819
+ the frame's own background and under everything drawn. Negative z-index
2820
+ children paint in z order after the element's background and before in-flow
2821
+ content, so -2 lands between the frame background and .drawingSmooth. */
2822
+ .drawingLattice {
2823
+ position: absolute;
2824
+ inset: 0;
2825
+ width: 100%;
2826
+ height: 100%;
2827
+ pointer-events: none;
2828
+ z-index: -2;
2829
+ }
2830
+
2806
2831
  /* Behind the main canvas (negative z-index paints before static content in
2807
2832
  the same containing block) — holds the corner-rounded render for "smooth"
2808
2833
  sprites while the main canvas above it stays transparent except for tool
@@ -15,7 +15,6 @@
15
15
  "@dnd-kit/modifiers": "^9.0.0",
16
16
  "@dnd-kit/sortable": "^10.0.0",
17
17
  "@dnd-kit/utilities": "^3.2.2",
18
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
19
18
  "@lezer/highlight": "^1.2.3",
20
19
  "castle-web-fonts": "^1.0.0",
21
20
  "codemirror": "^6.0.2",
@@ -216,7 +215,6 @@
216
215
  "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
217
216
  "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
218
217
  "license": "MIT",
219
- "peer": true,
220
218
  "dependencies": {
221
219
  "@dnd-kit/accessibility": "^3.1.1",
222
220
  "@dnd-kit/utilities": "^3.2.2",
@@ -411,29 +409,6 @@
411
409
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
412
410
  }
413
411
  },
414
- "node_modules/@fortawesome/fontawesome-common-types": {
415
- "version": "0.2.36",
416
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz",
417
- "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==",
418
- "hasInstallScript": true,
419
- "license": "MIT",
420
- "engines": {
421
- "node": ">=6"
422
- }
423
- },
424
- "node_modules/@fortawesome/free-solid-svg-icons": {
425
- "version": "5.15.4",
426
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz",
427
- "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==",
428
- "hasInstallScript": true,
429
- "license": "(CC-BY-4.0 AND MIT)",
430
- "dependencies": {
431
- "@fortawesome/fontawesome-common-types": "^0.2.36"
432
- },
433
- "engines": {
434
- "node": ">=6"
435
- }
436
- },
437
412
  "node_modules/@humanfs/core": {
438
413
  "version": "0.19.2",
439
414
  "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
@@ -670,7 +645,6 @@
670
645
  "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
671
646
  "dev": true,
672
647
  "license": "MIT",
673
- "peer": true,
674
648
  "bin": {
675
649
  "acorn": "bin/acorn"
676
650
  },
@@ -1131,7 +1105,6 @@
1131
1105
  "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
1132
1106
  "dev": true,
1133
1107
  "license": "MIT",
1134
- "peer": true,
1135
1108
  "dependencies": {
1136
1109
  "@eslint-community/eslint-utils": "^4.8.0",
1137
1110
  "@eslint-community/regexpp": "^4.12.1",
@@ -2441,7 +2414,6 @@
2441
2414
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
2442
2415
  "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
2443
2416
  "license": "MIT",
2444
- "peer": true,
2445
2417
  "engines": {
2446
2418
  "node": ">=0.10.0"
2447
2419
  }
@@ -2451,7 +2423,6 @@
2451
2423
  "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
2452
2424
  "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
2453
2425
  "license": "MIT",
2454
- "peer": true,
2455
2426
  "dependencies": {
2456
2427
  "scheduler": "^0.27.0"
2457
2428
  },
@@ -16,6 +16,9 @@
16
16
  "behaviors"
17
17
  ],
18
18
  "threshold": 0,
19
+ "ignore": [
20
+ "engine/icons.js"
21
+ ],
19
22
  "reporters": [
20
23
  "consoleFull"
21
24
  ]
@@ -30,7 +33,6 @@
30
33
  "@dnd-kit/modifiers": "^9.0.0",
31
34
  "@dnd-kit/sortable": "^10.0.0",
32
35
  "@dnd-kit/utilities": "^3.2.2",
33
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
34
36
  "@lezer/highlight": "^1.2.3",
35
37
  "castle-web-fonts": "^1.0.0",
36
38
  "codemirror": "^6.0.2",
@@ -35,9 +35,6 @@ importers:
35
35
  '@dnd-kit/utilities':
36
36
  specifier: ^3.2.2
37
37
  version: 3.2.2(react@19.2.7)
38
- '@fortawesome/free-solid-svg-icons':
39
- specifier: ^5.15.4
40
- version: 5.15.4
41
38
  '@lezer/highlight':
42
39
  specifier: ^1.2.3
43
40
  version: 1.2.3
@@ -186,14 +183,6 @@ packages:
186
183
  resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
187
184
  engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
188
185
 
189
- '@fortawesome/fontawesome-common-types@0.2.36':
190
- resolution: {integrity: sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==}
191
- engines: {node: '>=6'}
192
-
193
- '@fortawesome/free-solid-svg-icons@5.15.4':
194
- resolution: {integrity: sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==}
195
- engines: {node: '>=6'}
196
-
197
186
  '@humanfs/core@0.19.2':
198
187
  resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
199
188
  engines: {node: '>=18.18.0'}
@@ -447,6 +436,7 @@ packages:
447
436
  eslint@9.39.4:
448
437
  resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==}
449
438
  engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
439
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
450
440
  hasBin: true
451
441
  peerDependencies:
452
442
  jiti: '*'
@@ -1081,12 +1071,6 @@ snapshots:
1081
1071
  '@eslint/core': 0.17.0
1082
1072
  levn: 0.4.1
1083
1073
 
1084
- '@fortawesome/fontawesome-common-types@0.2.36': {}
1085
-
1086
- '@fortawesome/free-solid-svg-icons@5.15.4':
1087
- dependencies:
1088
- '@fortawesome/fontawesome-common-types': 0.2.36
1089
-
1090
1074
  '@humanfs/core@0.19.2':
1091
1075
  dependencies:
1092
1076
  '@humanfs/types': 0.15.0
@@ -42,7 +42,7 @@
42
42
  "ext": ".pxmodel",
43
43
  "label": "Model",
44
44
  "new": "New model",
45
- "icon": "clone",
45
+ "icon": "cube-transparent",
46
46
  "editor": "kit",
47
47
  "data": true
48
48
  },
@@ -50,7 +50,7 @@
50
50
  "ext": ".jsx",
51
51
  "label": "Behavior",
52
52
  "new": "New behavior",
53
- "icon": "code"
53
+ "icon": "file-code"
54
54
  }
55
55
  ],
56
56
  "defaultPlayFile": "scenes/main.scene"
@@ -58,16 +58,16 @@
58
58
  "imports": {
59
59
  "castle.physics-2d": {
60
60
  "deckId": "ckRZGFW4iPrx",
61
- "version": "2026-08-31T02:59:16.016Z"
61
+ "version": "2026-09-10T00:57:31.408Z"
62
62
  },
63
63
  "castle.base": {
64
64
  "deckId": "yRcmH4_aYllE",
65
- "version": "2026-09-01T01:02:34.326Z"
65
+ "version": "2026-09-10T00:56:59.388Z"
66
66
  }
67
67
  },
68
68
  "main": "main.jsx",
69
69
  "autoUpdateWhenImported": true,
70
70
  "deckId": "JH0SclbPVP0y",
71
71
  "cardId": "eXfAaUdbSU5A",
72
- "publishedVersion": "2026-09-05T00:07:37.655Z"
72
+ "publishedVersion": "2026-09-10T00:57:52.158Z"
73
73
  }
@@ -16,7 +16,6 @@
16
16
  "@dnd-kit/modifiers": "^9.0.0",
17
17
  "@dnd-kit/sortable": "^10.0.0",
18
18
  "@dnd-kit/utilities": "^3.2.2",
19
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
20
19
  "@lezer/highlight": "^1.2.3",
21
20
  "castle-web-fonts": "^1.0.0",
22
21
  "codemirror": "^6.0.2",
@@ -224,7 +223,6 @@
224
223
  "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
225
224
  "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
226
225
  "license": "MIT",
227
- "peer": true,
228
226
  "dependencies": {
229
227
  "@dnd-kit/accessibility": "^3.1.1",
230
228
  "@dnd-kit/utilities": "^3.2.2",
@@ -419,29 +417,6 @@
419
417
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
420
418
  }
421
419
  },
422
- "node_modules/@fortawesome/fontawesome-common-types": {
423
- "version": "0.2.36",
424
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz",
425
- "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==",
426
- "hasInstallScript": true,
427
- "license": "MIT",
428
- "engines": {
429
- "node": ">=6"
430
- }
431
- },
432
- "node_modules/@fortawesome/free-solid-svg-icons": {
433
- "version": "5.15.4",
434
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz",
435
- "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==",
436
- "hasInstallScript": true,
437
- "license": "(CC-BY-4.0 AND MIT)",
438
- "dependencies": {
439
- "@fortawesome/fontawesome-common-types": "^0.2.36"
440
- },
441
- "engines": {
442
- "node": ">=6"
443
- }
444
- },
445
420
  "node_modules/@humanfs/core": {
446
421
  "version": "0.19.2",
447
422
  "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
@@ -678,7 +653,6 @@
678
653
  "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
679
654
  "dev": true,
680
655
  "license": "MIT",
681
- "peer": true,
682
656
  "bin": {
683
657
  "acorn": "bin/acorn"
684
658
  },
@@ -1139,7 +1113,6 @@
1139
1113
  "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==",
1140
1114
  "dev": true,
1141
1115
  "license": "MIT",
1142
- "peer": true,
1143
1116
  "dependencies": {
1144
1117
  "@eslint-community/eslint-utils": "^4.8.0",
1145
1118
  "@eslint-community/regexpp": "^4.12.1",
@@ -2449,7 +2422,6 @@
2449
2422
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
2450
2423
  "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
2451
2424
  "license": "MIT",
2452
- "peer": true,
2453
2425
  "engines": {
2454
2426
  "node": ">=0.10.0"
2455
2427
  }
@@ -2459,7 +2431,6 @@
2459
2431
  "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
2460
2432
  "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
2461
2433
  "license": "MIT",
2462
- "peer": true,
2463
2434
  "dependencies": {
2464
2435
  "scheduler": "^0.27.0"
2465
2436
  },
@@ -29,7 +29,6 @@
29
29
  "@dnd-kit/modifiers": "^9.0.0",
30
30
  "@dnd-kit/sortable": "^10.0.0",
31
31
  "@dnd-kit/utilities": "^3.2.2",
32
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
33
32
  "@lezer/highlight": "^1.2.3",
34
33
  "castle-web-fonts": "^1.0.0",
35
34
  "codemirror": "^6.0.2",
@@ -38,9 +38,6 @@ importers:
38
38
  '@dnd-kit/utilities':
39
39
  specifier: ^3.2.2
40
40
  version: 3.2.2(react@19.2.8)
41
- '@fortawesome/free-solid-svg-icons':
42
- specifier: ^5.15.4
43
- version: 5.15.4
44
41
  '@lezer/highlight':
45
42
  specifier: ^1.2.3
46
43
  version: 1.2.3
@@ -195,14 +192,6 @@ packages:
195
192
  resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
196
193
  engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
197
194
 
198
- '@fortawesome/fontawesome-common-types@0.2.36':
199
- resolution: {integrity: sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==}
200
- engines: {node: '>=6'}
201
-
202
- '@fortawesome/free-solid-svg-icons@5.15.4':
203
- resolution: {integrity: sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==}
204
- engines: {node: '>=6'}
205
-
206
195
  '@humanfs/core@0.19.2':
207
196
  resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
208
197
  engines: {node: '>=18.18.0'}
@@ -1096,12 +1085,6 @@ snapshots:
1096
1085
  '@eslint/core': 0.17.0
1097
1086
  levn: 0.4.1
1098
1087
 
1099
- '@fortawesome/fontawesome-common-types@0.2.36': {}
1100
-
1101
- '@fortawesome/free-solid-svg-icons@5.15.4':
1102
- dependencies:
1103
- '@fortawesome/fontawesome-common-types': 0.2.36
1104
-
1105
1088
  '@humanfs/core@0.19.2':
1106
1089
  dependencies:
1107
1090
  '@humanfs/types': 0.15.0
@@ -17,18 +17,18 @@
17
17
  "imports": {
18
18
  "castle.physics-2d": {
19
19
  "deckId": "ckRZGFW4iPrx",
20
- "version": "2026-08-31T02:59:16.016Z"
20
+ "version": "2026-09-10T00:57:31.408Z"
21
21
  },
22
22
  "castle.base": {
23
23
  "deckId": "yRcmH4_aYllE",
24
- "version": "2026-09-01T01:02:34.326Z"
24
+ "version": "2026-09-10T00:56:59.388Z"
25
25
  }
26
26
  },
27
27
  "main": "main.jsx",
28
28
  "autoUpdateWhenImported": true,
29
29
  "deckId": "K6-Xs7dCoMVi",
30
30
  "cardId": "Kh_08IYATpC3",
31
- "publishedVersion": "2026-09-05T00:07:41.510Z",
31
+ "publishedVersion": "2026-09-10T00:58:22.840Z",
32
32
  "server": {
33
33
  "main": "code/server/index.js",
34
34
  "maxPlayers": 8,
@@ -15,7 +15,6 @@
15
15
  "@dnd-kit/modifiers": "^9.0.0",
16
16
  "@dnd-kit/sortable": "^10.0.0",
17
17
  "@dnd-kit/utilities": "^3.2.2",
18
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
19
18
  "@lezer/highlight": "^1.2.3",
20
19
  "castle-web-fonts": "^1.0.0",
21
20
  "codemirror": "^6.0.2",
@@ -151,7 +150,6 @@
151
150
  "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
152
151
  "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
153
152
  "license": "MIT",
154
- "peer": true,
155
153
  "dependencies": {
156
154
  "@dnd-kit/accessibility": "^3.1.1",
157
155
  "@dnd-kit/utilities": "^3.2.2",
@@ -202,29 +200,6 @@
202
200
  "react": ">=16.8.0"
203
201
  }
204
202
  },
205
- "node_modules/@fortawesome/fontawesome-common-types": {
206
- "version": "0.2.36",
207
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz",
208
- "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==",
209
- "hasInstallScript": true,
210
- "license": "MIT",
211
- "engines": {
212
- "node": ">=6"
213
- }
214
- },
215
- "node_modules/@fortawesome/free-solid-svg-icons": {
216
- "version": "5.15.4",
217
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz",
218
- "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==",
219
- "hasInstallScript": true,
220
- "license": "(CC-BY-4.0 AND MIT)",
221
- "dependencies": {
222
- "@fortawesome/fontawesome-common-types": "^0.2.36"
223
- },
224
- "engines": {
225
- "node": ">=6"
226
- }
227
- },
228
203
  "node_modules/@lezer/common": {
229
204
  "version": "1.5.2",
230
205
  "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz",
@@ -308,7 +283,6 @@
308
283
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
309
284
  "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
310
285
  "license": "MIT",
311
- "peer": true,
312
286
  "engines": {
313
287
  "node": ">=0.10.0"
314
288
  }
@@ -318,7 +292,6 @@
318
292
  "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
319
293
  "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
320
294
  "license": "MIT",
321
- "peer": true,
322
295
  "dependencies": {
323
296
  "scheduler": "^0.27.0"
324
297
  },
@@ -18,7 +18,6 @@
18
18
  "@dnd-kit/modifiers": "^9.0.0",
19
19
  "@dnd-kit/sortable": "^10.0.0",
20
20
  "@dnd-kit/utilities": "^3.2.2",
21
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
22
21
  "@lezer/highlight": "^1.2.3",
23
22
  "castle-web-fonts": "^1.0.0",
24
23
  "codemirror": "^6.0.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "castle-web-cli",
3
- "version": "0.4.169",
3
+ "version": "0.4.170",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "castle-web": "./dist/index.js"
@@ -8,14 +8,16 @@
8
8
  "scripts": {
9
9
  "build": "rm -rf dist && tsc && chmod +x dist/index.js && vite build && cp -R src/castle-host dist/castle-host && chmod -R u+w kits 2>/dev/null; rm -rf kits && cp -R ../kits kits && chmod -R u+w kits && rm -rf kits/*/imports",
10
10
  "dev": "tsc --watch",
11
- "check": "node ../scripts/sync-tokens.mjs --check && eslint . && jscpd && tsc --noEmit && tsc --noEmit -p src/shell/tsconfig.json"
11
+ "check": "node ../scripts/sync-tokens.mjs --check && node ../scripts/tests/icon-registry.mjs && eslint . && jscpd && tsc --noEmit && tsc --noEmit -p src/shell/tsconfig.json"
12
12
  },
13
13
  "jscpd": {
14
14
  "path": [
15
15
  "src"
16
16
  ],
17
17
  "ignore": [
18
- "src/castle-host/**"
18
+ "src/castle-host/**",
19
+ "src/shell/castle-patterns.css",
20
+ "src/shell/icons.ts"
19
21
  ],
20
22
  "threshold": 0,
21
23
  "reporters": [
@@ -31,7 +33,6 @@
31
33
  "@codemirror/language": "^6.12.3",
32
34
  "@codemirror/state": "^6.6.0",
33
35
  "@codemirror/view": "^6.41.1",
34
- "@fortawesome/free-solid-svg-icons": "^5.15.4",
35
36
  "@lezer/common": "^1.5.2",
36
37
  "@lezer/highlight": "^1.2.3",
37
38
  "@lydell/node-pty": "^1.2.0-beta.12",