aigroup-workflow 2.2.1 → 2.2.2
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/commands/fix-build.md +10 -5
- package/.claude/commands/init-project.md +13 -8
- package/.claude/commands/plan.md +15 -8
- package/.claude/commands/review.md +12 -6
- package/.claude/commands/tdd.md +11 -5
- package/.claude/commands/workflow-start.md +20 -11
- package/.claude/settings.json +28 -0
- package/.codex/agents/architect.toml +207 -0
- package/.codex/agents/build-error-resolver.toml +110 -0
- package/.codex/agents/code-reviewer.toml +233 -0
- package/.codex/agents/doc-updater.toml +103 -0
- package/.codex/agents/e2e-runner.toml +103 -0
- package/.codex/agents/get-current-datetime.toml +23 -0
- package/.codex/agents/init-architect.toml +181 -0
- package/.codex/agents/planner.toml +208 -0
- package/.codex/agents/refactor-cleaner.toml +81 -0
- package/.codex/agents/rust-reviewer.toml +90 -0
- package/.codex/agents/security-reviewer.toml +104 -0
- package/.codex/agents/tdd-guide.toml +87 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +23 -1
- package/LICENSE +20 -20
- package/README.md +333 -333
- package/agents/a11y-architect.md +141 -141
- package/agents/architect.md +211 -211
- package/agents/build-error-resolver.md +114 -114
- package/agents/chief-of-staff.md +151 -151
- package/agents/code-architect.md +71 -71
- package/agents/code-explorer.md +69 -69
- package/agents/code-reviewer.md +237 -237
- package/agents/code-simplifier.md +47 -47
- package/agents/comment-analyzer.md +45 -45
- package/agents/conversation-analyzer.md +52 -52
- package/agents/cpp-build-resolver.md +90 -90
- package/agents/cpp-reviewer.md +72 -72
- package/agents/csharp-reviewer.md +101 -101
- package/agents/dart-build-resolver.md +201 -201
- package/agents/database-reviewer.md +91 -91
- package/agents/doc-updater.md +107 -107
- package/agents/docs-lookup.md +68 -68
- package/agents/e2e-runner.md +107 -107
- package/agents/flutter-reviewer.md +243 -243
- package/agents/gan-evaluator.md +209 -209
- package/agents/gan-generator.md +131 -131
- package/agents/gan-planner.md +99 -99
- package/agents/get-current-datetime.md +26 -26
- package/agents/go-build-resolver.md +94 -94
- package/agents/go-reviewer.md +76 -76
- package/agents/harness-optimizer.md +35 -35
- package/agents/healthcare-reviewer.md +83 -83
- package/agents/java-build-resolver.md +153 -153
- package/agents/java-reviewer.md +92 -92
- package/agents/kotlin-build-resolver.md +118 -118
- package/agents/kotlin-reviewer.md +159 -159
- package/agents/loop-operator.md +36 -36
- package/agents/opensource-forker.md +198 -198
- package/agents/opensource-packager.md +249 -249
- package/agents/opensource-sanitizer.md +188 -188
- package/agents/performance-optimizer.md +446 -446
- package/agents/planner.md +212 -212
- package/agents/pr-test-analyzer.md +45 -45
- package/agents/python-reviewer.md +98 -98
- package/agents/pytorch-build-resolver.md +120 -120
- package/agents/refactor-cleaner.md +85 -85
- package/agents/rust-build-resolver.md +148 -148
- package/agents/rust-reviewer.md +94 -94
- package/agents/security-reviewer.md +108 -108
- package/agents/seo-specialist.md +59 -59
- package/agents/silent-failure-hunter.md +50 -50
- package/agents/tdd-guide.md +91 -91
- package/agents/type-design-analyzer.md +41 -41
- package/agents/typescript-reviewer.md +112 -112
- package/cli/commands/update.mjs +1 -1
- package/cli/utils/scaffold.mjs +53 -0
- package/docs/rules/agents.md +166 -50
- package/docs/rules/cpp/coding-style.md +44 -44
- package/docs/rules/cpp/hooks.md +39 -39
- package/docs/rules/cpp/patterns.md +51 -51
- package/docs/rules/cpp/security.md +51 -51
- package/docs/rules/cpp/testing.md +44 -44
- package/docs/rules/csharp/coding-style.md +72 -72
- package/docs/rules/csharp/hooks.md +25 -25
- package/docs/rules/csharp/patterns.md +50 -50
- package/docs/rules/csharp/security.md +58 -58
- package/docs/rules/csharp/testing.md +46 -46
- package/docs/rules/dart/coding-style.md +159 -159
- package/docs/rules/dart/hooks.md +66 -66
- package/docs/rules/dart/patterns.md +261 -261
- package/docs/rules/dart/security.md +135 -135
- package/docs/rules/dart/testing.md +215 -215
- package/docs/rules/golang/coding-style.md +32 -32
- package/docs/rules/golang/hooks.md +17 -17
- package/docs/rules/golang/patterns.md +45 -45
- package/docs/rules/golang/security.md +34 -34
- package/docs/rules/golang/testing.md +31 -31
- package/docs/rules/java/coding-style.md +114 -114
- package/docs/rules/java/hooks.md +18 -18
- package/docs/rules/java/patterns.md +146 -146
- package/docs/rules/java/security.md +100 -100
- package/docs/rules/java/testing.md +131 -131
- package/docs/rules/kotlin/coding-style.md +86 -86
- package/docs/rules/kotlin/hooks.md +17 -17
- package/docs/rules/kotlin/patterns.md +146 -146
- package/docs/rules/kotlin/security.md +82 -82
- package/docs/rules/kotlin/testing.md +128 -128
- package/docs/rules/perl/coding-style.md +46 -46
- package/docs/rules/perl/hooks.md +22 -22
- package/docs/rules/perl/patterns.md +76 -76
- package/docs/rules/perl/security.md +69 -69
- package/docs/rules/perl/testing.md +54 -54
- package/docs/rules/php/coding-style.md +40 -40
- package/docs/rules/php/hooks.md +24 -24
- package/docs/rules/php/patterns.md +33 -33
- package/docs/rules/php/security.md +37 -37
- package/docs/rules/php/testing.md +39 -39
- package/docs/rules/python/coding-style.md +42 -42
- package/docs/rules/python/hooks.md +19 -19
- package/docs/rules/python/patterns.md +39 -39
- package/docs/rules/python/security.md +30 -30
- package/docs/rules/python/testing.md +38 -38
- package/docs/rules/rust/coding-style.md +151 -151
- package/docs/rules/rust/hooks.md +16 -16
- package/docs/rules/rust/patterns.md +168 -168
- package/docs/rules/rust/security.md +141 -141
- package/docs/rules/rust/testing.md +154 -154
- package/docs/rules/swift/coding-style.md +47 -47
- package/docs/rules/swift/hooks.md +20 -20
- package/docs/rules/swift/patterns.md +66 -66
- package/docs/rules/swift/security.md +33 -33
- package/docs/rules/swift/testing.md +45 -45
- package/docs/rules/typescript/coding-style.md +199 -199
- package/docs/rules/typescript/hooks.md +22 -22
- package/docs/rules/typescript/patterns.md +52 -52
- package/docs/rules/typescript/security.md +28 -28
- package/docs/rules/typescript/testing.md +18 -18
- package/docs/rules/web/coding-style.md +96 -96
- package/docs/rules/web/design-quality.md +62 -62
- package/docs/rules/web/hooks.md +120 -120
- package/docs/rules/web/patterns.md +79 -79
- package/docs/rules/web/performance.md +64 -64
- package/docs/rules/web/security.md +57 -57
- package/docs/rules/web/testing.md +55 -55
- package/docs/templates/README.md +36 -36
- package/docs/templates/ai-project-final.md +124 -124
- package/docs/templates/ai-project.md +105 -105
- package/docs/templates/api.md +157 -157
- package/docs/templates/bug.md +62 -62
- package/docs/templates/code-review.md +87 -87
- package/docs/templates/generic.md +116 -116
- package/docs/templates/implementation-plan.md +1 -1
- package/docs/templates/meeting.md +68 -68
- package/docs/templates/prd.md +98 -98
- package/docs/templates/ui.md +134 -134
- package/docs/workflow-pipeline.md +5 -5
- package/package.json +40 -39
- package/skills/SUPERPOWERS-LICENSE +21 -21
- package/skills/ai-ml/fine-tuning-expert/SKILL.md +162 -162
- package/skills/ai-ml/fine-tuning-expert/references/dataset-preparation.md +540 -540
- package/skills/ai-ml/fine-tuning-expert/references/deployment-optimization.md +673 -673
- package/skills/ai-ml/fine-tuning-expert/references/evaluation-metrics.md +597 -597
- package/skills/ai-ml/fine-tuning-expert/references/hyperparameter-tuning.md +565 -565
- package/skills/ai-ml/fine-tuning-expert/references/lora-peft.md +347 -347
- package/skills/ai-ml/ml-pipeline/SKILL.md +159 -159
- package/skills/ai-ml/ml-pipeline/references/experiment-tracking.md +833 -833
- package/skills/ai-ml/ml-pipeline/references/feature-engineering.md +631 -631
- package/skills/ai-ml/ml-pipeline/references/model-validation.md +978 -978
- package/skills/ai-ml/ml-pipeline/references/pipeline-orchestration.md +907 -907
- package/skills/ai-ml/ml-pipeline/references/training-pipelines.md +782 -782
- package/skills/ai-ml/rag-architect/SKILL.md +194 -194
- package/skills/ai-ml/rag-architect/references/chunking-strategies.md +878 -878
- package/skills/ai-ml/rag-architect/references/embedding-models.md +561 -561
- package/skills/ai-ml/rag-architect/references/rag-evaluation.md +833 -833
- package/skills/ai-ml/rag-architect/references/retrieval-optimization.md +795 -795
- package/skills/ai-ml/rag-architect/references/vector-databases.md +589 -589
- package/skills/ai-ml/spark-engineer/SKILL.md +148 -148
- package/skills/ai-ml/spark-engineer/references/partitioning-caching.md +543 -543
- package/skills/ai-ml/spark-engineer/references/performance-tuning.md +544 -544
- package/skills/ai-ml/spark-engineer/references/rdd-operations.md +599 -599
- package/skills/ai-ml/spark-engineer/references/spark-sql-dataframes.md +474 -474
- package/skills/ai-ml/spark-engineer/references/streaming-patterns.md +786 -786
- package/skills/backend/api-designer/SKILL.md +217 -217
- package/skills/backend/api-designer/references/error-handling.md +541 -541
- package/skills/backend/api-designer/references/openapi.md +824 -824
- package/skills/backend/api-designer/references/pagination.md +494 -494
- package/skills/backend/api-designer/references/rest-patterns.md +335 -335
- package/skills/backend/api-designer/references/versioning.md +391 -391
- package/skills/backend/architecture-designer/SKILL.md +117 -117
- package/skills/backend/architecture-designer/references/adr-template.md +116 -116
- package/skills/backend/architecture-designer/references/architecture-patterns.md +111 -111
- package/skills/backend/architecture-designer/references/database-selection.md +102 -102
- package/skills/backend/architecture-designer/references/nfr-checklist.md +112 -112
- package/skills/backend/architecture-designer/references/system-design.md +100 -100
- package/skills/backend/code-documenter/SKILL.md +147 -147
- package/skills/backend/code-documenter/references/api-docs-fastapi-django.md +166 -166
- package/skills/backend/code-documenter/references/api-docs-nestjs-express.md +220 -220
- package/skills/backend/code-documenter/references/coverage-reports.md +125 -125
- package/skills/backend/code-documenter/references/documentation-systems.md +333 -333
- package/skills/backend/code-documenter/references/interactive-api-docs.md +531 -531
- package/skills/backend/code-documenter/references/python-docstrings.md +121 -121
- package/skills/backend/code-documenter/references/typescript-jsdoc.md +145 -145
- package/skills/backend/code-documenter/references/user-guides-tutorials.md +530 -530
- package/skills/backend/debugging-wizard/SKILL.md +105 -105
- package/skills/backend/debugging-wizard/references/common-patterns.md +132 -132
- package/skills/backend/debugging-wizard/references/debugging-tools.md +140 -140
- package/skills/backend/debugging-wizard/references/quick-fixes.md +177 -177
- package/skills/backend/debugging-wizard/references/strategies.md +142 -142
- package/skills/backend/debugging-wizard/references/systematic-debugging.md +367 -367
- package/skills/backend/feature-forge/SKILL.md +98 -98
- package/skills/backend/feature-forge/references/acceptance-criteria.md +104 -104
- package/skills/backend/feature-forge/references/ears-syntax.md +99 -99
- package/skills/backend/feature-forge/references/interview-questions.md +150 -150
- package/skills/backend/feature-forge/references/pre-discovery-subagents.md +54 -54
- package/skills/backend/feature-forge/references/specification-template.md +103 -103
- package/skills/backend/fullstack-guardian/SKILL.md +105 -105
- package/skills/backend/fullstack-guardian/references/api-design-standards.md +307 -307
- package/skills/backend/fullstack-guardian/references/architecture-decisions.md +350 -350
- package/skills/backend/fullstack-guardian/references/backend-patterns.md +237 -237
- package/skills/backend/fullstack-guardian/references/common-patterns.md +134 -134
- package/skills/backend/fullstack-guardian/references/deliverables-checklist.md +354 -354
- package/skills/backend/fullstack-guardian/references/design-template.md +91 -91
- package/skills/backend/fullstack-guardian/references/error-handling.md +135 -135
- package/skills/backend/fullstack-guardian/references/frontend-patterns.md +340 -340
- package/skills/backend/fullstack-guardian/references/integration-patterns.md +333 -333
- package/skills/backend/fullstack-guardian/references/security-checklist.md +106 -106
- package/skills/backend/graphql-architect/SKILL.md +146 -146
- package/skills/backend/graphql-architect/references/federation.md +418 -418
- package/skills/backend/graphql-architect/references/migration-from-rest.md +1141 -1141
- package/skills/backend/graphql-architect/references/resolvers.md +425 -425
- package/skills/backend/graphql-architect/references/schema-design.md +393 -393
- package/skills/backend/graphql-architect/references/security.md +569 -569
- package/skills/backend/graphql-architect/references/subscriptions.md +510 -510
- package/skills/backend/legacy-modernizer/SKILL.md +137 -137
- package/skills/backend/legacy-modernizer/references/legacy-testing.md +381 -381
- package/skills/backend/legacy-modernizer/references/migration-strategies.md +423 -423
- package/skills/backend/legacy-modernizer/references/refactoring-patterns.md +395 -395
- package/skills/backend/legacy-modernizer/references/strangler-fig-pattern.md +281 -281
- package/skills/backend/legacy-modernizer/references/system-assessment.md +487 -487
- package/skills/backend/microservices-architect/SKILL.md +164 -164
- package/skills/backend/microservices-architect/references/communication.md +499 -499
- package/skills/backend/microservices-architect/references/data.md +721 -721
- package/skills/backend/microservices-architect/references/decomposition.md +344 -344
- package/skills/backend/microservices-architect/references/observability.md +805 -805
- package/skills/backend/microservices-architect/references/patterns.md +603 -603
- package/skills/database/database-optimizer/SKILL.md +147 -147
- package/skills/database/database-optimizer/references/index-strategies.md +331 -331
- package/skills/database/database-optimizer/references/monitoring-analysis.md +501 -501
- package/skills/database/database-optimizer/references/mysql-tuning.md +452 -452
- package/skills/database/database-optimizer/references/postgresql-tuning.md +413 -413
- package/skills/database/database-optimizer/references/query-optimization.md +251 -251
- package/skills/database/postgres-pro/SKILL.md +152 -152
- package/skills/database/postgres-pro/references/extensions.md +404 -404
- package/skills/database/postgres-pro/references/jsonb.md +321 -321
- package/skills/database/postgres-pro/references/maintenance.md +481 -481
- package/skills/database/postgres-pro/references/performance.md +265 -265
- package/skills/database/postgres-pro/references/replication.md +446 -446
- package/skills/database/sql-pro/SKILL.md +129 -129
- package/skills/database/sql-pro/references/database-design.md +402 -402
- package/skills/database/sql-pro/references/dialect-differences.md +419 -419
- package/skills/database/sql-pro/references/optimization.md +384 -384
- package/skills/database/sql-pro/references/query-patterns.md +285 -285
- package/skills/database/sql-pro/references/window-functions.md +328 -328
- package/skills/dotnet/csharp-developer/SKILL.md +125 -125
- package/skills/dotnet/csharp-developer/references/aspnet-core.md +394 -394
- package/skills/dotnet/csharp-developer/references/blazor.md +553 -553
- package/skills/dotnet/csharp-developer/references/entity-framework.md +409 -409
- package/skills/dotnet/csharp-developer/references/modern-csharp.md +248 -248
- package/skills/dotnet/csharp-developer/references/performance.md +498 -498
- package/skills/dotnet/dotnet-core-expert/SKILL.md +138 -138
- package/skills/dotnet/dotnet-core-expert/references/authentication.md +546 -546
- package/skills/dotnet/dotnet-core-expert/references/clean-architecture.md +455 -455
- package/skills/dotnet/dotnet-core-expert/references/cloud-native.md +548 -548
- package/skills/dotnet/dotnet-core-expert/references/entity-framework.md +440 -440
- package/skills/dotnet/dotnet-core-expert/references/minimal-apis.md +319 -319
- package/skills/frontend/angular-architect/SKILL.md +152 -152
- package/skills/frontend/angular-architect/references/components.md +297 -297
- package/skills/frontend/angular-architect/references/ngrx.md +401 -401
- package/skills/frontend/angular-architect/references/routing.md +361 -361
- package/skills/frontend/angular-architect/references/rxjs.md +319 -319
- package/skills/frontend/angular-architect/references/testing.md +405 -405
- package/skills/frontend/design-commands/design.md +91 -91
- package/skills/frontend/design-commands/handoff.md +97 -97
- package/skills/frontend/design-commands/prototype.md +120 -120
- package/skills/frontend/design-commands/spec.md +160 -160
- package/skills/frontend/design-commands/style.md +78 -78
- package/skills/frontend/flutter-expert/SKILL.md +138 -138
- package/skills/frontend/flutter-expert/references/bloc-state.md +259 -259
- package/skills/frontend/flutter-expert/references/gorouter-navigation.md +119 -119
- package/skills/frontend/flutter-expert/references/performance.md +99 -99
- package/skills/frontend/flutter-expert/references/project-structure.md +118 -118
- package/skills/frontend/flutter-expert/references/riverpod-state.md +130 -130
- package/skills/frontend/flutter-expert/references/widget-patterns.md +123 -123
- package/skills/frontend/nextjs-developer/SKILL.md +143 -143
- package/skills/frontend/nextjs-developer/references/app-router.md +311 -311
- package/skills/frontend/nextjs-developer/references/data-fetching.md +482 -482
- package/skills/frontend/nextjs-developer/references/deployment.md +545 -545
- package/skills/frontend/nextjs-developer/references/server-actions.md +462 -462
- package/skills/frontend/nextjs-developer/references/server-components.md +384 -384
- package/skills/frontend/react-expert/SKILL.md +149 -149
- package/skills/frontend/react-expert/references/hooks-patterns.md +162 -162
- package/skills/frontend/react-expert/references/migration-class-to-modern.md +1119 -1119
- package/skills/frontend/react-expert/references/performance.md +168 -168
- package/skills/frontend/react-expert/references/react-19-features.md +174 -174
- package/skills/frontend/react-expert/references/server-components.md +143 -143
- package/skills/frontend/react-expert/references/state-management.md +171 -171
- package/skills/frontend/react-expert/references/testing-react.md +174 -174
- package/skills/frontend/react-native-expert/SKILL.md +185 -185
- package/skills/frontend/react-native-expert/references/expo-router.md +187 -187
- package/skills/frontend/react-native-expert/references/list-optimization.md +204 -204
- package/skills/frontend/react-native-expert/references/platform-handling.md +188 -188
- package/skills/frontend/react-native-expert/references/project-structure.md +171 -171
- package/skills/frontend/react-native-expert/references/storage-hooks.md +173 -173
- package/skills/frontend/senior-frontend/SKILL.md +477 -477
- package/skills/frontend/senior-frontend/references/frontend_best_practices.md +806 -806
- package/skills/frontend/senior-frontend/references/nextjs_optimization_guide.md +724 -724
- package/skills/frontend/senior-frontend/references/react_patterns.md +746 -746
- package/skills/frontend/senior-frontend/scripts/bundle_analyzer.py +407 -407
- package/skills/frontend/senior-frontend/scripts/component_generator.py +329 -329
- package/skills/frontend/senior-frontend/scripts/frontend_scaffolder.py +1005 -1005
- package/skills/frontend/ui-ux-pro-max/SKILL.md +386 -386
- package/skills/frontend/ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/frontend/ui-ux-pro-max/data/colors.csv +97 -97
- package/skills/frontend/ui-ux-pro-max/data/icons.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/landing.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/data/products.csv +96 -96
- package/skills/frontend/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/frontend/ui-ux-pro-max/data/styles.csv +68 -68
- package/skills/frontend/ui-ux-pro-max/data/typography.csv +57 -57
- package/skills/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/frontend/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/scripts/core.py +253 -253
- package/skills/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/skills/frontend/ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/frontend/vue-expert/SKILL.md +98 -98
- package/skills/frontend/vue-expert/references/build-tooling.md +480 -480
- package/skills/frontend/vue-expert/references/components.md +448 -448
- package/skills/frontend/vue-expert/references/composition-api.md +299 -299
- package/skills/frontend/vue-expert/references/mobile-hybrid.md +636 -636
- package/skills/frontend/vue-expert/references/nuxt.md +669 -669
- package/skills/frontend/vue-expert/references/state-management.md +449 -449
- package/skills/frontend/vue-expert/references/typescript.md +584 -584
- package/skills/frontend/vue-expert-js/SKILL.md +167 -167
- package/skills/frontend/vue-expert-js/references/component-architecture.md +219 -219
- package/skills/frontend/vue-expert-js/references/composables-patterns.md +183 -183
- package/skills/frontend/vue-expert-js/references/jsdoc-typing.md +535 -535
- package/skills/frontend/vue-expert-js/references/state-management.md +249 -249
- package/skills/frontend/vue-expert-js/references/testing-patterns.md +237 -237
- package/skills/go-rust-cpp/cpp-pro/SKILL.md +115 -115
- package/skills/go-rust-cpp/cpp-pro/references/build-tooling.md +440 -440
- package/skills/go-rust-cpp/cpp-pro/references/concurrency.md +437 -437
- package/skills/go-rust-cpp/cpp-pro/references/memory-performance.md +397 -397
- package/skills/go-rust-cpp/cpp-pro/references/modern-cpp.md +304 -304
- package/skills/go-rust-cpp/cpp-pro/references/templates.md +357 -357
- package/skills/go-rust-cpp/golang-pro/SKILL.md +122 -122
- package/skills/go-rust-cpp/golang-pro/references/concurrency.md +329 -329
- package/skills/go-rust-cpp/golang-pro/references/generics.md +442 -442
- package/skills/go-rust-cpp/golang-pro/references/interfaces.md +432 -432
- package/skills/go-rust-cpp/golang-pro/references/project-structure.md +477 -477
- package/skills/go-rust-cpp/golang-pro/references/testing.md +451 -451
- package/skills/go-rust-cpp/rust-engineer/SKILL.md +167 -167
- package/skills/go-rust-cpp/rust-engineer/references/async.md +458 -458
- package/skills/go-rust-cpp/rust-engineer/references/error-handling.md +334 -334
- package/skills/go-rust-cpp/rust-engineer/references/ownership.md +278 -278
- package/skills/go-rust-cpp/rust-engineer/references/testing.md +470 -470
- package/skills/go-rust-cpp/rust-engineer/references/traits.md +413 -413
- package/skills/infra/cli-developer/SKILL.md +113 -113
- package/skills/infra/cli-developer/references/design-patterns.md +221 -221
- package/skills/infra/cli-developer/references/go-cli.md +540 -540
- package/skills/infra/cli-developer/references/node-cli.md +383 -383
- package/skills/infra/cli-developer/references/python-cli.md +422 -422
- package/skills/infra/cli-developer/references/ux-patterns.md +448 -448
- package/skills/infra/cloud-architect/SKILL.md +216 -216
- package/skills/infra/cloud-architect/references/aws.md +394 -394
- package/skills/infra/cloud-architect/references/azure.md +562 -562
- package/skills/infra/cloud-architect/references/cost.md +582 -582
- package/skills/infra/cloud-architect/references/gcp.md +633 -633
- package/skills/infra/cloud-architect/references/multi-cloud.md +483 -483
- package/skills/infra/devops-engineer/SKILL.md +144 -144
- package/skills/infra/devops-engineer/references/deployment-strategies.md +241 -241
- package/skills/infra/devops-engineer/references/docker-patterns.md +113 -113
- package/skills/infra/devops-engineer/references/github-actions.md +139 -139
- package/skills/infra/devops-engineer/references/incident-response.md +331 -331
- package/skills/infra/devops-engineer/references/kubernetes.md +154 -154
- package/skills/infra/devops-engineer/references/platform-engineering.md +417 -417
- package/skills/infra/devops-engineer/references/release-automation.md +527 -527
- package/skills/infra/devops-engineer/references/terraform-iac.md +141 -141
- package/skills/infra/kubernetes-specialist/SKILL.md +241 -241
- package/skills/infra/kubernetes-specialist/references/configuration.md +452 -452
- package/skills/infra/kubernetes-specialist/references/cost-optimization.md +458 -458
- package/skills/infra/kubernetes-specialist/references/custom-operators.md +563 -563
- package/skills/infra/kubernetes-specialist/references/gitops.md +530 -530
- package/skills/infra/kubernetes-specialist/references/helm-charts.md +912 -912
- package/skills/infra/kubernetes-specialist/references/multi-cluster.md +507 -507
- package/skills/infra/kubernetes-specialist/references/networking.md +447 -447
- package/skills/infra/kubernetes-specialist/references/service-mesh.md +459 -459
- package/skills/infra/kubernetes-specialist/references/storage.md +535 -535
- package/skills/infra/kubernetes-specialist/references/troubleshooting.md +414 -414
- package/skills/infra/kubernetes-specialist/references/workloads.md +377 -377
- package/skills/infra/mcp-developer/SKILL.md +143 -143
- package/skills/infra/mcp-developer/references/protocol.md +244 -244
- package/skills/infra/mcp-developer/references/python-sdk.md +367 -367
- package/skills/infra/mcp-developer/references/resources.md +554 -554
- package/skills/infra/mcp-developer/references/tools.md +480 -480
- package/skills/infra/mcp-developer/references/typescript-sdk.md +350 -350
- package/skills/infra/monitoring-expert/SKILL.md +176 -176
- package/skills/infra/monitoring-expert/references/alerting-rules.md +141 -141
- package/skills/infra/monitoring-expert/references/application-profiling.md +331 -331
- package/skills/infra/monitoring-expert/references/capacity-planning.md +344 -344
- package/skills/infra/monitoring-expert/references/dashboards.md +126 -126
- package/skills/infra/monitoring-expert/references/opentelemetry.md +123 -123
- package/skills/infra/monitoring-expert/references/performance-testing.md +269 -269
- package/skills/infra/monitoring-expert/references/prometheus-metrics.md +136 -136
- package/skills/infra/monitoring-expert/references/structured-logging.md +142 -142
- package/skills/infra/sre-engineer/SKILL.md +181 -181
- package/skills/infra/sre-engineer/references/automation-toil.md +492 -492
- package/skills/infra/sre-engineer/references/error-budget-policy.md +334 -334
- package/skills/infra/sre-engineer/references/incident-chaos.md +576 -576
- package/skills/infra/sre-engineer/references/monitoring-alerting.md +424 -424
- package/skills/infra/sre-engineer/references/slo-sli-management.md +238 -238
- package/skills/infra/terraform-engineer/SKILL.md +143 -143
- package/skills/infra/terraform-engineer/references/best-practices.md +583 -583
- package/skills/infra/terraform-engineer/references/module-patterns.md +297 -297
- package/skills/infra/terraform-engineer/references/providers.md +452 -452
- package/skills/infra/terraform-engineer/references/state-management.md +371 -371
- package/skills/infra/terraform-engineer/references/testing.md +486 -486
- package/skills/infra/websocket-engineer/SKILL.md +168 -168
- package/skills/infra/websocket-engineer/references/alternatives.md +391 -391
- package/skills/infra/websocket-engineer/references/patterns.md +400 -400
- package/skills/infra/websocket-engineer/references/protocol.md +195 -195
- package/skills/infra/websocket-engineer/references/scaling.md +333 -333
- package/skills/infra/websocket-engineer/references/security.md +474 -474
- package/skills/java/java-architect/SKILL.md +132 -132
- package/skills/java/java-architect/references/jpa-optimization.md +393 -393
- package/skills/java/java-architect/references/reactive-webflux.md +356 -356
- package/skills/java/java-architect/references/spring-boot-setup.md +269 -269
- package/skills/java/java-architect/references/spring-security.md +445 -445
- package/skills/java/java-architect/references/testing-patterns.md +500 -500
- package/skills/java/kotlin-specialist/SKILL.md +147 -147
- package/skills/java/kotlin-specialist/references/android-compose.md +419 -419
- package/skills/java/kotlin-specialist/references/coroutines-flow.md +276 -276
- package/skills/java/kotlin-specialist/references/dsl-idioms.md +421 -421
- package/skills/java/kotlin-specialist/references/ktor-server.md +426 -426
- package/skills/java/kotlin-specialist/references/multiplatform-kmp.md +380 -380
- package/skills/java/spring-boot-engineer/SKILL.md +195 -195
- package/skills/java/spring-boot-engineer/references/cloud.md +498 -498
- package/skills/java/spring-boot-engineer/references/data.md +381 -381
- package/skills/java/spring-boot-engineer/references/security.md +459 -459
- package/skills/java/spring-boot-engineer/references/testing.md +545 -545
- package/skills/java/spring-boot-engineer/references/web.md +295 -295
- package/skills/javascript/javascript-pro/SKILL.md +132 -132
- package/skills/javascript/javascript-pro/references/async-patterns.md +334 -334
- package/skills/javascript/javascript-pro/references/browser-apis.md +398 -398
- package/skills/javascript/javascript-pro/references/modern-syntax.md +272 -272
- package/skills/javascript/javascript-pro/references/modules.md +357 -357
- package/skills/javascript/javascript-pro/references/node-essentials.md +471 -471
- package/skills/javascript/nestjs-expert/SKILL.md +206 -206
- package/skills/javascript/nestjs-expert/references/authentication.md +166 -166
- package/skills/javascript/nestjs-expert/references/controllers-routing.md +111 -111
- package/skills/javascript/nestjs-expert/references/dtos-validation.md +153 -153
- package/skills/javascript/nestjs-expert/references/migration-from-express.md +1237 -1237
- package/skills/javascript/nestjs-expert/references/services-di.md +140 -140
- package/skills/javascript/nestjs-expert/references/testing-patterns.md +186 -186
- package/skills/javascript/typescript-pro/SKILL.md +145 -145
- package/skills/javascript/typescript-pro/references/advanced-types.md +259 -259
- package/skills/javascript/typescript-pro/references/configuration.md +445 -445
- package/skills/javascript/typescript-pro/references/patterns.md +484 -484
- package/skills/javascript/typescript-pro/references/type-guards.md +352 -352
- package/skills/javascript/typescript-pro/references/utility-types.md +329 -329
- package/skills/php/laravel-specialist/SKILL.md +262 -262
- package/skills/php/laravel-specialist/references/eloquent.md +351 -351
- package/skills/php/laravel-specialist/references/livewire.md +512 -512
- package/skills/php/laravel-specialist/references/queues.md +423 -423
- package/skills/php/laravel-specialist/references/routing.md +362 -362
- package/skills/php/laravel-specialist/references/testing.md +522 -522
- package/skills/php/php-pro/SKILL.md +206 -206
- package/skills/php/php-pro/references/async-patterns.md +412 -412
- package/skills/php/php-pro/references/laravel-patterns.md +377 -377
- package/skills/php/php-pro/references/modern-php-features.md +323 -323
- package/skills/php/php-pro/references/symfony-patterns.md +466 -466
- package/skills/php/php-pro/references/testing-quality.md +466 -466
- package/skills/product/competitive-analysis/SKILL.md +257 -257
- package/skills/product/meeting-notes/SKILL.md +266 -266
- package/skills/product/prd-template/SKILL.md +150 -150
- package/skills/product/stakeholder-update/SKILL.md +225 -225
- package/skills/product/user-research-synthesis/SKILL.md +235 -235
- package/skills/python/django-expert/SKILL.md +162 -162
- package/skills/python/django-expert/references/authentication.md +145 -145
- package/skills/python/django-expert/references/drf-serializers.md +148 -148
- package/skills/python/django-expert/references/models-orm.md +151 -151
- package/skills/python/django-expert/references/testing-django.md +204 -204
- package/skills/python/django-expert/references/viewsets-views.md +153 -153
- package/skills/python/fastapi-expert/SKILL.md +185 -185
- package/skills/python/fastapi-expert/references/async-sqlalchemy.md +146 -146
- package/skills/python/fastapi-expert/references/authentication.md +159 -159
- package/skills/python/fastapi-expert/references/endpoints-routing.md +142 -142
- package/skills/python/fastapi-expert/references/migration-from-django.md +996 -996
- package/skills/python/fastapi-expert/references/pydantic-v2.md +135 -135
- package/skills/python/fastapi-expert/references/testing-async.md +159 -159
- package/skills/python/pandas-pro/SKILL.md +178 -178
- package/skills/python/pandas-pro/references/aggregation-groupby.md +545 -545
- package/skills/python/pandas-pro/references/data-cleaning.md +500 -500
- package/skills/python/pandas-pro/references/dataframe-operations.md +420 -420
- package/skills/python/pandas-pro/references/merging-joining.md +596 -596
- package/skills/python/pandas-pro/references/performance-optimization.md +597 -597
- package/skills/python/python-pro/SKILL.md +177 -177
- package/skills/python/python-pro/references/async-patterns.md +356 -356
- package/skills/python/python-pro/references/packaging.md +460 -460
- package/skills/python/python-pro/references/standard-library.md +378 -378
- package/skills/python/python-pro/references/testing.md +404 -404
- package/skills/python/python-pro/references/type-system.md +290 -290
- package/skills/quality/chaos-engineer/SKILL.md +182 -182
- package/skills/quality/chaos-engineer/references/chaos-tools.md +511 -511
- package/skills/quality/chaos-engineer/references/experiment-design.md +229 -229
- package/skills/quality/chaos-engineer/references/game-days.md +434 -434
- package/skills/quality/chaos-engineer/references/infrastructure-chaos.md +348 -348
- package/skills/quality/chaos-engineer/references/kubernetes-chaos.md +432 -432
- package/skills/quality/code-reviewer/SKILL.md +119 -119
- package/skills/quality/code-reviewer/references/common-issues.md +142 -142
- package/skills/quality/code-reviewer/references/feedback-examples.md +144 -144
- package/skills/quality/code-reviewer/references/receiving-feedback.md +238 -238
- package/skills/quality/code-reviewer/references/report-template.md +109 -109
- package/skills/quality/code-reviewer/references/review-checklist.md +88 -88
- package/skills/quality/code-reviewer/references/spec-compliance-review.md +258 -258
- package/skills/quality/playwright-expert/SKILL.md +169 -169
- package/skills/quality/playwright-expert/references/api-mocking.md +140 -140
- package/skills/quality/playwright-expert/references/configuration.md +155 -155
- package/skills/quality/playwright-expert/references/debugging-flaky.md +150 -150
- package/skills/quality/playwright-expert/references/page-object-model.md +152 -152
- package/skills/quality/playwright-expert/references/selectors-locators.md +119 -119
- package/skills/quality/secure-code-guardian/SKILL.md +191 -191
- package/skills/quality/secure-code-guardian/references/authentication.md +136 -136
- package/skills/quality/secure-code-guardian/references/input-validation.md +146 -146
- package/skills/quality/secure-code-guardian/references/owasp-prevention.md +135 -135
- package/skills/quality/secure-code-guardian/references/security-headers.md +133 -133
- package/skills/quality/secure-code-guardian/references/xss-csrf.md +157 -157
- package/skills/quality/security-reviewer/SKILL.md +103 -103
- package/skills/quality/security-reviewer/references/infrastructure-security.md +268 -268
- package/skills/quality/security-reviewer/references/penetration-testing.md +268 -268
- package/skills/quality/security-reviewer/references/report-template.md +170 -170
- package/skills/quality/security-reviewer/references/sast-tools.md +117 -117
- package/skills/quality/security-reviewer/references/secret-scanning.md +125 -125
- package/skills/quality/security-reviewer/references/vulnerability-patterns.md +152 -152
- package/skills/quality/senior-qa/README.md +196 -196
- package/skills/quality/senior-qa/SKILL.md +399 -399
- package/skills/quality/senior-qa/references/qa_best_practices.md +964 -964
- package/skills/quality/senior-qa/references/test_automation_patterns.md +1009 -1009
- package/skills/quality/senior-qa/references/testing_strategies.md +649 -649
- package/skills/quality/senior-qa/scripts/coverage_analyzer.py +836 -836
- package/skills/quality/senior-qa/scripts/e2e_test_scaffolder.py +820 -820
- package/skills/quality/senior-qa/scripts/test_suite_generator.py +605 -605
- package/skills/quality/tdd-guide/HOW_TO_USE.md +313 -313
- package/skills/quality/tdd-guide/README.md +680 -680
- package/skills/quality/tdd-guide/SKILL.md +122 -122
- package/skills/quality/tdd-guide/assets/expected_output.json +77 -77
- package/skills/quality/tdd-guide/assets/sample_input_python.json +39 -39
- package/skills/quality/tdd-guide/assets/sample_input_typescript.json +36 -36
- package/skills/quality/tdd-guide/references/ci-integration.md +195 -195
- package/skills/quality/tdd-guide/references/framework-guide.md +206 -206
- package/skills/quality/tdd-guide/references/tdd-best-practices.md +128 -128
- package/skills/quality/tdd-guide/scripts/coverage_analyzer.py +434 -434
- package/skills/quality/tdd-guide/scripts/fixture_generator.py +440 -440
- package/skills/quality/tdd-guide/scripts/format_detector.py +384 -384
- package/skills/quality/tdd-guide/scripts/framework_adapter.py +428 -428
- package/skills/quality/tdd-guide/scripts/metrics_calculator.py +456 -456
- package/skills/quality/tdd-guide/scripts/output_formatter.py +354 -354
- package/skills/quality/tdd-guide/scripts/tdd_workflow.py +474 -474
- package/skills/quality/tdd-guide/scripts/test_generator.py +438 -438
- package/skills/quality/test-master/SKILL.md +94 -94
- package/skills/quality/test-master/references/automation-frameworks.md +294 -294
- package/skills/quality/test-master/references/e2e-testing.md +128 -128
- package/skills/quality/test-master/references/integration-testing.md +120 -120
- package/skills/quality/test-master/references/performance-testing.md +118 -118
- package/skills/quality/test-master/references/qa-methodology.md +247 -247
- package/skills/quality/test-master/references/security-testing.md +127 -127
- package/skills/quality/test-master/references/tdd-iron-laws.md +174 -174
- package/skills/quality/test-master/references/test-reports.md +104 -104
- package/skills/quality/test-master/references/testing-anti-patterns.md +231 -231
- package/skills/quality/test-master/references/unit-testing.md +113 -113
- package/skills/ruby/rails-expert/SKILL.md +154 -154
- package/skills/ruby/rails-expert/references/active-record.md +244 -244
- package/skills/ruby/rails-expert/references/api-development.md +401 -401
- package/skills/ruby/rails-expert/references/background-jobs.md +272 -272
- package/skills/ruby/rails-expert/references/hotwire-turbo.md +228 -228
- package/skills/ruby/rails-expert/references/rspec-testing.md +367 -367
- package/skills/swift/swift-expert/SKILL.md +163 -163
- package/skills/swift/swift-expert/references/async-concurrency.md +360 -360
- package/skills/swift/swift-expert/references/memory-performance.md +377 -377
- package/skills/swift/swift-expert/references/protocol-oriented.md +354 -354
- package/skills/swift/swift-expert/references/swiftui-patterns.md +291 -291
- package/skills/swift/swift-expert/references/testing-patterns.md +399 -399
- package/skills/workflow/brainstorming/SKILL.md +164 -164
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -214
- package/skills/workflow/brainstorming/scripts/helper.js +88 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/workflow/brainstorming/visual-companion.md +287 -287
- package/skills/workflow/documentation/SKILL.md +45 -45
- package/skills/workflow/entropy-management/SKILL.md +115 -115
- package/skills/workflow/executing-plans/SKILL.md +70 -70
- package/skills/workflow/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/workflow/receiving-code-review/SKILL.md +213 -213
- package/skills/workflow/requesting-code-review/SKILL.md +105 -105
- package/skills/workflow/requesting-code-review/code-reviewer.md +146 -146
- package/skills/workflow/requirement-engineering/SKILL.md +111 -111
- package/skills/workflow/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/workflow/systematic-debugging/SKILL.md +296 -296
- package/skills/workflow/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/workflow/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/workflow/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/workflow/systematic-debugging/find-polluter.sh +63 -63
- package/skills/workflow/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/workflow/systematic-debugging/test-academic.md +14 -14
- package/skills/workflow/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/workflow/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/workflow/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/workflow/using-git-worktrees/SKILL.md +218 -218
- package/skills/workflow/verification-before-completion/SKILL.md +139 -139
- package/skills/workflow/writing-plans/SKILL.md +151 -151
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/workflow/writing-skills/SKILL.md +655 -655
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -187
- package/skills/workflow/writing-skills/render-graphs.js +168 -168
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -384
|
@@ -1,191 +1,191 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: secure-code-guardian
|
|
3
|
-
description: Use when implementing authentication/authorization, securing user input, or preventing OWASP Top 10 vulnerabilities — including custom security implementations such as hashing passwords with bcrypt/argon2, sanitizing SQL queries with parameterized statements, configuring CORS/CSP headers, validating input with Zod, and setting up JWT tokens. Invoke for authentication, authorization, input validation, encryption, OWASP Top 10 prevention, secure session management, and security hardening. For pre-built OAuth/SSO integrations or standalone security audits, consider a more specialized skill.
|
|
4
|
-
license: MIT
|
|
5
|
-
metadata:
|
|
6
|
-
author: https://github.com/Jeffallan
|
|
7
|
-
version: "1.1.0"
|
|
8
|
-
domain: security
|
|
9
|
-
triggers: security, authentication, authorization, encryption, OWASP, vulnerability, secure coding, password, JWT, OAuth
|
|
10
|
-
role: specialist
|
|
11
|
-
scope: implementation
|
|
12
|
-
output-format: code
|
|
13
|
-
related-skills: fullstack-guardian, security-reviewer, architecture-designer
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# Secure Code Guardian
|
|
17
|
-
|
|
18
|
-
## Core Workflow
|
|
19
|
-
|
|
20
|
-
1. **Threat model** — Identify attack surface and threats
|
|
21
|
-
2. **Design** — Plan security controls
|
|
22
|
-
3. **Implement** — Write secure code with defense in depth; see code examples below
|
|
23
|
-
4. **Validate** — Test security controls with explicit checkpoints (see below)
|
|
24
|
-
5. **Document** — Record security decisions
|
|
25
|
-
|
|
26
|
-
### Validation Checkpoints
|
|
27
|
-
|
|
28
|
-
After each implementation step, verify:
|
|
29
|
-
|
|
30
|
-
- **Authentication**: Test brute-force protection (lockout/rate limit triggers), session fixation resistance, token expiration, and invalid-credential error messages (must not leak user existence).
|
|
31
|
-
- **Authorization**: Verify horizontal and vertical privilege escalation paths are blocked; test with tokens belonging to different roles/users.
|
|
32
|
-
- **Input handling**: Confirm SQL injection payloads (`' OR 1=1--`) are rejected; confirm XSS payloads (`<script>alert(1)</script>`) are escaped or rejected.
|
|
33
|
-
- **Headers/CORS**: Validate with a security scanner (e.g., `curl -I`, Mozilla Observatory) that security headers are present and CORS origin allowlist is correct.
|
|
34
|
-
|
|
35
|
-
## Reference Guide
|
|
36
|
-
|
|
37
|
-
Load detailed guidance based on context:
|
|
38
|
-
|
|
39
|
-
| Topic | Reference | Load When |
|
|
40
|
-
|-------|-----------|-----------|
|
|
41
|
-
| OWASP | `references/owasp-prevention.md` | OWASP Top 10 patterns |
|
|
42
|
-
| Authentication | `references/authentication.md` | Password hashing, JWT |
|
|
43
|
-
| Input Validation | `references/input-validation.md` | Zod, SQL injection |
|
|
44
|
-
| XSS/CSRF | `references/xss-csrf.md` | XSS prevention, CSRF |
|
|
45
|
-
| Headers | `references/security-headers.md` | Helmet, rate limiting |
|
|
46
|
-
|
|
47
|
-
## Constraints
|
|
48
|
-
|
|
49
|
-
### MUST DO
|
|
50
|
-
- Hash passwords with bcrypt/argon2 (never MD5/SHA-1/unsalted hashes)
|
|
51
|
-
- Use parameterized queries (never string-interpolated SQL)
|
|
52
|
-
- Validate and sanitize all user input before use
|
|
53
|
-
- Implement rate limiting on auth endpoints
|
|
54
|
-
- Set security headers (CSP, HSTS, X-Frame-Options)
|
|
55
|
-
- Log security events (failed auth, privilege escalation attempts)
|
|
56
|
-
- Store secrets in environment variables or secret managers (never in source code)
|
|
57
|
-
|
|
58
|
-
### MUST NOT DO
|
|
59
|
-
- Store passwords in plaintext or reversibly encrypted form
|
|
60
|
-
- Trust user input without validation
|
|
61
|
-
- Expose sensitive data in logs or error responses
|
|
62
|
-
- Use weak or deprecated algorithms (MD5, SHA-1, DES, ECB mode)
|
|
63
|
-
- Hardcode secrets or credentials in code
|
|
64
|
-
|
|
65
|
-
## Code Examples
|
|
66
|
-
|
|
67
|
-
### Password Hashing (bcrypt)
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
import bcrypt from 'bcrypt';
|
|
71
|
-
|
|
72
|
-
const SALT_ROUNDS = 12; // minimum 10; 12 balances security and performance
|
|
73
|
-
|
|
74
|
-
export async function hashPassword(plaintext: string): Promise<string> {
|
|
75
|
-
return bcrypt.hash(plaintext, SALT_ROUNDS);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export async function verifyPassword(plaintext: string, hash: string): Promise<boolean> {
|
|
79
|
-
return bcrypt.compare(plaintext, hash);
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Parameterized SQL Query (Node.js / pg)
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
// NEVER: `SELECT * FROM users WHERE email = '${email}'`
|
|
87
|
-
// ALWAYS: use positional parameters
|
|
88
|
-
import { Pool } from 'pg';
|
|
89
|
-
const pool = new Pool();
|
|
90
|
-
|
|
91
|
-
export async function getUserByEmail(email: string) {
|
|
92
|
-
const { rows } = await pool.query(
|
|
93
|
-
'SELECT id, email, role FROM users WHERE email = $1',
|
|
94
|
-
[email] // value passed separately — never interpolated
|
|
95
|
-
);
|
|
96
|
-
return rows[0] ?? null;
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Input Validation with Zod
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
import { z } from 'zod';
|
|
104
|
-
|
|
105
|
-
const LoginSchema = z.object({
|
|
106
|
-
email: z.string().email().max(254),
|
|
107
|
-
password: z.string().min(8).max(128),
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
export function validateLoginInput(raw: unknown) {
|
|
111
|
-
const result = LoginSchema.safeParse(raw);
|
|
112
|
-
if (!result.success) {
|
|
113
|
-
// Return generic error — never echo raw input back
|
|
114
|
-
throw new Error('Invalid credentials format');
|
|
115
|
-
}
|
|
116
|
-
return result.data;
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### JWT Validation
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
import jwt from 'jsonwebtoken';
|
|
124
|
-
|
|
125
|
-
const JWT_SECRET = process.env.JWT_SECRET!; // never hardcode
|
|
126
|
-
|
|
127
|
-
export function verifyToken(token: string): jwt.JwtPayload {
|
|
128
|
-
// Throws if expired, tampered, or wrong algorithm
|
|
129
|
-
const payload = jwt.verify(token, JWT_SECRET, {
|
|
130
|
-
algorithms: ['HS256'], // explicitly allowlist algorithm
|
|
131
|
-
issuer: 'your-app',
|
|
132
|
-
audience: 'your-app',
|
|
133
|
-
});
|
|
134
|
-
if (typeof payload === 'string') throw new Error('Invalid token payload');
|
|
135
|
-
return payload;
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Securing an Endpoint — Full Flow
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
import express from 'express';
|
|
143
|
-
import rateLimit from 'express-rate-limit';
|
|
144
|
-
import helmet from 'helmet';
|
|
145
|
-
|
|
146
|
-
const app = express();
|
|
147
|
-
app.use(helmet()); // sets CSP, HSTS, X-Frame-Options, etc.
|
|
148
|
-
app.use(express.json({ limit: '10kb' })); // limit payload size
|
|
149
|
-
|
|
150
|
-
const authLimiter = rateLimit({
|
|
151
|
-
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
152
|
-
max: 10, // 10 attempts per window per IP
|
|
153
|
-
standardHeaders: true,
|
|
154
|
-
legacyHeaders: false,
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
app.post('/api/login', authLimiter, async (req, res) => {
|
|
158
|
-
// 1. Validate input
|
|
159
|
-
const { email, password } = validateLoginInput(req.body);
|
|
160
|
-
|
|
161
|
-
// 2. Authenticate — parameterized query, constant-time compare
|
|
162
|
-
const user = await getUserByEmail(email);
|
|
163
|
-
if (!user || !(await verifyPassword(password, user.passwordHash))) {
|
|
164
|
-
// Generic message — do not reveal whether email exists
|
|
165
|
-
return res.status(401).json({ error: 'Invalid credentials' });
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// 3. Authorize — issue scoped, short-lived token
|
|
169
|
-
const token = jwt.sign(
|
|
170
|
-
{ sub: user.id, role: user.role },
|
|
171
|
-
JWT_SECRET,
|
|
172
|
-
{ algorithm: 'HS256', expiresIn: '15m', issuer: 'your-app', audience: 'your-app' }
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
// 4. Secure response — token in httpOnly cookie, not body
|
|
176
|
-
res.cookie('token', token, { httpOnly: true, secure: true, sameSite: 'strict' });
|
|
177
|
-
return res.json({ message: 'Authenticated' });
|
|
178
|
-
});
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## Output Templates
|
|
182
|
-
|
|
183
|
-
When implementing security features, provide:
|
|
184
|
-
1. Secure implementation code
|
|
185
|
-
2. Security considerations noted
|
|
186
|
-
3. Configuration requirements (env vars, headers)
|
|
187
|
-
4. Testing recommendations
|
|
188
|
-
|
|
189
|
-
## Knowledge Reference
|
|
190
|
-
|
|
191
|
-
OWASP Top 10, bcrypt/argon2, JWT, OAuth 2.0, OIDC, CSP, CORS, rate limiting, input validation, output encoding, encryption (AES, RSA), TLS, security headers
|
|
1
|
+
---
|
|
2
|
+
name: secure-code-guardian
|
|
3
|
+
description: Use when implementing authentication/authorization, securing user input, or preventing OWASP Top 10 vulnerabilities — including custom security implementations such as hashing passwords with bcrypt/argon2, sanitizing SQL queries with parameterized statements, configuring CORS/CSP headers, validating input with Zod, and setting up JWT tokens. Invoke for authentication, authorization, input validation, encryption, OWASP Top 10 prevention, secure session management, and security hardening. For pre-built OAuth/SSO integrations or standalone security audits, consider a more specialized skill.
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: https://github.com/Jeffallan
|
|
7
|
+
version: "1.1.0"
|
|
8
|
+
domain: security
|
|
9
|
+
triggers: security, authentication, authorization, encryption, OWASP, vulnerability, secure coding, password, JWT, OAuth
|
|
10
|
+
role: specialist
|
|
11
|
+
scope: implementation
|
|
12
|
+
output-format: code
|
|
13
|
+
related-skills: fullstack-guardian, security-reviewer, architecture-designer
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Secure Code Guardian
|
|
17
|
+
|
|
18
|
+
## Core Workflow
|
|
19
|
+
|
|
20
|
+
1. **Threat model** — Identify attack surface and threats
|
|
21
|
+
2. **Design** — Plan security controls
|
|
22
|
+
3. **Implement** — Write secure code with defense in depth; see code examples below
|
|
23
|
+
4. **Validate** — Test security controls with explicit checkpoints (see below)
|
|
24
|
+
5. **Document** — Record security decisions
|
|
25
|
+
|
|
26
|
+
### Validation Checkpoints
|
|
27
|
+
|
|
28
|
+
After each implementation step, verify:
|
|
29
|
+
|
|
30
|
+
- **Authentication**: Test brute-force protection (lockout/rate limit triggers), session fixation resistance, token expiration, and invalid-credential error messages (must not leak user existence).
|
|
31
|
+
- **Authorization**: Verify horizontal and vertical privilege escalation paths are blocked; test with tokens belonging to different roles/users.
|
|
32
|
+
- **Input handling**: Confirm SQL injection payloads (`' OR 1=1--`) are rejected; confirm XSS payloads (`<script>alert(1)</script>`) are escaped or rejected.
|
|
33
|
+
- **Headers/CORS**: Validate with a security scanner (e.g., `curl -I`, Mozilla Observatory) that security headers are present and CORS origin allowlist is correct.
|
|
34
|
+
|
|
35
|
+
## Reference Guide
|
|
36
|
+
|
|
37
|
+
Load detailed guidance based on context:
|
|
38
|
+
|
|
39
|
+
| Topic | Reference | Load When |
|
|
40
|
+
|-------|-----------|-----------|
|
|
41
|
+
| OWASP | `references/owasp-prevention.md` | OWASP Top 10 patterns |
|
|
42
|
+
| Authentication | `references/authentication.md` | Password hashing, JWT |
|
|
43
|
+
| Input Validation | `references/input-validation.md` | Zod, SQL injection |
|
|
44
|
+
| XSS/CSRF | `references/xss-csrf.md` | XSS prevention, CSRF |
|
|
45
|
+
| Headers | `references/security-headers.md` | Helmet, rate limiting |
|
|
46
|
+
|
|
47
|
+
## Constraints
|
|
48
|
+
|
|
49
|
+
### MUST DO
|
|
50
|
+
- Hash passwords with bcrypt/argon2 (never MD5/SHA-1/unsalted hashes)
|
|
51
|
+
- Use parameterized queries (never string-interpolated SQL)
|
|
52
|
+
- Validate and sanitize all user input before use
|
|
53
|
+
- Implement rate limiting on auth endpoints
|
|
54
|
+
- Set security headers (CSP, HSTS, X-Frame-Options)
|
|
55
|
+
- Log security events (failed auth, privilege escalation attempts)
|
|
56
|
+
- Store secrets in environment variables or secret managers (never in source code)
|
|
57
|
+
|
|
58
|
+
### MUST NOT DO
|
|
59
|
+
- Store passwords in plaintext or reversibly encrypted form
|
|
60
|
+
- Trust user input without validation
|
|
61
|
+
- Expose sensitive data in logs or error responses
|
|
62
|
+
- Use weak or deprecated algorithms (MD5, SHA-1, DES, ECB mode)
|
|
63
|
+
- Hardcode secrets or credentials in code
|
|
64
|
+
|
|
65
|
+
## Code Examples
|
|
66
|
+
|
|
67
|
+
### Password Hashing (bcrypt)
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import bcrypt from 'bcrypt';
|
|
71
|
+
|
|
72
|
+
const SALT_ROUNDS = 12; // minimum 10; 12 balances security and performance
|
|
73
|
+
|
|
74
|
+
export async function hashPassword(plaintext: string): Promise<string> {
|
|
75
|
+
return bcrypt.hash(plaintext, SALT_ROUNDS);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export async function verifyPassword(plaintext: string, hash: string): Promise<boolean> {
|
|
79
|
+
return bcrypt.compare(plaintext, hash);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Parameterized SQL Query (Node.js / pg)
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// NEVER: `SELECT * FROM users WHERE email = '${email}'`
|
|
87
|
+
// ALWAYS: use positional parameters
|
|
88
|
+
import { Pool } from 'pg';
|
|
89
|
+
const pool = new Pool();
|
|
90
|
+
|
|
91
|
+
export async function getUserByEmail(email: string) {
|
|
92
|
+
const { rows } = await pool.query(
|
|
93
|
+
'SELECT id, email, role FROM users WHERE email = $1',
|
|
94
|
+
[email] // value passed separately — never interpolated
|
|
95
|
+
);
|
|
96
|
+
return rows[0] ?? null;
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Input Validation with Zod
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import { z } from 'zod';
|
|
104
|
+
|
|
105
|
+
const LoginSchema = z.object({
|
|
106
|
+
email: z.string().email().max(254),
|
|
107
|
+
password: z.string().min(8).max(128),
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
export function validateLoginInput(raw: unknown) {
|
|
111
|
+
const result = LoginSchema.safeParse(raw);
|
|
112
|
+
if (!result.success) {
|
|
113
|
+
// Return generic error — never echo raw input back
|
|
114
|
+
throw new Error('Invalid credentials format');
|
|
115
|
+
}
|
|
116
|
+
return result.data;
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### JWT Validation
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import jwt from 'jsonwebtoken';
|
|
124
|
+
|
|
125
|
+
const JWT_SECRET = process.env.JWT_SECRET!; // never hardcode
|
|
126
|
+
|
|
127
|
+
export function verifyToken(token: string): jwt.JwtPayload {
|
|
128
|
+
// Throws if expired, tampered, or wrong algorithm
|
|
129
|
+
const payload = jwt.verify(token, JWT_SECRET, {
|
|
130
|
+
algorithms: ['HS256'], // explicitly allowlist algorithm
|
|
131
|
+
issuer: 'your-app',
|
|
132
|
+
audience: 'your-app',
|
|
133
|
+
});
|
|
134
|
+
if (typeof payload === 'string') throw new Error('Invalid token payload');
|
|
135
|
+
return payload;
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Securing an Endpoint — Full Flow
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import express from 'express';
|
|
143
|
+
import rateLimit from 'express-rate-limit';
|
|
144
|
+
import helmet from 'helmet';
|
|
145
|
+
|
|
146
|
+
const app = express();
|
|
147
|
+
app.use(helmet()); // sets CSP, HSTS, X-Frame-Options, etc.
|
|
148
|
+
app.use(express.json({ limit: '10kb' })); // limit payload size
|
|
149
|
+
|
|
150
|
+
const authLimiter = rateLimit({
|
|
151
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
152
|
+
max: 10, // 10 attempts per window per IP
|
|
153
|
+
standardHeaders: true,
|
|
154
|
+
legacyHeaders: false,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
app.post('/api/login', authLimiter, async (req, res) => {
|
|
158
|
+
// 1. Validate input
|
|
159
|
+
const { email, password } = validateLoginInput(req.body);
|
|
160
|
+
|
|
161
|
+
// 2. Authenticate — parameterized query, constant-time compare
|
|
162
|
+
const user = await getUserByEmail(email);
|
|
163
|
+
if (!user || !(await verifyPassword(password, user.passwordHash))) {
|
|
164
|
+
// Generic message — do not reveal whether email exists
|
|
165
|
+
return res.status(401).json({ error: 'Invalid credentials' });
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 3. Authorize — issue scoped, short-lived token
|
|
169
|
+
const token = jwt.sign(
|
|
170
|
+
{ sub: user.id, role: user.role },
|
|
171
|
+
JWT_SECRET,
|
|
172
|
+
{ algorithm: 'HS256', expiresIn: '15m', issuer: 'your-app', audience: 'your-app' }
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
// 4. Secure response — token in httpOnly cookie, not body
|
|
176
|
+
res.cookie('token', token, { httpOnly: true, secure: true, sameSite: 'strict' });
|
|
177
|
+
return res.json({ message: 'Authenticated' });
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Output Templates
|
|
182
|
+
|
|
183
|
+
When implementing security features, provide:
|
|
184
|
+
1. Secure implementation code
|
|
185
|
+
2. Security considerations noted
|
|
186
|
+
3. Configuration requirements (env vars, headers)
|
|
187
|
+
4. Testing recommendations
|
|
188
|
+
|
|
189
|
+
## Knowledge Reference
|
|
190
|
+
|
|
191
|
+
OWASP Top 10, bcrypt/argon2, JWT, OAuth 2.0, OIDC, CSP, CORS, rate limiting, input validation, output encoding, encryption (AES, RSA), TLS, security headers
|
|
@@ -1,136 +1,136 @@
|
|
|
1
|
-
# Authentication
|
|
2
|
-
|
|
3
|
-
## Password Hashing
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import bcrypt from 'bcrypt';
|
|
7
|
-
|
|
8
|
-
const SALT_ROUNDS = 12;
|
|
9
|
-
|
|
10
|
-
async function hashPassword(password: string): Promise<string> {
|
|
11
|
-
return bcrypt.hash(password, SALT_ROUNDS);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
async function verifyPassword(password: string, hash: string): Promise<boolean> {
|
|
15
|
-
return bcrypt.compare(password, hash);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Password requirements
|
|
19
|
-
const PASSWORD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$/;
|
|
20
|
-
|
|
21
|
-
function validatePassword(password: string): { valid: boolean; errors: string[] } {
|
|
22
|
-
const errors: string[] = [];
|
|
23
|
-
|
|
24
|
-
if (password.length < 12) errors.push('Minimum 12 characters');
|
|
25
|
-
if (!/[a-z]/.test(password)) errors.push('Requires lowercase');
|
|
26
|
-
if (!/[A-Z]/.test(password)) errors.push('Requires uppercase');
|
|
27
|
-
if (!/\d/.test(password)) errors.push('Requires digit');
|
|
28
|
-
if (!/[@$!%*?&]/.test(password)) errors.push('Requires special character');
|
|
29
|
-
|
|
30
|
-
return { valid: errors.length === 0, errors };
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## JWT Implementation
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
import jwt from 'jsonwebtoken';
|
|
38
|
-
|
|
39
|
-
const JWT_SECRET = process.env.JWT_SECRET!;
|
|
40
|
-
const ACCESS_TOKEN_EXPIRY = '15m';
|
|
41
|
-
const REFRESH_TOKEN_EXPIRY = '7d';
|
|
42
|
-
|
|
43
|
-
interface TokenPayload {
|
|
44
|
-
sub: string;
|
|
45
|
-
type: 'access' | 'refresh';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function generateAccessToken(userId: string): string {
|
|
49
|
-
return jwt.sign(
|
|
50
|
-
{ sub: userId, type: 'access' },
|
|
51
|
-
JWT_SECRET,
|
|
52
|
-
{ expiresIn: ACCESS_TOKEN_EXPIRY }
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function generateRefreshToken(userId: string): string {
|
|
57
|
-
return jwt.sign(
|
|
58
|
-
{ sub: userId, type: 'refresh' },
|
|
59
|
-
JWT_SECRET,
|
|
60
|
-
{ expiresIn: REFRESH_TOKEN_EXPIRY }
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function verifyToken(token: string): TokenPayload {
|
|
65
|
-
return jwt.verify(token, JWT_SECRET) as TokenPayload;
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Auth Middleware
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
function authMiddleware(req: Request, res: Response, next: NextFunction) {
|
|
73
|
-
const header = req.headers.authorization;
|
|
74
|
-
|
|
75
|
-
if (!header?.startsWith('Bearer ')) {
|
|
76
|
-
return res.status(401).json({ error: 'Missing token' });
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
const token = header.slice(7);
|
|
81
|
-
const payload = verifyToken(token);
|
|
82
|
-
|
|
83
|
-
if (payload.type !== 'access') {
|
|
84
|
-
return res.status(401).json({ error: 'Invalid token type' });
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
req.userId = payload.sub;
|
|
88
|
-
next();
|
|
89
|
-
} catch (error) {
|
|
90
|
-
if (error instanceof jwt.TokenExpiredError) {
|
|
91
|
-
return res.status(401).json({ error: 'Token expired' });
|
|
92
|
-
}
|
|
93
|
-
return res.status(401).json({ error: 'Invalid token' });
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Account Lockout
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
const MAX_ATTEMPTS = 5;
|
|
102
|
-
const LOCKOUT_DURATION = 15 * 60 * 1000; // 15 minutes
|
|
103
|
-
|
|
104
|
-
async function handleLoginAttempt(email: string, success: boolean) {
|
|
105
|
-
const key = `login:attempts:${email}`;
|
|
106
|
-
|
|
107
|
-
if (success) {
|
|
108
|
-
await redis.del(key);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const attempts = await redis.incr(key);
|
|
113
|
-
await redis.expire(key, LOCKOUT_DURATION / 1000);
|
|
114
|
-
|
|
115
|
-
if (attempts >= MAX_ATTEMPTS) {
|
|
116
|
-
await redis.set(`login:locked:${email}`, '1', 'PX', LOCKOUT_DURATION);
|
|
117
|
-
throw new Error('Account locked. Try again later.');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## Quick Reference
|
|
123
|
-
|
|
124
|
-
| Practice | Implementation |
|
|
125
|
-
|----------|----------------|
|
|
126
|
-
| Password hash | bcrypt (12+ rounds) |
|
|
127
|
-
| Token expiry | Access: 15m, Refresh: 7d |
|
|
128
|
-
| Lockout | 5 attempts, 15min lockout |
|
|
129
|
-
| MFA | TOTP (authenticator apps) |
|
|
130
|
-
|
|
131
|
-
| JWT Claim | Purpose |
|
|
132
|
-
|-----------|---------|
|
|
133
|
-
| `sub` | User ID |
|
|
134
|
-
| `exp` | Expiration |
|
|
135
|
-
| `iat` | Issued at |
|
|
136
|
-
| `type` | access/refresh |
|
|
1
|
+
# Authentication
|
|
2
|
+
|
|
3
|
+
## Password Hashing
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import bcrypt from 'bcrypt';
|
|
7
|
+
|
|
8
|
+
const SALT_ROUNDS = 12;
|
|
9
|
+
|
|
10
|
+
async function hashPassword(password: string): Promise<string> {
|
|
11
|
+
return bcrypt.hash(password, SALT_ROUNDS);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function verifyPassword(password: string, hash: string): Promise<boolean> {
|
|
15
|
+
return bcrypt.compare(password, hash);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Password requirements
|
|
19
|
+
const PASSWORD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$/;
|
|
20
|
+
|
|
21
|
+
function validatePassword(password: string): { valid: boolean; errors: string[] } {
|
|
22
|
+
const errors: string[] = [];
|
|
23
|
+
|
|
24
|
+
if (password.length < 12) errors.push('Minimum 12 characters');
|
|
25
|
+
if (!/[a-z]/.test(password)) errors.push('Requires lowercase');
|
|
26
|
+
if (!/[A-Z]/.test(password)) errors.push('Requires uppercase');
|
|
27
|
+
if (!/\d/.test(password)) errors.push('Requires digit');
|
|
28
|
+
if (!/[@$!%*?&]/.test(password)) errors.push('Requires special character');
|
|
29
|
+
|
|
30
|
+
return { valid: errors.length === 0, errors };
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## JWT Implementation
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import jwt from 'jsonwebtoken';
|
|
38
|
+
|
|
39
|
+
const JWT_SECRET = process.env.JWT_SECRET!;
|
|
40
|
+
const ACCESS_TOKEN_EXPIRY = '15m';
|
|
41
|
+
const REFRESH_TOKEN_EXPIRY = '7d';
|
|
42
|
+
|
|
43
|
+
interface TokenPayload {
|
|
44
|
+
sub: string;
|
|
45
|
+
type: 'access' | 'refresh';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function generateAccessToken(userId: string): string {
|
|
49
|
+
return jwt.sign(
|
|
50
|
+
{ sub: userId, type: 'access' },
|
|
51
|
+
JWT_SECRET,
|
|
52
|
+
{ expiresIn: ACCESS_TOKEN_EXPIRY }
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function generateRefreshToken(userId: string): string {
|
|
57
|
+
return jwt.sign(
|
|
58
|
+
{ sub: userId, type: 'refresh' },
|
|
59
|
+
JWT_SECRET,
|
|
60
|
+
{ expiresIn: REFRESH_TOKEN_EXPIRY }
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function verifyToken(token: string): TokenPayload {
|
|
65
|
+
return jwt.verify(token, JWT_SECRET) as TokenPayload;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Auth Middleware
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
function authMiddleware(req: Request, res: Response, next: NextFunction) {
|
|
73
|
+
const header = req.headers.authorization;
|
|
74
|
+
|
|
75
|
+
if (!header?.startsWith('Bearer ')) {
|
|
76
|
+
return res.status(401).json({ error: 'Missing token' });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
const token = header.slice(7);
|
|
81
|
+
const payload = verifyToken(token);
|
|
82
|
+
|
|
83
|
+
if (payload.type !== 'access') {
|
|
84
|
+
return res.status(401).json({ error: 'Invalid token type' });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
req.userId = payload.sub;
|
|
88
|
+
next();
|
|
89
|
+
} catch (error) {
|
|
90
|
+
if (error instanceof jwt.TokenExpiredError) {
|
|
91
|
+
return res.status(401).json({ error: 'Token expired' });
|
|
92
|
+
}
|
|
93
|
+
return res.status(401).json({ error: 'Invalid token' });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Account Lockout
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
const MAX_ATTEMPTS = 5;
|
|
102
|
+
const LOCKOUT_DURATION = 15 * 60 * 1000; // 15 minutes
|
|
103
|
+
|
|
104
|
+
async function handleLoginAttempt(email: string, success: boolean) {
|
|
105
|
+
const key = `login:attempts:${email}`;
|
|
106
|
+
|
|
107
|
+
if (success) {
|
|
108
|
+
await redis.del(key);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const attempts = await redis.incr(key);
|
|
113
|
+
await redis.expire(key, LOCKOUT_DURATION / 1000);
|
|
114
|
+
|
|
115
|
+
if (attempts >= MAX_ATTEMPTS) {
|
|
116
|
+
await redis.set(`login:locked:${email}`, '1', 'PX', LOCKOUT_DURATION);
|
|
117
|
+
throw new Error('Account locked. Try again later.');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Quick Reference
|
|
123
|
+
|
|
124
|
+
| Practice | Implementation |
|
|
125
|
+
|----------|----------------|
|
|
126
|
+
| Password hash | bcrypt (12+ rounds) |
|
|
127
|
+
| Token expiry | Access: 15m, Refresh: 7d |
|
|
128
|
+
| Lockout | 5 attempts, 15min lockout |
|
|
129
|
+
| MFA | TOTP (authenticator apps) |
|
|
130
|
+
|
|
131
|
+
| JWT Claim | Purpose |
|
|
132
|
+
|-----------|---------|
|
|
133
|
+
| `sub` | User ID |
|
|
134
|
+
| `exp` | Expiration |
|
|
135
|
+
| `iat` | Issued at |
|
|
136
|
+
| `type` | access/refresh |
|