@sylix/coworker 2.0.11 → 2.0.12

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 (169) hide show
  1. package/dist/commands/slash/config.d.ts.map +1 -1
  2. package/dist/commands/slash/config.js +22 -4
  3. package/dist/commands/slash/config.js.map +1 -1
  4. package/dist/core/CoWorkerAgent.d.ts.map +1 -1
  5. package/dist/core/CoWorkerAgent.js +6 -3
  6. package/dist/core/CoWorkerAgent.js.map +1 -1
  7. package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
  8. package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
  9. package/dist/skills/defaults/ai-ml/rag.md +276 -0
  10. package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
  11. package/dist/skills/defaults/backend-development/api-design.md +285 -0
  12. package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
  13. package/dist/skills/defaults/backend-development/async-python.md +237 -0
  14. package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
  15. package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
  16. package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
  17. package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
  18. package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
  19. package/dist/skills/defaults/backend-development/database-design.md +305 -0
  20. package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
  21. package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
  22. package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
  23. package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
  24. package/dist/skills/defaults/backend-development/fastapi.md +309 -0
  25. package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
  26. package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
  27. package/dist/skills/defaults/backend-development/microservices.md +284 -0
  28. package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
  29. package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
  30. package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
  31. package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
  32. package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
  33. package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
  34. package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
  35. package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
  36. package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
  37. package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
  38. package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
  39. package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
  40. package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
  41. package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
  42. package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
  43. package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
  44. package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
  45. package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
  46. package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
  47. package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
  48. package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
  49. package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
  50. package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
  51. package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
  52. package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
  53. package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
  54. package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
  55. package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
  56. package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
  57. package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
  58. package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
  59. package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
  60. package/dist/skills/defaults/data-engineering/airflow.md +519 -0
  61. package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
  62. package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
  63. package/dist/skills/defaults/data-engineering/dbt.md +556 -0
  64. package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
  65. package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
  66. package/dist/skills/defaults/data-engineering/spark.md +411 -0
  67. package/dist/skills/defaults/database/postgresql.md +202 -0
  68. package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
  69. package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
  70. package/dist/skills/defaults/devops/changelog-automation.md +580 -0
  71. package/dist/skills/defaults/devops/cicd.md +314 -0
  72. package/dist/skills/defaults/devops/cloud.md +263 -0
  73. package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
  74. package/dist/skills/defaults/devops/cost-optimization.md +295 -0
  75. package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
  76. package/dist/skills/defaults/devops/docker.md +281 -0
  77. package/dist/skills/defaults/devops/git-workflows.md +205 -0
  78. package/dist/skills/defaults/devops/github-actions.md +311 -0
  79. package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
  80. package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
  81. package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
  82. package/dist/skills/defaults/devops/kubernetes.md +339 -0
  83. package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
  84. package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
  85. package/dist/skills/defaults/devops/observability.md +243 -0
  86. package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
  87. package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
  88. package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
  89. package/dist/skills/defaults/devops/secrets-management.md +341 -0
  90. package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
  91. package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
  92. package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
  93. package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
  94. package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
  95. package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
  96. package/dist/skills/defaults/frontend/interaction-design.md +327 -0
  97. package/dist/skills/defaults/frontend/javascript.md +311 -0
  98. package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
  99. package/dist/skills/defaults/frontend/react-native-design.md +440 -0
  100. package/dist/skills/defaults/frontend/react.md +345 -0
  101. package/dist/skills/defaults/frontend/responsive-design.md +472 -0
  102. package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
  103. package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
  104. package/dist/skills/defaults/frontend/typescript.md +334 -0
  105. package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
  106. package/dist/skills/defaults/frontend/web-component-design.md +279 -0
  107. package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
  108. package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
  109. package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
  110. package/dist/skills/defaults/kubernetes/gitops.md +280 -0
  111. package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
  112. package/dist/skills/defaults/kubernetes/helm.md +343 -0
  113. package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
  114. package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
  115. package/dist/skills/defaults/kubernetes/manifests.md +330 -0
  116. package/dist/skills/defaults/kubernetes/security.md +337 -0
  117. package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
  118. package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
  119. package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
  120. package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
  121. package/dist/skills/defaults/llm-application/langchain.md +259 -0
  122. package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
  123. package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
  124. package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
  125. package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
  126. package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
  127. package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
  128. package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
  129. package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
  130. package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
  131. package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
  132. package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
  133. package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
  134. package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
  135. package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
  136. package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
  137. package/dist/skills/defaults/security/auditor.md +168 -0
  138. package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
  139. package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
  140. package/dist/skills/defaults/security/mtls-configuration.md +349 -0
  141. package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
  142. package/dist/skills/defaults/security/sast-configuration.md +182 -0
  143. package/dist/skills/defaults/security/security.md +313 -0
  144. package/dist/skills/defaults/security/stride-analysis.md +273 -0
  145. package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
  146. package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
  147. package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
  148. package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
  149. package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
  150. package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
  151. package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
  152. package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
  153. package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
  154. package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
  155. package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
  156. package/dist/skills/defaults/testing/testing.md +332 -0
  157. package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
  158. package/dist/skills/defaults/workflows/track-management.md +592 -0
  159. package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
  160. package/dist/skills/index.d.ts +11 -0
  161. package/dist/skills/index.d.ts.map +1 -0
  162. package/dist/skills/index.js +129 -0
  163. package/dist/skills/index.js.map +1 -0
  164. package/dist/utils/character.js +4 -4
  165. package/dist/utils/character.js.map +1 -1
  166. package/dist/utils/inputbar.d.ts.map +1 -1
  167. package/dist/utils/inputbar.js +7 -0
  168. package/dist/utils/inputbar.js.map +1 -1
  169. package/package.json +1 -1
