@caddis/cli 0.3.0 → 0.4.0

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 (238) hide show
  1. package/bundles/antigravity-plugin/agents/knowledge-transfer.md +17 -32
  2. package/bundles/antigravity-plugin/caddis_statusline.py +25 -3
  3. package/bundles/antigravity-plugin/guard_agy.py +41 -9
  4. package/bundles/antigravity-plugin/plugin.json +1 -1
  5. package/bundles/antigravity-plugin/scripts/caddis_inventory.py +73 -3
  6. package/bundles/antigravity-plugin/scripts/caddis_statusline.py +25 -3
  7. package/bundles/antigravity-plugin/scripts/claudster_config.py +0 -5
  8. package/bundles/antigravity-plugin/scripts/hook_log.py +1 -1
  9. package/bundles/antigravity-plugin/scripts/new-machine.ps1 +170 -0
  10. package/bundles/antigravity-plugin/scripts/oss_ask.py +1 -1
  11. package/bundles/antigravity-plugin/scripts/oss_model.py +10 -2
  12. package/bundles/antigravity-plugin/scripts/oss_review.py +1 -1
  13. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +9 -6
  14. package/bundles/antigravity-plugin/session_end_agy.py +31 -6
  15. package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +44 -0
  16. package/bundles/antigravity-plugin/skills/code-review/SKILL.md +11 -0
  17. package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +21 -0
  18. package/bundles/antigravity-plugin/skills/gate-review/SKILL.md +11 -0
  19. package/bundles/antigravity-plugin/skills/implement/SKILL.md +36 -0
  20. package/bundles/antigravity-plugin/skills/security-review/SKILL.md +9 -0
  21. package/bundles/antigravity-plugin/skills/validate-phase/SKILL.md +31 -0
  22. package/bundles/antigravity-plugin/warm_start_agy.py +96 -9
  23. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  24. package/bundles/codex/.codex/config.toml.example +36 -0
  25. package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +249 -0
  26. package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +305 -0
  27. package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +140 -0
  28. package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +204 -0
  29. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +132 -0
  30. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/scripts/perf_sweep.py +249 -0
  31. package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +260 -0
  32. package/bundles/codex/.codex/skills/coding/fastapi-dev/SKILL.md +300 -0
  33. package/bundles/codex/.codex/skills/coding/javascript-typescript/SKILL.md +142 -0
  34. package/bundles/codex/.codex/skills/coding/python/SKILL.md +388 -0
  35. package/bundles/codex/.codex/skills/coding/refactoring/SKILL.md +486 -0
  36. package/bundles/codex/.codex/skills/coding/security-review/SKILL.md +205 -0
  37. package/bundles/codex/.codex/skills/coding/sql/SKILL.md +321 -0
  38. package/bundles/codex/.codex/skills/data/database-design/SKILL.md +177 -0
  39. package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +148 -0
  40. package/bundles/codex/.codex/skills/data/db-diagram/scripts/sql_to_graph.py +1212 -0
  41. package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +315 -0
  42. package/bundles/codex/.codex/skills/devops/gh-cli/SKILL.md +195 -0
  43. package/bundles/codex/.codex/skills/devops/git-commit/SKILL.md +285 -0
  44. package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +217 -0
  45. package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +880 -0
  46. package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +271 -0
  47. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +97 -0
  48. package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +286 -0
  49. package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +387 -0
  50. package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +305 -0
  51. package/bundles/codex/.codex/skills/frontend/css-architecture/references/RESPONSIVE-DESIGN.md +604 -0
  52. package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +193 -0
  53. package/bundles/codex/.codex/skills/frontend/frontend-design/references/my-tech-stack.md +127 -0
  54. package/bundles/codex/.codex/skills/frontend/mockup/SKILL.md +242 -0
  55. package/bundles/codex/.codex/skills/frontend/react-best-practices/SKILL.md +269 -0
  56. package/bundles/codex/.codex/skills/frontend/react-dev/README.md +404 -0
  57. package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +459 -0
  58. package/bundles/codex/.codex/skills/frontend/react-dev/examples/generic-components.md +579 -0
  59. package/bundles/codex/.codex/skills/frontend/react-dev/examples/server-components.md +579 -0
  60. package/bundles/codex/.codex/skills/frontend/react-dev/references/event-handlers.md +574 -0
  61. package/bundles/codex/.codex/skills/frontend/react-dev/references/hooks.md +456 -0
  62. package/bundles/codex/.codex/skills/frontend/react-dev/references/react-19-patterns.md +638 -0
  63. package/bundles/codex/.codex/skills/frontend/react-dev/references/react-router.md +1002 -0
  64. package/bundles/codex/.codex/skills/frontend/react-dev/references/tanstack-router.md +587 -0
  65. package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +176 -0
  66. package/bundles/codex/.codex/skills/frontend/ui-review/references/framework-fixes.md +471 -0
  67. package/bundles/codex/.codex/skills/frontend/ui-review/references/visual-checklist.md +236 -0
  68. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/DESIGN_TOKENS.md +487 -0
  69. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/IMPLEMENTATION_GUIDE.md +177 -0
  70. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +732 -0
  71. package/bundles/codex/.codex/skills/media/draw-io/SKILL.md +162 -0
  72. package/bundles/codex/.codex/skills/media/draw-io/references/aws-icons.md +677 -0
  73. package/bundles/codex/.codex/skills/media/draw-io/references/layout-guidelines.md +142 -0
  74. package/bundles/codex/.codex/skills/media/draw-io/references/troubleshooting.md +118 -0
  75. package/bundles/codex/.codex/skills/media/draw-io/references/workflows.md +103 -0
  76. package/bundles/codex/.codex/skills/media/draw-io/scripts/convert-drawio-to-png.sh +25 -0
  77. package/bundles/codex/.codex/skills/media/draw-io/scripts/find_aws_icon.py +79 -0
  78. package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +292 -0
  79. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/ENHANCEMENTS.md +264 -0
  80. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/MERMAID-SUMMARY.md +137 -0
  81. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/advanced-features.md +556 -0
  82. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/architecture-diagrams.md +192 -0
  83. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/c4-diagrams.md +410 -0
  84. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/class-diagrams.md +361 -0
  85. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/erd-diagrams.md +510 -0
  86. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/flowcharts.md +450 -0
  87. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/sequence-diagrams.md +394 -0
  88. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/troubleshooting.md +335 -0
  89. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/workflows.md +418 -0
  90. package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +243 -0
  91. package/bundles/codex/.codex/skills/media/particle-art/references/canvas-utils.ts +171 -0
  92. package/bundles/codex/.codex/skills/media/particle-art/references/dot-field.template.tsx +203 -0
  93. package/bundles/codex/.codex/skills/media/particle-art/references/flow-field.template.tsx +263 -0
  94. package/bundles/codex/.codex/skills/media/particle-art/references/node-shape.template.tsx +261 -0
  95. package/bundles/codex/.codex/skills/media/particle-art/references/shape-sampler.ts +281 -0
  96. package/bundles/codex/.codex/skills/media/particle-art/references/stipple-morph.template.tsx +167 -0
  97. package/bundles/codex/.codex/skills/media/particle-art/references/stipple.template.tsx +175 -0
  98. package/bundles/codex/.codex/skills/media/particle-art/references/trail-ghost.template.tsx +266 -0
  99. package/bundles/codex/.codex/skills/media/particle-art/references/usage-examples.md +320 -0
  100. package/bundles/codex/.codex/skills/testing/playwright/API_REFERENCE.md +653 -0
  101. package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +454 -0
  102. package/bundles/codex/.codex/skills/testing/playwright/lib/helpers.js +441 -0
  103. package/bundles/codex/.codex/skills/testing/playwright/package.json +26 -0
  104. package/bundles/codex/.codex/skills/testing/playwright/run.js +228 -0
  105. package/bundles/codex/.codex/skills/testing/tdd-workflow/SKILL.md +188 -0
  106. package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +155 -0
  107. package/bundles/codex/.codex/skills/testing/webapp-testing/LICENSE.txt +202 -0
  108. package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +97 -0
  109. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/console_logging.py +35 -0
  110. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/element_discovery.py +40 -0
  111. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/static_html_automation.py +33 -0
  112. package/bundles/codex/.codex/skills/testing/webapp-testing/scripts/with_server.py +106 -0
  113. package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +227 -0
  114. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/context-template.md +214 -0
  115. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/hub-handbook.md +233 -0
  116. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/report-contract.md +94 -0
  117. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/succession.md +118 -0
  118. package/bundles/codex/.codex/skills/workflow/best-practices/SKILL.md +500 -0
  119. package/bundles/codex/.codex/skills/workflow/best-practices/agents/best-practices-referencer.md +263 -0
  120. package/bundles/codex/.codex/skills/workflow/best-practices/agents/codebase-context-builder.md +326 -0
  121. package/bundles/codex/.codex/skills/workflow/best-practices/agents/task-intent-analyzer.md +245 -0
  122. package/bundles/codex/.codex/skills/workflow/best-practices/references/anti-patterns.md +571 -0
  123. package/bundles/codex/.codex/skills/workflow/best-practices/references/before-after-examples.md +1114 -0
  124. package/bundles/codex/.codex/skills/workflow/best-practices/references/best-practices-guide.md +513 -0
  125. package/bundles/codex/.codex/skills/workflow/best-practices/references/common-workflows.md +692 -0
  126. package/bundles/codex/.codex/skills/workflow/best-practices/references/prompt-patterns.md +547 -0
  127. package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +57 -0
  128. package/bundles/codex/.codex/skills/workflow/context-curator/SKILL.md +157 -0
  129. package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +586 -0
  130. package/bundles/codex/.codex/skills/workflow/preflight/SKILL.md +440 -0
  131. package/bundles/codex/.codex/skills/workflow/skill-creator/LICENSE.txt +202 -0
  132. package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +491 -0
  133. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/analyzer.md +274 -0
  134. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/comparator.md +202 -0
  135. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/grader.md +223 -0
  136. package/bundles/codex/.codex/skills/workflow/skill-creator/assets/eval_review.html +146 -0
  137. package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/generate_review.py +471 -0
  138. package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/viewer.html +1325 -0
  139. package/bundles/codex/.codex/skills/workflow/skill-creator/references/schemas.md +430 -0
  140. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/__init__.py +0 -0
  141. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/aggregate_benchmark.py +401 -0
  142. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/generate_report.py +326 -0
  143. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/improve_description.py +247 -0
  144. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/package_skill.py +136 -0
  145. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/quick_validate.py +103 -0
  146. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_eval.py +310 -0
  147. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_loop.py +328 -0
  148. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/utils.py +47 -0
  149. package/bundles/codex/AGENTS.md +146 -0
  150. package/bundles/manifest.json +4 -3
  151. package/dist/claude-deepseek.js +2 -2
  152. package/dist/claude-glm.js +2 -2
  153. package/dist/claude-oss.js +2 -2
  154. package/dist/cli.js +187 -56
  155. package/package.json +1 -1
  156. package/bundles/antigravity-plugin/scripts/dream_capture.py +0 -249
  157. package/bundles/antigravity-plugin/scripts/dream_memory.py +0 -438
  158. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  159. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  160. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  161. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  162. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  163. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  164. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  165. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  166. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  167. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  168. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  169. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  170. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  171. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  172. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  173. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  174. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  175. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  176. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  177. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  178. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  179. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  180. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  181. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  182. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  183. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  184. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  185. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  186. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  187. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  188. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  189. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  190. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  191. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  192. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  193. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  194. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  195. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  196. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  197. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  198. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  199. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  200. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  201. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  202. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  203. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  204. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  205. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  206. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  207. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  208. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  209. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  210. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  211. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  212. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  213. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  214. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  215. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  216. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  217. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  218. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  219. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  220. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  221. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  222. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  223. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  224. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  225. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  226. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  227. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  228. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  229. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  230. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  231. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  232. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  233. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  234. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  235. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  236. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  237. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  238. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -0,0 +1,579 @@
