blockmine 1.21.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.
- package/.claude/agents/README.md +469 -0
- package/.claude/agents/auth-route-debugger.md +118 -0
- package/.claude/agents/auth-route-tester.md +93 -0
- package/.claude/agents/auto-error-resolver.md +97 -0
- package/.claude/agents/build-optimizer.md +236 -0
- package/.claude/agents/code-architecture-reviewer.md +83 -0
- package/.claude/agents/code-refactor-master.md +94 -0
- package/.claude/agents/cost-optimizer.md +134 -0
- package/.claude/agents/deployment-orchestrator.md +113 -0
- package/.claude/agents/documentation-architect.md +82 -0
- package/.claude/agents/frontend-error-fixer.md +77 -0
- package/.claude/agents/iac-code-generator.md +71 -0
- package/.claude/agents/incident-responder.md +346 -0
- package/.claude/agents/infrastructure-architect.md +31 -0
- package/.claude/agents/kubernetes-specialist.md +56 -0
- package/.claude/agents/migration-planner.md +181 -0
- package/.claude/agents/network-architect.md +196 -0
- package/.claude/agents/plan-reviewer.md +52 -0
- package/.claude/agents/refactor-planner.md +63 -0
- package/.claude/agents/security-scanner.md +102 -0
- package/.claude/agents/web-research-specialist.md +78 -0
- package/.claude/commands/cost-analysis.md +315 -0
- package/.claude/commands/dev-docs-update.md +55 -0
- package/.claude/commands/dev-docs.md +51 -0
- package/.claude/commands/incident-debug.md +247 -0
- package/.claude/commands/infra-plan.md +81 -0
- package/.claude/commands/migration-plan.md +478 -0
- package/.claude/commands/route-research-for-testing.md +37 -0
- package/.claude/commands/security-review.md +66 -0
- package/.claude/hooks/CONFIG.md +448 -0
- package/.claude/hooks/README.md +163 -0
- package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
- package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
- package/.claude/hooks/add-skill-activation-banners.ts +132 -0
- package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
- package/.claude/hooks/error-handling-reminder.sh +12 -0
- package/.claude/hooks/error-handling-reminder.ts +222 -0
- package/.claude/hooks/k8s-manifest-validator.sh +56 -0
- package/.claude/hooks/package-lock.json +556 -0
- package/.claude/hooks/package.json +16 -0
- package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
- package/.claude/hooks/post-tool-use-tracker.sh +183 -0
- package/.claude/hooks/security-policy-check.sh +247 -0
- package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
- package/.claude/hooks/skill-activation-prompt.sh +10 -0
- package/.claude/hooks/skill-activation-prompt.ts +141 -0
- package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
- package/.claude/hooks/terraform-validator.sh +53 -0
- package/.claude/hooks/test-input.json +7 -0
- package/.claude/hooks/test-skill-activation.ts +427 -0
- package/.claude/hooks/trigger-build-resolver.sh +79 -0
- package/.claude/hooks/tsc-check.sh +173 -0
- package/.claude/hooks/tsconfig.json +19 -0
- package/.claude/settings.json +55 -0
- package/.claude/settings.local.json +27 -14
- package/.claude/skills/README.md +507 -0
- package/.claude/skills/api-engineering/SKILL.md +63 -0
- package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
- package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
- package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
- package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
- package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
- package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
- package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
- package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
- package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
- package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
- package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
- package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
- package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
- package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
- package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
- package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
- package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
- package/.claude/skills/build-engineering/SKILL.md +431 -0
- package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
- package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
- package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
- package/.claude/skills/build-engineering/resources/build-security.md +95 -0
- package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
- package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
- package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
- package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
- package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
- package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
- package/.claude/skills/cloud-engineering/SKILL.md +675 -0
- package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
- package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
- package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
- package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
- package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
- package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
- package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
- package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
- package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
- package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
- package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
- package/.claude/skills/cybersecurity/SKILL.md +409 -0
- package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
- package/.claude/skills/database-engineering/SKILL.md +61 -0
- package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
- package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
- package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
- package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
- package/.claude/skills/devsecops/SKILL.md +374 -0
- package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
- package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
- package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
- package/.claude/skills/devsecops/resources/container-security.md +915 -0
- package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
- package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
- package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
- package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
- package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
- package/.claude/skills/devsecops/resources/security-testing.md +203 -0
- package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
- package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
- package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
- package/.claude/skills/documentation-as-code/SKILL.md +323 -0
- package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
- package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
- package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
- package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
- package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
- package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
- package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
- package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
- package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
- package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
- package/.claude/skills/engineering-management/SKILL.md +356 -0
- package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
- package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
- package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
- package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
- package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
- package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
- package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
- package/.claude/skills/error-tracking/SKILL.md +379 -0
- package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
- package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
- package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
- package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
- package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
- package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
- package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
- package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
- package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
- package/.claude/skills/general-it-engineering/SKILL.md +393 -0
- package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
- package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
- package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
- package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
- package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
- package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
- package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
- package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
- package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
- package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
- package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
- package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
- package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
- package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
- package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
- package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
- package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
- package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
- package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
- package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
- package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
- package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
- package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
- package/.claude/skills/network-engineering/SKILL.md +385 -0
- package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
- package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
- package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
- package/.claude/skills/network-engineering/resources/network-security.md +921 -0
- package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
- package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
- package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
- package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
- package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
- package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
- package/.claude/skills/observability-engineering/SKILL.md +101 -0
- package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
- package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
- package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
- package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
- package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
- package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
- package/.claude/skills/platform-engineering/SKILL.md +555 -0
- package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
- package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
- package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
- package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
- package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
- package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
- package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
- package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
- package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
- package/.claude/skills/release-engineering/SKILL.md +393 -0
- package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
- package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
- package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
- package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
- package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
- package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
- package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
- package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
- package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
- package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
- package/.claude/skills/route-tester/SKILL.md +392 -0
- package/.claude/skills/skill-developer/ADVANCED.md +197 -0
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
- package/.claude/skills/skill-developer/SKILL.md +430 -0
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
- package/.claude/skills/skill-rules.json +2940 -0
- package/.claude/skills/sre/SKILL.md +464 -0
- package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
- package/.claude/skills/sre/resources/capacity-planning.md +226 -0
- package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
- package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
- package/.claude/skills/sre/resources/incident-management.md +436 -0
- package/.claude/skills/sre/resources/observability-stack.md +240 -0
- package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
- package/.claude/skills/sre/resources/performance-optimization.md +108 -0
- package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
- package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
- package/.claude/skills/sre/resources/toil-reduction.md +145 -0
- package/.claude/skills/systems-engineering/SKILL.md +648 -0
- package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
- package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
- package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
- package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
- package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
- package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
- package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
- package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
- package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
- package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
- package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
- package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
- package/.claude/skills/technical-leadership/SKILL.md +728 -0
- package/CHANGELOG.md +90 -54
- package/README.md +94 -0
- package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
- package/backend/jest.config.js +59 -0
- package/backend/package-lock.json +6129 -0
- package/backend/package.json +16 -4
- package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
- package/backend/prisma/schema.prisma +33 -0
- package/backend/src/__tests__/core/DependencyService.test.js +336 -0
- package/backend/src/__tests__/core/UserService.test.js +875 -0
- package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
- package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
- package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
- package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
- package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
- package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
- package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
- package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
- package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
- package/backend/src/__tests__/secretsFilter.test.js +425 -0
- package/backend/src/__tests__/services/BotLifecycleService.test.js +411 -0
- package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
- package/backend/src/__tests__/services/CacheManager.test.js +125 -0
- package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
- package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
- package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
- package/backend/src/__tests__/setup.js +25 -0
- package/backend/src/api/routes/apiKeys.js +181 -0
- package/backend/src/api/routes/bots.js +49 -7
- package/backend/src/api/routes/plugins.js +2 -1
- package/backend/src/api/routes/system.js +174 -0
- package/backend/src/container.js +82 -0
- package/backend/src/core/BotManager.js +142 -871
- package/backend/src/core/BotManager.old.js +1093 -0
- package/backend/src/core/BotProcess.js +1092 -858
- package/backend/src/core/EventGraphManager.js +280 -198
- package/backend/src/core/GraphExecutionEngine.js +321 -325
- package/backend/src/core/MessageQueue.js +27 -6
- package/backend/src/core/NodeRegistry.js +37 -1134
- package/backend/src/core/PluginManager.js +62 -12
- package/backend/src/core/PrismaService.js +32 -0
- package/backend/src/core/UserService.js +3 -3
- package/backend/src/core/__tests__/PrismaService.test.js +24 -0
- package/backend/src/core/commands/README.md +305 -0
- package/backend/src/core/commands/dev.js +13 -7
- package/backend/src/core/commands/ping.js +10 -4
- package/backend/src/core/commands/whois.js +63 -0
- package/backend/src/core/config/validation.js +27 -0
- package/backend/src/core/constants/graphTypes.js +21 -0
- package/backend/src/core/node-registries/actions.js +132 -0
- package/backend/src/core/node-registries/arrays.js +137 -0
- package/backend/src/core/node-registries/bot.js +23 -0
- package/backend/src/core/node-registries/data.js +290 -0
- package/backend/src/core/node-registries/debug.js +26 -0
- package/backend/src/core/node-registries/events.js +187 -0
- package/backend/src/core/node-registries/flow.js +139 -0
- package/backend/src/core/node-registries/logic.js +45 -0
- package/backend/src/core/node-registries/math.js +42 -0
- package/backend/src/core/node-registries/objects.js +98 -0
- package/backend/src/core/node-registries/strings.js +153 -0
- package/backend/src/core/node-registries/time.js +113 -0
- package/backend/src/core/node-registries/users.js +79 -0
- package/backend/src/core/nodes/{action_bot_look_at.js → actions/bot_look_at.js} +36 -36
- package/backend/src/core/nodes/{action_bot_set_variable.js → actions/bot_set_variable.js} +32 -32
- package/backend/src/core/nodes/{action_send_log.js → actions/send_log.js} +28 -23
- package/backend/src/core/nodes/{action_send_message.js → actions/send_message.js} +32 -32
- package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
- package/backend/src/core/nodes/arrays/get_next.js +35 -0
- package/backend/src/core/nodes/{data_cast.js → data/cast.js} +8 -0
- package/backend/src/core/nodes/data/datetime_literal.js +27 -0
- package/backend/src/core/nodes/data/entity_info.js +69 -0
- package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
- package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
- package/backend/src/core/nodes/{data_get_user_field.js → data/get_user_field.js} +1 -1
- package/backend/src/core/nodes/data/type_check.js +53 -0
- package/backend/src/core/nodes/{debug_log.js → debug/log.js} +16 -16
- package/backend/src/core/nodes/{flow_branch.js → flow/branch.js} +15 -15
- package/backend/src/core/nodes/{flow_break.js → flow/break.js} +14 -14
- package/backend/src/core/nodes/flow/delay.js +43 -0
- package/backend/src/core/nodes/{flow_for_each.js → flow/for_each.js} +39 -39
- package/backend/src/core/nodes/{flow_sequence.js → flow/sequence.js} +16 -16
- package/backend/src/core/nodes/{flow_switch.js → flow/switch.js} +47 -47
- package/backend/src/core/nodes/{flow_while.js → flow/while.js} +1 -1
- package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
- package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
- package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
- package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
- package/backend/src/core/nodes/time/add.js +33 -0
- package/backend/src/core/nodes/time/compare.js +35 -0
- package/backend/src/core/nodes/time/diff.js +29 -0
- package/backend/src/core/nodes/time/format.js +32 -0
- package/backend/src/core/nodes/time/now.js +18 -0
- package/backend/src/core/nodes/{user_check_blacklist.js → users/check_blacklist.js} +37 -37
- package/backend/src/core/nodes/{user_get_groups.js → users/get_groups.js} +36 -36
- package/backend/src/core/nodes/{user_get_permissions.js → users/get_permissions.js} +36 -36
- package/backend/src/core/nodes/{user_set_blacklist.js → users/set_blacklist.js} +37 -37
- package/backend/src/core/services/BotLifecycleService.js +596 -0
- package/backend/src/core/services/BotProcessManager.js +163 -0
- package/backend/src/core/services/CacheManager.js +111 -0
- package/backend/src/core/services/CommandExecutionService.js +351 -0
- package/backend/src/core/services/ResourceMonitorService.js +90 -0
- package/backend/src/core/services/TelemetryService.js +124 -0
- package/backend/src/core/services/ValidationService.js +132 -0
- package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
- package/backend/src/core/services.js +20 -5
- package/backend/src/core/system/CommandContext.js +84 -0
- package/backend/src/core/system/Transport.js +78 -0
- package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
- package/backend/src/core/utils/jsonParser.js +18 -0
- package/backend/src/core/utils/secretsFilter.js +262 -0
- package/backend/src/core/utils/variableParser.js +89 -0
- package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
- package/backend/src/core/validation/nodeSchemas.js +112 -0
- package/backend/src/lib/prisma.js +2 -4
- package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
- package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
- package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
- package/backend/src/real-time/botApi/handlers/index.js +43 -0
- package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
- package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
- package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
- package/backend/src/real-time/botApi/index.js +40 -0
- package/backend/src/real-time/botApi/middleware.js +79 -0
- package/backend/src/real-time/botApi/utils.js +54 -0
- package/backend/src/real-time/socketHandler.js +6 -2
- package/backend/src/repositories/BaseRepository.js +43 -0
- package/backend/src/repositories/BotRepository.js +42 -0
- package/backend/src/repositories/CommandRepository.js +53 -0
- package/backend/src/repositories/EventGraphRepository.js +40 -0
- package/backend/src/repositories/GroupRepository.js +69 -0
- package/backend/src/repositories/PermissionRepository.js +48 -0
- package/backend/src/repositories/PluginRepository.js +42 -0
- package/backend/src/repositories/ServerRepository.js +27 -0
- package/backend/src/repositories/UserRepository.js +48 -0
- package/backend/src/server.js +3 -0
- package/backend/src/test-refactor.js +85 -0
- package/frontend/dist/assets/index-CfTo92bP.css +1 -0
- package/frontend/dist/assets/index-CiFD5X9Z.js +8344 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +0 -5
- package/package.json +2 -1
- package/frontend/dist/assets/index-B9GedHEa.js +0 -8352
- package/frontend/dist/assets/index-zLiy9MDx.css +0 -1
- package/nul +0 -0
- /package/backend/src/core/nodes/{action_http_request.js → actions/http_request.js} +0 -0
- /package/backend/src/core/nodes/{array_add_element.js → arrays/add_element.js} +0 -0
- /package/backend/src/core/nodes/{array_contains.js → arrays/contains.js} +0 -0
- /package/backend/src/core/nodes/{array_find_index.js → arrays/find_index.js} +0 -0
- /package/backend/src/core/nodes/{array_get_by_index.js → arrays/get_by_index.js} +0 -0
- /package/backend/src/core/nodes/{array_get_random_element.js → arrays/get_random_element.js} +0 -0
- /package/backend/src/core/nodes/{array_remove_by_index.js → arrays/remove_by_index.js} +0 -0
- /package/backend/src/core/nodes/{bot_get_position.js → bot/get_position.js} +0 -0
- /package/backend/src/core/nodes/{data_array_literal.js → data/array_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_boolean_literal.js → data/boolean_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_get_argument.js → data/get_argument.js} +0 -0
- /package/backend/src/core/nodes/{data_get_bot_look.js → data/get_bot_look.js} +0 -0
- /package/backend/src/core/nodes/{data_get_entity_field.js → data/get_entity_field.js} +0 -0
- /package/backend/src/core/nodes/{data_get_server_players.js → data/get_server_players.js} +0 -0
- /package/backend/src/core/nodes/{data_get_variable.js → data/get_variable.js} +0 -0
- /package/backend/src/core/nodes/{data_length.js → data/length.js} +0 -0
- /package/backend/src/core/nodes/{data_make_object.js → data/make_object.js} +0 -0
- /package/backend/src/core/nodes/{data_number_literal.js → data/number_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_string_literal.js → data/string_literal.js} +0 -0
- /package/backend/src/core/nodes/{logic_compare.js → logic/compare.js} +0 -0
- /package/backend/src/core/nodes/{logic_operation.js → logic/operation.js} +0 -0
- /package/backend/src/core/nodes/{math_operation.js → math/operation.js} +0 -0
- /package/backend/src/core/nodes/{math_random_number.js → math/random_number.js} +0 -0
- /package/backend/src/core/nodes/{object_create.js → objects/create.js} +0 -0
- /package/backend/src/core/nodes/{object_delete.js → objects/delete.js} +0 -0
- /package/backend/src/core/nodes/{object_get.js → objects/get.js} +0 -0
- /package/backend/src/core/nodes/{object_has_key.js → objects/has_key.js} +0 -0
- /package/backend/src/core/nodes/{object_set.js → objects/set.js} +0 -0
- /package/backend/src/core/nodes/{string_concat.js → strings/concat.js} +0 -0
- /package/backend/src/core/nodes/{string_contains.js → strings/contains.js} +0 -0
- /package/backend/src/core/nodes/{string_ends_with.js → strings/ends_with.js} +0 -0
- /package/backend/src/core/nodes/{string_equals.js → strings/equals.js} +0 -0
- /package/backend/src/core/nodes/{string_length.js → strings/length.js} +0 -0
- /package/backend/src/core/nodes/{string_matches.js → strings/matches.js} +0 -0
- /package/backend/src/core/nodes/{string_split.js → strings/split.js} +0 -0
- /package/backend/src/core/nodes/{string_starts_with.js → strings/starts_with.js} +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# API Versioning
|
|
2
|
+
|
|
3
|
+
Guide to API versioning strategies and best practices.
|
|
4
|
+
|
|
5
|
+
## Versioning Strategies
|
|
6
|
+
|
|
7
|
+
### URI Versioning
|
|
8
|
+
```
|
|
9
|
+
GET /v1/users/123
|
|
10
|
+
GET /v2/users/123
|
|
11
|
+
|
|
12
|
+
Pros: Simple, clear
|
|
13
|
+
Cons: Pollutes URI space
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Header Versioning
|
|
17
|
+
```
|
|
18
|
+
GET /users/123
|
|
19
|
+
Accept: application/vnd.myapi.v1+json
|
|
20
|
+
|
|
21
|
+
Pros: Clean URIs
|
|
22
|
+
Cons: Less visible, harder to test
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Query Parameter
|
|
26
|
+
```
|
|
27
|
+
GET /users/123?version=1
|
|
28
|
+
GET /users/123?version=2
|
|
29
|
+
|
|
30
|
+
Pros: Simple
|
|
31
|
+
Cons: Easy to forget, not RESTful
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Semantic Versioning
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
MAJOR.MINOR.PATCH
|
|
38
|
+
|
|
39
|
+
v1.0.0 → v1.1.0: New feature (backward-compatible)
|
|
40
|
+
v1.1.0 → v2.0.0: Breaking change
|
|
41
|
+
v2.0.0 → v2.0.1: Bug fix
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Breaking vs Non-Breaking Changes
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Breaking Changes (require new version):
|
|
48
|
+
- Removing endpoint
|
|
49
|
+
- Removing field
|
|
50
|
+
- Changing field type
|
|
51
|
+
- Changing response structure
|
|
52
|
+
- Renaming field
|
|
53
|
+
|
|
54
|
+
Non-Breaking (can be same version):
|
|
55
|
+
- Adding new endpoint
|
|
56
|
+
- Adding new optional field
|
|
57
|
+
- Adding new query parameter
|
|
58
|
+
- Deprecating (but not removing) field
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Deprecation Strategy
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// Mark deprecated fields
|
|
65
|
+
type User {
|
|
66
|
+
id: ID!
|
|
67
|
+
fullName: String!
|
|
68
|
+
name: String! @deprecated(reason: "Use fullName instead")
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Add deprecation headers
|
|
72
|
+
res.setHeader('Deprecation', 'Sun, 01 Jan 2025 00:00:00 GMT');
|
|
73
|
+
res.setHeader('Link', '</v2/users>; rel="successor-version"');
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Best Practices
|
|
77
|
+
|
|
78
|
+
✅ Version from day one (v1)
|
|
79
|
+
✅ Support 2-3 versions simultaneously
|
|
80
|
+
✅ Give 6-12 months deprecation notice
|
|
81
|
+
✅ Document breaking changes clearly
|
|
82
|
+
✅ Use semantic versioning
|
|
83
|
+
✅ Provide migration guides
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
**Related Resources:**
|
|
88
|
+
- rest-api-design.md - API design principles
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# GraphQL Patterns
|
|
2
|
+
|
|
3
|
+
Guide to GraphQL schema design, resolvers, and common patterns.
|
|
4
|
+
|
|
5
|
+
## Schema Design
|
|
6
|
+
|
|
7
|
+
```graphql
|
|
8
|
+
type User {
|
|
9
|
+
id: ID!
|
|
10
|
+
email: String!
|
|
11
|
+
name: String!
|
|
12
|
+
posts: [Post!]!
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type Post {
|
|
16
|
+
id: ID!
|
|
17
|
+
title: String!
|
|
18
|
+
content: String!
|
|
19
|
+
author: User!
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type Query {
|
|
23
|
+
user(id: ID!): User
|
|
24
|
+
users(limit: Int, offset: Int): [User!]!
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type Mutation {
|
|
28
|
+
createUser(email: String!, name: String!): User!
|
|
29
|
+
updateUser(id: ID!, name: String): User!
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Resolvers
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const resolvers = {
|
|
37
|
+
Query: {
|
|
38
|
+
user: async (parent, { id }, context) => {
|
|
39
|
+
return await context.prisma.user.findUnique({ where: { id } });
|
|
40
|
+
},
|
|
41
|
+
users: async (parent, { limit, offset }, context) => {
|
|
42
|
+
return await context.prisma.user.findMany({
|
|
43
|
+
take: limit,
|
|
44
|
+
skip: offset,
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
Mutation: {
|
|
50
|
+
createUser: async (parent, { email, name }, context) => {
|
|
51
|
+
return await context.prisma.user.create({
|
|
52
|
+
data: { email, name },
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
User: {
|
|
58
|
+
posts: async (parent, args, context) => {
|
|
59
|
+
return await context.prisma.post.findMany({
|
|
60
|
+
where: { authorId: parent.id },
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## N+1 Problem & DataLoader
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// ❌ N+1 Problem
|
|
71
|
+
// Fetching 100 users causes 100 additional queries for posts
|
|
72
|
+
const users = await prisma.user.findMany(); // 1 query
|
|
73
|
+
for (const user of users) {
|
|
74
|
+
const posts = await prisma.post.findMany({ where: { authorId: user.id } }); // N queries
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ✅ Solution: DataLoader
|
|
78
|
+
import DataLoader from 'dataloader';
|
|
79
|
+
|
|
80
|
+
const postLoader = new DataLoader(async (userIds) => {
|
|
81
|
+
const posts = await prisma.post.findMany({
|
|
82
|
+
where: { authorId: { in: userIds } },
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Group posts by user ID
|
|
86
|
+
const postsByUser = {};
|
|
87
|
+
posts.forEach(post => {
|
|
88
|
+
if (!postsByUser[post.authorId]) postsByUser[post.authorId] = [];
|
|
89
|
+
postsByUser[post.authorId].push(post);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return userIds.map(id => postsByUser[id] || []);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// In resolver
|
|
96
|
+
User: {
|
|
97
|
+
posts: (parent, args, context) => {
|
|
98
|
+
return context.postLoader.load(parent.id); // Batched!
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
**Related Resources:**
|
|
106
|
+
- rest-api-design.md - REST comparison
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Rate Limiting
|
|
2
|
+
|
|
3
|
+
Guide to implementing rate limiting and throttling for APIs.
|
|
4
|
+
|
|
5
|
+
## Algorithms
|
|
6
|
+
|
|
7
|
+
### Token Bucket
|
|
8
|
+
```typescript
|
|
9
|
+
class TokenBucket {
|
|
10
|
+
constructor(
|
|
11
|
+
private capacity: number, // Max tokens
|
|
12
|
+
private refillRate: number // Tokens per second
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
async consume(tokens: number = 1): Promise<boolean> {
|
|
16
|
+
const key = `rate-limit:${userId}`;
|
|
17
|
+
const current = await redis.get(key) || this.capacity;
|
|
18
|
+
|
|
19
|
+
if (current >= tokens) {
|
|
20
|
+
await redis.decrby(key, tokens);
|
|
21
|
+
return true; // Allowed
|
|
22
|
+
}
|
|
23
|
+
return false; // Rate limited
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Usage: 100 requests per minute
|
|
28
|
+
const limiter = new TokenBucket(100, 100/60);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Sliding Window
|
|
32
|
+
```typescript
|
|
33
|
+
async function checkRateLimit(userId: string, limit: number, windowMs: number) {
|
|
34
|
+
const key = `rate-limit:${userId}`;
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
const windowStart = now - windowMs;
|
|
37
|
+
|
|
38
|
+
// Remove old entries
|
|
39
|
+
await redis.zremrangebyscore(key, 0, windowStart);
|
|
40
|
+
|
|
41
|
+
// Count requests in window
|
|
42
|
+
const count = await redis.zcard(key);
|
|
43
|
+
|
|
44
|
+
if (count < limit) {
|
|
45
|
+
await redis.zadd(key, now, `${now}-${Math.random()}`);
|
|
46
|
+
await redis.expire(key, Math.ceil(windowMs / 1000));
|
|
47
|
+
return true; // Allowed
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return false; // Rate limited
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Usage: 1000 requests per hour
|
|
54
|
+
await checkRateLimit(userId, 1000, 3600000);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Express Middleware
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import rateLimit from 'express-rate-limit';
|
|
61
|
+
import RedisStore from 'rate-limit-redis';
|
|
62
|
+
import Redis from 'ioredis';
|
|
63
|
+
|
|
64
|
+
const redis = new Redis(process.env.REDIS_URL);
|
|
65
|
+
|
|
66
|
+
const limiter = rateLimit({
|
|
67
|
+
store: new RedisStore({ client: redis }),
|
|
68
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
69
|
+
max: 100, // 100 requests per window
|
|
70
|
+
message: 'Too many requests, please try again later',
|
|
71
|
+
standardHeaders: true,
|
|
72
|
+
legacyHeaders: false,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
app.use('/api/', limiter);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Response Headers
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
X-RateLimit-Limit: 100
|
|
82
|
+
X-RateLimit-Remaining: 85
|
|
83
|
+
X-RateLimit-Reset: 1642348800
|
|
84
|
+
|
|
85
|
+
HTTP 429 Too Many Requests
|
|
86
|
+
Retry-After: 60
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Per-User vs Per-IP
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Per-user (authenticated)
|
|
93
|
+
const userLimiter = rateLimit({
|
|
94
|
+
keyGenerator: (req) => req.user?.id || req.ip,
|
|
95
|
+
max: 1000, // Higher limit for authenticated users
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Per-IP (unauthenticated)
|
|
99
|
+
const ipLimiter = rateLimit({
|
|
100
|
+
keyGenerator: (req) => req.ip,
|
|
101
|
+
max: 100, // Lower limit for anonymous users
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Best Practices
|
|
106
|
+
|
|
107
|
+
✅ Use distributed rate limiting (Redis)
|
|
108
|
+
✅ Return clear error messages
|
|
109
|
+
✅ Include rate limit headers
|
|
110
|
+
✅ Different limits for authenticated vs anonymous
|
|
111
|
+
✅ Higher limits for premium users
|
|
112
|
+
✅ Monitor rate limit hits
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
**Related Resources:**
|
|
117
|
+
- rest-api-design.md - API design
|
|
118
|
+
- api-versioning.md - API versions
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# REST API Design
|
|
2
|
+
|
|
3
|
+
Guide to designing RESTful APIs following best practices.
|
|
4
|
+
|
|
5
|
+
## RESTful Principles
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Resources (nouns, not verbs):
|
|
9
|
+
✅ GET /users/123
|
|
10
|
+
✅ POST /orders
|
|
11
|
+
❌ GET /getUser/123
|
|
12
|
+
❌ POST /createOrder
|
|
13
|
+
|
|
14
|
+
HTTP Methods:
|
|
15
|
+
GET - Retrieve resource
|
|
16
|
+
POST - Create resource
|
|
17
|
+
PUT - Update entire resource
|
|
18
|
+
PATCH - Partial update
|
|
19
|
+
DELETE - Remove resource
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Resource Modeling
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Collection: /users
|
|
26
|
+
Resource: /users/123
|
|
27
|
+
Sub-resource: /users/123/orders
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## HTTP Status Codes
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
200 OK - Successful GET, PUT, PATCH
|
|
34
|
+
201 Created - Successful POST
|
|
35
|
+
204 No Content - Successful DELETE
|
|
36
|
+
400 Bad Request - Invalid input
|
|
37
|
+
401 Unauthorized - Missing/invalid auth
|
|
38
|
+
403 Forbidden - Authenticated but not authorized
|
|
39
|
+
404 Not Found - Resource doesn't exist
|
|
40
|
+
409 Conflict - Resource conflict (e.g., duplicate email)
|
|
41
|
+
422 Unprocessable Entity - Validation errors
|
|
42
|
+
429 Too Many Requests - Rate limit exceeded
|
|
43
|
+
500 Internal Server Error - Server error
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Request/Response Examples
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// POST /users (Create)
|
|
50
|
+
Request:
|
|
51
|
+
{
|
|
52
|
+
"email": "user@example.com",
|
|
53
|
+
"name": "John Doe"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
Response (201 Created):
|
|
57
|
+
{
|
|
58
|
+
"id": "usr_123",
|
|
59
|
+
"email": "user@example.com",
|
|
60
|
+
"name": "John Doe",
|
|
61
|
+
"created_at": "2024-01-15T10:30:00Z"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// GET /users?page=1&limit=20 (List with pagination)
|
|
65
|
+
Response (200 OK):
|
|
66
|
+
{
|
|
67
|
+
"data": [...],
|
|
68
|
+
"pagination": {
|
|
69
|
+
"page": 1,
|
|
70
|
+
"limit": 20,
|
|
71
|
+
"total": 150,
|
|
72
|
+
"pages": 8
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// PATCH /users/123 (Partial update)
|
|
77
|
+
Request:
|
|
78
|
+
{
|
|
79
|
+
"name": "Jane Doe"
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
Response (200 OK):
|
|
83
|
+
{
|
|
84
|
+
"id": "usr_123",
|
|
85
|
+
"email": "user@example.com",
|
|
86
|
+
"name": "Jane Doe",
|
|
87
|
+
"updated_at": "2024-01-15T11:00:00Z"
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Best Practices
|
|
92
|
+
|
|
93
|
+
✅ Use nouns for resources
|
|
94
|
+
✅ Plural resource names (/users, not /user)
|
|
95
|
+
✅ Use proper HTTP methods
|
|
96
|
+
✅ Return appropriate status codes
|
|
97
|
+
✅ Implement pagination
|
|
98
|
+
✅ Use filtering (?status=active)
|
|
99
|
+
✅ Consistent error format
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
**Related Resources:**
|
|
104
|
+
- api-versioning.md - API versioning
|
|
105
|
+
- rate-limiting.md - Rate limiting
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: backend-dev-guidelines
|
|
3
|
+
description: Comprehensive backend development guide for Node.js/Express/TypeScript microservices. Use when creating routes, controllers, services, repositories, middleware, or working with Express APIs, Prisma database access, Sentry error tracking, Zod validation, unifiedConfig, dependency injection, or async patterns. Covers layered architecture (routes → controllers → services → repositories), BaseController pattern, error handling, performance monitoring, testing strategies, and migration from legacy patterns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
7
|
+
🎯 SKILL ACTIVATED: backend-dev-guidelines
|
|
8
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
9
|
+
|
|
10
|
+
# Backend Development Guidelines
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Establish consistency and best practices across backend microservices (blog-api, auth-service, notifications-service) using modern Node.js/Express/TypeScript patterns.
|
|
15
|
+
|
|
16
|
+
## When to Use This Skill
|
|
17
|
+
|
|
18
|
+
Automatically activates when working on:
|
|
19
|
+
- Creating or modifying routes, endpoints, APIs
|
|
20
|
+
- Building controllers, services, repositories
|
|
21
|
+
- Implementing middleware (auth, validation, error handling)
|
|
22
|
+
- Database operations with Prisma
|
|
23
|
+
- Error tracking with Sentry
|
|
24
|
+
- Input validation with Zod
|
|
25
|
+
- Configuration management
|
|
26
|
+
- Backend testing and refactoring
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Quick Start
|
|
31
|
+
|
|
32
|
+
### New Backend Feature Checklist
|
|
33
|
+
|
|
34
|
+
- [ ] **Route**: Clean definition, delegate to controller
|
|
35
|
+
- [ ] **Controller**: Extend BaseController
|
|
36
|
+
- [ ] **Service**: Business logic with DI
|
|
37
|
+
- [ ] **Repository**: Database access (if complex)
|
|
38
|
+
- [ ] **Validation**: Zod schema
|
|
39
|
+
- [ ] **Sentry**: Error tracking
|
|
40
|
+
- [ ] **Tests**: Unit + integration tests
|
|
41
|
+
- [ ] **Config**: Use unifiedConfig
|
|
42
|
+
|
|
43
|
+
### New Microservice Checklist
|
|
44
|
+
|
|
45
|
+
- [ ] Directory structure (see [architecture-overview.md](architecture-overview.md))
|
|
46
|
+
- [ ] instrument.ts for Sentry
|
|
47
|
+
- [ ] unifiedConfig setup
|
|
48
|
+
- [ ] BaseController class
|
|
49
|
+
- [ ] Middleware stack
|
|
50
|
+
- [ ] Error boundary
|
|
51
|
+
- [ ] Testing framework
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Architecture Overview
|
|
56
|
+
|
|
57
|
+
### Layered Architecture
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
HTTP Request
|
|
61
|
+
↓
|
|
62
|
+
Routes (routing only)
|
|
63
|
+
↓
|
|
64
|
+
Controllers (request handling)
|
|
65
|
+
↓
|
|
66
|
+
Services (business logic)
|
|
67
|
+
↓
|
|
68
|
+
Repositories (data access)
|
|
69
|
+
↓
|
|
70
|
+
Database (Prisma)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Key Principle:** Each layer has ONE responsibility.
|
|
74
|
+
|
|
75
|
+
See [architecture-overview.md](architecture-overview.md) for complete details.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Directory Structure
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
service/src/
|
|
83
|
+
├── config/ # UnifiedConfig
|
|
84
|
+
├── controllers/ # Request handlers
|
|
85
|
+
├── services/ # Business logic
|
|
86
|
+
├── repositories/ # Data access
|
|
87
|
+
├── routes/ # Route definitions
|
|
88
|
+
├── middleware/ # Express middleware
|
|
89
|
+
├── types/ # TypeScript types
|
|
90
|
+
├── validators/ # Zod schemas
|
|
91
|
+
├── utils/ # Utilities
|
|
92
|
+
├── tests/ # Tests
|
|
93
|
+
├── instrument.ts # Sentry (FIRST IMPORT)
|
|
94
|
+
├── app.ts # Express setup
|
|
95
|
+
└── server.ts # HTTP server
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Naming Conventions:**
|
|
99
|
+
- Controllers: `PascalCase` - `UserController.ts`
|
|
100
|
+
- Services: `camelCase` - `userService.ts`
|
|
101
|
+
- Routes: `camelCase + Routes` - `userRoutes.ts`
|
|
102
|
+
- Repositories: `PascalCase + Repository` - `UserRepository.ts`
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Core Principles (7 Key Rules)
|
|
107
|
+
|
|
108
|
+
### 1. Routes Only Route, Controllers Control
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// ❌ NEVER: Business logic in routes
|
|
112
|
+
router.post('/submit', async (req, res) => {
|
|
113
|
+
// 200 lines of logic
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// ✅ ALWAYS: Delegate to controller
|
|
117
|
+
router.post('/submit', (req, res) => controller.submit(req, res));
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 2. All Controllers Extend BaseController
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
export class UserController extends BaseController {
|
|
124
|
+
async getUser(req: Request, res: Response): Promise<void> {
|
|
125
|
+
try {
|
|
126
|
+
const user = await this.userService.findById(req.params.id);
|
|
127
|
+
this.handleSuccess(res, user);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
this.handleError(error, res, 'getUser');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 3. All Errors to Sentry
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
try {
|
|
139
|
+
await operation();
|
|
140
|
+
} catch (error) {
|
|
141
|
+
Sentry.captureException(error);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 4. Use unifiedConfig, NEVER process.env
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
// ❌ NEVER
|
|
150
|
+
const timeout = process.env.TIMEOUT_MS;
|
|
151
|
+
|
|
152
|
+
// ✅ ALWAYS
|
|
153
|
+
import { config } from './config/unifiedConfig';
|
|
154
|
+
const timeout = config.timeouts.default;
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 5. Validate All Input with Zod
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
const schema = z.object({ email: z.string().email() });
|
|
161
|
+
const validated = schema.parse(req.body);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 6. Use Repository Pattern for Data Access
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// Service → Repository → Database
|
|
168
|
+
const users = await userRepository.findActive();
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 7. Comprehensive Testing Required
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
describe('UserService', () => {
|
|
175
|
+
it('should create user', async () => {
|
|
176
|
+
expect(user).toBeDefined();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Common Imports
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
// Express
|
|
187
|
+
import express, { Request, Response, NextFunction, Router } from 'express';
|
|
188
|
+
|
|
189
|
+
// Validation
|
|
190
|
+
import { z } from 'zod';
|
|
191
|
+
|
|
192
|
+
// Database
|
|
193
|
+
import { PrismaClient } from '@prisma/client';
|
|
194
|
+
import type { Prisma } from '@prisma/client';
|
|
195
|
+
|
|
196
|
+
// Sentry
|
|
197
|
+
import * as Sentry from '@sentry/node';
|
|
198
|
+
|
|
199
|
+
// Config
|
|
200
|
+
import { config } from './config/unifiedConfig';
|
|
201
|
+
|
|
202
|
+
// Middleware
|
|
203
|
+
import { SSOMiddlewareClient } from './middleware/SSOMiddleware';
|
|
204
|
+
import { asyncErrorWrapper } from './middleware/errorBoundary';
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Quick Reference
|
|
210
|
+
|
|
211
|
+
### HTTP Status Codes
|
|
212
|
+
|
|
213
|
+
| Code | Use Case |
|
|
214
|
+
|------|----------|
|
|
215
|
+
| 200 | Success |
|
|
216
|
+
| 201 | Created |
|
|
217
|
+
| 400 | Bad Request |
|
|
218
|
+
| 401 | Unauthorized |
|
|
219
|
+
| 403 | Forbidden |
|
|
220
|
+
| 404 | Not Found |
|
|
221
|
+
| 500 | Server Error |
|
|
222
|
+
|
|
223
|
+
### Service Templates
|
|
224
|
+
|
|
225
|
+
**Blog API** (✅ Mature) - Use as template for REST APIs
|
|
226
|
+
**Auth Service** (✅ Mature) - Use as template for authentication patterns
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Anti-Patterns to Avoid
|
|
231
|
+
|
|
232
|
+
❌ Business logic in routes
|
|
233
|
+
❌ Direct process.env usage
|
|
234
|
+
❌ Missing error handling
|
|
235
|
+
❌ No input validation
|
|
236
|
+
❌ Direct Prisma everywhere
|
|
237
|
+
❌ console.log instead of Sentry
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Navigation Guide
|
|
242
|
+
|
|
243
|
+
| Need to... | Read this |
|
|
244
|
+
|------------|-----------|
|
|
245
|
+
| Understand architecture | [architecture-overview.md](architecture-overview.md) |
|
|
246
|
+
| Create routes/controllers | [routing-and-controllers.md](routing-and-controllers.md) |
|
|
247
|
+
| Organize business logic | [services-and-repositories.md](services-and-repositories.md) |
|
|
248
|
+
| Validate input | [validation-patterns.md](validation-patterns.md) |
|
|
249
|
+
| Add error tracking | [sentry-and-monitoring.md](sentry-and-monitoring.md) |
|
|
250
|
+
| Create middleware | [middleware-guide.md](middleware-guide.md) |
|
|
251
|
+
| Database access | [database-patterns.md](database-patterns.md) |
|
|
252
|
+
| Manage config | [configuration.md](configuration.md) |
|
|
253
|
+
| Handle async/errors | [async-and-errors.md](async-and-errors.md) |
|
|
254
|
+
| Write tests | [testing-guide.md](testing-guide.md) |
|
|
255
|
+
| See examples | [complete-examples.md](complete-examples.md) |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Resource Files
|
|
260
|
+
|
|
261
|
+
### [architecture-overview.md](architecture-overview.md)
|
|
262
|
+
Layered architecture, request lifecycle, separation of concerns
|
|
263
|
+
|
|
264
|
+
### [routing-and-controllers.md](routing-and-controllers.md)
|
|
265
|
+
Route definitions, BaseController, error handling, examples
|
|
266
|
+
|
|
267
|
+
### [services-and-repositories.md](services-and-repositories.md)
|
|
268
|
+
Service patterns, DI, repository pattern, caching
|
|
269
|
+
|
|
270
|
+
### [validation-patterns.md](validation-patterns.md)
|
|
271
|
+
Zod schemas, validation, DTO pattern
|
|
272
|
+
|
|
273
|
+
### [sentry-and-monitoring.md](sentry-and-monitoring.md)
|
|
274
|
+
Sentry init, error capture, performance monitoring
|
|
275
|
+
|
|
276
|
+
### [middleware-guide.md](middleware-guide.md)
|
|
277
|
+
Auth, audit, error boundaries, AsyncLocalStorage
|
|
278
|
+
|
|
279
|
+
### [database-patterns.md](database-patterns.md)
|
|
280
|
+
PrismaService, repositories, transactions, optimization
|
|
281
|
+
|
|
282
|
+
### [configuration.md](configuration.md)
|
|
283
|
+
UnifiedConfig, environment configs, secrets
|
|
284
|
+
|
|
285
|
+
### [async-and-errors.md](async-and-errors.md)
|
|
286
|
+
Async patterns, custom errors, asyncErrorWrapper
|
|
287
|
+
|
|
288
|
+
### [testing-guide.md](testing-guide.md)
|
|
289
|
+
Unit/integration tests, mocking, coverage
|
|
290
|
+
|
|
291
|
+
### [complete-examples.md](complete-examples.md)
|
|
292
|
+
Full examples, refactoring guide
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## Related Skills
|
|
297
|
+
|
|
298
|
+
- **database-verification** - Verify column names and schema consistency
|
|
299
|
+
- **error-tracking** - Sentry integration patterns
|
|
300
|
+
- **skill-developer** - Meta-skill for creating and managing skills
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
**Skill Status**: COMPLETE ✅
|
|
305
|
+
**Line Count**: < 500 ✅
|
|
306
|
+
**Progressive Disclosure**: 11 resource files ✅
|