@@ -0,0 +1,279 @@
1
+ ---
2
+ name: web-component-design
3
+ description: Master React, Vue, and Svelte component patterns including CSS-in-JS, composition strategies, and reusable component architecture. Use when building UI component libraries, designing component APIs, or implementing frontend design systems.
4
+ ---
5
+
6
+ # Web Component Design
7
+
8
+ Build reusable, maintainable UI components using modern frameworks with clean composition patterns and styling approaches.
9
+
10
+ ## When to Use This Skill
11
+
12
+ - Designing reusable component libraries or design systems
13
+ - Implementing complex component composition patterns
14
+ - Choosing and applying CSS-in-JS solutions
15
+ - Building accessible, responsive UI components
16
+ - Creating consistent component APIs across a codebase
17
+ - Refactoring legacy components into modern patterns
18
+ - Implementing compound components or render props
19
+
20
+ ## Core Concepts
21
+
22
+ ### 1. Component Composition Patterns
23
+
24
+ **Compound Components**: Related components that work together
25
+
26
+ ```tsx
27
+ // Usage
28
+ <Select value={value} onChange={setValue}>
29
+ <Select.Trigger>Choose option</Select.Trigger>
30
+ <Select.Options>
31
+ <Select.Option value="a">Option A</Select.Option>
32
+ <Select.Option value="b">Option B</Select.Option>
33
+ </Select.Options>
34
+ </Select>
35
+ ```
36
+
37
+ **Render Props**: Delegate rendering to parent
38
+
39
+ ```tsx
40
+ <DataFetcher url="/api/users">
41
+ {({ data, loading, error }) =>
42
+ loading ? <Spinner /> : <UserList users={data} />
43
+ }
44
+ </DataFetcher>
45
+ ```
46
+
47
+ **Slots (Vue/Svelte)**: Named content injection points
48
+
49
+ ```vue
50
+ <template>
51
+ <Card>
52
+ <template #header>Title</template>
53
+ <template #content>Body text</template>
54
+ <template #footer><Button>Action</Button></template>
55
+ </Card>
56
+ </template>
57
+ ```
58
+
59
+ ### 2. CSS-in-JS Approaches
60
+
61
+ | Solution | Approach | Best For |
62
+ | --------------------- | ---------------------- | --------------------------------- |
63
+ | **Tailwind CSS** | Utility classes | Rapid prototyping, design systems |
64
+ | **CSS Modules** | Scoped CSS files | Existing CSS, gradual adoption |
65
+ | **styled-components** | Template literals | React, dynamic styling |
66
+ | **Emotion** | Object/template styles | Flexible, SSR-friendly |
67
+ | **Vanilla Extract** | Zero-runtime | Performance-critical apps |
68
+
69
+ ### 3. Component API Design
70
+
71
+ ```tsx
72
+ interface ButtonProps {
73
+ variant?: "primary" | "secondary" | "ghost";
74
+ size?: "sm" | "md" | "lg";
75
+ isLoading?: boolean;
76
+ isDisabled?: boolean;
77
+ leftIcon?: React.ReactNode;
78
+ rightIcon?: React.ReactNode;
79
+ children: React.ReactNode;
80
+ onClick?: () => void;
81
+ }
82
+ ```
83
+
84
+ **Principles**:
85
+
86
+ - Use semantic prop names (`isLoading` vs `loading`)
87
+ - Provide sensible defaults
88
+ - Support composition via `children`
89
+ - Allow style overrides via `className` or `style`
90
+
91
+ ## Quick Start: React Component with Tailwind
92
+
93
+ ```tsx
94
+ import { forwardRef, type ComponentPropsWithoutRef } from "react";
95
+ import { cva, type VariantProps } from "class-variance-authority";
96
+ import { cn } from "@/lib/utils";
97
+
98
+ const buttonVariants = cva(
99
+ "inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50",
100
+ {
101
+ variants: {
102
+ variant: {
103
+ primary: "bg-blue-600 text-white hover:bg-blue-700",
104
+ secondary: "bg-gray-100 text-gray-900 hover:bg-gray-200",
105
+ ghost: "hover:bg-gray-100 hover:text-gray-900",
106
+ },
107
+ size: {
108
+ sm: "h-8 px-3 text-sm",
109
+ md: "h-10 px-4 text-sm",
110
+ lg: "h-12 px-6 text-base",
111
+ },
112
+ },
113
+ defaultVariants: {
114
+ variant: "primary",
115
+ size: "md",
116
+ },
117
+ },
118
+ );
119
+
120
+ interface ButtonProps
121
+ extends
122
+ ComponentPropsWithoutRef<"button">,
123
+ VariantProps<typeof buttonVariants> {
124
+ isLoading?: boolean;
125
+ }
126
+
127
+ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
128
+ ({ className, variant, size, isLoading, children, ...props }, ref) => (
129
+ <button
130
+ ref={ref}
131
+ className={cn(buttonVariants({ variant, size }), className)}
132
+ disabled={isLoading || props.disabled}
133
+ {...props}
134
+ >
135
+ {isLoading && <Spinner className="mr-2 h-4 w-4" />}
136
+ {children}
137
+ </button>
138
+ ),
139
+ );
140
+ Button.displayName = "Button";
141
+ ```
142
+
143
+ ## Framework Patterns
144
+
145
+ ### React: Compound Components
146
+
147
+ ```tsx
148
+ import { createContext, useContext, useState, type ReactNode } from "react";
149
+
150
+ interface AccordionContextValue {
151
+ openItems: Set<string>;
152
+ toggle: (id: string) => void;
153
+ }
154
+
155
+ const AccordionContext = createContext<AccordionContextValue | null>(null);
156
+
157
+ function useAccordion() {
158
+ const context = useContext(AccordionContext);
159
+ if (!context) throw new Error("Must be used within Accordion");
160
+ return context;
161
+ }
162
+
163
+ export function Accordion({ children }: { children: ReactNode }) {
164
+ const [openItems, setOpenItems] = useState<Set<string>>(new Set());
165
+
166
+ const toggle = (id: string) => {
167
+ setOpenItems((prev) => {
168
+ const next = new Set(prev);
169
+ next.has(id) ? next.delete(id) : next.add(id);
170
+ return next;
171
+ });
172
+ };
173
+
174
+ return (
175
+ <AccordionContext.Provider value={{ openItems, toggle }}>
176
+ <div className="divide-y">{children}</div>
177
+ </AccordionContext.Provider>
178
+ );
179
+ }
180
+
181
+ Accordion.Item = function AccordionItem({
182
+ id,
183
+ title,
184
+ children,
185
+ }: {
186
+ id: string;
187
+ title: string;
188
+ children: ReactNode;
189
+ }) {
190
+ const { openItems, toggle } = useAccordion();
191
+ const isOpen = openItems.has(id);
192
+
193
+ return (
194
+ <div>
195
+ <button onClick={() => toggle(id)} className="w-full text-left py-3">
196
+ {title}
197
+ </button>
198
+ {isOpen && <div className="pb-3">{children}</div>}
199
+ </div>
200
+ );
201
+ };
202
+ ```
203
+
204
+ ### Vue 3: Composables
205
+
206
+ ```vue
207
+ <script setup lang="ts">
208
+ import { ref, computed, provide, inject, type InjectionKey } from "vue";
209
+
210
+ interface TabsContext {
211
+ activeTab: Ref<string>;
212
+ setActive: (id: string) => void;
213
+ }
214
+
215
+ const TabsKey: InjectionKey<TabsContext> = Symbol("tabs");
216
+
217
+ // Parent component
218
+ const activeTab = ref("tab-1");
219
+ provide(TabsKey, {
220
+ activeTab,
221
+ setActive: (id: string) => {
222
+ activeTab.value = id;
223
+ },
224
+ });
225
+
226
+ // Child component usage
227
+ const tabs = inject(TabsKey);
228
+ const isActive = computed(() => tabs?.activeTab.value === props.id);
229
+ </script>
230
+ ```
231
+
232
+ ### Svelte 5: Runes
233
+
234
+ ```svelte
235
+ <script lang="ts">
236
+ interface Props {
237
+ variant?: 'primary' | 'secondary';
238
+ size?: 'sm' | 'md' | 'lg';
239
+ onclick?: () => void;
240
+ children: import('svelte').Snippet;
241
+ }
242
+
243
+ let { variant = 'primary', size = 'md', onclick, children }: Props = $props();
244
+
245
+ const classes = $derived(
246
+ `btn btn-${variant} btn-${size}`
247
+ );
248
+ </script>
249
+
250
+ <button class={classes} {onclick}>
251
+ {@render children()}
252
+ </button>
253
+ ```
254
+
255
+ ## Best Practices
256
+
257
+ 1. **Single Responsibility**: Each component does one thing well
258
+ 2. **Prop Drilling Prevention**: Use context for deeply nested data
259
+ 3. **Accessible by Default**: Include ARIA attributes, keyboard support
260
+ 4. **Controlled vs Uncontrolled**: Support both patterns when appropriate
261
+ 5. **Forward Refs**: Allow parent access to DOM nodes
262
+ 6. **Memoization**: Use `React.memo`, `useMemo` for expensive renders
263
+ 7. **Error Boundaries**: Wrap components that may fail
264
+
265
+ ## Common Issues
266
+
267
+ - **Prop Explosion**: Too many props - consider composition instead
268
+ - **Style Conflicts**: Use scoped styles or CSS Modules
269
+ - **Re-render Cascades**: Profile with React DevTools, memo appropriately
270
+ - **Accessibility Gaps**: Test with screen readers and keyboard navigation
271
+ - **Bundle Size**: Tree-shake unused component variants
272
+
273
+ ## Resources
274
+
275
+ - [React Component Patterns](https://reactpatterns.com/)
276
+ - [Vue Composition API Guide](https://vuejs.org/guide/reusability/composables.html)
277
+ - [Svelte Component Documentation](https://svelte.dev/docs/svelte-components)
278
+ - [Radix UI Primitives](https://www.radix-ui.com/primitives)
279
+ - [shadcn/ui Components](https://ui.shadcn.com/)
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: godot-gdscript-patterns
3
+ description: Write efficient, maintainable GDScript code using Godot 4.x patterns including signal-based communication, resource-based design, and node organization strategies
4
+ ---
5
+
6
+ # Godot GDScript Patterns
7
+
8
+ ## Signal-Based Communication
9
+
10
+ Decouple nodes using signals instead of direct references:
11
+
12
+ ```gdscript
13
+ # Instead of: enemy.health_component.take_damage()
14
+ # Use signals for loose coupling
15
+
16
+ # enemy.gd
17
+ signal health_changed(new_health: int)
18
+ signal died
19
+
20
+ @export var max_health: int = 100
21
+ var current_health: int
22
+
23
+ func take_damage(amount: int) -> void:
24
+ current_health = max(0, current_health - amount)
25
+ health_changed.emit(current_health)
26
+ if current_health == 0:
27
+ died.emit()
28
+
29
+ # player.gd - Connect via code or editor
30
+ func _ready() -> void:
31
+ enemy.health_changed.connect(_on_enemy_health_changed)
32
+ enemy.died.connect(_on_enemy_died)
33
+
34
+ func _on_enemy_health_changed(new_health: int) -> void:
35
+ # Update UI, play sounds, etc.
36
+ pass
37
+ ```
38
+
39
+ ## Resource-Based Design
40
+
41
+ Use custom resources for data-driven architecture:
42
+
43
+ ```gdscript
44
+ # Define a weapon resource
45
+ class_name WeaponData
46
+ extends Resource
47
+
48
+ @export var weapon_name: String
49
+ @export var damage: int
50
+ @export var attack_speed: float
51
+ @export var projectile_scene: PackedScene
52
+
53
+ # Create .tres files in FileSystem for each weapon
54
+ # Reference in nodes:
55
+ @export var weapon_data: WeaponData
56
+
57
+ func attack() -> void:
58
+ var projectile = weapon_data.projectile_scene.instantiate()
59
+ projectile.damage = weapon_data.damage
60
+ add_child(projectile)
61
+ ```
62
+
63
+ ## Autoload Singletons for Game State
64
+
65
+ ```gdscript
66
+ # Project Settings > Autoload > Add "GameManager.gd"
67
+
68
+ # game_manager.gd
69
+ extends Node
70
+
71
+ var player_stats: PlayerStats
72
+ var current_level: String
73
+
74
+ func _ready() -> void:
75
+ player_stats = PlayerStats.new()
76
+
77
+ func save_game() -> void:
78
+ var save_file = FileAccess.open("user://savegame.dat", FileAccess.WRITE)
79
+ # Serialize and save state
80
+ save_file.close()
81
+
82
+ func load_game() -> void:
83
+ # Load and deserialize state
84
+ pass
85
+ ```
86
+
87
+ ## State Machines
88
+
89
+ ```gdscript
90
+ # Base state class
91
+ class_name State
92
+ extends Node
93
+
94
+ @export var animation_player: AnimationPlayer
95
+
96
+ func enter() -> void:
97
+ pass
98
+
99
+ func exit() -> void:
100
+ pass
101
+
102
+ func process_input(event: InputEvent) -> void:
103
+ pass
104
+
105
+ func process_frame(delta: float) -> void:
106
+ pass
107
+
108
+ # State machine controller
109
+ class_name StateMachine
110
+ extends Node
111
+
112
+ @export var initial_state: State
113
+
114
+ var current_state: State
115
+
116
+ func _ready() -> void:
117
+ for child in get_children():
118
+ if child is State:
119
+ child.state_machine = self
120
+ if initial_state:
121
+ current_state = initial_state
122
+ current_state.enter()
123
+
124
+ func _process(delta: float) -> void:
125
+ current_state.process_frame(delta)
126
+
127
+ func _input(event: InputEvent) -> void:
128
+ current_state.process_input(event)
129
+
130
+ func transition_to(state_name: String) -> void:
131
+ var new_state = get_node(state_name)
132
+ if new_state and new_state != current_state:
133
+ current_state.exit()
134
+ current_state = new_state
135
+ current_state.enter()
136
+ ```
137
+
138
+ ## Dependency Injection via @export
139
+
140
+ ```gdscript
141
+ # Inject dependencies instead of using get_node() everywhere
142
+ class_name Enemy
143
+ extends CharacterBody2D
144
+
145
+ @export var movement_component: MovementComponent
146
+ @export var health_component: HealthComponent
147
+ @export var stats: EnemyStats
148
+
149
+ func _ready() -> void:
150
+ # Components are assigned in editor or via code
151
+ movement_component.initialize(self)
152
+ health_component.initialize(stats.max_health)
153
+ ```
154
+
155
+ ## Cleanup and Queue-Free
156
+
157
+ ```gdscript
158
+ func _exit_tree() -> void:
159
+ # Disconnect signals to prevent memory leaks
160
+ if enemy and enemy.is_connected("died", _on_enemy_died):
161
+ enemy.died.disconnect(_on_enemy_died)
162
+
163
+ func destroy() -> void:
164
+ # Use call_deferred for safe removal during physics
165
+ call_deferred("queue_free")
166
+ ```
167
+
168
+ ## Performance Tips
169
+
170
+ 1. **Use `@tool` for editor scripts only when needed**
171
+ 2. **Cache node paths**: `var player_path := NodePath("/root/Main/Player")`
172
+ 3. **Use `TypedArrays`**: `var enemies: Array[Enemy] = []`
173
+ 4. **Avoid `get_node()` in `_process`**: Cache references in `_ready()`
174
+ 5. **Use `celling` and `floor` for grid-based movement**
175
+
176
+ ```gdscript
177
+ # Grid movement
178
+ func snap_to_grid() -> void:
179
+ position = position.snapped(Vector2(32, 32))
180
+ ```
181
+
182
+ ## Best Practices
183
+
184
+ - Use `const` for magic numbers and enums
185
+ - Name functions as verbs: `take_damage()`, `spawn_enemy()`
186
+ - Use `_unhandled_input()` for game input, not `_input()`
187
+ - Group related nodes under parent nodes for scene organization
188
+ - Use `Callable` for deferred signal connections with parameters