1
+ # Generic Component Patterns
2
+
3
+ Generic components provide type safety while maintaining reusability. TypeScript infers generic type parameters from prop values — no manual type annotations needed at call site.
4
+
5
+ ## Generic Table Component
6
+
7
+ Full-featured table with typed columns, custom rendering, sorting.
8
+
9
+ ```typescript
10
+ type Column<T> = {
11
+ key: keyof T;
12
+ header: string;
13
+ render?: (value: T[keyof T], item: T) => React.ReactNode;
14
+ sortable?: boolean;
15
+ };
16
+
17
+ type TableProps<T> = {
18
+ data: T[];
19
+ columns: Column<T>[];
20
+ keyExtractor: (item: T) => string | number;
21
+ onSort?: (key: keyof T, direction: 'asc' | 'desc') => void;
22
+ className?: string;
23
+ };
24
+
25
+ function Table<T>({
26
+ data,
27
+ columns,
28
+ keyExtractor,
29
+ onSort,
30
+ className,
31
+ }: TableProps<T>) {
32
+ const [sortKey, setSortKey] = React.useState<keyof T | null>(null);
33
+ const [sortDir, setSortDir] = React.useState<'asc' | 'desc'>('asc');
34
+
35
+ const handleSort = (key: keyof T) => {
36
+ const newDir = sortKey === key && sortDir === 'asc' ? 'desc' : 'asc';
37
+ setSortKey(key);
38
+ setSortDir(newDir);
39
+ onSort?.(key, newDir);
40
+ };
41
+
42
+ return (
43
+ <table className={className}>
44
+ <thead>
45
+ <tr>
46
+ {columns.map((col) => (
47
+ <th key={String(col.key)}>
48
+ {col.sortable ? (
49
+ <button onClick={() => handleSort(col.key)}>
50
+ {col.header}
51
+ {sortKey === col.key && (sortDir === 'asc' ? ' ↑' : ' ↓')}
52
+ </button>
53
+ ) : (
54
+ col.header
55
+ )}
56
+ </th>
57
+ ))}
58
+ </tr>
59
+ </thead>
60
+ <tbody>
61
+ {data.map((item) => (
62
+ <tr key={keyExtractor(item)}>
63
+ {columns.map((col) => (
64
+ <td key={String(col.key)}>
65
+ {col.render
66
+ ? col.render(item[col.key], item)
67
+ : String(item[col.key])}
68
+ </td>
69
+ ))}
70
+ </tr>
71
+ ))}
72
+ </tbody>
73
+ </table>
74
+ );
75
+ }
76
+ ```
77
+
78
+ Usage:
79
+
80
+ ```typescript
81
+ type User = {
82
+ id: number;
83
+ name: string;
84
+ email: string;
85
+ role: 'admin' | 'user';
86
+ createdAt: Date;
87
+ };
88
+
89
+ function UserTable({ users }: { users: User[] }) {
90
+ const [sortedUsers, setSortedUsers] = React.useState(users);
91
+
92
+ const handleSort = (key: keyof User, direction: 'asc' | 'desc') => {
93
+ const sorted = [...users].sort((a, b) => {
94
+ if (a[key] < b[key]) return direction === 'asc' ? -1 : 1;
95
+ if (a[key] > b[key]) return direction === 'asc' ? 1 : -1;
96
+ return 0;
97
+ });
98
+ setSortedUsers(sorted);
99
+ };
100
+
101
+ return (
102
+ <Table
103
+ data={sortedUsers}
104
+ columns={[
105
+ { key: 'name', header: 'Name', sortable: true },
106
+ {
107
+ key: 'email',
108
+ header: 'Email',
109
+ render: (email) => <a href={`mailto:${email}`}>{email}</a>,
110
+ },
111
+ {
112
+ key: 'role',
113
+ header: 'Role',
114
+ render: (role) => (
115
+ <span className={role === 'admin' ? 'badge-admin' : 'badge-user'}>
116
+ {role}
117
+ </span>
118
+ ),
119
+ },
120
+ {
121
+ key: 'createdAt',
122
+ header: 'Created',
123
+ render: (date) => new Date(date).toLocaleDateString(),
124
+ sortable: true,
125
+ },
126
+ ]}
127
+ keyExtractor={(user) => user.id}
128
+ onSort={handleSort}
129
+ />
130
+ );
131
+ }
132
+ ```
133
+
134
+ ## Generic Select/Dropdown
135
+
136
+ Type-safe select with custom option rendering, searching.
137
+
138
+ ```typescript
139
+ type SelectProps<T> = {
140
+ options: T[];
141
+ value: T | null;
142
+ onChange: (value: T) => void;
143
+ getLabel: (option: T) => string;
144
+ getValue: (option: T) => string | number;
145
+ placeholder?: string;
146
+ disabled?: boolean;
147
+ searchable?: boolean;
148
+ };
149
+
150
+ function Select<T>({
151
+ options,
152
+ value,
153
+ onChange,
154
+ getLabel,
155
+ getValue,
156
+ placeholder = 'Select...',
157
+ disabled = false,
158
+ searchable = false,
159
+ }: SelectProps<T>) {
160
+ const [search, setSearch] = React.useState('');
161
+ const [isOpen, setIsOpen] = React.useState(false);
162
+
163
+ const filtered = searchable
164
+ ? options.filter((opt) =>
165
+ getLabel(opt).toLowerCase().includes(search.toLowerCase())
166
+ )
167
+ : options;
168
+
169
+ const handleSelect = (option: T) => {
170
+ onChange(option);
171
+ setIsOpen(false);
172
+ setSearch('');
173
+ };
174
+
175
+ return (
176
+ <div className="select-wrapper">
177
+ <button
178
+ onClick={() => setIsOpen(!isOpen)}
179
+ disabled={disabled}
180
+ className="select-trigger"
181
+ >
182
+ {value ? getLabel(value) : placeholder}
183
+ </button>
184
+
185
+ {isOpen && (
186
+ <div className="select-dropdown">
187
+ {searchable && (
188
+ <input
189
+ type="text"
190
+ value={search}
191
+ onChange={(e) => setSearch(e.target.value)}
192
+ placeholder="Search..."
193
+ autoFocus
194
+ />
195
+ )}
196
+ <ul>
197
+ {filtered.map((option) => (
198
+ <li
199
+ key={getValue(option)}
200
+ onClick={() => handleSelect(option)}
201
+ className={value === option ? 'selected' : ''}
202
+ >
203
+ {getLabel(option)}
204
+ </li>
205
+ ))}
206
+ </ul>
207
+ </div>
208
+ )}
209
+ </div>
210
+ );
211
+ }
212
+ ```
213
+
214
+ Usage:
215
+
216
+ ```typescript
217
+ type Country = {
218
+ code: string;
219
+ name: string;
220
+ flag: string;
221
+ };
222
+
223
+ const countries: Country[] = [
224
+ { code: 'US', name: 'United States', flag: '🇺🇸' },
225
+ { code: 'CA', name: 'Canada', flag: '🇨🇦' },
226
+ { code: 'MX', name: 'Mexico', flag: '🇲🇽' },
227
+ ];
228
+
229
+ function CountrySelector() {
230
+ const [country, setCountry] = React.useState<Country | null>(null);
231
+
232
+ return (
233
+ <Select
234
+ options={countries}
235
+ value={country}
236
+ onChange={setCountry}
237
+ getLabel={(c) => `${c.flag} ${c.name}`}
238
+ getValue={(c) => c.code}
239
+ searchable
240
+ placeholder="Select country"
241
+ />
242
+ );
243
+ }
244
+ ```
245
+
246
+ ## Generic List with Render Props
247
+
248
+ Flexible list rendering with type-safe render props.
249
+
250
+ ```typescript
251
+ type ListProps<T> = {
252
+ items: T[];
253
+ renderItem: (item: T, index: number) => React.ReactNode;
254
+ renderEmpty?: () => React.ReactNode;
255
+ keyExtractor: (item: T, index: number) => string | number;
256
+ className?: string;
257
+ as?: 'ul' | 'ol' | 'div';
258
+ };
259
+
260
+ function List<T>({
261
+ items,
262
+ renderItem,
263
+ renderEmpty,
264
+ keyExtractor,
265
+ className,
266
+ as: Component = 'ul',
267
+ }: ListProps<T>) {
268
+ if (items.length === 0 && renderEmpty) {
269
+ return <>{renderEmpty()}</>;
270
+ }
271
+
272
+ return (
273
+ <Component className={className}>
274
+ {items.map((item, index) => {
275
+ const key = keyExtractor(item, index);
276
+ const element = renderItem(item, index);
277
+
278
+ return Component === 'div' ? (
279
+ <div key={key}>{element}</div>
280
+ ) : (
281
+ <li key={key}>{element}</li>
282
+ );
283
+ })}
284
+ </Component>
285
+ );
286
+ }
287
+ ```
288
+
289
+ Usage:
290
+
291
+ ```typescript
292
+ type Task = {
293
+ id: string;
294
+ title: string;
295
+ completed: boolean;
296
+ priority: 'low' | 'medium' | 'high';
297
+ };
298
+
299
+ function TaskList({ tasks }: { tasks: Task[] }) {
300
+ return (
301
+ <List
302
+ items={tasks}
303
+ keyExtractor={(task) => task.id}
304
+ renderItem={(task) => (
305
+ <div className={`task priority-${task.priority}`}>
306
+ <input type="checkbox" checked={task.completed} readOnly />
307
+ <span className={task.completed ? 'completed' : ''}>{task.title}</span>
308
+ </div>
309
+ )}
310
+ renderEmpty={() => (
311
+ <div className="empty-state">No tasks yet. Add one to get started!</div>
312
+ )}
313
+ as="div"
314
+ />
315
+ );
316
+ }
317
+ ```
318
+
319
+ ## Constrained Generic Components
320
+
321
+ Use constraints to ensure required properties or methods.
322
+
323
+ ```typescript
324
+ // Constraint: items must have `id` property
325
+ type HasId = { id: string | number };
326
+
327
+ type GridProps<T extends HasId> = {
328
+ items: T[];
329
+ renderCard: (item: T) => React.ReactNode;
330
+ columns?: 2 | 3 | 4;
331
+ };
332
+
333
+ function Grid<T extends HasId>({
334
+ items,
335
+ renderCard,
336
+ columns = 3,
337
+ }: GridProps<T>) {
338
+ return (
339
+ <div className={`grid grid-cols-${columns}`}>
340
+ {items.map((item) => (
341
+ <div key={item.id} className="grid-item">
342
+ {renderCard(item)}
343
+ </div>
344
+ ))}
345
+ </div>
346
+ );
347
+ }
348
+
349
+ // Usage - type must have `id` property
350
+ type Product = {
351
+ id: number;
352
+ name: string;
353
+ price: number;
354
+ image: string;
355
+ };
356
+
357
+ <Grid
358
+ items={products}
359
+ renderCard={(product) => (
360
+ <div>
361
+ <img src={product.image} alt={product.name} />
362
+ <h3>{product.name}</h3>
363
+ <p>${product.price}</p>
364
+ </div>
365
+ )}
366
+ columns={3}
367
+ />;
368
+ ```
369
+
370
+ ## Multiple Generic Parameters
371
+
372
+ Components with multiple type parameters.
373
+
374
+ ```typescript
375
+ type PairProps<K, V> = {
376
+ pairs: Array<[K, V]>;
377
+ renderKey: (key: K) => React.ReactNode;
378
+ renderValue: (value: V) => React.ReactNode;
379
+ };
380
+
381
+ function KeyValueList<K, V>({ pairs, renderKey, renderValue }: PairProps<K, V>) {
382
+ return (
383
+ <dl>
384
+ {pairs.map(([key, value], index) => (
385
+ <React.Fragment key={index}>
386
+ <dt>{renderKey(key)}</dt>
387
+ <dd>{renderValue(value)}</dd>
388
+ </React.Fragment>
389
+ ))}
390
+ </dl>
391
+ );
392
+ }
393
+
394
+ // Usage
395
+ type MetricKey = 'cpu' | 'memory' | 'disk';
396
+ type MetricValue = { current: number; max: number };
397
+
398
+ const metrics: Array<[MetricKey, MetricValue]> = [
399
+ ['cpu', { current: 45, max: 100 }],
400
+ ['memory', { current: 8, max: 16 }],
401
+ ['disk', { current: 250, max: 500 }],
402
+ ];
403
+
404
+ <KeyValueList
405
+ pairs={metrics}
406
+ renderKey={(key) => <strong>{key.toUpperCase()}</strong>}
407
+ renderValue={(val) => (
408
+ <span>
409
+ {val.current}/{val.max}
410
+ </span>
411
+ )}
412
+ />;
413
+ ```
414
+
415
+ ## Generic Form Field Component
416
+
417
+ Reusable form field with type-safe value handling.
418
+
419
+ ```typescript
420
+ type FieldProps<T> = {
421
+ name: string;
422
+ label: string;
423
+ value: T;
424
+ onChange: (value: T) => void;
425
+ type: 'text' | 'number' | 'email' | 'password';
426
+ error?: string;
427
+ required?: boolean;
428
+ };
429
+
430
+ function FormField<T extends string | number>({
431
+ name,
432
+ label,
433
+ value,
434
+ onChange,
435
+ type,
436
+ error,
437
+ required = false,
438
+ }: FieldProps<T>) {
439
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
440
+ const newValue =
441
+ type === 'number' ? (Number(e.target.value) as T) : (e.target.value as T);
442
+ onChange(newValue);
443
+ };
444
+
445
+ return (
446
+ <div className="form-field">
447
+ <label htmlFor={name}>
448
+ {label}
449
+ {required && <span className="required">*</span>}
450
+ </label>
451
+ <input
452
+ id={name}
453
+ name={name}
454
+ type={type}
455
+ value={value}
456
+ onChange={handleChange}
457
+ required={required}
458
+ aria-invalid={!!error}
459
+ aria-describedby={error ? `${name}-error` : undefined}
460
+ />
461
+ {error && (
462
+ <span id={`${name}-error`} className="error">
463
+ {error}
464
+ </span>
465
+ )}
466
+ </div>
467
+ );
468
+ }
469
+
470
+ // Usage
471
+ function UserForm() {
472
+ const [name, setName] = React.useState('');
473
+ const [age, setAge] = React.useState(0);
474
+
475
+ return (
476
+ <form>
477
+ <FormField
478
+ name="name"
479
+ label="Name"
480
+ value={name}
481
+ onChange={setName}
482
+ type="text"
483
+ required
484
+ />
485
+ <FormField
486
+ name="age"
487
+ label="Age"
488
+ value={age}
489
+ onChange={setAge}
490
+ type="number"
491
+ />
492
+ </form>
493
+ );
494
+ }
495
+ ```
496
+
497
+ ## Generic Modal/Dialog
498
+
499
+ Type-safe modal with generic result type.
500
+
501
+ ```typescript
502
+ type ModalProps<T> = {
503
+ isOpen: boolean;
504
+ onClose: (result?: T) => void;
505
+ title: string;
506
+ children: (submit: (result: T) => void) => React.ReactNode;
507
+ };
508
+
509
+ function Modal<T>({ isOpen, onClose, title, children }: ModalProps<T>) {
510
+ if (!isOpen) return null;
511
+
512
+ const handleSubmit = (result: T) => {
513
+ onClose(result);
514
+ };
515
+
516
+ return (
517
+ <div className="modal-overlay">
518
+ <div className="modal">
519
+ <header>
520
+ <h2>{title}</h2>
521
+ <button onClick={() => onClose()}>×</button>
522
+ </header>
523
+ <div className="modal-body">{children(handleSubmit)}</div>
524
+ </div>
525
+ </div>
526
+ );
527
+ }
528
+
529
+ // Usage
530
+ type UserFormData = { name: string; email: string };
531
+
532
+ function App() {
533
+ const [showModal, setShowModal] = React.useState(false);
534
+ const [formData, setFormData] = React.useState<UserFormData>({
535
+ name: '',
536
+ email: '',
537
+ });
538
+
539
+ const handleModalClose = (result?: UserFormData) => {
540
+ if (result) {
541
+ console.log('User submitted:', result);
542
+ }
543
+ setShowModal(false);
544
+ };
545
+
546
+ return (
547
+ <>
548
+ <button onClick={() => setShowModal(true)}>Add User</button>
549
+
550
+ <Modal<UserFormData>
551
+ isOpen={showModal}
552
+ onClose={handleModalClose}
553
+ title="Add New User"
554
+ >
555
+ {(submit) => (
556
+ <form
557
+ onSubmit={(e) => {
558
+ e.preventDefault();
559
+ submit(formData);
560
+ }}
561
+ >
562
+ <input
563
+ value={formData.name}
564
+ onChange={(e) => setFormData({ ...formData, name: e.target.value })}
565
+ placeholder="Name"
566
+ />
567
+ <input
568
+ value={formData.email}
569
+ onChange={(e) => setFormData({ ...formData, email: e.target.value })}
570
+ placeholder="Email"
571
+ />
572
+ <button type="submit">Submit</button>
573
+ </form>
574
+ )}
575
+ </Modal>
576
+ </>
577
+ );
578
+ }
579
+ ```