devskill 2.0.6 → 2.0.8

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 (1437) hide show
  1. package/meta.ts +13 -1
  2. package/package.json +1 -1
  3. package/scripts/cli.ts +55 -10
  4. package/skills/add-educational-comments/LICENSE.md +21 -0
  5. package/skills/add-educational-comments/SKILL.md +128 -0
  6. package/skills/add-educational-comments/SYNC.md +5 -0
  7. package/skills/agent-governance/LICENSE.md +21 -0
  8. package/skills/agent-governance/SKILL.md +569 -0
  9. package/skills/agent-governance/SYNC.md +5 -0
  10. package/skills/agentic-eval/LICENSE.md +21 -0
  11. package/skills/agentic-eval/SKILL.md +189 -0
  12. package/skills/agentic-eval/SYNC.md +5 -0
  13. package/skills/ai-prompt-engineering-safety-review/LICENSE.md +21 -0
  14. package/skills/ai-prompt-engineering-safety-review/SKILL.md +230 -0
  15. package/skills/ai-prompt-engineering-safety-review/SYNC.md +5 -0
  16. package/skills/algorithmic-art/LICENSE.txt +202 -0
  17. package/skills/algorithmic-art/SKILL.md +405 -0
  18. package/skills/algorithmic-art/SYNC.md +5 -0
  19. package/skills/algorithmic-art/templates/generator_template.js +223 -0
  20. package/skills/algorithmic-art/templates/viewer.html +599 -0
  21. package/skills/appinsights-instrumentation/LICENSE.md +21 -0
  22. package/skills/appinsights-instrumentation/LICENSE.txt +21 -0
  23. package/skills/appinsights-instrumentation/SKILL.md +48 -0
  24. package/skills/appinsights-instrumentation/SYNC.md +5 -0
  25. package/skills/appinsights-instrumentation/examples/appinsights.bicep +30 -0
  26. package/skills/appinsights-instrumentation/references/ASPNETCORE.md +29 -0
  27. package/skills/appinsights-instrumentation/references/AUTO.md +13 -0
  28. package/skills/appinsights-instrumentation/references/NODEJS.md +28 -0
  29. package/skills/appinsights-instrumentation/references/PYTHON.md +48 -0
  30. package/skills/appinsights-instrumentation/scripts/appinsights.ps1 +20 -0
  31. package/skills/apple-appstore-reviewer/LICENSE.md +21 -0
  32. package/skills/apple-appstore-reviewer/SKILL.md +305 -0
  33. package/skills/apple-appstore-reviewer/SYNC.md +5 -0
  34. package/skills/arch-linux-triage/LICENSE.md +21 -0
  35. package/skills/arch-linux-triage/SKILL.md +31 -0
  36. package/skills/arch-linux-triage/SYNC.md +5 -0
  37. package/skills/architecture-blueprint-generator/LICENSE.md +21 -0
  38. package/skills/architecture-blueprint-generator/SKILL.md +322 -0
  39. package/skills/architecture-blueprint-generator/SYNC.md +5 -0
  40. package/skills/aspire/LICENSE.md +21 -0
  41. package/skills/aspire/SKILL.md +231 -0
  42. package/skills/aspire/SYNC.md +5 -0
  43. package/skills/aspire/references/architecture.md +341 -0
  44. package/skills/aspire/references/cli-reference.md +307 -0
  45. package/skills/aspire/references/dashboard.md +226 -0
  46. package/skills/aspire/references/deployment.md +237 -0
  47. package/skills/aspire/references/integrations-catalog.md +68 -0
  48. package/skills/aspire/references/mcp-server.md +195 -0
  49. package/skills/aspire/references/polyglot-apis.md +296 -0
  50. package/skills/aspire/references/testing.md +281 -0
  51. package/skills/aspire/references/troubleshooting.md +194 -0
  52. package/skills/aspnet-minimal-api-openapi/LICENSE.md +21 -0
  53. package/skills/aspnet-minimal-api-openapi/SKILL.md +41 -0
  54. package/skills/aspnet-minimal-api-openapi/SYNC.md +5 -0
  55. package/skills/automate-this/LICENSE.md +21 -0
  56. package/skills/automate-this/SKILL.md +244 -0
  57. package/skills/automate-this/SYNC.md +5 -0
  58. package/skills/autoresearch/LICENSE.md +21 -0
  59. package/skills/autoresearch/SKILL.md +275 -0
  60. package/skills/autoresearch/SYNC.md +5 -0
  61. package/skills/aws-cdk-python-setup/LICENSE.md +21 -0
  62. package/skills/aws-cdk-python-setup/SKILL.md +111 -0
  63. package/skills/aws-cdk-python-setup/SYNC.md +5 -0
  64. package/skills/az-cost-optimize/LICENSE.md +21 -0
  65. package/skills/az-cost-optimize/SKILL.md +305 -0
  66. package/skills/az-cost-optimize/SYNC.md +5 -0
  67. package/skills/azure-deployment-preflight/LICENSE.md +21 -0
  68. package/skills/azure-deployment-preflight/SKILL.md +216 -0
  69. package/skills/azure-deployment-preflight/SYNC.md +5 -0
  70. package/skills/azure-deployment-preflight/references/ERROR-HANDLING.md +392 -0
  71. package/skills/azure-deployment-preflight/references/REPORT-TEMPLATE.md +352 -0
  72. package/skills/azure-deployment-preflight/references/VALIDATION-COMMANDS.md +379 -0
  73. package/skills/azure-devops-cli/LICENSE.md +21 -0
  74. package/skills/azure-devops-cli/SKILL.md +94 -0
  75. package/skills/azure-devops-cli/SYNC.md +5 -0
  76. package/skills/azure-devops-cli/references/advanced-usage.md +197 -0
  77. package/skills/azure-devops-cli/references/boards-and-iterations.md +258 -0
  78. package/skills/azure-devops-cli/references/org-and-security.md +469 -0
  79. package/skills/azure-devops-cli/references/pipelines-and-builds.md +245 -0
  80. package/skills/azure-devops-cli/references/repos-and-prs.md +333 -0
  81. package/skills/azure-devops-cli/references/variables-and-agents.md +212 -0
  82. package/skills/azure-devops-cli/references/workflows-and-patterns.md +668 -0
  83. package/skills/azure-pricing/LICENSE.md +21 -0
  84. package/skills/azure-pricing/SKILL.md +189 -0
  85. package/skills/azure-pricing/SYNC.md +5 -0
  86. package/skills/azure-pricing/references/COPILOT-STUDIO-RATES.md +135 -0
  87. package/skills/azure-pricing/references/COST-ESTIMATOR.md +142 -0
  88. package/skills/azure-pricing/references/REGIONS.md +84 -0
  89. package/skills/azure-pricing/references/SERVICE-NAMES.md +106 -0
  90. package/skills/azure-resource-health-diagnose/LICENSE.md +21 -0
  91. package/skills/azure-resource-health-diagnose/SKILL.md +290 -0
  92. package/skills/azure-resource-health-diagnose/SYNC.md +5 -0
  93. package/skills/azure-resource-visualizer/LICENSE.md +21 -0
  94. package/skills/azure-resource-visualizer/LICENSE.txt +21 -0
  95. package/skills/azure-resource-visualizer/SKILL.md +233 -0
  96. package/skills/azure-resource-visualizer/SYNC.md +5 -0
  97. package/skills/azure-resource-visualizer/assets/template-architecture.md +41 -0
  98. package/skills/azure-role-selector/LICENSE.md +21 -0
  99. package/skills/azure-role-selector/LICENSE.txt +21 -0
  100. package/skills/azure-role-selector/SKILL.md +6 -0
  101. package/skills/azure-role-selector/SYNC.md +5 -0
  102. package/skills/azure-static-web-apps/LICENSE.md +21 -0
  103. package/skills/azure-static-web-apps/SKILL.md +315 -0
  104. package/skills/azure-static-web-apps/SYNC.md +5 -0
  105. package/skills/bigquery-pipeline-audit/LICENSE.md +21 -0
  106. package/skills/bigquery-pipeline-audit/SKILL.md +129 -0
  107. package/skills/bigquery-pipeline-audit/SYNC.md +5 -0
  108. package/skills/boost-prompt/LICENSE.md +21 -0
  109. package/skills/boost-prompt/SKILL.md +25 -0
  110. package/skills/boost-prompt/SYNC.md +5 -0
  111. package/skills/brand-guidelines/LICENSE.txt +202 -0
  112. package/skills/brand-guidelines/SKILL.md +73 -0
  113. package/skills/brand-guidelines/SYNC.md +5 -0
  114. package/skills/breakdown-epic-arch/LICENSE.md +21 -0
  115. package/skills/breakdown-epic-arch/SKILL.md +66 -0
  116. package/skills/breakdown-epic-arch/SYNC.md +5 -0
  117. package/skills/breakdown-epic-pm/LICENSE.md +21 -0
  118. package/skills/breakdown-epic-pm/SKILL.md +58 -0
  119. package/skills/breakdown-epic-pm/SYNC.md +5 -0
  120. package/skills/breakdown-feature-implementation/LICENSE.md +21 -0
  121. package/skills/breakdown-feature-implementation/SKILL.md +128 -0
  122. package/skills/breakdown-feature-implementation/SYNC.md +5 -0
  123. package/skills/breakdown-feature-prd/LICENSE.md +21 -0
  124. package/skills/breakdown-feature-prd/SKILL.md +61 -0
  125. package/skills/breakdown-feature-prd/SYNC.md +5 -0
  126. package/skills/breakdown-plan/LICENSE.md +21 -0
  127. package/skills/breakdown-plan/SKILL.md +509 -0
  128. package/skills/breakdown-plan/SYNC.md +5 -0
  129. package/skills/breakdown-test/LICENSE.md +21 -0
  130. package/skills/breakdown-test/SKILL.md +365 -0
  131. package/skills/breakdown-test/SYNC.md +5 -0
  132. package/skills/canvas-design/LICENSE.txt +202 -0
  133. package/skills/canvas-design/SKILL.md +130 -0
  134. package/skills/canvas-design/SYNC.md +5 -0
  135. package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  136. package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  137. package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  138. package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  139. package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  140. package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  141. package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  142. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  143. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  144. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  145. package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  146. package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  147. package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  148. package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  149. package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  150. package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  151. package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  152. package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  153. package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  154. package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  155. package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  156. package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  157. package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  158. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  159. package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  160. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  161. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  162. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  163. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  164. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  165. package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  166. package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  167. package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  168. package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  169. package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  170. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  171. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  172. package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  173. package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  174. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  175. package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  176. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  177. package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  178. package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  179. package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  180. package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  181. package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  182. package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  183. package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  184. package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  185. package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  186. package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  187. package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  188. package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  189. package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  190. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  191. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  192. package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  193. package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  194. package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  195. package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  196. package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  197. package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  198. package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  199. package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  200. package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  201. package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  202. package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  203. package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  204. package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  205. package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  206. package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  207. package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  208. package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  209. package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  210. package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  211. package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  212. package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  213. package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  214. package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  215. package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  216. package/skills/centos-linux-triage/LICENSE.md +21 -0
  217. package/skills/centos-linux-triage/SKILL.md +31 -0
  218. package/skills/centos-linux-triage/SYNC.md +5 -0
  219. package/skills/chrome-devtools/LICENSE.md +21 -0
  220. package/skills/chrome-devtools/SKILL.md +97 -0
  221. package/skills/chrome-devtools/SYNC.md +5 -0
  222. package/skills/claude-api/LICENSE.txt +202 -0
  223. package/skills/claude-api/SKILL.md +246 -0
  224. package/skills/claude-api/SYNC.md +5 -0
  225. package/skills/claude-api/csharp/claude-api.md +400 -0
  226. package/skills/claude-api/curl/examples.md +193 -0
  227. package/skills/claude-api/go/claude-api.md +404 -0
  228. package/skills/claude-api/java/claude-api.md +430 -0
  229. package/skills/claude-api/php/claude-api.md +241 -0
  230. package/skills/claude-api/python/agent-sdk/README.md +345 -0
  231. package/skills/claude-api/python/agent-sdk/patterns.md +359 -0
  232. package/skills/claude-api/python/claude-api/README.md +410 -0
  233. package/skills/claude-api/python/claude-api/batches.md +185 -0
  234. package/skills/claude-api/python/claude-api/files-api.md +165 -0
  235. package/skills/claude-api/python/claude-api/streaming.md +162 -0
  236. package/skills/claude-api/python/claude-api/tool-use.md +590 -0
  237. package/skills/claude-api/ruby/claude-api.md +92 -0
  238. package/skills/claude-api/shared/error-codes.md +206 -0
  239. package/skills/claude-api/shared/live-sources.md +121 -0
  240. package/skills/claude-api/shared/models.md +119 -0
  241. package/skills/claude-api/shared/tool-use-concepts.md +305 -0
  242. package/skills/claude-api/typescript/agent-sdk/README.md +296 -0
  243. package/skills/claude-api/typescript/agent-sdk/patterns.md +209 -0
  244. package/skills/claude-api/typescript/claude-api/README.md +321 -0
  245. package/skills/claude-api/typescript/claude-api/batches.md +106 -0
  246. package/skills/claude-api/typescript/claude-api/files-api.md +98 -0
  247. package/skills/claude-api/typescript/claude-api/streaming.md +178 -0
  248. package/skills/claude-api/typescript/claude-api/tool-use.md +527 -0
  249. package/skills/cli-mastery/LICENSE.md +21 -0
  250. package/skills/cli-mastery/SKILL.md +43 -0
  251. package/skills/cli-mastery/SYNC.md +5 -0
  252. package/skills/cli-mastery/references/final-exam.md +24 -0
  253. package/skills/cli-mastery/references/module-1-slash-commands.md +88 -0
  254. package/skills/cli-mastery/references/module-2-keyboard-shortcuts.md +38 -0
  255. package/skills/cli-mastery/references/module-3-modes.md +33 -0
  256. package/skills/cli-mastery/references/module-4-agents.md +42 -0
  257. package/skills/cli-mastery/references/module-5-skills.md +33 -0
  258. package/skills/cli-mastery/references/module-6-mcp.md +50 -0
  259. package/skills/cli-mastery/references/module-7-advanced.md +38 -0
  260. package/skills/cli-mastery/references/module-8-configuration.md +34 -0
  261. package/skills/cli-mastery/references/scenarios.md +44 -0
  262. package/skills/cloud-design-patterns/LICENSE.md +21 -0
  263. package/skills/cloud-design-patterns/SKILL.md +62 -0
  264. package/skills/cloud-design-patterns/SYNC.md +5 -0
  265. package/skills/cloud-design-patterns/references/architecture-design.md +127 -0
  266. package/skills/cloud-design-patterns/references/azure-service-mappings.md +13 -0
  267. package/skills/cloud-design-patterns/references/best-practices.md +34 -0
  268. package/skills/cloud-design-patterns/references/deployment-operational.md +91 -0
  269. package/skills/cloud-design-patterns/references/event-driven.md +21 -0
  270. package/skills/cloud-design-patterns/references/messaging-integration.md +127 -0
  271. package/skills/cloud-design-patterns/references/performance.md +180 -0
  272. package/skills/cloud-design-patterns/references/reliability-resilience.md +156 -0
  273. package/skills/cloud-design-patterns/references/security.md +55 -0
  274. package/skills/code-exemplars-blueprint-generator/LICENSE.md +21 -0
  275. package/skills/code-exemplars-blueprint-generator/SKILL.md +126 -0
  276. package/skills/code-exemplars-blueprint-generator/SYNC.md +5 -0
  277. package/skills/codeql/LICENSE.md +21 -0
  278. package/skills/codeql/SKILL.md +405 -0
  279. package/skills/codeql/SYNC.md +5 -0
  280. package/skills/codeql/references/alert-management.md +170 -0
  281. package/skills/codeql/references/cli-commands.md +283 -0
  282. package/skills/codeql/references/compiled-languages.md +284 -0
  283. package/skills/codeql/references/sarif-output.md +265 -0
  284. package/skills/codeql/references/troubleshooting.md +259 -0
  285. package/skills/codeql/references/workflow-configuration.md +398 -0
  286. package/skills/comment-code-generate-a-tutorial/LICENSE.md +21 -0
  287. package/skills/comment-code-generate-a-tutorial/SKILL.md +26 -0
  288. package/skills/comment-code-generate-a-tutorial/SYNC.md +5 -0
  289. package/skills/containerize-aspnet-framework/LICENSE.md +21 -0
  290. package/skills/containerize-aspnet-framework/SKILL.md +454 -0
  291. package/skills/containerize-aspnet-framework/SYNC.md +5 -0
  292. package/skills/containerize-aspnetcore/LICENSE.md +21 -0
  293. package/skills/containerize-aspnetcore/SKILL.md +392 -0
  294. package/skills/containerize-aspnetcore/SYNC.md +5 -0
  295. package/skills/context-map/LICENSE.md +21 -0
  296. package/skills/context-map/SKILL.md +52 -0
  297. package/skills/context-map/SYNC.md +5 -0
  298. package/skills/conventional-commit/LICENSE.md +21 -0
  299. package/skills/conventional-commit/SKILL.md +72 -0
  300. package/skills/conventional-commit/SYNC.md +5 -0
  301. package/skills/convert-plaintext-to-md/LICENSE.md +21 -0
  302. package/skills/convert-plaintext-to-md/SKILL.md +362 -0
  303. package/skills/convert-plaintext-to-md/SYNC.md +5 -0
  304. package/skills/copilot-cli-quickstart/LICENSE.md +21 -0
  305. package/skills/copilot-cli-quickstart/SKILL.md +774 -0
  306. package/skills/copilot-cli-quickstart/SYNC.md +5 -0
  307. package/skills/copilot-instructions-blueprint-generator/LICENSE.md +21 -0
  308. package/skills/copilot-instructions-blueprint-generator/SKILL.md +294 -0
  309. package/skills/copilot-instructions-blueprint-generator/SYNC.md +5 -0
  310. package/skills/copilot-sdk/LICENSE.md +21 -0
  311. package/skills/copilot-sdk/SKILL.md +914 -0
  312. package/skills/copilot-sdk/SYNC.md +5 -0
  313. package/skills/copilot-spaces/LICENSE.md +21 -0
  314. package/skills/copilot-spaces/SKILL.md +205 -0
  315. package/skills/copilot-spaces/SYNC.md +5 -0
  316. package/skills/copilot-usage-metrics/LICENSE.md +21 -0
  317. package/skills/copilot-usage-metrics/SKILL.md +52 -0
  318. package/skills/copilot-usage-metrics/SYNC.md +5 -0
  319. package/skills/copilot-usage-metrics/get-enterprise-metrics.sh +22 -0
  320. package/skills/copilot-usage-metrics/get-enterprise-user-metrics.sh +22 -0
  321. package/skills/copilot-usage-metrics/get-org-metrics.sh +22 -0
  322. package/skills/copilot-usage-metrics/get-org-user-metrics.sh +22 -0
  323. package/skills/cosmosdb-datamodeling/LICENSE.md +21 -0
  324. package/skills/cosmosdb-datamodeling/SKILL.md +1045 -0
  325. package/skills/cosmosdb-datamodeling/SYNC.md +5 -0
  326. package/skills/create-agentsmd/LICENSE.md +21 -0
  327. package/skills/create-agentsmd/SKILL.md +249 -0
  328. package/skills/create-agentsmd/SYNC.md +5 -0
  329. package/skills/create-architectural-decision-record/LICENSE.md +21 -0
  330. package/skills/create-architectural-decision-record/SKILL.md +97 -0
  331. package/skills/create-architectural-decision-record/SYNC.md +5 -0
  332. package/skills/create-github-action-workflow-specification/LICENSE.md +21 -0
  333. package/skills/create-github-action-workflow-specification/SKILL.md +276 -0
  334. package/skills/create-github-action-workflow-specification/SYNC.md +5 -0
  335. package/skills/create-github-issue-feature-from-specification/LICENSE.md +21 -0
  336. package/skills/create-github-issue-feature-from-specification/SKILL.md +28 -0
  337. package/skills/create-github-issue-feature-from-specification/SYNC.md +5 -0
  338. package/skills/create-github-issues-feature-from-implementation-plan/LICENSE.md +21 -0
  339. package/skills/create-github-issues-feature-from-implementation-plan/SKILL.md +28 -0
  340. package/skills/create-github-issues-feature-from-implementation-plan/SYNC.md +5 -0
  341. package/skills/create-github-issues-for-unmet-specification-requirements/LICENSE.md +21 -0
  342. package/skills/create-github-issues-for-unmet-specification-requirements/SKILL.md +35 -0
  343. package/skills/create-github-issues-for-unmet-specification-requirements/SYNC.md +5 -0
  344. package/skills/create-github-pull-request-from-specification/LICENSE.md +21 -0
  345. package/skills/create-github-pull-request-from-specification/SKILL.md +24 -0
  346. package/skills/create-github-pull-request-from-specification/SYNC.md +5 -0
  347. package/skills/create-implementation-plan/LICENSE.md +21 -0
  348. package/skills/create-implementation-plan/SKILL.md +157 -0
  349. package/skills/create-implementation-plan/SYNC.md +5 -0
  350. package/skills/create-llms/LICENSE.md +21 -0
  351. package/skills/create-llms/SKILL.md +210 -0
  352. package/skills/create-llms/SYNC.md +5 -0
  353. package/skills/create-readme/LICENSE.md +21 -0
  354. package/skills/create-readme/SKILL.md +21 -0
  355. package/skills/create-readme/SYNC.md +5 -0
  356. package/skills/create-specification/LICENSE.md +21 -0
  357. package/skills/create-specification/SKILL.md +127 -0
  358. package/skills/create-specification/SYNC.md +5 -0
  359. package/skills/create-spring-boot-java-project/LICENSE.md +21 -0
  360. package/skills/create-spring-boot-java-project/SKILL.md +163 -0
  361. package/skills/create-spring-boot-java-project/SYNC.md +5 -0
  362. package/skills/create-spring-boot-kotlin-project/LICENSE.md +21 -0
  363. package/skills/create-spring-boot-kotlin-project/SKILL.md +147 -0
  364. package/skills/create-spring-boot-kotlin-project/SYNC.md +5 -0
  365. package/skills/create-technical-spike/LICENSE.md +21 -0
  366. package/skills/create-technical-spike/SKILL.md +230 -0
  367. package/skills/create-technical-spike/SYNC.md +5 -0
  368. package/skills/create-tldr-page/LICENSE.md +21 -0
  369. package/skills/create-tldr-page/SKILL.md +210 -0
  370. package/skills/create-tldr-page/SYNC.md +5 -0
  371. package/skills/creating-oracle-to-postgres-master-migration-plan/LICENSE.md +21 -0
  372. package/skills/creating-oracle-to-postgres-master-migration-plan/SKILL.md +83 -0
  373. package/skills/creating-oracle-to-postgres-master-migration-plan/SYNC.md +5 -0
  374. package/skills/creating-oracle-to-postgres-migration-bug-report/LICENSE.md +21 -0
  375. package/skills/creating-oracle-to-postgres-migration-bug-report/SKILL.md +43 -0
  376. package/skills/creating-oracle-to-postgres-migration-bug-report/SYNC.md +5 -0
  377. package/skills/creating-oracle-to-postgres-migration-bug-report/references/BUG-REPORT-TEMPLATE.md +79 -0
  378. package/skills/creating-oracle-to-postgres-migration-integration-tests/LICENSE.md +21 -0
  379. package/skills/creating-oracle-to-postgres-migration-integration-tests/SKILL.md +60 -0
  380. package/skills/creating-oracle-to-postgres-migration-integration-tests/SYNC.md +5 -0
  381. package/skills/csharp-async/LICENSE.md +21 -0
  382. package/skills/csharp-async/SKILL.md +49 -0
  383. package/skills/csharp-async/SYNC.md +5 -0
  384. package/skills/csharp-docs/LICENSE.md +21 -0
  385. package/skills/csharp-docs/SKILL.md +62 -0
  386. package/skills/csharp-docs/SYNC.md +5 -0
  387. package/skills/csharp-mcp-server-generator/LICENSE.md +21 -0
  388. package/skills/csharp-mcp-server-generator/SKILL.md +59 -0
  389. package/skills/csharp-mcp-server-generator/SYNC.md +5 -0
  390. package/skills/csharp-mstest/LICENSE.md +21 -0
  391. package/skills/csharp-mstest/SKILL.md +478 -0
  392. package/skills/csharp-mstest/SYNC.md +5 -0
  393. package/skills/csharp-nunit/LICENSE.md +21 -0
  394. package/skills/csharp-nunit/SKILL.md +71 -0
  395. package/skills/csharp-nunit/SYNC.md +5 -0
  396. package/skills/csharp-tunit/LICENSE.md +21 -0
  397. package/skills/csharp-tunit/SKILL.md +100 -0
  398. package/skills/csharp-tunit/SYNC.md +5 -0
  399. package/skills/csharp-xunit/LICENSE.md +21 -0
  400. package/skills/csharp-xunit/SKILL.md +68 -0
  401. package/skills/csharp-xunit/SYNC.md +5 -0
  402. package/skills/datanalysis-credit-risk/LICENSE.md +21 -0
  403. package/skills/datanalysis-credit-risk/SKILL.md +113 -0
  404. package/skills/datanalysis-credit-risk/SYNC.md +5 -0
  405. package/skills/datanalysis-credit-risk/references/analysis.py +1223 -0
  406. package/skills/datanalysis-credit-risk/references/func.py +228 -0
  407. package/skills/datanalysis-credit-risk/scripts/example.py +391 -0
  408. package/skills/dataverse-python-advanced-patterns/LICENSE.md +21 -0
  409. package/skills/dataverse-python-advanced-patterns/SKILL.md +17 -0
  410. package/skills/dataverse-python-advanced-patterns/SYNC.md +5 -0
  411. package/skills/dataverse-python-production-code/LICENSE.md +21 -0
  412. package/skills/dataverse-python-production-code/SKILL.md +116 -0
  413. package/skills/dataverse-python-production-code/SYNC.md +5 -0
  414. package/skills/dataverse-python-quickstart/LICENSE.md +21 -0
  415. package/skills/dataverse-python-quickstart/SKILL.md +14 -0
  416. package/skills/dataverse-python-quickstart/SYNC.md +5 -0
  417. package/skills/dataverse-python-usecase-builder/LICENSE.md +21 -0
  418. package/skills/dataverse-python-usecase-builder/SKILL.md +246 -0
  419. package/skills/dataverse-python-usecase-builder/SYNC.md +5 -0
  420. package/skills/debian-linux-triage/LICENSE.md +21 -0
  421. package/skills/debian-linux-triage/SKILL.md +31 -0
  422. package/skills/debian-linux-triage/SYNC.md +5 -0
  423. package/skills/declarative-agents/LICENSE.md +21 -0
  424. package/skills/declarative-agents/SKILL.md +94 -0
  425. package/skills/declarative-agents/SYNC.md +5 -0
  426. package/skills/dependabot/LICENSE.md +21 -0
  427. package/skills/dependabot/SKILL.md +422 -0
  428. package/skills/dependabot/SYNC.md +5 -0
  429. package/skills/dependabot/references/dependabot-yml-reference.md +374 -0
  430. package/skills/dependabot/references/example-configs.md +409 -0
  431. package/skills/dependabot/references/pr-commands.md +91 -0
  432. package/skills/devops-rollout-plan/LICENSE.md +21 -0
  433. package/skills/devops-rollout-plan/SKILL.md +117 -0
  434. package/skills/devops-rollout-plan/SYNC.md +5 -0
  435. package/skills/doc-coauthoring/SKILL.md +375 -0
  436. package/skills/doc-coauthoring/SYNC.md +5 -0
  437. package/skills/documentation-writer/LICENSE.md +21 -0
  438. package/skills/documentation-writer/SKILL.md +45 -0
  439. package/skills/documentation-writer/SYNC.md +5 -0
  440. package/skills/docx/LICENSE.txt +30 -0
  441. package/skills/docx/SKILL.md +590 -0
  442. package/skills/docx/SYNC.md +5 -0
  443. package/skills/docx/scripts/__init__.py +1 -0
  444. package/skills/docx/scripts/accept_changes.py +135 -0
  445. package/skills/docx/scripts/comment.py +318 -0
  446. package/skills/docx/scripts/office/helpers/__init__.py +0 -0
  447. package/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  448. package/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  449. package/skills/docx/scripts/office/pack.py +159 -0
  450. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  451. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  452. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  453. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  454. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  455. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  456. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  457. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  458. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  459. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  460. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  461. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  462. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  463. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  464. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  465. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  466. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  467. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  468. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  469. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  470. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  471. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  472. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  473. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  474. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  475. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  476. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  477. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  478. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  479. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  480. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  481. package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  482. package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  483. package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  484. package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  485. package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  486. package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  487. package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  488. package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  489. package/skills/docx/scripts/office/soffice.py +183 -0
  490. package/skills/docx/scripts/office/unpack.py +132 -0
  491. package/skills/docx/scripts/office/validate.py +111 -0
  492. package/skills/docx/scripts/office/validators/__init__.py +15 -0
  493. package/skills/docx/scripts/office/validators/base.py +847 -0
  494. package/skills/docx/scripts/office/validators/docx.py +446 -0
  495. package/skills/docx/scripts/office/validators/pptx.py +275 -0
  496. package/skills/docx/scripts/office/validators/redlining.py +247 -0
  497. package/skills/docx/scripts/templates/comments.xml +3 -0
  498. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  499. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  500. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  501. package/skills/docx/scripts/templates/people.xml +3 -0
  502. package/skills/dotnet-best-practices/LICENSE.md +21 -0
  503. package/skills/dotnet-best-practices/SKILL.md +85 -0
  504. package/skills/dotnet-best-practices/SYNC.md +5 -0
  505. package/skills/dotnet-design-pattern-review/LICENSE.md +21 -0
  506. package/skills/dotnet-design-pattern-review/SKILL.md +42 -0
  507. package/skills/dotnet-design-pattern-review/SYNC.md +5 -0
  508. package/skills/dotnet-timezone/LICENSE.md +21 -0
  509. package/skills/dotnet-timezone/SKILL.md +109 -0
  510. package/skills/dotnet-timezone/SYNC.md +5 -0
  511. package/skills/dotnet-timezone/references/code-patterns.md +153 -0
  512. package/skills/dotnet-timezone/references/timezone-index.md +87 -0
  513. package/skills/dotnet-upgrade/LICENSE.md +21 -0
  514. package/skills/dotnet-upgrade/SKILL.md +116 -0
  515. package/skills/dotnet-upgrade/SYNC.md +5 -0
  516. package/skills/doublecheck/LICENSE.md +21 -0
  517. package/skills/doublecheck/SKILL.md +277 -0
  518. package/skills/doublecheck/SYNC.md +5 -0
  519. package/skills/doublecheck/assets/verification-report-template.md +92 -0
  520. package/skills/editorconfig/LICENSE.md +21 -0
  521. package/skills/editorconfig/SKILL.md +63 -0
  522. package/skills/editorconfig/SYNC.md +5 -0
  523. package/skills/ef-core/LICENSE.md +21 -0
  524. package/skills/ef-core/SKILL.md +75 -0
  525. package/skills/ef-core/SYNC.md +5 -0
  526. package/skills/entra-agent-user/LICENSE.md +21 -0
  527. package/skills/entra-agent-user/SKILL.md +270 -0
  528. package/skills/entra-agent-user/SYNC.md +5 -0
  529. package/skills/eval-driven-dev/LICENSE.md +21 -0
  530. package/skills/eval-driven-dev/SKILL.md +862 -0
  531. package/skills/eval-driven-dev/SYNC.md +5 -0
  532. package/skills/eval-driven-dev/references/pixie-api.md +195 -0
  533. package/skills/excalidraw-diagram-generator/LICENSE.md +21 -0
  534. package/skills/excalidraw-diagram-generator/SKILL.md +613 -0
  535. package/skills/excalidraw-diagram-generator/SYNC.md +5 -0
  536. package/skills/excalidraw-diagram-generator/references/element-types.md +497 -0
  537. package/skills/excalidraw-diagram-generator/references/excalidraw-schema.md +350 -0
  538. package/skills/excalidraw-diagram-generator/scripts/README.md +193 -0
  539. package/skills/excalidraw-diagram-generator/scripts/add-arrow.py +312 -0
  540. package/skills/excalidraw-diagram-generator/scripts/add-icon-to-diagram.py +404 -0
  541. package/skills/excalidraw-diagram-generator/scripts/split-excalidraw-library.py +183 -0
  542. package/skills/excalidraw-diagram-generator/templates/business-flow-swimlane-template.excalidraw +334 -0
  543. package/skills/excalidraw-diagram-generator/templates/class-diagram-template.excalidraw +558 -0
  544. package/skills/excalidraw-diagram-generator/templates/data-flow-diagram-template.excalidraw +279 -0
  545. package/skills/excalidraw-diagram-generator/templates/er-diagram-template.excalidraw +662 -0
  546. package/skills/excalidraw-diagram-generator/templates/flowchart-template.excalidraw +179 -0
  547. package/skills/excalidraw-diagram-generator/templates/mindmap-template.excalidraw +244 -0
  548. package/skills/excalidraw-diagram-generator/templates/relationship-template.excalidraw +145 -0
  549. package/skills/excalidraw-diagram-generator/templates/sequence-diagram-template.excalidraw +509 -0
  550. package/skills/fabric-lakehouse/LICENSE.md +21 -0
  551. package/skills/fabric-lakehouse/SKILL.md +106 -0
  552. package/skills/fabric-lakehouse/SYNC.md +5 -0
  553. package/skills/fabric-lakehouse/references/getdata.md +36 -0
  554. package/skills/fabric-lakehouse/references/pyspark.md +189 -0
  555. package/skills/fedora-linux-triage/LICENSE.md +21 -0
  556. package/skills/fedora-linux-triage/SKILL.md +31 -0
  557. package/skills/fedora-linux-triage/SYNC.md +5 -0
  558. package/skills/finalize-agent-prompt/LICENSE.md +21 -0
  559. package/skills/finalize-agent-prompt/SKILL.md +26 -0
  560. package/skills/finalize-agent-prompt/SYNC.md +5 -0
  561. package/skills/finnish-humanizer/LICENSE.md +21 -0
  562. package/skills/finnish-humanizer/SKILL.md +145 -0
  563. package/skills/finnish-humanizer/SYNC.md +5 -0
  564. package/skills/finnish-humanizer/references/patterns.md +338 -0
  565. package/skills/first-ask/LICENSE.md +21 -0
  566. package/skills/first-ask/SKILL.md +30 -0
  567. package/skills/first-ask/SYNC.md +5 -0
  568. package/skills/flowstudio-power-automate-build/LICENSE.md +21 -0
  569. package/skills/flowstudio-power-automate-build/SKILL.md +460 -0
  570. package/skills/flowstudio-power-automate-build/SYNC.md +5 -0
  571. package/skills/flowstudio-power-automate-build/references/action-patterns-connectors.md +542 -0
  572. package/skills/flowstudio-power-automate-build/references/action-patterns-core.md +542 -0
  573. package/skills/flowstudio-power-automate-build/references/action-patterns-data.md +735 -0
  574. package/skills/flowstudio-power-automate-build/references/build-patterns.md +108 -0
  575. package/skills/flowstudio-power-automate-build/references/flow-schema.md +225 -0
  576. package/skills/flowstudio-power-automate-build/references/trigger-types.md +211 -0
  577. package/skills/flowstudio-power-automate-debug/LICENSE.md +21 -0
  578. package/skills/flowstudio-power-automate-debug/SKILL.md +322 -0
  579. package/skills/flowstudio-power-automate-debug/SYNC.md +5 -0
  580. package/skills/flowstudio-power-automate-debug/references/common-errors.md +188 -0
  581. package/skills/flowstudio-power-automate-debug/references/debug-workflow.md +157 -0
  582. package/skills/flowstudio-power-automate-mcp/LICENSE.md +21 -0
  583. package/skills/flowstudio-power-automate-mcp/SKILL.md +450 -0
  584. package/skills/flowstudio-power-automate-mcp/SYNC.md +5 -0
  585. package/skills/flowstudio-power-automate-mcp/references/MCP-BOOTSTRAP.md +53 -0
  586. package/skills/flowstudio-power-automate-mcp/references/action-types.md +79 -0
  587. package/skills/flowstudio-power-automate-mcp/references/connection-references.md +115 -0
  588. package/skills/flowstudio-power-automate-mcp/references/tool-reference.md +445 -0
  589. package/skills/fluentui-blazor/LICENSE.md +21 -0
  590. package/skills/fluentui-blazor/SKILL.md +231 -0
  591. package/skills/fluentui-blazor/SYNC.md +5 -0
  592. package/skills/fluentui-blazor/references/DATAGRID.md +162 -0
  593. package/skills/fluentui-blazor/references/LAYOUT-AND-NAVIGATION.md +173 -0
  594. package/skills/fluentui-blazor/references/SETUP.md +129 -0
  595. package/skills/fluentui-blazor/references/THEMING.md +103 -0
  596. package/skills/folder-structure-blueprint-generator/LICENSE.md +21 -0
  597. package/skills/folder-structure-blueprint-generator/SKILL.md +405 -0
  598. package/skills/folder-structure-blueprint-generator/SYNC.md +5 -0
  599. package/skills/frontend-design/LICENSE.txt +177 -0
  600. package/skills/frontend-design/SKILL.md +42 -0
  601. package/skills/frontend-design/SYNC.md +5 -0
  602. package/skills/game-engine/LICENSE.md +21 -0
  603. package/skills/game-engine/SKILL.md +139 -0
  604. package/skills/game-engine/SYNC.md +5 -0
  605. package/skills/game-engine/assets/2d-maze-game.md +528 -0
  606. package/skills/game-engine/assets/2d-platform-game.md +1855 -0
  607. package/skills/game-engine/assets/gameBase-template-repo.md +310 -0
  608. package/skills/game-engine/assets/paddle-game-template.md +1528 -0
  609. package/skills/game-engine/assets/simple-2d-engine.md +507 -0
  610. package/skills/game-engine/references/3d-web-games.md +754 -0
  611. package/skills/game-engine/references/algorithms.md +843 -0
  612. package/skills/game-engine/references/basics.md +343 -0
  613. package/skills/game-engine/references/game-control-mechanisms.md +617 -0
  614. package/skills/game-engine/references/game-engine-core-principles.md +695 -0
  615. package/skills/game-engine/references/game-publishing.md +352 -0
  616. package/skills/game-engine/references/techniques.md +894 -0
  617. package/skills/game-engine/references/terminology.md +354 -0
  618. package/skills/game-engine/references/web-apis.md +1394 -0
  619. package/skills/gen-specs-as-issues/LICENSE.md +21 -0
  620. package/skills/gen-specs-as-issues/SKILL.md +165 -0
  621. package/skills/gen-specs-as-issues/SYNC.md +5 -0
  622. package/skills/generate-custom-instructions-from-codebase/LICENSE.md +21 -0
  623. package/skills/generate-custom-instructions-from-codebase/SKILL.md +240 -0
  624. package/skills/generate-custom-instructions-from-codebase/SYNC.md +5 -0
  625. package/skills/geofeed-tuner/LICENSE.md +21 -0
  626. package/skills/geofeed-tuner/SKILL.md +864 -0
  627. package/skills/geofeed-tuner/SYNC.md +5 -0
  628. package/skills/geofeed-tuner/assets/example/01-user-input-rfc8805-feed.csv +5 -0
  629. package/skills/geofeed-tuner/assets/iso3166-1.json +1249 -0
  630. package/skills/geofeed-tuner/assets/iso3166-2.json +20188 -0
  631. package/skills/geofeed-tuner/assets/small-territories.json +106 -0
  632. package/skills/geofeed-tuner/references/rfc8805.txt +735 -0
  633. package/skills/geofeed-tuner/references/snippets-python3.md +85 -0
  634. package/skills/geofeed-tuner/scripts/templates/index.html +2305 -0
  635. package/skills/gh-cli/LICENSE.md +21 -0
  636. package/skills/gh-cli/SKILL.md +2187 -0
  637. package/skills/gh-cli/SYNC.md +5 -0
  638. package/skills/git-commit/LICENSE.md +21 -0
  639. package/skills/git-commit/SKILL.md +124 -0
  640. package/skills/git-commit/SYNC.md +5 -0
  641. package/skills/git-flow-branch-creator/LICENSE.md +21 -0
  642. package/skills/git-flow-branch-creator/SKILL.md +292 -0
  643. package/skills/git-flow-branch-creator/SYNC.md +5 -0
  644. package/skills/github-copilot-starter/LICENSE.md +21 -0
  645. package/skills/github-copilot-starter/SKILL.md +402 -0
  646. package/skills/github-copilot-starter/SYNC.md +5 -0
  647. package/skills/github-issues/LICENSE.md +21 -0
  648. package/skills/github-issues/SKILL.md +201 -0
  649. package/skills/github-issues/SYNC.md +5 -0
  650. package/skills/github-issues/references/dependencies.md +71 -0
  651. package/skills/github-issues/references/images.md +116 -0
  652. package/skills/github-issues/references/issue-fields.md +191 -0
  653. package/skills/github-issues/references/issue-types.md +72 -0
  654. package/skills/github-issues/references/projects.md +273 -0
  655. package/skills/github-issues/references/search.md +231 -0
  656. package/skills/github-issues/references/sub-issues.md +137 -0
  657. package/skills/github-issues/references/templates.md +90 -0
  658. package/skills/go-mcp-server-generator/LICENSE.md +21 -0
  659. package/skills/go-mcp-server-generator/SKILL.md +334 -0
  660. package/skills/go-mcp-server-generator/SYNC.md +5 -0
  661. package/skills/gtm-0-to-1-launch/LICENSE.md +21 -0
  662. package/skills/gtm-0-to-1-launch/SKILL.md +321 -0
  663. package/skills/gtm-0-to-1-launch/SYNC.md +5 -0
  664. package/skills/gtm-ai-gtm/LICENSE.md +21 -0
  665. package/skills/gtm-ai-gtm/SKILL.md +569 -0
  666. package/skills/gtm-ai-gtm/SYNC.md +5 -0
  667. package/skills/gtm-board-and-investor-communication/LICENSE.md +21 -0
  668. package/skills/gtm-board-and-investor-communication/SKILL.md +456 -0
  669. package/skills/gtm-board-and-investor-communication/SYNC.md +5 -0
  670. package/skills/gtm-developer-ecosystem/LICENSE.md +21 -0
  671. package/skills/gtm-developer-ecosystem/SKILL.md +310 -0
  672. package/skills/gtm-developer-ecosystem/SYNC.md +5 -0
  673. package/skills/gtm-enterprise-account-planning/LICENSE.md +21 -0
  674. package/skills/gtm-enterprise-account-planning/SKILL.md +429 -0
  675. package/skills/gtm-enterprise-account-planning/SYNC.md +5 -0
  676. package/skills/gtm-enterprise-onboarding/LICENSE.md +21 -0
  677. package/skills/gtm-enterprise-onboarding/SKILL.md +457 -0
  678. package/skills/gtm-enterprise-onboarding/SYNC.md +5 -0
  679. package/skills/gtm-operating-cadence/LICENSE.md +21 -0
  680. package/skills/gtm-operating-cadence/SKILL.md +420 -0
  681. package/skills/gtm-operating-cadence/SYNC.md +5 -0
  682. package/skills/gtm-partnership-architecture/LICENSE.md +21 -0
  683. package/skills/gtm-partnership-architecture/SKILL.md +470 -0
  684. package/skills/gtm-partnership-architecture/SYNC.md +5 -0
  685. package/skills/gtm-positioning-strategy/LICENSE.md +21 -0
  686. package/skills/gtm-positioning-strategy/SKILL.md +438 -0
  687. package/skills/gtm-positioning-strategy/SYNC.md +5 -0
  688. package/skills/gtm-product-led-growth/LICENSE.md +21 -0
  689. package/skills/gtm-product-led-growth/SKILL.md +339 -0
  690. package/skills/gtm-product-led-growth/SYNC.md +5 -0
  691. package/skills/gtm-technical-product-pricing/LICENSE.md +21 -0
  692. package/skills/gtm-technical-product-pricing/SKILL.md +353 -0
  693. package/skills/gtm-technical-product-pricing/SYNC.md +5 -0
  694. package/skills/image-manipulation-image-magick/LICENSE.md +21 -0
  695. package/skills/image-manipulation-image-magick/SKILL.md +252 -0
  696. package/skills/image-manipulation-image-magick/SYNC.md +5 -0
  697. package/skills/import-infrastructure-as-code/LICENSE.md +21 -0
  698. package/skills/import-infrastructure-as-code/SKILL.md +367 -0
  699. package/skills/import-infrastructure-as-code/SYNC.md +5 -0
  700. package/skills/internal-comms/LICENSE.txt +202 -0
  701. package/skills/internal-comms/SKILL.md +32 -0
  702. package/skills/internal-comms/SYNC.md +5 -0
  703. package/skills/internal-comms/examples/3p-updates.md +47 -0
  704. package/skills/internal-comms/examples/company-newsletter.md +65 -0
  705. package/skills/internal-comms/examples/faq-answers.md +30 -0
  706. package/skills/internal-comms/examples/general-comms.md +16 -0
  707. package/skills/issue-fields-migration/LICENSE.md +21 -0
  708. package/skills/issue-fields-migration/SKILL.md +533 -0
  709. package/skills/issue-fields-migration/SYNC.md +5 -0
  710. package/skills/issue-fields-migration/references/issue-fields-api.md +129 -0
  711. package/skills/issue-fields-migration/references/labels-api.md +74 -0
  712. package/skills/issue-fields-migration/references/projects-api.md +116 -0
  713. package/skills/java-add-graalvm-native-image-support/LICENSE.md +21 -0
  714. package/skills/java-add-graalvm-native-image-support/SKILL.md +449 -0
  715. package/skills/java-add-graalvm-native-image-support/SYNC.md +5 -0
  716. package/skills/java-docs/LICENSE.md +21 -0
  717. package/skills/java-docs/SKILL.md +23 -0
  718. package/skills/java-docs/SYNC.md +5 -0
  719. package/skills/java-junit/LICENSE.md +21 -0
  720. package/skills/java-junit/SKILL.md +63 -0
  721. package/skills/java-junit/SYNC.md +5 -0
  722. package/skills/java-mcp-server-generator/LICENSE.md +21 -0
  723. package/skills/java-mcp-server-generator/SKILL.md +756 -0
  724. package/skills/java-mcp-server-generator/SYNC.md +5 -0
  725. package/skills/java-refactoring-extract-method/LICENSE.md +21 -0
  726. package/skills/java-refactoring-extract-method/SKILL.md +104 -0
  727. package/skills/java-refactoring-extract-method/SYNC.md +5 -0
  728. package/skills/java-refactoring-remove-parameter/LICENSE.md +21 -0
  729. package/skills/java-refactoring-remove-parameter/SKILL.md +84 -0
  730. package/skills/java-refactoring-remove-parameter/SYNC.md +5 -0
  731. package/skills/java-springboot/LICENSE.md +21 -0
  732. package/skills/java-springboot/SKILL.md +65 -0
  733. package/skills/java-springboot/SYNC.md +5 -0
  734. package/skills/javascript-typescript-jest/LICENSE.md +21 -0
  735. package/skills/javascript-typescript-jest/SKILL.md +44 -0
  736. package/skills/javascript-typescript-jest/SYNC.md +5 -0
  737. package/skills/kotlin-mcp-server-generator/LICENSE.md +21 -0
  738. package/skills/kotlin-mcp-server-generator/SKILL.md +449 -0
  739. package/skills/kotlin-mcp-server-generator/SYNC.md +5 -0
  740. package/skills/kotlin-springboot/LICENSE.md +21 -0
  741. package/skills/kotlin-springboot/SKILL.md +70 -0
  742. package/skills/kotlin-springboot/SYNC.md +5 -0
  743. package/skills/legacy-circuit-mockups/LICENSE.md +21 -0
  744. package/skills/legacy-circuit-mockups/SKILL.md +276 -0
  745. package/skills/legacy-circuit-mockups/SYNC.md +5 -0
  746. package/skills/legacy-circuit-mockups/references/28256-eeprom.md +190 -0
  747. package/skills/legacy-circuit-mockups/references/555.md +861 -0
  748. package/skills/legacy-circuit-mockups/references/6502.md +221 -0
  749. package/skills/legacy-circuit-mockups/references/6522.md +211 -0
  750. package/skills/legacy-circuit-mockups/references/6C62256.md +177 -0
  751. package/skills/legacy-circuit-mockups/references/7400-series.md +177 -0
  752. package/skills/legacy-circuit-mockups/references/assembly-compiler.md +258 -0
  753. package/skills/legacy-circuit-mockups/references/assembly-language.md +226 -0
  754. package/skills/legacy-circuit-mockups/references/basic-electronic-components.md +86 -0
  755. package/skills/legacy-circuit-mockups/references/breadboard.md +214 -0
  756. package/skills/legacy-circuit-mockups/references/common-breadboard-components.md +281 -0
  757. package/skills/legacy-circuit-mockups/references/connecting-electronic-components.md +310 -0
  758. package/skills/legacy-circuit-mockups/references/emulator-28256-eeprom.md +245 -0
  759. package/skills/legacy-circuit-mockups/references/emulator-6502.md +251 -0
  760. package/skills/legacy-circuit-mockups/references/emulator-6522.md +288 -0
  761. package/skills/legacy-circuit-mockups/references/emulator-6C62256.md +233 -0
  762. package/skills/legacy-circuit-mockups/references/emulator-lcd.md +266 -0
  763. package/skills/legacy-circuit-mockups/references/lcd.md +208 -0
  764. package/skills/legacy-circuit-mockups/references/minipro.md +211 -0
  765. package/skills/legacy-circuit-mockups/references/t48eeprom-programmer.md +174 -0
  766. package/skills/make-repo-contribution/LICENSE.md +21 -0
  767. package/skills/make-repo-contribution/SKILL.md +90 -0
  768. package/skills/make-repo-contribution/SYNC.md +5 -0
  769. package/skills/make-repo-contribution/assets/issue-template.md +37 -0
  770. package/skills/make-repo-contribution/assets/pr-template.md +36 -0
  771. package/skills/make-skill-template/LICENSE.md +21 -0
  772. package/skills/make-skill-template/SKILL.md +147 -0
  773. package/skills/make-skill-template/SYNC.md +5 -0
  774. package/skills/markdown-to-html/LICENSE.md +21 -0
  775. package/skills/markdown-to-html/SKILL.md +916 -0
  776. package/skills/markdown-to-html/SYNC.md +5 -0
  777. package/skills/markdown-to-html/references/basic-markdown-to-html.md +420 -0
  778. package/skills/markdown-to-html/references/basic-markdown.md +496 -0
  779. package/skills/markdown-to-html/references/code-blocks-to-html.md +165 -0
  780. package/skills/markdown-to-html/references/code-blocks.md +70 -0
  781. package/skills/markdown-to-html/references/collapsed-sections-to-html.md +136 -0
  782. package/skills/markdown-to-html/references/collapsed-sections.md +48 -0
  783. package/skills/markdown-to-html/references/gomarkdown.md +253 -0
  784. package/skills/markdown-to-html/references/hugo.md +394 -0
  785. package/skills/markdown-to-html/references/jekyll.md +321 -0
  786. package/skills/markdown-to-html/references/marked.md +121 -0
  787. package/skills/markdown-to-html/references/pandoc.md +226 -0
  788. package/skills/markdown-to-html/references/tables-to-html.md +169 -0
  789. package/skills/markdown-to-html/references/tables.md +72 -0
  790. package/skills/markdown-to-html/references/writing-mathematical-expressions-to-html.md +350 -0
  791. package/skills/markdown-to-html/references/writing-mathematical-expressions.md +76 -0
  792. package/skills/mcp-builder/LICENSE.txt +202 -0
  793. package/skills/mcp-builder/SKILL.md +236 -0
  794. package/skills/mcp-builder/SYNC.md +5 -0
  795. package/skills/mcp-builder/reference/evaluation.md +602 -0
  796. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  797. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  798. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  799. package/skills/mcp-builder/scripts/connections.py +151 -0
  800. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  801. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  802. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  803. package/skills/mcp-cli/LICENSE.md +21 -0
  804. package/skills/mcp-cli/SKILL.md +78 -0
  805. package/skills/mcp-cli/SYNC.md +5 -0
  806. package/skills/mcp-copilot-studio-server-generator/LICENSE.md +21 -0
  807. package/skills/mcp-copilot-studio-server-generator/SKILL.md +118 -0
  808. package/skills/mcp-copilot-studio-server-generator/SYNC.md +5 -0
  809. package/skills/mcp-create-adaptive-cards/LICENSE.md +21 -0
  810. package/skills/mcp-create-adaptive-cards/SKILL.md +532 -0
  811. package/skills/mcp-create-adaptive-cards/SYNC.md +5 -0
  812. package/skills/mcp-create-declarative-agent/LICENSE.md +21 -0
  813. package/skills/mcp-create-declarative-agent/SKILL.md +315 -0
  814. package/skills/mcp-create-declarative-agent/SYNC.md +5 -0
  815. package/skills/mcp-deploy-manage-agents/LICENSE.md +21 -0
  816. package/skills/mcp-deploy-manage-agents/SKILL.md +341 -0
  817. package/skills/mcp-deploy-manage-agents/SYNC.md +5 -0
  818. package/skills/meeting-minutes/LICENSE.md +21 -0
  819. package/skills/meeting-minutes/SKILL.md +235 -0
  820. package/skills/meeting-minutes/SYNC.md +5 -0
  821. package/skills/memory-merger/LICENSE.md +21 -0
  822. package/skills/memory-merger/SKILL.md +108 -0
  823. package/skills/memory-merger/SYNC.md +5 -0
  824. package/skills/mentoring-juniors/LICENSE.md +21 -0
  825. package/skills/mentoring-juniors/SKILL.md +310 -0
  826. package/skills/mentoring-juniors/SYNC.md +5 -0
  827. package/skills/microsoft-agent-framework/LICENSE.md +21 -0
  828. package/skills/microsoft-agent-framework/SKILL.md +65 -0
  829. package/skills/microsoft-agent-framework/SYNC.md +5 -0
  830. package/skills/microsoft-agent-framework/references/dotnet.md +24 -0
  831. package/skills/microsoft-agent-framework/references/python.md +24 -0
  832. package/skills/microsoft-code-reference/LICENSE.md +21 -0
  833. package/skills/microsoft-code-reference/SKILL.md +99 -0
  834. package/skills/microsoft-code-reference/SYNC.md +5 -0
  835. package/skills/microsoft-docs/LICENSE.md +21 -0
  836. package/skills/microsoft-docs/SKILL.md +134 -0
  837. package/skills/microsoft-docs/SYNC.md +5 -0
  838. package/skills/microsoft-skill-creator/LICENSE.md +21 -0
  839. package/skills/microsoft-skill-creator/SKILL.md +250 -0
  840. package/skills/microsoft-skill-creator/SYNC.md +5 -0
  841. package/skills/microsoft-skill-creator/references/skill-templates.md +345 -0
  842. package/skills/migrating-oracle-to-postgres-stored-procedures/LICENSE.md +21 -0
  843. package/skills/migrating-oracle-to-postgres-stored-procedures/SKILL.md +42 -0
  844. package/skills/migrating-oracle-to-postgres-stored-procedures/SYNC.md +5 -0
  845. package/skills/mkdocs-translations/LICENSE.md +21 -0
  846. package/skills/mkdocs-translations/SKILL.md +108 -0
  847. package/skills/mkdocs-translations/SYNC.md +5 -0
  848. package/skills/model-recommendation/LICENSE.md +21 -0
  849. package/skills/model-recommendation/SKILL.md +672 -0
  850. package/skills/model-recommendation/SYNC.md +5 -0
  851. package/skills/msstore-cli/LICENSE.md +21 -0
  852. package/skills/msstore-cli/SKILL.md +600 -0
  853. package/skills/msstore-cli/SYNC.md +5 -0
  854. package/skills/multi-stage-dockerfile/LICENSE.md +21 -0
  855. package/skills/multi-stage-dockerfile/SKILL.md +46 -0
  856. package/skills/multi-stage-dockerfile/SYNC.md +5 -0
  857. package/skills/my-issues/LICENSE.md +21 -0
  858. package/skills/my-issues/SKILL.md +8 -0
  859. package/skills/my-issues/SYNC.md +5 -0
  860. package/skills/my-pull-requests/LICENSE.md +21 -0
  861. package/skills/my-pull-requests/SKILL.md +14 -0
  862. package/skills/my-pull-requests/SYNC.md +5 -0
  863. package/skills/nano-banana-pro-openrouter/LICENSE.md +21 -0
  864. package/skills/nano-banana-pro-openrouter/SKILL.md +74 -0
  865. package/skills/nano-banana-pro-openrouter/SYNC.md +5 -0
  866. package/skills/nano-banana-pro-openrouter/assets/SYSTEM_TEMPLATE +14 -0
  867. package/skills/nano-banana-pro-openrouter/scripts/generate_image.py +191 -0
  868. package/skills/napkin/LICENSE.md +21 -0
  869. package/skills/napkin/SKILL.md +154 -0
  870. package/skills/napkin/SYNC.md +5 -0
  871. package/skills/napkin/assets/napkin.html +2019 -0
  872. package/skills/napkin/assets/step1-activate.svg +107 -0
  873. package/skills/napkin/assets/step2-whiteboard.svg +157 -0
  874. package/skills/napkin/assets/step3-draw.svg +143 -0
  875. package/skills/napkin/assets/step4-share.svg +98 -0
  876. package/skills/napkin/assets/step5-response.svg +112 -0
  877. package/skills/next-best-practices/SKILL.md +153 -0
  878. package/skills/next-best-practices/SYNC.md +5 -0
  879. package/skills/next-best-practices/async-patterns.md +87 -0
  880. package/skills/next-best-practices/bundling.md +180 -0
  881. package/skills/next-best-practices/data-patterns.md +297 -0
  882. package/skills/next-best-practices/debug-tricks.md +105 -0
  883. package/skills/next-best-practices/directives.md +73 -0
  884. package/skills/next-best-practices/error-handling.md +227 -0
  885. package/skills/next-best-practices/file-conventions.md +140 -0
  886. package/skills/next-best-practices/font.md +245 -0
  887. package/skills/next-best-practices/functions.md +108 -0
  888. package/skills/next-best-practices/hydration-error.md +91 -0
  889. package/skills/next-best-practices/image.md +173 -0
  890. package/skills/next-best-practices/metadata.md +301 -0
  891. package/skills/next-best-practices/parallel-routes.md +287 -0
  892. package/skills/next-best-practices/route-handlers.md +146 -0
  893. package/skills/next-best-practices/rsc-boundaries.md +159 -0
  894. package/skills/next-best-practices/runtime-selection.md +39 -0
  895. package/skills/next-best-practices/scripts.md +141 -0
  896. package/skills/next-best-practices/self-hosting.md +371 -0
  897. package/skills/next-best-practices/suspense-boundaries.md +67 -0
  898. package/skills/next-cache-components/SKILL.md +411 -0
  899. package/skills/next-cache-components/SYNC.md +5 -0
  900. package/skills/next-intl-add-language/LICENSE.md +21 -0
  901. package/skills/next-intl-add-language/SKILL.md +19 -0
  902. package/skills/next-intl-add-language/SYNC.md +5 -0
  903. package/skills/next-upgrade/SKILL.md +50 -0
  904. package/skills/next-upgrade/SYNC.md +5 -0
  905. package/skills/noob-mode/LICENSE.md +21 -0
  906. package/skills/noob-mode/SKILL.md +263 -0
  907. package/skills/noob-mode/SYNC.md +5 -0
  908. package/skills/noob-mode/references/examples.md +418 -0
  909. package/skills/noob-mode/references/glossary.md +368 -0
  910. package/skills/nuget-manager/LICENSE.md +21 -0
  911. package/skills/nuget-manager/SKILL.md +68 -0
  912. package/skills/nuget-manager/SYNC.md +5 -0
  913. package/skills/oo-component-documentation/LICENSE.md +21 -0
  914. package/skills/oo-component-documentation/SKILL.md +74 -0
  915. package/skills/oo-component-documentation/SYNC.md +5 -0
  916. package/skills/oo-component-documentation/assets/documentation-template.md +97 -0
  917. package/skills/oo-component-documentation/references/create-mode.md +32 -0
  918. package/skills/oo-component-documentation/references/update-mode.md +32 -0
  919. package/skills/openapi-to-application-code/LICENSE.md +21 -0
  920. package/skills/openapi-to-application-code/SKILL.md +112 -0
  921. package/skills/openapi-to-application-code/SYNC.md +5 -0
  922. package/skills/pdf/LICENSE.txt +30 -0
  923. package/skills/pdf/SKILL.md +314 -0
  924. package/skills/pdf/SYNC.md +5 -0
  925. package/skills/pdf/forms.md +294 -0
  926. package/skills/pdf/reference.md +612 -0
  927. package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  928. package/skills/pdf/scripts/check_fillable_fields.py +11 -0
  929. package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  930. package/skills/pdf/scripts/create_validation_image.py +37 -0
  931. package/skills/pdf/scripts/extract_form_field_info.py +122 -0
  932. package/skills/pdf/scripts/extract_form_structure.py +115 -0
  933. package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  934. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  935. package/skills/pdftk-server/LICENSE.md +21 -0
  936. package/skills/pdftk-server/SKILL.md +162 -0
  937. package/skills/pdftk-server/SYNC.md +5 -0
  938. package/skills/pdftk-server/references/download.md +75 -0
  939. package/skills/pdftk-server/references/pdftk-cli-examples.md +193 -0
  940. package/skills/pdftk-server/references/pdftk-man-page.md +232 -0
  941. package/skills/pdftk-server/references/pdftk-server-license.md +25 -0
  942. package/skills/pdftk-server/references/third-party-materials.md +103 -0
  943. package/skills/penpot-uiux-design/LICENSE.md +21 -0
  944. package/skills/penpot-uiux-design/SKILL.md +342 -0
  945. package/skills/penpot-uiux-design/SYNC.md +5 -0
  946. package/skills/penpot-uiux-design/references/accessibility.md +329 -0
  947. package/skills/penpot-uiux-design/references/component-patterns.md +339 -0
  948. package/skills/penpot-uiux-design/references/platform-guidelines.md +367 -0
  949. package/skills/penpot-uiux-design/references/setup-troubleshooting.md +328 -0
  950. package/skills/php-mcp-server-generator/LICENSE.md +21 -0
  951. package/skills/php-mcp-server-generator/SKILL.md +522 -0
  952. package/skills/php-mcp-server-generator/SYNC.md +5 -0
  953. package/skills/planning-oracle-to-postgres-migration-integration-testing/LICENSE.md +21 -0
  954. package/skills/planning-oracle-to-postgres-migration-integration-testing/SKILL.md +44 -0
  955. package/skills/planning-oracle-to-postgres-migration-integration-testing/SYNC.md +5 -0
  956. package/skills/plantuml-ascii/LICENSE.md +21 -0
  957. package/skills/plantuml-ascii/SKILL.md +305 -0
  958. package/skills/plantuml-ascii/SYNC.md +5 -0
  959. package/skills/playwright-automation-fill-in-form/LICENSE.md +21 -0
  960. package/skills/playwright-automation-fill-in-form/SKILL.md +28 -0
  961. package/skills/playwright-automation-fill-in-form/SYNC.md +5 -0
  962. package/skills/playwright-explore-website/LICENSE.md +21 -0
  963. package/skills/playwright-explore-website/SKILL.md +17 -0
  964. package/skills/playwright-explore-website/SYNC.md +5 -0
  965. package/skills/playwright-generate-test/LICENSE.md +21 -0
  966. package/skills/playwright-generate-test/SKILL.md +17 -0
  967. package/skills/playwright-generate-test/SYNC.md +5 -0
  968. package/skills/polyglot-test-agent/LICENSE.md +21 -0
  969. package/skills/polyglot-test-agent/SKILL.md +161 -0
  970. package/skills/polyglot-test-agent/SYNC.md +5 -0
  971. package/skills/polyglot-test-agent/unit-test-generation.prompt.md +155 -0
  972. package/skills/postgresql-code-review/LICENSE.md +21 -0
  973. package/skills/postgresql-code-review/SKILL.md +212 -0
  974. package/skills/postgresql-code-review/SYNC.md +5 -0
  975. package/skills/postgresql-optimization/LICENSE.md +21 -0
  976. package/skills/postgresql-optimization/SKILL.md +404 -0
  977. package/skills/postgresql-optimization/SYNC.md +5 -0
  978. package/skills/power-apps-code-app-scaffold/LICENSE.md +21 -0
  979. package/skills/power-apps-code-app-scaffold/SKILL.md +146 -0
  980. package/skills/power-apps-code-app-scaffold/SYNC.md +5 -0
  981. package/skills/power-bi-dax-optimization/LICENSE.md +21 -0
  982. package/skills/power-bi-dax-optimization/SKILL.md +173 -0
  983. package/skills/power-bi-dax-optimization/SYNC.md +5 -0
  984. package/skills/power-bi-model-design-review/LICENSE.md +21 -0
  985. package/skills/power-bi-model-design-review/SKILL.md +403 -0
  986. package/skills/power-bi-model-design-review/SYNC.md +5 -0
  987. package/skills/power-bi-performance-troubleshooting/LICENSE.md +21 -0
  988. package/skills/power-bi-performance-troubleshooting/SKILL.md +382 -0
  989. package/skills/power-bi-performance-troubleshooting/SYNC.md +5 -0
  990. package/skills/power-bi-report-design-consultation/LICENSE.md +21 -0
  991. package/skills/power-bi-report-design-consultation/SKILL.md +351 -0
  992. package/skills/power-bi-report-design-consultation/SYNC.md +5 -0
  993. package/skills/power-platform-mcp-connector-suite/LICENSE.md +21 -0
  994. package/skills/power-platform-mcp-connector-suite/SKILL.md +156 -0
  995. package/skills/power-platform-mcp-connector-suite/SYNC.md +5 -0
  996. package/skills/powerbi-modeling/LICENSE.md +21 -0
  997. package/skills/powerbi-modeling/SKILL.md +153 -0
  998. package/skills/powerbi-modeling/SYNC.md +5 -0
  999. package/skills/powerbi-modeling/references/MEASURES-DAX.md +195 -0
  1000. package/skills/powerbi-modeling/references/PERFORMANCE.md +215 -0
  1001. package/skills/powerbi-modeling/references/RELATIONSHIPS.md +147 -0
  1002. package/skills/powerbi-modeling/references/RLS.md +226 -0
  1003. package/skills/powerbi-modeling/references/STAR-SCHEMA.md +103 -0
  1004. package/skills/pptx/LICENSE.txt +30 -0
  1005. package/skills/pptx/SKILL.md +232 -0
  1006. package/skills/pptx/SYNC.md +5 -0
  1007. package/skills/pptx/editing.md +205 -0
  1008. package/skills/pptx/pptxgenjs.md +420 -0
  1009. package/skills/pptx/scripts/__init__.py +0 -0
  1010. package/skills/pptx/scripts/add_slide.py +195 -0
  1011. package/skills/pptx/scripts/clean.py +286 -0
  1012. package/skills/pptx/scripts/office/helpers/__init__.py +0 -0
  1013. package/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  1014. package/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  1015. package/skills/pptx/scripts/office/pack.py +159 -0
  1016. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  1017. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  1018. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  1019. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  1020. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  1021. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  1022. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  1023. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  1024. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  1025. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  1026. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  1027. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  1028. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  1029. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  1030. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  1031. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  1032. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  1033. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  1034. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  1035. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  1036. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  1037. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  1038. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  1039. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  1040. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  1041. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  1042. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  1043. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  1044. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  1045. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  1046. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  1047. package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  1048. package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  1049. package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  1050. package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  1051. package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  1052. package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  1053. package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  1054. package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  1055. package/skills/pptx/scripts/office/soffice.py +183 -0
  1056. package/skills/pptx/scripts/office/unpack.py +132 -0
  1057. package/skills/pptx/scripts/office/validate.py +111 -0
  1058. package/skills/pptx/scripts/office/validators/__init__.py +15 -0
  1059. package/skills/pptx/scripts/office/validators/base.py +847 -0
  1060. package/skills/pptx/scripts/office/validators/docx.py +446 -0
  1061. package/skills/pptx/scripts/office/validators/pptx.py +275 -0
  1062. package/skills/pptx/scripts/office/validators/redlining.py +247 -0
  1063. package/skills/pptx/scripts/thumbnail.py +289 -0
  1064. package/skills/prd/LICENSE.md +21 -0
  1065. package/skills/prd/SKILL.md +143 -0
  1066. package/skills/prd/SYNC.md +5 -0
  1067. package/skills/premium-frontend-ui/LICENSE.md +21 -0
  1068. package/skills/premium-frontend-ui/SKILL.md +110 -0
  1069. package/skills/premium-frontend-ui/SYNC.md +5 -0
  1070. package/skills/project-workflow-analysis-blueprint-generator/LICENSE.md +21 -0
  1071. package/skills/project-workflow-analysis-blueprint-generator/SKILL.md +293 -0
  1072. package/skills/project-workflow-analysis-blueprint-generator/SYNC.md +5 -0
  1073. package/skills/prompt-builder/LICENSE.md +21 -0
  1074. package/skills/prompt-builder/SKILL.md +141 -0
  1075. package/skills/prompt-builder/SYNC.md +5 -0
  1076. package/skills/publish-to-pages/LICENSE.md +21 -0
  1077. package/skills/publish-to-pages/SKILL.md +107 -0
  1078. package/skills/publish-to-pages/SYNC.md +5 -0
  1079. package/skills/publish-to-pages/scripts/convert-pdf.py +176 -0
  1080. package/skills/publish-to-pages/scripts/convert-pptx.py +376 -0
  1081. package/skills/publish-to-pages/scripts/publish.sh +51 -0
  1082. package/skills/pytest-coverage/LICENSE.md +21 -0
  1083. package/skills/pytest-coverage/SKILL.md +28 -0
  1084. package/skills/pytest-coverage/SYNC.md +5 -0
  1085. package/skills/python-mcp-server-generator/LICENSE.md +21 -0
  1086. package/skills/python-mcp-server-generator/SKILL.md +105 -0
  1087. package/skills/python-mcp-server-generator/SYNC.md +5 -0
  1088. package/skills/quasi-coder/LICENSE.md +21 -0
  1089. package/skills/quasi-coder/SKILL.md +369 -0
  1090. package/skills/quasi-coder/SYNC.md +5 -0
  1091. package/skills/readme-blueprint-generator/LICENSE.md +21 -0
  1092. package/skills/readme-blueprint-generator/SKILL.md +78 -0
  1093. package/skills/readme-blueprint-generator/SYNC.md +5 -0
  1094. package/skills/refactor/LICENSE.md +21 -0
  1095. package/skills/refactor/SKILL.md +645 -0
  1096. package/skills/refactor/SYNC.md +5 -0
  1097. package/skills/refactor-method-complexity-reduce/LICENSE.md +21 -0
  1098. package/skills/refactor-method-complexity-reduce/SKILL.md +98 -0
  1099. package/skills/refactor-method-complexity-reduce/SYNC.md +5 -0
  1100. package/skills/refactor-plan/LICENSE.md +21 -0
  1101. package/skills/refactor-plan/SKILL.md +65 -0
  1102. package/skills/refactor-plan/SYNC.md +5 -0
  1103. package/skills/remember/LICENSE.md +21 -0
  1104. package/skills/remember/SKILL.md +126 -0
  1105. package/skills/remember/SYNC.md +5 -0
  1106. package/skills/remember-interactive-programming/LICENSE.md +21 -0
  1107. package/skills/remember-interactive-programming/SKILL.md +13 -0
  1108. package/skills/remember-interactive-programming/SYNC.md +5 -0
  1109. package/skills/repo-story-time/LICENSE.md +21 -0
  1110. package/skills/repo-story-time/SKILL.md +154 -0
  1111. package/skills/repo-story-time/SYNC.md +5 -0
  1112. package/skills/review-and-refactor/LICENSE.md +21 -0
  1113. package/skills/review-and-refactor/SKILL.md +15 -0
  1114. package/skills/review-and-refactor/SYNC.md +5 -0
  1115. package/skills/reviewing-oracle-to-postgres-migration/LICENSE.md +21 -0
  1116. package/skills/reviewing-oracle-to-postgres-migration/SKILL.md +67 -0
  1117. package/skills/reviewing-oracle-to-postgres-migration/SYNC.md +5 -0
  1118. package/skills/reviewing-oracle-to-postgres-migration/references/REFERENCE.md +13 -0
  1119. package/skills/reviewing-oracle-to-postgres-migration/references/empty-strings-handling.md +69 -0
  1120. package/skills/reviewing-oracle-to-postgres-migration/references/no-data-found-exceptions.md +99 -0
  1121. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-parentheses-from-clause.md +190 -0
  1122. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-sorting.md +51 -0
  1123. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-timestamp-timezone.md +187 -0
  1124. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-to-char-numeric.md +145 -0
  1125. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-type-coercion.md +182 -0
  1126. package/skills/reviewing-oracle-to-postgres-migration/references/postgres-concurrent-transactions.md +259 -0
  1127. package/skills/reviewing-oracle-to-postgres-migration/references/postgres-refcursor-handling.md +148 -0
  1128. package/skills/ruby-mcp-server-generator/LICENSE.md +21 -0
  1129. package/skills/ruby-mcp-server-generator/SKILL.md +660 -0
  1130. package/skills/ruby-mcp-server-generator/SYNC.md +5 -0
  1131. package/skills/rust-mcp-server-generator/LICENSE.md +21 -0
  1132. package/skills/rust-mcp-server-generator/SKILL.md +577 -0
  1133. package/skills/rust-mcp-server-generator/SYNC.md +5 -0
  1134. package/skills/sandbox-npm-install/LICENSE.md +21 -0
  1135. package/skills/sandbox-npm-install/SKILL.md +80 -0
  1136. package/skills/sandbox-npm-install/SYNC.md +5 -0
  1137. package/skills/sandbox-npm-install/scripts/install.sh +193 -0
  1138. package/skills/scaffolding-oracle-to-postgres-migration-test-project/LICENSE.md +21 -0
  1139. package/skills/scaffolding-oracle-to-postgres-migration-test-project/SKILL.md +54 -0
  1140. package/skills/scaffolding-oracle-to-postgres-migration-test-project/SYNC.md +5 -0
  1141. package/skills/scoutqa-test/LICENSE.md +21 -0
  1142. package/skills/scoutqa-test/SKILL.md +375 -0
  1143. package/skills/scoutqa-test/SYNC.md +5 -0
  1144. package/skills/secret-scanning/LICENSE.md +21 -0
  1145. package/skills/secret-scanning/SKILL.md +224 -0
  1146. package/skills/secret-scanning/SYNC.md +5 -0
  1147. package/skills/secret-scanning/references/alerts-and-remediation.md +245 -0
  1148. package/skills/secret-scanning/references/custom-patterns.md +158 -0
  1149. package/skills/secret-scanning/references/push-protection.md +164 -0
  1150. package/skills/semantic-kernel/LICENSE.md +21 -0
  1151. package/skills/semantic-kernel/SKILL.md +56 -0
  1152. package/skills/semantic-kernel/SYNC.md +5 -0
  1153. package/skills/semantic-kernel/references/dotnet.md +15 -0
  1154. package/skills/semantic-kernel/references/python.md +15 -0
  1155. package/skills/shadcn/LICENSE.md +21 -0
  1156. package/skills/shadcn/SKILL.md +242 -0
  1157. package/skills/shadcn/SYNC.md +5 -0
  1158. package/skills/shadcn/agents/openai.yml +5 -0
  1159. package/skills/shadcn/assets/shadcn-small.png +0 -0
  1160. package/skills/shadcn/assets/shadcn.png +0 -0
  1161. package/skills/shadcn/cli.md +257 -0
  1162. package/skills/shadcn/customization.md +202 -0
  1163. package/skills/shadcn/evals/evals.json +47 -0
  1164. package/skills/shadcn/mcp.md +94 -0
  1165. package/skills/shadcn/rules/base-vs-radix.md +306 -0
  1166. package/skills/shadcn/rules/composition.md +195 -0
  1167. package/skills/shadcn/rules/forms.md +192 -0
  1168. package/skills/shadcn/rules/icons.md +101 -0
  1169. package/skills/shadcn/rules/styling.md +162 -0
  1170. package/skills/shuffle-json-data/LICENSE.md +21 -0
  1171. package/skills/shuffle-json-data/SKILL.md +150 -0
  1172. package/skills/shuffle-json-data/SYNC.md +5 -0
  1173. package/skills/skill-creator/LICENSE.txt +202 -0
  1174. package/skills/skill-creator/SKILL.md +485 -0
  1175. package/skills/skill-creator/SYNC.md +5 -0
  1176. package/skills/skill-creator/agents/analyzer.md +274 -0
  1177. package/skills/skill-creator/agents/comparator.md +202 -0
  1178. package/skills/skill-creator/agents/grader.md +223 -0
  1179. package/skills/skill-creator/assets/eval_review.html +146 -0
  1180. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  1181. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  1182. package/skills/skill-creator/references/schemas.md +430 -0
  1183. package/skills/skill-creator/scripts/__init__.py +0 -0
  1184. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  1185. package/skills/skill-creator/scripts/generate_report.py +326 -0
  1186. package/skills/skill-creator/scripts/improve_description.py +247 -0
  1187. package/skills/skill-creator/scripts/package_skill.py +136 -0
  1188. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  1189. package/skills/skill-creator/scripts/run_eval.py +310 -0
  1190. package/skills/skill-creator/scripts/run_loop.py +328 -0
  1191. package/skills/skill-creator/scripts/utils.py +47 -0
  1192. package/skills/slack-gif-creator/LICENSE.txt +202 -0
  1193. package/skills/slack-gif-creator/SKILL.md +254 -0
  1194. package/skills/slack-gif-creator/SYNC.md +5 -0
  1195. package/skills/slack-gif-creator/core/easing.py +234 -0
  1196. package/skills/slack-gif-creator/core/frame_composer.py +176 -0
  1197. package/skills/slack-gif-creator/core/gif_builder.py +269 -0
  1198. package/skills/slack-gif-creator/core/validators.py +136 -0
  1199. package/skills/slack-gif-creator/requirements.txt +4 -0
  1200. package/skills/snowflake-semanticview/LICENSE.md +21 -0
  1201. package/skills/snowflake-semanticview/SKILL.md +83 -0
  1202. package/skills/snowflake-semanticview/SYNC.md +5 -0
  1203. package/skills/sponsor-finder/LICENSE.md +21 -0
  1204. package/skills/sponsor-finder/SKILL.md +258 -0
  1205. package/skills/sponsor-finder/SYNC.md +5 -0
  1206. package/skills/spring-boot-testing/LICENSE.md +21 -0
  1207. package/skills/spring-boot-testing/SKILL.md +189 -0
  1208. package/skills/spring-boot-testing/SYNC.md +5 -0
  1209. package/skills/spring-boot-testing/references/assertj-basics.md +207 -0
  1210. package/skills/spring-boot-testing/references/assertj-collections.md +183 -0
  1211. package/skills/spring-boot-testing/references/context-caching.md +115 -0
  1212. package/skills/spring-boot-testing/references/datajpatest.md +197 -0
  1213. package/skills/spring-boot-testing/references/instancio.md +230 -0
  1214. package/skills/spring-boot-testing/references/mockitobean.md +232 -0
  1215. package/skills/spring-boot-testing/references/mockmvc-classic.md +206 -0
  1216. package/skills/spring-boot-testing/references/mockmvc-tester.md +311 -0
  1217. package/skills/spring-boot-testing/references/restclienttest.md +227 -0
  1218. package/skills/spring-boot-testing/references/resttestclient.md +278 -0
  1219. package/skills/spring-boot-testing/references/sb4-migration.md +181 -0
  1220. package/skills/spring-boot-testing/references/test-slices-overview.md +203 -0
  1221. package/skills/spring-boot-testing/references/testcontainers-jdbc.md +234 -0
  1222. package/skills/spring-boot-testing/references/webmvctest.md +177 -0
  1223. package/skills/sql-code-review/LICENSE.md +21 -0
  1224. package/skills/sql-code-review/SKILL.md +301 -0
  1225. package/skills/sql-code-review/SYNC.md +5 -0
  1226. package/skills/sql-optimization/LICENSE.md +21 -0
  1227. package/skills/sql-optimization/SKILL.md +296 -0
  1228. package/skills/sql-optimization/SYNC.md +5 -0
  1229. package/skills/structured-autonomy-generate/LICENSE.md +21 -0
  1230. package/skills/structured-autonomy-generate/SKILL.md +125 -0
  1231. package/skills/structured-autonomy-generate/SYNC.md +5 -0
  1232. package/skills/structured-autonomy-implement/LICENSE.md +21 -0
  1233. package/skills/structured-autonomy-implement/SKILL.md +19 -0
  1234. package/skills/structured-autonomy-implement/SYNC.md +5 -0
  1235. package/skills/structured-autonomy-plan/LICENSE.md +21 -0
  1236. package/skills/structured-autonomy-plan/SKILL.md +81 -0
  1237. package/skills/structured-autonomy-plan/SYNC.md +5 -0
  1238. package/skills/suggest-awesome-github-copilot-agents/LICENSE.md +21 -0
  1239. package/skills/suggest-awesome-github-copilot-agents/SKILL.md +106 -0
  1240. package/skills/suggest-awesome-github-copilot-agents/SYNC.md +5 -0
  1241. package/skills/suggest-awesome-github-copilot-instructions/LICENSE.md +21 -0
  1242. package/skills/suggest-awesome-github-copilot-instructions/SKILL.md +122 -0
  1243. package/skills/suggest-awesome-github-copilot-instructions/SYNC.md +5 -0
  1244. package/skills/suggest-awesome-github-copilot-skills/LICENSE.md +21 -0
  1245. package/skills/suggest-awesome-github-copilot-skills/SKILL.md +130 -0
  1246. package/skills/suggest-awesome-github-copilot-skills/SYNC.md +5 -0
  1247. package/skills/swift-mcp-server-generator/LICENSE.md +21 -0
  1248. package/skills/swift-mcp-server-generator/SKILL.md +669 -0
  1249. package/skills/swift-mcp-server-generator/SYNC.md +5 -0
  1250. package/skills/technology-stack-blueprint-generator/LICENSE.md +21 -0
  1251. package/skills/technology-stack-blueprint-generator/SKILL.md +242 -0
  1252. package/skills/technology-stack-blueprint-generator/SYNC.md +5 -0
  1253. package/skills/terraform-azurerm-set-diff-analyzer/LICENSE.md +21 -0
  1254. package/skills/terraform-azurerm-set-diff-analyzer/SKILL.md +48 -0
  1255. package/skills/terraform-azurerm-set-diff-analyzer/SYNC.md +5 -0
  1256. package/skills/terraform-azurerm-set-diff-analyzer/references/azurerm_set_attributes.json +154 -0
  1257. package/skills/terraform-azurerm-set-diff-analyzer/references/azurerm_set_attributes.md +145 -0
  1258. package/skills/terraform-azurerm-set-diff-analyzer/scripts/README.md +205 -0
  1259. package/skills/terraform-azurerm-set-diff-analyzer/scripts/analyze_plan.py +940 -0
  1260. package/skills/theme-factory/LICENSE.txt +202 -0
  1261. package/skills/theme-factory/SKILL.md +59 -0
  1262. package/skills/theme-factory/SYNC.md +5 -0
  1263. package/skills/theme-factory/theme-showcase.pdf +0 -0
  1264. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  1265. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  1266. package/skills/theme-factory/themes/desert-rose.md +19 -0
  1267. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  1268. package/skills/theme-factory/themes/golden-hour.md +19 -0
  1269. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  1270. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  1271. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  1272. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  1273. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  1274. package/skills/tldr-prompt/LICENSE.md +21 -0
  1275. package/skills/tldr-prompt/SKILL.md +304 -0
  1276. package/skills/tldr-prompt/SYNC.md +5 -0
  1277. package/skills/transloadit-media-processing/LICENSE.md +21 -0
  1278. package/skills/transloadit-media-processing/SKILL.md +194 -0
  1279. package/skills/transloadit-media-processing/SYNC.md +5 -0
  1280. package/skills/typescript-mcp-server-generator/LICENSE.md +21 -0
  1281. package/skills/typescript-mcp-server-generator/SKILL.md +90 -0
  1282. package/skills/typescript-mcp-server-generator/SYNC.md +5 -0
  1283. package/skills/typespec-api-operations/LICENSE.md +21 -0
  1284. package/skills/typespec-api-operations/SKILL.md +418 -0
  1285. package/skills/typespec-api-operations/SYNC.md +5 -0
  1286. package/skills/typespec-create-agent/LICENSE.md +21 -0
  1287. package/skills/typespec-create-agent/SKILL.md +91 -0
  1288. package/skills/typespec-create-agent/SYNC.md +5 -0
  1289. package/skills/typespec-create-api-plugin/LICENSE.md +21 -0
  1290. package/skills/typespec-create-api-plugin/SKILL.md +164 -0
  1291. package/skills/typespec-create-api-plugin/SYNC.md +5 -0
  1292. package/skills/unit-test-vue-pinia/LICENSE.md +21 -0
  1293. package/skills/unit-test-vue-pinia/SKILL.md +198 -0
  1294. package/skills/unit-test-vue-pinia/SYNC.md +5 -0
  1295. package/skills/unit-test-vue-pinia/references/pinia-patterns.md +95 -0
  1296. package/skills/update-avm-modules-in-bicep/LICENSE.md +21 -0
  1297. package/skills/update-avm-modules-in-bicep/SKILL.md +60 -0
  1298. package/skills/update-avm-modules-in-bicep/SYNC.md +5 -0
  1299. package/skills/update-implementation-plan/LICENSE.md +21 -0
  1300. package/skills/update-implementation-plan/SKILL.md +157 -0
  1301. package/skills/update-implementation-plan/SYNC.md +5 -0
  1302. package/skills/update-llms/LICENSE.md +21 -0
  1303. package/skills/update-llms/SKILL.md +216 -0
  1304. package/skills/update-llms/SYNC.md +5 -0
  1305. package/skills/update-markdown-file-index/LICENSE.md +21 -0
  1306. package/skills/update-markdown-file-index/SKILL.md +76 -0
  1307. package/skills/update-markdown-file-index/SYNC.md +5 -0
  1308. package/skills/update-specification/LICENSE.md +21 -0
  1309. package/skills/update-specification/SKILL.md +127 -0
  1310. package/skills/update-specification/SYNC.md +5 -0
  1311. package/skills/vscode-ext-commands/LICENSE.md +21 -0
  1312. package/skills/vscode-ext-commands/SKILL.md +21 -0
  1313. package/skills/vscode-ext-commands/SYNC.md +5 -0
  1314. package/skills/vscode-ext-localization/LICENSE.md +21 -0
  1315. package/skills/vscode-ext-localization/SKILL.md +25 -0
  1316. package/skills/vscode-ext-localization/SYNC.md +5 -0
  1317. package/skills/vue-best-practices/SYNC.md +1 -1
  1318. package/skills/vue-jsx-best-practices/SYNC.md +1 -1
  1319. package/skills/vue-options-api-best-practices/SYNC.md +1 -1
  1320. package/skills/vue-pinia-best-practices/SYNC.md +1 -1
  1321. package/skills/vue-router-best-practices/SYNC.md +1 -1
  1322. package/skills/vue-testing-best-practices/SYNC.md +1 -1
  1323. package/skills/web-artifacts-builder/LICENSE.txt +202 -0
  1324. package/skills/web-artifacts-builder/SKILL.md +74 -0
  1325. package/skills/web-artifacts-builder/SYNC.md +5 -0
  1326. package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  1327. package/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  1328. package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  1329. package/skills/web-coder/LICENSE.md +21 -0
  1330. package/skills/web-coder/SKILL.md +563 -0
  1331. package/skills/web-coder/SYNC.md +5 -0
  1332. package/skills/web-coder/references/accessibility.md +346 -0
  1333. package/skills/web-coder/references/architecture-patterns.md +625 -0
  1334. package/skills/web-coder/references/browsers-engines.md +358 -0
  1335. package/skills/web-coder/references/css-styling.md +696 -0
  1336. package/skills/web-coder/references/data-formats-encoding.md +411 -0
  1337. package/skills/web-coder/references/development-tools.md +502 -0
  1338. package/skills/web-coder/references/glossary.md +649 -0
  1339. package/skills/web-coder/references/html-markup.md +387 -0
  1340. package/skills/web-coder/references/http-networking.md +538 -0
  1341. package/skills/web-coder/references/javascript-programming.md +807 -0
  1342. package/skills/web-coder/references/media-graphics.md +504 -0
  1343. package/skills/web-coder/references/performance-optimization.md +546 -0
  1344. package/skills/web-coder/references/security-authentication.md +603 -0
  1345. package/skills/web-coder/references/servers-infrastructure.md +615 -0
  1346. package/skills/web-coder/references/web-apis-dom.md +654 -0
  1347. package/skills/web-coder/references/web-protocols-standards.md +265 -0
  1348. package/skills/web-design-reviewer/LICENSE.md +21 -0
  1349. package/skills/web-design-reviewer/SKILL.md +368 -0
  1350. package/skills/web-design-reviewer/SYNC.md +5 -0
  1351. package/skills/web-design-reviewer/references/framework-fixes.md +475 -0
  1352. package/skills/web-design-reviewer/references/visual-checklist.md +236 -0
  1353. package/skills/webapp-testing/LICENSE.md +21 -0
  1354. package/skills/webapp-testing/SKILL.md +133 -0
  1355. package/skills/webapp-testing/SYNC.md +5 -0
  1356. package/skills/webapp-testing/assets/test-helper.js +56 -0
  1357. package/skills/what-context-needed/LICENSE.md +21 -0
  1358. package/skills/what-context-needed/SKILL.md +39 -0
  1359. package/skills/what-context-needed/SYNC.md +5 -0
  1360. package/skills/winapp-cli/LICENSE.md +21 -0
  1361. package/skills/winapp-cli/SKILL.md +217 -0
  1362. package/skills/winapp-cli/SYNC.md +5 -0
  1363. package/skills/winmd-api-search/LICENSE.md +21 -0
  1364. package/skills/winmd-api-search/LICENSE.txt +21 -0
  1365. package/skills/winmd-api-search/SKILL.md +192 -0
  1366. package/skills/winmd-api-search/SYNC.md +5 -0
  1367. package/skills/winmd-api-search/scripts/Invoke-WinMdQuery.ps1 +505 -0
  1368. package/skills/winmd-api-search/scripts/Update-WinMdCache.ps1 +208 -0
  1369. package/skills/winmd-api-search/scripts/cache-generator/CacheGenerator.csproj +29 -0
  1370. package/skills/winmd-api-search/scripts/cache-generator/Directory.Build.props +3 -0
  1371. package/skills/winmd-api-search/scripts/cache-generator/Directory.Build.targets +3 -0
  1372. package/skills/winmd-api-search/scripts/cache-generator/Directory.Packages.props +3 -0
  1373. package/skills/winmd-api-search/scripts/cache-generator/Program.cs +1222 -0
  1374. package/skills/winui3-migration-guide/LICENSE.md +21 -0
  1375. package/skills/winui3-migration-guide/SKILL.md +277 -0
  1376. package/skills/winui3-migration-guide/SYNC.md +5 -0
  1377. package/skills/workiq-copilot/LICENSE.md +21 -0
  1378. package/skills/workiq-copilot/SKILL.md +98 -0
  1379. package/skills/workiq-copilot/SYNC.md +5 -0
  1380. package/skills/write-coding-standards-from-file/LICENSE.md +21 -0
  1381. package/skills/write-coding-standards-from-file/SKILL.md +316 -0
  1382. package/skills/write-coding-standards-from-file/SYNC.md +5 -0
  1383. package/skills/xlsx/LICENSE.txt +30 -0
  1384. package/skills/xlsx/SKILL.md +292 -0
  1385. package/skills/xlsx/SYNC.md +5 -0
  1386. package/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  1387. package/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  1388. package/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  1389. package/skills/xlsx/scripts/office/pack.py +159 -0
  1390. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  1391. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  1392. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  1393. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  1394. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  1395. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  1396. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  1397. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  1398. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  1399. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  1400. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  1401. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  1402. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  1403. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  1404. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  1405. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  1406. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  1407. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  1408. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  1409. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  1410. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  1411. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  1412. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  1413. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  1414. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  1415. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  1416. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  1417. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  1418. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  1419. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  1420. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  1421. package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  1422. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  1423. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  1424. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  1425. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  1426. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  1427. package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  1428. package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  1429. package/skills/xlsx/scripts/office/soffice.py +183 -0
  1430. package/skills/xlsx/scripts/office/unpack.py +132 -0
  1431. package/skills/xlsx/scripts/office/validate.py +111 -0
  1432. package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  1433. package/skills/xlsx/scripts/office/validators/base.py +847 -0
  1434. package/skills/xlsx/scripts/office/validators/docx.py +446 -0
  1435. package/skills/xlsx/scripts/office/validators/pptx.py +275 -0
  1436. package/skills/xlsx/scripts/office/validators/redlining.py +247 -0
  1437. package/skills/xlsx/scripts/recalc.py +184 -0
