@inneranimalmedia/agentsam-sdk 2.6.7 → 2.6.9

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 (371) hide show
  1. package/README.md +37 -0
  2. package/apps/README.md +25 -0
  3. package/apps/cad-creator/shared/cad/package.json +1 -1
  4. package/apps/client-cms-editor/backend/package.json +4 -6
  5. package/apps/client-cms-editor/frontend/package.json +6 -8
  6. package/apps/client-cms-editor/frontend/tsconfig.json +27 -8
  7. package/apps/client-cms-editor/package.json +1 -1
  8. package/apps/client-cms-editor/shared/cms/package.json +4 -6
  9. package/docs/LOCAL_ENGINE_COMPUTE_AUDIT_PLAN.md +299 -0
  10. package/docs/REPO_FILE_MAP.txt +132 -0
  11. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  12. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  13. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  14. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  15. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  16. package/native/agentsam-machine/cli/Cargo.toml +8 -1
  17. package/native/agentsam-machine/cli/README.md +21 -0
  18. package/native/agentsam-machine/core/Cargo.toml +7 -0
  19. package/native/agentsam-machine/core/README.md +14 -0
  20. package/native/agentsam-machine/core/build.rs +33 -0
  21. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  22. package/native/agentsam-machine/core/src/lib.rs +6 -0
  23. package/native/agentsam-machine/core/src/source_types.rs +2 -2
  24. package/package.json +31 -10
  25. package/packages/agentsam-brand/package.json +1 -1
  26. package/packages/agentsam-contracts/package.json +71 -20
  27. package/packages/agentsam-contracts/scripts/build.mjs +18 -0
  28. package/packages/agentsam-contracts/test/contracts.test.mjs +4 -1
  29. package/packages/agentsam-contracts/test/repository.test.mjs +4 -1
  30. package/packages/agentsam-contracts/tsconfig.build.json +10 -0
  31. package/packages/agentsam-errors/package.json +3 -2
  32. package/packages/agentsam-errors/src/index.js +1 -0
  33. package/packages/agentsam-errors/src/tool.js +56 -0
  34. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  35. package/packages/agentsam-goap/README.md +52 -0
  36. package/packages/agentsam-goap/package.json +37 -0
  37. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  38. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  39. package/packages/agentsam-goap/src/contracts.js +226 -0
  40. package/packages/agentsam-goap/src/control-plane.js +112 -0
  41. package/packages/agentsam-goap/src/errors.js +157 -0
  42. package/packages/agentsam-goap/src/index.js +5 -0
  43. package/packages/agentsam-goap/src/world.js +202 -0
  44. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  45. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  46. package/packages/agentsam-knowledge/package.json +3 -2
  47. package/packages/agentsam-nav/package.json +1 -1
  48. package/packages/agentsam-queue-control/package.json +1 -1
  49. package/packages/agentsam-rapid-rust/src/main.rs +1 -0
  50. package/packages/agentsam-repository/package.json +3 -2
  51. package/packages/agentsam-repository/src/goap.js +13 -14
  52. package/packages/agentsam-repository/src/tickets.js +15 -22
  53. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  54. package/packages/agentsam-vault/package.json +8 -5
  55. package/packages/agentsam-workbench/package.json +44 -17
  56. package/packages/connectors/cloudflare/package.json +4 -2
  57. package/packages/heuristic-theme/package.json +1 -1
  58. package/packages/identity/package.json +4 -3
  59. package/packages/identity/tests/lane1-packed-consumer.test.mjs +10 -2
  60. package/packages/providers/completeful/package.json +1 -1
  61. package/packages/theme-church-site/README.md +2 -2
  62. package/packages/theme-church-site/package.json +3 -4
  63. package/packages/theme-church-site/src/index.js +1 -1
  64. package/packages/theme-church-site/test/theme.test.mjs +1 -1
  65. package/packages/theme-companions-site/README.md +2 -2
  66. package/packages/theme-companions-site/package.json +3 -4
  67. package/packages/theme-companions-site/src/index.js +1 -1
  68. package/packages/theme-companions-site/test/theme.test.mjs +1 -1
  69. package/packages/theme-floors-site/README.md +2 -2
  70. package/packages/theme-floors-site/package.json +3 -4
  71. package/packages/theme-floors-site/src/index.js +1 -1
  72. package/packages/theme-floors-site/test/theme.test.mjs +1 -1
  73. package/packages/theme-fuelnfree-site/README.md +2 -2
  74. package/packages/theme-fuelnfree-site/package.json +3 -4
  75. package/packages/theme-fuelnfree-site/src/index.js +1 -1
  76. package/packages/theme-fuelnfree-site/test/theme.test.mjs +1 -1
  77. package/packages/theme-handyman-site/README.md +2 -2
  78. package/packages/theme-handyman-site/package.json +3 -4
  79. package/packages/theme-handyman-site/src/index.js +1 -1
  80. package/packages/theme-handyman-site/test/theme.test.mjs +1 -1
  81. package/packages/theme-insurance-site/README.md +2 -2
  82. package/packages/theme-insurance-site/package.json +3 -4
  83. package/packages/theme-insurance-site/src/index.js +1 -1
  84. package/packages/theme-insurance-site/test/theme.test.mjs +1 -1
  85. package/packages/theme-scenes/package.json +1 -1
  86. package/packages/theme-shinshu-site/README.md +2 -2
  87. package/packages/theme-shinshu-site/package.json +3 -4
  88. package/packages/theme-shinshu-site/src/index.js +1 -1
  89. package/packages/theme-shinshu-site/test/theme.test.mjs +1 -1
  90. package/packages/work-graph/package.json +3 -2
  91. package/protocol/local-engine/benchmark.v1.schema.json +14 -0
  92. package/protocol/local-engine/engine.v1.schema.json +17 -0
  93. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  94. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  95. package/python/tests/test_repository_intelligence.py +30 -0
  96. package/src/cli/command-catalog.js +3 -1
  97. package/src/cli.js +20 -1
  98. package/src/commands/app.js +10 -0
  99. package/src/commands/engine.js +10 -0
  100. package/src/commands/goap-world.js +134 -0
  101. package/src/commands/goap.js +11 -4
  102. package/src/commands/machine-binary.js +33 -27
  103. package/src/commands/machine-runtime.js +266 -0
  104. package/src/commands/machine.js +155 -51
  105. package/src/commands/package.js +537 -0
  106. package/src/commands/plan-ledger.js +370 -0
  107. package/src/commands/plan.js +183 -0
  108. package/src/commands/runtime.js +25 -10
  109. package/src/commands/setup.js +30 -6
  110. package/src/commands/skill.js +78 -17
  111. package/src/commands/terminal.js +20 -8
  112. package/src/errors/contract.js +4 -4
  113. package/src/errors/diagnostic.js +1 -1
  114. package/src/errors/index.js +1 -1
  115. package/src/index.js +20 -0
  116. package/src/indexing/ingest/materials.js +237 -30
  117. package/src/knowledge/source.js +1 -1
  118. package/src/lib/setup/runtime.js +4 -2
  119. package/src/lib/slash-commands.js +1 -1
  120. package/src/local/runtime-store.js +24 -2
  121. package/src/local/sqlite.js +17 -0
  122. package/src/local-engine/assets.js +37 -0
  123. package/src/local-engine/audit.js +133 -0
  124. package/src/local-engine/benchmark.js +26 -0
  125. package/src/local-engine/contracts.js +101 -0
  126. package/src/local-engine/engines.js +142 -0
  127. package/src/local-engine/index.js +18 -0
  128. package/src/local-engine/runtime.js +39 -0
  129. package/src/sam/operations/package-audit.js +41 -0
  130. package/src/sam/seed.js +2 -0
  131. package/skills/grok-auth/SKILL.md +0 -110
  132. package/skills/grok-auth/agentsam.skill.json +0 -25
  133. package/skills/grok-auth/references/grok-identity.md +0 -64
  134. package/skills/grok-auth/references/per-user-data.md +0 -49
  135. package/skills/grok-auth/references/prewired-and-env.md +0 -54
  136. package/skills/grok-auth/references/session-ui.md +0 -133
  137. package/skills/grok-auth/references/sign-in-methods.md +0 -55
  138. package/skills/grok-auth/references/wiring.md +0 -71
  139. package/skills/grok-building-games/SKILL.md +0 -213
  140. package/skills/grok-building-games/agentsam.skill.json +0 -25
  141. package/skills/grok-building-games/references/3d-libs.md +0 -64
  142. package/skills/grok-building-games/references/ai-pathfinding.md +0 -122
  143. package/skills/grok-building-games/references/audio.md +0 -129
  144. package/skills/grok-building-games/references/babylon.md +0 -202
  145. package/skills/grok-building-games/references/collision-physics.md +0 -122
  146. package/skills/grok-building-games/references/ecs-architecture.md +0 -111
  147. package/skills/grok-building-games/references/game-feel-juice.md +0 -110
  148. package/skills/grok-building-games/references/genres/board-card-chess.md +0 -89
  149. package/skills/grok-building-games/references/genres/endless-runner.md +0 -83
  150. package/skills/grok-building-games/references/genres/fps.md +0 -105
  151. package/skills/grok-building-games/references/genres/platformer-2d.md +0 -97
  152. package/skills/grok-building-games/references/genres/puzzle-match3-tetris.md +0 -131
  153. package/skills/grok-building-games/references/genres/racing-kart.md +0 -106
  154. package/skills/grok-building-games/references/genres/topdown-twin-stick.md +0 -97
  155. package/skills/grok-building-games/references/genres/tower-defense.md +0 -84
  156. package/skills/grok-building-games/references/genres/voxel-minecraft.md +0 -89
  157. package/skills/grok-building-games/references/input.md +0 -139
  158. package/skills/grok-building-games/references/phaser.md +0 -277
  159. package/skills/grok-building-games/references/procedural-generation.md +0 -141
  160. package/skills/grok-building-games/references/save-persistence.md +0 -108
  161. package/skills/grok-building-games/references/threejs-foundational.md +0 -148
  162. package/skills/grok-controls/SKILL.md +0 -274
  163. package/skills/grok-controls/agentsam.skill.json +0 -25
  164. package/skills/grok-design-ui/SKILL.md +0 -122
  165. package/skills/grok-design-ui/agentsam.skill.json +0 -25
  166. package/skills/grok-design-ui/references/animations.md +0 -379
  167. package/skills/grok-design-ui/references/performance.md +0 -88
  168. package/skills/grok-design-ui/references/refined-ui.md +0 -384
  169. package/skills/grok-design-ui/references/surfaces.md +0 -247
  170. package/skills/grok-design-ui/references/typography.md +0 -123
  171. package/skills/grok-game-animation-frames/SKILL.md +0 -84
  172. package/skills/grok-game-animation-frames/agentsam.skill.json +0 -25
  173. package/skills/grok-game-asset-core/SKILL.md +0 -69
  174. package/skills/grok-game-asset-core/agentsam.skill.json +0 -25
  175. package/skills/grok-game-character-consistency/SKILL.md +0 -69
  176. package/skills/grok-game-character-consistency/agentsam.skill.json +0 -25
  177. package/skills/grok-game-tilesets/SKILL.md +0 -65
  178. package/skills/grok-game-tilesets/agentsam.skill.json +0 -25
  179. package/skills/grok-game-ui-icons/SKILL.md +0 -56
  180. package/skills/grok-game-ui-icons/agentsam.skill.json +0 -25
  181. package/skills/grok-generate2dmap/LICENSE +0 -21
  182. package/skills/grok-generate2dmap/SKILL.md +0 -120
  183. package/skills/grok-generate2dmap/SOURCE.md +0 -6
  184. package/skills/grok-generate2dmap/agentsam.skill.json +0 -25
  185. package/skills/grok-generate2dmap/references/deliverables.md +0 -101
  186. package/skills/grok-generate2dmap/references/layered-map-contract.md +0 -209
  187. package/skills/grok-generate2dmap/references/map-strategies.md +0 -341
  188. package/skills/grok-generate2dmap/references/object-production-gate.md +0 -24
  189. package/skills/grok-generate2dmap/references/pipeline.md +0 -149
  190. package/skills/grok-generate2dmap/references/prop-pack-contract.md +0 -174
  191. package/skills/grok-generate2dmap/references/side-scroll-stages.md +0 -29
  192. package/skills/grok-generate2dmap/scripts/compose_layered_preview.py +0 -157
  193. package/skills/grok-generate2dmap/scripts/extract_prop_pack.py +0 -369
  194. package/skills/grok-generate2dsprite/LICENSE +0 -21
  195. package/skills/grok-generate2dsprite/SKILL.md +0 -313
  196. package/skills/grok-generate2dsprite/SOURCE.md +0 -6
  197. package/skills/grok-generate2dsprite/agentsam.skill.json +0 -25
  198. package/skills/grok-generate2dsprite/references/modes.md +0 -124
  199. package/skills/grok-generate2dsprite/references/prompt-rules.md +0 -315
  200. package/skills/grok-generate2dsprite/scripts/generate2dsprite.py +0 -1031
  201. package/skills/grok-generate2dsprite/scripts/make_layout_guide.py +0 -109
  202. package/skills/grok-imagine/SKILL.md +0 -201
  203. package/skills/grok-imagine/agentsam.skill.json +0 -25
  204. package/skills/grok-multiplayer-p2p/SKILL.md +0 -111
  205. package/skills/grok-multiplayer-p2p/agentsam.skill.json +0 -25
  206. package/skills/grok-multiplayer-p2p/references/react-binding.md +0 -144
  207. package/skills/grok-multiplayer-p2p/references/signaling-relay.md +0 -269
  208. package/skills/grok-neon/SKILL.md +0 -157
  209. package/skills/grok-neon/agentsam.skill.json +0 -25
  210. package/skills/grok-og/SKILL.md +0 -102
  211. package/skills/grok-og/agentsam.skill.json +0 -25
  212. package/skills/grok-og/references/brand-pass.md +0 -53
  213. package/skills/grok-og/references/custom-card.md +0 -107
  214. package/skills/grok-og/references/favicon-and-icons.md +0 -48
  215. package/skills/grok-og/references/og-type-contract.md +0 -18
  216. package/skills/grok-og/references/placeholder-card.md +0 -21
  217. package/skills/grok-og/references/x-banner.md +0 -41
  218. package/skills/grok-threejs/SKILL.md +0 -67
  219. package/skills/grok-threejs/agentsam.skill.json +0 -25
  220. package/skills/grok-threejs/references/llms-full.txt +0 -2780
  221. package/skills/grok-video2dsprite/LICENSE +0 -21
  222. package/skills/grok-video2dsprite/SKILL.md +0 -236
  223. package/skills/grok-video2dsprite/SOURCE.md +0 -6
  224. package/skills/grok-video2dsprite/agentsam.skill.json +0 -25
  225. package/skills/grok-video2dsprite/references/pipeline.md +0 -90
  226. package/skills/grok-video2dsprite/references/prompt-rules.md +0 -63
  227. package/skills/grok-video2dsprite/scripts/video2dsprite.py +0 -490
  228. package/skills/grok-xai-api/SKILL.md +0 -152
  229. package/skills/grok-xai-api/agentsam.skill.json +0 -25
  230. package/test/account-session.test.mjs +0 -101
  231. package/test/agent-capabilities.test.mjs +0 -67
  232. package/test/app-authority-context.test.mjs +0 -32
  233. package/test/app-building-skills.test.mjs +0 -61
  234. package/test/apps-scaffold-contract.test.mjs +0 -115
  235. package/test/blender-cad.test.mjs +0 -146
  236. package/test/cad-docker.test.mjs +0 -96
  237. package/test/capabilities.test.mjs +0 -133
  238. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  239. package/test/cli/catalog-authority.test.mjs +0 -64
  240. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  241. package/test/cli/eval-live.test.mjs +0 -219
  242. package/test/cli/go.test.mjs +0 -128
  243. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  244. package/test/cli/machine-command.test.mjs +0 -34
  245. package/test/cli/mcp-client.test.mjs +0 -256
  246. package/test/cli/preferences-runtime.test.mjs +0 -11
  247. package/test/cli/runtime-persist.test.mjs +0 -56
  248. package/test/cli/runtime-ui.test.mjs +0 -141
  249. package/test/cli/rust-command.test.mjs +0 -21
  250. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  251. package/test/cli/status-actions.test.mjs +0 -88
  252. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  253. package/test/cli-preferences.test.mjs +0 -46
  254. package/test/cloudflare-connector.test.mjs +0 -93
  255. package/test/cloudflare-runtime.test.mjs +0 -82
  256. package/test/context.test.mjs +0 -159
  257. package/test/credentials-audit.test.mjs +0 -113
  258. package/test/deploy-health-scan.test.mjs +0 -95
  259. package/test/deploy-receipt.test.mjs +0 -91
  260. package/test/dockerize.test.mjs +0 -93
  261. package/test/error-diagnostics.test.mjs +0 -124
  262. package/test/eval-context.test.mjs +0 -37
  263. package/test/execution-approvals.test.mjs +0 -27
  264. package/test/fixtures/cad/courtyard-house.json +0 -208
  265. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  266. package/test/fixtures/project-authority/customer-app/.agentsam/app.json +0 -5
  267. package/test/fixtures/project-authority/customer-app/apps/my-product/index.ts +0 -1
  268. package/test/fixtures/project-authority/customer-app/wrangler.toml +0 -17
  269. package/test/gcloud-auth.test.mjs +0 -111
  270. package/test/go/build-source-identity.test.mjs +0 -31
  271. package/test/go/cloudflare-probe.test.mjs +0 -317
  272. package/test/go/distribution.test.mjs +0 -28
  273. package/test/google-cloud-connection.test.mjs +0 -83
  274. package/test/google-cloud-inventory.test.mjs +0 -64
  275. package/test/indexing-provider.test.mjs +0 -29
  276. package/test/init-options.test.mjs +0 -35
  277. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  278. package/test/integration/app-command.test.mjs +0 -85
  279. package/test/integration/autorag-project-authority.integration.test.mjs +0 -51
  280. package/test/integration/autorag-runtime-discovery.test.mjs +0 -107
  281. package/test/integration/cad-discovery.test.mjs +0 -158
  282. package/test/integration/cad-docker-executor.test.mjs +0 -249
  283. package/test/integration/cad-execution.test.mjs +0 -184
  284. package/test/integration/cad-project-app.test.mjs +0 -31
  285. package/test/integration/cad-project-d1.test.mjs +0 -25
  286. package/test/integration/cad-project-native.test.mjs +0 -24
  287. package/test/integration/cad-project-workflow.test.mjs +0 -9
  288. package/test/integration/cad-project.test.mjs +0 -85
  289. package/test/integration/cli-help.test.mjs +0 -41
  290. package/test/integration/cms-app-scaffold.test.mjs +0 -77
  291. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -268
  292. package/test/integration/codebaseindex-ingest.test.mjs +0 -255
  293. package/test/integration/core-client.integration.test.mjs +0 -55
  294. package/test/integration/database-hosted-honesty.test.mjs +0 -49
  295. package/test/integration/desktop-keychain-boundary.test.mjs +0 -45
  296. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  297. package/test/integration/features-resolve.test.mjs +0 -147
  298. package/test/integration/hosted-work-host-authority.test.mjs +0 -47
  299. package/test/integration/icon-registry.test.mjs +0 -67
  300. package/test/integration/ingest-discover-models.test.mjs +0 -30
  301. package/test/integration/inspect-path-cli.test.mjs +0 -46
  302. package/test/integration/install-script.test.mjs +0 -110
  303. package/test/integration/inventory-core.test.mjs +0 -53
  304. package/test/integration/inventory-eligibility.test.mjs +0 -59
  305. package/test/integration/inventory-evidence.test.mjs +0 -125
  306. package/test/integration/knowledge-rpc.test.mjs +0 -112
  307. package/test/integration/local-fs.test.mjs +0 -113
  308. package/test/integration/local-provider-bridge.test.mjs +0 -65
  309. package/test/integration/local-studio-settings-production.test.mjs +0 -40
  310. package/test/integration/lockfile-sync.test.mjs +0 -26
  311. package/test/integration/merkle-cli.test.mjs +0 -61
  312. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  313. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  314. package/test/integration/provider-env-cli.test.mjs +0 -60
  315. package/test/integration/provider-factory.test.mjs +0 -197
  316. package/test/integration/repository-company-graph.test.mjs +0 -90
  317. package/test/integration/runtime-migrations.test.mjs +0 -87
  318. package/test/integration/runtime-status.integration.test.mjs +0 -227
  319. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  320. package/test/integration/sam-decision.test.mjs +0 -584
  321. package/test/integration/sam-kernel.test.mjs +0 -99
  322. package/test/integration/sam-planning-astar.test.mjs +0 -279
  323. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  324. package/test/integration/skill-runtime.test.mjs +0 -240
  325. package/test/integration/storage-architecture.test.mjs +0 -154
  326. package/test/integration/store-discovery.test.mjs +0 -44
  327. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  328. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  329. package/test/integration/theme-package-registry.test.mjs +0 -31
  330. package/test/integration/tool-runtime.test.mjs +0 -124
  331. package/test/integration/tool-schema.test.mjs +0 -59
  332. package/test/jr-dev-skill.test.mjs +0 -26
  333. package/test/knowledge-context-pack.test.mjs +0 -19
  334. package/test/knowledge-postgres.test.mjs +0 -40
  335. package/test/knowledge-service.test.mjs +0 -110
  336. package/test/knowledge.test.mjs +0 -206
  337. package/test/live/terminal-transport.live.test.mjs +0 -24
  338. package/test/local-sessions.test.mjs +0 -57
  339. package/test/local-studio-deploy.test.mjs +0 -83
  340. package/test/loopback-oauth.test.mjs +0 -53
  341. package/test/merkle-render.test.mjs +0 -31
  342. package/test/mini.test.mjs +0 -140
  343. package/test/model-catalog.test.mjs +0 -70
  344. package/test/models.test.mjs +0 -309
  345. package/test/npm10-lock.test.mjs +0 -29
  346. package/test/ollama.test.mjs +0 -137
  347. package/test/open-url.test.mjs +0 -64
  348. package/test/openai-responses.test.mjs +0 -155
  349. package/test/portable-context.test.mjs +0 -94
  350. package/test/project-config.test.mjs +0 -81
  351. package/test/project-rules.test.mjs +0 -44
  352. package/test/provider-credentials.test.mjs +0 -106
  353. package/test/rehydrate.test.mjs +0 -25
  354. package/test/release-hygiene.test.mjs +0 -42
  355. package/test/repository-snapshot-view.test.mjs +0 -112
  356. package/test/responses-runner.test.mjs +0 -465
  357. package/test/runtime-activity.test.mjs +0 -98
  358. package/test/sdk-worker-contract.test.mjs +0 -72
  359. package/test/security.test.mjs +0 -266
  360. package/test/setup-planner.test.mjs +0 -74
  361. package/test/setup-runtime.test.mjs +0 -51
  362. package/test/shell.test.mjs +0 -281
  363. package/test/skills.test.mjs +0 -22
  364. package/test/smoke.mjs +0 -122
  365. package/test/telemetry.test.mjs +0 -79
  366. package/test/terminal/local-pty.mock.test.mjs +0 -153
  367. package/test/terminal-machine-identity.test.mjs +0 -88
  368. package/test/theme-portability.test.mjs +0 -14
  369. package/test/tools-search.test.mjs +0 -73
  370. package/test/unit/website-assets-bindings.test.mjs +0 -60
  371. package/test/whoami-resume.test.mjs +0 -157
