cfsa-antigravity 1.0.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 (378) hide show
  1. package/bin/cli.mjs +324 -0
  2. package/package.json +34 -0
  3. package/template/.agent/instructions/commands.md +48 -0
  4. package/template/.agent/instructions/patterns.md +61 -0
  5. package/template/.agent/instructions/structure.md +29 -0
  6. package/template/.agent/instructions/tech-stack.md +43 -0
  7. package/template/.agent/instructions/workflow.md +41 -0
  8. package/template/.agent/kit-sync.md +15 -0
  9. package/template/.agent/rules/boundary-not-placeholder.md +146 -0
  10. package/template/.agent/rules/completion-checklist.md +48 -0
  11. package/template/.agent/rules/decision-classification.md +103 -0
  12. package/template/.agent/rules/extensibility.md +47 -0
  13. package/template/.agent/rules/question-vs-command.md +81 -0
  14. package/template/.agent/rules/security-first.md +43 -0
  15. package/template/.agent/rules/specificity-standards.md +54 -0
  16. package/template/.agent/rules/tdd-contract-first.md +57 -0
  17. package/template/.agent/rules/vertical-slices.md +42 -0
  18. package/template/.agent/skill-library/MANIFEST.md +480 -0
  19. package/template/.agent/skill-library/README.md +38 -0
  20. package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
  21. package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
  22. package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
  23. package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
  24. package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
  25. package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
  26. package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
  27. package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
  28. package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
  29. package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
  30. package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
  31. package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
  32. package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
  33. package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
  34. package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
  35. package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
  36. package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
  37. package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
  38. package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
  39. package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
  40. package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
  41. package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
  42. package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
  43. package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
  44. package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
  45. package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
  46. package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
  47. package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
  48. package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
  49. package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
  50. package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
  51. package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
  52. package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
  53. package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
  54. package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
  55. package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
  56. package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
  57. package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
  58. package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
  59. package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
  60. package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
  61. package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
  62. package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
  63. package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
  64. package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
  65. package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
  66. package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
  67. package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
  68. package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
  69. package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
  70. package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
  71. package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
  72. package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
  73. package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
  74. package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
  75. package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
  76. package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
  77. package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
  78. package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
  79. package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
  80. package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
  81. package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
  82. package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
  83. package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
  84. package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
  85. package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
  86. package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
  87. package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
  88. package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
  89. package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
  90. package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
  91. package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
  92. package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
  93. package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
  94. package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
  95. package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
  96. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
  97. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
  98. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
  99. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
  100. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
  101. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
  102. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
  103. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
  104. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
  105. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
  106. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
  107. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
  108. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
  109. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
  110. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
  111. package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
  112. package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
  113. package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
  114. package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
  115. package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
  116. package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
  117. package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
  118. package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
  119. package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
  120. package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
  121. package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
  122. package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
  123. package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
  124. package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
  125. package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
  126. package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
  127. package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
  128. package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
  129. package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
  130. package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
  131. package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
  132. package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
  133. package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
  134. package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
  135. package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
  136. package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
  137. package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
  138. package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
  139. package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
  140. package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
  141. package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
  142. package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
  143. package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
  144. package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
  145. package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
  146. package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
  147. package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
  148. package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
  149. package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
  150. package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
  151. package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
  152. package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
  153. package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
  154. package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
  155. package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
  156. package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
  157. package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
  158. package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
  159. package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
  160. package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
  161. package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
  162. package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
  163. package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
  164. package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
  165. package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
  166. package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
  167. package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
  168. package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
  169. package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
  170. package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
  171. package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
  172. package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
  173. package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
  174. package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
  175. package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
  176. package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
  177. package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
  178. package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
  179. package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
  180. package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
  181. package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
  182. package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
  183. package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
  184. package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
  185. package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
  186. package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
  187. package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
  188. package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
  189. package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
  190. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
  191. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
  192. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
  193. package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
  194. package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
  195. package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
  196. package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
  197. package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
  198. package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
  199. package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
  200. package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
  201. package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
  202. package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
  203. package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
  204. package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
  205. package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
  206. package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
  207. package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
  208. package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
  209. package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
  210. package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
  211. package/template/.agent/skills/accessibility/SKILL.md +522 -0
  212. package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
  213. package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
  214. package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
  215. package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
  216. package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
  217. package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  218. package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
  219. package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
  220. package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
  221. package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
  222. package/template/.agent/skills/api-versioning/SKILL.md +420 -0
  223. package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
  224. package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
  225. package/template/.agent/skills/brainstorming/SKILL.md +236 -0
  226. package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
  227. package/template/.agent/skills/clean-code/SKILL.md +94 -0
  228. package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
  229. package/template/.agent/skills/concise-planning/SKILL.md +68 -0
  230. package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
  231. package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
  232. package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
  233. package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
  234. package/template/.agent/skills/design-direction/SKILL.md +45 -0
  235. package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
  236. package/template/.agent/skills/find-skills/SKILL.md +145 -0
  237. package/template/.agent/skills/git-advanced/SKILL.md +972 -0
  238. package/template/.agent/skills/git-workflow/SKILL.md +420 -0
  239. package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
  240. package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
  241. package/template/.agent/skills/migration-management/SKILL.md +384 -0
  242. package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
  243. package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
  244. package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
  245. package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
  246. package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
  247. package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
  248. package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
  249. package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
  250. package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
  251. package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
  252. package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
  253. package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
  254. package/template/.agent/skills/prd-templates/SKILL.md +88 -0
  255. package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
  256. package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
  257. package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
  258. package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
  259. package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
  260. package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
  261. package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
  262. package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
  263. package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
  264. package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
  265. package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
  266. package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
  267. package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
  268. package/template/.agent/skills/prompt-engineer/README.md +659 -0
  269. package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
  270. package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
  271. package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
  272. package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
  273. package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
  274. package/template/.agent/skills/session-continuity/SKILL.md +730 -0
  275. package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
  276. package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
  277. package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
  278. package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
  279. package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
  280. package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
  281. package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
  282. package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
  283. package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
  284. package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
  285. package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
  286. package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
  287. package/template/.agent/skills/skill-creator/README.md +270 -0
  288. package/template/.agent/skills/skill-creator/SKILL.md +590 -0
  289. package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
  290. package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
  291. package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
  292. package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
  293. package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
  294. package/template/.agent/skills/spec-writing/SKILL.md +110 -0
  295. package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
  296. package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
  297. package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  298. package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
  299. package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
  300. package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
  301. package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
  302. package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
  303. package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
  304. package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
  305. package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
  306. package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
  307. package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
  308. package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
  309. package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
  310. package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
  311. package/template/.agent/skills/technical-writer/SKILL.md +242 -0
  312. package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
  313. package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
  314. package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
  315. package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
  316. package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
  317. package/template/.agent/workflows/audit-ambiguity.md +64 -0
  318. package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
  319. package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
  320. package/template/.agent/workflows/bootstrap-agents.md +66 -0
  321. package/template/.agent/workflows/create-prd-architecture.md +119 -0
  322. package/template/.agent/workflows/create-prd-compile.md +138 -0
  323. package/template/.agent/workflows/create-prd-design-system.md +135 -0
  324. package/template/.agent/workflows/create-prd-security.md +113 -0
  325. package/template/.agent/workflows/create-prd-stack.md +91 -0
  326. package/template/.agent/workflows/create-prd.md +168 -0
  327. package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
  328. package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
  329. package/template/.agent/workflows/decompose-architecture.md +111 -0
  330. package/template/.agent/workflows/evolve-contract.md +98 -0
  331. package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
  332. package/template/.agent/workflows/evolve-feature-classify.md +116 -0
  333. package/template/.agent/workflows/evolve-feature.md +56 -0
  334. package/template/.agent/workflows/ideate-discover.md +144 -0
  335. package/template/.agent/workflows/ideate-extract.md +129 -0
  336. package/template/.agent/workflows/ideate-validate.md +117 -0
  337. package/template/.agent/workflows/ideate.md +113 -0
  338. package/template/.agent/workflows/implement-slice-setup.md +113 -0
  339. package/template/.agent/workflows/implement-slice-tdd.md +198 -0
  340. package/template/.agent/workflows/implement-slice.md +50 -0
  341. package/template/.agent/workflows/plan-phase.md +202 -0
  342. package/template/.agent/workflows/propagate-decision-apply.md +135 -0
  343. package/template/.agent/workflows/propagate-decision-scan.md +147 -0
  344. package/template/.agent/workflows/propagate-decision.md +56 -0
  345. package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
  346. package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
  347. package/template/.agent/workflows/remediate-pipeline.md +55 -0
  348. package/template/.agent/workflows/resolve-ambiguity.md +82 -0
  349. package/template/.agent/workflows/sync-kit.md +209 -0
  350. package/template/.agent/workflows/update-architecture-map.md +74 -0
  351. package/template/.agent/workflows/validate-phase.md +219 -0
  352. package/template/.agent/workflows/verify-infrastructure.md +207 -0
  353. package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
  354. package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
  355. package/template/.agent/workflows/write-architecture-spec.md +63 -0
  356. package/template/.agent/workflows/write-be-spec-classify.md +165 -0
  357. package/template/.agent/workflows/write-be-spec-write.md +98 -0
  358. package/template/.agent/workflows/write-be-spec.md +76 -0
  359. package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
  360. package/template/.agent/workflows/write-fe-spec-write.md +94 -0
  361. package/template/.agent/workflows/write-fe-spec.md +71 -0
  362. package/template/AGENTS.md +176 -0
  363. package/template/GEMINI.md +177 -0
  364. package/template/docs/README.md +187 -0
  365. package/template/docs/audits/.gitkeep +0 -0
  366. package/template/docs/audits/README.md +10 -0
  367. package/template/docs/plans/.gitkeep +0 -0
  368. package/template/docs/plans/README.md +21 -0
  369. package/template/docs/plans/be/.gitkeep +0 -0
  370. package/template/docs/plans/be/README.md +11 -0
  371. package/template/docs/plans/fe/.gitkeep +0 -0
  372. package/template/docs/plans/fe/README.md +11 -0
  373. package/template/docs/plans/ia/.gitkeep +0 -0
  374. package/template/docs/plans/ia/README.md +17 -0
  375. package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
  376. package/template/docs/plans/ia/deep-dives/README.md +5 -0
  377. package/template/docs/plans/phases/.gitkeep +0 -0
  378. package/template/docs/plans/phases/README.md +11 -0
