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.
- package/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,673 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rust
|
|
3
|
+
description: Rust development patterns for safe, performant systems code. Covers ownership/borrowing/lifetimes, error handling, traits, async with tokio, cargo workspaces, unsafe boundaries, serde, testing, and concurrency primitives.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rust Development Patterns
|
|
8
|
+
|
|
9
|
+
Expert guidance for writing safe, performant Rust code. Covers the ownership model, error handling idioms, trait-based abstractions, async programming with tokio, cargo workspace patterns, and the discipline required to write correct concurrent systems.
|
|
10
|
+
|
|
11
|
+
## When to Use This Skill
|
|
12
|
+
|
|
13
|
+
- Building performance-critical systems (network services, CLI tools, game engines)
|
|
14
|
+
- Writing memory-safe code without garbage collection
|
|
15
|
+
- Implementing concurrent or parallel systems
|
|
16
|
+
- Creating libraries with strong API guarantees
|
|
17
|
+
- Integrating with C/C++ code via FFI
|
|
18
|
+
- Building WebAssembly modules
|
|
19
|
+
|
|
20
|
+
## Core Concepts
|
|
21
|
+
|
|
22
|
+
### 1. Ownership, Borrowing, and Lifetimes
|
|
23
|
+
|
|
24
|
+
The foundation of Rust's memory safety guarantees.
|
|
25
|
+
|
|
26
|
+
```rust
|
|
27
|
+
// Ownership: each value has exactly one owner
|
|
28
|
+
fn take_ownership(s: String) {
|
|
29
|
+
println!("{s}");
|
|
30
|
+
} // s is dropped here
|
|
31
|
+
|
|
32
|
+
// Borrowing: references without taking ownership
|
|
33
|
+
fn borrow(s: &str) {
|
|
34
|
+
println!("{s}");
|
|
35
|
+
} // s is NOT dropped -- caller still owns it
|
|
36
|
+
|
|
37
|
+
// Mutable borrowing: only ONE mutable reference at a time
|
|
38
|
+
fn modify(s: &mut String) {
|
|
39
|
+
s.push_str(" world");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Lifetimes: compiler tracks how long references are valid
|
|
43
|
+
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
|
|
44
|
+
if x.len() > y.len() { x } else { y }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Lifetime elision rules handle most cases automatically.
|
|
48
|
+
// Only annotate when the compiler asks you to.
|
|
49
|
+
|
|
50
|
+
// Struct with lifetime
|
|
51
|
+
struct Excerpt<'a> {
|
|
52
|
+
text: &'a str,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
impl<'a> Excerpt<'a> {
|
|
56
|
+
fn level(&self) -> i32 {
|
|
57
|
+
3
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Return type lifetime tied to self
|
|
61
|
+
fn announce(&self, announcement: &str) -> &'a str {
|
|
62
|
+
println!("Attention: {announcement}");
|
|
63
|
+
self.text
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Rules to internalize:**
|
|
69
|
+
|
|
70
|
+
| Rule | Implication |
|
|
71
|
+
|------|-------------|
|
|
72
|
+
| One owner at a time | Move semantics by default for non-Copy types |
|
|
73
|
+
| Multiple `&T` OR one `&mut T` | No data races at compile time |
|
|
74
|
+
| References must not outlive data | Lifetimes enforce this statically |
|
|
75
|
+
| `Copy` types are stack-duplicated | Integers, floats, bools, chars, tuples of Copy types |
|
|
76
|
+
|
|
77
|
+
### 2. Error Handling: Result, Option, thiserror, anyhow
|
|
78
|
+
|
|
79
|
+
```rust
|
|
80
|
+
use std::fs;
|
|
81
|
+
use std::io;
|
|
82
|
+
|
|
83
|
+
// Result for recoverable errors
|
|
84
|
+
fn read_config(path: &str) -> Result<String, io::Error> {
|
|
85
|
+
fs::read_to_string(path)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// The ? operator for propagation
|
|
89
|
+
fn parse_config(path: &str) -> Result<Config, Box<dyn std::error::Error>> {
|
|
90
|
+
let content = fs::read_to_string(path)?;
|
|
91
|
+
let config: Config = serde_json::from_str(&content)?;
|
|
92
|
+
Ok(config)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// thiserror for library error types (structured, typed)
|
|
96
|
+
use thiserror::Error;
|
|
97
|
+
|
|
98
|
+
#[derive(Debug, Error)]
|
|
99
|
+
pub enum AppError {
|
|
100
|
+
#[error("configuration file not found: {path}")]
|
|
101
|
+
ConfigNotFound { path: String },
|
|
102
|
+
|
|
103
|
+
#[error("invalid configuration: {0}")]
|
|
104
|
+
InvalidConfig(String),
|
|
105
|
+
|
|
106
|
+
#[error("database error")]
|
|
107
|
+
Database(#[from] sqlx::Error),
|
|
108
|
+
|
|
109
|
+
#[error("IO error")]
|
|
110
|
+
Io(#[from] io::Error),
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// anyhow for application-level error handling (convenience)
|
|
114
|
+
use anyhow::{Context, Result};
|
|
115
|
+
|
|
116
|
+
fn setup() -> Result<()> {
|
|
117
|
+
let config = fs::read_to_string("config.toml")
|
|
118
|
+
.context("Failed to read config file")?;
|
|
119
|
+
let parsed: Config = toml::from_str(&config)
|
|
120
|
+
.context("Failed to parse config TOML")?;
|
|
121
|
+
Ok(())
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Option for values that may or may not exist
|
|
125
|
+
fn find_user(id: u64) -> Option<User> {
|
|
126
|
+
users.iter().find(|u| u.id == id).cloned()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Combining Option and Result
|
|
130
|
+
fn get_user_email(id: u64) -> Result<String> {
|
|
131
|
+
let user = find_user(id)
|
|
132
|
+
.ok_or_else(|| anyhow::anyhow!("User {id} not found"))?;
|
|
133
|
+
Ok(user.email.clone())
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Decision matrix:**
|
|
138
|
+
|
|
139
|
+
| Context | Use |
|
|
140
|
+
|---------|-----|
|
|
141
|
+
| Library crate | `thiserror` with custom enum |
|
|
142
|
+
| Application binary | `anyhow` for convenience |
|
|
143
|
+
| Value might not exist | `Option<T>` |
|
|
144
|
+
| Operation can fail | `Result<T, E>` |
|
|
145
|
+
| Unrecoverable bug | `panic!` (only for programmer errors) |
|
|
146
|
+
|
|
147
|
+
### 3. Traits and Generics
|
|
148
|
+
|
|
149
|
+
```rust
|
|
150
|
+
// Define a trait
|
|
151
|
+
trait Summary {
|
|
152
|
+
fn summarize(&self) -> String;
|
|
153
|
+
|
|
154
|
+
// Default implementation
|
|
155
|
+
fn preview(&self) -> String {
|
|
156
|
+
format!("{}...", &self.summarize()[..20.min(self.summarize().len())])
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Implement for a type
|
|
161
|
+
struct Article {
|
|
162
|
+
title: String,
|
|
163
|
+
content: String,
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
impl Summary for Article {
|
|
167
|
+
fn summarize(&self) -> String {
|
|
168
|
+
format!("{}: {}", self.title, &self.content[..100.min(self.content.len())])
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Generic function with trait bound
|
|
173
|
+
fn print_summary(item: &impl Summary) {
|
|
174
|
+
println!("{}", item.summarize());
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Multiple bounds with where clause
|
|
178
|
+
fn process<T>(item: &T) -> String
|
|
179
|
+
where
|
|
180
|
+
T: Summary + std::fmt::Display + Clone,
|
|
181
|
+
{
|
|
182
|
+
let cloned = item.clone();
|
|
183
|
+
format!("{cloned}: {}", item.summarize())
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Trait objects for dynamic dispatch
|
|
187
|
+
fn get_summaries(items: &[Box<dyn Summary>]) -> Vec<String> {
|
|
188
|
+
items.iter().map(|item| item.summarize()).collect()
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Associated types
|
|
192
|
+
trait Iterator {
|
|
193
|
+
type Item;
|
|
194
|
+
fn next(&mut self) -> Option<Self::Item>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Supertraits
|
|
198
|
+
trait PrettyPrint: std::fmt::Display + std::fmt::Debug {
|
|
199
|
+
fn pretty(&self) -> String {
|
|
200
|
+
format!("{self:#?}")
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 4. Async with Tokio
|
|
206
|
+
|
|
207
|
+
```rust
|
|
208
|
+
use tokio::time::{sleep, Duration};
|
|
209
|
+
use tokio::sync::{mpsc, Mutex};
|
|
210
|
+
use std::sync::Arc;
|
|
211
|
+
|
|
212
|
+
// Basic async function
|
|
213
|
+
async fn fetch_url(url: &str) -> Result<String, reqwest::Error> {
|
|
214
|
+
let response = reqwest::get(url).await?;
|
|
215
|
+
response.text().await
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Spawning tasks
|
|
219
|
+
async fn process_urls(urls: Vec<String>) -> Vec<String> {
|
|
220
|
+
let mut handles = Vec::new();
|
|
221
|
+
|
|
222
|
+
for url in urls {
|
|
223
|
+
let handle = tokio::spawn(async move {
|
|
224
|
+
fetch_url(&url).await.unwrap_or_default()
|
|
225
|
+
});
|
|
226
|
+
handles.push(handle);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
let mut results = Vec::new();
|
|
230
|
+
for handle in handles {
|
|
231
|
+
if let Ok(result) = handle.await {
|
|
232
|
+
results.push(result);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
results
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Shared state with Arc<Mutex<T>>
|
|
239
|
+
async fn shared_counter() {
|
|
240
|
+
let counter = Arc::new(Mutex::new(0u64));
|
|
241
|
+
let mut handles = Vec::new();
|
|
242
|
+
|
|
243
|
+
for _ in 0..10 {
|
|
244
|
+
let counter = Arc::clone(&counter);
|
|
245
|
+
handles.push(tokio::spawn(async move {
|
|
246
|
+
let mut lock = counter.lock().await;
|
|
247
|
+
*lock += 1;
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
for handle in handles {
|
|
252
|
+
handle.await.unwrap();
|
|
253
|
+
}
|
|
254
|
+
println!("Counter: {}", *counter.lock().await);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Channels for message passing
|
|
258
|
+
async fn producer_consumer() {
|
|
259
|
+
let (tx, mut rx) = mpsc::channel::<String>(100);
|
|
260
|
+
|
|
261
|
+
let producer = tokio::spawn(async move {
|
|
262
|
+
for i in 0..10 {
|
|
263
|
+
tx.send(format!("message {i}")).await.unwrap();
|
|
264
|
+
sleep(Duration::from_millis(100)).await;
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
let consumer = tokio::spawn(async move {
|
|
269
|
+
while let Some(msg) = rx.recv().await {
|
|
270
|
+
println!("Received: {msg}");
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
producer.await.unwrap();
|
|
275
|
+
consumer.await.unwrap();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Tokio main entry point
|
|
279
|
+
#[tokio::main]
|
|
280
|
+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
281
|
+
producer_consumer().await;
|
|
282
|
+
Ok(())
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 5. Cargo Workspace Patterns
|
|
287
|
+
|
|
288
|
+
```toml
|
|
289
|
+
# Root Cargo.toml
|
|
290
|
+
[workspace]
|
|
291
|
+
members = [
|
|
292
|
+
"crates/core",
|
|
293
|
+
"crates/api",
|
|
294
|
+
"crates/cli",
|
|
295
|
+
]
|
|
296
|
+
resolver = "2"
|
|
297
|
+
|
|
298
|
+
[workspace.package]
|
|
299
|
+
version = "0.1.0"
|
|
300
|
+
edition = "2021"
|
|
301
|
+
license = "MIT"
|
|
302
|
+
|
|
303
|
+
[workspace.dependencies]
|
|
304
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
305
|
+
tokio = { version = "1", features = ["full"] }
|
|
306
|
+
anyhow = "1.0"
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
```toml
|
|
310
|
+
# crates/core/Cargo.toml
|
|
311
|
+
[package]
|
|
312
|
+
name = "my-core"
|
|
313
|
+
version.workspace = true
|
|
314
|
+
edition.workspace = true
|
|
315
|
+
|
|
316
|
+
[dependencies]
|
|
317
|
+
serde.workspace = true
|
|
318
|
+
anyhow.workspace = true
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**Workspace layout:**
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
my-project/
|
|
325
|
+
Cargo.toml # Workspace root
|
|
326
|
+
crates/
|
|
327
|
+
core/ # Shared types, business logic
|
|
328
|
+
Cargo.toml
|
|
329
|
+
src/lib.rs
|
|
330
|
+
api/ # HTTP server
|
|
331
|
+
Cargo.toml
|
|
332
|
+
src/main.rs
|
|
333
|
+
cli/ # CLI binary
|
|
334
|
+
Cargo.toml
|
|
335
|
+
src/main.rs
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 6. Unsafe Code Boundaries
|
|
339
|
+
|
|
340
|
+
```rust
|
|
341
|
+
// Keep unsafe blocks as small as possible
|
|
342
|
+
// Wrap unsafe in safe abstractions
|
|
343
|
+
|
|
344
|
+
// WRONG -- large unsafe block
|
|
345
|
+
unsafe {
|
|
346
|
+
let ptr = allocate(size);
|
|
347
|
+
initialize(ptr, data);
|
|
348
|
+
validate(ptr); // This does not need to be unsafe
|
|
349
|
+
process(ptr); // Neither does this
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// RIGHT -- minimal unsafe surface
|
|
353
|
+
let ptr = unsafe { allocate(size) };
|
|
354
|
+
unsafe { initialize(ptr, data) };
|
|
355
|
+
validate(ptr); // Safe code outside unsafe block
|
|
356
|
+
process(ptr);
|
|
357
|
+
|
|
358
|
+
// Safe wrapper around unsafe FFI
|
|
359
|
+
pub fn get_system_time() -> u64 {
|
|
360
|
+
// SAFETY: libc::time is safe to call with a null pointer,
|
|
361
|
+
// which tells it to only return the value without writing to memory.
|
|
362
|
+
unsafe { libc::time(std::ptr::null_mut()) as u64 }
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Document SAFETY invariants for every unsafe block
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### 7. Serde Serialization
|
|
369
|
+
|
|
370
|
+
```rust
|
|
371
|
+
use serde::{Deserialize, Serialize};
|
|
372
|
+
|
|
373
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
374
|
+
#[serde(rename_all = "camelCase")]
|
|
375
|
+
pub struct UserProfile {
|
|
376
|
+
pub user_id: u64,
|
|
377
|
+
pub display_name: String,
|
|
378
|
+
#[serde(skip_serializing_if = "Option::is_none")]
|
|
379
|
+
pub bio: Option<String>,
|
|
380
|
+
#[serde(default)]
|
|
381
|
+
pub is_active: bool,
|
|
382
|
+
#[serde(rename = "type")]
|
|
383
|
+
pub account_type: AccountType,
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
387
|
+
#[serde(tag = "kind", content = "data")]
|
|
388
|
+
pub enum AccountType {
|
|
389
|
+
Standard,
|
|
390
|
+
Premium { expires_at: String },
|
|
391
|
+
Admin { permissions: Vec<String> },
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Custom deserialization
|
|
395
|
+
use serde::de::{self, Visitor};
|
|
396
|
+
|
|
397
|
+
struct DurationVisitor;
|
|
398
|
+
|
|
399
|
+
impl<'de> Visitor<'de> for DurationVisitor {
|
|
400
|
+
type Value = std::time::Duration;
|
|
401
|
+
|
|
402
|
+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
403
|
+
formatter.write_str("a duration in seconds as a number")
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
fn visit_u64<E: de::Error>(self, v: u64) -> Result<Self::Value, E> {
|
|
407
|
+
Ok(std::time::Duration::from_secs(v))
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 8. Pattern Matching
|
|
413
|
+
|
|
414
|
+
```rust
|
|
415
|
+
// Match on enums
|
|
416
|
+
enum Command {
|
|
417
|
+
Quit,
|
|
418
|
+
Echo(String),
|
|
419
|
+
Move { x: i32, y: i32 },
|
|
420
|
+
Color(u8, u8, u8),
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
fn handle(cmd: Command) {
|
|
424
|
+
match cmd {
|
|
425
|
+
Command::Quit => println!("Quitting"),
|
|
426
|
+
Command::Echo(msg) => println!("{msg}"),
|
|
427
|
+
Command::Move { x, y } => println!("Moving to ({x}, {y})"),
|
|
428
|
+
Command::Color(r, g, b) => println!("Color: rgb({r}, {g}, {b})"),
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// Guards and bindings
|
|
433
|
+
fn classify(x: i32) -> &'static str {
|
|
434
|
+
match x {
|
|
435
|
+
0 => "zero",
|
|
436
|
+
n if n < 0 => "negative",
|
|
437
|
+
1..=10 => "small positive",
|
|
438
|
+
n @ 11..=100 => {
|
|
439
|
+
println!("medium: {n}");
|
|
440
|
+
"medium positive"
|
|
441
|
+
}
|
|
442
|
+
_ => "large positive",
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// if let for single-pattern matching
|
|
447
|
+
if let Some(value) = optional_value {
|
|
448
|
+
println!("Got: {value}");
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// let-else (Rust 1.65+) for early returns
|
|
452
|
+
let Some(user) = find_user(id) else {
|
|
453
|
+
return Err(anyhow::anyhow!("user not found"));
|
|
454
|
+
};
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### 9. Smart Pointers
|
|
458
|
+
|
|
459
|
+
```rust
|
|
460
|
+
use std::rc::Rc;
|
|
461
|
+
use std::sync::Arc;
|
|
462
|
+
use std::cell::RefCell;
|
|
463
|
+
|
|
464
|
+
// Box<T> -- heap allocation, single owner
|
|
465
|
+
let boxed: Box<dyn Summary> = Box::new(article);
|
|
466
|
+
|
|
467
|
+
// Rc<T> -- reference counting, single thread
|
|
468
|
+
let shared = Rc::new(String::from("shared data"));
|
|
469
|
+
let clone1 = Rc::clone(&shared);
|
|
470
|
+
let clone2 = Rc::clone(&shared);
|
|
471
|
+
println!("Reference count: {}", Rc::strong_count(&shared)); // 3
|
|
472
|
+
|
|
473
|
+
// Arc<T> -- atomic reference counting, multi-thread safe
|
|
474
|
+
let shared = Arc::new(vec![1, 2, 3]);
|
|
475
|
+
let handle = {
|
|
476
|
+
let shared = Arc::clone(&shared);
|
|
477
|
+
std::thread::spawn(move || {
|
|
478
|
+
println!("{:?}", shared);
|
|
479
|
+
})
|
|
480
|
+
};
|
|
481
|
+
handle.join().unwrap();
|
|
482
|
+
|
|
483
|
+
// RefCell<T> -- interior mutability (runtime borrow checking)
|
|
484
|
+
let data = RefCell::new(vec![1, 2, 3]);
|
|
485
|
+
data.borrow_mut().push(4);
|
|
486
|
+
println!("{:?}", data.borrow());
|
|
487
|
+
|
|
488
|
+
// Common combo: Rc<RefCell<T>> for shared mutable state (single thread)
|
|
489
|
+
// Arc<Mutex<T>> for shared mutable state (multi-thread)
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
### 10. Iterators
|
|
493
|
+
|
|
494
|
+
```rust
|
|
495
|
+
// Iterator adaptors are lazy -- nothing happens until consumed
|
|
496
|
+
let result: Vec<i32> = (0..100)
|
|
497
|
+
.filter(|x| x % 2 == 0)
|
|
498
|
+
.map(|x| x * x)
|
|
499
|
+
.take(10)
|
|
500
|
+
.collect();
|
|
501
|
+
|
|
502
|
+
// Implementing Iterator for custom types
|
|
503
|
+
struct Counter {
|
|
504
|
+
count: u32,
|
|
505
|
+
max: u32,
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
impl Counter {
|
|
509
|
+
fn new(max: u32) -> Self {
|
|
510
|
+
Counter { count: 0, max }
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
impl Iterator for Counter {
|
|
515
|
+
type Item = u32;
|
|
516
|
+
|
|
517
|
+
fn next(&mut self) -> Option<Self::Item> {
|
|
518
|
+
if self.count < self.max {
|
|
519
|
+
self.count += 1;
|
|
520
|
+
Some(self.count)
|
|
521
|
+
} else {
|
|
522
|
+
None
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Useful iterator methods
|
|
528
|
+
let sum: u32 = Counter::new(10).sum();
|
|
529
|
+
let product: u32 = Counter::new(5).product();
|
|
530
|
+
let found = Counter::new(100).find(|&x| x > 50);
|
|
531
|
+
let any_even = Counter::new(10).any(|x| x % 2 == 0);
|
|
532
|
+
let all_positive = Counter::new(10).all(|x| x > 0);
|
|
533
|
+
|
|
534
|
+
// Chaining iterators
|
|
535
|
+
let combined: Vec<u32> = Counter::new(5)
|
|
536
|
+
.chain(Counter::new(3))
|
|
537
|
+
.collect(); // [1, 2, 3, 4, 5, 1, 2, 3]
|
|
538
|
+
|
|
539
|
+
// zip for parallel iteration
|
|
540
|
+
let pairs: Vec<(u32, u32)> = Counter::new(3)
|
|
541
|
+
.zip(Counter::new(3))
|
|
542
|
+
.collect(); // [(1,1), (2,2), (3,3)]
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### 11. Testing Patterns
|
|
546
|
+
|
|
547
|
+
```rust
|
|
548
|
+
#[cfg(test)]
|
|
549
|
+
mod tests {
|
|
550
|
+
use super::*;
|
|
551
|
+
|
|
552
|
+
#[test]
|
|
553
|
+
fn test_basic_functionality() {
|
|
554
|
+
let result = add(2, 3);
|
|
555
|
+
assert_eq!(result, 5);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
#[test]
|
|
559
|
+
fn test_with_descriptive_name() {
|
|
560
|
+
let user = User::new("alice", "alice@example.com");
|
|
561
|
+
assert_eq!(user.name(), "alice");
|
|
562
|
+
assert!(user.is_valid());
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
#[test]
|
|
566
|
+
#[should_panic(expected = "index out of bounds")]
|
|
567
|
+
fn test_panic_case() {
|
|
568
|
+
let v = vec![1, 2, 3];
|
|
569
|
+
let _ = v[99];
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
#[test]
|
|
573
|
+
fn test_result_based() -> Result<(), Box<dyn std::error::Error>> {
|
|
574
|
+
let config = parse_config("test.toml")?;
|
|
575
|
+
assert_eq!(config.port, 8080);
|
|
576
|
+
Ok(())
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Property-based testing with proptest
|
|
580
|
+
use proptest::prelude::*;
|
|
581
|
+
|
|
582
|
+
proptest! {
|
|
583
|
+
#[test]
|
|
584
|
+
fn test_string_roundtrip(s in "\\PC*") {
|
|
585
|
+
let encoded = encode(&s);
|
|
586
|
+
let decoded = decode(&encoded)?;
|
|
587
|
+
prop_assert_eq!(s, decoded);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Integration tests go in tests/ directory
|
|
593
|
+
// tests/integration_test.rs
|
|
594
|
+
use my_crate::public_api;
|
|
595
|
+
|
|
596
|
+
#[test]
|
|
597
|
+
fn test_full_workflow() {
|
|
598
|
+
let result = public_api::process("input");
|
|
599
|
+
assert!(result.is_ok());
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### 12. Concurrency: Send and Sync
|
|
604
|
+
|
|
605
|
+
```rust
|
|
606
|
+
// Send: safe to transfer ownership between threads
|
|
607
|
+
// Sync: safe to share references between threads
|
|
608
|
+
//
|
|
609
|
+
// Most types are Send + Sync automatically.
|
|
610
|
+
// Rc<T> is neither Send nor Sync -- use Arc<T> instead.
|
|
611
|
+
// Cell<T> and RefCell<T> are Send but not Sync.
|
|
612
|
+
// MutexGuard is Sync but not Send.
|
|
613
|
+
|
|
614
|
+
use std::sync::{Mutex, RwLock};
|
|
615
|
+
|
|
616
|
+
// RwLock for read-heavy workloads
|
|
617
|
+
let config = Arc::new(RwLock::new(Config::default()));
|
|
618
|
+
|
|
619
|
+
// Multiple readers
|
|
620
|
+
let reader = config.read().unwrap();
|
|
621
|
+
println!("{:?}", *reader);
|
|
622
|
+
drop(reader);
|
|
623
|
+
|
|
624
|
+
// Single writer
|
|
625
|
+
let mut writer = config.write().unwrap();
|
|
626
|
+
writer.debug = true;
|
|
627
|
+
drop(writer);
|
|
628
|
+
|
|
629
|
+
// Rayon for data parallelism
|
|
630
|
+
use rayon::prelude::*;
|
|
631
|
+
|
|
632
|
+
let sum: i64 = (0..1_000_000i64)
|
|
633
|
+
.into_par_iter()
|
|
634
|
+
.filter(|x| x % 2 == 0)
|
|
635
|
+
.map(|x| x * x)
|
|
636
|
+
.sum();
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
## Anti-Patterns
|
|
640
|
+
|
|
641
|
+
| Anti-Pattern | Why It Is Bad | Do This Instead |
|
|
642
|
+
|-------------|--------------|----------------|
|
|
643
|
+
| `.unwrap()` in production code | Panics on None/Err | Use `?`, `unwrap_or`, `unwrap_or_else` |
|
|
644
|
+
| `.clone()` to avoid borrow issues | Hides ownership problems | Fix the ownership structure |
|
|
645
|
+
| Large `unsafe` blocks | Hard to audit safety | Minimize unsafe surface, document invariants |
|
|
646
|
+
| `String` everywhere | Unnecessary allocations | Use `&str` for borrowed strings |
|
|
647
|
+
| Ignoring clippy warnings | Misses common bugs | Run `cargo clippy -- -D warnings` |
|
|
648
|
+
| `Box<dyn Error>` in libraries | Callers cannot match on error types | Use `thiserror` enum |
|
|
649
|
+
| Blocking in async context | Starves the executor | Use `tokio::task::spawn_blocking` |
|
|
650
|
+
|
|
651
|
+
## Common Commands
|
|
652
|
+
|
|
653
|
+
```bash
|
|
654
|
+
cargo build # Debug build
|
|
655
|
+
cargo build --release # Optimized build
|
|
656
|
+
cargo test # Run all tests
|
|
657
|
+
cargo test -- --nocapture # Show println output in tests
|
|
658
|
+
cargo clippy -- -D warnings # Lint with warnings as errors
|
|
659
|
+
cargo fmt # Format code
|
|
660
|
+
cargo doc --open # Generate and open documentation
|
|
661
|
+
cargo bench # Run benchmarks
|
|
662
|
+
cargo audit # Check for security vulnerabilities
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
## Resources
|
|
666
|
+
|
|
667
|
+
- **The Rust Book**: https://doc.rust-lang.org/book/
|
|
668
|
+
- **Rust by Example**: https://doc.rust-lang.org/rust-by-example/
|
|
669
|
+
- **Rustlings**: https://github.com/rust-lang/rustlings
|
|
670
|
+
- **Tokio Tutorial**: https://tokio.rs/tokio/tutorial
|
|
671
|
+
- **Serde Guide**: https://serde.rs/
|
|
672
|
+
- **Clippy Lints**: https://rust-lang.github.io/rust-clippy/
|
|
673
|
+
- **Rust API Guidelines**: https://rust-lang.github.io/api-guidelines/
|