@sylix/coworker 2.0.11 → 2.0.14

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,482 @@
1
+ ---
2
+ name: dbt-transformation-patterns
3
+ description: Master dbt (data build tool) for analytics engineering with model organization, testing, documentation, and incremental strategies
4
+ ---
5
+
6
+ # dbt Transformation Patterns
7
+
8
+ Production-ready patterns for dbt (data build tool) including model organization, testing strategies, documentation, and incremental processing.
9
+
10
+ ## When to Use This Skill
11
+
12
+ - Building data transformation pipelines with dbt
13
+ - Organizing models into staging, intermediate, and marts layers
14
+ - Implementing data quality tests
15
+ - Creating incremental models for large datasets
16
+ - Documenting data models and lineage
17
+ - Setting up dbt project structure
18
+
19
+ ## Core Concepts
20
+
21
+ ### Model Layers (Medallion Architecture)
22
+
23
+ ```
24
+ sources/ Raw data definitions
25
+
26
+ staging/ 1:1 with source, light cleaning
27
+
28
+ intermediate/ Business logic, joins, aggregations
29
+
30
+ marts/ Final analytics tables
31
+ ```
32
+
33
+ ### Naming Conventions
34
+
35
+ | Layer | Prefix | Example |
36
+ | ------------ | -------------- | ----------------------------- |
37
+ | Staging | `stg_` | `stg_stripe__payments` |
38
+ | Intermediate | `int_` | `int_payments_pivoted` |
39
+ | Marts | `dim_`, `fct_` | `dim_customers`, `fct_orders` |
40
+
41
+ ## Quick Start
42
+
43
+ ```yaml
44
+ # dbt_project.yml
45
+ name: "analytics"
46
+ version: "1.0.0"
47
+ profile: "analytics"
48
+
49
+ model-paths: ["models"]
50
+ analysis-paths: ["analyses"]
51
+ test-paths: ["tests"]
52
+ seed-paths: ["seeds"]
53
+ macro-paths: ["macros"]
54
+
55
+ vars:
56
+ start_date: "2020-01-01"
57
+
58
+ models:
59
+ analytics:
60
+ staging:
61
+ +materialized: view
62
+ +schema: staging
63
+ intermediate:
64
+ +materialized: ephemeral
65
+ marts:
66
+ +materialized: table
67
+ +schema: analytics
68
+ ```
69
+
70
+ ## Patterns
71
+
72
+ ### Pattern 1: Source Definitions
73
+
74
+ ```yaml
75
+ # models/staging/stripe/_stripe__sources.yml
76
+ version: 2
77
+
78
+ sources:
79
+ - name: stripe
80
+ description: Raw Stripe data loaded via Fivetran
81
+ database: raw
82
+ schema: stripe
83
+ loader: fivetran
84
+ loaded_at_field: _fivetran_synced
85
+ freshness:
86
+ warn_after: { count: 12, period: hour }
87
+ error_after: { count: 24, period: hour }
88
+ tables:
89
+ - name: customers
90
+ description: Stripe customer records
91
+ columns:
92
+ - name: id
93
+ description: Primary key
94
+ tests:
95
+ - unique
96
+ - not_null
97
+ - name: email
98
+ description: Customer email
99
+ - name: created
100
+ description: Account creation timestamp
101
+
102
+ - name: payments
103
+ description: Stripe payment transactions
104
+ columns:
105
+ - name: id
106
+ tests:
107
+ - unique
108
+ - not_null
109
+ - name: customer_id
110
+ tests:
111
+ - not_null
112
+ - relationships:
113
+ to: source('stripe', 'customers')
114
+ field: id
115
+ ```
116
+
117
+ ### Pattern 2: Staging Models
118
+
119
+ ```sql
120
+ -- models/staging/stripe/stg_stripe__customers.sql
121
+ with source as (
122
+ select * from {{ source('stripe', 'customers') }}
123
+ ),
124
+
125
+ renamed as (
126
+ select
127
+ id as customer_id,
128
+ lower(email) as email,
129
+ name as customer_name,
130
+ created as created_at,
131
+ _fivetran_synced as _loaded_at
132
+ from source
133
+ )
134
+
135
+ select * from renamed
136
+ ```
137
+
138
+ ```sql
139
+ -- models/staging/stripe/stg_stripe__payments.sql
140
+ {{
141
+ config(
142
+ materialized='incremental',
143
+ unique_key='payment_id',
144
+ on_schema_change='append_new_columns'
145
+ )
146
+ }}
147
+
148
+ with source as (
149
+ select * from {{ source('stripe', 'payments') }}
150
+
151
+ {% if is_incremental() %}
152
+ where _fivetran_synced > (select max(_loaded_at) from {{ this }})
153
+ {% endif %}
154
+ ),
155
+
156
+ renamed as (
157
+ select
158
+ id as payment_id,
159
+ customer_id,
160
+ invoice_id,
161
+ amount / 100.0 as amount,
162
+ amount_refunded / 100.0 as amount_refunded,
163
+ status as payment_status,
164
+ created as created_at,
165
+ _fivetran_synced as _loaded_at
166
+ from source
167
+ )
168
+
169
+ select * from renamed
170
+ ```
171
+
172
+ ### Pattern 3: Intermediate Models
173
+
174
+ ```sql
175
+ -- models/intermediate/finance/int_payments_pivoted_to_customer.sql
176
+ with payments as (
177
+ select * from {{ ref('stg_stripe__payments') }}
178
+ ),
179
+
180
+ customers as (
181
+ select * from {{ ref('stg_stripe__customers') }}
182
+ ),
183
+
184
+ payment_summary as (
185
+ select
186
+ customer_id,
187
+ count(*) as total_payments,
188
+ count(case when payment_status = 'succeeded' then 1 end) as successful_payments,
189
+ sum(case when payment_status = 'succeeded' then amount else 0 end) as total_amount_paid,
190
+ min(created_at) as first_payment_at,
191
+ max(created_at) as last_payment_at
192
+ from payments
193
+ group by customer_id
194
+ )
195
+
196
+ select
197
+ customers.customer_id,
198
+ customers.email,
199
+ customers.created_at as customer_created_at,
200
+ coalesce(payment_summary.total_payments, 0) as total_payments,
201
+ coalesce(payment_summary.successful_payments, 0) as successful_payments,
202
+ coalesce(payment_summary.total_amount_paid, 0) as lifetime_value,
203
+ payment_summary.first_payment_at,
204
+ payment_summary.last_payment_at
205
+
206
+ from customers
207
+ left join payment_summary using (customer_id)
208
+ ```
209
+
210
+ ### Pattern 4: Mart Models (Dimensions and Facts)
211
+
212
+ ```sql
213
+ -- models/marts/core/dim_customers.sql
214
+ {{
215
+ config(
216
+ materialized='table',
217
+ unique_key='customer_id'
218
+ )
219
+ }}
220
+
221
+ with customers as (
222
+ select * from {{ ref('int_payments_pivoted_to_customer') }}
223
+ ),
224
+
225
+ orders as (
226
+ select * from {{ ref('stg_shopify__orders') }}
227
+ ),
228
+
229
+ order_summary as (
230
+ select
231
+ customer_id,
232
+ count(*) as total_orders,
233
+ sum(total_price) as total_order_value,
234
+ min(created_at) as first_order_at,
235
+ max(created_at) as last_order_at
236
+ from orders
237
+ group by customer_id
238
+ ),
239
+
240
+ final as (
241
+ select
242
+ {{ dbt_utils.generate_surrogate_key(['customers.customer_id']) }} as customer_key,
243
+ customers.customer_id,
244
+ customers.email,
245
+ customers.customer_created_at,
246
+ customers.total_payments,
247
+ customers.successful_payments,
248
+ customers.lifetime_value,
249
+ customers.first_payment_at,
250
+ customers.last_payment_at,
251
+ coalesce(order_summary.total_orders, 0) as total_orders,
252
+ coalesce(order_summary.total_order_value, 0) as total_order_value,
253
+ order_summary.first_order_at,
254
+ order_summary.last_order_at,
255
+ case
256
+ when customers.lifetime_value >= 1000 then 'high'
257
+ when customers.lifetime_value >= 100 then 'medium'
258
+ else 'low'
259
+ end as customer_tier,
260
+ current_timestamp as _loaded_at
261
+
262
+ from customers
263
+ left join order_summary using (customer_id)
264
+ )
265
+
266
+ select * from final
267
+ ```
268
+
269
+ ```sql
270
+ -- models/marts/core/fct_orders.sql
271
+ {{
272
+ config(
273
+ materialized='incremental',
274
+ unique_key='order_id',
275
+ incremental_strategy='merge'
276
+ )
277
+ }}
278
+
279
+ with orders as (
280
+ select * from {{ ref('stg_shopify__orders') }}
281
+
282
+ {% if is_incremental() %}
283
+ where updated_at > (select max(updated_at) from {{ this }})
284
+ {% endif %}
285
+ ),
286
+
287
+ customers as (
288
+ select * from {{ ref('dim_customers') }}
289
+ ),
290
+
291
+ final as (
292
+ select
293
+ orders.order_id,
294
+ customers.customer_key,
295
+ orders.customer_id,
296
+ orders.order_status,
297
+ orders.fulfillment_status,
298
+ orders.payment_status,
299
+ orders.subtotal,
300
+ orders.tax,
301
+ orders.shipping,
302
+ orders.total_price,
303
+ orders.total_discount,
304
+ orders.item_count,
305
+ orders.created_at,
306
+ orders.updated_at,
307
+ orders.fulfilled_at,
308
+ current_timestamp as _loaded_at
309
+
310
+ from orders
311
+ left join customers on orders.customer_id = customers.customer_id
312
+ )
313
+
314
+ select * from final
315
+ ```
316
+
317
+ ### Pattern 5: Testing and Documentation
318
+
319
+ ```yaml
320
+ # models/marts/core/_core__models.yml
321
+ version: 2
322
+
323
+ models:
324
+ - name: dim_customers
325
+ description: Customer dimension with payment and order metrics
326
+ columns:
327
+ - name: customer_key
328
+ description: Surrogate key for the customer dimension
329
+ tests:
330
+ - unique
331
+ - not_null
332
+
333
+ - name: customer_id
334
+ description: Natural key from source system
335
+ tests:
336
+ - unique
337
+ - not_null
338
+
339
+ - name: email
340
+ description: Customer email address
341
+ tests:
342
+ - not_null
343
+
344
+ - name: customer_tier
345
+ description: Customer value tier based on lifetime value
346
+ tests:
347
+ - accepted_values:
348
+ values: ["high", "medium", "low"]
349
+
350
+ - name: lifetime_value
351
+ description: Total amount paid by customer
352
+ tests:
353
+ - dbt_utils.expression_is_true:
354
+ expression: ">= 0"
355
+
356
+ - name: fct_orders
357
+ description: Order fact table with all order transactions
358
+ tests:
359
+ - dbt_utils.recency:
360
+ datepart: day
361
+ field: created_at
362
+ interval: 1
363
+ columns:
364
+ - name: order_id
365
+ tests:
366
+ - unique
367
+ - not_null
368
+ - name: customer_key
369
+ tests:
370
+ - not_null
371
+ - relationships:
372
+ to: ref('dim_customers')
373
+ field: customer_key
374
+ ```
375
+
376
+ ### Pattern 6: Macros and DRY Code
377
+
378
+ ```sql
379
+ -- macros/cents_to_dollars.sql
380
+ {% macro cents_to_dollars(column_name, precision=2) %}
381
+ round({{ column_name }} / 100.0, {{ precision }})
382
+ {% endmacro %}
383
+
384
+ -- macros/limit_data_in_dev.sql
385
+ {% macro limit_data_in_dev(column_name, days=3) %}
386
+ {% if target.name == 'dev' %}
387
+ where {{ column_name }} >= dateadd(day, -{{ days }}, current_date)
388
+ {% endif %}
389
+ {% endmacro %}
390
+
391
+ -- Usage in model
392
+ select * from {{ ref('stg_orders') }}
393
+ {{ limit_data_in_dev('created_at') }}
394
+ ```
395
+
396
+ ### Pattern 7: Incremental Strategies
397
+
398
+ ```sql
399
+ -- Delete+Insert (default)
400
+ {{
401
+ config(
402
+ materialized='incremental',
403
+ unique_key='id',
404
+ incremental_strategy='delete+insert'
405
+ )
406
+ }}
407
+
408
+ -- Merge (best for late-arriving data)
409
+ {{
410
+ config(
411
+ materialized='incremental',
412
+ unique_key='id',
413
+ incremental_strategy='merge',
414
+ merge_update_columns=['status', 'amount', 'updated_at']
415
+ )
416
+ }}
417
+
418
+ -- Insert Overwrite (partition-based)
419
+ {{
420
+ config(
421
+ materialized='incremental',
422
+ incremental_strategy='insert_overwrite',
423
+ partition_by={
424
+ "field": "created_date",
425
+ "data_type": "date",
426
+ "granularity": "day"
427
+ }
428
+ )
429
+ }}
430
+
431
+ select
432
+ *,
433
+ date(created_at) as created_date
434
+ from {{ ref('stg_events') }}
435
+
436
+ {% if is_incremental() %}
437
+ where created_date >= dateadd(day, -3, current_date)
438
+ {% endif %}
439
+ ```
440
+
441
+ ## dbt Commands
442
+
443
+ ```bash
444
+ # Development
445
+ dbt run
446
+ dbt run --select staging
447
+ dbt run --select +fct_orders
448
+ dbt run --select fct_orders+
449
+ dbt run --full-refresh
450
+
451
+ # Testing
452
+ dbt test
453
+ dbt test --select stg_stripe
454
+ dbt build
455
+
456
+ # Documentation
457
+ dbt docs generate
458
+ dbt docs serve
459
+
460
+ # Debugging
461
+ dbt compile
462
+ dbt debug
463
+ dbt ls --select tag:critical
464
+ ```
465
+
466
+ ## Best Practices
467
+
468
+ ### Do's
469
+
470
+ - **Use staging layer** - Clean data once, use everywhere
471
+ - **Test aggressively** - Not null, unique, relationships
472
+ - **Document everything** - Column descriptions, model descriptions
473
+ - **Use incremental** - For tables > 1M rows
474
+ - **Version control** - dbt project in Git
475
+
476
+ ### Don'ts
477
+
478
+ - **Don't skip staging** - Raw → mart is tech debt
479
+ - **Don't hardcode dates** - Use `{{ var('start_date') }}`
480
+ - **Don't repeat logic** - Extract to macros
481
+ - **Don't test in prod** - Use dev target
482
+ - **Don't ignore freshness** - Monitor source data