@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,539 @@
1
+ ---
2
+ name: bash-defensive-patterns
3
+ description: Master defensive Bash programming techniques for production-grade scripts. Use when writing robust shell scripts, CI/CD pipelines, or system utilities requiring fault tolerance and safety.
4
+ ---
5
+
6
+ # Bash Defensive Patterns
7
+
8
+ Comprehensive guidance for writing production-ready Bash scripts using defensive programming techniques, error handling, and safety best practices to prevent common pitfalls and ensure reliability.
9
+
10
+ ## When to Use This Skill
11
+
12
+ - Writing production automation scripts
13
+ - Building CI/CD pipeline scripts
14
+ - Creating system administration utilities
15
+ - Developing error-resilient deployment automation
16
+ - Writing scripts that must handle edge cases safely
17
+ - Building maintainable shell script libraries
18
+ - Implementing comprehensive logging and monitoring
19
+ - Creating scripts that must work across different platforms
20
+
21
+ ## Core Defensive Principles
22
+
23
+ ### 1. Strict Mode
24
+
25
+ Enable bash strict mode at the start of every script to catch errors early.
26
+
27
+ ```bash
28
+ #!/bin/bash
29
+ set -Eeuo pipefail # Exit on error, unset variables, pipe failures
30
+ ```
31
+
32
+ **Key flags:**
33
+
34
+ - `set -E`: Inherit ERR trap in functions
35
+ - `set -e`: Exit on any error (command returns non-zero)
36
+ - `set -u`: Exit on undefined variable reference
37
+ - `set -o pipefail`: Pipe fails if any command fails (not just last)
38
+
39
+ ### 2. Error Trapping and Cleanup
40
+
41
+ Implement proper cleanup on script exit or error.
42
+
43
+ ```bash
44
+ #!/bin/bash
45
+ set -Eeuo pipefail
46
+
47
+ trap 'echo "Error on line $LINENO"' ERR
48
+ trap 'echo "Cleaning up..."; rm -rf "$TMPDIR"' EXIT
49
+
50
+ TMPDIR=$(mktemp -d)
51
+ # Script code here
52
+ ```
53
+
54
+ ### 3. Variable Safety
55
+
56
+ Always quote variables to prevent word splitting and globbing issues.
57
+
58
+ ```bash
59
+ # Wrong - unsafe
60
+ cp $source $dest
61
+
62
+ # Correct - safe
63
+ cp "$source" "$dest"
64
+
65
+ # Required variables - fail with message if unset
66
+ : "${REQUIRED_VAR:?REQUIRED_VAR is not set}"
67
+ ```
68
+
69
+ ### 4. Array Handling
70
+
71
+ Use arrays safely for complex data handling.
72
+
73
+ ```bash
74
+ # Safe array iteration
75
+ declare -a items=("item 1" "item 2" "item 3")
76
+
77
+ for item in "${items[@]}"; do
78
+ echo "Processing: $item"
79
+ done
80
+
81
+ # Reading output into array safely
82
+ mapfile -t lines < <(some_command)
83
+ readarray -t numbers < <(seq 1 10)
84
+ ```
85
+
86
+ ### 5. Conditional Safety
87
+
88
+ Use `[[ ]]` for Bash-specific features, `[ ]` for POSIX.
89
+
90
+ ```bash
91
+ # Bash - safer
92
+ if [[ -f "$file" && -r "$file" ]]; then
93
+ content=$(<"$file")
94
+ fi
95
+
96
+ # POSIX - portable
97
+ if [ -f "$file" ] && [ -r "$file" ]; then
98
+ content=$(cat "$file")
99
+ fi
100
+
101
+ # Test for existence before operations
102
+ if [[ -z "${VAR:-}" ]]; then
103
+ echo "VAR is not set or is empty"
104
+ fi
105
+ ```
106
+
107
+ ## Fundamental Patterns
108
+
109
+ ### Pattern 1: Safe Script Directory Detection
110
+
111
+ ```bash
112
+ #!/bin/bash
113
+ set -Eeuo pipefail
114
+
115
+ # Correctly determine script directory
116
+ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
117
+ SCRIPT_NAME="$(basename -- "${BASH_SOURCE[0]}")"
118
+
119
+ echo "Script location: $SCRIPT_DIR/$SCRIPT_NAME"
120
+ ```
121
+
122
+ ### Pattern 2: Comprehensive Function Templat
123
+
124
+ ```bash
125
+ #!/bin/bash
126
+ set -Eeuo pipefail
127
+
128
+ # Prefix for functions: handle_*, process_*, check_*, validate_*
129
+ # Include documentation and error handling
130
+
131
+ validate_file() {
132
+ local -r file="$1"
133
+ local -r message="${2:-File not found: $file}"
134
+
135
+ if [[ ! -f "$file" ]]; then
136
+ echo "ERROR: $message" >&2
137
+ return 1
138
+ fi
139
+ return 0
140
+ }
141
+
142
+ process_files() {
143
+ local -r input_dir="$1"
144
+ local -r output_dir="$2"
145
+
146
+ # Validate inputs
147
+ [[ -d "$input_dir" ]] || { echo "ERROR: input_dir not a directory" >&2; return 1; }
148
+
149
+ # Create output directory if needed
150
+ mkdir -p "$output_dir" || { echo "ERROR: Cannot create output_dir" >&2; return 1; }
151
+
152
+ # Process files safely
153
+ while IFS= read -r -d '' file; do
154
+ echo "Processing: $file"
155
+ # Do work
156
+ done < <(find "$input_dir" -maxdepth 1 -type f -print0)
157
+
158
+ return 0
159
+ }
160
+ ```
161
+
162
+ ### Pattern 3: Safe Temporary File Handling
163
+
164
+ ```bash
165
+ #!/bin/bash
166
+ set -Eeuo pipefail
167
+
168
+ trap 'rm -rf -- "$TMPDIR"' EXIT
169
+
170
+ # Create temporary directory
171
+ TMPDIR=$(mktemp -d) || { echo "ERROR: Failed to create temp directory" >&2; exit 1; }
172
+
173
+ # Create temporary files in directory
174
+ TMPFILE1="$TMPDIR/temp1.txt"
175
+ TMPFILE2="$TMPDIR/temp2.txt"
176
+
177
+ # Use temporary files
178
+ touch "$TMPFILE1" "$TMPFILE2"
179
+
180
+ echo "Temp files created in: $TMPDIR"
181
+ ```
182
+
183
+ ### Pattern 4: Robust Argument Parsing
184
+
185
+ ```bash
186
+ #!/bin/bash
187
+ set -Eeuo pipefail
188
+
189
+ # Default values
190
+ VERBOSE=false
191
+ DRY_RUN=false
192
+ OUTPUT_FILE=""
193
+ THREADS=4
194
+
195
+ usage() {
196
+ cat <<EOF
197
+ Usage: $0 [OPTIONS]
198
+
199
+ Options:
200
+ -v, --verbose Enable verbose output
201
+ -d, --dry-run Run without making changes
202
+ -o, --output FILE Output file path
203
+ -j, --jobs NUM Number of parallel jobs
204
+ -h, --help Show this help message
205
+ EOF
206
+ exit "${1:-0}"
207
+ }
208
+
209
+ # Parse arguments
210
+ while [[ $# -gt 0 ]]; do
211
+ case "$1" in
212
+ -v|--verbose)
213
+ VERBOSE=true
214
+ shift
215
+ ;;
216
+ -d|--dry-run)
217
+ DRY_RUN=true
218
+ shift
219
+ ;;
220
+ -o|--output)
221
+ OUTPUT_FILE="$2"
222
+ shift 2
223
+ ;;
224
+ -j|--jobs)
225
+ THREADS="$2"
226
+ shift 2
227
+ ;;
228
+ -h|--help)
229
+ usage 0
230
+ ;;
231
+ --)
232
+ shift
233
+ break
234
+ ;;
235
+ *)
236
+ echo "ERROR: Unknown option: $1" >&2
237
+ usage 1
238
+ ;;
239
+ esac
240
+ done
241
+
242
+ # Validate required arguments
243
+ [[ -n "$OUTPUT_FILE" ]] || { echo "ERROR: -o/--output is required" >&2; usage 1; }
244
+ ```
245
+
246
+ ### Pattern 5: Structured Logging
247
+
248
+ ```bash
249
+ #!/bin/bash
250
+ set -Eeuo pipefail
251
+
252
+ # Logging functions
253
+ log_info() {
254
+ echo "[$(date +'%Y-%m-%d %H:%M:%S')] INFO: $*" >&2
255
+ }
256
+
257
+ log_warn() {
258
+ echo "[$(date +'%Y-%m-%d %H:%M:%S')] WARN: $*" >&2
259
+ }
260
+
261
+ log_error() {
262
+ echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $*" >&2
263
+ }
264
+
265
+ log_debug() {
266
+ if [[ "${DEBUG:-0}" == "1" ]]; then
267
+ echo "[$(date +'%Y-%m-%d %H:%M:%S')] DEBUG: $*" >&2
268
+ fi
269
+ }
270
+
271
+ # Usage
272
+ log_info "Starting script"
273
+ log_debug "Debug information"
274
+ log_warn "Warning message"
275
+ log_error "Error occurred"
276
+ ```
277
+
278
+ ### Pattern 6: Process Orchestration with Signals
279
+
280
+ ```bash
281
+ #!/bin/bash
282
+ set -Eeuo pipefail
283
+
284
+ # Track background processes
285
+ PIDS=()
286
+
287
+ cleanup() {
288
+ log_info "Shutting down..."
289
+
290
+ # Terminate all background processes
291
+ for pid in "${PIDS[@]}"; do
292
+ if kill -0 "$pid" 2>/dev/null; then
293
+ kill -TERM "$pid" 2>/dev/null || true
294
+ fi
295
+ done
296
+
297
+ # Wait for graceful shutdown
298
+ for pid in "${PIDS[@]}"; do
299
+ wait "$pid" 2>/dev/null || true
300
+ done
301
+ }
302
+
303
+ trap cleanup SIGTERM SIGINT
304
+
305
+ # Start background tasks
306
+ background_task &
307
+ PIDS+=($!)
308
+
309
+ another_task &
310
+ PIDS+=($!)
311
+
312
+ # Wait for all background processes
313
+ wait
314
+ ```
315
+
316
+ ### Pattern 7: Safe File Operations
317
+
318
+ ```bash
319
+ #!/bin/bash
320
+ set -Eeuo pipefail
321
+
322
+ # Use -i flag to move safely without overwriting
323
+ safe_move() {
324
+ local -r source="$1"
325
+ local -r dest="$2"
326
+
327
+ if [[ ! -e "$source" ]]; then
328
+ echo "ERROR: Source does not exist: $source" >&2
329
+ return 1
330
+ fi
331
+
332
+ if [[ -e "$dest" ]]; then
333
+ echo "ERROR: Destination already exists: $dest" >&2
334
+ return 1
335
+ fi
336
+
337
+ mv "$source" "$dest"
338
+ }
339
+
340
+ # Safe directory cleanup
341
+ safe_rmdir() {
342
+ local -r dir="$1"
343
+
344
+ if [[ ! -d "$dir" ]]; then
345
+ echo "ERROR: Not a directory: $dir" >&2
346
+ return 1
347
+ fi
348
+
349
+ # Use -I flag to prompt before rm (BSD/GNU compatible)
350
+ rm -rI -- "$dir"
351
+ }
352
+
353
+ # Atomic file writes
354
+ atomic_write() {
355
+ local -r target="$1"
356
+ local -r tmpfile
357
+ tmpfile=$(mktemp) || return 1
358
+
359
+ # Write to temp file first
360
+ cat > "$tmpfile"
361
+
362
+ # Atomic rename
363
+ mv "$tmpfile" "$target"
364
+ }
365
+ ```
366
+
367
+ ### Pattern 8: Idempotent Script Design
368
+
369
+ ```bash
370
+ #!/bin/bash
371
+ set -Eeuo pipefail
372
+
373
+ # Check if resource already exists
374
+ ensure_directory() {
375
+ local -r dir="$1"
376
+
377
+ if [[ -d "$dir" ]]; then
378
+ log_info "Directory already exists: $dir"
379
+ return 0
380
+ fi
381
+
382
+ mkdir -p "$dir" || {
383
+ log_error "Failed to create directory: $dir"
384
+ return 1
385
+ }
386
+
387
+ log_info "Created directory: $dir"
388
+ }
389
+
390
+ # Ensure configuration state
391
+ ensure_config() {
392
+ local -r config_file="$1"
393
+ local -r default_value="$2"
394
+
395
+ if [[ ! -f "$config_file" ]]; then
396
+ echo "$default_value" > "$config_file"
397
+ log_info "Created config: $config_file"
398
+ fi
399
+ }
400
+
401
+ # Rerunning script multiple times should be safe
402
+ ensure_directory "/var/cache/myapp"
403
+ ensure_config "/etc/myapp/config" "DEBUG=false"
404
+ ```
405
+
406
+ ### Pattern 9: Safe Command Substitution
407
+
408
+ ```bash
409
+ #!/bin/bash
410
+ set -Eeuo pipefail
411
+
412
+ # Use $() instead of backticks
413
+ name=$(<"$file") # Modern, safe variable assignment from file
414
+ output=$(command -v python3) # Get command location safely
415
+
416
+ # Handle command substitution with error checking
417
+ result=$(command -v node) || {
418
+ log_error "node command not found"
419
+ return 1
420
+ }
421
+
422
+ # For multiple lines
423
+ mapfile -t lines < <(grep "pattern" "$file")
424
+
425
+ # NUL-safe iteration
426
+ while IFS= read -r -d '' file; do
427
+ echo "Processing: $file"
428
+ done < <(find /path -type f -print0)
429
+ ```
430
+
431
+ ### Pattern 10: Dry-Run Support
432
+
433
+ ```bash
434
+ #!/bin/bash
435
+ set -Eeuo pipefail
436
+
437
+ DRY_RUN="${DRY_RUN:-false}"
438
+
439
+ run_cmd() {
440
+ if [[ "$DRY_RUN" == "true" ]]; then
441
+ echo "[DRY RUN] Would execute: $*"
442
+ return 0
443
+ fi
444
+
445
+ "$@"
446
+ }
447
+
448
+ # Usage
449
+ run_cmd cp "$source" "$dest"
450
+ run_cmd rm "$file"
451
+ run_cmd chown "$owner" "$target"
452
+ ```
453
+
454
+ ## Advanced Defensive Techniques
455
+
456
+ ### Named Parameters Pattern
457
+
458
+ ```bash
459
+ #!/bin/bash
460
+ set -Eeuo pipefail
461
+
462
+ process_data() {
463
+ local input_file=""
464
+ local output_dir=""
465
+ local format="json"
466
+
467
+ # Parse named parameters
468
+ while [[ $# -gt 0 ]]; do
469
+ case "$1" in
470
+ --input=*)
471
+ input_file="${1#*=}"
472
+ ;;
473
+ --output=*)
474
+ output_dir="${1#*=}"
475
+ ;;
476
+ --format=*)
477
+ format="${1#*=}"
478
+ ;;
479
+ *)
480
+ echo "ERROR: Unknown parameter: $1" >&2
481
+ return 1
482
+ ;;
483
+ esac
484
+ shift
485
+ done
486
+
487
+ # Validate required parameters
488
+ [[ -n "$input_file" ]] || { echo "ERROR: --input is required" >&2; return 1; }
489
+ [[ -n "$output_dir" ]] || { echo "ERROR: --output is required" >&2; return 1; }
490
+ }
491
+ ```
492
+
493
+ ### Dependency Checking
494
+
495
+ ```bash
496
+ #!/bin/bash
497
+ set -Eeuo pipefail
498
+
499
+ check_dependencies() {
500
+ local -a missing_deps=()
501
+ local -a required=("jq" "curl" "git")
502
+
503
+ for cmd in "${required[@]}"; do
504
+ if ! command -v "$cmd" &>/dev/null; then
505
+ missing_deps+=("$cmd")
506
+ fi
507
+ done
508
+
509
+ if [[ ${#missing_deps[@]} -gt 0 ]]; then
510
+ echo "ERROR: Missing required commands: ${missing_deps[*]}" >&2
511
+ return 1
512
+ fi
513
+ }
514
+
515
+ check_dependencies
516
+ ```
517
+
518
+ ## Best Practices Summary
519
+
520
+ 1. **Always use strict mode** - `set -Eeuo pipefail`
521
+ 2. **Quote all variables** - `"$variable"` prevents word splitting
522
+ 3. **Use [[]] conditionals** - More robust than [ ]
523
+ 4. **Implement error trapping** - Catch and handle errors gracefully
524
+ 5. **Validate all inputs** - Check file existence, permissions, formats
525
+ 6. **Use functions for reusability** - Prefix with meaningful names
526
+ 7. **Implement structured logging** - Include timestamps and levels
527
+ 8. **Support dry-run mode** - Allow users to preview changes
528
+ 9. **Handle temporary files safely** - Use mktemp, cleanup with trap
529
+ 10. **Design for idempotency** - Scripts should be safe to rerun
530
+ 11. **Document requirements** - List dependencies and minimum versions
531
+ 12. **Test error paths** - Ensure error handling works correctly
532
+ 13. **Use `command -v`** - Safer than `which` for checking executables
533
+ 14. **Prefer printf over echo** - More predictable across systems
534
+
535
+ ## Resources
536
+
537
+ - **Bash Strict Mode**: http://redsymbol.net/articles/unofficial-bash-strict-mode/
538
+ - **Google Shell Style Guide**: https://google.github.io/styleguide/shellguide.html
539
+ - **Defensive BASH Programming**: https://www.lifepipe.net/