blockmine 1.20.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/.claude/agents/README.md +469 -0
  2. package/.claude/agents/auth-route-debugger.md +118 -0
  3. package/.claude/agents/auth-route-tester.md +93 -0
  4. package/.claude/agents/auto-error-resolver.md +97 -0
  5. package/.claude/agents/build-optimizer.md +236 -0
  6. package/.claude/agents/code-architecture-reviewer.md +83 -0
  7. package/.claude/agents/code-refactor-master.md +94 -0
  8. package/.claude/agents/cost-optimizer.md +134 -0
  9. package/.claude/agents/deployment-orchestrator.md +113 -0
  10. package/.claude/agents/documentation-architect.md +82 -0
  11. package/.claude/agents/frontend-error-fixer.md +77 -0
  12. package/.claude/agents/iac-code-generator.md +71 -0
  13. package/.claude/agents/incident-responder.md +346 -0
  14. package/.claude/agents/infrastructure-architect.md +31 -0
  15. package/.claude/agents/kubernetes-specialist.md +56 -0
  16. package/.claude/agents/migration-planner.md +181 -0
  17. package/.claude/agents/network-architect.md +196 -0
  18. package/.claude/agents/plan-reviewer.md +52 -0
  19. package/.claude/agents/refactor-planner.md +63 -0
  20. package/.claude/agents/security-scanner.md +102 -0
  21. package/.claude/agents/web-research-specialist.md +78 -0
  22. package/.claude/commands/cost-analysis.md +315 -0
  23. package/.claude/commands/dev-docs-update.md +55 -0
  24. package/.claude/commands/dev-docs.md +51 -0
  25. package/.claude/commands/incident-debug.md +247 -0
  26. package/.claude/commands/infra-plan.md +81 -0
  27. package/.claude/commands/migration-plan.md +478 -0
  28. package/.claude/commands/route-research-for-testing.md +37 -0
  29. package/.claude/commands/security-review.md +66 -0
  30. package/.claude/hooks/CONFIG.md +448 -0
  31. package/.claude/hooks/README.md +163 -0
  32. package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
  33. package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
  34. package/.claude/hooks/add-skill-activation-banners.ts +132 -0
  35. package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
  36. package/.claude/hooks/error-handling-reminder.sh +12 -0
  37. package/.claude/hooks/error-handling-reminder.ts +222 -0
  38. package/.claude/hooks/k8s-manifest-validator.sh +56 -0
  39. package/.claude/hooks/package-lock.json +556 -0
  40. package/.claude/hooks/package.json +16 -0
  41. package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
  42. package/.claude/hooks/post-tool-use-tracker.sh +183 -0
  43. package/.claude/hooks/security-policy-check.sh +247 -0
  44. package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
  45. package/.claude/hooks/skill-activation-prompt.sh +10 -0
  46. package/.claude/hooks/skill-activation-prompt.ts +141 -0
  47. package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
  48. package/.claude/hooks/terraform-validator.sh +53 -0
  49. package/.claude/hooks/test-input.json +7 -0
  50. package/.claude/hooks/test-skill-activation.ts +427 -0
  51. package/.claude/hooks/trigger-build-resolver.sh +79 -0
  52. package/.claude/hooks/tsc-check.sh +173 -0
  53. package/.claude/hooks/tsconfig.json +19 -0
  54. package/.claude/settings.json +55 -0
  55. package/.claude/settings.local.json +28 -3
  56. package/.claude/skills/README.md +507 -0
  57. package/.claude/skills/api-engineering/SKILL.md +63 -0
  58. package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
  59. package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
  60. package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
  61. package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
  62. package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
  63. package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
  64. package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
  65. package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
  66. package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
  67. package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
  68. package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
  69. package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
  70. package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
  71. package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
  72. package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
  73. package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
  74. package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
  75. package/.claude/skills/build-engineering/SKILL.md +431 -0
  76. package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
  77. package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
  78. package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
  79. package/.claude/skills/build-engineering/resources/build-security.md +95 -0
  80. package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
  81. package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
  82. package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
  83. package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
  84. package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
  85. package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
  86. package/.claude/skills/cloud-engineering/SKILL.md +675 -0
  87. package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
  88. package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
  89. package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
  90. package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
  91. package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
  92. package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
  93. package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
  94. package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
  95. package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
  96. package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
  97. package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
  98. package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
  99. package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
  100. package/.claude/skills/cybersecurity/SKILL.md +409 -0
  101. package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
  102. package/.claude/skills/database-engineering/SKILL.md +61 -0
  103. package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
  104. package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
  105. package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
  106. package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
  107. package/.claude/skills/devsecops/SKILL.md +374 -0
  108. package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
  109. package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
  110. package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
  111. package/.claude/skills/devsecops/resources/container-security.md +915 -0
  112. package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
  113. package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
  114. package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
  115. package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
  116. package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
  117. package/.claude/skills/devsecops/resources/security-testing.md +203 -0
  118. package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
  119. package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
  120. package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
  121. package/.claude/skills/documentation-as-code/SKILL.md +323 -0
  122. package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
  123. package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
  124. package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
  125. package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
  126. package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
  127. package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
  128. package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
  129. package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
  130. package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
  131. package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
  132. package/.claude/skills/engineering-management/SKILL.md +356 -0
  133. package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
  134. package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
  135. package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
  136. package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
  137. package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
  138. package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
  139. package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
  140. package/.claude/skills/error-tracking/SKILL.md +379 -0
  141. package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
  142. package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
  143. package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
  144. package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
  145. package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
  146. package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
  147. package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
  148. package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
  149. package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
  150. package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
  151. package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
  152. package/.claude/skills/general-it-engineering/SKILL.md +393 -0
  153. package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
  154. package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
  155. package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
  156. package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
  157. package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
  158. package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
  159. package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
  160. package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
  161. package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
  162. package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
  163. package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
  164. package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
  165. package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
  166. package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
  167. package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
  168. package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
  169. package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
  170. package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
  171. package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
  172. package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
  173. package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
  174. package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
  175. package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
  176. package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
  177. package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
  178. package/.claude/skills/network-engineering/SKILL.md +385 -0
  179. package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
  180. package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
  181. package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
  182. package/.claude/skills/network-engineering/resources/network-security.md +921 -0
  183. package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
  184. package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
  185. package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
  186. package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
  187. package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
  188. package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
  189. package/.claude/skills/observability-engineering/SKILL.md +101 -0
  190. package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
  191. package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
  192. package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
  193. package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
  194. package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
  195. package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
  196. package/.claude/skills/platform-engineering/SKILL.md +555 -0
  197. package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
  198. package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
  199. package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
  200. package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
  201. package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
  202. package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
  203. package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
  204. package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
  205. package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
  206. package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
  207. package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
  208. package/.claude/skills/release-engineering/SKILL.md +393 -0
  209. package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
  210. package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
  211. package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
  212. package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
  213. package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
  214. package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
  215. package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
  216. package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
  217. package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
  218. package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
  219. package/.claude/skills/route-tester/SKILL.md +392 -0
  220. package/.claude/skills/skill-developer/ADVANCED.md +197 -0
  221. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
  222. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
  223. package/.claude/skills/skill-developer/SKILL.md +430 -0
  224. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
  225. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
  226. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
  227. package/.claude/skills/skill-rules.json +2940 -0
  228. package/.claude/skills/sre/SKILL.md +464 -0
  229. package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
  230. package/.claude/skills/sre/resources/capacity-planning.md +226 -0
  231. package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
  232. package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
  233. package/.claude/skills/sre/resources/incident-management.md +436 -0
  234. package/.claude/skills/sre/resources/observability-stack.md +240 -0
  235. package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
  236. package/.claude/skills/sre/resources/performance-optimization.md +108 -0
  237. package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
  238. package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
  239. package/.claude/skills/sre/resources/toil-reduction.md +145 -0
  240. package/.claude/skills/systems-engineering/SKILL.md +648 -0
  241. package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
  242. package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
  243. package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
  244. package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
  245. package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
  246. package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
  247. package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
  248. package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
  249. package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
  250. package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
  251. package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
  252. package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
  253. package/.claude/skills/technical-leadership/SKILL.md +728 -0
  254. package/CHANGELOG.md +90 -39
  255. package/README.md +94 -0
  256. package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
  257. package/backend/jest.config.js +59 -0
  258. package/backend/package-lock.json +6129 -0
  259. package/backend/package.json +16 -4
  260. package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
  261. package/backend/prisma/schema.prisma +33 -0
  262. package/backend/src/__tests__/core/DependencyService.test.js +336 -0
  263. package/backend/src/__tests__/core/UserService.test.js +875 -0
  264. package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
  265. package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
  266. package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
  267. package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
  268. package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
  269. package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
  270. package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
  271. package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
  272. package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
  273. package/backend/src/__tests__/secretsFilter.test.js +425 -0
  274. package/backend/src/__tests__/services/BotLifecycleService.test.js +411 -0
  275. package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
  276. package/backend/src/__tests__/services/CacheManager.test.js +125 -0
  277. package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
  278. package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
  279. package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
  280. package/backend/src/__tests__/setup.js +25 -0
  281. package/backend/src/api/routes/apiKeys.js +181 -0
  282. package/backend/src/api/routes/bots.js +49 -7
  283. package/backend/src/api/routes/plugins.js +2 -1
  284. package/backend/src/api/routes/system.js +174 -0
  285. package/backend/src/container.js +82 -0
  286. package/backend/src/core/BotManager.js +142 -871
  287. package/backend/src/core/BotManager.old.js +1093 -0
  288. package/backend/src/core/BotProcess.js +1092 -850
  289. package/backend/src/core/BreakLoopSignal.js +8 -0
  290. package/backend/src/core/EventGraphManager.js +280 -193
  291. package/backend/src/core/GraphExecutionEngine.js +321 -928
  292. package/backend/src/core/MessageQueue.js +27 -6
  293. package/backend/src/core/NodeRegistry.js +37 -991
  294. package/backend/src/core/PluginManager.js +62 -12
  295. package/backend/src/core/PrismaService.js +32 -0
  296. package/backend/src/core/UserService.js +3 -3
  297. package/backend/src/core/__tests__/PrismaService.test.js +24 -0
  298. package/backend/src/core/commands/README.md +305 -0
  299. package/backend/src/core/commands/dev.js +13 -7
  300. package/backend/src/core/commands/ping.js +10 -4
  301. package/backend/src/core/commands/whois.js +63 -0
  302. package/backend/src/core/config/validation.js +27 -0
  303. package/backend/src/core/constants/graphTypes.js +21 -0
  304. package/backend/src/core/node-registries/actions.js +132 -0
  305. package/backend/src/core/node-registries/arrays.js +137 -0
  306. package/backend/src/core/node-registries/bot.js +23 -0
  307. package/backend/src/core/node-registries/data.js +290 -0
  308. package/backend/src/core/node-registries/debug.js +26 -0
  309. package/backend/src/core/node-registries/events.js +187 -0
  310. package/backend/src/core/node-registries/flow.js +139 -0
  311. package/backend/src/core/node-registries/logic.js +45 -0
  312. package/backend/src/core/node-registries/math.js +42 -0
  313. package/backend/src/core/node-registries/objects.js +98 -0
  314. package/backend/src/core/node-registries/strings.js +153 -0
  315. package/backend/src/core/node-registries/time.js +113 -0
  316. package/backend/src/core/node-registries/users.js +79 -0
  317. package/backend/src/core/nodes/actions/bot_look_at.js +36 -0
  318. package/backend/src/core/nodes/actions/bot_set_variable.js +32 -0
  319. package/backend/src/core/nodes/actions/http_request.js +98 -0
  320. package/backend/src/core/nodes/actions/send_log.js +28 -0
  321. package/backend/src/core/nodes/actions/send_message.js +32 -0
  322. package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
  323. package/backend/src/core/nodes/arrays/add_element.js +23 -0
  324. package/backend/src/core/nodes/arrays/contains.js +40 -0
  325. package/backend/src/core/nodes/arrays/find_index.js +23 -0
  326. package/backend/src/core/nodes/arrays/get_by_index.js +23 -0
  327. package/backend/src/core/nodes/arrays/get_next.js +35 -0
  328. package/backend/src/core/nodes/arrays/get_random_element.js +32 -0
  329. package/backend/src/core/nodes/arrays/remove_by_index.js +30 -0
  330. package/backend/src/core/nodes/bot/get_position.js +20 -0
  331. package/backend/src/core/nodes/data/array_literal.js +31 -0
  332. package/backend/src/core/nodes/data/boolean_literal.js +21 -0
  333. package/backend/src/core/nodes/data/cast.js +42 -0
  334. package/backend/src/core/nodes/data/datetime_literal.js +27 -0
  335. package/backend/src/core/nodes/data/entity_info.js +69 -0
  336. package/backend/src/core/nodes/data/get_argument.js +23 -0
  337. package/backend/src/core/nodes/data/get_bot_look.js +14 -0
  338. package/backend/src/core/nodes/data/get_entity_field.js +18 -0
  339. package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
  340. package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
  341. package/backend/src/core/nodes/data/get_server_players.js +18 -0
  342. package/backend/src/core/nodes/data/get_user_field.js +40 -0
  343. package/backend/src/core/nodes/data/get_variable.js +23 -0
  344. package/backend/src/core/nodes/data/length.js +25 -0
  345. package/backend/src/core/nodes/data/make_object.js +31 -0
  346. package/backend/src/core/nodes/data/number_literal.js +21 -0
  347. package/backend/src/core/nodes/data/string_literal.js +34 -0
  348. package/backend/src/core/nodes/data/type_check.js +53 -0
  349. package/backend/src/core/nodes/debug/log.js +16 -0
  350. package/backend/src/core/nodes/flow/branch.js +15 -0
  351. package/backend/src/core/nodes/flow/break.js +14 -0
  352. package/backend/src/core/nodes/flow/delay.js +43 -0
  353. package/backend/src/core/nodes/flow/for_each.js +39 -0
  354. package/backend/src/core/nodes/flow/sequence.js +16 -0
  355. package/backend/src/core/nodes/flow/switch.js +47 -0
  356. package/backend/src/core/nodes/flow/while.js +64 -0
  357. package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
  358. package/backend/src/core/nodes/logic/compare.js +33 -0
  359. package/backend/src/core/nodes/logic/operation.js +35 -0
  360. package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
  361. package/backend/src/core/nodes/math/operation.js +31 -0
  362. package/backend/src/core/nodes/math/random_number.js +43 -0
  363. package/backend/src/core/nodes/objects/create.js +40 -0
  364. package/backend/src/core/nodes/objects/delete.js +26 -0
  365. package/backend/src/core/nodes/objects/get.js +23 -0
  366. package/backend/src/core/nodes/objects/has_key.js +30 -0
  367. package/backend/src/core/nodes/objects/set.js +27 -0
  368. package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
  369. package/backend/src/core/nodes/strings/concat.js +27 -0
  370. package/backend/src/core/nodes/strings/contains.js +41 -0
  371. package/backend/src/core/nodes/strings/ends_with.js +43 -0
  372. package/backend/src/core/nodes/strings/equals.js +36 -0
  373. package/backend/src/core/nodes/strings/length.js +36 -0
  374. package/backend/src/core/nodes/strings/matches.js +39 -0
  375. package/backend/src/core/nodes/strings/split.js +37 -0
  376. package/backend/src/core/nodes/strings/starts_with.js +43 -0
  377. package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
  378. package/backend/src/core/nodes/time/add.js +33 -0
  379. package/backend/src/core/nodes/time/compare.js +35 -0
  380. package/backend/src/core/nodes/time/diff.js +29 -0
  381. package/backend/src/core/nodes/time/format.js +32 -0
  382. package/backend/src/core/nodes/time/now.js +18 -0
  383. package/backend/src/core/nodes/users/check_blacklist.js +37 -0
  384. package/backend/src/core/nodes/users/get_groups.js +36 -0
  385. package/backend/src/core/nodes/users/get_permissions.js +36 -0
  386. package/backend/src/core/nodes/users/set_blacklist.js +37 -0
  387. package/backend/src/core/services/BotLifecycleService.js +596 -0
  388. package/backend/src/core/services/BotProcessManager.js +163 -0
  389. package/backend/src/core/services/CacheManager.js +111 -0
  390. package/backend/src/core/services/CommandExecutionService.js +351 -0
  391. package/backend/src/core/services/ResourceMonitorService.js +90 -0
  392. package/backend/src/core/services/TelemetryService.js +124 -0
  393. package/backend/src/core/services/ValidationService.js +132 -0
  394. package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
  395. package/backend/src/core/services.js +20 -5
  396. package/backend/src/core/system/CommandContext.js +84 -0
  397. package/backend/src/core/system/Transport.js +78 -0
  398. package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
  399. package/backend/src/core/utils/jsonParser.js +18 -0
  400. package/backend/src/core/utils/secretsFilter.js +262 -0
  401. package/backend/src/core/utils/variableParser.js +89 -0
  402. package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
  403. package/backend/src/core/validation/nodeSchemas.js +112 -0
  404. package/backend/src/lib/prisma.js +2 -4
  405. package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
  406. package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
  407. package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
  408. package/backend/src/real-time/botApi/handlers/index.js +43 -0
  409. package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
  410. package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
  411. package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
  412. package/backend/src/real-time/botApi/index.js +40 -0
  413. package/backend/src/real-time/botApi/middleware.js +79 -0
  414. package/backend/src/real-time/botApi/utils.js +54 -0
  415. package/backend/src/real-time/socketHandler.js +6 -2
  416. package/backend/src/repositories/BaseRepository.js +43 -0
  417. package/backend/src/repositories/BotRepository.js +42 -0
  418. package/backend/src/repositories/CommandRepository.js +53 -0
  419. package/backend/src/repositories/EventGraphRepository.js +40 -0
  420. package/backend/src/repositories/GroupRepository.js +69 -0
  421. package/backend/src/repositories/PermissionRepository.js +48 -0
  422. package/backend/src/repositories/PluginRepository.js +42 -0
  423. package/backend/src/repositories/ServerRepository.js +27 -0
  424. package/backend/src/repositories/UserRepository.js +48 -0
  425. package/backend/src/server.js +3 -0
  426. package/backend/src/test-refactor.js +85 -0
  427. package/frontend/dist/assets/index-CfTo92bP.css +1 -0
  428. package/frontend/dist/assets/index-CiFD5X9Z.js +8344 -0
  429. package/frontend/dist/index.html +2 -2
  430. package/frontend/package.json +1 -5
  431. package/package.json +2 -1
  432. package/frontend/dist/assets/index-BFd7YoAj.css +0 -1
  433. package/frontend/dist/assets/index-CMMutadc.js +0 -8352
  434. package/nul +0 -0
