@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.7

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 (699) hide show
  1. package/AGENTSAM.md +40 -0
  2. package/README.md +15 -9
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +17 -0
  7. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  8. package/apps/client-cms-editor/README.md +100 -0
  9. package/apps/client-cms-editor/agentsam.app.json +74 -0
  10. package/apps/client-cms-editor/backend/README.md +5 -0
  11. package/apps/client-cms-editor/backend/package.json +39 -0
  12. package/apps/client-cms-editor/backend/src/api/client.ts +233 -0
  13. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  14. package/apps/client-cms-editor/backend/src/model.ts +11 -0
  15. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  16. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  17. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  18. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  19. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  20. package/apps/client-cms-editor/backend/tsconfig.json +20 -0
  21. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  22. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  23. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  24. package/apps/client-cms-editor/bin/agentsam-cms.mjs +3 -0
  25. package/apps/client-cms-editor/frontend/index.html +12 -0
  26. package/apps/client-cms-editor/frontend/package.json +42 -0
  27. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +156 -0
  28. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +36 -0
  29. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  30. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  31. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  32. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  33. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  34. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  35. package/apps/client-cms-editor/frontend/src/editor/legacy/CmsEditorPrototype.tsx +1374 -0
  36. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  37. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  38. package/apps/client-cms-editor/frontend/src/index.ts +22 -0
  39. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  40. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  41. package/apps/client-cms-editor/frontend/src/main.tsx +91 -0
  42. package/apps/client-cms-editor/frontend/src/mount.tsx +113 -0
  43. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  44. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  45. package/apps/client-cms-editor/frontend/src/styles/studio.css +158 -0
  46. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  47. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  48. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  49. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  50. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  51. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  52. package/apps/client-cms-editor/frontend/tsconfig.json +36 -0
  53. package/apps/client-cms-editor/frontend/vite.config.ts +25 -0
  54. package/apps/client-cms-editor/package-lock.json +4671 -0
  55. package/apps/client-cms-editor/package.json +135 -0
  56. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  57. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  58. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  59. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  60. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  61. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  62. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  63. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  64. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  65. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  66. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  67. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  68. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  69. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  70. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  71. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  72. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  73. package/apps/client-cms-editor/shared/cms/package.json +31 -0
  74. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  75. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +37 -0
  76. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  77. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +90 -0
  78. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  79. package/apps/client-cms-editor/shared/cms/src/index.ts +9 -0
  80. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  81. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  82. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  83. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  84. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  85. package/bin/agentsam-rapid-rust +36 -0
  86. package/contracts/source-types.v1.json +353 -0
  87. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  88. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  89. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  90. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  91. package/docs/THEME_REFINERY.md +2 -2
  92. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  93. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  94. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +171 -0
  95. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  96. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  97. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  98. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  99. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  100. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  101. package/docs/contracts/capability-install-planner.md +67 -0
  102. package/docs/contracts/environment-vocabulary.md +195 -0
  103. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  104. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  105. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  106. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  107. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  108. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  109. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  110. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  111. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  112. package/docs/plugins.md +2 -2
  113. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  114. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  115. package/docs/product/README.md +8 -0
  116. package/docs/rapid-rust-wasm.md +35 -0
  117. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  118. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  119. package/native/agentsam-machine/Cargo.lock +426 -0
  120. package/native/agentsam-machine/Cargo.toml +9 -0
  121. package/native/agentsam-machine/cli/Cargo.toml +14 -0
  122. package/native/agentsam-machine/cli/src/main.rs +77 -0
  123. package/native/agentsam-machine/core/Cargo.toml +15 -0
  124. package/native/agentsam-machine/core/src/assets.rs +790 -0
  125. package/native/agentsam-machine/core/src/bound.rs +298 -0
  126. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  127. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  128. package/native/agentsam-machine/core/src/lib.rs +1086 -0
  129. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  130. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  131. package/package.json +110 -21
  132. package/packages/agentsam-brand/README.md +107 -12
  133. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  134. package/packages/agentsam-brand/package.json +41 -9
  135. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  136. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  137. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  138. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  139. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  140. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  141. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  142. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  143. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  144. package/packages/agentsam-brand/src/core/errors.js +12 -0
  145. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  146. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  147. package/packages/agentsam-brand/src/core/keys.js +83 -0
  148. package/packages/agentsam-brand/src/core/naming.js +142 -0
  149. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  150. package/packages/agentsam-brand/src/core/pack.js +305 -0
  151. package/packages/agentsam-brand/src/core/plan.js +276 -0
  152. package/packages/agentsam-brand/src/core/preview.js +159 -0
  153. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  154. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  155. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  156. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  157. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  158. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  159. package/packages/agentsam-brand/src/core/promote.js +288 -0
  160. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  161. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  162. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  163. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  164. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  165. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  166. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  167. package/packages/agentsam-brand/src/index.js +193 -36
  168. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  169. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  170. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  171. package/packages/agentsam-brand/src/presets/index.js +40 -0
  172. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  173. package/packages/agentsam-brand/src/presets/model.json +8 -0
  174. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  175. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  176. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  177. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  178. package/packages/agentsam-contracts/package.json +13 -3
  179. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  180. package/packages/agentsam-contracts/src/tools.ts +22 -0
  181. package/packages/agentsam-errors/package.json +13 -3
  182. package/packages/agentsam-knowledge/package.json +18 -4
  183. package/packages/agentsam-knowledge/src/autorag/index.js +11 -4
  184. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  185. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  186. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  187. package/packages/agentsam-knowledge/test/autorag.test.mjs +81 -1
  188. package/packages/agentsam-nav/package.json +26 -8
  189. package/packages/agentsam-queue-control/README.md +1 -1
  190. package/packages/agentsam-queue-control/package.json +7 -2
  191. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  192. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  193. package/packages/agentsam-rapid-rust/README.md +5 -0
  194. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  195. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  196. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  197. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  198. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  199. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  200. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  201. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  202. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  203. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  204. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  205. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  206. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  207. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  208. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  209. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  210. package/packages/agentsam-repository/package.json +13 -3
  211. package/packages/agentsam-repository/src/index.js +1 -0
  212. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  213. package/packages/agentsam-repository/src/source-types.js +93 -0
  214. package/packages/agentsam-vault/README.md +96 -0
  215. package/packages/agentsam-vault/package.json +42 -0
  216. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  217. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  218. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  219. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  220. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  221. package/packages/agentsam-vault/src/index.d.ts +9 -0
  222. package/packages/agentsam-vault/src/index.js +27 -0
  223. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  224. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  225. package/packages/agentsam-workbench/README.md +24 -0
  226. package/packages/agentsam-workbench/package.json +49 -0
  227. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  228. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  229. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  230. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  231. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  232. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  233. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  234. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  235. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  236. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  237. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  238. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  239. package/packages/agentsam-workbench/src/agent/index.ts +12 -0
  240. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  241. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  242. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  243. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  244. package/packages/agentsam-workbench/src/index.ts +6 -0
  245. package/packages/agentsam-workbench/src/project-control.css +160 -0
  246. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  247. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  248. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  249. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  250. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  251. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  252. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  253. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  254. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  255. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  256. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  257. package/packages/agentsam-workbench/tsconfig.json +13 -0
  258. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  259. package/packages/connectors/cloudflare/package.json +16 -4
  260. package/packages/connectors/cloudflare/src/api-client.js +280 -0
  261. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  262. package/packages/connectors/cloudflare/src/credential.js +318 -0
  263. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  264. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  265. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  266. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  267. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  268. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  269. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  270. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  271. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  272. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  273. package/packages/connectors/cloudflare/src/index.js +103 -265
  274. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  275. package/packages/connectors/cloudflare/src/owner.js +42 -12
  276. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  277. package/packages/connectors/cloudflare/src/routes.js +309 -144
  278. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  279. package/packages/connectors/cloudflare/src/vault.js +2 -2
  280. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  281. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  282. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  283. package/packages/heuristic-theme/README.md +2 -2
  284. package/packages/heuristic-theme/package.json +8 -3
  285. package/packages/heuristic-theme/src/registry.js +2 -2
  286. package/packages/heuristic-theme/src/theme.js +1 -1
  287. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  288. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  289. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +44 -4
  290. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  291. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  292. package/packages/identity/README.md +2 -2
  293. package/packages/identity/backend/README.md +1 -1
  294. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -14
  295. package/packages/identity/migrations/apply-portable.js +109 -0
  296. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  297. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  298. package/packages/identity/package.json +27 -5
  299. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  300. package/packages/identity/scripts/local-identity-bridge.mjs +190 -0
  301. package/packages/identity/scripts/preview-auth-portal.mjs +8 -8
  302. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -372
  303. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  304. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  305. package/packages/identity/src/adapters/portable-store.js +479 -0
  306. package/packages/identity/src/adapters/sqlite/index.js +13 -309
  307. package/packages/identity/src/contracts/auth-config.js +27 -8
  308. package/packages/identity/src/contracts/external-identity.js +1 -1
  309. package/packages/identity/src/contracts/identity-store.js +56 -5
  310. package/packages/identity/src/contracts/provider.js +2 -0
  311. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  312. package/packages/identity/src/core/constants.js +1 -1
  313. package/packages/identity/src/core/session-policy.js +31 -0
  314. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  315. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -6
  316. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  317. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  318. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  319. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +176 -0
  320. package/packages/identity/src/index.js +44 -1
  321. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  322. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  323. package/packages/identity/src/migrations/README.md +23 -20
  324. package/packages/identity/src/oauth/README.md +10 -5
  325. package/packages/identity/src/oauth/consent-view.js +388 -0
  326. package/packages/identity/src/oauth/credentials.js +39 -20
  327. package/packages/identity/src/oauth/google-desktop-exchange.js +341 -0
  328. package/packages/identity/src/oauth/iam-platform.js +21 -9
  329. package/packages/identity/src/oauth/native-handoff.js +136 -0
  330. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  331. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  332. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  333. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  334. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  335. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  336. package/packages/identity/src/providers/github/oauth.js +1 -2
  337. package/packages/identity/src/providers/github/profile.js +16 -2
  338. package/packages/identity/src/providers/iam/index.js +27 -5
  339. package/packages/identity/src/providers/index.js +11 -3
  340. package/packages/identity/src/server/identity-service.js +33 -3
  341. package/packages/identity/src/server/worker-router.js +171 -88
  342. package/packages/identity/tests/auth-config.test.mjs +3 -2
  343. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  344. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  345. package/packages/identity/tests/identity-init-scaffold.test.mjs +17 -3
  346. package/packages/identity/tests/identity-service.test.mjs +16 -0
  347. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  348. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  349. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  350. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  351. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  352. package/packages/identity/tests/oauth-credentials.test.mjs +21 -8
  353. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  354. package/packages/identity/tests/preview-auth-portal.test.mjs +5 -3
  355. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  356. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  357. package/packages/providers/completeful/package.json +7 -2
  358. package/packages/runtime-protocol/src/index.js +154 -0
  359. package/packages/theme-church-site/package.json +17 -6
  360. package/packages/theme-church-site/src/harvest.json +4 -2
  361. package/packages/theme-church-site/src/index.js +7 -3
  362. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  363. package/packages/theme-companions-site/package.json +17 -6
  364. package/packages/theme-companions-site/src/harvest.json +4 -2
  365. package/packages/theme-companions-site/src/index.js +7 -3
  366. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  367. package/packages/theme-floors-site/package.json +17 -6
  368. package/packages/theme-floors-site/src/harvest.json +4 -2
  369. package/packages/theme-floors-site/src/index.js +7 -3
  370. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  371. package/packages/theme-fuelnfree-site/package.json +17 -6
  372. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  373. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  374. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  375. package/packages/theme-handyman-site/package.json +17 -6
  376. package/packages/theme-handyman-site/src/harvest.json +4 -2
  377. package/packages/theme-handyman-site/src/index.js +7 -3
  378. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  379. package/packages/theme-insurance-site/package.json +17 -6
  380. package/packages/theme-insurance-site/src/harvest.json +4 -2
  381. package/packages/theme-insurance-site/src/index.js +7 -3
  382. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  383. package/packages/theme-scenes/README.md +164 -0
  384. package/packages/theme-scenes/package.json +54 -0
  385. package/packages/theme-scenes/src/blocks/index.js +30 -0
  386. package/packages/theme-scenes/src/contracts/index.js +286 -0
  387. package/packages/theme-scenes/src/demos/index.js +65 -0
  388. package/packages/theme-scenes/src/index.js +75 -0
  389. package/packages/theme-scenes/src/presets/index.js +263 -0
  390. package/packages/theme-scenes/src/registry.js +187 -0
  391. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  392. package/packages/theme-scenes/src/scenes/index.js +146 -0
  393. package/packages/theme-scenes/src/shell/index.js +47 -0
  394. package/packages/theme-scenes/src/themes/index.js +129 -0
  395. package/packages/theme-scenes/src/visuals/index.js +41 -0
  396. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  397. package/packages/theme-shinshu-site/package.json +17 -6
  398. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  399. package/packages/theme-shinshu-site/src/index.js +7 -3
  400. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  401. package/packages/work-graph/package.json +14 -4
  402. package/packages/work-graph/src/index.js +34 -1
  403. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  404. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  405. package/protocol/FILEMETA_V1.md +2 -2
  406. package/protocol/README.md +15 -7
  407. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  408. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  409. package/protocol/assets/README.md +9 -0
  410. package/protocol/assets/asset-record.v1.schema.json +64 -0
  411. package/protocol/capabilities/manifest.json +1 -1
  412. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  413. package/protocol/presets/catalog.json +2 -2
  414. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  415. package/protocol/scoring/README.md +10 -0
  416. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  417. package/protocol/theme-refinery/lineage-registry.json +105 -0
  418. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  419. package/protocol/ui/icon-registry.mjs +1 -0
  420. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  421. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  422. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  423. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  424. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  425. package/scripts/build_rapid_rust_cli.py +83 -0
  426. package/skills/grok-auth/SKILL.md +110 -0
  427. package/skills/grok-auth/agentsam.skill.json +25 -0
  428. package/skills/grok-auth/references/grok-identity.md +64 -0
  429. package/skills/grok-auth/references/per-user-data.md +49 -0
  430. package/skills/grok-auth/references/prewired-and-env.md +54 -0
  431. package/skills/grok-auth/references/session-ui.md +133 -0
  432. package/skills/grok-auth/references/sign-in-methods.md +55 -0
  433. package/skills/grok-auth/references/wiring.md +71 -0
  434. package/skills/grok-building-games/SKILL.md +213 -0
  435. package/skills/grok-building-games/agentsam.skill.json +25 -0
  436. package/skills/grok-building-games/references/3d-libs.md +64 -0
  437. package/skills/grok-building-games/references/ai-pathfinding.md +122 -0
  438. package/skills/grok-building-games/references/audio.md +129 -0
  439. package/skills/grok-building-games/references/babylon.md +202 -0
  440. package/skills/grok-building-games/references/collision-physics.md +122 -0
  441. package/skills/grok-building-games/references/ecs-architecture.md +111 -0
  442. package/skills/grok-building-games/references/game-feel-juice.md +110 -0
  443. package/skills/grok-building-games/references/genres/board-card-chess.md +89 -0
  444. package/skills/grok-building-games/references/genres/endless-runner.md +83 -0
  445. package/skills/grok-building-games/references/genres/fps.md +105 -0
  446. package/skills/grok-building-games/references/genres/platformer-2d.md +97 -0
  447. package/skills/grok-building-games/references/genres/puzzle-match3-tetris.md +131 -0
  448. package/skills/grok-building-games/references/genres/racing-kart.md +106 -0
  449. package/skills/grok-building-games/references/genres/topdown-twin-stick.md +97 -0
  450. package/skills/grok-building-games/references/genres/tower-defense.md +84 -0
  451. package/skills/grok-building-games/references/genres/voxel-minecraft.md +89 -0
  452. package/skills/grok-building-games/references/input.md +139 -0
  453. package/skills/grok-building-games/references/phaser.md +277 -0
  454. package/skills/grok-building-games/references/procedural-generation.md +141 -0
  455. package/skills/grok-building-games/references/save-persistence.md +108 -0
  456. package/skills/grok-building-games/references/threejs-foundational.md +148 -0
  457. package/skills/grok-controls/SKILL.md +274 -0
  458. package/skills/grok-controls/agentsam.skill.json +25 -0
  459. package/skills/grok-design-ui/SKILL.md +122 -0
  460. package/skills/grok-design-ui/agentsam.skill.json +25 -0
  461. package/skills/grok-design-ui/references/animations.md +379 -0
  462. package/skills/grok-design-ui/references/performance.md +88 -0
  463. package/skills/grok-design-ui/references/refined-ui.md +384 -0
  464. package/skills/grok-design-ui/references/surfaces.md +247 -0
  465. package/skills/grok-design-ui/references/typography.md +123 -0
  466. package/skills/grok-game-animation-frames/SKILL.md +84 -0
  467. package/skills/grok-game-animation-frames/agentsam.skill.json +25 -0
  468. package/skills/grok-game-asset-core/SKILL.md +69 -0
  469. package/skills/grok-game-asset-core/agentsam.skill.json +25 -0
  470. package/skills/grok-game-character-consistency/SKILL.md +69 -0
  471. package/skills/grok-game-character-consistency/agentsam.skill.json +25 -0
  472. package/skills/grok-game-tilesets/SKILL.md +65 -0
  473. package/skills/grok-game-tilesets/agentsam.skill.json +25 -0
  474. package/skills/grok-game-ui-icons/SKILL.md +56 -0
  475. package/skills/grok-game-ui-icons/agentsam.skill.json +25 -0
  476. package/skills/grok-generate2dmap/LICENSE +21 -0
  477. package/skills/grok-generate2dmap/SKILL.md +120 -0
  478. package/skills/grok-generate2dmap/SOURCE.md +6 -0
  479. package/skills/grok-generate2dmap/agentsam.skill.json +25 -0
  480. package/skills/grok-generate2dmap/references/deliverables.md +101 -0
  481. package/skills/grok-generate2dmap/references/layered-map-contract.md +209 -0
  482. package/skills/grok-generate2dmap/references/map-strategies.md +341 -0
  483. package/skills/grok-generate2dmap/references/object-production-gate.md +24 -0
  484. package/skills/grok-generate2dmap/references/pipeline.md +149 -0
  485. package/skills/grok-generate2dmap/references/prop-pack-contract.md +174 -0
  486. package/skills/grok-generate2dmap/references/side-scroll-stages.md +29 -0
  487. package/skills/grok-generate2dmap/scripts/compose_layered_preview.py +157 -0
  488. package/skills/grok-generate2dmap/scripts/extract_prop_pack.py +369 -0
  489. package/skills/grok-generate2dsprite/LICENSE +21 -0
  490. package/skills/grok-generate2dsprite/SKILL.md +313 -0
  491. package/skills/grok-generate2dsprite/SOURCE.md +6 -0
  492. package/skills/grok-generate2dsprite/agentsam.skill.json +25 -0
  493. package/skills/grok-generate2dsprite/references/modes.md +124 -0
  494. package/skills/grok-generate2dsprite/references/prompt-rules.md +315 -0
  495. package/skills/grok-generate2dsprite/scripts/generate2dsprite.py +1031 -0
  496. package/skills/grok-generate2dsprite/scripts/make_layout_guide.py +109 -0
  497. package/skills/grok-imagine/SKILL.md +201 -0
  498. package/skills/grok-imagine/agentsam.skill.json +25 -0
  499. package/skills/grok-multiplayer-p2p/SKILL.md +111 -0
  500. package/skills/grok-multiplayer-p2p/agentsam.skill.json +25 -0
  501. package/skills/grok-multiplayer-p2p/references/react-binding.md +144 -0
  502. package/skills/grok-multiplayer-p2p/references/signaling-relay.md +269 -0
  503. package/skills/grok-neon/SKILL.md +157 -0
  504. package/skills/grok-neon/agentsam.skill.json +25 -0
  505. package/skills/grok-og/SKILL.md +102 -0
  506. package/skills/grok-og/agentsam.skill.json +25 -0
  507. package/skills/grok-og/references/brand-pass.md +53 -0
  508. package/skills/grok-og/references/custom-card.md +107 -0
  509. package/skills/grok-og/references/favicon-and-icons.md +48 -0
  510. package/skills/grok-og/references/og-type-contract.md +18 -0
  511. package/skills/grok-og/references/placeholder-card.md +21 -0
  512. package/skills/grok-og/references/x-banner.md +41 -0
  513. package/skills/grok-threejs/SKILL.md +67 -0
  514. package/skills/grok-threejs/agentsam.skill.json +25 -0
  515. package/skills/grok-threejs/references/llms-full.txt +2780 -0
  516. package/skills/grok-video2dsprite/LICENSE +21 -0
  517. package/skills/grok-video2dsprite/SKILL.md +236 -0
  518. package/skills/grok-video2dsprite/SOURCE.md +6 -0
  519. package/skills/grok-video2dsprite/agentsam.skill.json +25 -0
  520. package/skills/grok-video2dsprite/references/pipeline.md +90 -0
  521. package/skills/grok-video2dsprite/references/prompt-rules.md +63 -0
  522. package/skills/grok-video2dsprite/scripts/video2dsprite.py +490 -0
  523. package/skills/grok-xai-api/SKILL.md +152 -0
  524. package/skills/grok-xai-api/agentsam.skill.json +25 -0
  525. package/src/attachments/index.js +6 -0
  526. package/src/attachments/intake.js +235 -0
  527. package/src/capabilities/repository-snapshot.js +19 -2
  528. package/src/cli/command-catalog.js +53 -3
  529. package/src/cli/dispatch.js +1 -0
  530. package/src/cli.js +192 -26
  531. package/src/cloudflare/runtime-status.js +2 -1
  532. package/src/commands/account-auth.js +94 -8
  533. package/src/commands/app.js +307 -3
  534. package/src/commands/autorag.js +67 -13
  535. package/src/commands/billing.js +127 -0
  536. package/src/commands/brand.js +74 -60
  537. package/src/commands/cheat-sheet.js +179 -0
  538. package/src/commands/cloudflare-login.js +222 -0
  539. package/src/commands/cloudflare.js +453 -23
  540. package/src/commands/codebaseindex.js +51 -3
  541. package/src/commands/compute.js +4 -0
  542. package/src/commands/connections.js +11 -5
  543. package/src/commands/credentials.js +116 -0
  544. package/src/commands/gcloud-auth.js +427 -0
  545. package/src/commands/google-cloud.js +375 -0
  546. package/src/commands/identity-init.js +2 -2
  547. package/src/commands/knowledge.js +59 -2
  548. package/src/commands/machine-binary.js +103 -0
  549. package/src/commands/machine.js +137 -0
  550. package/src/commands/mcp.js +226 -33
  551. package/src/commands/ollama.js +3 -2
  552. package/src/commands/plugins.js +7 -2
  553. package/src/commands/product.js +36 -0
  554. package/src/commands/runtime-status.js +28 -9
  555. package/src/commands/runtime.js +313 -0
  556. package/src/commands/rust.js +24 -0
  557. package/src/commands/security.js +67 -4
  558. package/src/commands/setup.js +296 -0
  559. package/src/commands/shell.js +16 -3
  560. package/src/commands/start-local.js +2 -2
  561. package/src/commands/status.js +8 -1
  562. package/src/commands/terminal.js +171 -0
  563. package/src/commands/update.js +140 -0
  564. package/src/commands/whoami.js +329 -65
  565. package/src/features/resolve.js +2 -0
  566. package/src/index.js +4 -0
  567. package/src/indexing/ingest/inventory.js +254 -19
  568. package/src/indexing/ingest/materials.js +3 -9
  569. package/src/indexing/ingest/style-evidence.js +181 -0
  570. package/src/knowledge/engine.js +21 -2
  571. package/src/knowledge/runtime-discovery.js +127 -0
  572. package/src/knowledge/source.js +3 -3
  573. package/src/lib/account-session.js +11 -4
  574. package/src/lib/app-authority.js +172 -0
  575. package/src/lib/auth.js +94 -21
  576. package/src/lib/core-client.js +5 -6
  577. package/src/lib/credentials-audit.js +451 -0
  578. package/src/lib/deploy/health.js +24 -6
  579. package/src/lib/detect-context.js +7 -1
  580. package/src/lib/google-cloud-connection.js +270 -0
  581. package/src/lib/google-cloud-inventory.js +385 -0
  582. package/src/lib/google-desktop-oauth.js +372 -0
  583. package/src/lib/google-studio-brokered-oauth.js +158 -0
  584. package/src/lib/identity-scaffold.js +76 -18
  585. package/src/lib/init-options.js +192 -0
  586. package/src/lib/local-scaffold.js +48 -16
  587. package/src/lib/provider-command-remediation.js +308 -0
  588. package/src/lib/provider-credentials.js +8 -0
  589. package/src/lib/scaffold/index.js +8 -2
  590. package/src/lib/scaffold/mcp-server.js +43 -0
  591. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  592. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  593. package/src/lib/scaffold/wizards/cms.js +93 -0
  594. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  595. package/src/lib/setup/contract.js +26 -0
  596. package/src/lib/setup/discover.js +116 -0
  597. package/src/lib/setup/execute.js +205 -0
  598. package/src/lib/setup/planner.js +134 -0
  599. package/src/lib/setup/recipes.js +235 -0
  600. package/src/lib/setup/runtime-persist.js +197 -0
  601. package/src/lib/setup/runtime.js +394 -0
  602. package/src/lib/slash-commands.js +2 -0
  603. package/src/lib/terminal/machine-identity.js +95 -0
  604. package/src/lib/terminal-local.js +164 -0
  605. package/src/lib/terminal-scopes.js +52 -0
  606. package/src/lib/whoami-capabilities.js +184 -0
  607. package/src/local-pty/server.js +34 -5
  608. package/src/mcp/authority.js +58 -108
  609. package/src/mcp/client-adapters.js +68 -144
  610. package/src/mcp/client.js +142 -122
  611. package/src/mcp/cloudflare-bundles.js +225 -0
  612. package/src/mcp/index.js +12 -0
  613. package/src/models/discovery.js +40 -22
  614. package/src/models/inventory-core.d.ts +105 -0
  615. package/src/models/inventory-core.js +54 -6
  616. package/src/plugins/cloudflare.js +1 -1
  617. package/src/providers/ollama-chat.js +2 -1
  618. package/src/sam/types.js +27 -2
  619. package/src/security/inventory.js +12 -2
  620. package/src/security/local-vault.js +2 -0
  621. package/src/security/logs.js +3 -0
  622. package/src/security/scan.js +1 -1
  623. package/src/ui/cli/help.js +41 -0
  624. package/test/account-session.test.mjs +3 -3
  625. package/test/app-authority-context.test.mjs +32 -0
  626. package/test/apps-scaffold-contract.test.mjs +3 -2
  627. package/test/cli/api-key-env-whoami.test.mjs +2 -2
  628. package/test/cli/catalog-authority.test.mjs +64 -0
  629. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  630. package/test/cli/machine-command.test.mjs +34 -0
  631. package/test/cli/mcp-client.test.mjs +21 -10
  632. package/test/cli/runtime-persist.test.mjs +56 -0
  633. package/test/cli/rust-command.test.mjs +21 -0
  634. package/test/credentials-audit.test.mjs +113 -0
  635. package/test/deploy-health-scan.test.mjs +29 -1
  636. package/test/fixtures/project-authority/customer-app/.agentsam/app.json +5 -0
  637. package/test/fixtures/project-authority/customer-app/apps/my-product/index.ts +1 -0
  638. package/test/fixtures/project-authority/customer-app/wrangler.toml +17 -0
  639. package/test/gcloud-auth.test.mjs +111 -0
  640. package/test/google-cloud-connection.test.mjs +83 -0
  641. package/test/google-cloud-inventory.test.mjs +64 -0
  642. package/test/init-options.test.mjs +35 -0
  643. package/test/integration/app-command.test.mjs +30 -0
  644. package/test/integration/autorag-project-authority.integration.test.mjs +51 -0
  645. package/test/integration/autorag-runtime-discovery.test.mjs +107 -0
  646. package/test/integration/cad-project.test.mjs +4 -1
  647. package/test/integration/cms-app-scaffold.test.mjs +77 -0
  648. package/test/integration/cms-site-tenancy-contract.test.mjs +31 -19
  649. package/test/integration/codebaseindex-ingest.test.mjs +89 -0
  650. package/test/integration/database-hosted-honesty.test.mjs +49 -0
  651. package/test/integration/desktop-keychain-boundary.test.mjs +45 -0
  652. package/test/integration/features-resolve.test.mjs +30 -11
  653. package/test/integration/hosted-work-host-authority.test.mjs +47 -0
  654. package/test/integration/inspect-path-cli.test.mjs +46 -0
  655. package/test/integration/inventory-eligibility.test.mjs +59 -0
  656. package/test/integration/inventory-evidence.test.mjs +125 -0
  657. package/test/integration/local-provider-bridge.test.mjs +65 -0
  658. package/test/integration/local-studio-settings-production.test.mjs +40 -0
  659. package/test/integration/lockfile-sync.test.mjs +26 -0
  660. package/test/integration/provider-env-cli.test.mjs +13 -3
  661. package/test/integration/runtime-status.integration.test.mjs +17 -1
  662. package/test/integration/theme-package-registry.test.mjs +31 -0
  663. package/test/knowledge.test.mjs +35 -1
  664. package/test/loopback-oauth.test.mjs +53 -0
  665. package/test/ollama.test.mjs +22 -0
  666. package/test/repository-snapshot-view.test.mjs +2 -2
  667. package/test/security.test.mjs +37 -0
  668. package/test/setup-planner.test.mjs +74 -0
  669. package/test/setup-runtime.test.mjs +51 -0
  670. package/test/terminal/local-pty.mock.test.mjs +3 -1
  671. package/test/terminal-machine-identity.test.mjs +88 -0
  672. package/test/whoami-resume.test.mjs +27 -6
  673. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  674. package/packages/agentsam-nav/dist/Nav.d.ts +0 -43
  675. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +0 -10
  676. package/packages/agentsam-nav/dist/NavContent.d.ts +0 -2
  677. package/packages/agentsam-nav/dist/NavFooter.d.ts +0 -2
  678. package/packages/agentsam-nav/dist/NavGroup.d.ts +0 -3
  679. package/packages/agentsam-nav/dist/NavHeader.d.ts +0 -2
  680. package/packages/agentsam-nav/dist/NavMenu.d.ts +0 -22
  681. package/packages/agentsam-nav/dist/NavProvider.d.ts +0 -35
  682. package/packages/agentsam-nav/dist/NavTrigger.d.ts +0 -2
  683. package/packages/agentsam-nav/dist/Surfaces.d.ts +0 -41
  684. package/packages/agentsam-nav/dist/browser.d.ts +0 -11
  685. package/packages/agentsam-nav/dist/browser.global.js +0 -132
  686. package/packages/agentsam-nav/dist/browser.js +0 -613
  687. package/packages/agentsam-nav/dist/contracts.d.ts +0 -76
  688. package/packages/agentsam-nav/dist/index.d.ts +0 -11
  689. package/packages/agentsam-nav/dist/index.js +0 -614
  690. package/packages/agentsam-nav/dist/legacy.css +0 -83
  691. package/packages/agentsam-nav/dist/shell.css +0 -113
  692. package/packages/agentsam-nav/dist/theme.css +0 -113
  693. package/packages/agentsam-nav/dist/utils.d.ts +0 -1
  694. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +0 -670
  695. package/packages/work-graph/prototype/README.md +0 -32
  696. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  697. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  698. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  699. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,111 @@