@@ -0,0 +1,920 @@
1
+ ---
2
+ name: tauri
3
+ description: Provides comprehensive Tauri 2.0 desktop application development patterns including Rust backend commands, event system, state management, plugin architecture, window management, system tray, file system access, security model, auto-updater, IPC patterns, multi-window communication, deep linking, building and distribution, and testing strategies. Use when building cross-platform desktop apps with Tauri.
4
+ version: 1.0.0
5
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
6
+ ---
7
+
8
+ # Tauri 2.0 Desktop Application Development Patterns
9
+
10
+ ## Overview
11
+
12
+ Expert guide for building secure, lightweight, cross-platform desktop applications with Tauri 2.0. Tauri uses the OS webview for the frontend and a Rust backend, producing small binaries with low memory usage. Covers commands, events, state, plugins, security, distribution, and testing.
13
+
14
+ ## When to Use
15
+
16
+ - Building cross-platform desktop applications (Windows, macOS, Linux)
17
+ - When small binary size and low memory usage matter (vs Electron)
18
+ - When Rust backend performance is needed for file processing, crypto, or computation
19
+ - When security is a priority (capability-based permissions, no Node.js in production)
20
+ - Building system utilities, developer tools, or productivity apps
21
+ - When you want web frontend skills (React, Vue, Svelte, etc.) for the UI
22
+ - When you need deep OS integration (tray, notifications, file system)
23
+
24
+ ## Instructions
25
+
26
+ 1. **Security first**: Define capabilities and permissions before writing commands
27
+ 2. **Minimize the Rust surface**: Only expose what the frontend needs via commands
28
+ 3. **Use the event system** for backend-to-frontend communication (not polling)
29
+ 4. **Manage state properly**: Use `tauri::State` for shared backend state
30
+ 5. **Scope file access**: Never give blanket file system access
31
+ 6. **Test commands in isolation**: Rust unit tests for backend logic, E2E for integration
32
+ 7. **Use plugins**: Prefer official plugins over custom implementations
33
+
34
+ ## Examples
35
+
36
+ ### Project Structure
37
+
38
+ ```
39
+ my-app/
40
+ src-tauri/
41
+ src/
42
+ main.rs # Tauri entry point
43
+ lib.rs # Command and state definitions
44
+ commands/
45
+ mod.rs # Command module exports
46
+ file_ops.rs # File operation commands
47
+ settings.rs # Settings commands
48
+ state/
49
+ mod.rs # State module exports
50
+ app_state.rs # Application state
51
+ capabilities/
52
+ main.json # Default capability
53
+ admin.json # Admin capability
54
+ Cargo.toml # Rust dependencies
55
+ tauri.conf.json # Tauri configuration
56
+ build.rs # Build script
57
+ src/ # Frontend source (React, Vue, etc.)
58
+ App.tsx
59
+ lib/
60
+ tauri.ts # Typed command wrappers
61
+ events.ts # Event type definitions
62
+ package.json
63
+ ```
64
+
65
+ ## Constraints and Warnings
66
+
67
+ - **Webview differences**: Rendering varies between platforms (WebView2 on Windows, WebKit on macOS/Linux)
68
+ - **No Node.js**: The frontend runs in a webview, not Node.js -- no `require()` or `fs` module
69
+ - **Rust learning curve**: Backend commands require Rust knowledge
70
+ - **Linux webview**: WebKitGTK must be installed; version varies by distro
71
+ - **CSP is mandatory**: Content Security Policy is enforced by default
72
+ - **Async commands**: Long-running operations must be async to avoid blocking the main thread
73
+ - **State is per-process**: Managed state is not shared across multiple app instances
74
+ - **Plugin compatibility**: Check plugin compatibility with Tauri 2.0 (many v1 plugins need updates)
75
+
76
+ ## Core Concepts
77
+
78
+ ### Application Entry Point
79
+
80
+ ```rust
81
+ // src-tauri/src/main.rs
82
+ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
83
+
84
+ fn main() {
85
+ my_app_lib::run();
86
+ }
87
+ ```
88
+
89
+ ```rust
90
+ // src-tauri/src/lib.rs
91
+ mod commands;
92
+ mod state;
93
+
94
+ use state::app_state::AppState;
95
+
96
+ #[cfg_attr(mobile, tauri::mobile_entry_point)]
97
+ pub fn run() {
98
+ tauri::Builder::default()
99
+ .plugin(tauri_plugin_shell::init())
100
+ .plugin(tauri_plugin_fs::init())
101
+ .plugin(tauri_plugin_dialog::init())
102
+ .manage(AppState::default())
103
+ .invoke_handler(tauri::generate_handler![
104
+ commands::file_ops::read_file,
105
+ commands::file_ops::write_file,
106
+ commands::settings::get_settings,
107
+ commands::settings::update_settings,
108
+ ])
109
+ .run(tauri::generate_context!())
110
+ .expect("error while running tauri application");
111
+ }
112
+ ```
113
+
114
+ ### Commands (Rust Backend to Frontend IPC)
115
+
116
+ Commands are Rust functions callable from the frontend via `invoke`:
117
+
118
+ ```rust
119
+ // src-tauri/src/commands/file_ops.rs
120
+ use serde::{Deserialize, Serialize};
121
+ use tauri::command;
122
+ use std::fs;
123
+
124
+ #[derive(Debug, Serialize, Deserialize)]
125
+ pub struct FileInfo {
126
+ pub name: String,
127
+ pub size: u64,
128
+ pub is_directory: bool,
129
+ pub modified: Option<u64>,
130
+ }
131
+
132
+ #[derive(Debug, Serialize, Deserialize)]
133
+ pub struct FileError {
134
+ pub message: String,
135
+ pub code: String,
136
+ }
137
+
138
+ // Simple command -- synchronous
139
+ #[command]
140
+ pub fn read_file(path: String) -> Result<String, FileError> {
141
+ fs::read_to_string(&path).map_err(|e| FileError {
142
+ message: e.to_string(),
143
+ code: "READ_ERROR".to_string(),
144
+ })
145
+ }
146
+
147
+ // Async command -- for I/O operations
148
+ #[command]
149
+ pub async fn list_directory(path: String) -> Result<Vec<FileInfo>, FileError> {
150
+ let entries = tokio::fs::read_dir(&path)
151
+ .await
152
+ .map_err(|e| FileError {
153
+ message: e.to_string(),
154
+ code: "DIR_ERROR".to_string(),
155
+ })?;
156
+
157
+ let mut files = Vec::new();
158
+ let mut entries = entries;
159
+
160
+ while let Some(entry) = entries.next_entry().await.map_err(|e| FileError {
161
+ message: e.to_string(),
162
+ code: "ENTRY_ERROR".to_string(),
163
+ })? {
164
+ let metadata = entry.metadata().await.map_err(|e| FileError {
165
+ message: e.to_string(),
166
+ code: "METADATA_ERROR".to_string(),
167
+ })?;
168
+
169
+ files.push(FileInfo {
170
+ name: entry.file_name().to_string_lossy().to_string(),
171
+ size: metadata.len(),
172
+ is_directory: metadata.is_dir(),
173
+ modified: metadata
174
+ .modified()
175
+ .ok()
176
+ .and_then(|t| t.duration_since(std::time::UNIX_EPOCH).ok())
177
+ .map(|d| d.as_secs()),
178
+ });
179
+ }
180
+
181
+ Ok(files)
182
+ }
183
+
184
+ // Command with state access
185
+ #[command]
186
+ pub fn write_file(
187
+ path: String,
188
+ content: String,
189
+ state: tauri::State<'_, crate::state::app_state::AppState>,
190
+ ) -> Result<(), FileError> {
191
+ // Check if writing is allowed
192
+ if !state.is_write_enabled() {
193
+ return Err(FileError {
194
+ message: "Writing is disabled".to_string(),
195
+ code: "WRITE_DISABLED".to_string(),
196
+ });
197
+ }
198
+
199
+ fs::write(&path, &content).map_err(|e| FileError {
200
+ message: e.to_string(),
201
+ code: "WRITE_ERROR".to_string(),
202
+ })
203
+ }
204
+ ```
205
+
206
+ ### Calling Commands from the Frontend
207
+
208
+ ```typescript
209
+ // src/lib/tauri.ts
210
+ import { invoke } from "@tauri-apps/api/core";
211
+
212
+ // Type-safe command wrappers
213
+ export interface FileInfo {
214
+ name: string;
215
+ size: number;
216
+ is_directory: boolean;
217
+ modified: number | null;
218
+ }
219
+
220
+ export interface FileError {
221
+ message: string;
222
+ code: string;
223
+ }
224
+
225
+ export async function readFile(path: string): Promise<string> {
226
+ return invoke<string>("read_file", { path });
227
+ }
228
+
229
+ export async function listDirectory(path: string): Promise<FileInfo[]> {
230
+ return invoke<FileInfo[]>("list_directory", { path });
231
+ }
232
+
233
+ export async function writeFile(
234
+ path: string,
235
+ content: string
236
+ ): Promise<void> {
237
+ return invoke<void>("write_file", { path, content });
238
+ }
239
+ ```
240
+
241
+ ```tsx
242
+ // src/App.tsx
243
+ import { useState } from "react";
244
+ import { listDirectory, type FileInfo } from "./lib/tauri";
245
+
246
+ function App() {
247
+ const [files, setFiles] = useState<FileInfo[]>([]);
248
+ const [error, setError] = useState<string | null>(null);
249
+
250
+ async function handleBrowse() {
251
+ try {
252
+ const result = await listDirectory("/home/user/documents");
253
+ setFiles(result);
254
+ setError(null);
255
+ } catch (err) {
256
+ setError((err as { message: string }).message);
257
+ }
258
+ }
259
+
260
+ return (
261
+ <div>
262
+ <button onClick={handleBrowse}>Browse Files</button>
263
+ {error && <p className="error">{error}</p>}
264
+ <ul>
265
+ {files.map((file) => (
266
+ <li key={file.name}>
267
+ {file.is_directory ? "[DIR] " : ""}
268
+ {file.name} ({file.size} bytes)
269
+ </li>
270
+ ))}
271
+ </ul>
272
+ </div>
273
+ );
274
+ }
275
+ ```
276
+
277
+ ### Event System
278
+
279
+ Events enable bidirectional communication without request/response:
280
+
281
+ ```rust
282
+ // src-tauri/src/commands/file_ops.rs
283
+ use tauri::{command, AppHandle, Emitter};
284
+ use serde::Serialize;
285
+
286
+ #[derive(Clone, Serialize)]
287
+ pub struct ProgressPayload {
288
+ pub current: u64,
289
+ pub total: u64,
290
+ pub file_name: String,
291
+ }
292
+
293
+ #[command]
294
+ pub async fn process_files(
295
+ paths: Vec<String>,
296
+ app: AppHandle,
297
+ ) -> Result<(), FileError> {
298
+ let total = paths.len() as u64;
299
+
300
+ for (i, path) in paths.iter().enumerate() {
301
+ // Emit progress to frontend
302
+ app.emit("file-progress", ProgressPayload {
303
+ current: i as u64 + 1,
304
+ total,
305
+ file_name: path.clone(),
306
+ }).map_err(|e| FileError {
307
+ message: e.to_string(),
308
+ code: "EMIT_ERROR".to_string(),
309
+ })?;
310
+
311
+ // Simulate processing
312
+ tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
313
+ }
314
+
315
+ app.emit("processing-complete", ()).unwrap();
316
+ Ok(())
317
+ }
318
+ ```
319
+
320
+ ```typescript
321
+ // src/lib/events.ts
322
+ import { listen, type UnlistenFn } from "@tauri-apps/api/event";
323
+ import { emit } from "@tauri-apps/api/event";
324
+
325
+ export interface ProgressPayload {
326
+ current: number;
327
+ total: number;
328
+ file_name: string;
329
+ }
330
+
331
+ export async function onFileProgress(
332
+ callback: (payload: ProgressPayload) => void
333
+ ): Promise<UnlistenFn> {
334
+ return listen<ProgressPayload>("file-progress", (event) => {
335
+ callback(event.payload);
336
+ });
337
+ }
338
+
339
+ export async function onProcessingComplete(
340
+ callback: () => void
341
+ ): Promise<UnlistenFn> {
342
+ return listen("processing-complete", () => {
343
+ callback();
344
+ });
345
+ }
346
+
347
+ // Frontend can also emit events to the backend
348
+ export async function cancelProcessing(): Promise<void> {
349
+ await emit("cancel-processing");
350
+ }
351
+ ```
352
+
353
+ ```tsx
354
+ // Usage in a React component
355
+ import { useEffect, useState } from "react";
356
+ import { onFileProgress, onProcessingComplete } from "./lib/events";
357
+ import { invoke } from "@tauri-apps/api/core";
358
+
359
+ function FileProcessor() {
360
+ const [progress, setProgress] = useState({ current: 0, total: 0 });
361
+
362
+ useEffect(() => {
363
+ const unlistenProgress = onFileProgress((payload) => {
364
+ setProgress({ current: payload.current, total: payload.total });
365
+ });
366
+
367
+ const unlistenComplete = onProcessingComplete(() => {
368
+ setProgress({ current: 0, total: 0 });
369
+ });
370
+
371
+ return () => {
372
+ unlistenProgress.then((fn) => fn());
373
+ unlistenComplete.then((fn) => fn());
374
+ };
375
+ }, []);
376
+
377
+ return (
378
+ <div>
379
+ {progress.total > 0 && (
380
+ <progress value={progress.current} max={progress.total} />
381
+ )}
382
+ </div>
383
+ );
384
+ }
385
+ ```
386
+
387
+ ### State Management (Managed State)
388
+
389
+ ```rust
390
+ // src-tauri/src/state/app_state.rs
391
+ use std::sync::Mutex;
392
+ use serde::{Deserialize, Serialize};
393
+
394
+ #[derive(Debug, Serialize, Deserialize, Clone)]
395
+ pub struct Settings {
396
+ pub theme: String,
397
+ pub auto_save: bool,
398
+ pub font_size: u32,
399
+ pub recent_files: Vec<String>,
400
+ }
401
+
402
+ impl Default for Settings {
403
+ fn default() -> Self {
404
+ Self {
405
+ theme: "system".to_string(),
406
+ auto_save: true,
407
+ font_size: 14,
408
+ recent_files: Vec::new(),
409
+ }
410
+ }
411
+ }
412
+
413
+ pub struct AppState {
414
+ pub settings: Mutex<Settings>,
415
+ pub write_enabled: Mutex<bool>,
416
+ }
417
+
418
+ impl Default for AppState {
419
+ fn default() -> Self {
420
+ Self {
421
+ settings: Mutex::new(Settings::default()),
422
+ write_enabled: Mutex::new(true),
423
+ }
424
+ }
425
+ }
426
+
427
+ impl AppState {
428
+ pub fn is_write_enabled(&self) -> bool {
429
+ *self.write_enabled.lock().unwrap()
430
+ }
431
+ }
432
+ ```
433
+
434
+ ```rust
435
+ // src-tauri/src/commands/settings.rs
436
+ use tauri::command;
437
+ use crate::state::app_state::{AppState, Settings};
438
+
439
+ #[command]
440
+ pub fn get_settings(state: tauri::State<'_, AppState>) -> Settings {
441
+ state.settings.lock().unwrap().clone()
442
+ }
443
+
444
+ #[command]
445
+ pub fn update_settings(
446
+ settings: Settings,
447
+ state: tauri::State<'_, AppState>,
448
+ ) -> Result<(), String> {
449
+ let mut current = state.settings.lock().map_err(|e| e.to_string())?;
450
+ *current = settings;
451
+ Ok(())
452
+ }
453
+ ```
454
+
455
+ ### Security Model: Capabilities and Permissions
456
+
457
+ ```json
458
+ // src-tauri/capabilities/main.json
459
+ {
460
+ "identifier": "main-capability",
461
+ "description": "Main window permissions",
462
+ "windows": ["main"],
463
+ "permissions": [
464
+ "core:default",
465
+ "shell:allow-open",
466
+ "dialog:allow-open",
467
+ "dialog:allow-save",
468
+ {
469
+ "identifier": "fs:allow-read-text-file",
470
+ "allow": [
471
+ { "path": "$APPDATA/**" },
472
+ { "path": "$HOME/Documents/**" }
473
+ ]
474
+ },
475
+ {
476
+ "identifier": "fs:allow-write-text-file",
477
+ "allow": [
478
+ { "path": "$APPDATA/**" }
479
+ ]
480
+ }
481
+ ]
482
+ }
483
+ ```
484
+
485
+ ```json
486
+ // src-tauri/tauri.conf.json (security section)
487
+ {
488
+ "app": {
489
+ "security": {
490
+ "csp": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'",
491
+ "dangerousDisableAssetCspModification": false
492
+ }
493
+ }
494
+ }
495
+ ```
496
+
497
+ ### Window Management
498
+
499
+ ```rust
500
+ // Creating and managing windows
501
+ use tauri::{command, AppHandle, Manager, WebviewWindowBuilder, WebviewUrl};
502
+
503
+ #[command]
504
+ pub async fn open_settings_window(app: AppHandle) -> Result<(), String> {
505
+ // Check if window already exists
506
+ if let Some(window) = app.get_webview_window("settings") {
507
+ window.set_focus().map_err(|e| e.to_string())?;
508
+ return Ok(());
509
+ }
510
+
511
+ WebviewWindowBuilder::new(
512
+ &app,
513
+ "settings",
514
+ WebviewUrl::App("settings.html".into()),
515
+ )
516
+ .title("Settings")
517
+ .inner_size(600.0, 400.0)
518
+ .resizable(false)
519
+ .center()
520
+ .build()
521
+ .map_err(|e| e.to_string())?;
522
+
523
+ Ok(())
524
+ }
525
+
526
+ #[command]
527
+ pub async fn close_window(app: AppHandle, label: String) -> Result<(), String> {
528
+ if let Some(window) = app.get_webview_window(&label) {
529
+ window.close().map_err(|e| e.to_string())?;
530
+ }
531
+ Ok(())
532
+ }
533
+ ```
534
+
535
+ ### System Tray
536
+
537
+ ```rust
538
+ // src-tauri/src/lib.rs
539
+ use tauri::{
540
+ menu::{Menu, MenuItem},
541
+ tray::TrayIconBuilder,
542
+ Manager,
543
+ };
544
+
545
+ pub fn run() {
546
+ tauri::Builder::default()
547
+ .setup(|app| {
548
+ let quit = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?;
549
+ let show = MenuItem::with_id(app, "show", "Show Window", true, None::<&str>)?;
550
+ let menu = Menu::with_items(app, &[&show, &quit])?;
551
+
552
+ TrayIconBuilder::new()
553
+ .icon(app.default_window_icon().unwrap().clone())
554
+ .menu(&menu)
555
+ .on_menu_event(|app, event| match event.id.as_ref() {
556
+ "quit" => {
557
+ app.exit(0);
558
+ }
559
+ "show" => {
560
+ if let Some(window) = app.get_webview_window("main") {
561
+ let _ = window.show();
562
+ let _ = window.set_focus();
563
+ }
564
+ }
565
+ _ => {}
566
+ })
567
+ .build(app)?;
568
+
569
+ Ok(())
570
+ })
571
+ .run(tauri::generate_context!())
572
+ .expect("error while running tauri application");
573
+ }
574
+ ```
575
+
576
+ ### Plugins
577
+
578
+ ```rust
579
+ // Using official plugins
580
+ // Cargo.toml
581
+ // [dependencies]
582
+ // tauri-plugin-fs = "2"
583
+ // tauri-plugin-dialog = "2"
584
+ // tauri-plugin-shell = "2"
585
+ // tauri-plugin-store = "2"
586
+ // tauri-plugin-updater = "2"
587
+
588
+ // src-tauri/src/lib.rs
589
+ pub fn run() {
590
+ tauri::Builder::default()
591
+ .plugin(tauri_plugin_fs::init())
592
+ .plugin(tauri_plugin_dialog::init())
593
+ .plugin(tauri_plugin_shell::init())
594
+ .plugin(tauri_plugin_store::Builder::default().build())
595
+ .plugin(tauri_plugin_updater::Builder::default().build())
596
+ .run(tauri::generate_context!())
597
+ .expect("error while running tauri application");
598
+ }
599
+ ```
600
+
601
+ ### Custom Plugin
602
+
603
+ ```rust
604
+ // src-tauri/src/plugins/analytics.rs
605
+ use tauri::{
606
+ plugin::{Builder, TauriPlugin},
607
+ Runtime, Manager,
608
+ };
609
+ use serde::Serialize;
610
+ use std::sync::Mutex;
611
+
612
+ #[derive(Debug, Default)]
613
+ struct AnalyticsState {
614
+ events: Mutex<Vec<AnalyticsEvent>>,
615
+ }
616
+
617
+ #[derive(Debug, Clone, Serialize)]
618
+ struct AnalyticsEvent {
619
+ name: String,
620
+ timestamp: u64,
621
+ }
622
+
623
+ #[tauri::command]
624
+ async fn track_event(
625
+ name: String,
626
+ state: tauri::State<'_, AnalyticsState>,
627
+ ) -> Result<(), String> {
628
+ let event = AnalyticsEvent {
629
+ name,
630
+ timestamp: std::time::SystemTime::now()
631
+ .duration_since(std::time::UNIX_EPOCH)
632
+ .unwrap()
633
+ .as_secs(),
634
+ };
635
+ state.events.lock().unwrap().push(event);
636
+ Ok(())
637
+ }
638
+
639
+ pub fn init<R: Runtime>() -> TauriPlugin<R> {
640
+ Builder::new("analytics")
641
+ .setup(|app, _api| {
642
+ app.manage(AnalyticsState::default());
643
+ Ok(())
644
+ })
645
+ .invoke_handler(tauri::generate_handler![track_event])
646
+ .build()
647
+ }
648
+ ```
649
+
650
+ ### Auto-Updater
651
+
652
+ ```json
653
+ // src-tauri/tauri.conf.json
654
+ {
655
+ "plugins": {
656
+ "updater": {
657
+ "pubkey": "YOUR_PUBLIC_KEY_HERE",
658
+ "endpoints": [
659
+ "https://releases.myapp.com/{{target}}/{{arch}}/{{current_version}}"
660
+ ]
661
+ }
662
+ }
663
+ }
664
+ ```
665
+
666
+ ```typescript
667
+ // src/lib/updater.ts
668
+ import { check } from "@tauri-apps/plugin-updater";
669
+ import { relaunch } from "@tauri-apps/plugin-process";
670
+
671
+ export async function checkForUpdates(): Promise<void> {
672
+ const update = await check();
673
+
674
+ if (update) {
675
+ console.log("Update available:", update.version);
676
+
677
+ // Download and install
678
+ await update.downloadAndInstall((event) => {
679
+ switch (event.event) {
680
+ case "Started":
681
+ console.log("Download started, size:", event.data.contentLength);
682
+ break;
683
+ case "Progress":
684
+ console.log("Downloaded:", event.data.chunkLength);
685
+ break;
686
+ case "Finished":
687
+ console.log("Download complete");
688
+ break;
689
+ }
690
+ });
691
+
692
+ // Restart the app
693
+ await relaunch();
694
+ }
695
+ }
696
+ ```
697
+
698
+ ### Multi-Window IPC
699
+
700
+ ```rust
701
+ // Send events between windows
702
+ use tauri::{command, AppHandle, Emitter};
703
+
704
+ #[command]
705
+ pub fn send_to_window(
706
+ app: AppHandle,
707
+ target_window: String,
708
+ event_name: String,
709
+ payload: serde_json::Value,
710
+ ) -> Result<(), String> {
711
+ app.emit_to(&target_window, &event_name, payload)
712
+ .map_err(|e| e.to_string())
713
+ }
714
+ ```
715
+
716
+ ```typescript
717
+ // Listen in the target window
718
+ import { listen } from "@tauri-apps/api/event";
719
+
720
+ // In the settings window, listen for theme changes from main
721
+ const unlisten = await listen<{ theme: string }>(
722
+ "theme-changed",
723
+ (event) => {
724
+ applyTheme(event.payload.theme);
725
+ }
726
+ );
727
+ ```
728
+
729
+ ### Deep Linking
730
+
731
+ ```json
732
+ // src-tauri/tauri.conf.json
733
+ {
734
+ "plugins": {
735
+ "deep-link": {
736
+ "desktop": {
737
+ "schemes": ["myapp"]
738
+ }
739
+ }
740
+ }
741
+ }
742
+ ```
743
+
744
+ ```rust
745
+ // Handle deep links
746
+ use tauri_plugin_deep_link::DeepLinkExt;
747
+
748
+ pub fn run() {
749
+ tauri::Builder::default()
750
+ .plugin(tauri_plugin_deep_link::init())
751
+ .setup(|app| {
752
+ app.deep_link().on_open_url(|event| {
753
+ for url in event.urls() {
754
+ println!("Deep link received: {}", url);
755
+ // Route to appropriate handler based on URL
756
+ }
757
+ });
758
+ Ok(())
759
+ })
760
+ .run(tauri::generate_context!())
761
+ .expect("error while running tauri application");
762
+ }
763
+ ```
764
+
765
+ ## Building and Distribution
766
+
767
+ ### Build Configuration
768
+
769
+ ```json
770
+ // src-tauri/tauri.conf.json
771
+ {
772
+ "productName": "My App",
773
+ "version": "1.0.0",
774
+ "identifier": "com.mycompany.myapp",
775
+ "build": {
776
+ "beforeBuildCommand": "pnpm build",
777
+ "beforeDevCommand": "pnpm dev",
778
+ "devUrl": "http://localhost:5173",
779
+ "frontendDist": "../dist"
780
+ },
781
+ "bundle": {
782
+ "active": true,
783
+ "targets": "all",
784
+ "icon": [
785
+ "icons/32x32.png",
786
+ "icons/128x128.png",
787
+ "icons/128x128@2x.png",
788
+ "icons/icon.icns",
789
+ "icons/icon.ico"
790
+ ],
791
+ "windows": {
792
+ "wix": {
793
+ "language": "en-US"
794
+ }
795
+ },
796
+ "macOS": {
797
+ "minimumSystemVersion": "10.15",
798
+ "signingIdentity": null,
799
+ "entitlements": null
800
+ },
801
+ "linux": {
802
+ "appimage": {
803
+ "bundleMediaFramework": true
804
+ },
805
+ "deb": {
806
+ "depends": ["libwebkit2gtk-4.1-0"]
807
+ }
808
+ }
809
+ }
810
+ }
811
+ ```
812
+
813
+ ### Build Commands
814
+
815
+ ```bash
816
+ # Development
817
+ pnpm tauri dev
818
+
819
+ # Build for current platform
820
+ pnpm tauri build
821
+
822
+ # Build with debug info
823
+ pnpm tauri build --debug
824
+
825
+ # Build specific bundle format
826
+ pnpm tauri build --bundles deb
827
+ pnpm tauri build --bundles appimage
828
+ pnpm tauri build --bundles msi
829
+ pnpm tauri build --bundles dmg
830
+ ```
831
+
832
+ ## Testing
833
+
834
+ ### Rust Unit Tests
835
+
836
+ ```rust
837
+ // src-tauri/src/commands/settings.rs
838
+ #[cfg(test)]
839
+ mod tests {
840
+ use super::*;
841
+
842
+ #[test]
843
+ fn test_default_settings() {
844
+ let settings = Settings::default();
845
+ assert_eq!(settings.theme, "system");
846
+ assert!(settings.auto_save);
847
+ assert_eq!(settings.font_size, 14);
848
+ assert!(settings.recent_files.is_empty());
849
+ }
850
+
851
+ #[test]
852
+ fn test_app_state_write_enabled() {
853
+ let state = AppState::default();
854
+ assert!(state.is_write_enabled());
855
+
856
+ *state.write_enabled.lock().unwrap() = false;
857
+ assert!(!state.is_write_enabled());
858
+ }
859
+ }
860
+ ```
861
+
862
+ ### Frontend E2E Testing
863
+
864
+ ```typescript
865
+ // tests/e2e/app.spec.ts
866
+ import { test, expect } from "@playwright/test";
867
+
868
+ // Tauri provides a WebDriver-compatible interface
869
+ test.describe("Application", () => {
870
+ test("should display the main window", async ({ page }) => {
871
+ await page.goto("tauri://localhost");
872
+ await expect(page.locator("h1")).toContainText("My App");
873
+ });
874
+
875
+ test("should list files when browse is clicked", async ({ page }) => {
876
+ await page.goto("tauri://localhost");
877
+ await page.click("button:has-text('Browse')");
878
+ await expect(page.locator("ul li")).toHaveCount(5);
879
+ });
880
+ });
881
+ ```
882
+
883
+ ## Anti-Patterns
884
+
885
+ | Anti-Pattern | Why It Is Bad | Correct Approach |
886
+ |--------------|---------------|------------------|
887
+ | Blanket file system permissions | Security risk, any file readable | Scope to specific directories |
888
+ | Blocking commands (sync I/O) | Freezes the UI thread | Use `async` commands with tokio |
889
+ | Storing secrets in frontend | Webview is inspectable | Store in Rust backend, use OS keychain |
890
+ | Skipping CSP configuration | XSS vulnerabilities | Define strict CSP in tauri.conf.json |
891
+ | Using `unsafe` Rust unnecessarily | Defeats Rust safety guarantees | Use safe abstractions |
892
+ | Polling backend from frontend | Wastes resources, laggy | Use event system (emit/listen) |
893
+ | Giant monolithic lib.rs | Unmaintainable | Split into modules (commands/, state/) |
894
+ | Hardcoded window sizes | Poor UX on different displays | Use responsive layouts, remember position |
895
+ | Ignoring platform differences | Broken on some OS | Test on all target platforms |
896
+ | `dangerousDisableAssetCspModification: true` | Disables security protections | Configure CSP properly instead |
897
+
898
+ ## Best Practices
899
+
900
+ 1. **Capability-based security**: Define the minimum permissions each window needs
901
+ 2. **Async all I/O**: Every command doing I/O should be async
902
+ 3. **Type-safe IPC**: Define shared types and use them on both sides
903
+ 4. **Error handling**: Return `Result<T, E>` from commands with descriptive errors
904
+ 5. **State with Mutex**: Always use `Mutex` or `RwLock` for shared state
905
+ 6. **Event cleanup**: Always call the unlisten function in component cleanup
906
+ 7. **Scoped file access**: Use path scopes in capabilities, never `$HOME/**`
907
+ 8. **Official plugins first**: Use tauri-plugin-* before writing custom code
908
+ 9. **Platform testing**: Test on Windows, macOS, and Linux before release
909
+ 10. **Small binaries**: Tauri apps should be under 10MB; audit dependencies
910
+ 11. **Graceful degradation**: Handle missing permissions gracefully in the UI
911
+ 12. **Update channel**: Set up auto-updater early in development
912
+
913
+ ## References
914
+
915
+ - Tauri 2.0 Documentation: https://v2.tauri.app
916
+ - Tauri GitHub: https://github.com/tauri-apps/tauri
917
+ - Tauri Plugins: https://github.com/tauri-apps/plugins-workspace
918
+ - Tauri Examples: https://github.com/tauri-apps/tauri/tree/dev/examples
919
+ - Rust Book: https://doc.rust-lang.org/book/
920
+ - Tauri Security: https://v2.tauri.app/security/