@@ -0,0 +1,915 @@
1
+ # Shell Scripting
2
+
3
+ Comprehensive guide to Bash scripting covering patterns, error handling, functions, input validation, common pitfalls, testing, and best practices for production-ready scripts.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Script Structure](#script-structure)
8
+ - [Error Handling](#error-handling)
9
+ - [Functions and Modularity](#functions-and-modularity)
10
+ - [Input Validation](#input-validation)
11
+ - [Common Pitfalls](#common-pitfalls)
12
+ - [Testing Shell Scripts](#testing-shell-scripts)
13
+ - [Best Practices](#best-practices)
14
+ - [Complete Examples](#complete-examples)
15
+
16
+ ## Script Structure
17
+
18
+ ### Basic Template
19
+
20
+ ```bash
21
+ #!/usr/bin/env bash
22
+ #
23
+ # Script: backup.sh
24
+ # Description: Automated backup script with error handling
25
+ # Author: DevOps Team
26
+ # Date: 2025-01-01
27
+ #
28
+
29
+ set -euo pipefail # Exit on error, undefined vars, pipe failures
30
+ IFS=$'\n\t' # Set Internal Field Separator
31
+
32
+ # Constants
33
+ readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
34
+ readonly SCRIPT_NAME="$(basename "$0")"
35
+ readonly BACKUP_DIR="/backup"
36
+ readonly LOG_FILE="/var/log/${SCRIPT_NAME%.sh}.log"
37
+
38
+ # Variables
39
+ VERBOSE=false
40
+ DRY_RUN=false
41
+
42
+ # Cleanup function
43
+ cleanup() {
44
+ local exit_code=$?
45
+ # Cleanup temporary files
46
+ rm -f /tmp/backup-$$-*
47
+ exit "$exit_code"
48
+ }
49
+
50
+ # Set trap for cleanup
51
+ trap cleanup EXIT INT TERM
52
+
53
+ # Main function
54
+ main() {
55
+ log "INFO" "Starting backup process"
56
+
57
+ # Script logic here
58
+
59
+ log "INFO" "Backup completed successfully"
60
+ }
61
+
62
+ # Run main function
63
+ main "$@"
64
+ ```
65
+
66
+ ### Shebang Best Practices
67
+
68
+ ```bash
69
+ # BEST - Portable, uses env to find bash
70
+ #!/usr/bin/env bash
71
+
72
+ # ACCEPTABLE - Direct path (less portable)
73
+ #!/bin/bash
74
+
75
+ # AVOID - Assumes bash is in specific location
76
+ #!/usr/local/bin/bash
77
+
78
+ # FOR sh compatibility (POSIX)
79
+ #!/bin/sh
80
+ ```
81
+
82
+ ## Error Handling
83
+
84
+ ### set Options
85
+
86
+ ```bash
87
+ # Exit on any error
88
+ set -e
89
+
90
+ # Exit on undefined variable
91
+ set -u
92
+
93
+ # Exit on pipe failure (not just last command)
94
+ set -o pipefail
95
+
96
+ # Combined (recommended for production scripts)
97
+ set -euo pipefail
98
+
99
+ # Debug mode (print each command)
100
+ set -x
101
+
102
+ # Alternative: enable only for debugging
103
+ DEBUG=${DEBUG:-false}
104
+ if [ "$DEBUG" = "true" ]; then
105
+ set -x
106
+ fi
107
+ ```
108
+
109
+ ### Error Handling Patterns
110
+
111
+ ```bash
112
+ # Pattern 1: Check command success
113
+ if ! command -v docker &> /dev/null; then
114
+ echo "Error: docker not found" >&2
115
+ exit 1
116
+ fi
117
+
118
+ # Pattern 2: Or operator
119
+ mkdir -p /backup || {
120
+ echo "Error: Failed to create backup directory" >&2
121
+ exit 1
122
+ }
123
+
124
+ # Pattern 3: Explicit error checking
125
+ cp source.txt dest.txt
126
+ if [ $? -ne 0 ]; then
127
+ echo "Error: Copy failed" >&2
128
+ exit 1
129
+ fi
130
+
131
+ # Pattern 4: Command substitution with error check
132
+ output=$(command 2>&1) || {
133
+ echo "Error: Command failed with output: $output" >&2
134
+ exit 1
135
+ }
136
+ ```
137
+
138
+ ### trap for Cleanup
139
+
140
+ ```bash
141
+ #!/bin/bash
142
+
143
+ # Cleanup function
144
+ cleanup() {
145
+ local exit_code=$?
146
+ echo "Cleaning up..."
147
+
148
+ # Remove temporary files
149
+ rm -f "$TEMP_FILE"
150
+
151
+ # Unmount if mounted
152
+ if mountpoint -q "$MOUNT_POINT"; then
153
+ umount "$MOUNT_POINT"
154
+ fi
155
+
156
+ # Kill background processes
157
+ if [ -n "${PID:-}" ]; then
158
+ kill "$PID" 2>/dev/null || true
159
+ fi
160
+
161
+ exit "$exit_code"
162
+ }
163
+
164
+ # Trap on EXIT, INT, TERM
165
+ trap cleanup EXIT INT TERM
166
+
167
+ # Create temp file
168
+ TEMP_FILE=$(mktemp)
169
+
170
+ # Rest of script...
171
+ ```
172
+
173
+ ### Logging Functions
174
+
175
+ ```bash
176
+ # Color codes
177
+ readonly RED='\033[0;31m'
178
+ readonly YELLOW='\033[1;33m'
179
+ readonly GREEN='\033[0;32m'
180
+ readonly NC='\033[0m' # No Color
181
+
182
+ # Logging function
183
+ log() {
184
+ local level=$1
185
+ shift
186
+ local message="$@"
187
+ local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
188
+
189
+ case "$level" in
190
+ ERROR)
191
+ echo -e "${RED}[$timestamp] ERROR: $message${NC}" >&2
192
+ echo "[$timestamp] ERROR: $message" >> "$LOG_FILE"
193
+ ;;
194
+ WARN)
195
+ echo -e "${YELLOW}[$timestamp] WARN: $message${NC}" >&2
196
+ echo "[$timestamp] WARN: $message" >> "$LOG_FILE"
197
+ ;;
198
+ INFO)
199
+ echo "[$timestamp] INFO: $message"
200
+ echo "[$timestamp] INFO: $message" >> "$LOG_FILE"
201
+ ;;
202
+ DEBUG)
203
+ if [ "$VERBOSE" = true ]; then
204
+ echo "[$timestamp] DEBUG: $message"
205
+ fi
206
+ echo "[$timestamp] DEBUG: $message" >> "$LOG_FILE"
207
+ ;;
208
+ esac
209
+ }
210
+
211
+ # Die function (log error and exit)
212
+ die() {
213
+ log "ERROR" "$@"
214
+ exit 1
215
+ }
216
+
217
+ # Usage
218
+ log "INFO" "Starting process"
219
+ log "WARN" "Disk space is low"
220
+ log "ERROR" "Failed to connect to database"
221
+ die "Critical error occurred"
222
+ ```
223
+
224
+ ## Functions and Modularity
225
+
226
+ ### Function Basics
227
+
228
+ ```bash
229
+ # Function definition
230
+ function_name() {
231
+ local arg1=$1
232
+ local arg2=${2:-"default"} # Default value
233
+
234
+ # Function logic
235
+ echo "Processing $arg1 and $arg2"
236
+
237
+ return 0 # Return status (0-255)
238
+ }
239
+
240
+ # Calling function
241
+ function_name "value1" "value2"
242
+
243
+ # Capture output
244
+ result=$(function_name "value1")
245
+
246
+ # Check return status
247
+ if function_name "value1"; then
248
+ echo "Success"
249
+ else
250
+ echo "Failed"
251
+ fi
252
+ ```
253
+
254
+ ### Advanced Function Patterns
255
+
256
+ ```bash
257
+ # Function with named parameters (associative array)
258
+ process_data() {
259
+ local -A params=(
260
+ [input]=""
261
+ [output]=""
262
+ [format]="json"
263
+ )
264
+
265
+ # Parse parameters
266
+ while [[ $# -gt 0 ]]; do
267
+ case $1 in
268
+ --input)
269
+ params[input]="$2"
270
+ shift 2
271
+ ;;
272
+ --output)
273
+ params[output]="$2"
274
+ shift 2
275
+ ;;
276
+ --format)
277
+ params[format]="$2"
278
+ shift 2
279
+ ;;
280
+ *)
281
+ echo "Unknown parameter: $1" >&2
282
+ return 1
283
+ ;;
284
+ esac
285
+ done
286
+
287
+ # Validate required parameters
288
+ if [ -z "${params[input]}" ]; then
289
+ echo "Error: --input is required" >&2
290
+ return 1
291
+ fi
292
+
293
+ echo "Processing ${params[input]} in ${params[format]} format"
294
+ }
295
+
296
+ # Usage
297
+ process_data --input "data.csv" --output "result.json" --format "json"
298
+ ```
299
+
300
+ ### Library Pattern
301
+
302
+ ```bash
303
+ # lib/common.sh - Shared functions
304
+ #!/bin/bash
305
+
306
+ # Prevent multiple sourcing
307
+ [[ -n "${_COMMON_LIB_LOADED:-}" ]] && return
308
+ readonly _COMMON_LIB_LOADED=1
309
+
310
+ # Shared functions
311
+ is_root() {
312
+ [ "$(id -u)" -eq 0 ]
313
+ }
314
+
315
+ check_command() {
316
+ command -v "$1" &> /dev/null
317
+ }
318
+
319
+ # Export functions (for older bash)
320
+ export -f is_root
321
+ export -f check_command
322
+ ```
323
+
324
+ ```bash
325
+ # main-script.sh - Use library
326
+ #!/bin/bash
327
+
328
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
329
+ source "$SCRIPT_DIR/lib/common.sh"
330
+
331
+ if ! is_root; then
332
+ echo "This script must be run as root" >&2
333
+ exit 1
334
+ fi
335
+
336
+ if ! check_command "docker"; then
337
+ echo "Docker is not installed" >&2
338
+ exit 1
339
+ fi
340
+ ```
341
+
342
+ ## Input Validation
343
+
344
+ ### Argument Parsing with getopts
345
+
346
+ ```bash
347
+ #!/bin/bash
348
+
349
+ usage() {
350
+ cat <<EOF
351
+ Usage: $0 [OPTIONS]
352
+
353
+ Options:
354
+ -h, --help Show this help message
355
+ -v, --verbose Enable verbose mode
356
+ -f, --file FILE Input file (required)
357
+ -o, --output DIR Output directory (default: ./output)
358
+ -n, --dry-run Dry run mode
359
+ EOF
360
+ exit 1
361
+ }
362
+
363
+ # Default values
364
+ VERBOSE=false
365
+ DRY_RUN=false
366
+ INPUT_FILE=""
367
+ OUTPUT_DIR="./output"
368
+
369
+ # Parse arguments
370
+ while [[ $# -gt 0 ]]; do
371
+ case $1 in
372
+ -h|--help)
373
+ usage
374
+ ;;
375
+ -v|--verbose)
376
+ VERBOSE=true
377
+ shift
378
+ ;;
379
+ -f|--file)
380
+ INPUT_FILE="$2"
381
+ shift 2
382
+ ;;
383
+ -o|--output)
384
+ OUTPUT_DIR="$2"
385
+ shift 2
386
+ ;;
387
+ -n|--dry-run)
388
+ DRY_RUN=true
389
+ shift
390
+ ;;
391
+ -*)
392
+ echo "Unknown option: $1" >&2
393
+ usage
394
+ ;;
395
+ *)
396
+ echo "Unknown argument: $1" >&2
397
+ usage
398
+ ;;
399
+ esac
400
+ done
401
+
402
+ # Validate required arguments
403
+ if [ -z "$INPUT_FILE" ]; then
404
+ echo "Error: --file is required" >&2
405
+ usage
406
+ fi
407
+
408
+ # Validate file exists
409
+ if [ ! -f "$INPUT_FILE" ]; then
410
+ echo "Error: File not found: $INPUT_FILE" >&2
411
+ exit 1
412
+ fi
413
+ ```
414
+
415
+ ### Input Validation Functions
416
+
417
+ ```bash
418
+ # Validate IP address
419
+ is_valid_ip() {
420
+ local ip=$1
421
+ local regex='^([0-9]{1,3}\.){3}[0-9]{1,3}$'
422
+
423
+ if [[ $ip =~ $regex ]]; then
424
+ # Check each octet
425
+ IFS='.' read -r -a octets <<< "$ip"
426
+ for octet in "${octets[@]}"; do
427
+ if [ "$octet" -gt 255 ]; then
428
+ return 1
429
+ fi
430
+ done
431
+ return 0
432
+ fi
433
+ return 1
434
+ }
435
+
436
+ # Validate email
437
+ is_valid_email() {
438
+ local email=$1
439
+ local regex='^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
440
+ [[ $email =~ $regex ]]
441
+ }
442
+
443
+ # Validate number
444
+ is_number() {
445
+ local value=$1
446
+ [[ $value =~ ^[0-9]+$ ]]
447
+ }
448
+
449
+ # Validate port
450
+ is_valid_port() {
451
+ local port=$1
452
+ is_number "$port" && [ "$port" -ge 1 ] && [ "$port" -le 65535 ]
453
+ }
454
+
455
+ # Usage
456
+ if ! is_valid_ip "$IP_ADDRESS"; then
457
+ die "Invalid IP address: $IP_ADDRESS"
458
+ fi
459
+ ```
460
+
461
+ ## Common Pitfalls
462
+
463
+ ### Quoting Variables
464
+
465
+ ```bash
466
+ # BAD - Word splitting and globbing
467
+ file="my file.txt"
468
+ cat $file # Interprets as two arguments: "my" and "file.txt"
469
+
470
+ # GOOD - Quoted
471
+ cat "$file"
472
+
473
+ # BAD - Globbing can expand
474
+ files="*.txt"
475
+ rm $files # May delete unintended files
476
+
477
+ # GOOD - Quoted to prevent globbing
478
+ rm "$files"
479
+
480
+ # Array iteration
481
+ # BAD
482
+ for file in $FILES; do
483
+ echo $file
484
+ done
485
+
486
+ # GOOD
487
+ for file in "${FILES[@]}"; do
488
+ echo "$file"
489
+ done
490
+ ```
491
+
492
+ ### Word Splitting
493
+
494
+ ```bash
495
+ # BAD
496
+ files=$(ls /tmp)
497
+ for file in $files; do
498
+ # Breaks on spaces in filenames
499
+ echo "$file"
500
+ done
501
+
502
+ # GOOD - Use arrays
503
+ mapfile -t files < <(find /tmp -type f)
504
+ for file in "${files[@]}"; do
505
+ echo "$file"
506
+ done
507
+
508
+ # BETTER - Direct loop
509
+ find /tmp -type f | while IFS= read -r file; do
510
+ echo "$file"
511
+ done
512
+ ```
513
+
514
+ ### Command Substitution
515
+
516
+ ```bash
517
+ # BAD - Deprecated
518
+ output=`command`
519
+
520
+ # GOOD - Modern syntax
521
+ output=$(command)
522
+
523
+ # Nested - Modern syntax is easier to read
524
+ result=$(echo "The date is $(date)")
525
+ ```
526
+
527
+ ### Test Command
528
+
529
+ ```bash
530
+ # Use [[ ]] instead of [ ]
531
+
532
+ # BAD - [ ] (test)
533
+ if [ $var = "value" ]; then # Fails if var is empty
534
+ echo "Match"
535
+ fi
536
+
537
+ # GOOD - [[ ]]
538
+ if [[ $var = "value" ]]; then
539
+ echo "Match"
540
+ fi
541
+
542
+ # [[ ]] benefits:
543
+ # - No word splitting
544
+ # - Pattern matching with =
545
+ # - Regex matching with =~
546
+ # - && and || operators
547
+
548
+ # Pattern matching
549
+ if [[ $filename = *.txt ]]; then
550
+ echo "Text file"
551
+ fi
552
+
553
+ # Regex
554
+ if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
555
+ echo "Valid email"
556
+ fi
557
+ ```
558
+
559
+ ### Comparison Operators
560
+
561
+ ```bash
562
+ # String comparison
563
+ [[ $str1 = $str2 ]] # Equal
564
+ [[ $str1 != $str2 ]] # Not equal
565
+ [[ -z $str ]] # Empty string
566
+ [[ -n $str ]] # Not empty
567
+
568
+ # Numeric comparison
569
+ [[ $num1 -eq $num2 ]] # Equal
570
+ [[ $num1 -ne $num2 ]] # Not equal
571
+ [[ $num1 -lt $num2 ]] # Less than
572
+ [[ $num1 -le $num2 ]] # Less than or equal
573
+ [[ $num1 -gt $num2 ]] # Greater than
574
+ [[ $num1 -ge $num2 ]] # Greater than or equal
575
+
576
+ # File tests
577
+ [[ -f $file ]] # File exists
578
+ [[ -d $dir ]] # Directory exists
579
+ [[ -e $path ]] # Path exists
580
+ [[ -r $file ]] # Readable
581
+ [[ -w $file ]] # Writable
582
+ [[ -x $file ]] # Executable
583
+ ```
584
+
585
+ ## Testing Shell Scripts
586
+
587
+ ### shellcheck
588
+
589
+ ```bash
590
+ # Install shellcheck
591
+ sudo apt install shellcheck
592
+
593
+ # Check script
594
+ shellcheck myscript.sh
595
+
596
+ # Ignore specific warnings
597
+ # shellcheck disable=SC2086
598
+ echo $var
599
+
600
+ # Multiple warnings
601
+ # shellcheck disable=SC2086,SC2181
602
+ ```
603
+
604
+ ### BATS (Bash Automated Testing System)
605
+
606
+ ```bash
607
+ # Install bats
608
+ git clone https://github.com/bats-core/bats-core.git
609
+ cd bats-core
610
+ sudo ./install.sh /usr/local
611
+ ```
612
+
613
+ **Test File:**
614
+ ```bash
615
+ # test/backup.bats
616
+ #!/usr/bin/env bats
617
+
618
+ # Setup runs before each test
619
+ setup() {
620
+ load 'test_helper/bats-support/load'
621
+ load 'test_helper/bats-assert/load'
622
+
623
+ # Create test directory
624
+ TEST_DIR=$(mktemp -d)
625
+ SOURCE_DIR="$TEST_DIR/source"
626
+ BACKUP_DIR="$TEST_DIR/backup"
627
+
628
+ mkdir -p "$SOURCE_DIR" "$BACKUP_DIR"
629
+ echo "test data" > "$SOURCE_DIR/file1.txt"
630
+ }
631
+
632
+ # Teardown runs after each test
633
+ teardown() {
634
+ rm -rf "$TEST_DIR"
635
+ }
636
+
637
+ @test "backup creates archive" {
638
+ run ./backup.sh --source "$SOURCE_DIR" --dest "$BACKUP_DIR"
639
+
640
+ assert_success
641
+ assert [ -f "$BACKUP_DIR/backup-*.tar.gz" ]
642
+ }
643
+
644
+ @test "backup fails without source" {
645
+ run ./backup.sh --dest "$BACKUP_DIR"
646
+
647
+ assert_failure
648
+ assert_output --partial "Error: --source is required"
649
+ }
650
+
651
+ @test "backup preserves file content" {
652
+ run ./backup.sh --source "$SOURCE_DIR" --dest "$BACKUP_DIR"
653
+
654
+ assert_success
655
+
656
+ # Extract and verify
657
+ cd "$BACKUP_DIR"
658
+ tar -xzf backup-*.tar.gz
659
+ assert [ "$(cat source/file1.txt)" = "test data" ]
660
+ }
661
+ ```
662
+
663
+ **Run Tests:**
664
+ ```bash
665
+ bats test/backup.bats
666
+ ```
667
+
668
+ ## Best Practices
669
+
670
+ ### 1. Script Organization
671
+
672
+ ```bash
673
+ #!/usr/bin/env bash
674
+ #
675
+ # Well-organized script structure
676
+ #
677
+
678
+ set -euo pipefail
679
+
680
+ # Constants first
681
+ readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
682
+ readonly CONFIG_FILE="/etc/myapp/config"
683
+
684
+ # Variables
685
+ DEBUG=false
686
+
687
+ # Functions
688
+ log() { ... }
689
+ validate_input() { ... }
690
+ process_data() { ... }
691
+
692
+ # Main logic
693
+ main() {
694
+ log "INFO" "Starting"
695
+ validate_input "$@"
696
+ process_data
697
+ log "INFO" "Complete"
698
+ }
699
+
700
+ # Run main
701
+ if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
702
+ main "$@"
703
+ fi
704
+ ```
705
+
706
+ ### 2. Documentation
707
+
708
+ ```bash
709
+ #!/usr/bin/env bash
710
+ #
711
+ # Script: deploy.sh
712
+ # Description: Deploy application to production
713
+ # Usage: ./deploy.sh [OPTIONS]
714
+ # Options:
715
+ # -e, --env ENV Environment (staging|production)
716
+ # -v, --version VER Version to deploy
717
+ # -h, --help Show help
718
+ #
719
+ # Examples:
720
+ # ./deploy.sh --env production --version v1.2.3
721
+ # ./deploy.sh -e staging -v latest
722
+ #
723
+ # Author: DevOps Team
724
+ # Date: 2025-01-01
725
+ #
726
+
727
+ # Function documentation
728
+ #
729
+ # backup_database()
730
+ # Creates a database backup before deployment
731
+ #
732
+ # Arguments:
733
+ # $1 - Database name
734
+ # $2 - Backup directory
735
+ #
736
+ # Returns:
737
+ # 0 on success, 1 on failure
738
+ #
739
+ backup_database() {
740
+ local db_name=$1
741
+ local backup_dir=$2
742
+ # ...
743
+ }
744
+ ```
745
+
746
+ ### 3. Error Messages
747
+
748
+ ```bash
749
+ # Good error messages are:
750
+ # - Clear and specific
751
+ # - Include context
752
+ # - Suggest solutions
753
+
754
+ # BAD
755
+ echo "Error" >&2
756
+
757
+ # GOOD
758
+ echo "Error: Failed to connect to database 'production' at localhost:5432" >&2
759
+ echo "Suggestion: Check if PostgreSQL is running and credentials are correct" >&2
760
+ ```
761
+
762
+ ### 4. Debugging
763
+
764
+ ```bash
765
+ # Enable debugging
766
+ bash -x script.sh
767
+
768
+ # Or in script
769
+ set -x # Enable
770
+ set +x # Disable
771
+
772
+ # Conditional debugging
773
+ DEBUG=${DEBUG:-false}
774
+ if [ "$DEBUG" = "true" ]; then
775
+ set -x
776
+ fi
777
+
778
+ # Verbose logging
779
+ VERBOSE=${VERBOSE:-false}
780
+ debug_log() {
781
+ if [ "$VERBOSE" = "true" ]; then
782
+ echo "[DEBUG] $@" >&2
783
+ fi
784
+ }
785
+ ```
786
+
787
+ ## Complete Examples
788
+
789
+ ### System Backup Script
790
+
791
+ ```bash
792
+ #!/usr/bin/env bash
793
+ #
794
+ # backup.sh - Automated system backup
795
+ #
796
+
797
+ set -euo pipefail
798
+
799
+ # Configuration
800
+ readonly BACKUP_DIR="/backup"
801
+ readonly RETENTION_DAYS=7
802
+ readonly LOG_FILE="/var/log/backup.log"
803
+
804
+ # Directories to backup
805
+ readonly BACKUP_SOURCES=(
806
+ "/etc"
807
+ "/var/www"
808
+ "/home"
809
+ )
810
+
811
+ # Logging
812
+ log() {
813
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $@" | tee -a "$LOG_FILE"
814
+ }
815
+
816
+ die() {
817
+ log "ERROR: $@"
818
+ exit 1
819
+ }
820
+
821
+ # Check if running as root
822
+ if [ "$(id -u)" -ne 0 ]; then
823
+ die "This script must be run as root"
824
+ fi
825
+
826
+ # Create backup directory
827
+ mkdir -p "$BACKUP_DIR" || die "Failed to create backup directory"
828
+
829
+ # Backup filename
830
+ BACKUP_FILE="$BACKUP_DIR/backup-$(date +%Y%m%d-%H%M%S).tar.gz"
831
+
832
+ log "Starting backup to $BACKUP_FILE"
833
+
834
+ # Create backup
835
+ if tar -czf "$BACKUP_FILE" "${BACKUP_SOURCES[@]}" 2>&1 | tee -a "$LOG_FILE"; then
836
+ log "Backup created successfully"
837
+ log "Size: $(du -h "$BACKUP_FILE" | cut -f1)"
838
+ else
839
+ die "Backup failed"
840
+ fi
841
+
842
+ # Remove old backups
843
+ log "Removing backups older than $RETENTION_DAYS days"
844
+ find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete
845
+
846
+ log "Backup completed successfully"
847
+ ```
848
+
849
+ ### Service Health Check
850
+
851
+ ```bash
852
+ #!/usr/bin/env bash
853
+ #
854
+ # health-check.sh - Check service health
855
+ #
856
+
857
+ set -euo pipefail
858
+
859
+ # Configuration
860
+ readonly SERVICE_NAME="myapp"
861
+ readonly HEALTH_URL="http://localhost:8080/health"
862
+ readonly MAX_RETRIES=3
863
+ readonly RETRY_DELAY=5
864
+
865
+ check_service() {
866
+ if systemctl is-active --quiet "$SERVICE_NAME"; then
867
+ echo "✓ Service $SERVICE_NAME is running"
868
+ return 0
869
+ else
870
+ echo "✗ Service $SERVICE_NAME is not running"
871
+ return 1
872
+ fi
873
+ }
874
+
875
+ check_http() {
876
+ local url=$1
877
+ local retries=0
878
+
879
+ while [ $retries -lt $MAX_RETRIES ]; do
880
+ if curl -sf "$url" > /dev/null 2>&1; then
881
+ echo "✓ HTTP endpoint $url is healthy"
882
+ return 0
883
+ fi
884
+
885
+ retries=$((retries + 1))
886
+ if [ $retries -lt $MAX_RETRIES ]; then
887
+ echo "Retry $retries/$MAX_RETRIES after $RETRY_DELAY seconds..."
888
+ sleep $RETRY_DELAY
889
+ fi
890
+ done
891
+
892
+ echo "✗ HTTP endpoint $url is unhealthy"
893
+ return 1
894
+ }
895
+
896
+ # Main checks
897
+ echo "Checking service health..."
898
+ check_service
899
+ check_http "$HEALTH_URL"
900
+
901
+ if [ $? -eq 0 ]; then
902
+ echo "All health checks passed"
903
+ exit 0
904
+ else
905
+ echo "Health checks failed"
906
+ exit 1
907
+ fi
908
+ ```
909
+
910
+ ---
911
+
912
+ **Related Topics:**
913
+ - See [automation-patterns.md](automation-patterns.md) for cron and systemd timers
914
+ - See [troubleshooting-guide.md](troubleshooting-guide.md) for debugging scripts
915
+ - See [linux-administration.md](linux-administration.md) for system management