@@ -0,0 +1,1855 @@
1
+ # 2D Platform Game Template
2
+
3
+ A complete step-by-step guide for building a 2D platformer game using Phaser (v2.x / Phaser CE) with Arcade Physics. This template walks through every stage of development: setting up the project, creating platforms from JSON level data, adding a hero with physics-based movement and jumping, collectible coins, walking enemies, death and stomp mechanics, a scoreboard, sprite animations, win conditions with a door/key system, and multi-level progression.
4
+
5
+ **What you will build:** A classic side-scrolling platformer where a hero navigates platforms, collects coins, avoids or stomps on spider enemies, finds a key to unlock a door, and progresses through multiple levels -- with score tracking, animations, and physics.
6
+
7
+ **Prerequisites:** Basic to intermediate JavaScript knowledge, familiarity with HTML, and a local web server for development (e.g., browser-sync, live-server, or Python's SimpleHTTPServer).
8
+
9
+ **Source:** Based on the [Mozilla HTML5 Games Workshop - Platformer](https://mozdevs.github.io/html5-games-workshop/en/guides/platformer/start-here/). Project starter files available at the workshop repository.
10
+
11
+ ---
12
+
13
+ ## Start Here
14
+
15
+ This tutorial builds a 2D platformer using the **Phaser** framework. Phaser handles rendering, physics, input, audio, and asset loading so you can focus on game logic.
16
+
17
+ ### What You Will Build
18
+
19
+ The finished game features:
20
+
21
+ - A hero character the player controls with the keyboard
22
+ - Platforms the hero can walk and jump on
23
+ - Collectible coins that increase the score
24
+ - Walking spider enemies that kill the hero on contact (but can be stomped from above)
25
+ - A key and door system: the hero must pick up a key to unlock the door and complete the level
26
+ - Multiple levels loaded from JSON data files
27
+ - A scoreboard showing collected coins
28
+ - Sprite animations for the hero (idle, running, jumping, falling)
29
+
30
+ ### Project Structure
31
+
32
+ ```
33
+ project/
34
+ index.html
35
+ js/
36
+ phaser.min.js (Phaser 2.6.2 or Phaser CE)
37
+ main.js (all game code goes here)
38
+ audio/
39
+ sfx/
40
+ jump.wav
41
+ coin.wav
42
+ stomp.wav
43
+ key.wav
44
+ door.wav
45
+ images/
46
+ background.png
47
+ ground.png
48
+ grass:8x1.png (platform tile images in various sizes)
49
+ grass:6x1.png
50
+ grass:4x1.png
51
+ grass:2x1.png
52
+ grass:1x1.png
53
+ hero.png (hero spritesheet: 36x42 per frame)
54
+ hero_stopped.png (single frame for initial steps)
55
+ coin_animated.png (coin spritesheet)
56
+ spider.png (spider spritesheet)
57
+ invisible_wall.png (invisible boundary for enemy AI)
58
+ key.png (key spritesheet)
59
+ door.png (door spritesheet)
60
+ key_icon.png (HUD icon for key)
61
+ font:numbers.png (bitmap font for score)
62
+ data/
63
+ level00.json
64
+ level01.json
65
+ ```
66
+
67
+ ### Level Data Format
68
+
69
+ Each level is defined in a JSON file. The JSON structure describes positions of every entity:
70
+
71
+ ```json
72
+ {
73
+ "hero": { "x": 21, "y": 525 },
74
+ "door": { "x": 169, "y": 546 },
75
+ "key": { "x": 750, "y": 524 },
76
+ "platforms": [
77
+ { "image": "ground", "x": 0, "y": 546 },
78
+ { "image": "grass:8x1", "x": 208, "y": 420 },
79
+ { "image": "grass:4x1", "x": 420, "y": 336 },
80
+ { "image": "grass:2x1", "x": 680, "y": 252 }
81
+ ],
82
+ "coins": [
83
+ { "x": 147, "y": 525 },
84
+ { "x": 189, "y": 525 },
85
+ { "x": 399, "y": 399 },
86
+ { "x": 441, "y": 336 }
87
+ ],
88
+ "spiders": [
89
+ { "x": 121, "y": 399 }
90
+ ],
91
+ "decoration": {
92
+ "grass": [
93
+ { "x": 84, "y": 504, "frame": 0 },
94
+ { "x": 420, "y": 504, "frame": 1 }
95
+ ]
96
+ }
97
+ }
98
+ ```
99
+
100
+ Each entity type (hero, door, key, platforms, coins, spiders) has `x` and `y` coordinates. Platforms also specify which `image` asset to use for that platform tile.
101
+
102
+ ---
103
+
104
+ ## Initialise Phaser
105
+
106
+ The first step is setting up the HTML file and creating the Phaser game instance.
107
+
108
+ ### HTML Entry Point
109
+
110
+ Create an `index.html` file that loads Phaser and your game script:
111
+
112
+ ```html
113
+ <!doctype html>
114
+ <html lang="en">
115
+ <head>
116
+ <meta charset="utf-8">
117
+ <title>Platformer Game</title>
118
+ <style>
119
+ html, body {
120
+ margin: 0;
121
+ padding: 0;
122
+ background: #000;
123
+ }
124
+ </style>
125
+ <script src="js/phaser.min.js"></script>
126
+ <script src="js/main.js"></script>
127
+ </head>
128
+ <body>
129
+ <div id="game"></div>
130
+ </body>
131
+ </html>
132
+ ```
133
+
134
+ - The `<div id="game">` is the container where Phaser will insert the game canvas.
135
+ - Phaser is loaded first, then your game script.
136
+
137
+ ### Creating the Game Instance
138
+
139
+ In `js/main.js`, create the Phaser game object and register a game state:
140
+
141
+ ```javascript
142
+ // Create a Phaser game instance
143
+ // Parameters: width, height, renderer, DOM element ID
144
+ window.onload = function () {
145
+ let game = new Phaser.Game(960, 600, Phaser.AUTO, 'game');
146
+
147
+ // Add and start the play state
148
+ game.state.add('play', PlayState);
149
+ game.state.start('play');
150
+ };
151
+ ```
152
+
153
+ - `960, 600` sets the game canvas dimensions in pixels.
154
+ - `Phaser.AUTO` lets Phaser choose between WebGL and Canvas rendering automatically.
155
+ - `'game'` is the ID of the DOM element that will contain the canvas.
156
+
157
+ ### The PlayState Object
158
+
159
+ Define the game state as an object with lifecycle methods:
160
+
161
+ ```javascript
162
+ PlayState = {};
163
+
164
+ PlayState.init = function () {
165
+ // Called first when the state starts
166
+ };
167
+
168
+ PlayState.preload = function () {
169
+ // Load all assets here
170
+ };
171
+
172
+ PlayState.create = function () {
173
+ // Create game entities and set up the world
174
+ };
175
+
176
+ PlayState.update = function () {
177
+ // Called every frame (~60 times per second)
178
+ // Handle game logic, input, collisions here
179
+ };
180
+ ```
181
+
182
+ - `init` -- runs first; used for configuration and receiving parameters.
183
+ - `preload` -- used to load all assets (images, audio, JSON) before the game starts.
184
+ - `create` -- called once after assets are loaded; used to create sprites, groups, and game objects.
185
+ - `update` -- called every frame at ~60fps; used for input handling, physics checks, and game logic.
186
+
187
+ At this point you should see an empty black canvas rendered on the page.
188
+
189
+ ---
190
+
191
+ ## The Game Loop
192
+
193
+ Phaser uses a game loop architecture. Every frame, Phaser calls `update()`, which is where you handle input, move sprites, and check collisions. Before the loop starts, `preload()` loads assets and `create()` sets up the initial game state.
194
+
195
+ ### Loading and Displaying the Background
196
+
197
+ Start by loading and displaying a background image to verify the game loop is working:
198
+
199
+ ```javascript
200
+ PlayState.preload = function () {
201
+ this.game.load.image('background', 'images/background.png');
202
+ };
203
+
204
+ PlayState.create = function () {
205
+ // Add the background image at position (0, 0)
206
+ this.game.add.image(0, 0, 'background');
207
+ };
208
+ ```
209
+
210
+ - `this.game.load.image(key, path)` loads an image and assigns it a key for later reference.
211
+ - `this.game.add.image(x, y, key)` creates a static image at the given position.
212
+
213
+ You should now see the background image rendered in the game canvas.
214
+
215
+ ### Understanding the Frame Cycle
216
+
217
+ ```
218
+ preload() -> [assets loaded] -> create() -> update() -> update() -> update() -> ...
219
+ ```
220
+
221
+ Each call to `update()` represents one frame. The game targets 60 frames per second. All movement, input reading, and collision detection happen inside `update()`.
222
+
223
+ ---
224
+
225
+ ## Creating Platforms
226
+
227
+ Platforms are the surfaces the hero walks and jumps on. They are loaded from the level JSON data and created as physics-enabled sprites arranged in a group.
228
+
229
+ ### Loading Platform Assets
230
+
231
+ Load the level JSON data and all platform tile images in `preload`:
232
+
233
+ ```javascript
234
+ PlayState.preload = function () {
235
+ this.game.load.image('background', 'images/background.png');
236
+
237
+ // Load level data
238
+ this.game.load.json('level:1', 'data/level01.json');
239
+
240
+ // Load platform images
241
+ this.game.load.image('ground', 'images/ground.png');
242
+ this.game.load.image('grass:8x1', 'images/grass_8x1.png');
243
+ this.game.load.image('grass:6x1', 'images/grass_6x1.png');
244
+ this.game.load.image('grass:4x1', 'images/grass_4x1.png');
245
+ this.game.load.image('grass:2x1', 'images/grass_2x1.png');
246
+ this.game.load.image('grass:1x1', 'images/grass_1x1.png');
247
+ };
248
+ ```
249
+
250
+ ### Spawning Platforms from Level Data
251
+
252
+ Create a method to load the level and spawn each platform as a sprite inside a physics group:
253
+
254
+ ```javascript
255
+ PlayState.create = function () {
256
+ // Add the background
257
+ this.game.add.image(0, 0, 'background');
258
+
259
+ // Load level data and spawn entities
260
+ this._loadLevel(this.game.cache.getJSON('level:1'));
261
+ };
262
+
263
+ PlayState._loadLevel = function (data) {
264
+ // Create a group for platforms
265
+ this.platforms = this.game.add.group();
266
+
267
+ // Spawn each platform from the level data
268
+ data.platforms.forEach(this._spawnPlatform, this);
269
+ };
270
+
271
+ PlayState._spawnPlatform = function (platform) {
272
+ // Add a sprite at the platform's position using the specified image
273
+ let sprite = this.platforms.create(platform.x, platform.y, platform.image);
274
+
275
+ // Enable physics on this platform
276
+ this.game.physics.enable(sprite);
277
+
278
+ // Make platform immovable so it doesn't get pushed by the hero
279
+ sprite.body.allowGravity = false;
280
+ sprite.body.immovable = true;
281
+ };
282
+ ```
283
+
284
+ - `this.game.add.group()` creates a Phaser group -- a container for related sprites that enables batch operations and collision detection.
285
+ - `this.platforms.create(x, y, key)` creates a sprite inside the group.
286
+ - `sprite.body.immovable = true` prevents the platform from being pushed by other physics bodies.
287
+ - `sprite.body.allowGravity = false` prevents platforms from falling due to gravity.
288
+
289
+ You should now see the ground and grass platform tiles rendered on the screen.
290
+
291
+ ---
292
+
293
+ ## The Main Character Sprite
294
+
295
+ Now add the hero character that the player will control.
296
+
297
+ ### Loading the Hero Image
298
+
299
+ Add the hero image to `preload`. Initially we use a single static image; we will switch to a spritesheet later for animations:
300
+
301
+ ```javascript
302
+ // In PlayState.preload:
303
+ this.game.load.image('hero', 'images/hero_stopped.png');
304
+ ```
305
+
306
+ ### Spawning the Hero
307
+
308
+ Add the hero to `_loadLevel` and create a spawn method:
309
+
310
+ ```javascript
311
+ PlayState._loadLevel = function (data) {
312
+ this.platforms = this.game.add.group();
313
+ data.platforms.forEach(this._spawnPlatform, this);
314
+
315
+ // Spawn the hero at the position defined in level data
316
+ this._spawnCharacters({ hero: data.hero });
317
+ };
318
+
319
+ PlayState._spawnCharacters = function (data) {
320
+ // Create the hero sprite
321
+ this.hero = this.game.add.sprite(data.hero.x, data.hero.y, 'hero');
322
+
323
+ // Set the anchor to the bottom-center for easier positioning
324
+ this.hero.anchor.set(0.5, 1);
325
+ };
326
+ ```
327
+
328
+ - `anchor.set(0.5, 1)` sets the sprite's origin point to the horizontal center and vertical bottom. This makes it easier to position the hero on top of platforms, since the `y` position refers to the hero's feet rather than the top-left corner.
329
+
330
+ ---
331
+
332
+ ## Keyboard Controls
333
+
334
+ Capture keyboard input so the player can move the hero left, right, and jump.
335
+
336
+ ### Setting Up Input Keys
337
+
338
+ In `init`, configure the keyboard controls:
339
+
340
+ ```javascript
341
+ PlayState.init = function () {
342
+ // Force integer rendering for pixel-art crispness
343
+ this.game.renderer.renderSession.roundPixels = true;
344
+
345
+ // Capture arrow keys
346
+ this.keys = this.game.input.keyboard.addKeys({
347
+ left: Phaser.KeyCode.LEFT,
348
+ right: Phaser.KeyCode.RIGHT,
349
+ up: Phaser.KeyCode.UP
350
+ });
351
+ };
352
+ ```
353
+
354
+ - `addKeys()` captures the specified keys and returns an object with key state references.
355
+ - `Phaser.KeyCode.LEFT`, `RIGHT`, `UP` correspond to the arrow keys.
356
+ - `renderSession.roundPixels = true` prevents pixel-art sprites from appearing blurry due to sub-pixel rendering.
357
+
358
+ ### Reading Input in Update
359
+
360
+ Handle the key states in `update`. For now, just log the direction; the next step adds physics-based movement:
361
+
362
+ ```javascript
363
+ PlayState.update = function () {
364
+ this._handleInput();
365
+ };
366
+
367
+ PlayState._handleInput = function () {
368
+ if (this.keys.left.isDown) {
369
+ // Move hero left
370
+ } else if (this.keys.right.isDown) {
371
+ // Move hero right
372
+ } else {
373
+ // Stop (no key held)
374
+ }
375
+ };
376
+ ```
377
+
378
+ - `this.keys.left.isDown` returns `true` while the left arrow key is held down.
379
+ - The `else` clause handles the case where neither left nor right is pressed (the hero should stop).
380
+
381
+ ---
382
+
383
+ ## Moving Sprites with Physics
384
+
385
+ Enable Arcade Physics so the hero can move with velocity and interact with platforms through collisions.
386
+
387
+ ### Enabling the Physics Engine
388
+
389
+ Enable Arcade Physics in `init`:
390
+
391
+ ```javascript
392
+ PlayState.init = function () {
393
+ this.game.renderer.renderSession.roundPixels = true;
394
+
395
+ this.keys = this.game.input.keyboard.addKeys({
396
+ left: Phaser.KeyCode.LEFT,
397
+ right: Phaser.KeyCode.RIGHT,
398
+ up: Phaser.KeyCode.UP
399
+ });
400
+
401
+ // Enable Arcade Physics
402
+ this.game.physics.startSystem(Phaser.Physics.ARCADE);
403
+ };
404
+ ```
405
+
406
+ ### Adding a Physics Body to the Hero
407
+
408
+ Enable physics on the hero sprite in `_spawnCharacters`:
409
+
410
+ ```javascript
411
+ PlayState._spawnCharacters = function (data) {
412
+ this.hero = this.game.add.sprite(data.hero.x, data.hero.y, 'hero');
413
+ this.hero.anchor.set(0.5, 1);
414
+
415
+ // Enable physics body on the hero
416
+ this.game.physics.enable(this.hero);
417
+ };
418
+ ```
419
+
420
+ ### Moving with Velocity
421
+
422
+ Now update `_handleInput` to set the hero's velocity based on key presses:
423
+
424
+ ```javascript
425
+ const SPEED = 200; // pixels per second
426
+
427
+ PlayState._handleInput = function () {
428
+ if (this.keys.left.isDown) {
429
+ this.hero.body.velocity.x = -SPEED;
430
+ } else if (this.keys.right.isDown) {
431
+ this.hero.body.velocity.x = SPEED;
432
+ } else {
433
+ this.hero.body.velocity.x = 0;
434
+ }
435
+ };
436
+ ```
437
+
438
+ - `body.velocity.x` sets the horizontal speed in pixels per second.
439
+ - A negative value moves the sprite left; positive moves it right.
440
+ - Setting velocity to `0` when no keys are pressed makes the hero stop immediately.
441
+
442
+ The hero can now move left and right, but will fall through platforms and off the screen because there is no gravity or collision handling yet.
443
+
444
+ ---
445
+
446
+ ## Gravity
447
+
448
+ Add gravity so the hero falls downward and collides with platforms.
449
+
450
+ ### Setting Global Gravity
451
+
452
+ Enable gravity for the entire physics world in `init`:
453
+
454
+ ```javascript
455
+ PlayState.init = function () {
456
+ this.game.renderer.renderSession.roundPixels = true;
457
+
458
+ this.keys = this.game.input.keyboard.addKeys({
459
+ left: Phaser.KeyCode.LEFT,
460
+ right: Phaser.KeyCode.RIGHT,
461
+ up: Phaser.KeyCode.UP
462
+ });
463
+
464
+ this.game.physics.startSystem(Phaser.Physics.ARCADE);
465
+
466
+ // Set global gravity
467
+ this.game.physics.arcade.gravity.y = 1200;
468
+ };
469
+ ```
470
+
471
+ - `gravity.y = 1200` applies a downward acceleration of 1200 pixels per second squared to all physics-enabled sprites (unless they opt out with `allowGravity = false`).
472
+
473
+ ### Collision Detection Between Hero and Platforms
474
+
475
+ Add collision detection in `update` so the hero lands on platforms instead of falling through:
476
+
477
+ ```javascript
478
+ PlayState.update = function () {
479
+ this._handleCollisions();
480
+ this._handleInput();
481
+ };
482
+
483
+ PlayState._handleCollisions = function () {
484
+ // Make the hero collide with the platform group
485
+ this.game.physics.arcade.collide(this.hero, this.platforms);
486
+ };
487
+ ```
488
+
489
+ - `arcade.collide(spriteA, groupB)` checks for physics collisions between the hero and every sprite in the platforms group. When the hero lands on a platform, the physics engine prevents it from passing through and resolves the overlap.
490
+ - It is important to call `_handleCollisions()` before `_handleInput()` so collision data (like whether the hero is touching the ground) is up to date when we process input.
491
+
492
+ The hero now falls due to gravity and lands on the platforms. You can walk left and right on the platforms.
493
+
494
+ ---
495
+
496
+ ## Jumps
497
+
498
+ Allow the hero to jump when the up arrow key is pressed -- but only when standing on a platform (no mid-air jumps).
499
+
500
+ ### Implementing the Jump Mechanic
501
+
502
+ Add a jump constant and update `_handleInput`:
503
+
504
+ ```javascript
505
+ const SPEED = 200;
506
+ const JUMP_SPEED = 600;
507
+
508
+ PlayState._handleInput = function () {
509
+ if (this.keys.left.isDown) {
510
+ this.hero.body.velocity.x = -SPEED;
511
+ } else if (this.keys.right.isDown) {
512
+ this.hero.body.velocity.x = SPEED;
513
+ } else {
514
+ this.hero.body.velocity.x = 0;
515
+ }
516
+
517
+ // Handle jumping
518
+ if (this.keys.up.isDown) {
519
+ this._jump();
520
+ }
521
+ };
522
+
523
+ PlayState._jump = function () {
524
+ let canJump = this.hero.body.touching.down;
525
+
526
+ if (canJump) {
527
+ this.hero.body.velocity.y = -JUMP_SPEED;
528
+ }
529
+
530
+ return canJump;
531
+ };
532
+ ```
533
+
534
+ - `this.hero.body.touching.down` is `true` when the hero's physics body is touching another body on its underside -- meaning the hero is standing on something.
535
+ - Setting `velocity.y` to a negative value launches the hero upward (the y-axis points downward in screen coordinates).
536
+ - The `canJump` check prevents the hero from jumping while already in the air, enforcing single-jump behavior.
537
+ - The method returns whether the jump was performed, which is useful later for playing sound effects.
538
+
539
+ ### Adding a Jump Sound Effect
540
+
541
+ Load a jump sound and play it on successful jumps:
542
+
543
+ ```javascript
544
+ // In PlayState.preload:
545
+ this.game.load.audio('sfx:jump', 'audio/sfx/jump.wav');
546
+
547
+ // In PlayState.create:
548
+ this.sfx = {
549
+ jump: this.game.add.audio('sfx:jump')
550
+ };
551
+
552
+ // In PlayState._jump, after setting velocity:
553
+ PlayState._jump = function () {
554
+ let canJump = this.hero.body.touching.down;
555
+
556
+ if (canJump) {
557
+ this.hero.body.velocity.y = -JUMP_SPEED;
558
+ this.sfx.jump.play();
559
+ }
560
+
561
+ return canJump;
562
+ };
563
+ ```
564
+
565
+ ---
566
+
567
+ ## Pickable Coins
568
+
569
+ Add collectible coins that the player can pick up to increase their score.
570
+
571
+ ### Loading Coin Assets
572
+
573
+ Load the coin spritesheet and coin sound effect in `preload`:
574
+
575
+ ```javascript
576
+ // In PlayState.preload:
577
+ this.game.load.spritesheet('coin', 'images/coin_animated.png', 22, 22);
578
+ this.game.load.audio('sfx:coin', 'audio/sfx/coin.wav');
579
+ ```
580
+
581
+ - `load.spritesheet(key, path, frameWidth, frameHeight)` loads a spritesheet and slices it into individual frames of 22x22 pixels for animation.
582
+
583
+ ### Spawning Coins from Level Data
584
+
585
+ Update `_loadLevel` to create a coins group and spawn each coin:
586
+
587
+ ```javascript
588
+ PlayState._loadLevel = function (data) {
589
+ this.platforms = this.game.add.group();
590
+ this.coins = this.game.add.group();
591
+
592
+ data.platforms.forEach(this._spawnPlatform, this);
593
+ data.coins.forEach(this._spawnCoin, this);
594
+
595
+ this._spawnCharacters({ hero: data.hero });
596
+ };
597
+
598
+ PlayState._spawnCoin = function (coin) {
599
+ let sprite = this.coins.create(coin.x, coin.y, 'coin');
600
+ sprite.anchor.set(0.5, 0.5);
601
+
602
+ // Add a tween animation to make the coin bob up and down
603
+ this.game.physics.enable(sprite);
604
+ sprite.body.allowGravity = false;
605
+
606
+ // Coin bobbing animation with a tween
607
+ sprite.animations.add('rotate', [0, 1, 2, 1], 6, true); // 6fps, looping
608
+ sprite.animations.play('rotate');
609
+ };
610
+ ```
611
+
612
+ - Each coin is created inside the `coins` group for easy collision detection.
613
+ - `allowGravity = false` prevents coins from falling.
614
+ - The `animations.add` creates a frame animation using the spritesheet frames 0, 1, 2, 1 at 6fps, looping continuously.
615
+
616
+ ### Collecting Coins
617
+
618
+ Add the coin sound to the sfx object and detect overlap between the hero and coins:
619
+
620
+ ```javascript
621
+ // In PlayState.create, add to the sfx object:
622
+ this.sfx = {
623
+ jump: this.game.add.audio('sfx:jump'),
624
+ coin: this.game.add.audio('sfx:coin')
625
+ };
626
+
627
+ // In PlayState._handleCollisions:
628
+ PlayState._handleCollisions = function () {
629
+ this.game.physics.arcade.collide(this.hero, this.platforms);
630
+
631
+ // Detect overlap between hero and coins (no physical collision, just overlap)
632
+ this.game.physics.arcade.overlap(
633
+ this.hero, this.coins, this._onHeroVsCoin, null, this
634
+ );
635
+ };
636
+
637
+ PlayState._onHeroVsCoin = function (hero, coin) {
638
+ this.sfx.coin.play();
639
+ coin.kill(); // Remove the coin from the game
640
+ this.coinPickupCount++;
641
+ };
642
+ ```
643
+
644
+ - `arcade.overlap()` checks if two sprites/groups overlap without resolving collisions physically. When an overlap is detected, it calls the callback function (`_onHeroVsCoin`).
645
+ - `coin.kill()` removes the coin sprite from the game world.
646
+ - `this.coinPickupCount` tracks the number of coins collected (initialize it in `_loadLevel`).
647
+
648
+ ### Initializing the Coin Counter
649
+
650
+ ```javascript
651
+ PlayState._loadLevel = function (data) {
652
+ this.platforms = this.game.add.group();
653
+ this.coins = this.game.add.group();
654
+
655
+ data.platforms.forEach(this._spawnPlatform, this);
656
+ data.coins.forEach(this._spawnCoin, this);
657
+
658
+ this._spawnCharacters({ hero: data.hero });
659
+
660
+ // Initialize coin counter
661
+ this.coinPickupCount = 0;
662
+ };
663
+ ```
664
+
665
+ ---
666
+
667
+ ## Walking Enemies
668
+
669
+ Add spider enemies that walk back and forth on platforms. The hero can stomp on them from above but dies if touching them from the side.
670
+
671
+ ### Loading Enemy Assets
672
+
673
+ ```javascript
674
+ // In PlayState.preload:
675
+ this.game.load.spritesheet('spider', 'images/spider.png', 42, 32);
676
+ this.game.load.image('invisible-wall', 'images/invisible_wall.png');
677
+ this.game.load.audio('sfx:stomp', 'audio/sfx/stomp.wav');
678
+ ```
679
+
680
+ - The spider spritsheet has frames for a crawling animation.
681
+ - Invisible walls are placed at platform edges to keep spiders from walking off -- they are not rendered visually but have physics bodies.
682
+
683
+ ### Spawning Enemies
684
+
685
+ Update `_loadLevel` and add a spawn method for spiders:
686
+
687
+ ```javascript
688
+ PlayState._loadLevel = function (data) {
689
+ this.platforms = this.game.add.group();
690
+ this.coins = this.game.add.group();
691
+ this.spiders = this.game.add.group();
692
+ this.enemyWalls = this.game.add.group();
693
+
694
+ data.platforms.forEach(this._spawnPlatform, this);
695
+ data.coins.forEach(this._spawnCoin, this);
696
+ data.spiders.forEach(this._spawnSpider, this);
697
+
698
+ this._spawnCharacters({ hero: data.hero });
699
+
700
+ // Make enemy walls invisible
701
+ this.enemyWalls.visible = false;
702
+
703
+ this.coinPickupCount = 0;
704
+ };
705
+ ```
706
+
707
+ ### Creating Invisible Walls on Platforms
708
+
709
+ Modify `_spawnPlatform` to add invisible walls at both edges of each platform:
710
+
711
+ ```javascript
712
+ PlayState._spawnPlatform = function (platform) {
713
+ let sprite = this.platforms.create(platform.x, platform.y, platform.image);
714
+ this.game.physics.enable(sprite);
715
+ sprite.body.allowGravity = false;
716
+ sprite.body.immovable = true;
717
+
718
+ // Spawn invisible walls at the left and right edges of this platform
719
+ this._spawnEnemyWall(platform.x, platform.y, 'left');
720
+ this._spawnEnemyWall(platform.x + sprite.width, platform.y, 'right');
721
+ };
722
+
723
+ PlayState._spawnEnemyWall = function (x, y, side) {
724
+ let sprite = this.enemyWalls.create(x, y, 'invisible-wall');
725
+
726
+ // Anchor to the bottom of the wall and adjust position based on side
727
+ sprite.anchor.set(side === 'left' ? 1 : 0, 1);
728
+
729
+ this.game.physics.enable(sprite);
730
+ sprite.body.immovable = true;
731
+ sprite.body.allowGravity = false;
732
+ };
733
+ ```
734
+
735
+ - Each platform gets two invisible walls, one at each edge.
736
+ - The walls act as barriers that prevent spiders from walking off the edge.
737
+ - The anchor is set so the wall aligns to the correct side of the platform.
738
+
739
+ ### Spawning and Animating Spiders
740
+
741
+ ```javascript
742
+ PlayState._spawnSpider = function (spider) {
743
+ let sprite = this.spiders.create(spider.x, spider.y, 'spider');
744
+ sprite.anchor.set(0.5, 1);
745
+
746
+ // Add the crawl animation
747
+ sprite.animations.add('crawl', [0, 1, 2], 8, true);
748
+ sprite.animations.add('die', [0, 4, 0, 4, 0, 4, 3, 3, 3, 3, 3, 3], 12);
749
+ sprite.animations.play('crawl');
750
+
751
+ // Enable physics
752
+ this.game.physics.enable(sprite);
753
+
754
+ // Set initial movement speed
755
+ sprite.body.velocity.x = Spider.SPEED;
756
+ };
757
+
758
+ // Spider speed constant
759
+ const Spider = { SPEED: 100 };
760
+ ```
761
+
762
+ - Spiders have two animations: `crawl` (looping) and `die` (played once on death).
763
+ - `velocity.x = 100` starts the spider moving to the right at 100 pixels per second.
764
+
765
+ ### Making Spiders Bounce Off Walls
766
+
767
+ Add collision handling so spiders reverse direction when hitting invisible walls or platform edges:
768
+
769
+ ```javascript
770
+ // In PlayState._handleCollisions:
771
+ PlayState._handleCollisions = function () {
772
+ this.game.physics.arcade.collide(this.hero, this.platforms);
773
+ this.game.physics.arcade.collide(this.spiders, this.platforms);
774
+ this.game.physics.arcade.collide(this.spiders, this.enemyWalls);
775
+
776
+ this.game.physics.arcade.overlap(
777
+ this.hero, this.coins, this._onHeroVsCoin, null, this
778
+ );
779
+ this.game.physics.arcade.overlap(
780
+ this.hero, this.spiders, this._onHeroVsEnemy, null, this
781
+ );
782
+ };
783
+ ```
784
+
785
+ To make spiders reverse direction when colliding with walls, check their velocity each frame and flip them:
786
+
787
+ ```javascript
788
+ // In PlayState.update, after collision handling, update spider directions:
789
+ PlayState.update = function () {
790
+ this._handleCollisions();
791
+ this._handleInput();
792
+
793
+ // Update spider facing direction based on velocity
794
+ this.spiders.forEach(function (spider) {
795
+ if (spider.body.touching.right || spider.body.blocked.right) {
796
+ spider.body.velocity.x = -Spider.SPEED; // Turn left
797
+ } else if (spider.body.touching.left || spider.body.blocked.left) {
798
+ spider.body.velocity.x = Spider.SPEED; // Turn right
799
+ }
800
+ }, this);
801
+ };
802
+ ```
803
+
804
+ - When a spider touches a wall on its right side, it reverses to move left, and vice versa.
805
+ - `body.touching` is set by Phaser after collision resolution.
806
+
807
+ ---
808
+
809
+ ## Death
810
+
811
+ Implement hero death when touching enemies and the stomp mechanic for killing enemies.
812
+
813
+ ### Hero vs Enemy: Stomp or Die
814
+
815
+ When the hero overlaps with a spider, check if the hero is falling (stomping) or not:
816
+
817
+ ```javascript
818
+ PlayState._onHeroVsEnemy = function (hero, enemy) {
819
+ if (hero.body.velocity.y > 0) {
820
+ // Hero is falling -> stomp the enemy
821
+ enemy.body.velocity.x = 0; // Stop enemy movement
822
+ enemy.body.enable = false; // Disable enemy physics
823
+
824
+ // Play die animation then remove the enemy
825
+ enemy.animations.play('die');
826
+ enemy.events.onAnimationComplete.addOnce(function () {
827
+ enemy.kill();
828
+ });
829
+
830
+ // Bounce the hero up after stomping
831
+ hero.body.velocity.y = -JUMP_SPEED / 2;
832
+
833
+ this.sfx.stomp.play();
834
+ } else {
835
+ // Hero touched enemy from side or below -> die
836
+ this._killHero();
837
+ }
838
+ };
839
+
840
+ PlayState._killHero = function () {
841
+ this.hero.kill();
842
+ // Restart the level after a short delay
843
+ this.game.time.events.add(500, function () {
844
+ this.game.state.restart(true, false, { level: this.level });
845
+ }, this);
846
+ };
847
+ ```
848
+
849
+ - If `hero.body.velocity.y > 0`, the hero is moving downward (falling), indicating a stomp.
850
+ - On stomp: the enemy stops, plays its death animation, and is removed. The hero bounces up.
851
+ - If the hero is not falling, the hero dies. `this.hero.kill()` removes the hero from the game.
852
+ - After 500ms, the entire state is restarted, effectively reloading the level.
853
+
854
+ ### Add Stomp Sound
855
+
856
+ ```javascript
857
+ // In PlayState.create, add to sfx:
858
+ this.sfx = {
859
+ jump: this.game.add.audio('sfx:jump'),
860
+ coin: this.game.add.audio('sfx:coin'),
861
+ stomp: this.game.add.audio('sfx:stomp')
862
+ };
863
+ ```
864
+
865
+ ### Adding a Death Animation for the Hero
866
+
867
+ Make the hero flash and fall off the screen when dying:
868
+
869
+ ```javascript
870
+ PlayState._killHero = function () {
871
+ this.hero.alive = false;
872
+
873
+ // Play a "dying" visual: the hero jumps up and falls off screen
874
+ this.hero.body.velocity.y = -JUMP_SPEED / 2;
875
+ this.hero.body.velocity.x = 0;
876
+ this.hero.body.allowGravity = true;
877
+
878
+ // Disable collisions so the hero falls through platforms
879
+ this.hero.body.collideWorldBounds = false;
880
+
881
+ // Restart after a delay
882
+ this.game.time.events.add(1000, function () {
883
+ this.game.state.restart(true, false, { level: this.level });
884
+ }, this);
885
+ };
886
+ ```
887
+
888
+ ### Guarding Input When Dead
889
+
890
+ Prevent input from controlling the hero after death:
891
+
892
+ ```javascript
893
+ PlayState._handleInput = function () {
894
+ if (!this.hero.alive) { return; }
895
+
896
+ if (this.keys.left.isDown) {
897
+ this.hero.body.velocity.x = -SPEED;
898
+ } else if (this.keys.right.isDown) {
899
+ this.hero.body.velocity.x = SPEED;
900
+ } else {
901
+ this.hero.body.velocity.x = 0;
902
+ }
903
+
904
+ if (this.keys.up.isDown) {
905
+ this._jump();
906
+ }
907
+ };
908
+ ```
909
+
910
+ - `this.hero.alive` is set to `false` in `_killHero`, so input is ignored after death and the hero falls off screen naturally.
911
+
912
+ ---
913
+
914
+ ## Scoreboard
915
+
916
+ Display the number of collected coins on screen using a bitmap font.
917
+
918
+ ### Loading the Bitmap Font
919
+
920
+ ```javascript
921
+ // In PlayState.preload:
922
+ this.game.load.image('font:numbers', 'images/numbers.png');
923
+ this.game.load.image('icon:coin', 'images/coin_icon.png');
924
+ ```
925
+
926
+ ### Creating the HUD
927
+
928
+ Create a fixed HUD (heads-up display) that shows the coin icon and count:
929
+
930
+ ```javascript
931
+ PlayState._createHud = function () {
932
+ let coinIcon = this.game.make.image(0, 0, 'icon:coin');
933
+
934
+ // Create a dynamic text label for the coin count
935
+ this.hud = this.game.add.group();
936
+
937
+ // Use a retroFont or a regular text object for the score
938
+ let scoreStyle = {
939
+ font: '30px monospace',
940
+ fill: '#fff'
941
+ };
942
+ this.coinFont = this.game.add.text(
943
+ coinIcon.width + 7, 0, 'x0', scoreStyle
944
+ );
945
+
946
+ this.hud.add(coinIcon);
947
+ this.hud.add(this.coinFont);
948
+
949
+ this.hud.position.set(10, 10);
950
+ this.hud.fixedToCamera = true;
951
+ };
952
+ ```
953
+
954
+ Alternatively, using Phaser's `RetroFont` for pixel-art number rendering:
955
+
956
+ ```javascript
957
+ PlayState._createHud = function () {
958
+ // Bitmap-based number rendering using RetroFont
959
+ this.coinFont = this.game.add.retroFont(
960
+ 'font:numbers', 20, 26,
961
+ '0123456789X ', 6
962
+ );
963
+
964
+ let coinIcon = this.game.make.image(0, 0, 'icon:coin');
965
+
966
+ let coinScoreImg = this.game.make.image(
967
+ coinIcon.x + coinIcon.width + 7, 0, this.coinFont
968
+ );
969
+
970
+ this.hud = this.game.add.group();
971
+ this.hud.add(coinIcon);
972
+ this.hud.add(coinScoreImg);
973
+ this.hud.position.set(10, 10);
974
+ this.hud.fixedToCamera = true;
975
+ };
976
+ ```
977
+
978
+ - `retroFont` creates a bitmap font from a spritesheet containing character glyphs.
979
+ - Parameters: image key, character width, character height, character set string, number of characters per row.
980
+
981
+ ### Calling createHud in create
982
+
983
+ ```javascript
984
+ PlayState.create = function () {
985
+ this.game.add.image(0, 0, 'background');
986
+
987
+ this._loadLevel(this.game.cache.getJSON('level:1'));
988
+
989
+ // Create the HUD
990
+ this._createHud();
991
+ };
992
+ ```
993
+
994
+ ### Updating the Score Display
995
+
996
+ Update the score text whenever a coin is collected:
997
+
998
+ ```javascript
999
+ PlayState._onHeroVsCoin = function (hero, coin) {
1000
+ this.sfx.coin.play();
1001
+ coin.kill();
1002
+ this.coinPickupCount++;
1003
+
1004
+ // Update the HUD
1005
+ this.coinFont.text = 'x' + this.coinPickupCount;
1006
+ };
1007
+ ```
1008
+
1009
+ ---
1010
+
1011
+ ## Animations for the Main Character
1012
+
1013
+ Replace the static hero image with a spritesheet and add animations for different states: idle (stopped), running, jumping, and falling.
1014
+
1015
+ ### Loading the Hero Spritesheet
1016
+
1017
+ Replace the single image load with a spritesheet in `preload`:
1018
+
1019
+ ```javascript
1020
+ // Replace: this.game.load.image('hero', 'images/hero_stopped.png');
1021
+ // With:
1022
+ this.game.load.spritesheet('hero', 'images/hero.png', 36, 42);
1023
+ ```
1024
+
1025
+ - The hero spritesheet is 36 pixels wide and 42 pixels tall per frame.
1026
+ - Frames include idle, walk cycle, jump, and fall poses.
1027
+
1028
+ ### Defining Animations
1029
+
1030
+ In `_spawnCharacters`, add animation definitions after creating the hero sprite:
1031
+
1032
+ ```javascript
1033
+ PlayState._spawnCharacters = function (data) {
1034
+ this.hero = this.game.add.sprite(data.hero.x, data.hero.y, 'hero');
1035
+ this.hero.anchor.set(0.5, 1);
1036
+ this.game.physics.enable(this.hero);
1037
+
1038
+ // Define animations
1039
+ this.hero.animations.add('stop', [0]); // Single frame: idle
1040
+ this.hero.animations.add('run', [1, 2], 8, true); // 2 frames at 8fps, looping
1041
+ this.hero.animations.add('jump', [3]); // Single frame: jumping up
1042
+ this.hero.animations.add('fall', [4]); // Single frame: falling down
1043
+ };
1044
+ ```
1045
+
1046
+ - `animations.add(name, frames, fps, loop)` registers an animation with the given name.
1047
+ - Single-frame animations like `stop`, `jump`, and `fall` effectively set a static pose.
1048
+ - The `run` animation alternates between frames 1 and 2 at 8fps.
1049
+
1050
+ ### Playing the Correct Animation
1051
+
1052
+ Add a method to determine and play the right animation based on the hero's current state:
1053
+
1054
+ ```javascript
1055
+ PlayState._getAnimationName = function () {
1056
+ let name = 'stop'; // Default: standing still
1057
+
1058
+ if (!this.hero.alive) {
1059
+ name = 'stop'; // Use idle frame when dead
1060
+ } else if (this.hero.body.velocity.y < 0) {
1061
+ name = 'jump'; // Moving upward
1062
+ } else if (this.hero.body.velocity.y > 0 && !this.hero.body.touching.down) {
1063
+ name = 'fall'; // Moving downward and not on ground
1064
+ } else if (this.hero.body.velocity.x !== 0 && this.hero.body.touching.down) {
1065
+ name = 'run'; // Moving horizontally on the ground
1066
+ }
1067
+
1068
+ return name;
1069
+ };
1070
+ ```
1071
+
1072
+ ### Flipping the Sprite Based on Direction
1073
+
1074
+ Update the hero's facing direction and play the animation in `update`:
1075
+
1076
+ ```javascript
1077
+ PlayState.update = function () {
1078
+ this._handleCollisions();
1079
+ this._handleInput();
1080
+
1081
+ // Flip sprite based on movement direction
1082
+ if (this.hero.body.velocity.x < 0) {
1083
+ this.hero.scale.x = -1; // Face left
1084
+ } else if (this.hero.body.velocity.x > 0) {
1085
+ this.hero.scale.x = 1; // Face right
1086
+ }
1087
+
1088
+ // Play the appropriate animation
1089
+ this.hero.animations.play(this._getAnimationName());
1090
+
1091
+ // Update spider directions
1092
+ this.spiders.forEach(function (spider) {
1093
+ if (spider.body.touching.right || spider.body.blocked.right) {
1094
+ spider.body.velocity.x = -Spider.SPEED;
1095
+ } else if (spider.body.touching.left || spider.body.blocked.left) {
1096
+ spider.body.velocity.x = Spider.SPEED;
1097
+ }
1098
+ }, this);
1099
+ };
1100
+ ```
1101
+
1102
+ - `this.hero.scale.x = -1` flips the sprite horizontally to face left. Setting it to `1` faces right. Because the anchor is at `(0.5, 1)`, the flip looks natural.
1103
+ - `animations.play()` only restarts the animation if the name changes, so calling it every frame is safe and efficient.
1104
+
1105
+ ---
1106
+
1107
+ ## Win Condition
1108
+
1109
+ Add a door and key mechanic: the hero must collect a key, then reach the door to complete the level.
1110
+
1111
+ ### Loading Door and Key Assets
1112
+
1113
+ ```javascript
1114
+ // In PlayState.preload:
1115
+ this.game.load.spritesheet('door', 'images/door.png', 42, 66);
1116
+ this.game.load.spritesheet('key', 'images/key.png', 20, 22); // Key bobbing animation
1117
+ this.game.load.image('icon:key', 'images/key_icon.png');
1118
+
1119
+ this.game.load.audio('sfx:key', 'audio/sfx/key.wav');
1120
+ this.game.load.audio('sfx:door', 'audio/sfx/door.wav');
1121
+ ```
1122
+
1123
+ ### Spawning the Door and Key
1124
+
1125
+ Update `_loadLevel` and `_spawnCharacters`:
1126
+
1127
+ ```javascript
1128
+ PlayState._loadLevel = function (data) {
1129
+ this.platforms = this.game.add.group();
1130
+ this.coins = this.game.add.group();
1131
+ this.spiders = this.game.add.group();
1132
+ this.enemyWalls = this.game.add.group();
1133
+ this.bgDecoration = this.game.add.group();
1134
+
1135
+ // Must spawn decorations first (background layer)
1136
+ // Spawn door before hero so it renders behind the hero
1137
+ data.platforms.forEach(this._spawnPlatform, this);
1138
+ data.coins.forEach(this._spawnCoin, this);
1139
+ data.spiders.forEach(this._spawnSpider, this);
1140
+
1141
+ this._spawnDoor(data.door.x, data.door.y);
1142
+ this._spawnKey(data.key.x, data.key.y);
1143
+ this._spawnCharacters({ hero: data.hero });
1144
+
1145
+ this.enemyWalls.visible = false;
1146
+
1147
+ this.coinPickupCount = 0;
1148
+ this.hasKey = false;
1149
+ };
1150
+
1151
+ PlayState._spawnDoor = function (x, y) {
1152
+ this.door = this.bgDecoration.create(x, y, 'door');
1153
+ this.door.anchor.setTo(0.5, 1);
1154
+
1155
+ this.game.physics.enable(this.door);
1156
+ this.door.body.allowGravity = false;
1157
+ };
1158
+
1159
+ PlayState._spawnKey = function (x, y) {
1160
+ this.key = this.bgDecoration.create(x, y, 'key');
1161
+ this.key.anchor.set(0.5, 0.5);
1162
+
1163
+ this.game.physics.enable(this.key);
1164
+ this.key.body.allowGravity = false;
1165
+
1166
+ // Add a bobbing up-and-down tween to the key
1167
+ this.key.y -= 3;
1168
+ this.game.add.tween(this.key)
1169
+ .to({ y: this.key.y + 6 }, 800, Phaser.Easing.Sinusoidal.InOut)
1170
+ .yoyo(true)
1171
+ .loop()
1172
+ .start();
1173
+ };
1174
+ ```
1175
+
1176
+ - The door is placed in a background decoration group so it renders behind the hero.
1177
+ - The key has a sinusoidal bobbing tween that moves it 6 pixels up and down over 800ms, looping forever.
1178
+
1179
+ ### Collecting the Key and Opening the Door
1180
+
1181
+ Add key and door sound effects to the sfx object:
1182
+
1183
+ ```javascript
1184
+ // In PlayState.create sfx:
1185
+ this.sfx = {
1186
+ jump: this.game.add.audio('sfx:jump'),
1187
+ coin: this.game.add.audio('sfx:coin'),
1188
+ stomp: this.game.add.audio('sfx:stomp'),
1189
+ key: this.game.add.audio('sfx:key'),
1190
+ door: this.game.add.audio('sfx:door')
1191
+ };
1192
+ ```
1193
+
1194
+ Add overlap detection for the key and door in `_handleCollisions`:
1195
+
1196
+ ```javascript
1197
+ PlayState._handleCollisions = function () {
1198
+ this.game.physics.arcade.collide(this.hero, this.platforms);
1199
+ this.game.physics.arcade.collide(this.spiders, this.platforms);
1200
+ this.game.physics.arcade.collide(this.spiders, this.enemyWalls);
1201
+
1202
+ this.game.physics.arcade.overlap(
1203
+ this.hero, this.coins, this._onHeroVsCoin, null, this
1204
+ );
1205
+ this.game.physics.arcade.overlap(
1206
+ this.hero, this.spiders, this._onHeroVsEnemy, null, this
1207
+ );
1208
+ this.game.physics.arcade.overlap(
1209
+ this.hero, this.key, this._onHeroVsKey, null, this
1210
+ );
1211
+ this.game.physics.arcade.overlap(
1212
+ this.hero, this.door, this._onHeroVsDoor,
1213
+ // Only trigger if the hero has the key
1214
+ function (hero, door) {
1215
+ return this.hasKey && hero.body.touching.down;
1216
+ }, this
1217
+ );
1218
+ };
1219
+ ```
1220
+
1221
+ - The door overlap has a **process callback** (the fourth argument) that only triggers the overlap callback when `this.hasKey` is true and the hero is standing on something. This prevents the hero from entering the door while falling or without the key.
1222
+
1223
+ ### Key and Door Callbacks
1224
+
1225
+ ```javascript
1226
+ PlayState._onHeroVsKey = function (hero, key) {
1227
+ this.sfx.key.play();
1228
+ key.kill();
1229
+ this.hasKey = true;
1230
+ };
1231
+
1232
+ PlayState._onHeroVsDoor = function (hero, door) {
1233
+ this.sfx.door.play();
1234
+
1235
+ // Freeze the hero and play the door opening animation
1236
+ hero.body.velocity.x = 0;
1237
+ hero.body.velocity.y = 0;
1238
+ hero.body.enable = false;
1239
+
1240
+ // Play door open animation (transition from closed to open frame)
1241
+ door.frame = 1; // Switch to "open" frame
1242
+
1243
+ // Advance to the next level after a short delay
1244
+ this.game.time.events.add(500, this._goToNextLevel, this);
1245
+ };
1246
+
1247
+ PlayState._goToNextLevel = function () {
1248
+ this.camera.fade('#000');
1249
+ this.camera.onFadeComplete.addOnce(function () {
1250
+ this.game.state.restart(true, false, {
1251
+ level: this.level + 1
1252
+ });
1253
+ }, this);
1254
+ };
1255
+ ```
1256
+
1257
+ - When the hero touches the key, the key is removed and `hasKey` is set to `true`.
1258
+ - When the hero reaches the door (with the key), the hero freezes, the door opens, and after a delay the game transitions to the next level.
1259
+ - `camera.fade()` creates a fade-to-black transition for a polished level switch.
1260
+
1261
+ ### Showing the Key Icon in the HUD
1262
+
1263
+ Update `_createHud` to show whether the hero has collected the key:
1264
+
1265
+ ```javascript
1266
+ PlayState._createHud = function () {
1267
+ this.keyIcon = this.game.make.image(0, 19, 'icon:key');
1268
+ this.keyIcon.anchor.set(0, 0.5);
1269
+
1270
+ // ... existing coin HUD code ...
1271
+
1272
+ this.hud.add(this.keyIcon);
1273
+ this.hud.add(coinIcon);
1274
+ this.hud.add(coinScoreImg);
1275
+ this.hud.position.set(10, 10);
1276
+ this.hud.fixedToCamera = true;
1277
+ };
1278
+ ```
1279
+
1280
+ Update the key icon appearance each frame in `update`:
1281
+
1282
+ ```javascript
1283
+ // In PlayState.update, add:
1284
+ this.keyIcon.frame = this.hasKey ? 1 : 0;
1285
+ ```
1286
+
1287
+ - Frame 0 shows a grayed-out key icon; frame 1 shows the collected key icon.
1288
+
1289
+ ---
1290
+
1291
+ ## Switching Levels
1292
+
1293
+ Support multiple levels by loading different JSON files based on a level index.
1294
+
1295
+ ### Passing Level Number Through init
1296
+
1297
+ Modify `init` to accept a level parameter:
1298
+
1299
+ ```javascript
1300
+ PlayState.init = function (data) {
1301
+ this.game.renderer.renderSession.roundPixels = true;
1302
+
1303
+ this.keys = this.game.input.keyboard.addKeys({
1304
+ left: Phaser.KeyCode.LEFT,
1305
+ right: Phaser.KeyCode.RIGHT,
1306
+ up: Phaser.KeyCode.UP
1307
+ });
1308
+
1309
+ this.game.physics.startSystem(Phaser.Physics.ARCADE);
1310
+ this.game.physics.arcade.gravity.y = 1200;
1311
+
1312
+ // Store the current level number (default to 0)
1313
+ this.level = (data.level || 0) % LEVEL_COUNT;
1314
+ };
1315
+
1316
+ const LEVEL_COUNT = 2; // Total number of levels
1317
+ ```
1318
+
1319
+ - `data` is an object passed from `game.state.start()` or `game.state.restart()`.
1320
+ - The modulo operation (`% LEVEL_COUNT`) wraps around to level 0 after the last level, creating an infinite loop of levels.
1321
+
1322
+ ### Loading Level Data Dynamically
1323
+
1324
+ Update `preload` to load the correct level based on `this.level`:
1325
+
1326
+ ```javascript
1327
+ PlayState.preload = function () {
1328
+ this.game.load.image('background', 'images/background.png');
1329
+
1330
+ // Load the current level's JSON data
1331
+ this.game.load.json('level:0', 'data/level00.json');
1332
+ this.game.load.json('level:1', 'data/level01.json');
1333
+
1334
+ // ... load all other assets ...
1335
+ };
1336
+ ```
1337
+
1338
+ Update `create` to use the correct level data:
1339
+
1340
+ ```javascript
1341
+ PlayState.create = function () {
1342
+ this.sfx = {
1343
+ jump: this.game.add.audio('sfx:jump'),
1344
+ coin: this.game.add.audio('sfx:coin'),
1345
+ stomp: this.game.add.audio('sfx:stomp'),
1346
+ key: this.game.add.audio('sfx:key'),
1347
+ door: this.game.add.audio('sfx:door')
1348
+ };
1349
+
1350
+ this.game.add.image(0, 0, 'background');
1351
+
1352
+ // Load level data based on current level number
1353
+ this._loadLevel(this.game.cache.getJSON('level:' + this.level));
1354
+
1355
+ this._createHud();
1356
+ };
1357
+ ```
1358
+
1359
+ ### Starting the Game at Level 0
1360
+
1361
+ Update the initial state start to pass level 0:
1362
+
1363
+ ```javascript
1364
+ window.onload = function () {
1365
+ let game = new Phaser.Game(960, 600, Phaser.AUTO, 'game');
1366
+ game.state.add('play', PlayState);
1367
+ game.state.start('play', true, false, { level: 0 });
1368
+ };
1369
+ ```
1370
+
1371
+ - The third and fourth `start` arguments control world/cache clearing. `true, false` keeps the cache between restarts (so assets do not need to be reloaded) but clears the world.
1372
+ - `{ level: 0 }` is passed to `init` as the `data` parameter.
1373
+
1374
+ ### Level Transition Flow
1375
+
1376
+ The complete level flow is:
1377
+
1378
+ 1. Hero collects key -> `hasKey = true`
1379
+ 2. Hero reaches door -> `_onHeroVsDoor` fires
1380
+ 3. Camera fades to black -> `_goToNextLevel` fires
1381
+ 4. State restarts with `{ level: this.level + 1 }`
1382
+ 5. `init` receives the new level number
1383
+ 6. The correct level JSON is loaded and the game continues
1384
+
1385
+ ---
1386
+
1387
+ ## Moving Forward
1388
+
1389
+ Congratulations -- you have built a complete 2D platformer. Here are ideas for extending the game further:
1390
+
1391
+ ### Suggested Improvements
1392
+
1393
+ - **Mobile / touch controls:** Add on-screen buttons or swipe gestures using `game.input.onDown` for touch-enabled devices.
1394
+ - **More levels:** Create additional JSON level files with new platform layouts, coin placements, and enemy configurations.
1395
+ - **Menu screen:** Add a `MenuState` with a title screen and start button before entering `PlayState`.
1396
+ - **Game over screen:** Instead of instantly restarting, show a "Game Over" screen with the score.
1397
+ - **Lives system:** Give the hero multiple lives instead of instant restart.
1398
+ - **Power-ups:** Add items like speed boosts, double jump, or invincibility.
1399
+ - **Moving platforms:** Create platforms that travel along a path using tweens.
1400
+ - **Different enemy types:** Add flying enemies, enemies that shoot projectiles, or enemies with different movement patterns.
1401
+ - **Parallax scrolling:** Add multiple background layers that scroll at different speeds for depth.
1402
+ - **Camera scrolling:** For levels wider than the screen, use `game.camera.follow(this.hero)` to scroll with the hero.
1403
+ - **Sound and music:** Add background music and additional sound effects for a more polished experience.
1404
+ - **Particle effects:** Use Phaser's particle emitter for coin collection sparkles, enemy death effects, or dust when landing.
1405
+
1406
+ ### Full Game Source Reference
1407
+
1408
+ Below is the complete `main.js` file combining all steps for reference. This represents the final state of the game with all features:
1409
+
1410
+ ```javascript
1411
+ // =============================================================================
1412
+ // Constants
1413
+ // =============================================================================
1414
+
1415
+ const SPEED = 200;
1416
+ const JUMP_SPEED = 600;
1417
+ const LEVEL_COUNT = 2;
1418
+ const Spider = { SPEED: 100 };
1419
+
1420
+ // =============================================================================
1421
+ // Game State: PlayState
1422
+ // =============================================================================
1423
+
1424
+ PlayState = {};
1425
+
1426
+ // -----------------------------------------------------------------------------
1427
+ // init
1428
+ // -----------------------------------------------------------------------------
1429
+
1430
+ PlayState.init = function (data) {
1431
+ this.game.renderer.renderSession.roundPixels = true;
1432
+
1433
+ this.keys = this.game.input.keyboard.addKeys({
1434
+ left: Phaser.KeyCode.LEFT,
1435
+ right: Phaser.KeyCode.RIGHT,
1436
+ up: Phaser.KeyCode.UP
1437
+ });
1438
+
1439
+ this.game.physics.startSystem(Phaser.Physics.ARCADE);
1440
+ this.game.physics.arcade.gravity.y = 1200;
1441
+
1442
+ this.level = (data.level || 0) % LEVEL_COUNT;
1443
+ };
1444
+
1445
+ // -----------------------------------------------------------------------------
1446
+ // preload
1447
+ // -----------------------------------------------------------------------------
1448
+
1449
+ PlayState.preload = function () {
1450
+ // Background
1451
+ this.game.load.image('background', 'images/background.png');
1452
+
1453
+ // Level data
1454
+ this.game.load.json('level:0', 'data/level00.json');
1455
+ this.game.load.json('level:1', 'data/level01.json');
1456
+
1457
+ // Platform tiles
1458
+ this.game.load.image('ground', 'images/ground.png');
1459
+ this.game.load.image('grass:8x1', 'images/grass_8x1.png');
1460
+ this.game.load.image('grass:6x1', 'images/grass_6x1.png');
1461
+ this.game.load.image('grass:4x1', 'images/grass_4x1.png');
1462
+ this.game.load.image('grass:2x1', 'images/grass_2x1.png');
1463
+ this.game.load.image('grass:1x1', 'images/grass_1x1.png');
1464
+
1465
+ // Characters
1466
+ this.game.load.spritesheet('hero', 'images/hero.png', 36, 42);
1467
+ this.game.load.spritesheet('spider', 'images/spider.png', 42, 32);
1468
+ this.game.load.image('invisible-wall', 'images/invisible_wall.png');
1469
+
1470
+ // Collectibles
1471
+ this.game.load.spritesheet('coin', 'images/coin_animated.png', 22, 22);
1472
+ this.game.load.spritesheet('key', 'images/key.png', 20, 22);
1473
+ this.game.load.spritesheet('door', 'images/door.png', 42, 66);
1474
+
1475
+ // HUD
1476
+ this.game.load.image('icon:coin', 'images/coin_icon.png');
1477
+ this.game.load.image('icon:key', 'images/key_icon.png');
1478
+ this.game.load.image('font:numbers', 'images/numbers.png');
1479
+
1480
+ // Audio
1481
+ this.game.load.audio('sfx:jump', 'audio/sfx/jump.wav');
1482
+ this.game.load.audio('sfx:coin', 'audio/sfx/coin.wav');
1483
+ this.game.load.audio('sfx:stomp', 'audio/sfx/stomp.wav');
1484
+ this.game.load.audio('sfx:key', 'audio/sfx/key.wav');
1485
+ this.game.load.audio('sfx:door', 'audio/sfx/door.wav');
1486
+ };
1487
+
1488
+ // -----------------------------------------------------------------------------
1489
+ // create
1490
+ // -----------------------------------------------------------------------------
1491
+
1492
+ PlayState.create = function () {
1493
+ // Sound effects
1494
+ this.sfx = {
1495
+ jump: this.game.add.audio('sfx:jump'),
1496
+ coin: this.game.add.audio('sfx:coin'),
1497
+ stomp: this.game.add.audio('sfx:stomp'),
1498
+ key: this.game.add.audio('sfx:key'),
1499
+ door: this.game.add.audio('sfx:door')
1500
+ };
1501
+
1502
+ // Background
1503
+ this.game.add.image(0, 0, 'background');
1504
+
1505
+ // Load level
1506
+ this._loadLevel(this.game.cache.getJSON('level:' + this.level));
1507
+
1508
+ // HUD
1509
+ this._createHud();
1510
+ };
1511
+
1512
+ // -----------------------------------------------------------------------------
1513
+ // update
1514
+ // -----------------------------------------------------------------------------
1515
+
1516
+ PlayState.update = function () {
1517
+ this._handleCollisions();
1518
+ this._handleInput();
1519
+
1520
+ // Update hero sprite direction and animation
1521
+ if (this.hero.body.velocity.x < 0) {
1522
+ this.hero.scale.x = -1;
1523
+ } else if (this.hero.body.velocity.x > 0) {
1524
+ this.hero.scale.x = 1;
1525
+ }
1526
+ this.hero.animations.play(this._getAnimationName());
1527
+
1528
+ // Update spider directions when hitting walls
1529
+ this.spiders.forEach(function (spider) {
1530
+ if (spider.body.touching.right || spider.body.blocked.right) {
1531
+ spider.body.velocity.x = -Spider.SPEED;
1532
+ } else if (spider.body.touching.left || spider.body.blocked.left) {
1533
+ spider.body.velocity.x = Spider.SPEED;
1534
+ }
1535
+ }, this);
1536
+
1537
+ // Update key icon in HUD
1538
+ this.keyIcon.frame = this.hasKey ? 1 : 0;
1539
+ };
1540
+
1541
+ // -----------------------------------------------------------------------------
1542
+ // Level Loading
1543
+ // -----------------------------------------------------------------------------
1544
+
1545
+ PlayState._loadLevel = function (data) {
1546
+ // Create groups (order matters for rendering layers)
1547
+ this.bgDecoration = this.game.add.group();
1548
+ this.platforms = this.game.add.group();
1549
+ this.coins = this.game.add.group();
1550
+ this.spiders = this.game.add.group();
1551
+ this.enemyWalls = this.game.add.group();
1552
+
1553
+ // Spawn entities from level data
1554
+ data.platforms.forEach(this._spawnPlatform, this);
1555
+ data.coins.forEach(this._spawnCoin, this);
1556
+ data.spiders.forEach(this._spawnSpider, this);
1557
+
1558
+ this._spawnDoor(data.door.x, data.door.y);
1559
+ this._spawnKey(data.key.x, data.key.y);
1560
+ this._spawnCharacters({ hero: data.hero });
1561
+
1562
+ // Hide invisible walls
1563
+ this.enemyWalls.visible = false;
1564
+
1565
+ // Initialize game state
1566
+ this.coinPickupCount = 0;
1567
+ this.hasKey = false;
1568
+ };
1569
+
1570
+ // -----------------------------------------------------------------------------
1571
+ // Spawn Methods
1572
+ // -----------------------------------------------------------------------------
1573
+
1574
+ PlayState._spawnPlatform = function (platform) {
1575
+ let sprite = this.platforms.create(platform.x, platform.y, platform.image);
1576
+ this.game.physics.enable(sprite);
1577
+ sprite.body.allowGravity = false;
1578
+ sprite.body.immovable = true;
1579
+
1580
+ // Add invisible walls at both edges for enemy AI
1581
+ this._spawnEnemyWall(platform.x, platform.y, 'left');
1582
+ this._spawnEnemyWall(platform.x + sprite.width, platform.y, 'right');
1583
+ };
1584
+
1585
+ PlayState._spawnEnemyWall = function (x, y, side) {
1586
+ let sprite = this.enemyWalls.create(x, y, 'invisible-wall');
1587
+ sprite.anchor.set(side === 'left' ? 1 : 0, 1);
1588
+ this.game.physics.enable(sprite);
1589
+ sprite.body.immovable = true;
1590
+ sprite.body.allowGravity = false;
1591
+ };
1592
+
1593
+ PlayState._spawnCharacters = function (data) {
1594
+ this.hero = this.game.add.sprite(data.hero.x, data.hero.y, 'hero');
1595
+ this.hero.anchor.set(0.5, 1);
1596
+ this.game.physics.enable(this.hero);
1597
+ this.hero.body.collideWorldBounds = true;
1598
+
1599
+ // Hero animations
1600
+ this.hero.animations.add('stop', [0]);
1601
+ this.hero.animations.add('run', [1, 2], 8, true);
1602
+ this.hero.animations.add('jump', [3]);
1603
+ this.hero.animations.add('fall', [4]);
1604
+ };
1605
+
1606
+ PlayState._spawnCoin = function (coin) {
1607
+ let sprite = this.coins.create(coin.x, coin.y, 'coin');
1608
+ sprite.anchor.set(0.5, 0.5);
1609
+ this.game.physics.enable(sprite);
1610
+ sprite.body.allowGravity = false;
1611
+
1612
+ sprite.animations.add('rotate', [0, 1, 2, 1], 6, true);
1613
+ sprite.animations.play('rotate');
1614
+ };
1615
+
1616
+ PlayState._spawnSpider = function (spider) {
1617
+ let sprite = this.spiders.create(spider.x, spider.y, 'spider');
1618
+ sprite.anchor.set(0.5, 1);
1619
+ this.game.physics.enable(sprite);
1620
+
1621
+ sprite.animations.add('crawl', [0, 1, 2], 8, true);
1622
+ sprite.animations.add('die', [0, 4, 0, 4, 0, 4, 3, 3, 3, 3, 3, 3], 12);
1623
+ sprite.animations.play('crawl');
1624
+
1625
+ sprite.body.velocity.x = Spider.SPEED;
1626
+ };
1627
+
1628
+ PlayState._spawnDoor = function (x, y) {
1629
+ this.door = this.bgDecoration.create(x, y, 'door');
1630
+ this.door.anchor.setTo(0.5, 1);
1631
+ this.game.physics.enable(this.door);
1632
+ this.door.body.allowGravity = false;
1633
+ };
1634
+
1635
+ PlayState._spawnKey = function (x, y) {
1636
+ this.key = this.bgDecoration.create(x, y, 'key');
1637
+ this.key.anchor.set(0.5, 0.5);
1638
+ this.game.physics.enable(this.key);
1639
+ this.key.body.allowGravity = false;
1640
+
1641
+ // Bobbing tween
1642
+ this.key.y -= 3;
1643
+ this.game.add.tween(this.key)
1644
+ .to({ y: this.key.y + 6 }, 800, Phaser.Easing.Sinusoidal.InOut)
1645
+ .yoyo(true)
1646
+ .loop()
1647
+ .start();
1648
+ };
1649
+
1650
+ // -----------------------------------------------------------------------------
1651
+ // Input
1652
+ // -----------------------------------------------------------------------------
1653
+
1654
+ PlayState._handleInput = function () {
1655
+ if (!this.hero.alive) { return; }
1656
+
1657
+ if (this.keys.left.isDown) {
1658
+ this.hero.body.velocity.x = -SPEED;
1659
+ } else if (this.keys.right.isDown) {
1660
+ this.hero.body.velocity.x = SPEED;
1661
+ } else {
1662
+ this.hero.body.velocity.x = 0;
1663
+ }
1664
+
1665
+ if (this.keys.up.isDown) {
1666
+ this._jump();
1667
+ }
1668
+ };
1669
+
1670
+ PlayState._jump = function () {
1671
+ let canJump = this.hero.body.touching.down;
1672
+ if (canJump) {
1673
+ this.hero.body.velocity.y = -JUMP_SPEED;
1674
+ this.sfx.jump.play();
1675
+ }
1676
+ return canJump;
1677
+ };
1678
+
1679
+ // -----------------------------------------------------------------------------
1680
+ // Collisions
1681
+ // -----------------------------------------------------------------------------
1682
+
1683
+ PlayState._handleCollisions = function () {
1684
+ // Physical collisions
1685
+ this.game.physics.arcade.collide(this.hero, this.platforms);
1686
+ this.game.physics.arcade.collide(this.spiders, this.platforms);
1687
+ this.game.physics.arcade.collide(this.spiders, this.enemyWalls);
1688
+
1689
+ // Overlap detection (no physical push)
1690
+ this.game.physics.arcade.overlap(
1691
+ this.hero, this.coins, this._onHeroVsCoin, null, this
1692
+ );
1693
+ this.game.physics.arcade.overlap(
1694
+ this.hero, this.spiders, this._onHeroVsEnemy, null, this
1695
+ );
1696
+ this.game.physics.arcade.overlap(
1697
+ this.hero, this.key, this._onHeroVsKey, null, this
1698
+ );
1699
+ this.game.physics.arcade.overlap(
1700
+ this.hero, this.door, this._onHeroVsDoor,
1701
+ function (hero, door) {
1702
+ return this.hasKey && hero.body.touching.down;
1703
+ }, this
1704
+ );
1705
+ };
1706
+
1707
+ // -----------------------------------------------------------------------------
1708
+ // Collision Callbacks
1709
+ // -----------------------------------------------------------------------------
1710
+
1711
+ PlayState._onHeroVsCoin = function (hero, coin) {
1712
+ this.sfx.coin.play();
1713
+ coin.kill();
1714
+ this.coinPickupCount++;
1715
+ this.coinFont.text = 'x' + this.coinPickupCount;
1716
+ };
1717
+
1718
+ PlayState._onHeroVsEnemy = function (hero, enemy) {
1719
+ if (hero.body.velocity.y > 0) {
1720
+ // Stomp: hero is falling onto the enemy
1721
+ enemy.body.velocity.x = 0;
1722
+ enemy.body.enable = false;
1723
+ enemy.animations.play('die');
1724
+ enemy.events.onAnimationComplete.addOnce(function () {
1725
+ enemy.kill();
1726
+ });
1727
+ hero.body.velocity.y = -JUMP_SPEED / 2;
1728
+ this.sfx.stomp.play();
1729
+ } else {
1730
+ // Hero dies
1731
+ this._killHero();
1732
+ }
1733
+ };
1734
+
1735
+ PlayState._onHeroVsKey = function (hero, key) {
1736
+ this.sfx.key.play();
1737
+ key.kill();
1738
+ this.hasKey = true;
1739
+ };
1740
+
1741
+ PlayState._onHeroVsDoor = function (hero, door) {
1742
+ this.sfx.door.play();
1743
+ hero.body.velocity.x = 0;
1744
+ hero.body.velocity.y = 0;
1745
+ hero.body.enable = false;
1746
+
1747
+ door.frame = 1; // Open door
1748
+
1749
+ this.game.time.events.add(500, this._goToNextLevel, this);
1750
+ };
1751
+
1752
+ // -----------------------------------------------------------------------------
1753
+ // Death and Level Transitions
1754
+ // -----------------------------------------------------------------------------
1755
+
1756
+ PlayState._killHero = function () {
1757
+ this.hero.alive = false;
1758
+ this.hero.body.velocity.y = -JUMP_SPEED / 2;
1759
+ this.hero.body.velocity.x = 0;
1760
+ this.hero.body.allowGravity = true;
1761
+ this.hero.body.collideWorldBounds = false;
1762
+
1763
+ this.game.time.events.add(1000, function () {
1764
+ this.game.state.restart(true, false, { level: this.level });
1765
+ }, this);
1766
+ };
1767
+
1768
+ PlayState._goToNextLevel = function () {
1769
+ this.camera.fade('#000');
1770
+ this.camera.onFadeComplete.addOnce(function () {
1771
+ this.game.state.restart(true, false, {
1772
+ level: this.level + 1
1773
+ });
1774
+ }, this);
1775
+ };
1776
+
1777
+ // -----------------------------------------------------------------------------
1778
+ // Animations
1779
+ // -----------------------------------------------------------------------------
1780
+
1781
+ PlayState._getAnimationName = function () {
1782
+ let name = 'stop';
1783
+
1784
+ if (!this.hero.alive) {
1785
+ name = 'stop';
1786
+ } else if (this.hero.body.velocity.y < 0) {
1787
+ name = 'jump';
1788
+ } else if (this.hero.body.velocity.y > 0 && !this.hero.body.touching.down) {
1789
+ name = 'fall';
1790
+ } else if (this.hero.body.velocity.x !== 0 && this.hero.body.touching.down) {
1791
+ name = 'run';
1792
+ }
1793
+
1794
+ return name;
1795
+ };
1796
+
1797
+ // -----------------------------------------------------------------------------
1798
+ // HUD
1799
+ // -----------------------------------------------------------------------------
1800
+
1801
+ PlayState._createHud = function () {
1802
+ this.keyIcon = this.game.make.image(0, 19, 'icon:key');
1803
+ this.keyIcon.anchor.set(0, 0.5);
1804
+
1805
+ let coinIcon = this.game.make.image(
1806
+ this.keyIcon.width + 7, 0, 'icon:coin'
1807
+ );
1808
+
1809
+ let scoreStyle = { font: '24px monospace', fill: '#fff' };
1810
+ this.coinFont = this.game.add.text(
1811
+ coinIcon.x + coinIcon.width + 7, 0, 'x0', scoreStyle
1812
+ );
1813
+
1814
+ this.hud = this.game.add.group();
1815
+ this.hud.add(this.keyIcon);
1816
+ this.hud.add(coinIcon);
1817
+ this.hud.add(this.coinFont);
1818
+ this.hud.position.set(10, 10);
1819
+ this.hud.fixedToCamera = true;
1820
+ };
1821
+
1822
+ // =============================================================================
1823
+ // Entry Point
1824
+ // =============================================================================
1825
+
1826
+ window.onload = function () {
1827
+ let game = new Phaser.Game(960, 600, Phaser.AUTO, 'game');
1828
+ game.state.add('play', PlayState);
1829
+ game.state.start('play', true, false, { level: 0 });
1830
+ };
1831
+ ```
1832
+
1833
+ ### Key Concepts Summary
1834
+
1835
+ | Concept | Phaser API | Purpose |
1836
+ |---------|-----------|---------|
1837
+ | Game instance | `new Phaser.Game(w, h, renderer, container)` | Creates the game canvas and engine |
1838
+ | Game states | `game.state.add()` / `game.state.start()` | Organizes code into init/preload/create/update lifecycle |
1839
+ | Loading images | `game.load.image(key, path)` | Loads a static image asset |
1840
+ | Loading spritesheets | `game.load.spritesheet(key, path, fw, fh)` | Loads an animated spritesheet |
1841
+ | Loading JSON | `game.load.json(key, path)` | Loads JSON data (level definitions) |
1842
+ | Loading audio | `game.load.audio(key, path)` | Loads a sound effect |
1843
+ | Sprite groups | `game.add.group()` | Container for related sprites; enables batch collision detection |
1844
+ | Physics bodies | `game.physics.enable(sprite)` | Adds an Arcade Physics body to a sprite |
1845
+ | Gravity | `game.physics.arcade.gravity.y` | Global downward acceleration |
1846
+ | Collision | `arcade.collide(a, b)` | Physical collision resolution (sprites push each other) |
1847
+ | Overlap | `arcade.overlap(a, b, callback)` | Detection without physical push (for pickups) |
1848
+ | Velocity | `sprite.body.velocity.x/y` | Movement speed in pixels per second |
1849
+ | Immovable | `sprite.body.immovable = true` | Prevents sprite from being pushed by collisions |
1850
+ | Animations | `sprite.animations.add(name, frames, fps, loop)` | Defines a frame animation |
1851
+ | Tweens | `game.add.tween(target).to(props, duration, easing)` | Smooth property animation |
1852
+ | Keyboard input | `game.input.keyboard.addKeys({...})` | Captures specific keyboard keys |
1853
+ | Camera | `this.camera.fade()` | Screen transition effects |
1854
+ | Anchor | `sprite.anchor.set(x, y)` | Sets the origin point for positioning and rotation |
1855
+ | Sprite flipping | `sprite.scale.x = -1` | Horizontally mirrors the sprite |