1
+ # ECS & Game State Architecture for JS Games (bitECS, miniplex, ECS vs OOP, state structure)
2
+
3
+ Consolidated from webgamedev.com, the bitECS and miniplex docs, and data-oriented-design canon (see Sources). Focus: how an AI builder should **structure game state so it stays fast and untangled** as a game grows — and when *not* to reach for ECS.
4
+
5
+ ---
6
+
7
+ ## 1. What ECS is (and why it exists)
8
+
9
+ **Entity-Component-System** separates data from behavior:
10
+ - **Entity** — an ID (or a plain object) with no logic; just a thing that exists.
11
+ - **Component** — pure **data**, no methods (Position, Velocity, Health, Sprite, Collider).
12
+ - **System** — pure **behavior** that iterates all entities having a given set of components and updates them (MovementSystem reads Position+Velocity).
13
+
14
+ Benefits: **composition over inheritance** (add/remove capabilities by adding/removing components — no deep class hierarchies), cache-friendly iteration, easy serialization (state = plain data), and clean separation that scales to thousands of entities.
15
+
16
+ The classic problem ECS solves: the "deadly diamond" of OOP inheritance (`FlyingEnemy` vs `SwimmingEnemy` vs `FlyingSwimmingShootingEnemy`...). With ECS you just attach `Flying`, `Swimming`, `Shooting` components in any combination.
17
+
18
+ ---
19
+
20
+ ## 2. When ECS vs OOP (don't cargo-cult ECS)
21
+
22
+ **Use plain OOP / a simple object list when:**
23
+ - Small games, jams, prototypes, or a handful of distinct entity types.
24
+ - Entity count is low (dozens–low hundreds) and perf isn't a concern.
25
+ - The team/model iterates faster with intuitive `player.jump()` classes.
26
+ - The engine already gives you a good model (Phaser GameObjects/prefabs, Three.js `Object3D` scene graph) — you can go a long way with a component-ish mixin approach without a full ECS.
27
+
28
+ **Reach for ECS when:**
29
+ - **Many similar entities** (bullet-hell, RTS, particles, simulations, .io games) — thousands of entities needing fast batch updates.
30
+ - Highly **combinatorial** entity capabilities (lots of mix-and-match behaviors/status effects).
31
+ - You need **determinism/serialization** (netcode, replays, save states) — pure-data components serialize trivially.
32
+
33
+ **Rule:** ECS is an optimization/organization tool, not a moral requirement. A giant `update()` switch or a tidy class hierarchy is fine for small games. Adopt ECS when entity count/combinatorial complexity actually bites — premature ECS adds boilerplate for no gain.
34
+
35
+ ---
36
+
37
+ ## 3. Library choice: bitECS vs miniplex
38
+
39
+ **miniplex** — DX-first, entities are **plain JS objects**, components are just properties. Best default for most indie/web games and rapid prototyping; excellent TypeScript + React bindings.
40
+ ```js
41
+ import { World } from 'miniplex';
42
+ const world = new World();
43
+ const player = world.add({ position:{x:0,y:0}, velocity:{x:100,y:0}, health:{cur:100,max:100} });
44
+ const moving = world.with('position','velocity'); // live archetype query
45
+ function movementSystem(dt){ for (const e of moving){ e.position.x += e.velocity.x*dt; e.position.y += e.velocity.y*dt; } }
46
+ world.remove(player);
47
+ ```
48
+ - Use `world.addComponent(e,'velocity',{...})` / `removeComponent` so queries re-index (mutating a bare property can skip re-indexing).
49
+ - `for...of` over a query is fast and **safe for removal during iteration**. No built-in scheduler — you call systems from your loop.
50
+ - Object property access is slightly slower at extreme entity counts than bitECS's typed arrays.
51
+
52
+ **bitECS** — performance-first, data-oriented: entities are **integer IDs**, components are **Structure-of-Arrays (typed arrays)**, archetype/bitmask queries. Best for tens of thousands of entities, WebGPU, perf-critical sims. ~5kb, zero deps (used in Hubs/Third Room; eyed by Phaser 4).
53
+ ```js
54
+ import { createWorld, addEntity, addComponent, query } from 'bitecs';
55
+ const world = createWorld({ Position:{x:new Float32Array(1e4),y:new Float32Array(1e4)}, Velocity:{x:[],y:[]} });
56
+ const { Position, Velocity } = world.components;
57
+ const eid = addEntity(world); addComponent(world,eid,Position); addComponent(world,eid,Velocity);
58
+ const moving = query(world,[Position,Velocity]);
59
+ for (const e of moving){ Position.x[e] += Velocity.x[e]*dt; Position.y[e] += Velocity.y[e]*dt; }
60
+ ```
61
+ - **Note the API moved on:** older tutorials use `defineComponent`/`defineQuery`/`Types`; current bitECS (0.4+) uses `createWorld({...schemas})` + `query(world,[...])`, plus relationships/observers/prefabs. Verify the version you install.
62
+ - SoA layout = cache-friendly; entities-as-IDs = trivial to serialize/network.
63
+
64
+ **Others:** Becsy (multithreaded), Koota, or the engine's own model. Some projects mix (bitECS core sim + object layer for UI).
65
+
66
+ ---
67
+
68
+ ## 4. Structuring game state (even without a formal ECS)
69
+
70
+ - **Single source of truth:** keep a central, serializable game-state object (or ECS world). Avoid scattering authoritative data across DOM, closures, and random globals — it makes save/load, undo, and netcode nearly impossible.
71
+ - **Separate data from rendering:** gameplay state (positions, health) should be independent of the visual objects (meshes/sprites). Systems update data; a render/sync step pushes data → Three.js/Phaser objects each frame. This keeps the sim testable/deterministic and lets you do fixed-timestep + interpolation.
72
+ - **Systems run in a defined order each tick:** input → AI → movement → collision → damage → cleanup → render-sync. Order matters and should be explicit, not incidental.
73
+ - **Object pooling instead of create/destroy churn:** for bullets/enemies/particles, recycle entities (mark inactive) rather than allocating/GCing every frame (pairs with ECS well; see `threejs-foundational.md`).
74
+ - **Deferred structural changes:** don't add/remove entities in the middle of iterating a query in ways the lib doesn't support — queue spawns/despawns and apply between systems (miniplex `for...of` is removal-safe; still queue mass changes for clarity).
75
+ - **Fixed timestep for the sim** (see game-loop/collision skills) so ECS systems are deterministic — required for netcode/replays.
76
+ - **Events/messaging** between systems via a small event queue rather than direct cross-system calls, to keep systems decoupled.
77
+
78
+ ---
79
+
80
+ ## 5. Bug-prevention checklist
81
+ - **Putting logic in components / data in systems** → defeats ECS; keep components pure data, systems pure behavior.
82
+ - **Adopting ECS for a tiny game** → boilerplate with no benefit; use a simple object list/classes until entity count/complexity warrants it.
83
+ - **Deep inheritance for entity variety** → combinatorial class explosion; compose with components instead.
84
+ - **Mutating a miniplex property directly and expecting query updates** → use `addComponent`/`removeComponent` so archetypes re-index.
85
+ - **Using stale bitECS `defineComponent` tutorials against a new version** → API mismatch; check installed version's docs.
86
+ - **Mixing render objects into authoritative state** → non-serializable, non-deterministic; separate sim data from view.
87
+ - **Undefined system order** → order-dependent bugs (moving before collision, etc.); define an explicit pipeline.
88
+ - **create/destroy per frame** → GC stalls; pool entities.
89
+ - **Structural changes mid-iteration** → skipped/duplicated updates; defer to a queue.
90
+ - **Scattered global state** → save/load and netcode become impossible; centralize the world.
91
+
92
+ ---
93
+
94
+ ## Defaults to apply
95
+ - **Default to miniplex** for generated games that need ECS (plain objects, great TS/React DX); **switch to bitECS** only when the game genuinely has thousands of entities or needs SoA perf. For small/simple games, a plain object list or engine prefabs is fine — don't force ECS.
96
+ - **Always structure state as a single serializable world with sim/render separation** and an **explicit system pipeline** (input→AI→movement→collision→damage→cleanup→render-sync) run on a fixed timestep. This unlocks save/load, replays, and netcode for free.
97
+ - **Bake in pooling + deferred spawn/despawn** for entity-heavy genres.
98
+ - When generating ECS code, **verify the library version's current API** (bitECS especially changed) rather than emitting old `defineComponent` patterns from memory.
99
+
100
+ ---
101
+
102
+ ## Sources
103
+ - Web Game Dev — Code architecture / ECS overview: https://www.webgamedev.com/code-architecture/ecs
104
+ - bitECS — repo & docs: https://github.com/NateTheGreatt/bitECS , https://bitecs.dev/docs/introduction
105
+ - miniplex — repo & docs: https://github.com/hmans/miniplex , miniplex-react: https://github.com/hmans/miniplex/tree/main/packages/miniplex-react
106
+ - Becsy (multithreaded ECS): https://lastolivegames.github.io/becsy/
107
+ - Sander Mertens — "Entity Component System FAQ": https://github.com/SanderMertens/ecs-faq
108
+ - Adam Martin — "Entity Systems are the future of MMOG development": http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
109
+ - Mick West — "Evolve Your Hierarchy" (components over inheritance): https://cowboyprogramming.com/2007/01/05/evolve-your-hierarchy/
110
+ - Richard Fabian — Data-Oriented Design (book): https://www.dataorienteddesign.com/dodbook/
111
+ - Game Programming Patterns — Component pattern: https://gameprogrammingpatterns.com/component.html
@@ -0,0 +1,110 @@
1
+ # Game Feel & Juice (screenshake, hitstop, tweening/easing, particles, squash & stretch, camera, SFX layering)
2
+
3
+ The canon: Steve Swink's *Game Feel*, Vlambeer/"Juice it or lose it" (Martin Jonasson & Petri Purho), and Jan Willem Nijman's "The art of screenshake" (see Sources). "Juice" = generous, layered, non-gameplay-affecting feedback that makes every input feel physical and satisfying. Focus: what an AI builder should reflexively add so games feel **alive instead of static**, without hurting readability or perf.
4
+
5
+ ---
6
+
7
+ ## 1. The core principle
8
+
9
+ **Every meaningful action should produce disproportionate, multi-sensory feedback.** A single "hit" should simultaneously trigger several of: sound, particles, screenshake, hitstop, flash, knockback, squash/stretch, and a number/pop. The gameplay math can stay simple — the *feel* comes from the feedback layer stacked on top. The classic demo takes the same identical Breakout and makes it feel amazing purely by adding these layers.
10
+
11
+ **Rule:** Separate "simulation" from "presentation." Feedback (shake, tween, particles, flash) must **never change gameplay outcomes** — it's cosmetic. This keeps physics deterministic (important for netcode/replays) while letting you pile on juice freely.
12
+
13
+ ---
14
+
15
+ ## 2. Screenshake (the highest impact-per-effort effect)
16
+
17
+ - Offset the **camera** (or a camera container), not the world objects. Apply a random offset each frame from a **trauma value** that **decays over time**.
18
+ - **Use trauma², not linear** (Squirrel Eiserloh's "Juicing Your Cameras"): store `trauma` in [0,1], set `shake = trauma * trauma` (or `trauma³`). Add trauma on events (small hit +0.3, explosion +0.8), decay `trauma -= decay * dt` each frame. Squaring makes small hits subtle and big hits explosive.
19
+ - Offset with **noise, not pure random**, for smoother shake: `offsetX = maxOffset * shake * (noise(t) )`; also shake **rotation** slightly (`maxAngle * shake * noise`) — rotational shake reads as more violent.
20
+ - **Directional shake** for directional hits (kick the camera opposite the impact) reads better than omnidirectional for melee/recoil.
21
+ - **Cap it & scale it down for accessibility.** Excessive shake causes motion sickness — expose a "screen shake" slider/toggle. Never shake so hard UI/targets become unreadable.
22
+ - Scale offsets by `dt`-independent amount but decay by `dt` so it's frame-rate independent.
23
+
24
+ Nijman's rules also include: **more bullets, bigger bullets, muzzle flash, impact effects, permanent decals, camera lerp/lookahead, camera kick, sleep/hitstop, gun delay, knockback, screen shake, and even a little randomness in everything.**
25
+
26
+ ---
27
+
28
+ ## 3. Hitstop / hitstun / "sleep" (freeze frames on impact)
29
+
30
+ - On a big hit, **freeze the game (or just the two involved entities) for a few frames** (~30–120ms), then resume. This sells impact enormously — the brain reads the pause as force.
31
+ - Implement as a global **time scale** or a short "freeze frames" counter: while frozen, skip the gameplay update (or set `timeScale=0`) but **keep rendering** and keep the flash/particles visible. Common: freeze ~2–6 frames for normal hits, longer for finishers.
32
+ - Keep hitstop **short**; too long feels laggy/unresponsive. Often paired with a brief hit **flash** (tint the sprite white for 1–2 frames) and knockback that starts *after* the freeze.
33
+ - Distinguish **hitstop** (brief freeze for feel) from **hitstun** (gameplay state where a hit character can't act) — the latter is real gameplay, the former is pure juice.
34
+
35
+ ---
36
+
37
+ ## 4. Tweening & easing (motion that isn't linear)
38
+
39
+ - **Almost nothing should move linearly.** Real, satisfying motion accelerates/decelerates. Use **easing functions** for UI transitions, pickups flying to the HUD, menus, popups, camera moves, damage numbers.
40
+ - Common curves (see easings.net for exact formulas/graphs):
41
+ - **easeOutQuad/Cubic** — arrive gently (great for things settling into place).
42
+ - **easeInQuad/Cubic** — start slow (things launching).
43
+ - **easeOutBack** — slight overshoot then settle (pop-in for UI/pickups — very juicy).
44
+ - **easeOutElastic / easeOutBounce** — springy/bouncy (buttons, coin pickups). Use sparingly.
45
+ - **easeInOutQuad** — smooth both ends (camera, generic).
46
+ - **Use a tween library** rather than hand-rolling: **GSAP** (best-in-class, huge easing set, timelines), **@tweenjs/tween.js** (lightweight, common in Three.js), or the engine's built-in (Phaser `this.tweens.add`). Tweens compose (chains, delays, yoyo, repeat) and auto-handle dt.
47
+ - **Kill/clean up tweens** when the target is destroyed or the scene shuts down (leaked tweens mutating dead objects = crashes/bugs). Phaser: kill on `SHUTDOWN`; GSAP: `.kill()`.
48
+ - A **spring/damped-lerp** (`x += (target - x) * (1 - exp(-k*dt))`) is a great procedural alternative for continuous following (cameras, cursors, UI) — always frame-rate correct if you use the `exp` form rather than `x += (target-x)*0.1` (the naive lerp is frame-rate dependent — see §6).
49
+
50
+ ---
51
+
52
+ ## 5. Particles & squash-and-stretch
53
+
54
+ - **Particles everywhere:** dust on landing/footsteps, sparks on hit, debris on death, trails on projectiles, confetti on win, ambient motes. They cost little and add enormous life. Use the engine's particle system (Phaser `add.particles`, Three.js points/instanced sprites) and **pool** them (no per-emit allocation — see `threejs-foundational.md`).
55
+ - **Squash & stretch** (Disney's foundational animation principle): deform on acceleration to convey weight/speed while preserving apparent volume.
56
+ - Jump: stretch vertically (taller/thinner) on takeoff, squash (shorter/wider) on landing, then spring back via `easeOutBack`/elastic.
57
+ - Preserve volume: if you scale `y` by `s`, scale `x` by ~`1/s`, so it doesn't look like it's growing.
58
+ - Drive it from velocity (stretch along the movement direction) or trigger on discrete events (land, hit, shoot recoil).
59
+ - **Anticipation + follow-through:** wind up before a big action (tiny reverse/squash) and overshoot after — even a couple frames sells it.
60
+ - **Pop numbers & flashes:** floating damage numbers that rise + fade + scale-pop, combo counters, "+10" pickups. Cheap, huge readability + satisfaction win.
61
+
62
+ ---
63
+
64
+ ## 6. Camera feel (lerp, lookahead, deadzone, punch)
65
+
66
+ - **Never hard-snap the camera to the player.** Smoothly follow (`lerp`/spring) toward the target so motion is fluid.
67
+ - **Frame-rate-correct smoothing:** `pos += (target - pos) * (1 - Math.exp(-k * dt))`. The naive `pos += (target - pos) * 0.1` is **frame-rate dependent** (faster on 144Hz than 60Hz) — a common bug; use the exp form or a fixed-timestep camera update.
68
+ - **Lookahead:** offset the camera slightly in the direction of movement / where the player is aiming, so the player sees more of what's ahead. Ease the offset in/out.
69
+ - **Deadzone / soft zone:** don't move the camera until the player leaves a central box — prevents nauseating micro-jitter from small movements.
70
+ - **Camera punch/kick** on impacts (a quick zoom-in or positional kick that eases back) complements screenshake.
71
+ - Clamp the camera to level bounds; round the final camera position to whole pixels for pixel-art games to avoid shimmer.
72
+
73
+ ---
74
+
75
+ ## 7. SFX layering & audio feel
76
+
77
+ - **Layer sounds** for richness: a single "shoot" = a low thump + a mid body + a high click/transient. Impacts = hit + debris + a tail.
78
+ - **Pitch-randomize** repeated sounds (±5–15%) so rapid fire / footsteps don't sound robotic (`playbackRate` / Howler `rate`). Slightly randomize volume too.
79
+ - Sound is feedback: **every** action should have audio, and it should be tight (low latency) and satisfy on first frame of the action (see the audio skill for Web Audio/Howler, mobile unlock, buses).
80
+ - Duck music briefly under big events; add a subtle low-frequency "boom" on explosions.
81
+
82
+ ---
83
+
84
+ ## 8. Don't over-juice (readability & perf guardrails)
85
+ - **Juice must not obscure gameplay.** If shake/flash/particles hide the player, enemies, or projectiles, dial back. Readability > spectacle.
86
+ - **Accessibility:** provide toggles/sliders for screen shake, flashing, and reduced motion (respect `prefers-reduced-motion`). Heavy flashing risks photosensitivity — avoid rapid full-screen strobing.
87
+ - **Perf:** pool particles/tweens, cap concurrent particles, don't allocate in the hit path. Juice is cheap but "thousands of unpooled particles per explosion" is not.
88
+ - Keep hitstop short and prediction-safe in multiplayer (apply juice on the client only; never let it alter the authoritative sim).
89
+
90
+ ---
91
+
92
+ ## Defaults to apply
93
+ - **Auto-juice defaults:** whenever the builder generates a hit/pickup/death/land/win event, reflexively attach the stack: **sound + particles + short hitstop + white flash + screenshake(trauma²) + easeOutBack pop / squash-stretch + floating number.** Same simple gameplay, dramatically better feel — this is the single biggest perceived-quality lever.
94
+ - **Ship a tiny reusable "juice" toolkit** in generated games: a `trauma`-based shake (squared, noise-driven, decaying), a `hitstop(frames)` helper (timeScale/freeze-count), a `flash(sprite)` helper, easing/tween helpers (or GSAP/tween.js), and frame-rate-correct camera follow with lerp + lookahead + deadzone.
95
+ - **Always use the `exp`-based lerp** for cameras/followers so smoothing is frame-rate independent — bake this in to avoid the classic 144Hz-vs-60Hz bug.
96
+ - **Separate presentation from simulation** so juice never affects gameplay/netcode. Provide screenshake/flash/reduced-motion toggles by default for accessibility.
97
+
98
+ ---
99
+
100
+ ## Sources
101
+ - Martin Jonasson & Petri Purho — "Juice it or lose it" (GDC talk): https://www.youtube.com/watch?v=Fy0aCDmgnxg ; companion "Game feel" write-up on grapefrukt.
102
+ - Jan Willem Nijman (Vlambeer) — "The art of screenshake": https://www.youtube.com/watch?v=AJdEqssNZ-U
103
+ - Steve Swink — *Game Feel: A Game Designer's Guide to Virtual Sensation* (book), gamefeelbook.com.
104
+ - Squirrel Eiserloh — "Juicing Your Cameras With Math" (GDC, trauma² screenshake): https://www.youtube.com/watch?v=tu-Qe66AvtY
105
+ - easings.net — easing function reference with formulas & graphs: https://easings.net/
106
+ - Robert Penner's easing equations (origin of the standard easings): http://robertpenner.com/easing/
107
+ - GSAP docs (tweening/easing/timelines): https://gsap.com/docs/v3/ ; tween.js: https://github.com/tweenjs/tween.js
108
+ - Disney's 12 principles of animation (squash & stretch, anticipation, follow-through): https://en.wikipedia.org/wiki/Twelve_basic_principles_of_animation
109
+ - MDN — `prefers-reduced-motion`: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
110
+ - "The Juice Factor" / GDC Vault talks on feedback & game feel.
@@ -0,0 +1,89 @@
1
+ # Genre Playbook — Board & Card Games (Chess, Checkers, Tic-Tac-Toe, Card games)
2
+
3
+ Turn-based logic games where correctness *is* the game: an illegal move or a flaky turn transition breaks trust instantly. The genre is about a clean **turn state machine**, **rigorous legal-move validation**, and (for solo play) a **minimax / alpha-beta AI**. Almost always 2D (Canvas/DOM/Phaser); rendering is trivial, logic is everything. Read `../threejs-foundational.md` for general structure; this file is about game-logic correctness.
4
+
5
+ ---
6
+
7
+ ## 1. Core mechanics (minimal-but-good scope for a demo)
8
+
9
+ 1. **A board/state data model** separate from the view (array of pieces / card lists).
10
+ 2. **A turn state machine** that governs whose turn it is and what's allowed.
11
+ 3. **Legal-move generation + validation** (only legal moves accepted and highlighted).
12
+ 4. **Win/draw/loss detection** (checkmate/stalemate, three-in-a-row, deck empty, etc.).
13
+ 5. **A simple AI opponent** (minimax/alpha-beta for perfect-info games; heuristics for card games).
14
+
15
+ For chess specifically: **do not hand-roll the rules for a demo unless asked — use `chess.js`** for move generation/validation/checkmate and `chessground`/a board lib for the UI. Hand-rolling chess rules (en passant, castling through check, pins, promotion, threefold repetition) is a huge bug surface. Build custom rules only for simpler games (tic-tac-toe, checkers, connect-4) or when explicitly required.
16
+
17
+ ---
18
+
19
+ ## 2. Turn state machine
20
+
21
+ Model the game as an explicit finite state machine — never as ad-hoc booleans scattered across handlers.
22
+
23
+ - **States (typical):** `PlayerTurn (idle → pieceSelected → moveConfirmed)` → `Resolving/Animating` → `CheckWinCondition` → `OpponentTurn` → … → `GameOver`.
24
+ - **One source of truth for `currentPlayer`.** Only accept input during that player's `idle`/`selecting` state; **ignore all input while animating or during the AI's turn** (a top bug: clicking during resolution corrupts state or lets a player move twice).
25
+ - **Strict transitions:** select piece → show legal moves → choose destination → validate → apply move → switch player → check terminal conditions. Each step gated; no shortcuts.
26
+ - **Undo/history:** keep a move stack (and/or full state snapshots) — enables undo, threefold-repetition detection, and replay. Store enough to reverse a move (captured piece, castling/en-passant flags).
27
+ - **Determinism:** the model must be pure and reproducible; the view only reflects it. This makes AI, undo, and (later) networking possible.
28
+
29
+ ---
30
+
31
+ ## 3. Legal-move validation (get this exactly right)
32
+
33
+ - **Generate, then filter.** Produce candidate moves per piece, then remove illegal ones. **Only offer/accept legal moves** — highlight them; reject clicks on illegal squares.
34
+ - **Chess "leaves your king in check" rule (the classic omission):** a move is illegal if, *after* making it, your own king is attacked. Implement by making the move on a copy, checking if your king is attacked, and rejecting if so. This automatically handles pins — don't try to special-case pins.
35
+ - **Special chess rules to not forget:** castling (king & rook unmoved, squares empty, king not in/through/into check), en passant (only immediately after the enemy pawn's two-square move), pawn promotion, and the 50-move / threefold-repetition / stalemate draws. These are exactly why `chess.js` exists.
36
+ - **Terminal detection:** checkmate = in check AND no legal moves; stalemate = not in check AND no legal moves (a draw, not a loss — a very common bug is scoring stalemate as a win). For tic-tac-toe/connect-4, check all lines after each move and also detect a full-board draw.
37
+ - **Card games:** validate legality against the rules (can you play this card now?), keep hidden information hidden (trivial in single-player; true hidden-info enforcement needs a server, which is out of scope on this deploy target), and shuffle with an unbiased algorithm (**Fisher–Yates**, not `sort(() => Math.random()-0.5)` which is biased).
38
+
39
+ ---
40
+
41
+ ## 4. AI: minimax & alpha-beta pruning
42
+
43
+ For **perfect-information, deterministic** games (chess, checkers, tic-tac-toe, connect-4, Othello):
44
+
45
+ - **Minimax:** recursively explore the game tree; the mover **maximizes** their evaluation, the opponent **minimizes** it. At the depth limit (or terminal node), return a heuristic evaluation. Choose the move leading to the best guaranteed outcome.
46
+ - **Alpha-beta pruning:** carry `alpha` (best already guaranteed to the maximizer) and `beta` (best guaranteed to the minimizer); **prune** a branch when `alpha >= beta` (the opponent would never allow it). Same result as minimax, far fewer nodes → much deeper search. Move ordering (try likely-good moves first, e.g. captures) dramatically improves pruning.
47
+ - **Depth = difficulty.** Tic-tac-toe: search to the end (perfect play). Connect-4/checkers: a few plies. Chess: alpha-beta + a material+position evaluation gets a decent club-level bot; go deeper/iterative-deepening for stronger.
48
+ - **Evaluation function (heuristic):** for chess, material values (P=1, N/B=3, R=5, Q=9) + piece-square tables (positional bonuses) + mobility/king safety. Terminal nodes return ±∞ for win/loss, 0 for draw. A good eval matters more than raw depth for feel.
49
+ - **Avoid freezing the UI:** run deeper searches so they don't block the main thread — use a **Web Worker**, iterative deepening with a time budget, or `requestAnimationFrame`-chunked search. A 2-second UI hang while the AI "thinks" feels broken.
50
+ - **Imperfect-info / non-deterministic games** (most card games) need different AI: rules-based heuristics, Monte Carlo (MCTS) with determinization, or expectiminimax. Don't shoehorn plain minimax into a hidden-hand card game.
51
+
52
+ ---
53
+
54
+ ## 5. Common bugs to avoid (checklist)
55
+
56
+ - **Accepting input during animation or the AI's turn** → double moves / corrupted state. Gate all input on the turn state.
57
+ - **Offering illegal moves** → validate + highlight only legal moves; reject the rest.
58
+ - **(Chess) Allowing a move that leaves your own king in check** → test post-move king safety; this also handles pins.
59
+ - **(Chess) Missing en passant / castling-through-check / promotion / draw rules** → use `chess.js` instead of hand-rolling.
60
+ - **Scoring stalemate as a win** → stalemate is a draw; checkmate = in check + no legal moves.
61
+ - **Biased shuffle** (`sort(Math.random)`) → use Fisher–Yates.
62
+ - **State in the DOM/sprites, not a model** → makes AI, undo, and win-checks unreliable; keep a pure model.
63
+ - **AI blocks the main thread** → search in a Web Worker or time-boxed/iterative; keep the UI responsive.
64
+ - **Minimax min/max sign errors** → a classic; test against known positions (mate-in-1, forced draws).
65
+ - **No move history** → can't undo or detect repetition; keep a reversible move stack.
66
+
67
+ ---
68
+
69
+ ## Defaults to apply
70
+
71
+ 1. **For chess, default to `chess.js` (rules/validation/mate) + a board UI lib** rather than hand-rolling. Hand-roll only simple games (tic-tac-toe, connect-4, checkers) or when asked.
72
+ 2. **Model the game as an explicit turn state machine with one `currentPlayer` source of truth; ignore input during animation/AI turns.** Keep a pure model separate from the view + a reversible move history.
73
+ 3. **Only ever present and accept LEGAL moves** (generate → filter → highlight). For chess, reject any move that leaves your own king in check.
74
+ 4. **Detect terminal states correctly** — checkmate vs stalemate (draw!), draws, and full-board ties.
75
+ 5. **AI = minimax + alpha-beta pruning with a heuristic eval; depth = difficulty; run in a Web Worker / time-boxed so the UI never freezes.** Use MCTS/heuristics (not plain minimax) for hidden-info card games; shuffle with Fisher–Yates.
76
+ 6. **Minimal scope:** correct rules + turn FSM + legal-move UI + win/draw detection + one AI opponent. Correctness beats features here.
77
+
78
+ ---
79
+
80
+ ## Sources
81
+ - chess.js — move generation, validation, check/checkmate/draw detection: https://github.com/jhlywa/chess.js
82
+ - chessground — Lichess's board UI: https://github.com/lichess-org/chessground
83
+ - Chess Programming Wiki — Minimax: https://www.chessprogramming.org/Minimax
84
+ - Chess Programming Wiki — Alpha-Beta: https://www.chessprogramming.org/Alpha-Beta
85
+ - Chess Programming Wiki — Evaluation & Piece-Square Tables: https://www.chessprogramming.org/Evaluation and https://www.chessprogramming.org/Piece-Square_Tables
86
+ - Red Blob Games — game trees / minimax intuition and grid tools: https://www.redblobgames.com/
87
+ - Wikipedia — Fisher–Yates shuffle (unbiased): https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
88
+ - Wikipedia — Monte Carlo tree search (imperfect-info/large trees): https://en.wikipedia.org/wiki/Monte_Carlo_tree_search
89
+ - MDN — Web Workers (off-thread AI search): https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API
@@ -0,0 +1,83 @@
1
+ # Genre Playbook — Endless Runner
2
+
3
+ Auto-forward games where the player dodges obstacles and collects pickups at ever-increasing speed (Temple Run, Subway Surfers, Canabalt, Flappy-adjacent, Chrome Dino). Works in 2D (Phaser) or 3D (Three.js). The whole genre rests on **procedural spawning + object pooling + a difficulty ramp**. Read `../threejs-foundational.md` first (delta time, pooling, mobile input).
4
+
5
+ ---
6
+
7
+ ## 1. Core mechanics (minimal-but-good scope for a demo)
8
+
9
+ 1. **Auto-run:** the player moves forward automatically (or the world scrolls toward a fixed player) at a speed that **increases over time**.
10
+ 2. **Simple avoidance input:** jump / slide, or lane-switch left/right (or both).
11
+ 3. **Endless procedural spawning** of obstacles + collectibles as pooled objects.
12
+ 4. **Collision → death** (one hit or a few lives), with **distance/coins as score**.
13
+ 5. **Instant restart** and a persisted high score.
14
+
15
+ One lane setup + jump/slide + one obstacle type + coins + a speed ramp + hi-score is a complete, replayable game. Add power-ups, multiple biomes, and characters later. **The tuning of the speed/difficulty curve is the game.**
16
+
17
+ ---
18
+
19
+ ## 2. The "endless" trick: scroll the world, recycle the pieces
20
+
21
+ - **Keep the player near a fixed position; move the world toward them** (or move the player and follow with the camera — mathematically equivalent). Fixed-player + moving-world is usually simpler for spawning and scoring by distance.
22
+ - **Chunk/segment spawning:** build the track from prefab segments (ground tiles, obstacle patterns). Spawn a new segment ahead when the last one enters view; **despawn/recycle** segments once they pass behind the player/camera.
23
+ - **Object pooling is mandatory.** Runners spawn thousands of obstacles/coins over a run — preallocate pools and recycle (`active/visible=false` in Phaser, or a free-list). Never create/destroy per spawn (GC stutter kills the feel).
24
+ - **Parallax background** (2D): multiple layers scrolling at different speeds for depth; use `tileSprite`/texture offset scrolling rather than spawning background sprites.
25
+ - **Seamless ground:** loop a tiling ground texture by scrolling UV/tilePosition, or ping-pong two ground pieces, so there's no visible seam.
26
+
27
+ ---
28
+
29
+ ## 3. Controls & feel
30
+
31
+ - **Jump:** use platformer forgiveness where relevant — **jump buffering** (register a press slightly before landing) and a short **coyote window** make it feel fair. Variable jump height optional. Clamp fall speed.
32
+ - **Slide/duck:** a timed crouch that shrinks the hitbox; must end even if the key is held-then-released oddly (timer-driven, not just key-held).
33
+ - **Lane switch (3D runners):** discrete lanes; **tween** the player smoothly between lane X positions rather than teleporting, and lock input during the transition or allow queueing. Support swipe (mobile) + arrows/A-D (desktop).
34
+ - **One-button variants (Flappy/Canabalt):** tap = flap/jump; keep the single input crisp and buffered.
35
+ - **Coyote/buffer + snappy, immediate response** — runners punish input lag hard because timing is everything.
36
+ - **Fairness rule:** never spawn an **impossible/unavoidable** obstacle combination for the current speed. Constrain the spawner so the player always has a reachable gap/lane (see §5).
37
+
38
+ ---
39
+
40
+ ## 4. Difficulty & scoring
41
+
42
+ - **Speed ramps up with distance/time** (linear or gently curved), which naturally raises difficulty. Tie obstacle density and pattern complexity to the same progression.
43
+ - **Cap the max speed** or the game becomes unplayable / physics/collision get unstable — and above some speed the player literally can't react.
44
+ - **Reaction-time budget:** obstacles must appear far enough ahead that the player has time to react at the current speed (spawn distance should scale with speed). This is the core fairness constraint.
45
+ - **Score = distance** (+ coins). Persist the high score in `localStorage`. Show near-misses / combos for extra juice.
46
+ - **Pickups:** coins in patterns (arcs, lines) that sometimes lure the player into risk; occasional power-ups (magnet, shield, jetpack) on a timer.
47
+
48
+ ---
49
+
50
+ ## 5. Common bugs to avoid (checklist)
51
+
52
+ - **Creating/destroying objects per spawn** → GC hitches; use pools and recycle off-screen objects.
53
+ - **Impossible obstacle combos** → spawner must always leave a reachable gap/lane for the current speed; validate patterns.
54
+ - **Obstacles appear too late to dodge** → spawn distance / reaction budget must scale with speed.
55
+ - **Unbounded speed** → cap max speed; otherwise collision tunneling and unfair, unplayable pace.
56
+ - **Collision tunneling at high speed** → swept/segment collision or sub-stepping, not per-frame overlap only.
57
+ - **Visible seams in ground/background** → scroll UV/tilePosition or ping-pong two pieces; don't spawn gap-prone tiles.
58
+ - **Objects never despawn** → recycle everything behind the camera; otherwise memory/entity count grows until it crashes.
59
+ - **Movement/scroll not delta-scaled** → speed differs per frame rate.
60
+ - **Slide/jump state gets stuck** → drive crouch/jump with timers and reset on death/restart.
61
+ - **No fair restart** → reset speed, pools, score, and player state fully on restart (leftover pooled objects reappearing is a classic bug).
62
+
63
+ ---
64
+
65
+ ## Defaults to apply
66
+
67
+ 1. **Fixed player + scrolling/recycled world built from pooled prefab segments** is the canonical, bug-resistant structure. Pool obstacles, coins, and segments; recycle behind the camera.
68
+ 2. **Difficulty = increasing speed tied to distance, with a hard speed cap.** Scale obstacle spawn distance to the current speed so there's always time to react.
69
+ 3. **Never spawn unavoidable obstacles** — the spawner must guarantee a reachable gap/lane for the current speed.
70
+ 4. **Snappy input with jump buffering + coyote time**; tween lane switches smoothly; support swipe + keyboard.
71
+ 5. **Score by distance + coins, persisted in localStorage; instant full-reset restart.**
72
+ 6. **Use swept collision + a speed cap** to avoid high-speed tunneling. Add parallax + seamless scrolling ground for polish.
73
+
74
+ ---
75
+
76
+ ## Sources
77
+ - MDN — 2D collision detection & game techniques: https://developer.mozilla.org/en-US/docs/Games/Techniques
78
+ - Phaser — Groups / object pooling (recycle sprites): https://docs.phaser.io/phaser/concepts/gameobjects/group
79
+ - Phaser — TileSprite (scrolling ground/parallax): https://docs.phaser.io/api-documentation/class/gameobjects-tilesprite
80
+ - GMTK / general platformer feel (jump buffering, coyote time apply to runners too): https://gmtk.itch.io/platformer-toolkit
81
+ - "How Canabalt / procedural runner level generation works" (chunk-based spawning): https://www.gamedeveloper.com/design/the-power-of-procedural-generation-in-canabalt
82
+ - Chrome Dino (T-Rex Runner) open-source reference: https://github.com/wayou/t-rex-runner
83
+ - Gaffer On Games — Fix Your Timestep (high-speed collision stability): https://gafferongames.com/post/fix_your_timestep/
@@ -0,0 +1,105 @@
1
+ # Genre Playbook — First-Person Shooter (FPS)
2
+
3
+ How to build a browser FPS that *feels* right (fast, snappy, weighty) and avoids the classic bugs. Assumes Three.js/Babylon.js. Read `../threejs-foundational.md` first — this file only adds FPS-specific rules (it already covers pointer lock + WASD basics, delta time, disposal, draw calls).
4
+
5
+ ---
6
+
7
+ ## 1. Core mechanics (minimal-but-good scope for a demo)
8
+
9
+ A convincing FPS demo needs, in priority order:
10
+ 1. **Mouse-look + WASD movement** with pointer lock (yaw/pitch, clamped pitch).
11
+ 2. **One weapon that shoots** with a crosshair, muzzle flash, and hit feedback.
12
+ 3. **Something to shoot** — 3–8 targets or simple enemies with a hit reaction + death.
13
+ 4. **A hit indicator + score/ammo HUD.** Feedback is the game.
14
+ 5. **A bounded arena** with walls/cover and collision so you can't walk through geometry.
15
+
16
+ Do NOT try to ship AI pathfinding, multiple weapons with full inventory UI, reload animations, or netcode in a first demo. A single hitscan weapon + stationary/patrolling targets + juice (screen shake, flash, sound) reads as a real game.
17
+
18
+ ---
19
+
20
+ ## 2. Controls & camera
21
+
22
+ - **Pointer Lock** is mandatory (see MDN below). Request it from a **user gesture** (`canvas.addEventListener('click', () => canvas.requestPointerLock())`), show a "Click to play" blocker, and re-show it on `pointerlockchange` when `document.pointerLockElement === null`. Prefer `requestPointerLock({ unadjustedMovement: true })` to disable OS mouse acceleration for consistent aim; **fall back gracefully** if the returned Promise rejects with `NotSupportedError`.
23
+ - **Read `movementX`/`movementY` on `mousemove`, not `clientX/Y`.** While locked, `clientX/Y` are frozen; only the deltas update. `yaw -= movementX * sensitivity; pitch -= movementY * sensitivity`.
24
+ - **Clamp pitch to just under ±90°** (`±89°`, i.e. `Math.PI/2 - 0.01`) so the camera never flips/gimbal-locks looking straight up/down.
25
+ - **Yaw the body (a container), pitch the camera.** Standard rig: a yaw `Object3D` holding the camera; apply yaw to the container, pitch to the camera. Movement (`moveForward/moveRight`) uses body yaw only — never pitch — so looking up doesn't make you fly.
26
+ - **Sensitivity + optional ADS zoom:** store a base sensitivity; when aiming-down-sights, lower FOV *and* scale sensitivity down proportionally so aim feels consistent.
27
+ - **Add ESC-to-unlock** and pause. Only re-attach the `mousemove` handler while locked; detach on unlock so a paused game doesn't rotate.
28
+ - **Movement feel:** acceleration + friction (not instant velocity), add sprint (Shift), crouch, and subtle **head-bob** driven by a sin wave of distance traveled (disable when idle). Optional: coyote-style step-up for small ledges. Air control should be reduced vs ground.
29
+ - **FOV:** 75–90° vertical feels good for FPS; too low feels claustrophobic, too high distorts. Let the player adjust.
30
+
31
+ ---
32
+
33
+ ## 3. Weapon handling & the viewmodel
34
+
35
+ ### ⚠️ Do NOT use a generated PHOTO as the weapon viewmodel.
36
+ The single most common failure mode: the builder generates an **opaque JPG/PNG photo of a gun** and slaps it as a flat sprite/plane in the bottom-right of a 3D scene. It looks *wrong* — no parallax, wrong perspective, a hard rectangular edge, lighting that doesn't match the world, and it z-fights or clips into walls. **The world is 3D; the gun must be 3D too.**
37
+
38
+ **Instead:**
39
+ - **Build the viewmodel from 3D geometry/code** — a few boxes/cylinders (`BoxGeometry`, `CylinderGeometry`) assembled into a low-poly gun, or a proper **glTF/GLB model** (right-handed, Y-up; verify +Z-forward orientation). Even a crude boxy gun made of primitives reads far better than a photo because it has real perspective and lighting.
40
+ - **Parent the viewmodel to the camera** (add it as a child of the camera, offset to e.g. `(0.3, -0.3, -0.6)`) so it tracks the view. Because the camera's local forward is **−Z**, the gun sits at negative Z in front of the camera.
41
+ - **Render it so it never clips into walls.** Two robust options: (a) a **separate overlay scene + second camera** rendered after the main scene with `renderer.autoClear=false` and `renderer.clearDepth()` between passes, or (b) put the viewmodel on its own **layer** with a dedicated camera. This guarantees the gun draws on top and never intersects level geometry.
42
+ - If you must use a texture, it must be a **transparent PNG on correctly-perspectived geometry**, never a raw opaque photo on a screen-aligned quad.
43
+
44
+ ### Shooting model
45
+ - **Hitscan (raycast) for fast bullets** (pistols/rifles): on fire, `raycaster.setFromCamera({x:0,y:0}, camera)` (center of screen = crosshair) and `intersectObjects(targets)`. Take the nearest hit; apply damage. Instant, cheap, and what most shooters use.
46
+ - **Projectiles for slow/arcing shots** (rockets, grenades): spawn a pooled mesh, move by velocity·delta, integrate gravity, and sweep-test for collisions (avoid tunneling — see bugs).
47
+ - **Fire rate:** gate with a cooldown timer (`if (now - lastShot < fireInterval) return`), not per-frame or per-mousedown-event alone. Support hold-to-fire for automatics via a boolean set on mousedown/up.
48
+ - **Recoil & spread:** kick the camera pitch/yaw up slightly per shot and recover over time (lerp back); add a small random cone to the ray direction that grows while firing continuously and shrinks when idle. This is 80% of "feel."
49
+ - **Ammo + reload:** track `magazine`/`reserve`; block firing at 0; a timed reload that refills. Even a fake reload with a timer + HUD reads well.
50
+
51
+ ---
52
+
53
+ ## 4. Genre-specific "feel" (the juice)
54
+
55
+ FPS feel is almost entirely feedback and responsiveness:
56
+ - **Muzzle flash** (a brief additive sprite/light at the barrel, 1–2 frames), **shell/particle**, and a **tracer** for projectiles.
57
+ - **Screen shake** on fire and on taking damage (small, decaying camera offset).
58
+ - **Hitmarker** (crosshair flashes / an X appears) + **hit sound** the instant a shot lands — the game must confirm every hit.
59
+ - **Enemy hit reaction**: flash the material, knockback, a death animation/ragdoll or a satisfying pop.
60
+ - **Weapon sway & bob**: viewmodel lags slightly behind fast mouse movement (lerp toward target offset) and bobs while walking.
61
+ - **Sound is half the feel**: distinct fire, impact, reload, footstep, and empty-click sounds; unlock the audio context on first gesture.
62
+ - **Snappy input**: never add input lag; process shooting on the event but resolve in the fixed/render step. Aim assist is optional on mobile/gamepad.
63
+
64
+ ---
65
+
66
+ ## 5. Common bugs to avoid (checklist)
67
+
68
+ - **Photo-as-viewmodel** (see §3) → use 3D geometry/model, render as an overlay layer.
69
+ - **Reading `clientX/Y` instead of `movementX/Y`** while locked → camera doesn't rotate.
70
+ - **Pitch not clamped** → camera flips upside down at the poles.
71
+ - **Applying pitch to movement** → you "fly" when looking up. Movement uses yaw only.
72
+ - **Firing tied to frame rate / no cooldown** → 144Hz machine empties the mag instantly.
73
+ - **Projectile tunneling** through thin walls at high speed → use raycast sweep between last and current position, or a fixed timestep + continuous collision, not just point-in-frame checks.
74
+ - **Raycasting from the mouse position instead of screen center** → shots miss the crosshair. Use `{x:0, y:0}` NDC (center).
75
+ - **Viewmodel clips into walls / z-fights** → separate overlay render pass or dedicated layer + `clearDepth()`.
76
+ - **Pointer lock never re-engages after ESC** → you didn't re-show the blocker / re-bind click on `pointerlockchange`.
77
+ - **Not disposing enemies/bullets** → memory leak; pool projectiles and enemies.
78
+ - **No collision** → walking through walls/floor. Add a capsule/AABB character collider (Rapier `KinematicCharacterController`).
79
+ - **Mobile:** pointer lock is unsupported on iOS/most mobile — provide touch look/joystick + fire button fallback and don't hard-require lock.
80
+
81
+ ---
82
+
83
+ ## Defaults to apply
84
+
85
+ Concrete rules to apply:
86
+
87
+ 1. **NEVER render a weapon as a flat generated photo/JPG in a 3D FPS.** Build the viewmodel from Three.js primitives or load a glTF model, parent it to the camera, and render it as a separate overlay pass/layer so it never clips. A boxy code-built gun > a photorealistic sprite.
88
+ 2. **Pointer lock is mandatory and gesture-gated:** click-to-play blocker, `requestPointerLock({ unadjustedMovement:true })` with fallback, read `movementX/Y`, clamp pitch to ±89°, re-show blocker on unlock.
89
+ 3. **Separate yaw (body) from pitch (camera); movement uses yaw only.**
90
+ 4. **Default to hitscan** with a raycast from screen center; gate fire with a cooldown timer; add recoil + spread + recovery. Projectiles only for slow/arcing weapons, with sweep tests to prevent tunneling.
91
+ 5. **Ship juice, not features:** muzzle flash, hitmarker, hit sound, screen shake, enemy flash-on-hit. This makes a 1-weapon demo feel like a game.
92
+ 6. **Minimal scope:** one weapon, a handful of targets/enemies, an arena with collision, and a HUD (ammo + score). Pool bullets/enemies; dispose on cleanup.
93
+ 7. **Provide a mobile fallback** (touch look + fire button) since pointer lock is desktop-only.
94
+
95
+ ---
96
+
97
+ ## Sources
98
+ - MDN — Pointer Lock API: https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
99
+ - MDN — `Element.requestPointerLock()` (options, `unadjustedMovement`, Promise): https://developer.mozilla.org/en-US/docs/Web/API/Element/requestPointerLock
100
+ - MDN — pointer lock live demo: https://mdn.github.io/dom-examples/pointer-lock/
101
+ - Three.js — `PointerLockControls` example: https://threejs.org/examples/misc_controls_pointerlock.html
102
+ - Three.js — `Raycaster` (`setFromCamera`, `intersectObjects`): https://threejs.org/docs/#api/en/core/Raycaster
103
+ - Three.js — layered/overlay rendering (`autoClear`, `clearDepth`, `Layers`): https://threejs.org/docs/#api/en/core/Layers
104
+ - Rapier — Kinematic character controller: https://rapier.rs/docs/user_guides/javascript/character_controller
105
+ - Gaffer On Games — Fix Your Timestep (projectile/physics stability): https://gafferongames.com/post/fix_your_timestep/
@@ -0,0 +1,97 @@
1
+ # Genre Playbook — 2D Platformer
2
+
3
+ How to build a browser 2D platformer whose jump *feels* good and whose collisions don't glitch. Default engine: **Phaser** (Arcade Physics) or a hand-rolled AABB loop on Canvas. Read `../threejs-foundational.md` first (delta time, Phaser scene/pooling rules). This file focuses on the two things that make or break a platformer: **jump feel** and **tile collision**.
4
+
5
+ ---
6
+
7
+ ## 1. Core mechanics (minimal-but-good scope for a demo)
8
+
9
+ A great-feeling platformer demo needs:
10
+ 1. **A responsive jump** with the "forgiveness" features below (coyote time, jump buffer, variable height).
11
+ 2. **Solid tilemap/AABB collision** — no sticking to walls, no falling through floors, no tunneling at speed.
12
+ 3. **One-way (drop-through) platforms.**
13
+ 4. **A few hazards + a goal** (spikes/pit → respawn at last checkpoint; flag/door to win).
14
+ 5. **A camera that follows with a deadzone** and doesn't jitter.
15
+
16
+ That's a complete micro-game. Skip enemies with AI, wall-jump/dash, and moving-platform edge cases until the core jump + collision feel perfect. **Jump feel is the whole genre — spend your polish budget there.**
17
+
18
+ ---
19
+
20
+ ## 2. Jump feel — the forgiveness features (do ALL of these)
21
+
22
+ These are the difference between "floaty/frustrating" and "tight." Popularized by Celeste and GMTK's "Platformer Toolkit."
23
+
24
+ - **Coyote time (~80–120 ms):** allow a jump for a few frames *after* the player walks off a ledge. Store `coyoteTimer`; reset to `COYOTE_TIME` while grounded, decrement each frame, and allow a jump if `coyoteTimer > 0`. Prevents "I pressed jump but it didn't register at the edge."
25
+ - **Jump buffering (~100–150 ms):** if the player presses jump slightly *before* landing, remember it and jump the instant they touch ground. Store `jumpBufferTimer` on keypress; on landing, if `jumpBufferTimer > 0`, jump immediately.
26
+ - **Variable jump height:** short tap = short hop, hold = full jump. On jump, set upward velocity to max. On **key release while still rising** (`velocityY < 0`), cut the velocity (e.g. `velocityY *= 0.5`). Do NOT set velocity to 0 or it looks abrupt.
27
+ - **Asymmetric gravity:** apply **higher gravity while falling** than while rising (e.g. fall gravity ×1.5–2.5), and often a lower gravity near the jump apex ("apex hang") plus a small horizontal speed boost at apex. This is the single biggest "feel" upgrade — a pure parabola feels floaty.
28
+ - **Clamp fall speed** (terminal velocity) so long falls stay controllable and collision stays stable.
29
+ - **Instant-ish horizontal control:** high ground acceleration + high friction so direction changes feel snappy; reduced acceleration + a little air drag in the air. Avoid slippery ice-feel unless intended.
30
+
31
+ Combine coyote + buffer + variable height + asymmetric gravity and even a placeholder box "feels like Mario."
32
+
33
+ ---
34
+
35
+ ## 3. Collision — tilemap / AABB (the #1 bug source)
36
+
37
+ - **Separate the axes: resolve X, then Y (or Y then X) independently.** Move on X, resolve X collisions; then move on Y, resolve Y collisions. Resolving both at once with a single overlap vector causes corner snags and wall-sticking.
38
+ - **Use AABB (axis-aligned bounding box) vs the tile grid.** For each move, compute which tiles the player's box overlaps (world→tile via `floor(pos / tileSize)`), and push the player out of solid tiles along the axis being resolved. This is O(overlapped tiles), not O(all tiles).
39
+ - **Grounded detection:** you are grounded when a downward Y-resolution stopped you this frame (or a 1px probe below finds a solid tile). Set `velocityY = 0` on landing and on hitting a ceiling.
40
+ - **Prevent tunneling at high speed:** if the player can move more than ~half a tile per frame, do **swept collision** or sub-step the movement (loop in small increments) so you never skip over a thin floor. Fixed timestep helps.
41
+ - **Don't get stuck in seams between tiles:** when scanning multiple solid tiles, resolve using the collision on the axis of motion and skip internal edges (a tile that is adjacent to another solid tile shouldn't push you sideways). Merging colliders for runs of tiles, or ignoring faces between two solids, fixes the classic "snag on a flat floor" bug.
42
+ - **Phaser:** use `map.setCollisionByProperty({ collides: true })` / `setCollisionBetween`, then `this.physics.add.collider(player, layer)`. Set `tile.setCollision(...)` per-side for one-ways. Arcade physics handles separation for you — trust it before hand-rolling.
43
+
44
+ ---
45
+
46
+ ## 4. One-way (drop-through) platforms
47
+
48
+ - **Collide only when moving downward and coming from above.** The player passes up through the platform but lands on top.
49
+ - **Implementation:** only resolve the collision if `velocityY >= 0` (falling) AND the player's *previous* bottom was above the platform's top last frame. Otherwise ignore it.
50
+ - **Drop-through:** press Down (+ jump) to temporarily disable the current one-way platform for a few frames so the player falls through.
51
+ - **Phaser Arcade:** set `tile.setCollision(false,false,true,false)` (top-only) or use `body.checkCollision.down`; or use `collider`'s `processCallback` to return false when the player is below the platform.
52
+
53
+ ---
54
+
55
+ ## 5. Camera
56
+
57
+ - **Follow with a deadzone / soft zone**, not rigid lock — the camera only moves when the player leaves a central box, which kills micro-jitter. Phaser: `this.cameras.main.startFollow(player, true, lerpX, lerpY)` + `setDeadzone(w, h)`.
58
+ - **Add look-ahead** in the direction of movement so the player sees where they're going.
59
+ - **Clamp the camera to level bounds** (`setBounds`) so you never see past the edges.
60
+ - **Round the camera position to whole pixels** for pixel-art games to avoid shimmer; pair with `pixelArt: true` / `roundPixels: true`.
61
+ - Smooth vertical follow separately (or snap on landing) so jumps don't make the camera bounce.
62
+
63
+ ---
64
+
65
+ ## 6. Common bugs to avoid (checklist)
66
+
67
+ - **Floaty jump** → add asymmetric gravity (heavier falling), apex hang, variable height, terminal velocity.
68
+ - **"Jump didn't register" at edges / just before landing** → missing coyote time / jump buffering.
69
+ - **Sticking to walls / snagging on flat floors** → resolving both axes at once, or not ignoring seams between adjacent solid tiles. Resolve axes separately.
70
+ - **Falling through floor at high speed** → tunneling; sub-step or swept collision + fixed timestep + clamp fall speed.
71
+ - **Can't drop through / falls through one-ways when jumping up** → one-way check must gate on downward velocity + coming-from-above.
72
+ - **Double/infinite jump** → grounded flag not reset correctly; only allow jump when grounded OR coyote timer > 0, and consume the buffer.
73
+ - **Camera jitter** → no deadzone / not pixel-rounded / following unsmoothed physics position.
74
+ - **Movement frame-rate dependent** → scale by delta (Phaser gives you `delta`; Arcade integrates for you, but custom code must use it).
75
+ - **Getting stuck when spawning inside a tile** → validate spawn/respawn points are in empty space.
76
+
77
+ ---
78
+
79
+ ## Defaults to apply
80
+
81
+ 1. **Always implement the "forgiveness trio": coyote time (~0.1s), jump buffering (~0.12s), and variable jump height (cut velocity on early release).** These are cheap and are the difference between a good and bad platformer. Bake them into any generated platformer by default.
82
+ 2. **Use asymmetric gravity (heavier when falling) + terminal velocity + apex hang.** Never ship a symmetric-parabola jump.
83
+ 3. **Resolve collision one axis at a time (X then Y) against an AABB/tile grid; sub-step fast movement to prevent tunneling.** Prefer Phaser Arcade's collider over hand-rolled math when possible.
84
+ 4. **One-way platforms: collide only when falling and coming from above; Down = drop through.**
85
+ 5. **Camera: follow with a deadzone + look-ahead, clamp to bounds, round to pixels for pixel art.**
86
+ 6. **Minimal scope:** tight jump + solid collision + one-ways + hazards/checkpoint + goal. Polish the jump before adding enemies.
87
+
88
+ ---
89
+
90
+ ## Sources
91
+ - GMTK — "Why Does Celeste Feel So Good to Play" / Platformer Toolkit (coyote time, buffering, variable jump): https://www.youtube.com/watch?v=yorTG9at90g
92
+ - GMTK Platformer Toolkit (interactive): https://gmtk.itch.io/platformer-toolkit
93
+ - "Coyote Time and Jump Buffering" (Nathan Hoad / common write-ups): https://nathanhoad.net/coyote-time-and-jump-buffering
94
+ - MDN — 2D breakout/AABB collision detection basics: https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
95
+ - Phaser — Tilemaps & Arcade Physics collision: https://docs.phaser.io/phaser/concepts/tilemaps and https://docs.phaser.io/phaser/concepts/physics/arcade
96
+ - "Rendering Tile-Based Worlds" / one-way platforms (MaddyThorson / Celeste dev notes): https://maddythorson.medium.com/
97
+ - Red Blob Games — grid/tile math reference: https://www.redblobgames.com/