@polymorphism-tech/morph-spec 4.12.0 → 4.13.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/README.md +21 -29
- package/bin/morph-spec.js +41 -24
- package/bin/task-manager.js +962 -1341
- package/bin/validate.js +1 -1
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +10 -11
- package/docs/QUICKSTART.md +15 -15
- package/framework/CLAUDE.md +5 -2
- package/framework/agents/README.md +3 -4
- package/framework/agents/ai-agents/ai-system-architect.md +6 -10
- package/framework/agents/architecture/seo-growth-hacker.md +166 -326
- package/framework/agents/architecture/standards-architect.md +21 -31
- package/framework/agents/backend/dotnet-senior.md +160 -86
- package/framework/agents/backend/ef-modeler.md +2 -6
- package/framework/agents/backend/hangfire-orchestrator.md +8 -9
- package/framework/agents/backend/ms-agent-expert.md +1 -1
- package/framework/agents/frontend/nextjs-expert.md +198 -133
- package/framework/agents/frontend/ui-ux-designer.md +226 -267
- package/framework/agents/infrastructure/infra-architect.md +191 -27
- package/framework/agents/integrations/clerk-auth.md +19 -26
- package/framework/agents/integrations/hangfire-integration.md +1 -4
- package/framework/agents.json +215 -1453
- package/framework/commands/morph-apply.md +4 -4
- package/framework/commands/morph-preflight.md +4 -26
- package/framework/commands/morph-proposal.md +19 -19
- package/framework/commands/morph-status.md +2 -2
- package/framework/commands/morph-troubleshoot.md +6 -13
- package/framework/hooks/README.md +1 -6
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
- package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
- package/framework/hooks/claude-code/statusline.py +4 -5
- package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
- package/framework/hooks/shared/compact-restore.js +28 -5
- package/framework/hooks/shared/phase-utils.js +4 -8
- package/framework/hooks/shared/state-reader.js +34 -3
- package/framework/phases.json +7 -45
- package/framework/rules/ai-agents-standards.md +15 -0
- package/framework/rules/asaas-standards.md +13 -0
- package/framework/rules/clerk-standards.md +13 -0
- package/framework/rules/csharp-standards.md +8 -4
- package/framework/rules/data-standards.md +18 -0
- package/framework/rules/dotnet-templates.md +87 -0
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/hangfire-standards.md +13 -0
- package/framework/rules/infrastructure-standards.md +27 -16
- package/framework/rules/morph-workflow.md +73 -13
- package/framework/rules/nextjs-standards.md +1 -0
- package/framework/rules/nextjs-templates.md +40 -0
- package/framework/rules/resend-standards.md +12 -0
- package/framework/rules/supabase-standards.md +29 -0
- package/framework/skills/README.md +6 -8
- package/framework/skills/level-0-meta/mcp-registry.json +21 -99
- package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
- package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
- package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
- package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
- package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
- package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
- package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
- package/framework/skills/level-1-workflows/README.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +58 -124
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
- package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -2
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/squad-templates/backend-only.json +6 -6
- package/framework/squad-templates/frontend-only.json +17 -8
- package/framework/squad-templates/full-stack.json +29 -24
- package/framework/standards/STANDARDS.json +1021 -2369
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
- package/framework/standards/backend/dotnet/result-pattern.md +213 -0
- package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
- package/framework/standards/backend/dotnet/scrutor.md +158 -0
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
- package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
- package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
- package/framework/standards/integration/mcp/mcp-tools.md +91 -77
- package/framework/templates/IDE-SNIPPETS.md +2 -6
- package/framework/templates/README.md +709 -814
- package/framework/templates/REGISTRY.json +223 -762
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
- package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
- package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
- package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
- package/framework/templates/code/dotnet/backend/repository.cs +148 -141
- package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
- package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
- package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
- package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
- package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
- package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
- package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
- package/framework/templates/code/dotnet/jobs/job.cs +21 -17
- package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
- package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
- package/framework/templates/code/dotnet/test.cs +192 -106
- package/framework/templates/context/ARCHITECTURE.md +89 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
- package/framework/templates/context/CONTEXT.md +180 -181
- package/framework/templates/context/design-system.md +1 -5
- package/framework/templates/docs/onboarding.md +2 -3
- package/framework/templates/docs/proposal.md +171 -182
- package/framework/templates/docs/spec.md +1 -3
- package/framework/templates/docs/ui-components.md +0 -72
- package/framework/templates/examples/design-system-examples.md +4 -4
- package/framework/templates/feature/decisions.md +0 -66
- package/framework/templates/feature/recap.md +1 -2
- package/framework/templates/infrastructure/github/README.md +56 -593
- package/framework/templates/integrations/clerk-config.cs +0 -41
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
- package/framework/templates/project/validate.js +2 -4
- package/framework/templates/ui/design-system.css +1 -1
- package/framework/workflows/README.md +8 -8
- package/framework/workflows/configs/fast-track.json +51 -0
- package/framework/workflows/configs/full.json +68 -0
- package/framework/workflows/configs/standard.json +7 -3
- package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
- package/framework/workflows/docs/enforcement-pipeline.md +18 -19
- package/framework/workflows/docs/full-morph.md +69 -76
- package/framework/workflows/docs/standard.md +49 -44
- package/framework/workflows/docs/ui-refresh.md +1 -1
- package/package.json +3 -3
- package/src/commands/agents/dispatch-agents.js +55 -116
- package/src/commands/context/context-refresh.js +79 -0
- package/src/commands/phase/phase-reset.js +1 -1
- package/src/commands/project/doctor.js +10 -32
- package/src/commands/project/init.js +12 -0
- package/src/commands/project/status.js +6 -12
- package/src/commands/scaffold/scaffold.js +131 -0
- package/src/commands/scope/escalate.js +1 -1
- package/src/commands/state/advance-phase.js +15 -29
- package/src/commands/state/state.js +20 -5
- package/src/commands/tasks/task.js +0 -30
- package/src/commands/validation/validate-feature.js +3 -10
- package/src/core/paths/output-schema.js +12 -13
- package/src/core/state/phase-state-machine.js +211 -217
- package/src/core/state/state-manager.js +9 -9
- package/src/lib/agents/agents-manager.js +2 -2
- package/src/lib/agents/output-collector.js +1 -2
- package/src/lib/detectors/design-system-detector.js +4 -4
- package/src/lib/detectors/index.js +1 -11
- package/src/lib/generators/architecture-scanner.js +640 -0
- package/src/lib/generators/context-generator.js +3 -3
- package/src/lib/generators/design-system-generator.js +508 -587
- package/src/lib/generators/index.js +12 -10
- package/src/lib/generators/metadata-extractor.js +386 -387
- package/src/lib/generators/recap-generator.js +4 -4
- package/src/lib/generators/scaffold-generator.js +317 -0
- package/src/lib/generators/settings-generator.js +0 -1
- package/src/lib/phase-chain/phase-validator.js +64 -42
- package/src/lib/stack/stack-profile.js +2 -2
- package/src/lib/standards/digest-builder.js +72 -285
- package/src/lib/tasks/task-parser.js +11 -5
- package/src/lib/validators/architecture/architecture-validator.js +259 -387
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/css/css-validator.js +340 -352
- package/src/lib/validators/packages/package-validator.js +347 -360
- package/src/lib/validators/shared/issue-counter.js +14 -18
- package/src/lib/validators/validation-runner.js +3 -19
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agents-installer.js +24 -3
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +11 -19
- package/src/utils/skills-installer.js +178 -178
- package/framework/agents/architecture/prompt-engineer.md +0 -195
- package/framework/agents/backend/api-designer.md +0 -106
- package/framework/agents/frontend/blazor-builder.md +0 -229
- package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
- package/framework/agents/infrastructure/azure-architect.md +0 -150
- package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
- package/framework/agents/infrastructure/bicep-architect.md +0 -132
- package/framework/agents/infrastructure/container-specialist.md +0 -137
- package/framework/agents/infrastructure/devops-engineer.md +0 -126
- package/framework/agents/integrations/azure-identity.md +0 -148
- package/framework/agents/quality/code-analyzer.md +0 -239
- package/framework/agents/quality/testing-specialist.md +0 -130
- package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
- package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
- package/framework/index/troubleshooting-index.json +0 -184
- package/framework/rules/testing-standards.md +0 -14
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
- package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
- package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
- package/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/framework/standards/architecture/ddd/entities.md +0 -99
- package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/framework/standards/backend/api/minimal-api.md +0 -494
- package/framework/standards/backend/api/rest.md +0 -492
- package/framework/standards/backend/authentication/passkeys.md +0 -428
- package/framework/standards/backend/database/ef-core.md +0 -199
- package/framework/standards/backend/database/migrations.md +0 -393
- package/framework/standards/backend/database/repository-patterns.md +0 -528
- package/framework/standards/backend/dotnet/async.md +0 -366
- package/framework/standards/backend/dotnet/core.md +0 -117
- package/framework/standards/backend/dotnet/di.md +0 -439
- package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/framework/standards/context/analytics.md +0 -96
- package/framework/standards/context/bundles.md +0 -110
- package/framework/standards/context/priming.md +0 -78
- package/framework/standards/core/architecture.md +0 -185
- package/framework/standards/core/coding.md +0 -214
- package/framework/standards/core/git-branching-strategy.md +0 -403
- package/framework/standards/core/git.md +0 -185
- package/framework/standards/core/testing.md +0 -295
- package/framework/standards/data/nosql/blob-storage.md +0 -102
- package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/framework/standards/frontend/blazor/state.md +0 -191
- package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
- package/framework/standards/frontend/design-system/design-trends.md +0 -171
- package/framework/standards/infrastructure/azure/azure.md +0 -624
- package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
- package/framework/standards/integration/api/graphql.md +0 -91
- package/framework/standards/integration/api/grpc.md +0 -114
- package/framework/standards/integration/api/rest-design.md +0 -95
- package/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/framework/standards/observability/logging.md +0 -131
- package/framework/standards/observability/metrics.md +0 -121
- package/framework/standards/observability/monitoring.md +0 -114
- package/framework/standards/observability/tracing.md +0 -132
- package/framework/standards/workflows/parallel-execution.md +0 -112
- package/framework/standards/workflows/thread-management.md +0 -113
- package/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/framework/templates/infrastructure/azure/README.md +0 -286
- package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/framework/templates/saas/subscription.cs +0 -347
- package/framework/templates/saas/tenant.cs +0 -338
- package/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/framework/templates/ui/MudTheme.cs +0 -281
- package/framework/workflows/configs/nodejs-cli.json +0 -40
- package/src/commands/standards/context-budget.js +0 -89
- package/src/lib/standards/index.js +0 -7
- package/src/lib/standards/standards-context-injector.js +0 -302
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
- package/src/lib/validators/blazor/blazor-validator.js +0 -369
- package/src/lib/validators/blazor/index.js +0 -9
|
@@ -1,2369 +1,1021 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "1.0.0",
|
|
3
|
-
"standards": [
|
|
4
|
-
{
|
|
5
|
-
"id": "ai-agents-
|
|
6
|
-
"name": "
|
|
7
|
-
"path": "ai-agents/
|
|
8
|
-
"category": "ai-agents",
|
|
9
|
-
"subcategory": null,
|
|
10
|
-
"tags": [
|
|
11
|
-
"ai-agents"
|
|
12
|
-
],
|
|
13
|
-
"aliases": [
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"agent
|
|
18
|
-
"
|
|
19
|
-
],
|
|
20
|
-
"anchors": {
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
},
|
|
25
|
-
"digest": "
|
|
26
|
-
"stacks": [
|
|
27
|
-
"
|
|
28
|
-
]
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"id": "ai-agents-
|
|
32
|
-
"name": "
|
|
33
|
-
"path": "ai-agents/
|
|
34
|
-
"category": "ai-agents",
|
|
35
|
-
"subcategory": null,
|
|
36
|
-
"tags": [
|
|
37
|
-
"ai-agents"
|
|
38
|
-
],
|
|
39
|
-
"aliases": [
|
|
40
|
-
"AI
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
],
|
|
46
|
-
"anchors": {
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
},
|
|
51
|
-
"digest": "
|
|
52
|
-
"stacks": [
|
|
53
|
-
"*"
|
|
54
|
-
]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"id": "ai-agents-
|
|
58
|
-
"name": "
|
|
59
|
-
"path": "ai-agents/
|
|
60
|
-
"category": "ai-agents",
|
|
61
|
-
"subcategory": null,
|
|
62
|
-
"tags": [
|
|
63
|
-
"ai-agents"
|
|
64
|
-
],
|
|
65
|
-
"aliases": [
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
],
|
|
72
|
-
"anchors": {
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
},
|
|
77
|
-
"digest": "
|
|
78
|
-
"stacks": [
|
|
79
|
-
"*"
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
"id": "
|
|
84
|
-
"name": "
|
|
85
|
-
"path": "
|
|
86
|
-
"category": "
|
|
87
|
-
"subcategory":
|
|
88
|
-
"tags": [
|
|
89
|
-
"
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
"
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
"
|
|
124
|
-
"
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
"
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
"
|
|
144
|
-
"
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
"
|
|
150
|
-
"
|
|
151
|
-
"
|
|
152
|
-
|
|
153
|
-
"
|
|
154
|
-
|
|
155
|
-
"
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
"
|
|
164
|
-
"
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
"
|
|
169
|
-
"
|
|
170
|
-
"
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
"
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
"
|
|
177
|
-
"
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
"
|
|
196
|
-
"
|
|
197
|
-
"
|
|
198
|
-
"
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
"
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
"
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
"
|
|
232
|
-
"
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
"
|
|
236
|
-
"
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
"
|
|
241
|
-
"
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
"
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
"
|
|
253
|
-
"
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
"
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
"
|
|
262
|
-
]
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
"
|
|
269
|
-
"
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
"
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
"
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
"
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
"
|
|
297
|
-
"
|
|
298
|
-
"
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
"
|
|
310
|
-
"
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
"
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
"
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
"
|
|
336
|
-
|
|
337
|
-
"
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
"
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
"
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
"
|
|
376
|
-
|
|
377
|
-
"
|
|
378
|
-
|
|
379
|
-
],
|
|
380
|
-
"
|
|
381
|
-
"
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
"
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
"
|
|
394
|
-
]
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
"
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
"
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
"
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
"
|
|
418
|
-
"
|
|
419
|
-
"
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
"
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
"
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
"
|
|
445
|
-
"
|
|
446
|
-
"
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
"
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
"
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
"
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
"
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
"
|
|
471
|
-
"
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
"
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
"
|
|
483
|
-
"
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
"
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
"
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
"
|
|
498
|
-
"
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
"
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
"
|
|
510
|
-
"
|
|
511
|
-
],
|
|
512
|
-
"
|
|
513
|
-
"
|
|
514
|
-
"
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
"
|
|
524
|
-
"
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
"
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
"
|
|
536
|
-
"
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
"
|
|
542
|
-
"
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
"
|
|
546
|
-
"
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
"
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
"
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
"
|
|
560
|
-
|
|
561
|
-
"
|
|
562
|
-
"
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
"
|
|
568
|
-
"
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
"
|
|
572
|
-
"
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
"
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
"
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
"
|
|
586
|
-
|
|
587
|
-
"
|
|
588
|
-
"
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
"
|
|
594
|
-
"
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
"
|
|
598
|
-
"
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
"
|
|
603
|
-
"
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
"
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
"
|
|
615
|
-
"
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
"
|
|
620
|
-
"
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
"
|
|
629
|
-
"
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
"
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
"
|
|
641
|
-
"
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
"
|
|
646
|
-
"
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
"
|
|
655
|
-
"
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
"
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
"
|
|
667
|
-
"
|
|
668
|
-
"
|
|
669
|
-
],
|
|
670
|
-
"
|
|
671
|
-
"
|
|
672
|
-
"
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
"
|
|
682
|
-
"
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
"
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
"
|
|
694
|
-
"
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
"
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
"
|
|
703
|
-
]
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
"
|
|
709
|
-
"
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
"
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
"
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
"
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
"
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
"
|
|
737
|
-
"
|
|
738
|
-
"
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
"
|
|
748
|
-
"
|
|
749
|
-
"
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
"
|
|
753
|
-
"
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
"
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
"
|
|
774
|
-
|
|
775
|
-
"
|
|
776
|
-
|
|
777
|
-
"
|
|
778
|
-
|
|
779
|
-
"
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
"
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
"
|
|
789
|
-
|
|
790
|
-
"
|
|
791
|
-
]
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
"
|
|
807
|
-
]
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
"
|
|
813
|
-
"
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
"
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
"
|
|
825
|
-
],
|
|
826
|
-
"
|
|
827
|
-
"
|
|
828
|
-
"
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
"
|
|
837
|
-
"
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
"
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
"
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
"
|
|
854
|
-
"
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
"
|
|
858
|
-
"
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
"
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
"
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
"
|
|
872
|
-
|
|
873
|
-
"
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
"
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
"
|
|
880
|
-
"
|
|
881
|
-
|
|
882
|
-
"
|
|
883
|
-
|
|
884
|
-
"
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
"
|
|
893
|
-
"
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
"
|
|
898
|
-
"
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
"
|
|
902
|
-
"
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
"
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
"
|
|
918
|
-
"
|
|
919
|
-
"
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
"
|
|
927
|
-
"
|
|
928
|
-
"
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
"
|
|
943
|
-
"
|
|
944
|
-
"
|
|
945
|
-
"
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
"
|
|
952
|
-
"
|
|
953
|
-
"
|
|
954
|
-
"
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
"
|
|
969
|
-
"
|
|
970
|
-
"
|
|
971
|
-
"
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
"
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
"
|
|
979
|
-
"
|
|
980
|
-
"
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
"
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
"
|
|
989
|
-
|
|
990
|
-
"
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
"
|
|
996
|
-
"
|
|
997
|
-
"
|
|
998
|
-
"
|
|
999
|
-
"
|
|
1000
|
-
|
|
1001
|
-
"
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
"
|
|
1007
|
-
"
|
|
1008
|
-
"
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
"
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
},
|
|
1023
|
-
{
|
|
1024
|
-
"id": "data-nosql-cosmos-db",
|
|
1025
|
-
"name": "cosmos db",
|
|
1026
|
-
"path": "data/nosql/cosmos-db.md",
|
|
1027
|
-
"category": "data",
|
|
1028
|
-
"subcategory": "nosql",
|
|
1029
|
-
"tags": [
|
|
1030
|
-
"data",
|
|
1031
|
-
"nosql"
|
|
1032
|
-
],
|
|
1033
|
-
"aliases": [
|
|
1034
|
-
"cosmos",
|
|
1035
|
-
"CosmosDB",
|
|
1036
|
-
"document database",
|
|
1037
|
-
"partition key",
|
|
1038
|
-
"RUs"
|
|
1039
|
-
],
|
|
1040
|
-
"anchors": {
|
|
1041
|
-
"modeling": "#document-modeling",
|
|
1042
|
-
"queries": "#query-patterns"
|
|
1043
|
-
},
|
|
1044
|
-
"digest": "Choose partition key with high cardinality for even distribution. Design documents for single-partition reads. Enable TTL for ephemeral data. Prefer point reads (O(1)) over cross-partition queries. Set provisioned throughput based on measured RUs. Use change feed for event-driven processing.",
|
|
1045
|
-
"stacks": [
|
|
1046
|
-
"dotnet",
|
|
1047
|
-
"azure"
|
|
1048
|
-
]
|
|
1049
|
-
},
|
|
1050
|
-
{
|
|
1051
|
-
"id": "data-vector-search-azure-ai-search",
|
|
1052
|
-
"name": "azure ai search",
|
|
1053
|
-
"path": "data/vector-search/azure-ai-search.md",
|
|
1054
|
-
"category": "data",
|
|
1055
|
-
"subcategory": "vector-search",
|
|
1056
|
-
"tags": [
|
|
1057
|
-
"data",
|
|
1058
|
-
"vector-search"
|
|
1059
|
-
],
|
|
1060
|
-
"aliases": [
|
|
1061
|
-
"Azure AI Search",
|
|
1062
|
-
"cognitive search",
|
|
1063
|
-
"vector search",
|
|
1064
|
-
"hybrid search",
|
|
1065
|
-
"semantic ranking"
|
|
1066
|
-
],
|
|
1067
|
-
"anchors": {
|
|
1068
|
-
"indexing": "#index-setup",
|
|
1069
|
-
"queries": "#search-queries"
|
|
1070
|
-
},
|
|
1071
|
-
"digest": "Create index with semantic configuration for hybrid search (keyword + vector). Batch index uploads (1000 docs/batch). Use OData filters for pre-filtering before vector search. Apply RRF fusion for hybrid ranking. Set up incremental indexing for updates. Add enrichment pipeline for PDFs/images.",
|
|
1072
|
-
"stacks": [
|
|
1073
|
-
"dotnet",
|
|
1074
|
-
"azure"
|
|
1075
|
-
]
|
|
1076
|
-
},
|
|
1077
|
-
{
|
|
1078
|
-
"id": "data-vector-search-rag-chunking",
|
|
1079
|
-
"name": "rag chunking",
|
|
1080
|
-
"path": "data/vector-search/rag-chunking.md",
|
|
1081
|
-
"category": "data",
|
|
1082
|
-
"subcategory": "vector-search",
|
|
1083
|
-
"tags": [
|
|
1084
|
-
"data",
|
|
1085
|
-
"vector-search"
|
|
1086
|
-
],
|
|
1087
|
-
"aliases": [
|
|
1088
|
-
"RAG chunking",
|
|
1089
|
-
"document chunking",
|
|
1090
|
-
"text splitting",
|
|
1091
|
-
"chunk overlap",
|
|
1092
|
-
"embedding chunks"
|
|
1093
|
-
],
|
|
1094
|
-
"anchors": {
|
|
1095
|
-
"strategies": "#chunking-strategies",
|
|
1096
|
-
"retrieval": "#retrieval-pipeline"
|
|
1097
|
-
},
|
|
1098
|
-
"digest": "Recursive character splitting: 512 token chunks, 50 token overlap. Embed with text-embedding-3-small (1536 dims). Store chunk + metadata (source, page, section). Retrieve top-k=5 by cosine similarity. Re-rank with cross-encoder before LLM injection. Evaluate retrieval quality with RAGAS.",
|
|
1099
|
-
"stacks": [
|
|
1100
|
-
"dotnet",
|
|
1101
|
-
"azure"
|
|
1102
|
-
]
|
|
1103
|
-
},
|
|
1104
|
-
{
|
|
1105
|
-
"id": "frontend-blazor-design-checklist",
|
|
1106
|
-
"name": "design checklist",
|
|
1107
|
-
"path": "frontend/blazor/design-checklist.md",
|
|
1108
|
-
"category": "frontend",
|
|
1109
|
-
"subcategory": "blazor",
|
|
1110
|
-
"tags": [
|
|
1111
|
-
"frontend",
|
|
1112
|
-
"blazor"
|
|
1113
|
-
],
|
|
1114
|
-
"aliases": [
|
|
1115
|
-
"blazor checklist",
|
|
1116
|
-
"blazor design review",
|
|
1117
|
-
"UI checklist",
|
|
1118
|
-
"component checklist"
|
|
1119
|
-
],
|
|
1120
|
-
"anchors": {
|
|
1121
|
-
"components": "#component-checklist",
|
|
1122
|
-
"accessibility": "#a11y-checklist"
|
|
1123
|
-
},
|
|
1124
|
-
"digest": "Every Blazor component must: use @inject not constructor injection, define loading and error states, implement IDisposable for event subscriptions, use CancellationToken for async ops. Fluent UI: use DataGrid not custom tables, FluentDialog for modals, FluentTooltip for hints. No hardcoded colors.",
|
|
1125
|
-
"stacks": [
|
|
1126
|
-
"blazor"
|
|
1127
|
-
]
|
|
1128
|
-
},
|
|
1129
|
-
{
|
|
1130
|
-
"id": "frontend-blazor-fluent-ui-setup",
|
|
1131
|
-
"name": "fluent ui setup",
|
|
1132
|
-
"path": "frontend/blazor/fluent-ui-setup.md",
|
|
1133
|
-
"category": "frontend",
|
|
1134
|
-
"subcategory": "blazor",
|
|
1135
|
-
"tags": [
|
|
1136
|
-
"frontend",
|
|
1137
|
-
"blazor"
|
|
1138
|
-
],
|
|
1139
|
-
"aliases": [
|
|
1140
|
-
"fluent ui setup",
|
|
1141
|
-
"blazor fluent",
|
|
1142
|
-
"Microsoft Fluent UI",
|
|
1143
|
-
"FluentUI install"
|
|
1144
|
-
],
|
|
1145
|
-
"anchors": {
|
|
1146
|
-
"setup": "#package-setup",
|
|
1147
|
-
"theme": "#theme-configuration"
|
|
1148
|
-
},
|
|
1149
|
-
"digest": "Install Microsoft.FluentUI.AspNetCore.Components. Register: builder.Services.AddFluentUIComponents(). Add <FluentDesignTheme> to MainLayout.razor. Install FluentIcons package separately. Set CachingEnabled=true for icons in production. Configure theme via --accent-color CSS variable in app.css.",
|
|
1150
|
-
"stacks": [
|
|
1151
|
-
"blazor"
|
|
1152
|
-
]
|
|
1153
|
-
},
|
|
1154
|
-
{
|
|
1155
|
-
"id": "frontend-blazor-fluent-ui",
|
|
1156
|
-
"name": "fluent ui",
|
|
1157
|
-
"path": "frontend/blazor/fluent-ui.md",
|
|
1158
|
-
"category": "frontend",
|
|
1159
|
-
"subcategory": "blazor",
|
|
1160
|
-
"tags": [
|
|
1161
|
-
"frontend",
|
|
1162
|
-
"blazor"
|
|
1163
|
-
],
|
|
1164
|
-
"aliases": [
|
|
1165
|
-
"fluent ui components",
|
|
1166
|
-
"FluentDataGrid",
|
|
1167
|
-
"FluentDialog",
|
|
1168
|
-
"FluentButton",
|
|
1169
|
-
"FluentCombobox"
|
|
1170
|
-
],
|
|
1171
|
-
"anchors": {
|
|
1172
|
-
"grid": "#data-grid",
|
|
1173
|
-
"forms": "#form-components"
|
|
1174
|
-
},
|
|
1175
|
-
"digest": "Use FluentDataGrid with virtualization for >100 rows. FluentDialog requires DialogService injection. FluentTextField uses @bind-Value. FluentCombobox with @bind-Value and TOption type param. Never mix FluentUI and MudBlazor in the same project. Use Appearance enum for button variants.",
|
|
1176
|
-
"stacks": [
|
|
1177
|
-
"blazor"
|
|
1178
|
-
]
|
|
1179
|
-
},
|
|
1180
|
-
{
|
|
1181
|
-
"id": "frontend-blazor-html-conversion",
|
|
1182
|
-
"name": "html conversion",
|
|
1183
|
-
"path": "frontend/blazor/html-conversion.md",
|
|
1184
|
-
"category": "frontend",
|
|
1185
|
-
"subcategory": "blazor",
|
|
1186
|
-
"tags": [
|
|
1187
|
-
"frontend",
|
|
1188
|
-
"blazor"
|
|
1189
|
-
],
|
|
1190
|
-
"aliases": [
|
|
1191
|
-
"html to blazor",
|
|
1192
|
-
"blazor migration",
|
|
1193
|
-
"html conversion",
|
|
1194
|
-
"razor conversion"
|
|
1195
|
-
],
|
|
1196
|
-
"anchors": {
|
|
1197
|
-
"mapping": "#html-to-blazor-mapping",
|
|
1198
|
-
"components": "#component-patterns"
|
|
1199
|
-
},
|
|
1200
|
-
"digest": "Convert <div> containers to <FluentStack> or <FluentGrid>. Replace <input> with FluentTextField/FluentCheckbox/FluentSelect. Convert <table> to FluentDataGrid. Replace class= with Class=. Event handlers: onclick → @onclick. Use CascadingValue for theme propagation. Blazor-specific: @ref, @key, @bind.",
|
|
1201
|
-
"stacks": [
|
|
1202
|
-
"blazor"
|
|
1203
|
-
]
|
|
1204
|
-
},
|
|
1205
|
-
{
|
|
1206
|
-
"id": "frontend-blazor-lifecycle",
|
|
1207
|
-
"name": "lifecycle",
|
|
1208
|
-
"path": "frontend/blazor/lifecycle.md",
|
|
1209
|
-
"category": "frontend",
|
|
1210
|
-
"subcategory": "blazor",
|
|
1211
|
-
"tags": [
|
|
1212
|
-
"frontend",
|
|
1213
|
-
"blazor"
|
|
1214
|
-
],
|
|
1215
|
-
"aliases": [
|
|
1216
|
-
"blazor lifecycle",
|
|
1217
|
-
"OnInitialized",
|
|
1218
|
-
"OnAfterRender",
|
|
1219
|
-
"StateHasChanged",
|
|
1220
|
-
"component lifecycle"
|
|
1221
|
-
],
|
|
1222
|
-
"anchors": {
|
|
1223
|
-
"hooks": "#lifecycle-hooks",
|
|
1224
|
-
"async": "#async-patterns"
|
|
1225
|
-
},
|
|
1226
|
-
"digest": "OnInitializedAsync for data loading (not constructor or OnInitialized). JSInterop only in OnAfterRenderAsync(firstRender:true). Dispose event subscriptions in IDisposable.Dispose(). Call StateHasChanged() after async state changes from non-UI threads. Cancel background work with CancellationTokenSource in Dispose().",
|
|
1227
|
-
"stacks": [
|
|
1228
|
-
"blazor"
|
|
1229
|
-
]
|
|
1230
|
-
},
|
|
1231
|
-
{
|
|
1232
|
-
"id": "frontend-blazor-pitfalls",
|
|
1233
|
-
"name": "pitfalls",
|
|
1234
|
-
"path": "frontend/blazor/pitfalls.md",
|
|
1235
|
-
"category": "frontend",
|
|
1236
|
-
"subcategory": "blazor",
|
|
1237
|
-
"tags": [
|
|
1238
|
-
"frontend",
|
|
1239
|
-
"blazor"
|
|
1240
|
-
],
|
|
1241
|
-
"aliases": [
|
|
1242
|
-
"blazor anti-patterns",
|
|
1243
|
-
"blazor mistakes",
|
|
1244
|
-
"blazor gotchas",
|
|
1245
|
-
"blazor bugs",
|
|
1246
|
-
"common errors"
|
|
1247
|
-
],
|
|
1248
|
-
"anchors": {
|
|
1249
|
-
"concurrency": "#concurrency-pitfalls",
|
|
1250
|
-
"memory": "#memory-leaks"
|
|
1251
|
-
},
|
|
1252
|
-
"digest": "Never inject DbContext directly — use IDbContextFactory. Avoid async void event handlers (use async Task). Route parameters need [Parameter] attribute. Use EventCallback<T> not Action<T> for parent-child callbacks. Dispose HttpClient connections, SignalR connections, and timers in IDisposable.",
|
|
1253
|
-
"stacks": [
|
|
1254
|
-
"blazor"
|
|
1255
|
-
]
|
|
1256
|
-
},
|
|
1257
|
-
{
|
|
1258
|
-
"id": "frontend-blazor-state",
|
|
1259
|
-
"name": "state",
|
|
1260
|
-
"path": "frontend/blazor/state.md",
|
|
1261
|
-
"category": "frontend",
|
|
1262
|
-
"subcategory": "blazor",
|
|
1263
|
-
"tags": [
|
|
1264
|
-
"frontend",
|
|
1265
|
-
"blazor"
|
|
1266
|
-
],
|
|
1267
|
-
"aliases": [
|
|
1268
|
-
"blazor state",
|
|
1269
|
-
"cascading value",
|
|
1270
|
-
"state container",
|
|
1271
|
-
"component state",
|
|
1272
|
-
"Fluxor"
|
|
1273
|
-
],
|
|
1274
|
-
"anchors": {
|
|
1275
|
-
"patterns": "#state-patterns",
|
|
1276
|
-
"sharing": "#state-sharing"
|
|
1277
|
-
},
|
|
1278
|
-
"digest": "CascadingParameter for app-wide state (auth, theme). Scoped services as state containers for per-user state. Local component state with private fields + StateHasChanged. Never store state in static fields — use DI. localStorage via IJSRuntime for persistence. Fluxor for complex state with multiple consumers.",
|
|
1279
|
-
"stacks": [
|
|
1280
|
-
"blazor"
|
|
1281
|
-
]
|
|
1282
|
-
},
|
|
1283
|
-
{
|
|
1284
|
-
"id": "frontend-design-system-aesthetic-direction",
|
|
1285
|
-
"name": "aesthetic direction",
|
|
1286
|
-
"path": "frontend/design-system/aesthetic-direction.md",
|
|
1287
|
-
"category": "frontend",
|
|
1288
|
-
"subcategory": "design-system",
|
|
1289
|
-
"tags": [
|
|
1290
|
-
"frontend",
|
|
1291
|
-
"design-system"
|
|
1292
|
-
],
|
|
1293
|
-
"aliases": [
|
|
1294
|
-
"aesthetic direction",
|
|
1295
|
-
"visual design",
|
|
1296
|
-
"brand identity",
|
|
1297
|
-
"design language",
|
|
1298
|
-
"design tone"
|
|
1299
|
-
],
|
|
1300
|
-
"anchors": {
|
|
1301
|
-
"principles": "#design-principles",
|
|
1302
|
-
"tokens": "#design-tokens"
|
|
1303
|
-
},
|
|
1304
|
-
"digest": "Define aesthetic direction before generating mockups: tone (professional/playful), density (compact/spacious), brand colors (primary, secondary, accent). Document in design-system.md. All UI decisions derive from aesthetic direction — never use arbitrary colors or spacing values.",
|
|
1305
|
-
"stacks": [
|
|
1306
|
-
"*"
|
|
1307
|
-
]
|
|
1308
|
-
},
|
|
1309
|
-
{
|
|
1310
|
-
"id": "frontend-design-system-animations",
|
|
1311
|
-
"name": "animations",
|
|
1312
|
-
"path": "frontend/design-system/animations.md",
|
|
1313
|
-
"category": "frontend",
|
|
1314
|
-
"subcategory": "design-system",
|
|
1315
|
-
"tags": [
|
|
1316
|
-
"frontend",
|
|
1317
|
-
"design-system"
|
|
1318
|
-
],
|
|
1319
|
-
"aliases": [
|
|
1320
|
-
"animations",
|
|
1321
|
-
"transitions",
|
|
1322
|
-
"motion",
|
|
1323
|
-
"CSS animations",
|
|
1324
|
-
"keyframes",
|
|
1325
|
-
"prefers-reduced-motion"
|
|
1326
|
-
],
|
|
1327
|
-
"anchors": {
|
|
1328
|
-
"tokens": "#animation-tokens",
|
|
1329
|
-
"principles": "#motion-principles"
|
|
1330
|
-
},
|
|
1331
|
-
"digest": "Use CSS custom properties for durations: --duration-fast (100ms), --duration-normal (200ms), --duration-slow (300ms). Prefer transform/opacity for GPU-accelerated animations. Always respect prefers-reduced-motion. No decorative animations over 300ms. Ease-out for entrances, ease-in for exits.",
|
|
1332
|
-
"stacks": [
|
|
1333
|
-
"*"
|
|
1334
|
-
]
|
|
1335
|
-
},
|
|
1336
|
-
{
|
|
1337
|
-
"id": "frontend-design-system-naming",
|
|
1338
|
-
"name": "naming",
|
|
1339
|
-
"path": "frontend/design-system/naming.md",
|
|
1340
|
-
"category": "frontend",
|
|
1341
|
-
"subcategory": "design-system",
|
|
1342
|
-
"tags": [
|
|
1343
|
-
"frontend",
|
|
1344
|
-
"design-system"
|
|
1345
|
-
],
|
|
1346
|
-
"aliases": [
|
|
1347
|
-
"BEM",
|
|
1348
|
-
"CSS naming",
|
|
1349
|
-
"class naming",
|
|
1350
|
-
"design token naming",
|
|
1351
|
-
"component naming"
|
|
1352
|
-
],
|
|
1353
|
-
"anchors": {
|
|
1354
|
-
"blocks": "#bem-blocks",
|
|
1355
|
-
"tokens": "#token-naming"
|
|
1356
|
-
},
|
|
1357
|
-
"digest": "BEM for CSS: .block__element--modifier. Design tokens: --color-primary-500, --spacing-4, --font-size-base. Component names PascalCase (Blazor) / kebab-case (CSS). No generic names (blue, big). Semantic names only: --color-action, --spacing-page-gutter. Tokens are the single source of truth.",
|
|
1358
|
-
"stacks": [
|
|
1359
|
-
"*"
|
|
1360
|
-
]
|
|
1361
|
-
},
|
|
1362
|
-
{
|
|
1363
|
-
"id": "frontend-design-system-design-trends",
|
|
1364
|
-
"name": "design trends",
|
|
1365
|
-
"path": "frontend/design-system/design-trends.md",
|
|
1366
|
-
"category": "frontend",
|
|
1367
|
-
"subcategory": "design-system",
|
|
1368
|
-
"tags": [
|
|
1369
|
-
"frontend",
|
|
1370
|
-
"design-system",
|
|
1371
|
-
"trends",
|
|
1372
|
-
"modern"
|
|
1373
|
-
],
|
|
1374
|
-
"aliases": [
|
|
1375
|
-
"design trends",
|
|
1376
|
-
"modern design",
|
|
1377
|
-
"ui trends",
|
|
1378
|
-
"visual trends",
|
|
1379
|
-
"design patterns"
|
|
1380
|
-
],
|
|
1381
|
-
"anchors": {
|
|
1382
|
-
"layout": "#layout-patterns",
|
|
1383
|
-
"effects": "#visual-effects",
|
|
1384
|
-
"typography": "#typography-techniques",
|
|
1385
|
-
"animation": "#animation-patterns",
|
|
1386
|
-
"dark-mode": "#dark-mode-patterns-dark-first"
|
|
1387
|
-
},
|
|
1388
|
-
"digest": "Curated catalog of modern design techniques (2025-2026). Agents consult during UI/UX phase Step 1.3 before choosing aesthetic direction. Covers: Bento Grid, Glassmorphism, Aurora Gradients, Variable Fonts, Scroll-driven Animations, Dark-first design, domain-specific patterns.",
|
|
1389
|
-
"stacks": [
|
|
1390
|
-
"*"
|
|
1391
|
-
]
|
|
1392
|
-
},
|
|
1393
|
-
{
|
|
1394
|
-
"id": "frontend-nextjs-app-router",
|
|
1395
|
-
"name": "app router",
|
|
1396
|
-
"path": "frontend/nextjs/app-router.md",
|
|
1397
|
-
"category": "frontend",
|
|
1398
|
-
"subcategory": "nextjs",
|
|
1399
|
-
"tags": [
|
|
1400
|
-
"frontend",
|
|
1401
|
-
"nextjs"
|
|
1402
|
-
],
|
|
1403
|
-
"aliases": [
|
|
1404
|
-
"app router",
|
|
1405
|
-
"Next.js 14",
|
|
1406
|
-
"server components",
|
|
1407
|
-
"app directory",
|
|
1408
|
-
"RSC"
|
|
1409
|
-
],
|
|
1410
|
-
"anchors": {
|
|
1411
|
-
"layout": "#layout-patterns",
|
|
1412
|
-
"routing": "#routing-patterns"
|
|
1413
|
-
},
|
|
1414
|
-
"digest": "Server Components by default — only add 'use client' when needed (interactivity, browser APIs, hooks). Layouts persist across navigations. Parallel Routes with @folder for simultaneous views. Route Groups with (folder) to organize without affecting URL. Use generateMetadata() for dynamic SEO metadata.",
|
|
1415
|
-
"stacks": [
|
|
1416
|
-
"nextjs"
|
|
1417
|
-
]
|
|
1418
|
-
},
|
|
1419
|
-
{
|
|
1420
|
-
"id": "frontend-nextjs-components",
|
|
1421
|
-
"name": "components",
|
|
1422
|
-
"path": "frontend/nextjs/components.md",
|
|
1423
|
-
"category": "frontend",
|
|
1424
|
-
"subcategory": "nextjs",
|
|
1425
|
-
"tags": [
|
|
1426
|
-
"frontend",
|
|
1427
|
-
"nextjs"
|
|
1428
|
-
],
|
|
1429
|
-
"aliases": [
|
|
1430
|
-
"react components",
|
|
1431
|
-
"server component",
|
|
1432
|
-
"client component",
|
|
1433
|
-
"shadcn/ui",
|
|
1434
|
-
"UI components"
|
|
1435
|
-
],
|
|
1436
|
-
"anchors": {
|
|
1437
|
-
"patterns": "#component-patterns",
|
|
1438
|
-
"shadcn": "#shadcn-usage"
|
|
1439
|
-
},
|
|
1440
|
-
"digest": "Server Components for data fetching and static content. Client Components for interactivity. shadcn/ui components are copy-paste — customize in src/components/ui/. Never use index.tsx for named exports. One component per file. Avoid prop drilling — use composition or Context API.",
|
|
1441
|
-
"stacks": [
|
|
1442
|
-
"nextjs"
|
|
1443
|
-
]
|
|
1444
|
-
},
|
|
1445
|
-
{
|
|
1446
|
-
"id": "frontend-nextjs-data-fetching",
|
|
1447
|
-
"name": "data fetching",
|
|
1448
|
-
"path": "frontend/nextjs/data-fetching.md",
|
|
1449
|
-
"category": "frontend",
|
|
1450
|
-
"subcategory": "nextjs",
|
|
1451
|
-
"tags": [
|
|
1452
|
-
"frontend",
|
|
1453
|
-
"nextjs"
|
|
1454
|
-
],
|
|
1455
|
-
"aliases": [
|
|
1456
|
-
"TanStack Query",
|
|
1457
|
-
"react-query",
|
|
1458
|
-
"server actions",
|
|
1459
|
-
"data fetching",
|
|
1460
|
-
"useQuery"
|
|
1461
|
-
],
|
|
1462
|
-
"anchors": {
|
|
1463
|
-
"server": "#server-fetching",
|
|
1464
|
-
"client": "#client-fetching"
|
|
1465
|
-
},
|
|
1466
|
-
"digest": "Server Components: fetch() with caching tags for static/ISR. Client Components: TanStack Query useQuery/useMutation for client-side state. Server Actions for mutations from Client Components. Never fetch in useEffect — use TanStack Query. Set revalidate intervals for ISR. Use React Suspense for loading states.",
|
|
1467
|
-
"stacks": [
|
|
1468
|
-
"nextjs"
|
|
1469
|
-
]
|
|
1470
|
-
},
|
|
1471
|
-
{
|
|
1472
|
-
"id": "frontend-nextjs-forms",
|
|
1473
|
-
"name": "forms",
|
|
1474
|
-
"path": "frontend/nextjs/forms.md",
|
|
1475
|
-
"category": "frontend",
|
|
1476
|
-
"subcategory": "nextjs",
|
|
1477
|
-
"tags": [
|
|
1478
|
-
"frontend",
|
|
1479
|
-
"nextjs"
|
|
1480
|
-
],
|
|
1481
|
-
"aliases": [
|
|
1482
|
-
"react-hook-form",
|
|
1483
|
-
"Zod",
|
|
1484
|
-
"form validation",
|
|
1485
|
-
"Server Actions forms",
|
|
1486
|
-
"useFormState"
|
|
1487
|
-
],
|
|
1488
|
-
"anchors": {
|
|
1489
|
-
"validation": "#zod-schemas",
|
|
1490
|
-
"submission": "#form-submission"
|
|
1491
|
-
},
|
|
1492
|
-
"digest": "react-hook-form with Zod resolver for client forms. Define Zod schema before component. Server Actions for mutations: 'use server' directive. Use useFormState/useActionState for Server Action feedback. Never submit to API routes — use Server Actions or React Query mutations. Display field-level errors from Zod.",
|
|
1493
|
-
"stacks": [
|
|
1494
|
-
"nextjs"
|
|
1495
|
-
]
|
|
1496
|
-
},
|
|
1497
|
-
{
|
|
1498
|
-
"id": "frontend-nextjs-naming-conventions",
|
|
1499
|
-
"name": "naming conventions",
|
|
1500
|
-
"path": "frontend/nextjs/naming-conventions.md",
|
|
1501
|
-
"category": "frontend",
|
|
1502
|
-
"subcategory": "nextjs",
|
|
1503
|
-
"tags": [
|
|
1504
|
-
"frontend",
|
|
1505
|
-
"nextjs"
|
|
1506
|
-
],
|
|
1507
|
-
"aliases": [
|
|
1508
|
-
"naming conventions",
|
|
1509
|
-
"file naming",
|
|
1510
|
-
"component naming",
|
|
1511
|
-
"Next.js naming",
|
|
1512
|
-
"TypeScript naming"
|
|
1513
|
-
],
|
|
1514
|
-
"anchors": {
|
|
1515
|
-
"files": "#file-naming",
|
|
1516
|
-
"components": "#component-naming"
|
|
1517
|
-
},
|
|
1518
|
-
"digest": "Pages: lowercase kebab-case (user-profile/page.tsx). Components: PascalCase (UserProfile.tsx). Hooks: camelCase with 'use' prefix (useUserProfile.ts). API routes: kebab-case. Types: PascalCase. No default exports except page.tsx and layout.tsx. Feature-based co-location preferred.",
|
|
1519
|
-
"stacks": [
|
|
1520
|
-
"nextjs"
|
|
1521
|
-
]
|
|
1522
|
-
},
|
|
1523
|
-
{
|
|
1524
|
-
"id": "frontend-nextjs-nextjs-patterns",
|
|
1525
|
-
"name": "nextjs patterns",
|
|
1526
|
-
"path": "frontend/nextjs/nextjs-patterns.md",
|
|
1527
|
-
"category": "frontend",
|
|
1528
|
-
"subcategory": "nextjs",
|
|
1529
|
-
"tags": [
|
|
1530
|
-
"frontend",
|
|
1531
|
-
"nextjs"
|
|
1532
|
-
],
|
|
1533
|
-
"aliases": [
|
|
1534
|
-
"Next.js patterns",
|
|
1535
|
-
"middleware",
|
|
1536
|
-
"auth patterns",
|
|
1537
|
-
"caching patterns",
|
|
1538
|
-
"image optimization"
|
|
1539
|
-
],
|
|
1540
|
-
"anchors": {
|
|
1541
|
-
"auth": "#auth-patterns",
|
|
1542
|
-
"caching": "#caching-patterns"
|
|
1543
|
-
},
|
|
1544
|
-
"digest": "Middleware for auth redirects (use matcher config). next/image for all images (auto-optimization). next/link for navigation (prefetching). loading.tsx for Suspense boundaries per route. error.tsx for error boundaries. Use unstable_cache for expensive server computations with tag-based revalidation.",
|
|
1545
|
-
"stacks": [
|
|
1546
|
-
"nextjs"
|
|
1547
|
-
]
|
|
1548
|
-
},
|
|
1549
|
-
{
|
|
1550
|
-
"id": "frontend-nextjs-project-structure",
|
|
1551
|
-
"name": "project structure",
|
|
1552
|
-
"path": "frontend/nextjs/project-structure.md",
|
|
1553
|
-
"category": "frontend",
|
|
1554
|
-
"subcategory": "nextjs",
|
|
1555
|
-
"tags": [
|
|
1556
|
-
"frontend",
|
|
1557
|
-
"nextjs"
|
|
1558
|
-
],
|
|
1559
|
-
"aliases": [
|
|
1560
|
-
"project structure",
|
|
1561
|
-
"folder structure",
|
|
1562
|
-
"src directory",
|
|
1563
|
-
"app directory organization"
|
|
1564
|
-
],
|
|
1565
|
-
"anchors": {
|
|
1566
|
-
"structure": "#directory-structure",
|
|
1567
|
-
"organization": "#feature-organization"
|
|
1568
|
-
},
|
|
1569
|
-
"digest": "src/app/ for routes, src/components/ for shared UI, src/lib/ for utilities, src/hooks/ for custom hooks, src/types/ for TypeScript types. Co-locate feature components near their routes. Public API via components/index.ts. Avoid barrel files in app/ directory. Keep pages thin — logic in hooks and utilities.",
|
|
1570
|
-
"stacks": [
|
|
1571
|
-
"nextjs"
|
|
1572
|
-
]
|
|
1573
|
-
},
|
|
1574
|
-
{
|
|
1575
|
-
"id": "frontend-nextjs-state-management",
|
|
1576
|
-
"name": "state management",
|
|
1577
|
-
"path": "frontend/nextjs/state-management.md",
|
|
1578
|
-
"category": "frontend",
|
|
1579
|
-
"subcategory": "nextjs",
|
|
1580
|
-
"tags": [
|
|
1581
|
-
"frontend",
|
|
1582
|
-
"nextjs"
|
|
1583
|
-
],
|
|
1584
|
-
"aliases": [
|
|
1585
|
-
"zustand",
|
|
1586
|
-
"React context",
|
|
1587
|
-
"global state",
|
|
1588
|
-
"state management",
|
|
1589
|
-
"client state"
|
|
1590
|
-
],
|
|
1591
|
-
"anchors": {
|
|
1592
|
-
"patterns": "#state-patterns",
|
|
1593
|
-
"server": "#server-state"
|
|
1594
|
-
},
|
|
1595
|
-
"digest": "TanStack Query for server state (caching, background sync, optimistic updates). Zustand for global client state (auth, theme, user preferences). URL params for shareable UI state (filters, pagination). useState for local component state. Avoid Redux — Zustand is sufficient for most Next.js use cases.",
|
|
1596
|
-
"stacks": [
|
|
1597
|
-
"nextjs"
|
|
1598
|
-
]
|
|
1599
|
-
},
|
|
1600
|
-
{
|
|
1601
|
-
"id": "frontend-nextjs-testing",
|
|
1602
|
-
"name": "testing",
|
|
1603
|
-
"path": "frontend/nextjs/testing.md",
|
|
1604
|
-
"category": "frontend",
|
|
1605
|
-
"subcategory": "nextjs",
|
|
1606
|
-
"tags": [
|
|
1607
|
-
"frontend",
|
|
1608
|
-
"nextjs"
|
|
1609
|
-
],
|
|
1610
|
-
"aliases": [
|
|
1611
|
-
"vitest",
|
|
1612
|
-
"jest",
|
|
1613
|
-
"testing-library",
|
|
1614
|
-
"Playwright",
|
|
1615
|
-
"Next.js testing",
|
|
1616
|
-
"component tests"
|
|
1617
|
-
],
|
|
1618
|
-
"anchors": {
|
|
1619
|
-
"unit": "#unit-tests",
|
|
1620
|
-
"e2e": "#e2e-tests"
|
|
1621
|
-
},
|
|
1622
|
-
"digest": "Vitest for unit tests, React Testing Library for component tests. Mock next/navigation with vi.mock. Test Server Actions with direct function calls. Use MSW for API mocking in component tests. Playwright for E2E tests against running app. Never test implementation details — test user behavior and output.",
|
|
1623
|
-
"stacks": [
|
|
1624
|
-
"nextjs"
|
|
1625
|
-
]
|
|
1626
|
-
},
|
|
1627
|
-
{
|
|
1628
|
-
"id": "infrastructure-azure-azure",
|
|
1629
|
-
"name": "azure",
|
|
1630
|
-
"path": "infrastructure/azure/azure.md",
|
|
1631
|
-
"category": "infrastructure",
|
|
1632
|
-
"subcategory": "azure",
|
|
1633
|
-
"tags": [
|
|
1634
|
-
"infrastructure",
|
|
1635
|
-
"azure"
|
|
1636
|
-
],
|
|
1637
|
-
"aliases": [
|
|
1638
|
-
"azure",
|
|
1639
|
-
"Azure setup",
|
|
1640
|
-
"resource group",
|
|
1641
|
-
"subscription",
|
|
1642
|
-
"azure baseline"
|
|
1643
|
-
],
|
|
1644
|
-
"anchors": {
|
|
1645
|
-
"resources": "#core-resources",
|
|
1646
|
-
"security": "#security-baseline"
|
|
1647
|
-
},
|
|
1648
|
-
"digest": "Organize resources by resource groups per environment (dev/staging/prod). Use managed identities for service-to-service auth — never service principals or keys in code. Tag all resources (env, project, owner). Enable diagnostic settings for all services. All secrets in Key Vault. Apply Azure Policy for compliance guardrails.",
|
|
1649
|
-
"stacks": [
|
|
1650
|
-
"azure"
|
|
1651
|
-
]
|
|
1652
|
-
},
|
|
1653
|
-
{
|
|
1654
|
-
"id": "infrastructure-azure-bicep-bicep-patterns",
|
|
1655
|
-
"name": "bicep patterns",
|
|
1656
|
-
"path": "infrastructure/azure/bicep/bicep-patterns.md",
|
|
1657
|
-
"category": "infrastructure",
|
|
1658
|
-
"subcategory": "azure",
|
|
1659
|
-
"tags": [
|
|
1660
|
-
"infrastructure",
|
|
1661
|
-
"azure",
|
|
1662
|
-
"bicep"
|
|
1663
|
-
],
|
|
1664
|
-
"aliases": [
|
|
1665
|
-
"bicep",
|
|
1666
|
-
"ARM template",
|
|
1667
|
-
"IaC",
|
|
1668
|
-
"infrastructure as code",
|
|
1669
|
-
"resource deployment"
|
|
1670
|
-
],
|
|
1671
|
-
"anchors": {
|
|
1672
|
-
"modules": "#module-patterns",
|
|
1673
|
-
"parameters": "#parameter-files"
|
|
1674
|
-
},
|
|
1675
|
-
"digest": "Structure as main.bicep + modules/. Parameters in parameters.{env}.bicepparams. Use @secure() for secrets — never hardcode. Run What-If before apply. Use existing keyword for cross-RG references. Modules are reusable units — never duplicate resource blocks. Deploy via CI/CD pipeline, not ad hoc.",
|
|
1676
|
-
"stacks": [
|
|
1677
|
-
"azure"
|
|
1678
|
-
]
|
|
1679
|
-
},
|
|
1680
|
-
{
|
|
1681
|
-
"id": "infrastructure-azure-devops-azure-devops-setup",
|
|
1682
|
-
"name": "azure devops setup",
|
|
1683
|
-
"path": "infrastructure/azure/devops/azure-devops-setup.md",
|
|
1684
|
-
"category": "infrastructure",
|
|
1685
|
-
"subcategory": "azure",
|
|
1686
|
-
"tags": [
|
|
1687
|
-
"infrastructure",
|
|
1688
|
-
"azure",
|
|
1689
|
-
"devops"
|
|
1690
|
-
],
|
|
1691
|
-
"aliases": [
|
|
1692
|
-
"azure devops",
|
|
1693
|
-
"ADO",
|
|
1694
|
-
"pipelines",
|
|
1695
|
-
"YAML pipeline",
|
|
1696
|
-
"azure-pipelines.yml"
|
|
1697
|
-
],
|
|
1698
|
-
"anchors": {
|
|
1699
|
-
"setup": "#organization-setup",
|
|
1700
|
-
"pipelines": "#pipeline-setup"
|
|
1701
|
-
},
|
|
1702
|
-
"digest": "YAML pipelines checked into repo — no classic editor. Separate environments: dev, staging, prod with approval gates. Service connections use managed identity (no service principals). Variable groups for per-env config. Artifacts feed for private NuGet packages. Branch policies require PR + CI for main/develop.",
|
|
1703
|
-
"stacks": [
|
|
1704
|
-
"azure"
|
|
1705
|
-
]
|
|
1706
|
-
},
|
|
1707
|
-
{
|
|
1708
|
-
"id": "infrastructure-azure-devops-local-development",
|
|
1709
|
-
"name": "local development",
|
|
1710
|
-
"path": "infrastructure/azure/devops/local-development.md",
|
|
1711
|
-
"category": "infrastructure",
|
|
1712
|
-
"subcategory": "azure",
|
|
1713
|
-
"tags": [
|
|
1714
|
-
"infrastructure",
|
|
1715
|
-
"azure",
|
|
1716
|
-
"devops"
|
|
1717
|
-
],
|
|
1718
|
-
"aliases": [
|
|
1719
|
-
"local dev",
|
|
1720
|
-
"azurite",
|
|
1721
|
-
"local azure",
|
|
1722
|
-
"dev container",
|
|
1723
|
-
"local secrets",
|
|
1724
|
-
"dotnet user-secrets"
|
|
1725
|
-
],
|
|
1726
|
-
"anchors": {
|
|
1727
|
-
"emulators": "#local-emulators",
|
|
1728
|
-
"secrets": "#local-secrets"
|
|
1729
|
-
},
|
|
1730
|
-
"digest": "Use Azurite for local Blob/Queue/Table storage emulation. dotnet user-secrets for local credentials — never .env files committed to git. Use Connection String for local, Managed Identity for deployed. Dev containers for reproducible environments. Local HTTPS with ASP.NET dev certificates.",
|
|
1731
|
-
"stacks": [
|
|
1732
|
-
"azure"
|
|
1733
|
-
]
|
|
1734
|
-
},
|
|
1735
|
-
{
|
|
1736
|
-
"id": "infrastructure-azure-services-functions",
|
|
1737
|
-
"name": "functions",
|
|
1738
|
-
"path": "infrastructure/azure/services/functions.md",
|
|
1739
|
-
"category": "infrastructure",
|
|
1740
|
-
"subcategory": "azure",
|
|
1741
|
-
"tags": [
|
|
1742
|
-
"infrastructure",
|
|
1743
|
-
"azure",
|
|
1744
|
-
"services"
|
|
1745
|
-
],
|
|
1746
|
-
"aliases": [
|
|
1747
|
-
"Azure Functions",
|
|
1748
|
-
"serverless",
|
|
1749
|
-
"function app",
|
|
1750
|
-
"timer trigger",
|
|
1751
|
-
"HTTP trigger",
|
|
1752
|
-
"Durable Functions"
|
|
1753
|
-
],
|
|
1754
|
-
"anchors": {
|
|
1755
|
-
"triggers": "#trigger-types",
|
|
1756
|
-
"bindings": "#input-output-bindings"
|
|
1757
|
-
},
|
|
1758
|
-
"digest": "Use isolated worker model (.NET 8+). HTTP triggers for API endpoints, Timer triggers for scheduled work, Service Bus triggers for event processing. Configure scale-out limits to prevent runaway costs. Durable Functions for long-running orchestrations. Deploy with deployment slots for zero-downtime.",
|
|
1759
|
-
"stacks": [
|
|
1760
|
-
"azure"
|
|
1761
|
-
]
|
|
1762
|
-
},
|
|
1763
|
-
{
|
|
1764
|
-
"id": "infrastructure-azure-services-service-bus",
|
|
1765
|
-
"name": "service bus",
|
|
1766
|
-
"path": "infrastructure/azure/services/service-bus.md",
|
|
1767
|
-
"category": "infrastructure",
|
|
1768
|
-
"subcategory": "azure",
|
|
1769
|
-
"tags": [
|
|
1770
|
-
"infrastructure",
|
|
1771
|
-
"azure",
|
|
1772
|
-
"services"
|
|
1773
|
-
],
|
|
1774
|
-
"aliases": [
|
|
1775
|
-
"service bus",
|
|
1776
|
-
"message queue",
|
|
1777
|
-
"topics",
|
|
1778
|
-
"subscriptions",
|
|
1779
|
-
"dead letter queue"
|
|
1780
|
-
],
|
|
1781
|
-
"anchors": {
|
|
1782
|
-
"setup": "#namespace-setup",
|
|
1783
|
-
"patterns": "#messaging-patterns"
|
|
1784
|
-
},
|
|
1785
|
-
"digest": "Topics+subscriptions for pub/sub, queues for point-to-point. Set MaxDeliveryCount=10 for retry limit. Monitor dead letter queue. Use message sessions for ordered processing. Implement idempotent handlers (check processed message IDs). Use managed identity for authentication. Prefetch for high-throughput consumers.",
|
|
1786
|
-
"stacks": [
|
|
1787
|
-
"azure"
|
|
1788
|
-
]
|
|
1789
|
-
},
|
|
1790
|
-
{
|
|
1791
|
-
"id": "infrastructure-azure-services-storage",
|
|
1792
|
-
"name": "storage",
|
|
1793
|
-
"path": "infrastructure/azure/services/storage.md",
|
|
1794
|
-
"category": "infrastructure",
|
|
1795
|
-
"subcategory": "azure",
|
|
1796
|
-
"tags": [
|
|
1797
|
-
"infrastructure",
|
|
1798
|
-
"azure",
|
|
1799
|
-
"services"
|
|
1800
|
-
],
|
|
1801
|
-
"aliases": [
|
|
1802
|
-
"azure storage",
|
|
1803
|
-
"blob",
|
|
1804
|
-
"table storage",
|
|
1805
|
-
"queue storage",
|
|
1806
|
-
"storage account tiers"
|
|
1807
|
-
],
|
|
1808
|
-
"anchors": {
|
|
1809
|
-
"tiers": "#storage-tiers",
|
|
1810
|
-
"security": "#access-control"
|
|
1811
|
-
},
|
|
1812
|
-
"digest": "Hot tier for frequently accessed, cool for infrequent, archive for compliance. Always use managed identity — not storage keys. Enable versioning + soft delete for business data. Lifecycle management rules for cost optimization. Private endpoints for secure access from VNet. CDN for public static assets.",
|
|
1813
|
-
"stacks": [
|
|
1814
|
-
"azure"
|
|
1815
|
-
]
|
|
1816
|
-
},
|
|
1817
|
-
{
|
|
1818
|
-
"id": "infrastructure-docker-easypanel-deploy",
|
|
1819
|
-
"name": "easypanel deploy",
|
|
1820
|
-
"path": "infrastructure/docker/easypanel-deploy.md",
|
|
1821
|
-
"category": "infrastructure",
|
|
1822
|
-
"subcategory": "docker",
|
|
1823
|
-
"tags": [
|
|
1824
|
-
"infrastructure",
|
|
1825
|
-
"docker"
|
|
1826
|
-
],
|
|
1827
|
-
"aliases": [
|
|
1828
|
-
"easypanel",
|
|
1829
|
-
"docker deploy",
|
|
1830
|
-
"self-hosted",
|
|
1831
|
-
"VPS deployment",
|
|
1832
|
-
"docker compose"
|
|
1833
|
-
],
|
|
1834
|
-
"anchors": {
|
|
1835
|
-
"setup": "#easypanel-setup",
|
|
1836
|
-
"deployment": "#deployment-flow"
|
|
1837
|
-
},
|
|
1838
|
-
"digest": "Create app in EasyPanel from container registry image. Configure environment variables in EasyPanel UI — not in Dockerfile. Use EasyPanel's managed Postgres/Redis for databases. Configure /health endpoint for health checks. Enable HTTPS via Let's Encrypt automatically. Use EasyPanel volumes for persistent storage.",
|
|
1839
|
-
"stacks": [
|
|
1840
|
-
"docker"
|
|
1841
|
-
]
|
|
1842
|
-
},
|
|
1843
|
-
{
|
|
1844
|
-
"id": "infrastructure-supabase-mcp-setup",
|
|
1845
|
-
"name": "mcp setup",
|
|
1846
|
-
"path": "infrastructure/supabase/mcp-setup.md",
|
|
1847
|
-
"category": "infrastructure",
|
|
1848
|
-
"subcategory": "supabase",
|
|
1849
|
-
"tags": [
|
|
1850
|
-
"infrastructure",
|
|
1851
|
-
"supabase"
|
|
1852
|
-
],
|
|
1853
|
-
"aliases": [
|
|
1854
|
-
"supabase MCP",
|
|
1855
|
-
"supabase tools",
|
|
1856
|
-
"supabase configuration",
|
|
1857
|
-
"MCP supabase"
|
|
1858
|
-
],
|
|
1859
|
-
"anchors": {
|
|
1860
|
-
"setup": "#mcp-configuration",
|
|
1861
|
-
"tools": "#available-tools"
|
|
1862
|
-
},
|
|
1863
|
-
"digest": "Configure Supabase MCP server with project URL and service_role key in .claude/settings.json. Use MCP tools for schema inspection, query execution, and migration management. Never expose service_role key client-side. Set up anon key for client SDK. Enable in Claude settings for database introspection during design phase.",
|
|
1864
|
-
"stacks": [
|
|
1865
|
-
"supabase"
|
|
1866
|
-
]
|
|
1867
|
-
},
|
|
1868
|
-
{
|
|
1869
|
-
"id": "infrastructure-supabase-supabase-auth",
|
|
1870
|
-
"name": "supabase auth",
|
|
1871
|
-
"path": "infrastructure/supabase/supabase-auth.md",
|
|
1872
|
-
"category": "infrastructure",
|
|
1873
|
-
"subcategory": "supabase",
|
|
1874
|
-
"tags": [
|
|
1875
|
-
"infrastructure",
|
|
1876
|
-
"supabase"
|
|
1877
|
-
],
|
|
1878
|
-
"aliases": [
|
|
1879
|
-
"supabase auth",
|
|
1880
|
-
"magic link",
|
|
1881
|
-
"OAuth",
|
|
1882
|
-
"JWT supabase",
|
|
1883
|
-
"row level security auth"
|
|
1884
|
-
],
|
|
1885
|
-
"anchors": {
|
|
1886
|
-
"setup": "#auth-setup",
|
|
1887
|
-
"providers": "#auth-providers"
|
|
1888
|
-
},
|
|
1889
|
-
"digest": "Use Supabase Auth for magic links, OAuth (Google, GitHub), phone OTP. Configure site URL and redirect URLs in dashboard. Server-side: use supabase.auth.getUser() not getSession(). Enable email confirmations for production. JWT expiry 3600s. RLS policies must reference auth.uid() for user isolation.",
|
|
1890
|
-
"stacks": [
|
|
1891
|
-
"supabase"
|
|
1892
|
-
]
|
|
1893
|
-
},
|
|
1894
|
-
{
|
|
1895
|
-
"id": "infrastructure-supabase-supabase-pgvector",
|
|
1896
|
-
"name": "supabase pgvector",
|
|
1897
|
-
"path": "infrastructure/supabase/supabase-pgvector.md",
|
|
1898
|
-
"category": "infrastructure",
|
|
1899
|
-
"subcategory": "supabase",
|
|
1900
|
-
"tags": [
|
|
1901
|
-
"infrastructure",
|
|
1902
|
-
"supabase"
|
|
1903
|
-
],
|
|
1904
|
-
"aliases": [
|
|
1905
|
-
"pgvector",
|
|
1906
|
-
"vector embeddings",
|
|
1907
|
-
"similarity search",
|
|
1908
|
-
"supabase vectors",
|
|
1909
|
-
"HNSW index"
|
|
1910
|
-
],
|
|
1911
|
-
"anchors": {
|
|
1912
|
-
"setup": "#pgvector-setup",
|
|
1913
|
-
"queries": "#similarity-queries"
|
|
1914
|
-
},
|
|
1915
|
-
"digest": "Enable: CREATE EXTENSION vector. Define column as vector(1536) for OpenAI embeddings. Create HNSW index: CREATE INDEX USING hnsw (embedding vector_cosine_ops). Use match_documents() RPC for similarity search. Batch insert embeddings (100 at a time). RLS policies apply to vector queries like all other tables.",
|
|
1916
|
-
"stacks": [
|
|
1917
|
-
"supabase"
|
|
1918
|
-
]
|
|
1919
|
-
},
|
|
1920
|
-
{
|
|
1921
|
-
"id": "infrastructure-supabase-supabase-rls",
|
|
1922
|
-
"name": "supabase rls",
|
|
1923
|
-
"path": "infrastructure/supabase/supabase-rls.md",
|
|
1924
|
-
"category": "infrastructure",
|
|
1925
|
-
"subcategory": "supabase",
|
|
1926
|
-
"tags": [
|
|
1927
|
-
"infrastructure",
|
|
1928
|
-
"supabase"
|
|
1929
|
-
],
|
|
1930
|
-
"aliases": [
|
|
1931
|
-
"RLS",
|
|
1932
|
-
"row level security",
|
|
1933
|
-
"postgres policies",
|
|
1934
|
-
"multi-tenant security",
|
|
1935
|
-
"supabase policies"
|
|
1936
|
-
],
|
|
1937
|
-
"anchors": {
|
|
1938
|
-
"policies": "#rls-policies",
|
|
1939
|
-
"patterns": "#tenant-patterns"
|
|
1940
|
-
},
|
|
1941
|
-
"digest": "Enable RLS on every table: ALTER TABLE ... ENABLE ROW LEVEL SECURITY. User isolation: USING (auth.uid() = user_id). Multi-tenant: USING (tenant_id = (auth.jwt()->>'tenant_id')::uuid). Test policies with SET LOCAL ROLE anon. Service role bypasses RLS — use only server-side. Never rely on application-level security alone.",
|
|
1942
|
-
"stacks": [
|
|
1943
|
-
"supabase"
|
|
1944
|
-
]
|
|
1945
|
-
},
|
|
1946
|
-
{
|
|
1947
|
-
"id": "infrastructure-supabase-supabase-storage",
|
|
1948
|
-
"name": "supabase storage",
|
|
1949
|
-
"path": "infrastructure/supabase/supabase-storage.md",
|
|
1950
|
-
"category": "infrastructure",
|
|
1951
|
-
"subcategory": "supabase",
|
|
1952
|
-
"tags": [
|
|
1953
|
-
"infrastructure",
|
|
1954
|
-
"supabase"
|
|
1955
|
-
],
|
|
1956
|
-
"aliases": [
|
|
1957
|
-
"supabase storage",
|
|
1958
|
-
"file uploads",
|
|
1959
|
-
"storage buckets",
|
|
1960
|
-
"storage policies",
|
|
1961
|
-
"signed URLs"
|
|
1962
|
-
],
|
|
1963
|
-
"anchors": {
|
|
1964
|
-
"buckets": "#bucket-setup",
|
|
1965
|
-
"policies": "#storage-policies"
|
|
1966
|
-
},
|
|
1967
|
-
"digest": "Public buckets for CDN-served assets, private for user files (signed URLs). Storage policies use same RLS syntax as tables. Upload: supabase.storage.from('bucket').upload(path, file). Signed URLs: createSignedUrl(path, 3600). Set content-type on upload. Enable image transformations for on-the-fly resizing.",
|
|
1968
|
-
"stacks": [
|
|
1969
|
-
"supabase"
|
|
1970
|
-
]
|
|
1971
|
-
},
|
|
1972
|
-
{
|
|
1973
|
-
"id": "infrastructure-supabase-supabase-custom-jwt",
|
|
1974
|
-
"name": "supabase custom jwt",
|
|
1975
|
-
"path": "infrastructure/supabase/supabase-custom-jwt.md",
|
|
1976
|
-
"category": "infrastructure",
|
|
1977
|
-
"subcategory": "supabase",
|
|
1978
|
-
"tags": [
|
|
1979
|
-
"infrastructure",
|
|
1980
|
-
"supabase",
|
|
1981
|
-
"jwt"
|
|
1982
|
-
],
|
|
1983
|
-
"aliases": [
|
|
1984
|
-
"custom JWT",
|
|
1985
|
-
"JWT signing",
|
|
1986
|
-
"token creation",
|
|
1987
|
-
"JWT claims"
|
|
1988
|
-
],
|
|
1989
|
-
"anchors": {
|
|
1990
|
-
"creation": "#jwt-token-creation",
|
|
1991
|
-
"claims": "#custom-claims-structure",
|
|
1992
|
-
"refresh": "#jwt-refresh-patterns"
|
|
1993
|
-
},
|
|
1994
|
-
"digest": "Create custom JWTs with jose (Node.js) or System.IdentityModel.Tokens.Jwt (.NET). Always set expiry, use HS256/RS256, include tenant_id in app_metadata for RLS. Refresh tokens via rotation. Store JWT secret in env vars only.",
|
|
1995
|
-
"stacks": [
|
|
1996
|
-
"dotnet",
|
|
1997
|
-
"nextjs"
|
|
1998
|
-
]
|
|
1999
|
-
},
|
|
2000
|
-
{
|
|
2001
|
-
"id": "integration-api-graphql",
|
|
2002
|
-
"name": "graphql",
|
|
2003
|
-
"path": "integration/api/graphql.md",
|
|
2004
|
-
"category": "integration",
|
|
2005
|
-
"subcategory": "api",
|
|
2006
|
-
"tags": [
|
|
2007
|
-
"integration",
|
|
2008
|
-
"api"
|
|
2009
|
-
],
|
|
2010
|
-
"aliases": [
|
|
2011
|
-
"graphql",
|
|
2012
|
-
"Hot Chocolate",
|
|
2013
|
-
"GraphQL schema",
|
|
2014
|
-
"query",
|
|
2015
|
-
"mutation",
|
|
2016
|
-
"subscription"
|
|
2017
|
-
],
|
|
2018
|
-
"anchors": {
|
|
2019
|
-
"setup": "#hot-chocolate-setup",
|
|
2020
|
-
"patterns": "#schema-patterns"
|
|
2021
|
-
},
|
|
2022
|
-
"digest": "Use Hot Chocolate for .NET GraphQL. Define types with [GraphQLType], mutations with [UseMutationConvention]. Enable pagination with [UsePaging]. Use DataLoader to prevent N+1 queries. Add [Authorize] for field-level security. Never expose internal exceptions — use custom error types. Enable introspection only in dev.",
|
|
2023
|
-
"stacks": [
|
|
2024
|
-
"dotnet"
|
|
2025
|
-
]
|
|
2026
|
-
},
|
|
2027
|
-
{
|
|
2028
|
-
"id": "integration-api-grpc",
|
|
2029
|
-
"name": "grpc",
|
|
2030
|
-
"path": "integration/api/grpc.md",
|
|
2031
|
-
"category": "integration",
|
|
2032
|
-
"subcategory": "api",
|
|
2033
|
-
"tags": [
|
|
2034
|
-
"integration",
|
|
2035
|
-
"api"
|
|
2036
|
-
],
|
|
2037
|
-
"aliases": [
|
|
2038
|
-
"grpc",
|
|
2039
|
-
"protobuf",
|
|
2040
|
-
".proto files",
|
|
2041
|
-
"gRPC service",
|
|
2042
|
-
"server streaming"
|
|
2043
|
-
],
|
|
2044
|
-
"anchors": {
|
|
2045
|
-
"proto": "#proto-design",
|
|
2046
|
-
"patterns": "#service-patterns"
|
|
2047
|
-
},
|
|
2048
|
-
"digest": "Define .proto files first, generate C# stubs. Use proto3 syntax. Unary for request-response, server streaming for real-time data. GrpcChannel with managed credentials. Add grpc-health-probe for health checks. Prefer REST for external APIs, gRPC for internal service-to-service. Use Buf for proto linting and schema registry.",
|
|
2049
|
-
"stacks": [
|
|
2050
|
-
"dotnet"
|
|
2051
|
-
]
|
|
2052
|
-
},
|
|
2053
|
-
{
|
|
2054
|
-
"id": "integration-api-rest-design",
|
|
2055
|
-
"name": "rest design",
|
|
2056
|
-
"path": "integration/api/rest-design.md",
|
|
2057
|
-
"category": "integration",
|
|
2058
|
-
"subcategory": "api",
|
|
2059
|
-
"tags": [
|
|
2060
|
-
"integration",
|
|
2061
|
-
"api"
|
|
2062
|
-
],
|
|
2063
|
-
"aliases": [
|
|
2064
|
-
"REST design",
|
|
2065
|
-
"RESTful API",
|
|
2066
|
-
"HTTP API design",
|
|
2067
|
-
"resource naming",
|
|
2068
|
-
"API versioning"
|
|
2069
|
-
],
|
|
2070
|
-
"anchors": {
|
|
2071
|
-
"resources": "#resource-naming",
|
|
2072
|
-
"errors": "#error-handling"
|
|
2073
|
-
},
|
|
2074
|
-
"digest": "Resources are nouns, HTTP verbs are actions: GET /users, POST /users, PUT /users/{id}, DELETE /users/{id}. 201+Location for creation, 204 for deletion. RFC 9457 ProblemDetails for errors. Cursor-based pagination for large collections. URL versioning (/api/v1/). HATEOAS links for discoverable APIs.",
|
|
2075
|
-
"stacks": [
|
|
2076
|
-
"dotnet"
|
|
2077
|
-
]
|
|
2078
|
-
},
|
|
2079
|
-
{
|
|
2080
|
-
"id": "integration-event-driven-cqrs",
|
|
2081
|
-
"name": "cqrs",
|
|
2082
|
-
"path": "integration/event-driven/cqrs.md",
|
|
2083
|
-
"category": "integration",
|
|
2084
|
-
"subcategory": "event-driven",
|
|
2085
|
-
"tags": [
|
|
2086
|
-
"integration",
|
|
2087
|
-
"event-driven"
|
|
2088
|
-
],
|
|
2089
|
-
"aliases": [
|
|
2090
|
-
"CQRS",
|
|
2091
|
-
"command query separation",
|
|
2092
|
-
"MediatR",
|
|
2093
|
-
"read model",
|
|
2094
|
-
"write model"
|
|
2095
|
-
],
|
|
2096
|
-
"anchors": {
|
|
2097
|
-
"commands": "#command-patterns",
|
|
2098
|
-
"queries": "#query-patterns"
|
|
2099
|
-
},
|
|
2100
|
-
"digest": "Commands mutate state, queries read state — never mix. Commands return void or Result (not data). Queries return DTOs (not domain entities). Use MediatR for in-process CQRS. Validate commands at API boundary before handler. Read models can be denormalized for query performance.",
|
|
2101
|
-
"stacks": [
|
|
2102
|
-
"dotnet"
|
|
2103
|
-
]
|
|
2104
|
-
},
|
|
2105
|
-
{
|
|
2106
|
-
"id": "integration-event-driven-event-sourcing",
|
|
2107
|
-
"name": "event sourcing",
|
|
2108
|
-
"path": "integration/event-driven/event-sourcing.md",
|
|
2109
|
-
"category": "integration",
|
|
2110
|
-
"subcategory": "event-driven",
|
|
2111
|
-
"tags": [
|
|
2112
|
-
"integration",
|
|
2113
|
-
"event-driven"
|
|
2114
|
-
],
|
|
2115
|
-
"aliases": [
|
|
2116
|
-
"event sourcing",
|
|
2117
|
-
"event store",
|
|
2118
|
-
"event replay",
|
|
2119
|
-
"aggregate events",
|
|
2120
|
-
"append-only log"
|
|
2121
|
-
],
|
|
2122
|
-
"anchors": {
|
|
2123
|
-
"events": "#domain-events",
|
|
2124
|
-
"replay": "#event-replay"
|
|
2125
|
-
},
|
|
2126
|
-
"digest": "Store events as immutable past-tense facts: OrderCreated, PaymentProcessed. Aggregate rebuilds state from event stream. Take snapshots for aggregates with >100 events. Use EventStoreDB or CosmosDB change feed for storage. Projections build read models from events. Never delete events — use correction events.",
|
|
2127
|
-
"stacks": [
|
|
2128
|
-
"dotnet"
|
|
2129
|
-
]
|
|
2130
|
-
},
|
|
2131
|
-
{
|
|
2132
|
-
"id": "integration-event-driven-service-bus",
|
|
2133
|
-
"name": "service bus",
|
|
2134
|
-
"path": "integration/event-driven/service-bus.md",
|
|
2135
|
-
"category": "integration",
|
|
2136
|
-
"subcategory": "event-driven",
|
|
2137
|
-
"tags": [
|
|
2138
|
-
"integration",
|
|
2139
|
-
"event-driven"
|
|
2140
|
-
],
|
|
2141
|
-
"aliases": [
|
|
2142
|
-
"service bus integration",
|
|
2143
|
-
"message broker",
|
|
2144
|
-
"event bus",
|
|
2145
|
-
"publisher",
|
|
2146
|
-
"consumer"
|
|
2147
|
-
],
|
|
2148
|
-
"anchors": {
|
|
2149
|
-
"topics": "#topic-subscription",
|
|
2150
|
-
"patterns": "#integration-patterns"
|
|
2151
|
-
},
|
|
2152
|
-
"digest": "Publish domain events to Service Bus after aggregate persistence (transactional outbox). Consumers must be idempotent — check processed message IDs. Use correlation IDs for distributed tracing. Message envelope includes schema version. Consumer groups enable event replay. Monitor dead letter queue in production.",
|
|
2153
|
-
"stacks": [
|
|
2154
|
-
"dotnet"
|
|
2155
|
-
]
|
|
2156
|
-
},
|
|
2157
|
-
{
|
|
2158
|
-
"id": "integration-mcp-mcp-tools",
|
|
2159
|
-
"name": "mcp tools",
|
|
2160
|
-
"path": "integration/mcp/mcp-tools.md",
|
|
2161
|
-
"category": "integration",
|
|
2162
|
-
"subcategory": "mcp",
|
|
2163
|
-
"tags": [
|
|
2164
|
-
"integration",
|
|
2165
|
-
"mcp"
|
|
2166
|
-
],
|
|
2167
|
-
"aliases": [
|
|
2168
|
-
"MCP",
|
|
2169
|
-
"Model Context Protocol",
|
|
2170
|
-
"Claude tools",
|
|
2171
|
-
"MCP server",
|
|
2172
|
-
"MCP client"
|
|
2173
|
-
],
|
|
2174
|
-
"anchors": {
|
|
2175
|
-
"tools": "#tool-definitions",
|
|
2176
|
-
"setup": "#server-setup"
|
|
2177
|
-
},
|
|
2178
|
-
"digest": "MCP tools extend Claude with external data and actions. Tools are synchronous request-response with typed inputSchema. Resources provide read-only data access. Prompts are reusable templates. Register MCP servers in .claude/settings.json. Prefer @context7 for live library docs. Test tools with MCP Inspector before integrating.",
|
|
2179
|
-
"stacks": [
|
|
2180
|
-
"*"
|
|
2181
|
-
]
|
|
2182
|
-
},
|
|
2183
|
-
{
|
|
2184
|
-
"id": "observability-logging",
|
|
2185
|
-
"name": "logging",
|
|
2186
|
-
"path": "observability/logging.md",
|
|
2187
|
-
"category": "observability",
|
|
2188
|
-
"subcategory": null,
|
|
2189
|
-
"tags": [
|
|
2190
|
-
"observability"
|
|
2191
|
-
],
|
|
2192
|
-
"aliases": [
|
|
2193
|
-
"logging",
|
|
2194
|
-
"serilog",
|
|
2195
|
-
"ILogger",
|
|
2196
|
-
"structured logging",
|
|
2197
|
-
"log levels",
|
|
2198
|
-
"Application Insights"
|
|
2199
|
-
],
|
|
2200
|
-
"anchors": {
|
|
2201
|
-
"setup": "#serilog-setup",
|
|
2202
|
-
"patterns": "#logging-patterns"
|
|
2203
|
-
},
|
|
2204
|
-
"digest": "Use Serilog with structured logging. Sinks: Console (dev), Application Insights (prod). Inject ILogger<T> — never static Logger. Log levels: Debug for trace, Information for business events, Warning for recoverable, Error for failures. Include correlation IDs in all logs. Never log PII or credentials.",
|
|
2205
|
-
"stacks": [
|
|
2206
|
-
"*"
|
|
2207
|
-
]
|
|
2208
|
-
},
|
|
2209
|
-
{
|
|
2210
|
-
"id": "observability-metrics",
|
|
2211
|
-
"name": "metrics",
|
|
2212
|
-
"path": "observability/metrics.md",
|
|
2213
|
-
"category": "observability",
|
|
2214
|
-
"subcategory": null,
|
|
2215
|
-
"tags": [
|
|
2216
|
-
"observability"
|
|
2217
|
-
],
|
|
2218
|
-
"aliases": [
|
|
2219
|
-
"metrics",
|
|
2220
|
-
"prometheus",
|
|
2221
|
-
"OpenTelemetry metrics",
|
|
2222
|
-
"custom metrics",
|
|
2223
|
-
"counters",
|
|
2224
|
-
"histograms"
|
|
2225
|
-
],
|
|
2226
|
-
"anchors": {
|
|
2227
|
-
"setup": "#metrics-setup",
|
|
2228
|
-
"instruments": "#metric-types"
|
|
2229
|
-
},
|
|
2230
|
-
"digest": "System.Diagnostics.Metrics API for .NET. Register meters: builder.Services.AddMetrics(). Types: Counter (total count), Histogram (latency distribution), Gauge (current value). Export to Prometheus or Azure Monitor. Tag dimensions: environment, service, version. Define SLIs from business metrics, not technical ones.",
|
|
2231
|
-
"stacks": [
|
|
2232
|
-
"*"
|
|
2233
|
-
]
|
|
2234
|
-
},
|
|
2235
|
-
{
|
|
2236
|
-
"id": "observability-monitoring",
|
|
2237
|
-
"name": "monitoring",
|
|
2238
|
-
"path": "observability/monitoring.md",
|
|
2239
|
-
"category": "observability",
|
|
2240
|
-
"subcategory": null,
|
|
2241
|
-
"tags": [
|
|
2242
|
-
"observability"
|
|
2243
|
-
],
|
|
2244
|
-
"aliases": [
|
|
2245
|
-
"monitoring",
|
|
2246
|
-
"alerts",
|
|
2247
|
-
"dashboards",
|
|
2248
|
-
"Application Insights",
|
|
2249
|
-
"health checks",
|
|
2250
|
-
"SLA"
|
|
2251
|
-
],
|
|
2252
|
-
"anchors": {
|
|
2253
|
-
"alerts": "#alert-rules",
|
|
2254
|
-
"dashboards": "#dashboard-setup"
|
|
2255
|
-
},
|
|
2256
|
-
"digest": "Health checks: /health for liveness, /health/ready for readiness. Application Insights for distributed tracing. SLA-based alerts: p99 latency, error rate >1%, availability <99.9%. Azure Workbooks dashboards per feature. Availability tests for external endpoints. Each alert has an on-call runbook.",
|
|
2257
|
-
"stacks": [
|
|
2258
|
-
"*"
|
|
2259
|
-
]
|
|
2260
|
-
},
|
|
2261
|
-
{
|
|
2262
|
-
"id": "observability-tracing",
|
|
2263
|
-
"name": "tracing",
|
|
2264
|
-
"path": "observability/tracing.md",
|
|
2265
|
-
"category": "observability",
|
|
2266
|
-
"subcategory": null,
|
|
2267
|
-
"tags": [
|
|
2268
|
-
"observability"
|
|
2269
|
-
],
|
|
2270
|
-
"aliases": [
|
|
2271
|
-
"tracing",
|
|
2272
|
-
"OpenTelemetry",
|
|
2273
|
-
"distributed trace",
|
|
2274
|
-
"spans",
|
|
2275
|
-
"W3C TraceContext"
|
|
2276
|
-
],
|
|
2277
|
-
"anchors": {
|
|
2278
|
-
"setup": "#otel-setup",
|
|
2279
|
-
"propagation": "#context-propagation"
|
|
2280
|
-
},
|
|
2281
|
-
"digest": "Add OpenTelemetry SDK. Auto-instrument HTTP, SQL, Service Bus. Propagate W3C TraceContext across services. Custom spans for business operations: using var span = tracer.StartActiveSpan('operation'). Export to Azure Monitor or Jaeger. Sampling: 10% in prod, 100% for errors. Correlate traces with logs via trace ID.",
|
|
2282
|
-
"stacks": [
|
|
2283
|
-
"*"
|
|
2284
|
-
]
|
|
2285
|
-
},
|
|
2286
|
-
{
|
|
2287
|
-
"id": "workflows-parallel-execution",
|
|
2288
|
-
"name": "parallel execution",
|
|
2289
|
-
"path": "workflows/parallel-execution.md",
|
|
2290
|
-
"category": "workflows",
|
|
2291
|
-
"subcategory": null,
|
|
2292
|
-
"tags": [
|
|
2293
|
-
"workflows"
|
|
2294
|
-
],
|
|
2295
|
-
"aliases": [
|
|
2296
|
-
"parallel",
|
|
2297
|
-
"Task.WhenAll",
|
|
2298
|
-
"concurrent",
|
|
2299
|
-
"parallelism",
|
|
2300
|
-
"async parallel",
|
|
2301
|
-
"Parallel.ForEachAsync"
|
|
2302
|
-
],
|
|
2303
|
-
"anchors": {
|
|
2304
|
-
"patterns": "#parallel-patterns",
|
|
2305
|
-
"throttling": "#concurrency-limits"
|
|
2306
|
-
},
|
|
2307
|
-
"digest": "Task.WhenAll for I/O-bound independent parallel ops. Parallel.ForEachAsync with CancellationToken for CPU-bound batches. SemaphoreSlim for concurrency limiting. Channel<T> for producer-consumer. Never Task.WhenAll with DbContext — use separate factory-created instances per task. Measure actual benefit before adding parallelism.",
|
|
2308
|
-
"stacks": [
|
|
2309
|
-
"*"
|
|
2310
|
-
]
|
|
2311
|
-
},
|
|
2312
|
-
{
|
|
2313
|
-
"id": "workflows-thread-management",
|
|
2314
|
-
"name": "thread management",
|
|
2315
|
-
"path": "workflows/thread-management.md",
|
|
2316
|
-
"category": "workflows",
|
|
2317
|
-
"subcategory": null,
|
|
2318
|
-
"tags": [
|
|
2319
|
-
"workflows"
|
|
2320
|
-
],
|
|
2321
|
-
"aliases": [
|
|
2322
|
-
"threads",
|
|
2323
|
-
"ThreadPool",
|
|
2324
|
-
"ConfigureAwait",
|
|
2325
|
-
"deadlock prevention",
|
|
2326
|
-
"async void",
|
|
2327
|
-
"synchronization"
|
|
2328
|
-
],
|
|
2329
|
-
"anchors": {
|
|
2330
|
-
"patterns": "#thread-patterns",
|
|
2331
|
-
"deadlocks": "#deadlock-prevention"
|
|
2332
|
-
},
|
|
2333
|
-
"digest": "Use async/await throughout — never mix blocking calls (.Result, .Wait()). ConfigureAwait(false) in library code. Never Thread.Sleep — use Task.Delay with CancellationToken. Lock-free with Interlocked for counters, ConcurrentDictionary for shared state. ThreadPool.QueueUserWorkItem only for truly detached background work.",
|
|
2334
|
-
"stacks": [
|
|
2335
|
-
"*"
|
|
2336
|
-
]
|
|
2337
|
-
},
|
|
2338
|
-
{
|
|
2339
|
-
"id": "infrastructure-vercel-database",
|
|
2340
|
-
"name": "vercel database",
|
|
2341
|
-
"path": "infrastructure/vercel/vercel-database.md",
|
|
2342
|
-
"category": "infrastructure",
|
|
2343
|
-
"subcategory": "vercel",
|
|
2344
|
-
"tags": [
|
|
2345
|
-
"infrastructure",
|
|
2346
|
-
"vercel",
|
|
2347
|
-
"nextjs",
|
|
2348
|
-
"database"
|
|
2349
|
-
],
|
|
2350
|
-
"aliases": [
|
|
2351
|
-
"Vercel deploy",
|
|
2352
|
-
"serverless database",
|
|
2353
|
-
"Neon",
|
|
2354
|
-
"PlanetScale",
|
|
2355
|
-
"Vercel Postgres",
|
|
2356
|
-
"serverless postgres"
|
|
2357
|
-
],
|
|
2358
|
-
"anchors": {
|
|
2359
|
-
"decision": "#decision-tree-choose-your-db-tier",
|
|
2360
|
-
"neon": "#implementation-neon-recommended",
|
|
2361
|
-
"supabase": "#implementation-supabase--pgbouncer-transaction-mode"
|
|
2362
|
-
},
|
|
2363
|
-
"digest": "NEVER use a traditional TCP connection pool (plain pg/Npgsql) when deploying to Vercel — ephemeral functions exhaust connections instantly. ALWAYS use a serverless-compatible database: Neon (first choice for SQL), Supabase with PgBouncer on port 6543 (transaction mode), PlanetScale, or Turso. Set connection_limit=1 when using ORMs with PgBouncer.",
|
|
2364
|
-
"stacks": [
|
|
2365
|
-
"vercel"
|
|
2366
|
-
]
|
|
2367
|
-
}
|
|
2368
|
-
]
|
|
2369
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"standards": [
|
|
4
|
+
{
|
|
5
|
+
"id": "ai-agents-production",
|
|
6
|
+
"name": "production",
|
|
7
|
+
"path": "ai-agents/production.md",
|
|
8
|
+
"category": "ai-agents",
|
|
9
|
+
"subcategory": null,
|
|
10
|
+
"tags": [
|
|
11
|
+
"ai-agents"
|
|
12
|
+
],
|
|
13
|
+
"aliases": [
|
|
14
|
+
"AI production",
|
|
15
|
+
"agent reliability",
|
|
16
|
+
"production AI",
|
|
17
|
+
"agent safety",
|
|
18
|
+
"autonomous systems"
|
|
19
|
+
],
|
|
20
|
+
"anchors": {
|
|
21
|
+
"reliability": "#reliability-patterns",
|
|
22
|
+
"safety": "#safety-guardrails",
|
|
23
|
+
"monitoring": "#monitoring-and-logging"
|
|
24
|
+
},
|
|
25
|
+
"digest": "Add rate limiting and retry with exponential backoff. Log all agent decisions and tool calls. Implement circuit breakers for external calls. Validate agent output before acting. Never give agents unaudited write access to production systems.",
|
|
26
|
+
"stacks": [
|
|
27
|
+
"*"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "ai-agents-setup",
|
|
32
|
+
"name": "setup",
|
|
33
|
+
"path": "ai-agents/setup.md",
|
|
34
|
+
"category": "ai-agents",
|
|
35
|
+
"subcategory": null,
|
|
36
|
+
"tags": [
|
|
37
|
+
"ai-agents"
|
|
38
|
+
],
|
|
39
|
+
"aliases": [
|
|
40
|
+
"AI agent setup",
|
|
41
|
+
"MCP configuration",
|
|
42
|
+
"tool configuration",
|
|
43
|
+
"Claude setup",
|
|
44
|
+
"agent initialization"
|
|
45
|
+
],
|
|
46
|
+
"anchors": {
|
|
47
|
+
"mcp": "#mcp-configuration",
|
|
48
|
+
"tools": "#tool-definitions",
|
|
49
|
+
"spawn": "#spawn-configuration"
|
|
50
|
+
},
|
|
51
|
+
"digest": "Initialize agents with explicit tool lists — never allow unlimited tool access. Configure MCP servers before spawning subagents. Define system prompts with role + constraints + output format. Validate tool availability before dispatch.",
|
|
52
|
+
"stacks": [
|
|
53
|
+
"*"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "ai-agents-workflows",
|
|
58
|
+
"name": "workflows",
|
|
59
|
+
"path": "ai-agents/workflows.md",
|
|
60
|
+
"category": "ai-agents",
|
|
61
|
+
"subcategory": null,
|
|
62
|
+
"tags": [
|
|
63
|
+
"ai-agents"
|
|
64
|
+
],
|
|
65
|
+
"aliases": [
|
|
66
|
+
"agent workflow",
|
|
67
|
+
"multi-agent",
|
|
68
|
+
"orchestration pattern",
|
|
69
|
+
"agent chain",
|
|
70
|
+
"parallel agents"
|
|
71
|
+
],
|
|
72
|
+
"anchors": {
|
|
73
|
+
"orchestration": "#orchestration-patterns",
|
|
74
|
+
"parallel": "#parallel-execution",
|
|
75
|
+
"handoff": "#agent-handoff"
|
|
76
|
+
},
|
|
77
|
+
"digest": "Use orchestrator→specialist pattern for complex tasks. Parallelize independent subtasks. Pass structured context between agents, not raw conversation. Define explicit success criteria before spawning. Implement timeout and fallback strategies.",
|
|
78
|
+
"stacks": [
|
|
79
|
+
"*"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "architecture-vertical-slice-vertical-slice",
|
|
84
|
+
"name": "vertical slice",
|
|
85
|
+
"path": "architecture/vertical-slice/vertical-slice.md",
|
|
86
|
+
"category": "architecture",
|
|
87
|
+
"subcategory": "vertical-slice",
|
|
88
|
+
"tags": [
|
|
89
|
+
"architecture",
|
|
90
|
+
"vertical-slice"
|
|
91
|
+
],
|
|
92
|
+
"aliases": [
|
|
93
|
+
"vertical slice",
|
|
94
|
+
"VSA",
|
|
95
|
+
"slice architecture",
|
|
96
|
+
"feature slice",
|
|
97
|
+
"CQRS slice"
|
|
98
|
+
],
|
|
99
|
+
"anchors": {
|
|
100
|
+
"structure": "#slice-structure",
|
|
101
|
+
"rules": "#slice-rules",
|
|
102
|
+
"cqrs": "#cqrs-in-slices"
|
|
103
|
+
},
|
|
104
|
+
"digest": "Organize by feature, not layer. Each slice contains Command/Query, Handler, Validator, Response. No cross-slice dependencies — shared code goes to a dedicated Shared project. Use MediatR for in-process CQRS dispatch.",
|
|
105
|
+
"stacks": [
|
|
106
|
+
"dotnet"
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "backend-api-validation",
|
|
111
|
+
"name": "validation",
|
|
112
|
+
"path": "backend/api/validation.md",
|
|
113
|
+
"category": "backend",
|
|
114
|
+
"subcategory": "api",
|
|
115
|
+
"tags": [
|
|
116
|
+
"backend",
|
|
117
|
+
"api"
|
|
118
|
+
],
|
|
119
|
+
"aliases": [
|
|
120
|
+
"FluentValidation",
|
|
121
|
+
"input validation",
|
|
122
|
+
"request validation",
|
|
123
|
+
"API validation",
|
|
124
|
+
"model validation"
|
|
125
|
+
],
|
|
126
|
+
"anchors": {
|
|
127
|
+
"fluent": "#fluentvalidation-setup",
|
|
128
|
+
"rules": "#validation-rules"
|
|
129
|
+
},
|
|
130
|
+
"digest": "Use FluentValidation for all request validation. Register validators as scoped services. Return 422 UnprocessableEntity with field-level error messages. Validate at API boundary — not inside domain logic. Never trust client-side validation alone.",
|
|
131
|
+
"stacks": [
|
|
132
|
+
"dotnet"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "backend-database-postgresql-database",
|
|
137
|
+
"name": "database",
|
|
138
|
+
"path": "backend/database/postgresql/database.md",
|
|
139
|
+
"category": "backend",
|
|
140
|
+
"subcategory": "database",
|
|
141
|
+
"tags": [
|
|
142
|
+
"backend",
|
|
143
|
+
"database",
|
|
144
|
+
"postgresql"
|
|
145
|
+
],
|
|
146
|
+
"aliases": [
|
|
147
|
+
"PostgreSQL",
|
|
148
|
+
"postgres",
|
|
149
|
+
"pg",
|
|
150
|
+
"database design",
|
|
151
|
+
"SQL schema"
|
|
152
|
+
],
|
|
153
|
+
"anchors": {
|
|
154
|
+
"schema": "#schema-design",
|
|
155
|
+
"indexes": "#index-strategy"
|
|
156
|
+
},
|
|
157
|
+
"digest": "Use timestamptz for all timestamps (not timestamp). UUID primary keys for public-facing IDs. Add indexes on FK columns and frequently filtered columns. Use GIN indexes for JSON/array columns. JSONB over JSON. Row-level security for multi-tenant. Never store binary in columns — use storage URLs.",
|
|
158
|
+
"stacks": [
|
|
159
|
+
"dotnet"
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": "backend-database-vector-search-rag",
|
|
164
|
+
"name": "vector search rag",
|
|
165
|
+
"path": "backend/database/vector-search-rag.md",
|
|
166
|
+
"category": "backend",
|
|
167
|
+
"subcategory": "database",
|
|
168
|
+
"tags": [
|
|
169
|
+
"backend",
|
|
170
|
+
"database"
|
|
171
|
+
],
|
|
172
|
+
"aliases": [
|
|
173
|
+
"vector search",
|
|
174
|
+
"RAG",
|
|
175
|
+
"embeddings",
|
|
176
|
+
"pgvector",
|
|
177
|
+
"semantic search"
|
|
178
|
+
],
|
|
179
|
+
"anchors": {
|
|
180
|
+
"chunking": "#chunking-strategy",
|
|
181
|
+
"retrieval": "#retrieval-patterns"
|
|
182
|
+
},
|
|
183
|
+
"digest": "Chunk documents with 512 token size and 50 token overlap for RAG. Embed with text-embedding-3-small. Store embedding + metadata (source, chunk index). Retrieve top-k=5 by cosine similarity. Re-rank before injecting into LLM context. Use pgvector HNSW index for performance at scale.",
|
|
184
|
+
"stacks": [
|
|
185
|
+
"dotnet-vsa",
|
|
186
|
+
"nextjs-supabase"
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": "backend-dotnet-result-pattern",
|
|
191
|
+
"name": "result pattern",
|
|
192
|
+
"path": "backend/dotnet/result-pattern.md",
|
|
193
|
+
"category": "backend",
|
|
194
|
+
"subcategory": "dotnet",
|
|
195
|
+
"tags": [
|
|
196
|
+
"backend",
|
|
197
|
+
"dotnet",
|
|
198
|
+
"vsa"
|
|
199
|
+
],
|
|
200
|
+
"aliases": [
|
|
201
|
+
"Result<T>",
|
|
202
|
+
"railway oriented",
|
|
203
|
+
"error handling",
|
|
204
|
+
"Match pattern",
|
|
205
|
+
"Result monad"
|
|
206
|
+
],
|
|
207
|
+
"anchors": {
|
|
208
|
+
"anatomy": "#result-anatomy",
|
|
209
|
+
"errors": "#error-types-7--custom",
|
|
210
|
+
"match": "#match-pattern"
|
|
211
|
+
},
|
|
212
|
+
"digest": "Use Result<T> for all handler returns — never throw for expected failures. 7 error types (Failure, Unexpected, Validation, Conflict, NotFound, Unauthorized, Forbidden) map to HTTP status codes. Use Match() in endpoints to convert Result to IResult. Implicit conversions allow returning values or errors directly from handlers.",
|
|
213
|
+
"stacks": [
|
|
214
|
+
"dotnet"
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"id": "backend-dotnet-scrutor",
|
|
219
|
+
"name": "scrutor",
|
|
220
|
+
"path": "backend/dotnet/scrutor.md",
|
|
221
|
+
"category": "backend",
|
|
222
|
+
"subcategory": "dotnet",
|
|
223
|
+
"tags": [
|
|
224
|
+
"backend",
|
|
225
|
+
"dotnet",
|
|
226
|
+
"vsa"
|
|
227
|
+
],
|
|
228
|
+
"aliases": [
|
|
229
|
+
"Scrutor",
|
|
230
|
+
"auto-discovery",
|
|
231
|
+
"assembly scanning",
|
|
232
|
+
"decorator registration",
|
|
233
|
+
"handler registration"
|
|
234
|
+
],
|
|
235
|
+
"anchors": {
|
|
236
|
+
"handlers": "#handler-auto-discovery",
|
|
237
|
+
"decorators": "#decorator-order",
|
|
238
|
+
"endpoints": "#endpoint-auto-discovery"
|
|
239
|
+
},
|
|
240
|
+
"digest": "Use Scrutor for convention-based DI registration. AddHandlersFromAssembly() scans for IHandler<,> implementations. Decorate<> applies pipeline decorators (validation, logging) — last registered wraps outermost. Register validators before handlers. RegisterApiEndpointsFromAssembly() auto-discovers IApiEndpoint implementations.",
|
|
241
|
+
"stacks": [
|
|
242
|
+
"dotnet"
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"id": "backend-dotnet-fluent-validation-vsa",
|
|
247
|
+
"name": "fluent validation vsa",
|
|
248
|
+
"path": "backend/dotnet/fluent-validation-vsa.md",
|
|
249
|
+
"category": "backend",
|
|
250
|
+
"subcategory": "dotnet",
|
|
251
|
+
"tags": [
|
|
252
|
+
"backend",
|
|
253
|
+
"dotnet",
|
|
254
|
+
"vsa"
|
|
255
|
+
],
|
|
256
|
+
"aliases": [
|
|
257
|
+
"FluentValidation VSA",
|
|
258
|
+
"validation decorator",
|
|
259
|
+
"validation pipeline",
|
|
260
|
+
"AbstractValidator",
|
|
261
|
+
"ValidationDecorator"
|
|
262
|
+
],
|
|
263
|
+
"anchors": {
|
|
264
|
+
"validator": "#validator-structure",
|
|
265
|
+
"decorator": "#validationdecorator-pattern",
|
|
266
|
+
"conversion": "#fluentvalidation-to-validationerror-conversion"
|
|
267
|
+
},
|
|
268
|
+
"digest": "Use AbstractValidator<T> per request DTO in feature folders. ValidationDecorator intercepts all handlers via Scrutor, runs validators in parallel, and short-circuits to Result.Failure(ValidationError) on failure. Register AddValidatorsFromAssembly() before AddHandlersFromAssembly(). Never validate inside handlers.",
|
|
269
|
+
"stacks": [
|
|
270
|
+
"dotnet"
|
|
271
|
+
]
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"id": "backend-dotnet-scalar-ui",
|
|
275
|
+
"name": "scalar ui",
|
|
276
|
+
"path": "backend/dotnet/scalar-ui.md",
|
|
277
|
+
"category": "backend",
|
|
278
|
+
"subcategory": "dotnet",
|
|
279
|
+
"tags": [
|
|
280
|
+
"backend",
|
|
281
|
+
"dotnet",
|
|
282
|
+
"vsa"
|
|
283
|
+
],
|
|
284
|
+
"aliases": [
|
|
285
|
+
"Scalar",
|
|
286
|
+
"API documentation",
|
|
287
|
+
"OpenAPI UI",
|
|
288
|
+
"Swagger replacement",
|
|
289
|
+
"Scalar.AspNetCore"
|
|
290
|
+
],
|
|
291
|
+
"anchors": {
|
|
292
|
+
"setup": "#programcs-configuration",
|
|
293
|
+
"tags": "#apitags-organization",
|
|
294
|
+
"metadata": "#endpoint-metadata"
|
|
295
|
+
},
|
|
296
|
+
"digest": "Use Scalar.AspNetCore 2.12.40 as API documentation UI — replaces Swagger. MapScalarApiReference() with DeepSpace theme. Group endpoints with .WithTags() and ApiTags constants. Document responses with .Produces<T>(). Guard MapOpenApi() with IsDevelopment(). No Swashbuckle needed.",
|
|
297
|
+
"stacks": [
|
|
298
|
+
"dotnet"
|
|
299
|
+
]
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"id": "backend-dotnet-vsa-handler-patterns",
|
|
303
|
+
"name": "vsa handler patterns",
|
|
304
|
+
"path": "backend/dotnet/vsa-handler-patterns.md",
|
|
305
|
+
"category": "backend",
|
|
306
|
+
"subcategory": "dotnet",
|
|
307
|
+
"tags": [
|
|
308
|
+
"backend",
|
|
309
|
+
"dotnet",
|
|
310
|
+
"vsa"
|
|
311
|
+
],
|
|
312
|
+
"aliases": [
|
|
313
|
+
"VSA handler",
|
|
314
|
+
"vertical slice handler",
|
|
315
|
+
"feature slice",
|
|
316
|
+
"IHandler pattern",
|
|
317
|
+
"handler endpoint"
|
|
318
|
+
],
|
|
319
|
+
"anchors": {
|
|
320
|
+
"handler": "#ihandlertrequest-tresponse",
|
|
321
|
+
"folder": "#feature-folder-structure-5-files-per-slice",
|
|
322
|
+
"endpoint": "#complete-endpoint-example",
|
|
323
|
+
"registration": "#programcs-di-registration-order"
|
|
324
|
+
},
|
|
325
|
+
"digest": "Each VSA feature is 5 files: Request, Response, Handler, Validator, Endpoint. Use IHandler<TReq,TRes> (not MediatR). Sealed records for DTOs, primary constructors for DI, Guid.CreateVersion7() for IDs. Handler calls Repository+UnitOfWork directly — no service layer. CancellationToken in every async call.",
|
|
326
|
+
"stacks": [
|
|
327
|
+
"dotnet"
|
|
328
|
+
]
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"id": "backend-integrations-asaas-asaas-api",
|
|
332
|
+
"name": "asaas api",
|
|
333
|
+
"path": "backend/integrations/asaas/asaas-api.md",
|
|
334
|
+
"category": "backend",
|
|
335
|
+
"subcategory": "integrations",
|
|
336
|
+
"tags": [
|
|
337
|
+
"backend",
|
|
338
|
+
"integrations",
|
|
339
|
+
"asaas"
|
|
340
|
+
],
|
|
341
|
+
"aliases": [
|
|
342
|
+
"asaas",
|
|
343
|
+
"payment",
|
|
344
|
+
"PIX",
|
|
345
|
+
"boleto",
|
|
346
|
+
"Brazilian payment"
|
|
347
|
+
],
|
|
348
|
+
"anchors": {
|
|
349
|
+
"payments": "#payment-types",
|
|
350
|
+
"webhooks": "#webhook-handling"
|
|
351
|
+
},
|
|
352
|
+
"digest": "Use AsaasClient SDK — never call REST API directly. Register as scoped service. Implement webhook signature verification. Map SDK enums to domain enums at integration boundary. Use idempotency keys for retry safety. Test with Asaas sandbox environment.",
|
|
353
|
+
"stacks": [
|
|
354
|
+
"dotnet"
|
|
355
|
+
]
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"id": "backend-integrations-clerk-clerk-auth",
|
|
359
|
+
"name": "clerk auth",
|
|
360
|
+
"path": "backend/integrations/clerk/clerk-auth.md",
|
|
361
|
+
"category": "backend",
|
|
362
|
+
"subcategory": "integrations",
|
|
363
|
+
"tags": [
|
|
364
|
+
"backend",
|
|
365
|
+
"integrations",
|
|
366
|
+
"clerk"
|
|
367
|
+
],
|
|
368
|
+
"aliases": [
|
|
369
|
+
"clerk",
|
|
370
|
+
"authentication",
|
|
371
|
+
"OAuth",
|
|
372
|
+
"JWT",
|
|
373
|
+
"session management"
|
|
374
|
+
],
|
|
375
|
+
"anchors": {
|
|
376
|
+
"setup": "#clerk-setup",
|
|
377
|
+
"middleware": "#auth-middleware"
|
|
378
|
+
},
|
|
379
|
+
"digest": "Add ClerkMiddleware to ASP.NET pipeline. Access userId via User.GetClerkUserId(). Configure allowed redirect URLs in Clerk dashboard. Use [Authorize] for protected endpoints. Never store passwords — Clerk manages credentials. Sync Clerk users to local DB on first login.",
|
|
380
|
+
"stacks": [
|
|
381
|
+
"dotnet"
|
|
382
|
+
]
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
"id": "backend-integrations-hangfire-hangfire-jobs",
|
|
386
|
+
"name": "hangfire jobs",
|
|
387
|
+
"path": "backend/integrations/hangfire/hangfire-jobs.md",
|
|
388
|
+
"category": "backend",
|
|
389
|
+
"subcategory": "integrations",
|
|
390
|
+
"tags": [
|
|
391
|
+
"backend",
|
|
392
|
+
"integrations",
|
|
393
|
+
"hangfire"
|
|
394
|
+
],
|
|
395
|
+
"aliases": [
|
|
396
|
+
"hangfire",
|
|
397
|
+
"background jobs",
|
|
398
|
+
"scheduled jobs",
|
|
399
|
+
"recurring",
|
|
400
|
+
"cron",
|
|
401
|
+
"fire and forget"
|
|
402
|
+
],
|
|
403
|
+
"anchors": {
|
|
404
|
+
"jobs": "#job-types",
|
|
405
|
+
"retry": "#retry-policies"
|
|
406
|
+
},
|
|
407
|
+
"digest": "Use IDbContextFactory for scoped DB operations in jobs — never inject DbContext directly into job classes. BackgroundJob.Enqueue for fire-and-forget, RecurringJob.AddOrUpdate for cron. Add RetryCountAttribute for retries. Secure Hangfire Dashboard with auth in production. Never put long-running work in a single job — decompose.",
|
|
408
|
+
"stacks": [
|
|
409
|
+
"dotnet"
|
|
410
|
+
]
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"id": "backend-integrations-resend-resend-email",
|
|
414
|
+
"name": "resend email",
|
|
415
|
+
"path": "backend/integrations/resend/resend-email.md",
|
|
416
|
+
"category": "backend",
|
|
417
|
+
"subcategory": "integrations",
|
|
418
|
+
"tags": [
|
|
419
|
+
"backend",
|
|
420
|
+
"integrations",
|
|
421
|
+
"resend"
|
|
422
|
+
],
|
|
423
|
+
"aliases": [
|
|
424
|
+
"resend",
|
|
425
|
+
"email",
|
|
426
|
+
"transactional email",
|
|
427
|
+
"SMTP",
|
|
428
|
+
"email notification"
|
|
429
|
+
],
|
|
430
|
+
"anchors": {
|
|
431
|
+
"sending": "#send-email",
|
|
432
|
+
"templates": "#email-templates"
|
|
433
|
+
},
|
|
434
|
+
"digest": "Register ResendClient as singleton. Provide both HTML and plain-text alternatives. Handle bounce/complaint webhooks to maintain sender reputation. Never send from test domains in production. Queue emails via Hangfire for reliability — don't send inline in request handlers.",
|
|
435
|
+
"stacks": [
|
|
436
|
+
"dotnet"
|
|
437
|
+
]
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
"id": "data-nosql-cache-redis",
|
|
441
|
+
"name": "redis",
|
|
442
|
+
"path": "data/nosql/cache/redis.md",
|
|
443
|
+
"category": "data",
|
|
444
|
+
"subcategory": "nosql",
|
|
445
|
+
"tags": [
|
|
446
|
+
"data",
|
|
447
|
+
"nosql",
|
|
448
|
+
"cache"
|
|
449
|
+
],
|
|
450
|
+
"aliases": [
|
|
451
|
+
"redis",
|
|
452
|
+
"cache",
|
|
453
|
+
"distributed cache",
|
|
454
|
+
"IDistributedCache",
|
|
455
|
+
"cache-aside",
|
|
456
|
+
"StackExchange.Redis"
|
|
457
|
+
],
|
|
458
|
+
"anchors": {
|
|
459
|
+
"patterns": "#cache-patterns",
|
|
460
|
+
"invalidation": "#cache-invalidation"
|
|
461
|
+
},
|
|
462
|
+
"digest": "IDistributedCache for cache-aside pattern. Set TTL on every entry — never cache without expiry. Serialize with System.Text.Json. Sliding expiration for sessions, absolute for computed results. Invalidate by key prefix. Redis eviction policy must be set (allkeys-lru). Never cache PII without encryption.",
|
|
463
|
+
"stacks": [
|
|
464
|
+
"dotnet",
|
|
465
|
+
"azure"
|
|
466
|
+
]
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"id": "data-nosql-cosmos-db",
|
|
470
|
+
"name": "cosmos db",
|
|
471
|
+
"path": "data/nosql/cosmos-db.md",
|
|
472
|
+
"category": "data",
|
|
473
|
+
"subcategory": "nosql",
|
|
474
|
+
"tags": [
|
|
475
|
+
"data",
|
|
476
|
+
"nosql"
|
|
477
|
+
],
|
|
478
|
+
"aliases": [
|
|
479
|
+
"cosmos",
|
|
480
|
+
"CosmosDB",
|
|
481
|
+
"document database",
|
|
482
|
+
"partition key",
|
|
483
|
+
"RUs"
|
|
484
|
+
],
|
|
485
|
+
"anchors": {
|
|
486
|
+
"modeling": "#document-modeling",
|
|
487
|
+
"queries": "#query-patterns"
|
|
488
|
+
},
|
|
489
|
+
"digest": "Choose partition key with high cardinality for even distribution. Design documents for single-partition reads. Enable TTL for ephemeral data. Prefer point reads (O(1)) over cross-partition queries. Set provisioned throughput based on measured RUs. Use change feed for event-driven processing.",
|
|
490
|
+
"stacks": [
|
|
491
|
+
"dotnet",
|
|
492
|
+
"azure"
|
|
493
|
+
]
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
"id": "data-vector-search-rag-chunking",
|
|
497
|
+
"name": "rag chunking",
|
|
498
|
+
"path": "data/vector-search/rag-chunking.md",
|
|
499
|
+
"category": "data",
|
|
500
|
+
"subcategory": "vector-search",
|
|
501
|
+
"tags": [
|
|
502
|
+
"data",
|
|
503
|
+
"vector-search"
|
|
504
|
+
],
|
|
505
|
+
"aliases": [
|
|
506
|
+
"RAG chunking",
|
|
507
|
+
"document chunking",
|
|
508
|
+
"text splitting",
|
|
509
|
+
"chunk overlap",
|
|
510
|
+
"embedding chunks"
|
|
511
|
+
],
|
|
512
|
+
"anchors": {
|
|
513
|
+
"strategies": "#chunking-strategies",
|
|
514
|
+
"retrieval": "#retrieval-pipeline"
|
|
515
|
+
},
|
|
516
|
+
"digest": "Recursive character splitting: 512 token chunks, 50 token overlap. Embed with text-embedding-3-small (1536 dims). Store chunk + metadata (source, page, section). Retrieve top-k=5 by cosine similarity. Re-rank with cross-encoder before LLM injection. Evaluate retrieval quality with RAGAS.",
|
|
517
|
+
"stacks": [
|
|
518
|
+
"dotnet",
|
|
519
|
+
"azure"
|
|
520
|
+
]
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
"id": "frontend-design-system-animations",
|
|
524
|
+
"name": "animations",
|
|
525
|
+
"path": "frontend/design-system/animations.md",
|
|
526
|
+
"category": "frontend",
|
|
527
|
+
"subcategory": "design-system",
|
|
528
|
+
"tags": [
|
|
529
|
+
"frontend",
|
|
530
|
+
"design-system"
|
|
531
|
+
],
|
|
532
|
+
"aliases": [
|
|
533
|
+
"animations",
|
|
534
|
+
"transitions",
|
|
535
|
+
"motion",
|
|
536
|
+
"CSS animations",
|
|
537
|
+
"keyframes",
|
|
538
|
+
"prefers-reduced-motion"
|
|
539
|
+
],
|
|
540
|
+
"anchors": {
|
|
541
|
+
"tokens": "#animation-tokens",
|
|
542
|
+
"principles": "#motion-principles"
|
|
543
|
+
},
|
|
544
|
+
"digest": "Use CSS custom properties for durations: --duration-fast (100ms), --duration-normal (200ms), --duration-slow (300ms). Prefer transform/opacity for GPU-accelerated animations. Always respect prefers-reduced-motion. No decorative animations over 300ms. Ease-out for entrances, ease-in for exits.",
|
|
545
|
+
"stacks": [
|
|
546
|
+
"*"
|
|
547
|
+
]
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
"id": "frontend-design-system-naming",
|
|
551
|
+
"name": "naming",
|
|
552
|
+
"path": "frontend/design-system/naming.md",
|
|
553
|
+
"category": "frontend",
|
|
554
|
+
"subcategory": "design-system",
|
|
555
|
+
"tags": [
|
|
556
|
+
"frontend",
|
|
557
|
+
"design-system"
|
|
558
|
+
],
|
|
559
|
+
"aliases": [
|
|
560
|
+
"BEM",
|
|
561
|
+
"CSS naming",
|
|
562
|
+
"class naming",
|
|
563
|
+
"design token naming",
|
|
564
|
+
"component naming"
|
|
565
|
+
],
|
|
566
|
+
"anchors": {
|
|
567
|
+
"blocks": "#bem-blocks",
|
|
568
|
+
"tokens": "#token-naming"
|
|
569
|
+
},
|
|
570
|
+
"digest": "BEM for CSS: .block__element--modifier. Design tokens: --color-primary-500, --spacing-4, --font-size-base. Component names PascalCase (React/Next.js) / kebab-case (CSS). No generic names (blue, big). Semantic names only: --color-action, --spacing-page-gutter. Tokens are the single source of truth.",
|
|
571
|
+
"stacks": [
|
|
572
|
+
"*"
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"id": "frontend-nextjs-app-router",
|
|
577
|
+
"name": "app router",
|
|
578
|
+
"path": "frontend/nextjs/app-router.md",
|
|
579
|
+
"category": "frontend",
|
|
580
|
+
"subcategory": "nextjs",
|
|
581
|
+
"tags": [
|
|
582
|
+
"frontend",
|
|
583
|
+
"nextjs"
|
|
584
|
+
],
|
|
585
|
+
"aliases": [
|
|
586
|
+
"app router",
|
|
587
|
+
"Next.js 14",
|
|
588
|
+
"server components",
|
|
589
|
+
"app directory",
|
|
590
|
+
"RSC"
|
|
591
|
+
],
|
|
592
|
+
"anchors": {
|
|
593
|
+
"layout": "#layout-patterns",
|
|
594
|
+
"routing": "#routing-patterns"
|
|
595
|
+
},
|
|
596
|
+
"digest": "Server Components by default — only add 'use client' when needed (interactivity, browser APIs, hooks). Layouts persist across navigations. Parallel Routes with @folder for simultaneous views. Route Groups with (folder) to organize without affecting URL. Use generateMetadata() for dynamic SEO metadata.",
|
|
597
|
+
"stacks": [
|
|
598
|
+
"nextjs"
|
|
599
|
+
]
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"id": "frontend-nextjs-components",
|
|
603
|
+
"name": "components",
|
|
604
|
+
"path": "frontend/nextjs/components.md",
|
|
605
|
+
"category": "frontend",
|
|
606
|
+
"subcategory": "nextjs",
|
|
607
|
+
"tags": [
|
|
608
|
+
"frontend",
|
|
609
|
+
"nextjs"
|
|
610
|
+
],
|
|
611
|
+
"aliases": [
|
|
612
|
+
"react components",
|
|
613
|
+
"server component",
|
|
614
|
+
"client component",
|
|
615
|
+
"shadcn/ui",
|
|
616
|
+
"UI components"
|
|
617
|
+
],
|
|
618
|
+
"anchors": {
|
|
619
|
+
"patterns": "#component-patterns",
|
|
620
|
+
"shadcn": "#shadcn-usage"
|
|
621
|
+
},
|
|
622
|
+
"digest": "Server Components for data fetching and static content. Client Components for interactivity. shadcn/ui components are copy-paste — customize in src/components/ui/. Never use index.tsx for named exports. One component per file. Avoid prop drilling — use composition or Context API.",
|
|
623
|
+
"stacks": [
|
|
624
|
+
"nextjs"
|
|
625
|
+
]
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
"id": "frontend-nextjs-data-fetching",
|
|
629
|
+
"name": "data fetching",
|
|
630
|
+
"path": "frontend/nextjs/data-fetching.md",
|
|
631
|
+
"category": "frontend",
|
|
632
|
+
"subcategory": "nextjs",
|
|
633
|
+
"tags": [
|
|
634
|
+
"frontend",
|
|
635
|
+
"nextjs"
|
|
636
|
+
],
|
|
637
|
+
"aliases": [
|
|
638
|
+
"TanStack Query",
|
|
639
|
+
"react-query",
|
|
640
|
+
"server actions",
|
|
641
|
+
"data fetching",
|
|
642
|
+
"useQuery"
|
|
643
|
+
],
|
|
644
|
+
"anchors": {
|
|
645
|
+
"server": "#server-fetching",
|
|
646
|
+
"client": "#client-fetching"
|
|
647
|
+
},
|
|
648
|
+
"digest": "Server Components: fetch() with caching tags for static/ISR. Client Components: TanStack Query useQuery/useMutation for client-side state. Server Actions for mutations from Client Components. Never fetch in useEffect — use TanStack Query. Set revalidate intervals for ISR. Use React Suspense for loading states.",
|
|
649
|
+
"stacks": [
|
|
650
|
+
"nextjs"
|
|
651
|
+
]
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
"id": "frontend-nextjs-forms",
|
|
655
|
+
"name": "forms",
|
|
656
|
+
"path": "frontend/nextjs/forms.md",
|
|
657
|
+
"category": "frontend",
|
|
658
|
+
"subcategory": "nextjs",
|
|
659
|
+
"tags": [
|
|
660
|
+
"frontend",
|
|
661
|
+
"nextjs"
|
|
662
|
+
],
|
|
663
|
+
"aliases": [
|
|
664
|
+
"react-hook-form",
|
|
665
|
+
"Zod",
|
|
666
|
+
"form validation",
|
|
667
|
+
"Server Actions forms",
|
|
668
|
+
"useFormState"
|
|
669
|
+
],
|
|
670
|
+
"anchors": {
|
|
671
|
+
"validation": "#zod-schemas",
|
|
672
|
+
"submission": "#form-submission"
|
|
673
|
+
},
|
|
674
|
+
"digest": "react-hook-form with Zod resolver for client forms. Define Zod schema before component. Server Actions for mutations: 'use server' directive. Use useFormState/useActionState for Server Action feedback. Never submit to API routes — use Server Actions or React Query mutations. Display field-level errors from Zod.",
|
|
675
|
+
"stacks": [
|
|
676
|
+
"nextjs"
|
|
677
|
+
]
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
"id": "frontend-nextjs-naming-conventions",
|
|
681
|
+
"name": "naming conventions",
|
|
682
|
+
"path": "frontend/nextjs/naming-conventions.md",
|
|
683
|
+
"category": "frontend",
|
|
684
|
+
"subcategory": "nextjs",
|
|
685
|
+
"tags": [
|
|
686
|
+
"frontend",
|
|
687
|
+
"nextjs"
|
|
688
|
+
],
|
|
689
|
+
"aliases": [
|
|
690
|
+
"naming conventions",
|
|
691
|
+
"file naming",
|
|
692
|
+
"component naming",
|
|
693
|
+
"Next.js naming",
|
|
694
|
+
"TypeScript naming"
|
|
695
|
+
],
|
|
696
|
+
"anchors": {
|
|
697
|
+
"files": "#file-naming",
|
|
698
|
+
"components": "#component-naming"
|
|
699
|
+
},
|
|
700
|
+
"digest": "Pages: lowercase kebab-case (user-profile/page.tsx). Components: PascalCase (UserProfile.tsx). Hooks: camelCase with 'use' prefix (useUserProfile.ts). API routes: kebab-case. Types: PascalCase. No default exports except page.tsx and layout.tsx. Feature-based co-location preferred.",
|
|
701
|
+
"stacks": [
|
|
702
|
+
"nextjs"
|
|
703
|
+
]
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
"id": "frontend-nextjs-nextjs-patterns",
|
|
707
|
+
"name": "nextjs patterns",
|
|
708
|
+
"path": "frontend/nextjs/nextjs-patterns.md",
|
|
709
|
+
"category": "frontend",
|
|
710
|
+
"subcategory": "nextjs",
|
|
711
|
+
"tags": [
|
|
712
|
+
"frontend",
|
|
713
|
+
"nextjs"
|
|
714
|
+
],
|
|
715
|
+
"aliases": [
|
|
716
|
+
"Next.js patterns",
|
|
717
|
+
"middleware",
|
|
718
|
+
"auth patterns",
|
|
719
|
+
"caching patterns",
|
|
720
|
+
"image optimization"
|
|
721
|
+
],
|
|
722
|
+
"anchors": {
|
|
723
|
+
"auth": "#auth-patterns",
|
|
724
|
+
"caching": "#caching-patterns"
|
|
725
|
+
},
|
|
726
|
+
"digest": "Middleware for auth redirects (use matcher config). next/image for all images (auto-optimization). next/link for navigation (prefetching). loading.tsx for Suspense boundaries per route. error.tsx for error boundaries. Use unstable_cache for expensive server computations with tag-based revalidation.",
|
|
727
|
+
"stacks": [
|
|
728
|
+
"nextjs"
|
|
729
|
+
]
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
"id": "frontend-nextjs-project-structure",
|
|
733
|
+
"name": "project structure",
|
|
734
|
+
"path": "frontend/nextjs/project-structure.md",
|
|
735
|
+
"category": "frontend",
|
|
736
|
+
"subcategory": "nextjs",
|
|
737
|
+
"tags": [
|
|
738
|
+
"frontend",
|
|
739
|
+
"nextjs"
|
|
740
|
+
],
|
|
741
|
+
"aliases": [
|
|
742
|
+
"project structure",
|
|
743
|
+
"folder structure",
|
|
744
|
+
"src directory",
|
|
745
|
+
"app directory organization"
|
|
746
|
+
],
|
|
747
|
+
"anchors": {
|
|
748
|
+
"structure": "#directory-structure",
|
|
749
|
+
"organization": "#feature-organization"
|
|
750
|
+
},
|
|
751
|
+
"digest": "src/app/ for routes, src/components/ for shared UI, src/lib/ for utilities, src/hooks/ for custom hooks, src/types/ for TypeScript types. Co-locate feature components near their routes. Public API via components/index.ts. Avoid barrel files in app/ directory. Keep pages thin — logic in hooks and utilities.",
|
|
752
|
+
"stacks": [
|
|
753
|
+
"nextjs"
|
|
754
|
+
]
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"id": "frontend-nextjs-state-management",
|
|
758
|
+
"name": "state management",
|
|
759
|
+
"path": "frontend/nextjs/state-management.md",
|
|
760
|
+
"category": "frontend",
|
|
761
|
+
"subcategory": "nextjs",
|
|
762
|
+
"tags": [
|
|
763
|
+
"frontend",
|
|
764
|
+
"nextjs"
|
|
765
|
+
],
|
|
766
|
+
"aliases": [
|
|
767
|
+
"zustand",
|
|
768
|
+
"React context",
|
|
769
|
+
"global state",
|
|
770
|
+
"state management",
|
|
771
|
+
"client state"
|
|
772
|
+
],
|
|
773
|
+
"anchors": {
|
|
774
|
+
"patterns": "#state-patterns",
|
|
775
|
+
"server": "#server-state"
|
|
776
|
+
},
|
|
777
|
+
"digest": "TanStack Query for server state (caching, background sync, optimistic updates). Zustand for global client state (auth, theme, user preferences). URL params for shareable UI state (filters, pagination). useState for local component state. Avoid Redux — Zustand is sufficient for most Next.js use cases.",
|
|
778
|
+
"stacks": [
|
|
779
|
+
"nextjs"
|
|
780
|
+
]
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"id": "frontend-nextjs-testing",
|
|
784
|
+
"name": "testing",
|
|
785
|
+
"path": "frontend/nextjs/testing.md",
|
|
786
|
+
"category": "frontend",
|
|
787
|
+
"subcategory": "nextjs",
|
|
788
|
+
"tags": [
|
|
789
|
+
"frontend",
|
|
790
|
+
"nextjs"
|
|
791
|
+
],
|
|
792
|
+
"aliases": [
|
|
793
|
+
"vitest",
|
|
794
|
+
"jest",
|
|
795
|
+
"testing-library",
|
|
796
|
+
"Playwright",
|
|
797
|
+
"Next.js testing",
|
|
798
|
+
"component tests"
|
|
799
|
+
],
|
|
800
|
+
"anchors": {
|
|
801
|
+
"unit": "#unit-tests",
|
|
802
|
+
"e2e": "#e2e-tests"
|
|
803
|
+
},
|
|
804
|
+
"digest": "Vitest for unit tests, React Testing Library for component tests. Mock next/navigation with vi.mock. Test Server Actions with direct function calls. Use MSW for API mocking in component tests. Playwright for E2E tests against running app. Never test implementation details — test user behavior and output.",
|
|
805
|
+
"stacks": [
|
|
806
|
+
"nextjs"
|
|
807
|
+
]
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
"id": "infrastructure-docker-easypanel-deploy",
|
|
811
|
+
"name": "easypanel deploy",
|
|
812
|
+
"path": "infrastructure/docker/easypanel-deploy.md",
|
|
813
|
+
"category": "infrastructure",
|
|
814
|
+
"subcategory": "docker",
|
|
815
|
+
"tags": [
|
|
816
|
+
"infrastructure",
|
|
817
|
+
"docker"
|
|
818
|
+
],
|
|
819
|
+
"aliases": [
|
|
820
|
+
"easypanel",
|
|
821
|
+
"docker deploy",
|
|
822
|
+
"self-hosted",
|
|
823
|
+
"VPS deployment",
|
|
824
|
+
"docker compose"
|
|
825
|
+
],
|
|
826
|
+
"anchors": {
|
|
827
|
+
"setup": "#easypanel-setup",
|
|
828
|
+
"deployment": "#deployment-flow"
|
|
829
|
+
},
|
|
830
|
+
"digest": "Create app in EasyPanel from container registry image. Configure environment variables in EasyPanel UI — not in Dockerfile. Use EasyPanel's managed Postgres/Redis for databases. Configure /health endpoint for health checks. Enable HTTPS via Let's Encrypt automatically. Use EasyPanel volumes for persistent storage.",
|
|
831
|
+
"stacks": [
|
|
832
|
+
"docker"
|
|
833
|
+
]
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
"id": "infrastructure-supabase-local-dev",
|
|
837
|
+
"name": "local development",
|
|
838
|
+
"path": "infrastructure/supabase/mcp-setup.md",
|
|
839
|
+
"category": "infrastructure",
|
|
840
|
+
"subcategory": "supabase",
|
|
841
|
+
"tags": [
|
|
842
|
+
"infrastructure",
|
|
843
|
+
"supabase"
|
|
844
|
+
],
|
|
845
|
+
"aliases": [
|
|
846
|
+
"supabase CLI",
|
|
847
|
+
"supabase local",
|
|
848
|
+
"supabase tools",
|
|
849
|
+
"supabase configuration",
|
|
850
|
+
"MCP supabase"
|
|
851
|
+
],
|
|
852
|
+
"anchors": {
|
|
853
|
+
"setup": "#mcp-configuration",
|
|
854
|
+
"tools": "#available-tools"
|
|
855
|
+
},
|
|
856
|
+
"digest": "Use Supabase CLI (npx supabase ...) targeting local Docker instance for all database operations. Run npx supabase status to get DB URL, npx supabase db dump --local for schema inspection, psql for queries, and npx supabase migration up --local for migrations. Never connect to production — local is the single source of truth during development.",
|
|
857
|
+
"stacks": [
|
|
858
|
+
"supabase"
|
|
859
|
+
]
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"id": "infrastructure-supabase-supabase-auth",
|
|
863
|
+
"name": "supabase auth",
|
|
864
|
+
"path": "infrastructure/supabase/supabase-auth.md",
|
|
865
|
+
"category": "infrastructure",
|
|
866
|
+
"subcategory": "supabase",
|
|
867
|
+
"tags": [
|
|
868
|
+
"infrastructure",
|
|
869
|
+
"supabase"
|
|
870
|
+
],
|
|
871
|
+
"aliases": [
|
|
872
|
+
"supabase auth",
|
|
873
|
+
"magic link",
|
|
874
|
+
"OAuth",
|
|
875
|
+
"JWT supabase",
|
|
876
|
+
"row level security auth"
|
|
877
|
+
],
|
|
878
|
+
"anchors": {
|
|
879
|
+
"setup": "#auth-setup",
|
|
880
|
+
"providers": "#auth-providers"
|
|
881
|
+
},
|
|
882
|
+
"digest": "Use Supabase Auth for magic links, OAuth (Google, GitHub), phone OTP. Configure site URL and redirect URLs in dashboard. Server-side: use supabase.auth.getUser() not getSession(). Enable email confirmations for production. JWT expiry 3600s. RLS policies must reference auth.uid() for user isolation.",
|
|
883
|
+
"stacks": [
|
|
884
|
+
"supabase"
|
|
885
|
+
]
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"id": "infrastructure-supabase-supabase-pgvector",
|
|
889
|
+
"name": "supabase pgvector",
|
|
890
|
+
"path": "infrastructure/supabase/supabase-pgvector.md",
|
|
891
|
+
"category": "infrastructure",
|
|
892
|
+
"subcategory": "supabase",
|
|
893
|
+
"tags": [
|
|
894
|
+
"infrastructure",
|
|
895
|
+
"supabase"
|
|
896
|
+
],
|
|
897
|
+
"aliases": [
|
|
898
|
+
"pgvector",
|
|
899
|
+
"vector embeddings",
|
|
900
|
+
"similarity search",
|
|
901
|
+
"supabase vectors",
|
|
902
|
+
"HNSW index"
|
|
903
|
+
],
|
|
904
|
+
"anchors": {
|
|
905
|
+
"setup": "#pgvector-setup",
|
|
906
|
+
"queries": "#similarity-queries"
|
|
907
|
+
},
|
|
908
|
+
"digest": "Enable: CREATE EXTENSION vector. Define column as vector(1536) for OpenAI embeddings. Create HNSW index: CREATE INDEX USING hnsw (embedding vector_cosine_ops). Use match_documents() RPC for similarity search. Batch insert embeddings (100 at a time). RLS policies apply to vector queries like all other tables.",
|
|
909
|
+
"stacks": [
|
|
910
|
+
"supabase"
|
|
911
|
+
]
|
|
912
|
+
},
|
|
913
|
+
{
|
|
914
|
+
"id": "infrastructure-supabase-supabase-rls",
|
|
915
|
+
"name": "supabase rls",
|
|
916
|
+
"path": "infrastructure/supabase/supabase-rls.md",
|
|
917
|
+
"category": "infrastructure",
|
|
918
|
+
"subcategory": "supabase",
|
|
919
|
+
"tags": [
|
|
920
|
+
"infrastructure",
|
|
921
|
+
"supabase"
|
|
922
|
+
],
|
|
923
|
+
"aliases": [
|
|
924
|
+
"RLS",
|
|
925
|
+
"row level security",
|
|
926
|
+
"postgres policies",
|
|
927
|
+
"multi-tenant security",
|
|
928
|
+
"supabase policies"
|
|
929
|
+
],
|
|
930
|
+
"anchors": {
|
|
931
|
+
"policies": "#rls-policies",
|
|
932
|
+
"patterns": "#tenant-patterns"
|
|
933
|
+
},
|
|
934
|
+
"digest": "Enable RLS on every table: ALTER TABLE ... ENABLE ROW LEVEL SECURITY. User isolation: USING (auth.uid() = user_id). Multi-tenant: USING (tenant_id = (auth.jwt()->>'tenant_id')::uuid). Test policies with SET LOCAL ROLE anon. Service role bypasses RLS — use only server-side. Never rely on application-level security alone.",
|
|
935
|
+
"stacks": [
|
|
936
|
+
"supabase"
|
|
937
|
+
]
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
"id": "infrastructure-supabase-supabase-storage",
|
|
941
|
+
"name": "supabase storage",
|
|
942
|
+
"path": "infrastructure/supabase/supabase-storage.md",
|
|
943
|
+
"category": "infrastructure",
|
|
944
|
+
"subcategory": "supabase",
|
|
945
|
+
"tags": [
|
|
946
|
+
"infrastructure",
|
|
947
|
+
"supabase"
|
|
948
|
+
],
|
|
949
|
+
"aliases": [
|
|
950
|
+
"supabase storage",
|
|
951
|
+
"file uploads",
|
|
952
|
+
"storage buckets",
|
|
953
|
+
"storage policies",
|
|
954
|
+
"signed URLs"
|
|
955
|
+
],
|
|
956
|
+
"anchors": {
|
|
957
|
+
"buckets": "#bucket-setup",
|
|
958
|
+
"policies": "#storage-policies"
|
|
959
|
+
},
|
|
960
|
+
"digest": "Public buckets for CDN-served assets, private for user files (signed URLs). Storage policies use same RLS syntax as tables. Upload: supabase.storage.from('bucket').upload(path, file). Signed URLs: createSignedUrl(path, 3600). Set content-type on upload. Enable image transformations for on-the-fly resizing.",
|
|
961
|
+
"stacks": [
|
|
962
|
+
"supabase"
|
|
963
|
+
]
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
"id": "infrastructure-supabase-supabase-custom-jwt",
|
|
967
|
+
"name": "supabase custom jwt",
|
|
968
|
+
"path": "infrastructure/supabase/supabase-custom-jwt.md",
|
|
969
|
+
"category": "infrastructure",
|
|
970
|
+
"subcategory": "supabase",
|
|
971
|
+
"tags": [
|
|
972
|
+
"infrastructure",
|
|
973
|
+
"supabase",
|
|
974
|
+
"jwt"
|
|
975
|
+
],
|
|
976
|
+
"aliases": [
|
|
977
|
+
"custom JWT",
|
|
978
|
+
"JWT signing",
|
|
979
|
+
"token creation",
|
|
980
|
+
"JWT claims"
|
|
981
|
+
],
|
|
982
|
+
"anchors": {
|
|
983
|
+
"creation": "#jwt-token-creation",
|
|
984
|
+
"claims": "#custom-claims-structure",
|
|
985
|
+
"refresh": "#jwt-refresh-patterns"
|
|
986
|
+
},
|
|
987
|
+
"digest": "Create custom JWTs with jose (Node.js) or System.IdentityModel.Tokens.Jwt (.NET). Always set expiry, use HS256/RS256, include tenant_id in app_metadata for RLS. Refresh tokens via rotation. Store JWT secret in env vars only.",
|
|
988
|
+
"stacks": [
|
|
989
|
+
"dotnet",
|
|
990
|
+
"nextjs"
|
|
991
|
+
]
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
"id": "integration-mcp-mcp-tools",
|
|
995
|
+
"name": "mcp tools",
|
|
996
|
+
"path": "integration/mcp/mcp-tools.md",
|
|
997
|
+
"category": "integration",
|
|
998
|
+
"subcategory": "mcp",
|
|
999
|
+
"tags": [
|
|
1000
|
+
"integration",
|
|
1001
|
+
"mcp"
|
|
1002
|
+
],
|
|
1003
|
+
"aliases": [
|
|
1004
|
+
"MCP",
|
|
1005
|
+
"Model Context Protocol",
|
|
1006
|
+
"Claude tools",
|
|
1007
|
+
"MCP server",
|
|
1008
|
+
"MCP client"
|
|
1009
|
+
],
|
|
1010
|
+
"anchors": {
|
|
1011
|
+
"tools": "#tool-definitions",
|
|
1012
|
+
"setup": "#server-setup"
|
|
1013
|
+
},
|
|
1014
|
+
"digest": "MCP tools extend Claude with external data and actions. Tools are synchronous request-response with typed inputSchema. Resources provide read-only data access. Prompts are reusable templates. Register MCP servers in .claude/settings.json. Prefer @context7 for live library docs. Test tools with MCP Inspector before integrating.",
|
|
1015
|
+
"stacks": [
|
|
1016
|
+
"*"
|
|
1017
|
+
]
|
|
1018
|
+
}
|
|
1019
|
+
],
|
|
1020
|
+
"total": 67
|
|
1021
|
+
}
|