@@ -1,148 +0,0 @@
1
- # Browser Game Best Practices — Three.js / Babylon.js / Phaser (controls, camera, orientation, loop, assets, perf)
2
-
3
- Consolidated from official docs, well-regarded tutorials, and engine forums (see Sources at bottom). Focus: what an AI builder needs to get **browser games that feel right and don't have the usual bugs.**
4
-
5
- ---
6
-
7
- ## 1. Game loop & timing (the #1 correctness issue)
8
-
9
- **Rules:**
10
- - Drive the loop with **`renderer.setAnimationLoop(fn)`** in Three.js (internally uses `requestAnimationFrame`, plays nicely with WebXR) or the engine's built-in loop (Phaser `update(time, delta)`, Babylon `scene.onBeforeRenderObservable` / `engine.runRenderLoop`). Avoid `setTimeout`/`setInterval` and `Date.now()`.
11
- - **Scale ALL movement/animation by delta time** (seconds since last frame) so speed is frame-rate independent (30fps laptop vs 144Hz monitor). e.g. `mesh.position.x += speed * delta`.
12
- - **Cap delta** to avoid huge jumps after a backgrounded tab: `delta = Math.min(delta, 0.1)`.
13
- - **Compute delta exactly once per frame** and reuse it everywhere.
14
- - Three.js gotcha: `THREE.Clock.getDelta()` mutates state — calling it more than once per frame returns ~0 on later calls (very common bug). Newer `THREE.Timer` (Clock deprecated ~r183) has an explicit `.update()` so delta can be read multiple times safely.
15
- - **For physics/gameplay stability use a fixed timestep + accumulator** ("Fix Your Timestep"): run `fixedUpdate(FIXED_STEP)` (e.g. 1/60) in a `while (accumulator >= FIXED_STEP)` loop, render at display rate, optionally interpolate. Variable delta is fine for purely visual demos.
16
- - **Modularize**: give objects a `.update(delta)`/`.tick(delta)` method and iterate an "updatables" list; keep the top-level loop lean.
17
- - **On-demand rendering**: if nothing is animating, stop the loop / render only on change to save battery (Three.js `setAnimationLoop(null)`; R3F `frameloop="demand"`).
18
-
19
- **Reference pattern (Three.js, Timer + capped delta + fixed step):**
20
- ```js
21
- const timer = new THREE.Timer();
22
- let accumulator = 0; const FIXED = 1/60;
23
- function animate() {
24
- timer.update();
25
- let delta = Math.min(timer.getDelta(), 0.25);
26
- accumulator += delta;
27
- while (accumulator >= FIXED) { fixedUpdate(FIXED); accumulator -= FIXED; } // physics/AI
28
- updateVisuals(delta);
29
- renderer.render(scene, camera);
30
- }
31
- renderer.setAnimationLoop(animate);
32
- ```
33
-
34
- ---
35
-
36
- ## 2. First-person / WASD + mouse-look controls (Three.js)
37
-
38
- The canonical reference is the official `misc_controls_pointerlock` example (https://threejs.org/examples/misc_controls_pointerlock.html).
39
-
40
- **Key facts & rules:**
41
- - **`PointerLockControls` only handles the Pointer Lock API + mouse-look (yaw/pitch). It does NOT include WASD movement — you implement keyboard + translation yourself.**
42
- - Add **`controls.getObject()`** (the yaw container) to the scene, not the camera directly; the camera is a child for pitch.
43
- - Track keys with **boolean state flags** set in `keydown`/`keyup` (support both `KeyW`/`ArrowUp`, etc.). Do NOT move on the keydown event itself.
44
- - Move with **velocity + delta time** (acceleration + friction/damping), not a fixed distance per press — feels far better.
45
- - Use **`controls.moveForward()` / `controls.moveRight()`** — they respect current yaw (local XZ plane). Do NOT modify `camera.rotation`/`camera.position` directly for horizontal movement.
46
- - Pointer lock **requires a user gesture**: always show a "Click to play" blocker overlay; call `controls.lock()` on click; handle `'lock'`/`'unlock'` events and `pointerlockerror`; provide escape-to-unlock and a crosshair.
47
- - **Avoid the deprecated `FirstPersonControls`** (behaves like fly controls).
48
- - For real collisions/slopes/stairs, integrate a physics character controller: **Rapier.js `KinematicCharacterController`** (currently favored), or cannon-es (`PointerLockControlsCannon`), Ammo.js. Sync the body to `controls.getObject()`.
49
- - Encapsulate as a `FirstPersonController` class with `update(delta)`, `lock()`, `dispose()`, and tunable `speed`/`jumpHeight`. Add sprint (Shift), crouch, head-bob for feel.
50
- - R3F: use drei `<PointerLockControls />` + `useKeyboardControls` + `useFrame`.
51
-
52
- **Other camera rigs:**
53
- - **Orbit / product inspection:** Three.js `OrbitControls`; Babylon `ArcRotateCamera` (set `lower/upperRadiusLimit`, `lower/upperBetaLimit`, `inertia`, `panningSensibility`).
54
- - **Third-person follow:** lerp camera toward a target offset behind the player each frame; `camera.lookAt(player)`; Babylon has `FollowCamera`.
55
- - Keep the far plane / `camera.maxZ` (Babylon) as small as practical — improves culling, overdraw, and depth precision.
56
-
57
- ---
58
-
59
- ## 3. 3D orientation & coordinate conventions (a top source of "why is my model sideways/backwards" bugs)
60
-
61
- - **Three.js is right-handed, +Y up:** +X right, +Y up, +Z toward the viewer. Default camera sits at +Z looking toward −Z. (Differs from Unreal's Z-up, etc.) Changing global up (`Object3D.DefaultUp`) is discouraged — it affects helpers/grids.
62
- - **Forward-axis gotcha:**
63
- - Most `Object3D` (Mesh/Group): **local forward is +Z** `(0,0,1)`. Model/rotate so the "front" aligns with +Z.
64
- - **Camera** (and some lights): forward is **local −Z** `(0,0,-1)`. This is the classic "camera looks backwards" gotcha.
65
- - Many primitives (`ConeGeometry`, `CylinderGeometry`) point along **+Y** by default → rotate before use, e.g. `geo.rotateX(Math.PI/2)` to make +Y → +Z (align an arrow/cone's tip with forward).
66
- - **`object.lookAt(target)`** rotates in **world space** so the forward axis points at the target (uses `.up`, quaternions internally; does not move the object). For nested targets, first `target.getWorldPosition(v)`. To face a *direction* vector: `obj.lookAt(obj.position.clone().add(dir))`.
67
- - Imported glTF/GLB models may need an initial rotation to match +Z-forward. glTF/Blender export is right-handed Y-up, consistent with Three.js.
68
- - Debug with `AxesHelper` and `ArrowHelper` to visualize orientation quickly.
69
-
70
- ---
71
-
72
- ## 4. Performance (Three.js-centric, principles apply broadly)
73
-
74
- **The #1 killer is draw calls** (`renderer.info.render.calls`). Target **<100/frame** for smooth 60fps on most hardware; 500+ stutters; mobile is stricter.
75
-
76
- - **Share materials** aggressively (reuse one material instance across meshes).
77
- - **Instancing (`InstancedMesh`)** for many *identical* objects (trees, crowds, bullets) → one draw call; update via `setMatrixAt` + `instanceMatrix.needsUpdate`. Note: default frustum culling applies to the whole instanced mesh.
78
- - **`BatchedMesh`** (r156+) for *varied* geometries sharing one material, with per-object visibility + `perObjectFrustumCulled`.
79
- - **Merge geometries** (`BufferGeometryUtils.mergeGeometries`) for fully static scenery sharing a material (loses per-object culling — one bounding volume).
80
- - **Frustum culling** is automatic (`mesh.frustumCulled`); after modifying geometry call `computeBoundingBox()`/`computeBoundingSphere()`. Reduce `camera.far` where possible.
81
- - **Dispose GPU resources manually** — Three.js does NOT GC them. On removing objects/switching levels: `geometry.dispose()`, `material.dispose()`, and dispose all textures. Watch `renderer.info.memory`. Use **object pooling** for particles/enemies instead of create/destroy churn.
82
- - **Avoid allocations in the hot loop** (no `new Vector3()`/`new Matrix4()` per frame; reuse temporaries; Babylon has `TmpVectors` and `xxxToRef()`).
83
- - **LOD** (`THREE.LOD`) — swap lower-poly at distance. Compress geometry (Draco) and textures (**KTX2/Basis**); prefer texture atlases.
84
- - Limit lights; bake lighting/AO where possible; keep shadow maps small (and `RENDER_ONCE` refresh for static lights).
85
- - Add **Stats.js**/FPS counter during dev; profile with Spector.js / engine inspector; profile on target devices.
86
-
87
- **Babylon.js specifics:** prefer WebGPU w/ fallback + `powerPreference:"high-performance"`; `scene.performancePriority` (Intermediate/Aggressive); `scene.autoClear=false` when meshes cover viewport; `scene.skipPointerMovePicking=true` if no hover-picking; **thin instances** for static crowds; `mesh.freezeWorldMatrix()`, `material.freeze()`, `scene.freezeActiveMeshes()` for static content; `engine.setHardwareScalingLevel(2)` on low-end/mobile; `SceneOptimizer` to auto-degrade quality to hit a target FPS; keep `camera.maxZ` low. Camera "Behaviors" (Framing/Bouncing/AutoRotation) give polish for free.
88
-
89
- **Phaser specifics:** heavy **object pooling** (Groups with `maxSize`, recycle via `active/visible=false`), process only active objects, texture atlases (Texture Packer), destroy tweens/emitters on `SHUTDOWN`, smaller canvas + CSS upscaling, lazy-load per-level assets.
90
-
91
- ---
92
-
93
- ## 5. Engine / stack choice
94
-
95
- - **2D games → Phaser** (Phaser 3/4): scenes, Arcade/Matter physics, Scale Manager, huge ecosystem, great mobile support. Best default for 2D.
96
- - **3D games → Three.js** (most control, largest community) or **Babylon.js** (batteries-included: inspector, physics, WebGPU, camera behaviors, SceneOptimizer). **PlayCanvas** if you want a full editor/engine.
97
- - Physics: 2D → Arcade (simple) / Matter (rigid bodies); 3D → **Rapier.js** (fast, WASM, popular) / cannon-es / Ammo.js.
98
- - Tooling: **Vite + TypeScript**; PWA (manifest + service worker) for installable/offline mobile.
99
-
100
- **Phaser architecture (from best-practice write-ups):** one file per Scene extending `Phaser.Scene`; a scene stack of Boot → Preload (progress bar) → Menu → Game → parallel UI/HUD (`scene.launch`) → Pause/GameOver. Lifecycle: `init(data)` → `preload()` → `create(data)` → `update(time,delta)`; clean up on `SHUTDOWN`. Constants file for all string keys. Decouple scenes via an EventEmitter "EventsCenter" or `registry`, not direct references. Prefabs (custom GameObject subclasses) + FSM/ECS for complex logic instead of a giant `update()`.
101
-
102
- ---
103
-
104
- ## 6. Assets: generate vs. code vs. link
105
-
106
- - **Generate real images** for sprites/textures/backgrounds/UI where the builder can (matches Lovable/v0 philosophy: no placeholder images in the final product). For pixel art request specific specs ("clean 32×32 side-view run cycle, 8 frames, sprite sheet, transparent background").
107
- - **Don't hand-draw complex SVG/geometry** for illustrations or maps — use real assets or a library (echoes v0/Claude anti-slop rules).
108
- - **Optimize for the browser:** compressed textures (KTX2/Basis/WebP), power-of-two, atlases, keep total download small (aim <20–50MB). Draco/Meshopt for glTF.
109
- - **Placeholder > bad attempt** (Claude): if a good asset can't be produced, use a clean placeholder rather than an ugly hand-rolled one.
110
- - Set **`crossOrigin='anonymous'`** on images drawn to `<canvas>`/textures to avoid CORS taint (v0 rule).
111
- - 3D model pipeline: glTF/GLB (Y-up, right-handed) with Draco/Meshopt/KTX2; verify forward-axis orientation on import.
112
-
113
- ---
114
-
115
- ## 7. Mobile / responsive / touch
116
-
117
- - Distinguish the **canvas drawing buffer** (`canvas.width/height`) from **CSS display size**; account for `devicePixelRatio` to avoid blurry/tiny output. Rendering at a smaller internal resolution + CSS upscale is a valid perf win; `image-rendering: pixelated` for pixel art.
118
- - Choose a **base design resolution** + aspect ratio; **letterbox (FIT)** to avoid stretching. Phaser: `scale: { mode: Phaser.Scale.FIT, autoCenter: CENTER_BOTH, width, height }` and handle the `resize` event; listen for `orientationchange`.
119
- - Viewport meta: `width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no`; CSS `touch-action: none` and `preventDefault()` on touch to stop scroll/zoom.
120
- - **Touch controls:** virtual joystick (e.g. **nipplejs**, `mode:'static'` or `'dynamic'`), split screen (left = move, right = actions/aim), normalize input to −1..1 and apply with delta time, visual feedback on active. **Minimum touch/hit target 44px** (Claude/Apple HIG). Unify keyboard + touch + Gamepad API into one input state.
121
- - Test on real iOS Safari (audio unlock on gesture, WebGL context loss, touch coalescing) and low-end Android.
122
-
123
- ---
124
-
125
- ## 8. Common browser-game bugs to prevent (checklist)
126
- - Movement tied to frame rate (no delta) → runs too fast/slow on different displays.
127
- - `Clock.getDelta()` called multiple times per frame → things freeze/jitter.
128
- - Model faces wrong way → forgot +Z-forward convention / camera −Z; fix geometry rotation or `lookAt`.
129
- - Pointer lock never engages → missing user-gesture click / blocker overlay.
130
- - Memory leak / crash after level reload → geometries/materials/textures not disposed.
131
- - Frame drops → too many draw calls (needs instancing/batching/atlases), per-frame allocations, uncompressed textures.
132
- - Blurry or misaligned on mobile/retina → not handling devicePixelRatio / canvas resize.
133
- - CORS-tainted canvas → missing `crossOrigin='anonymous'`.
134
- - Physics tunneling/instability → variable timestep instead of fixed step.
135
- - Audio doesn't play on mobile → not unlocked on first user gesture.
136
-
137
- ---
138
-
139
- ## Sources
140
- - Three.js official: PointerLock example (https://threejs.org/examples/misc_controls_pointerlock.html), docs for `Timer`, `Object3D.lookAt`, `InstancedMesh`, `BatchedMesh` (https://threejs.org/docs/).
141
- - "Discover three.js" — animation loop / Loop class (https://discoverthreejs.com/book/first-steps/animation-loop/).
142
- - Three.js Discourse (Clock→Timer r183, setAnimationLoop vs RAF, coordinate-system threads) — https://discourse.threejs.org/.
143
- - Three.js perf write-ups: utsubo.com "100 tips" (https://www.utsubo.com/blog/threejs-best-practices-100-tips), threejsroadmap.com draw calls.
144
- - StackOverflow / Medium tutorials on PointerLock WASD and Rapier character controllers (https://medium.com/javascript-alliance/creating-a-first-person-character-controller-in-three-js-5d96534edfd8).
145
- - Babylon.js: official optimization guide (https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene), SceneOptimizer, camera input docs; 2025 forum best-practices thread (https://forum.babylonjs.com/t/best-practices-for-optimizing-babylon-js-scenes-not-just-on-lower-end-devices/58688); Babylon 9.0 notes.
146
- - Phaser: docs.phaser.io (Scenes, Arcade Physics), Phaser Discourse best-practices threads, franzeus.medium.com "How I optimized my Phaser 3 action game in 2025".
147
- - Mobile/touch: nipplejs (https://github.com/yoannmoinet/nipplejs), joshmorony.com Phaser scaling guide.
148
- - Fix Your Timestep (Gaffer On Games) — classic fixed-timestep reference.
@@ -1,274 +0,0 @@
1
- ---
2
- name: controls
3
- description: >
4
- Player-facing input signs for browser games: WASD, vehicles, flight, FPS
5
- mouse-look, and the #1 failure mode (inverted A/D). Mandatory control
6
- self-tests and a tiny test interface so you can verify A turns left before
7
- shipping. Load for ANY game with movement, steering, flying, driving, tanks,
8
- boats, mechs, drones, planes, karts, third-person follow cams — not only
9
- racing. Triggers on "controls", "WASD", "inverted", "steer", "flight",
10
- "airplane", "kart", "vehicle", "yaw", "roll", "pitch", "mouse look", "A/D".
11
- metadata:
12
- short-description: "Control signs, inverted A/D fix, vehicle/flight maps, mandatory self-test"
13
- user-invocable: false
14
- ---
15
-
16
- # Controls (player-visible signs — do not ship inverted)
17
-
18
- **Read this end-to-end before writing movement/steer/flight code** for any game
19
- that uses WASD, arrows, a chase camera, or a flying craft. Do **not** skip this
20
- and only open `racing-kart` or `fps` — those genre files assume you already
21
- know these signs. Inverted A/D is the most common ship-blocker in vehicle and
22
- flight demos.
23
-
24
- Pair with **`building-games`** (loop, camera, 3D orientation) and
25
- **`building-games/references/input.md`** (keydown state, gamepad, touch). This
26
- skill owns **what left/right/up mean to the player** and **how you prove it**.
27
-
28
- ---
29
-
30
- ## 0. Hard rules (fail the build if broken)
31
-
32
- 1. **Player-visible left/right is law.** From a **chase / behind** camera while
33
- the craft moves **forward**:
34
- - **A / ←** → nose (or bank) turns **left on screen**
35
- - **D / →** → nose (or bank) turns **right on screen**
36
- 2. **Never reuse FPS strafe as vehicle steer.** FPS “D → +right vector” is
37
- **position** on the ground plane. Vehicle A/D is **yaw (or roll) rate**, not
38
- a strafe offset. Mixing them is the #1 cause of inverted A/D.
39
- 3. **You must run a control self-test (§5) before saying done.** Screenshot-only
40
- QA is not enough. If A turns right, **flip the steer/roll sign**, retest,
41
- then ship — do not invent a new coordinate story.
42
-
43
- ---
44
-
45
- ## 1. Shared 3D basis (use this everywhere)
46
-
47
- three.js: right-handed, **+Y up**, meshes face **+Z**, cameras look **−Z**.
48
-
49
- **Yaw-only heading on XZ** (ground vehicles, walkers, most arcade craft):
50
-
51
- ```
52
- // yaw = 0 faces world −Z; +yaw is CCW about +Y (nose moves toward −X)
53
- forward = (-sin(yaw), 0, -cos(yaw))
54
- right = ( cos(yaw), 0, -sin(yaw)) // = normalize(cross(forward, worldUp))
55
- ```
56
-
57
- With a chase cam **behind** the craft (camera near `position - forward * dist`):
58
-
59
- | Player sees | World (this basis) | Input |
60
- |-------------|--------------------|--------|
61
- | Nose left | **+yaw** | **A / ←** must produce **+yaw** (or equivalent bank-left for planes) |
62
- | Nose right | **−yaw** | **D / →** must produce **−yaw** |
63
-
64
- If your basis differs, keep **one** consistent pair — but the **player-visible**
65
- row above is mandatory.
66
-
67
- ---
68
-
69
- ## 2. Genre maps
70
-
71
- ### 2a. FPS / on-foot (strafe, not steer)
72
-
73
- ```
74
- W = +forward, S = −forward, D = +right, A = −right // position, not yaw
75
- mouse: yaw -= movementX * sens; pitch -= movementY * sens; clamp pitch
76
- ```
77
-
78
- Body yaw for look; **movement uses yaw only** (do not apply pitch to walk).
79
-
80
- ### 2b. Ground / water vehicle (kart, bike, jetski, boat, tank, rover, snowmobile)
81
-
82
- Arcade body with `heading`/`yaw` and forward `speed`:
83
-
84
- ```js
85
- // Input (held keys → actions once per frame)
86
- let steer = 0; // -1..+1, player-visible
87
- if (keys.has('KeyA') || keys.has('ArrowLeft')) steer += 1; // LEFT
88
- if (keys.has('KeyD') || keys.has('ArrowRight')) steer -= 1; // RIGHT
89
- // Optional: steer = clamp(steer + gamepadX, -1, 1) with same sign convention
90
-
91
- // Integrate (speedFactor ~ 0..1 from |speed|)
92
- const reverse = speed >= 0 ? 1 : -1; // wheel-left still feels left in reverse
93
- yaw += steer * turnRate * speedFactor * reverse * dt;
94
-
95
- // Move along heading
96
- const fx = -Math.sin(yaw), fz = -Math.cos(yaw);
97
- position.x += fx * speed * dt;
98
- position.z += fz * speed * dt;
99
- ```
100
-
101
- **Canonical bug (do not copy):**
102
-
103
- ```js
104
- // WRONG — this is what ships inverted A/D in the wild
105
- if (KeyA) steer -= 1;
106
- if (KeyD) steer += 1;
107
- yaw += steer * turnRate * dt; // A → −yaw → nose RIGHT on chase cam
108
- ```
109
-
110
- If you already wrote `KeyA → steer--`, either **swap the key mapping** or
111
- **negate once at integrate** (`yaw += -steer * …`) — then run §5. Do not flip
112
- twice (keys + integrate + bank mesh).
113
-
114
- ### 2c. Fixed-wing flight (airplane, glider, RC plane)
115
-
116
- | Input | Action | Player expectation |
117
- |-------|--------|--------------------|
118
- | **A / ←** | **Roll left** (aileron) | Left wing down / bank left |
119
- | **D / →** | **Roll right** | Right wing down / bank right |
120
- | **W / ↑** | Pitch (pick one scheme and label HUD) | Usually nose down *or* pull-up — be consistent |
121
- | **S / ↓** | Opposite pitch | |
122
- | **Q / E** | Yaw / rudder (optional) | Q left, E right |
123
-
124
- - **A/D are not strafe** and not “ground steer with FPS signs.”
125
- - Apply roll in the craft’s **local forward axis** with a sign that matches
126
- **bank left on A**. If the mesh banks the wrong way, flip **one** sign on the
127
- roll apply (or on the A/D → roll mapping), not the whole basis.
128
- - Coordinated turn: positive bank should produce a turn that matches the bank
129
- direction under the chase/external cam.
130
-
131
- ### 2d. Heli / drone / 6DOF
132
-
133
- Document the scheme on a start overlay. Minimum:
134
-
135
- - Throttle/altitude on discrete keys must **not** stick “always up” after one
136
- press (use held state or explicit up/down).
137
- - Strafe/yaw: **A left, D right** in the craft’s horizontal frame (player-visible).
138
-
139
- ### 2e. 2D side-scroller / platformer
140
-
141
- **D / →** moves **right on screen**; **A / ←** moves **left**. Gravity only
142
- inverted if the genre is explicitly upside-down.
143
-
144
- ---
145
-
146
- ## 3. Camera must agree
147
-
148
- - Chase cam: `desired = craftPos + up*height + forward*(-followDist)`; lerp;
149
- `lookAt(craft)`.
150
- - Compute `forward` **once** for both movement and camera — do not rebuild with
151
- opposite yaw sign in the camera path.
152
- - Debug order: (1) keys register → (2) signs correct (§5) → (3) camera agrees.
153
-
154
- ---
155
-
156
- ## 4. Input plumbing (brief)
157
-
158
- - Track keys with a `Set` on `keydown`/`keyup` using **`event.code`**; clear on
159
- `blur` / `visibilitychange`. Move in the game loop with **dt**, not in the
160
- key handler.
161
- - Unify keyboard + touch + gamepad into **actions** (`throttle`, `steer`,
162
- `pitch`, `roll`, …). See `building-games/references/input.md`.
163
- - Touch: left stick = move/steer, right = actions; ≥44px targets.
164
-
165
- ---
166
-
167
- ## 5. Mandatory control self-test (before “done”)
168
-
169
- Screenshot-only is **not** enough for any craft with A/D.
170
-
171
- ### 5a. Player-visible checklist (every vehicle / flight build)
172
-
173
- While **moving forward** (speed > small epsilon), chase cam behind:
174
-
175
- | Hold | Must observe within ~0.5s |
176
- |------|---------------------------|
177
- | **A** | Nose or bank moves **left** on screen |
178
- | **D** | Nose or bank moves **right** on screen |
179
- | **W** (ground) | Speed increases / moves along facing |
180
- | **S** (ground) | Brakes or reverse (as designed) |
181
-
182
- If A fails: flip steer/roll sign **once**, retest both A and D.
183
-
184
- ### 5b. Minimal test interface (implement this)
185
-
186
- Expose a tiny hook so you (and automated QA) can prove signs without guessing
187
- private closures:
188
-
189
- ```js
190
- // e.g. src/game/controlsTest.ts — dev/QA only is fine
191
- export type ControlsProbe = {
192
- getYaw: () => number; // radians; or getHeading()
193
- getSpeed: () => number;
194
- /** Inject held actions instead of real keys; both stay applied until you
195
- * change them, so §5c can hold a key across frames and clear at the end. */
196
- setSteer?: (v: number) => void; // -1..1, same sign as production
197
- setKeys?: (codes: string[]) => void; // held until the next call; `[]` clears
198
- };
199
-
200
- declare global {
201
- interface Window {
202
- __controlsTest?: ControlsProbe;
203
- }
204
- }
205
- ```
206
-
207
- Wire `window.__controlsTest` from the game loop when `import.meta.env.DEV` or a
208
- `?qa=1` flag is set.
209
-
210
- ### 5c. Automated smoke (run it)
211
-
212
- Drive the §5b probe with the preinstalled **`agent-browser`** CLI — that is the
213
- first move, not a hand-written script. **A thrown `eval` exits non-zero; a
214
- merely falsy one does not**, so assert by throwing. Run it as one `batch` — one
215
- CLI call, not one per verb — taking JSON on stdin; `--bail` stops at the first
216
- failing step and exits non-zero.
217
-
218
- ```bash
219
- agent-browser batch --bail <<'JSON' # find's label is case-sensitive: copy it from `snapshot -i`
220
- [["open","http://127.0.0.1:8080/"],
221
- ["find","text","Start","click"],
222
- ["eval","if (!window.__controlsTest?.setKeys) throw Error('no §5b probe: add setKeys')"],
223
- ["eval","__controlsTest.setKeys(['KeyW'])"],
224
- ["wait","600"],
225
- ["eval","if (__controlsTest.getSpeed() <= 0.1) throw Error('W: no move')"],
226
- ["eval","(async () => { const t = __controlsTest, y0 = t.getYaw(); t.setKeys(['KeyW','KeyA']); await new Promise(r => setTimeout(r, 300)); t.setKeys(['KeyW']); const d = t.getYaw() - y0, w = Math.atan2(Math.sin(d), Math.cos(d)); if (w < -0.05) throw Error('A turns RIGHT — inverted, got ' + w.toFixed(2)); if (w <= 0.05) throw Error('A barely turned (' + w.toFixed(2) + ') — hold longer or check the sim is running'); return 'A ok' })()"],
227
- ["eval","__controlsTest.setKeys([])"],
228
- ["screenshot","/workspace/screenshots/controls.png"],
229
- ["close"]]
230
- JSON
231
- ```
232
-
233
- **Hold keys through the probe, not with `keydown`** — `agent-browser keydown`
234
- does not reach §4's `Set`, so a correct game reads as broken. No `setKeys` on
235
- your probe? Add it (§5b), or dispatch the key event yourself — the browser-QA
236
- reference's **Keys** note has the mechanism and the form.
237
-
238
- The hold sits **inside** one `eval`: spread across commands it lasts however
239
- long they take, and the ±π wrap in `Math.atan2(Math.sin(d), Math.cos(d))`
240
- reads a craft that turned more than π as one turning the other way. The IIFE is
241
- what keeps the step re-runnable — a bare `const d = …` fails the second time
242
- with "already declared" — and `async` is what lets the hold run in page time.
243
- Repeat for **D** with `'KeyD'` and both comparisons mirrored (`w > 0.05` is
244
- inverted, `w >= -0.05` is barely), single-quoted so the JSON needs no escapes;
245
- for planes assert **roll**: A ⇒ bank left.
246
-
247
- **`A turns RIGHT`** is the sign error: flip **one** sign and re-run.
248
- **`A barely turned`** is not — the craft moved the right way, just less than
249
- 0.05 rad in 300 ms, which a boat or a heavy rover will do; raise the hold, or
250
- check the sim is running, and flip nothing. Any other non-zero exit — no probe,
251
- a wedged daemon — means the check never ran: read the message first. Read the
252
- browser-QA reference `AGENTS.md` links before your first flow — verbs, argument
253
- shapes and the fallback are there.
254
-
255
- ### 5d. What not to do
256
-
257
- - Do **not** only test “D increases some internal variable.”
258
- - Do **not** use FPS “D → +X when facing −Z” as the vehicle pass condition.
259
- - Do **not** flip mesh bank, camera, and steer all at once when fixing — change
260
- **one** sign, retest.
261
-
262
- ---
263
-
264
- ## 6. Finish criteria (controls)
265
-
266
- - [ ] Opened **this** skill before writing movement/steer/flight.
267
- - [ ] Genre map chosen (§2) and start-screen / HUD labels match it.
268
- - [ ] Chase-cam A/D player-visible test **passed** (§5a).
269
- - [ ] `window.__controlsTest` (or equivalent) available in dev/QA and used once.
270
- - [ ] No inverted bank mesh relative to roll/steer input.
271
- - [ ] Keys are held-state + dt-scaled; no sticky thrust from a single Space tap
272
- unless intentional and labeled.
273
-
274
- If any box is unchecked, the game is **not** done.
@@ -1,25 +0,0 @@
1
- {
2
- "schema": "agentsam.skill.v1",
3
- "id": "grok-controls",
4
- "name": "Grok \u00b7 controls",
5
- "description": "Control signs, inverted A/D fix, vehicle/flight maps, mandatory self-test",
6
- "icon": "skill",
7
- "slash": {
8
- "suggested": "/grok-controls"
9
- },
10
- "instructions": {
11
- "source": "local_file",
12
- "ref": "SKILL.md"
13
- },
14
- "execution": {
15
- "mode": "turn",
16
- "tools": [],
17
- "operations": [],
18
- "capabilities": []
19
- },
20
- "provenance": {
21
- "source": "apps/local-studio/.grok/skills",
22
- "vendor": "grok",
23
- "status": "imported"
24
- }
25
- }
@@ -1,122 +0,0 @@
1
- ---
2
- name: design-ui
3
- description: >
4
- Design and build polished, non-generic UI for this TanStack Start + React +
5
- Tailwind v4 + shadcn/Radix app. Use whenever you create or restyle any
6
- interface surface — pages, landing pages, dashboards, forms, modals, nav, and
7
- game overlays (start screens, HUD, menus). Covers design tokens, layout,
8
- typography, color, spacing, motion, and the anti-"AI-slop" rules that keep
9
- output from looking generic. Triggers on "design", "UI", "make it look good",
10
- "polish", "landing page", "theme", "style", "redesign", "ugly", "clean up".
11
- metadata:
12
- short-description: "Polished, non-generic UI: tokens, layout, type, color, motion, anti-slop"
13
- user-invocable: false
14
- ---
15
-
16
- # Design & UI
17
-
18
- Make interfaces that look intentional and premium, not template-generic. This is
19
- the single biggest quality lever in the app builder. Apply it to **DOM / overlay
20
- UI** — pages, chrome, HUD, menus, forms. (For a 3D game's gameplay canvas, see
21
- the `building-games` skill; this skill governs the DOM UI layered over it.)
22
-
23
- **Read `references/` for depth** (loaded on demand — don't inline it all):
24
- - `references/refined-ui.md` — the full product-chrome/overlay design system.
25
- - `references/typography.md` — type scale, pairing, rhythm.
26
- - `references/surfaces.md` — elevation, borders, shadows, layering.
27
- - `references/animations.md` — motion, easing, transitions.
28
- - `references/performance.md` — keep UI smooth (60fps, no jank).
29
-
30
- ---
31
-
32
- ## 1. Design-system-first (do this before styling anything)
33
-
34
- Define the system once, then compose from it. **Never** sprinkle ad-hoc values.
35
-
36
- - **Tokens in CSS (Tailwind v4 is CSS-first).** Put the palette, radii, and fonts
37
- in `src/styles.css` under `@theme` as CSS variables; consume them as Tailwind
38
- utilities. One source of truth.
39
- ```css
40
- @import "tailwindcss";
41
- @theme {
42
- --color-bg: #0b0b0f; --color-surface: #16161d;
43
- --color-fg: #e7e7ea; --color-muted: #a0a0ab;
44
- --color-primary: #14b8a6; --color-border: #26262f;
45
- --radius: 0.75rem; --font-sans: "Inter", system-ui, sans-serif;
46
- }
47
- ```
48
- - **Use shadcn/ui components** (Radix primitives + `cva` variants + `tailwind-merge`)
49
- for buttons, dialogs, dropdowns, inputs, etc. They're accessible and consistent.
50
- Generate them into `src/components/ui`; style via tokens, not inline hex.
51
- - **Tailwind v4 base fix — buttons need a pointer cursor.** v4's Preflight makes
52
- `<button>` use `cursor: default`, which feels broken. Add this once in
53
- `src/styles.css` so buttons/clickable roles show a pointer:
54
- ```css
55
- @layer base {
56
- button:not(:disabled),
57
- [role="button"]:not(:disabled) { cursor: pointer; }
58
- }
59
- ```
60
- - **Ban ad-hoc styling:** no raw hex in JSX, no `text-white`/`bg-black` literals,
61
- no arbitrary values like `p-[16px]` or `text-[13px]`. If you need a value,
62
- it becomes a token or a scale step.
63
-
64
- ## 2. The quantified rubric (cheap rules that prevent "ugly")
65
-
66
- - **≤ 3–5 colors total** (one primary + neutrals + at most one accent). No random
67
- extra hues. Don't default to purple unless asked.
68
- - **≤ 2 font families** (often one). Pair a display/heading with a body, or use one.
69
- - **Line-height 1.4–1.6** for body; tighter for large headings.
70
- - **When you override a background color, override the foreground/text color too**
71
- (contrast must hold — check both light and dark).
72
- - **Mobile-first**: design the ~390px layout first, then scale up. No horizontal
73
- overflow; tap targets ≥ 44px.
74
- - **Consistent spacing scale** (4/8-based). Generous whitespace beats cramming.
75
- - **One accent, used sparingly** for primary actions — not everywhere.
76
-
77
- ## 3. Anti-AI-slop (the tells that make output look generic — avoid)
78
-
79
- - **No gradient-blob filler**, no giant hero gradients as a substitute for content.
80
- - **No emoji as icons** — use a real icon set (`lucide-react`).
81
- - **No hand-drawn SVG** illustrations/maps/charts — use real libraries (`recharts`
82
- for charts) or real generated images.
83
- - **No placeholder images / lorem-gray boxes** in the final product — generate
84
- real images or use real content; set `crossOrigin="anonymous"` on canvas images.
85
- - **Avoid the overused-font look** (default system-only, or Comic Sans-tier picks).
86
- - **Every element earns its place.** Cut decorative noise. Establish a system,
87
- then vary with intent — not randomness.
88
- - **Match the existing UI when editing** an app in place; don't introduce a second
89
- visual language.
90
-
91
- ## 4. Layout & hierarchy
92
-
93
- - Clear visual hierarchy: one primary action per view; size/weight/color express
94
- importance. See `references/typography.md` and `references/surfaces.md`.
95
- - Use real layout structure (grid/flex, container max-widths), not absolute-position
96
- hacks. Align to a consistent grid.
97
- - Empty states, loading states, and error states are part of the design — don't
98
- ship blank/janky intermediate states.
99
-
100
- ## 5. Motion (subtle, purposeful)
101
-
102
- - Short, eased transitions (150–250ms) on hover/press/enter; respect
103
- `prefers-reduced-motion`. Details in `references/animations.md`.
104
- - Never animate layout in a way that causes jank; prefer transform/opacity.
105
-
106
- ## 6. Game overlays (when this pairs with `building-games`)
107
-
108
- The gameplay canvas is owned by `building-games`. This skill styles the **DOM
109
- overlay**: start/"click to play" screen, HUD, score, menus, pause, mobile
110
- controls. Keep overlay readable over the canvas (backdrop, contrast), and keep it
111
- out of the pointer-lock/gameplay input path.
112
-
113
- ---
114
-
115
- ## Finish checklist (before you call UI done)
116
- - Tokens defined in `@theme`; no ad-hoc hex / arbitrary values in JSX.
117
- - ≤ 5 colors, ≤ 2 fonts, consistent spacing scale.
118
- - Contrast holds; foreground overridden wherever background is.
119
- - Mobile (~390px) has no overflow; targets ≥ 44px.
120
- - Real icons/images/charts — none of the anti-slop tells.
121
- - Loading/empty/error states handled; motion subtle and reduced-motion-safe.
122
- - Rendered and eyeballed in a browser (see AGENTS.md verification), not just curl.
@@ -1,25 +0,0 @@
1
- {
2
- "schema": "agentsam.skill.v1",
3
- "id": "grok-design-ui",
4
- "name": "Grok \u00b7 design-ui",
5
- "description": "Polished, non-generic UI: tokens, layout, type, color, motion, anti-slop",
6
- "icon": "skill",
7
- "slash": {
8
- "suggested": "/grok-design-ui"
9
- },
10
- "instructions": {
11
- "source": "local_file",
12
- "ref": "SKILL.md"
13
- },
14
- "execution": {
15
- "mode": "turn",
16
- "tools": [],
17
- "operations": [],
18
- "capabilities": []
19
- },
20
- "provenance": {
21
- "source": "apps/local-studio/.grok/skills",
22
- "vendor": "grok",
23
- "status": "imported"
24
- }
25
- }