@vodailoc/kilo-kit-mcp 1.1.0 → 1.2.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/.mcp/kilo-kit.codex-windows.toml +5 -0
- package/LICENSE +190 -190
- package/QUICKSTART.md +265 -255
- package/README.md +321 -267
- package/mcp/README.md +64 -12
- package/mcp/dist/formatters.js +142 -1
- package/mcp/dist/orchestration-audit.js +20 -0
- package/mcp/dist/orchestration-memory.js +258 -0
- package/mcp/dist/orchestration-types.js +1 -0
- package/mcp/dist/orchestrator.js +222 -0
- package/mcp/dist/question-templates.js +249 -0
- package/mcp/dist/route-analytics.js +149 -0
- package/mcp/dist/router.js +75 -82
- package/mcp/dist/routing-policy-data.js +241 -0
- package/mcp/dist/routing-policy.js +145 -0
- package/mcp/dist/server.js +93 -4
- package/mcp/dist/smoke-env.js +18 -0
- package/mcp/dist/smoke.js +68 -1
- package/mcp/package.json +1 -2
- package/package.json +3 -2
- package/skills/README.md +647 -647
- package/skills/SKILLS_INDEX.md +139 -139
- package/skills/ai-media/ai-multimodal/.env.example +97 -97
- package/skills/ai-media/ai-multimodal/SKILL.md +357 -357
- package/skills/ai-media/ai-multimodal/references/audio-processing.md +373 -373
- package/skills/ai-media/ai-multimodal/references/image-generation.md +558 -558
- package/skills/ai-media/ai-multimodal/references/video-analysis.md +502 -502
- package/skills/ai-media/ai-multimodal/references/vision-understanding.md +483 -483
- package/skills/ai-media/ai-multimodal/scripts/document_converter.py +395 -395
- package/skills/ai-media/ai-multimodal/scripts/gemini_batch_process.py +480 -480
- package/skills/ai-media/ai-multimodal/scripts/media_optimizer.py +506 -506
- package/skills/ai-media/ai-multimodal/scripts/requirements.txt +26 -26
- package/skills/ai-media/ai-multimodal/scripts/tests/requirements.txt +20 -20
- package/skills/ai-media/ai-multimodal/scripts/tests/test_document_converter.py +299 -299
- package/skills/ai-media/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -362
- package/skills/ai-media/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -373
- package/skills/ai-media/media-processing/SKILL.md +358 -358
- package/skills/ai-media/media-processing/references/ffmpeg-encoding.md +358 -358
- package/skills/ai-media/media-processing/references/ffmpeg-filters.md +503 -503
- package/skills/ai-media/media-processing/references/ffmpeg-streaming.md +403 -403
- package/skills/ai-media/media-processing/references/format-compatibility.md +375 -375
- package/skills/ai-media/media-processing/references/imagemagick-batch.md +612 -612
- package/skills/ai-media/media-processing/references/imagemagick-editing.md +623 -623
- package/skills/ai-media/media-processing/scripts/batch_resize.py +342 -342
- package/skills/ai-media/media-processing/scripts/media_convert.py +311 -311
- package/skills/ai-media/media-processing/scripts/requirements.txt +24 -24
- package/skills/ai-media/media-processing/scripts/tests/requirements.txt +2 -2
- package/skills/ai-media/media-processing/scripts/tests/test_batch_resize.py +372 -372
- package/skills/ai-media/media-processing/scripts/tests/test_media_convert.py +259 -259
- package/skills/ai-media/media-processing/scripts/tests/test_video_optimize.py +397 -397
- package/skills/ai-media/media-processing/scripts/video_optimize.py +414 -414
- package/skills/ai-media/screenshot/LICENSE.txt +201 -201
- package/skills/ai-media/screenshot/SKILL.md +267 -267
- package/skills/ai-media/screenshot/agents/openai.yaml +6 -6
- package/skills/ai-media/screenshot/assets/screenshot-small.svg +5 -5
- package/skills/ai-media/screenshot/scripts/ensure_macos_permissions.sh +54 -54
- package/skills/ai-media/screenshot/scripts/macos_display_info.swift +22 -22
- package/skills/ai-media/screenshot/scripts/macos_permissions.swift +40 -40
- package/skills/ai-media/screenshot/scripts/macos_window_info.swift +126 -126
- package/skills/ai-media/screenshot/scripts/take_screenshot.ps1 +163 -163
- package/skills/ai-media/screenshot/scripts/take_screenshot.py +585 -585
- package/skills/ai-media/sora/LICENSE.txt +201 -201
- package/skills/ai-media/sora/SKILL.md +153 -153
- package/skills/ai-media/sora/agents/openai.yaml +6 -6
- package/skills/ai-media/sora/assets/sora-small.svg +4 -4
- package/skills/ai-media/sora/references/cinematic-shots.md +53 -53
- package/skills/ai-media/sora/references/cli.md +248 -248
- package/skills/ai-media/sora/references/codex-network.md +28 -28
- package/skills/ai-media/sora/references/prompting.md +137 -137
- package/skills/ai-media/sora/references/sample-prompts.md +95 -95
- package/skills/ai-media/sora/references/social-ads.md +42 -42
- package/skills/ai-media/sora/references/troubleshooting.md +58 -58
- package/skills/ai-media/sora/references/video-api.md +45 -45
- package/skills/ai-media/sora/scripts/sora.py +970 -970
- package/skills/design/aesthetic/SKILL.md +121 -121
- package/skills/design/aesthetic/assets/design-guideline-template.md +163 -163
- package/skills/design/aesthetic/assets/design-story-template.md +135 -135
- package/skills/design/aesthetic/references/design-principles.md +62 -62
- package/skills/design/aesthetic/references/design-resources.md +75 -75
- package/skills/design/aesthetic/references/micro-interactions.md +53 -53
- package/skills/design/aesthetic/references/storytelling-design.md +50 -50
- package/skills/design/figma/LICENSE.txt +202 -202
- package/skills/design/figma/SKILL.md +42 -42
- package/skills/design/figma/agents/openai.yaml +14 -14
- package/skills/design/figma/assets/figma-small.svg +3 -3
- package/skills/design/figma/assets/icon.svg +28 -28
- package/skills/design/figma/references/figma-mcp-config.md +35 -35
- package/skills/design/figma/references/figma-tools-and-prompts.md +34 -34
- package/skills/design/figma-implement-design/LICENSE.txt +202 -202
- package/skills/design/figma-implement-design/SKILL.md +264 -264
- package/skills/design/figma-implement-design/agents/openai.yaml +14 -14
- package/skills/design/figma-implement-design/assets/figma-small.svg +3 -3
- package/skills/design/figma-implement-design/assets/icon.svg +28 -28
- package/skills/design/frontend-design/SKILL.md +41 -41
- package/skills/design/frontend-design/references/animejs.md +395 -395
- package/skills/design/ui-styling/LICENSE.txt +201 -201
- package/skills/design/ui-styling/SKILL.md +321 -321
- package/skills/design/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -94
- package/skills/design/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Jura-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Lora-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -93
- package/skills/design/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -93
- package/skills/design/ui-styling/references/canvas-design-system.md +320 -320
- package/skills/design/ui-styling/references/shadcn-accessibility.md +471 -471
- package/skills/design/ui-styling/references/shadcn-components.md +424 -424
- package/skills/design/ui-styling/references/shadcn-theming.md +373 -373
- package/skills/design/ui-styling/references/tailwind-customization.md +483 -483
- package/skills/design/ui-styling/references/tailwind-responsive.md +382 -382
- package/skills/design/ui-styling/references/tailwind-utilities.md +455 -455
- package/skills/design/ui-styling/scripts/requirements.txt +17 -17
- package/skills/design/ui-styling/scripts/shadcn_add.py +292 -292
- package/skills/design/ui-styling/scripts/tailwind_config_gen.py +456 -456
- package/skills/design/ui-styling/scripts/tests/requirements.txt +3 -3
- package/skills/design/ui-styling/scripts/tests/test_shadcn_add.py +266 -266
- package/skills/design/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -336
- package/skills/engineering/aspnet-core/LICENSE.txt +201 -201
- package/skills/engineering/aspnet-core/SKILL.md +61 -61
- package/skills/engineering/aspnet-core/agents/openai.yaml +5 -5
- package/skills/engineering/aspnet-core/references/_sections.md +40 -40
- package/skills/engineering/aspnet-core/references/apis-minimal-and-controllers.md +81 -81
- package/skills/engineering/aspnet-core/references/data-state-and-services.md +69 -69
- package/skills/engineering/aspnet-core/references/program-and-pipeline.md +103 -103
- package/skills/engineering/aspnet-core/references/realtime-grpc-and-background-work.md +58 -58
- package/skills/engineering/aspnet-core/references/security-and-identity.md +75 -75
- package/skills/engineering/aspnet-core/references/source-map.md +43 -43
- package/skills/engineering/aspnet-core/references/stack-selection.md +63 -63
- package/skills/engineering/aspnet-core/references/testing-performance-and-operations.md +92 -92
- package/skills/engineering/aspnet-core/references/ui-blazor.md +53 -53
- package/skills/engineering/aspnet-core/references/ui-mvc.md +56 -56
- package/skills/engineering/aspnet-core/references/ui-razor-pages.md +55 -55
- package/skills/engineering/aspnet-core/references/versioning-and-upgrades.md +51 -51
- package/skills/engineering/backend-development/SKILL.md +95 -95
- package/skills/engineering/backend-development/references/backend-api-design.md +495 -495
- package/skills/engineering/backend-development/references/backend-architecture.md +454 -454
- package/skills/engineering/backend-development/references/backend-authentication.md +338 -338
- package/skills/engineering/backend-development/references/backend-code-quality.md +659 -659
- package/skills/engineering/backend-development/references/backend-debugging.md +904 -904
- package/skills/engineering/backend-development/references/backend-devops.md +494 -494
- package/skills/engineering/backend-development/references/backend-mindset.md +387 -387
- package/skills/engineering/backend-development/references/backend-performance.md +397 -397
- package/skills/engineering/backend-development/references/backend-security.md +290 -290
- package/skills/engineering/backend-development/references/backend-technologies.md +256 -256
- package/skills/engineering/backend-development/references/backend-testing.md +429 -429
- package/skills/engineering/better-auth/SKILL.md +204 -204
- package/skills/engineering/better-auth/references/advanced-features.md +553 -553
- package/skills/engineering/better-auth/references/database-integration.md +577 -577
- package/skills/engineering/better-auth/references/email-password-auth.md +416 -416
- package/skills/engineering/better-auth/references/oauth-providers.md +430 -430
- package/skills/engineering/better-auth/scripts/better_auth_init.py +521 -521
- package/skills/engineering/better-auth/scripts/requirements.txt +15 -15
- package/skills/engineering/better-auth/scripts/tests/test_better_auth_init.py +421 -421
- package/skills/engineering/code-review/SKILL.md +140 -140
- package/skills/engineering/code-review/references/code-review-reception.md +208 -208
- package/skills/engineering/code-review/references/requesting-code-review.md +104 -104
- package/skills/engineering/code-review/references/verification-before-completion.md +138 -138
- package/skills/engineering/context-engineering/SKILL.md +86 -86
- package/skills/engineering/context-engineering/references/context-compression.md +84 -84
- package/skills/engineering/context-engineering/references/context-degradation.md +93 -93
- package/skills/engineering/context-engineering/references/context-fundamentals.md +75 -75
- package/skills/engineering/context-engineering/references/context-optimization.md +82 -82
- package/skills/engineering/context-engineering/references/evaluation.md +89 -89
- package/skills/engineering/context-engineering/references/memory-systems.md +88 -88
- package/skills/engineering/context-engineering/references/multi-agent-patterns.md +90 -90
- package/skills/engineering/context-engineering/references/project-development.md +97 -97
- package/skills/engineering/context-engineering/references/tool-design.md +86 -86
- package/skills/engineering/context-engineering/scripts/compression_evaluator.py +329 -329
- package/skills/engineering/context-engineering/scripts/context_analyzer.py +294 -294
- package/skills/engineering/databases/SKILL.md +232 -232
- package/skills/engineering/databases/references/mongodb-aggregation.md +447 -447
- package/skills/engineering/databases/references/mongodb-atlas.md +465 -465
- package/skills/engineering/databases/references/mongodb-crud.md +408 -408
- package/skills/engineering/databases/references/mongodb-indexing.md +442 -442
- package/skills/engineering/databases/references/postgresql-administration.md +594 -594
- package/skills/engineering/databases/references/postgresql-performance.md +527 -527
- package/skills/engineering/databases/references/postgresql-psql-cli.md +467 -467
- package/skills/engineering/databases/references/postgresql-queries.md +475 -475
- package/skills/engineering/databases/scripts/db_backup.py +502 -502
- package/skills/engineering/databases/scripts/db_migrate.py +414 -414
- package/skills/engineering/databases/scripts/db_performance_check.py +444 -444
- package/skills/engineering/databases/scripts/requirements.txt +20 -20
- package/skills/engineering/databases/scripts/tests/requirements.txt +4 -4
- package/skills/engineering/databases/scripts/tests/test_db_backup.py +340 -340
- package/skills/engineering/databases/scripts/tests/test_db_migrate.py +277 -277
- package/skills/engineering/databases/scripts/tests/test_db_performance_check.py +370 -370
- package/skills/engineering/diagnose/SKILL.md +117 -117
- package/skills/engineering/diagnose/scripts/hitl-loop.template.sh +41 -41
- package/skills/engineering/docs-seeker/SKILL.md +207 -207
- package/skills/engineering/docs-seeker/WORKFLOWS.md +505 -505
- package/skills/engineering/docs-seeker/references/best-practices.md +632 -632
- package/skills/engineering/docs-seeker/references/documentation-sources.md +461 -461
- package/skills/engineering/docs-seeker/references/error-handling.md +621 -621
- package/skills/engineering/docs-seeker/references/limitations.md +821 -821
- package/skills/engineering/docs-seeker/references/performance.md +574 -574
- package/skills/engineering/docs-seeker/references/tool-selection.md +262 -262
- package/skills/engineering/frontend-development/SKILL.md +398 -398
- package/skills/engineering/frontend-development/resources/common-patterns.md +330 -330
- package/skills/engineering/frontend-development/resources/complete-examples.md +871 -871
- package/skills/engineering/frontend-development/resources/component-patterns.md +501 -501
- package/skills/engineering/frontend-development/resources/data-fetching.md +766 -766
- package/skills/engineering/frontend-development/resources/file-organization.md +501 -501
- package/skills/engineering/frontend-development/resources/loading-and-error-states.md +500 -500
- package/skills/engineering/frontend-development/resources/performance.md +405 -405
- package/skills/engineering/frontend-development/resources/routing-guide.md +363 -363
- package/skills/engineering/frontend-development/resources/styling-guide.md +427 -427
- package/skills/engineering/frontend-development/resources/typescript-standards.md +417 -417
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +37 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +44 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +53 -53
- package/skills/engineering/improve-codebase-architecture/SKILL.md +71 -71
- package/skills/engineering/openai-docs/LICENSE.txt +201 -201
- package/skills/engineering/openai-docs/SKILL.md +69 -69
- package/skills/engineering/openai-docs/agents/openai.yaml +14 -14
- package/skills/engineering/openai-docs/assets/openai-small.svg +3 -3
- package/skills/engineering/openai-docs/references/gpt-5p4-prompting-guide.md +433 -433
- package/skills/engineering/openai-docs/references/latest-model.md +35 -35
- package/skills/engineering/openai-docs/references/upgrading-to-gpt-5p4.md +164 -164
- package/skills/engineering/playwright/LICENSE.txt +201 -201
- package/skills/engineering/playwright/NOTICE.txt +14 -14
- package/skills/engineering/playwright/SKILL.md +147 -147
- package/skills/engineering/playwright/agents/openai.yaml +6 -6
- package/skills/engineering/playwright/assets/playwright-small.svg +3 -3
- package/skills/engineering/playwright/references/cli.md +116 -116
- package/skills/engineering/playwright/references/workflows.md +95 -95
- package/skills/engineering/playwright/scripts/playwright_cli.sh +25 -25
- package/skills/engineering/playwright-interactive/LICENSE.txt +201 -201
- package/skills/engineering/playwright-interactive/NOTICE.txt +13 -13
- package/skills/engineering/playwright-interactive/SKILL.md +689 -689
- package/skills/engineering/playwright-interactive/agents/openai.yaml +6 -6
- package/skills/engineering/playwright-interactive/assets/playwright-small.svg +3 -3
- package/skills/engineering/render-deploy/LICENSE.txt +201 -201
- package/skills/engineering/render-deploy/SKILL.md +479 -479
- package/skills/engineering/render-deploy/agents/openai.yaml +14 -14
- package/skills/engineering/render-deploy/assets/docker.yaml +62 -62
- package/skills/engineering/render-deploy/assets/go-api.yaml +35 -35
- package/skills/engineering/render-deploy/assets/nextjs-postgres.yaml +35 -35
- package/skills/engineering/render-deploy/assets/node-express.yaml +25 -25
- package/skills/engineering/render-deploy/assets/python-django.yaml +89 -89
- package/skills/engineering/render-deploy/assets/render-small.svg +3 -3
- package/skills/engineering/render-deploy/assets/static-site.yaml +54 -54
- package/skills/engineering/render-deploy/references/blueprint-spec.md +718 -718
- package/skills/engineering/render-deploy/references/codebase-analysis.md +49 -49
- package/skills/engineering/render-deploy/references/configuration-guide.md +603 -603
- package/skills/engineering/render-deploy/references/deployment-details.md +224 -224
- package/skills/engineering/render-deploy/references/direct-creation.md +113 -113
- package/skills/engineering/render-deploy/references/error-patterns.md +13 -13
- package/skills/engineering/render-deploy/references/post-deploy-checks.md +36 -36
- package/skills/engineering/render-deploy/references/runtimes.md +473 -473
- package/skills/engineering/render-deploy/references/service-types.md +450 -450
- package/skills/engineering/render-deploy/references/troubleshooting-basics.md +36 -36
- package/skills/engineering/repomix/SKILL.md +215 -215
- package/skills/engineering/repomix/references/configuration.md +211 -211
- package/skills/engineering/repomix/references/usage-patterns.md +232 -232
- package/skills/engineering/repomix/scripts/README.md +179 -179
- package/skills/engineering/repomix/scripts/repomix_batch.py +455 -455
- package/skills/engineering/repomix/scripts/repos.example.json +15 -15
- package/skills/engineering/repomix/scripts/requirements.txt +15 -15
- package/skills/engineering/repomix/scripts/tests/test_repomix_batch.py +531 -531
- package/skills/engineering/setup-matt-pocock-skills/SKILL.md +121 -121
- package/skills/engineering/setup-matt-pocock-skills/domain.md +51 -51
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +22 -22
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +23 -23
- package/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +19 -19
- package/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -15
- package/skills/engineering/shopify/README.md +66 -66
- package/skills/engineering/shopify/SKILL.md +319 -319
- package/skills/engineering/shopify/references/app-development.md +470 -470
- package/skills/engineering/shopify/references/extensions.md +493 -493
- package/skills/engineering/shopify/references/themes.md +498 -498
- package/skills/engineering/shopify/scripts/requirements.txt +19 -19
- package/skills/engineering/shopify/scripts/shopify_init.py +423 -423
- package/skills/engineering/shopify/scripts/tests/test_shopify_init.py +385 -385
- package/skills/engineering/tdd/SKILL.md +109 -109
- package/skills/engineering/tdd/deep-modules.md +33 -33
- package/skills/engineering/tdd/interface-design.md +31 -31
- package/skills/engineering/tdd/mocking.md +59 -59
- package/skills/engineering/tdd/refactoring.md +10 -10
- package/skills/engineering/tdd/tests.md +61 -61
- package/skills/engineering/to-issues/SKILL.md +81 -81
- package/skills/engineering/to-prd/SKILL.md +74 -74
- package/skills/engineering/triage/AGENT-BRIEF.md +168 -168
- package/skills/engineering/triage/OUT-OF-SCOPE.md +101 -101
- package/skills/engineering/triage/SKILL.md +103 -103
- package/skills/engineering/web-frameworks/SKILL.md +324 -324
- package/skills/engineering/web-frameworks/references/nextjs-app-router.md +465 -465
- package/skills/engineering/web-frameworks/references/nextjs-data-fetching.md +459 -459
- package/skills/engineering/web-frameworks/references/nextjs-optimization.md +511 -511
- package/skills/engineering/web-frameworks/references/nextjs-server-components.md +495 -495
- package/skills/engineering/web-frameworks/references/remix-icon-integration.md +603 -603
- package/skills/engineering/web-frameworks/references/turborepo-caching.md +551 -551
- package/skills/engineering/web-frameworks/references/turborepo-pipelines.md +517 -517
- package/skills/engineering/web-frameworks/references/turborepo-setup.md +542 -542
- package/skills/engineering/web-frameworks/scripts/nextjs_init.py +547 -547
- package/skills/engineering/web-frameworks/scripts/requirements.txt +16 -16
- package/skills/engineering/web-frameworks/scripts/tests/requirements.txt +3 -3
- package/skills/engineering/web-frameworks/scripts/tests/test_nextjs_init.py +319 -319
- package/skills/engineering/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -374
- package/skills/engineering/web-frameworks/scripts/turborepo_migrate.py +394 -394
- package/skills/engineering/write-a-skill/SKILL.md +117 -117
- package/skills/kilo-kit/SKILL.md +346 -346
- package/skills/kilo-kit/_template/SKILL.md +185 -185
- package/skills/kilo-kit/debugging/root-cause/SKILL.md +360 -360
- package/skills/kilo-kit/debugging/systematic/SKILL.md +339 -339
- package/skills/kilo-kit/debugging/verification/SKILL.md +424 -424
- package/skills/kilo-kit/development/backend/SKILL.md +540 -540
- package/skills/kilo-kit/development/security/SKILL.md +529 -529
- package/skills/kilo-kit/quality/code-review/SKILL.md +297 -297
- package/skills/kilo-kit/quality/testing/SKILL.md +540 -540
- package/skills/kilo-kit/references/output-formats.md +204 -204
- package/skills/kilo-kit/references/patterns.md +156 -156
- package/skills/kilo-kit/references/performance-benchmarks.md +90 -90
- package/skills/operations/chrome-devtools/SKILL.md +392 -392
- package/skills/operations/chrome-devtools/references/cdp-domains.md +694 -694
- package/skills/operations/chrome-devtools/references/performance-guide.md +940 -940
- package/skills/operations/chrome-devtools/references/puppeteer-reference.md +953 -953
- package/skills/operations/chrome-devtools/scripts/PERSISTENT-BROWSER.md +107 -107
- package/skills/operations/chrome-devtools/scripts/README.md +213 -213
- package/skills/operations/chrome-devtools/scripts/__tests__/selector.test.js +210 -210
- package/skills/operations/chrome-devtools/scripts/click.js +79 -79
- package/skills/operations/chrome-devtools/scripts/close-persistent.js +36 -36
- package/skills/operations/chrome-devtools/scripts/console.js +75 -75
- package/skills/operations/chrome-devtools/scripts/evaluate.js +49 -49
- package/skills/operations/chrome-devtools/scripts/fill.js +72 -72
- package/skills/operations/chrome-devtools/scripts/install-deps.sh +181 -181
- package/skills/operations/chrome-devtools/scripts/install.sh +83 -83
- package/skills/operations/chrome-devtools/scripts/launch-persistent.js +71 -71
- package/skills/operations/chrome-devtools/scripts/lib/browser.js +144 -144
- package/skills/operations/chrome-devtools/scripts/lib/selector.js +178 -178
- package/skills/operations/chrome-devtools/scripts/navigate.js +46 -46
- package/skills/operations/chrome-devtools/scripts/network.js +102 -102
- package/skills/operations/chrome-devtools/scripts/package-lock.json +1206 -1206
- package/skills/operations/chrome-devtools/scripts/package.json +15 -15
- package/skills/operations/chrome-devtools/scripts/performance.js +145 -145
- package/skills/operations/chrome-devtools/scripts/screenshot.js +180 -180
- package/skills/operations/chrome-devtools/scripts/snapshot.js +131 -131
- package/skills/operations/devops/.env.example +76 -76
- package/skills/operations/devops/SKILL.md +285 -285
- package/skills/operations/devops/references/browser-rendering.md +305 -305
- package/skills/operations/devops/references/cloudflare-d1-kv.md +123 -123
- package/skills/operations/devops/references/cloudflare-platform.md +271 -271
- package/skills/operations/devops/references/cloudflare-r2-storage.md +280 -280
- package/skills/operations/devops/references/cloudflare-workers-advanced.md +312 -312
- package/skills/operations/devops/references/cloudflare-workers-apis.md +309 -309
- package/skills/operations/devops/references/cloudflare-workers-basics.md +418 -418
- package/skills/operations/devops/references/docker-basics.md +297 -297
- package/skills/operations/devops/references/docker-compose.md +292 -292
- package/skills/operations/devops/references/gcloud-platform.md +297 -297
- package/skills/operations/devops/references/gcloud-services.md +304 -304
- package/skills/operations/devops/scripts/cloudflare_deploy.py +269 -269
- package/skills/operations/devops/scripts/docker_optimize.py +320 -320
- package/skills/operations/devops/scripts/requirements.txt +20 -20
- package/skills/operations/devops/scripts/tests/requirements.txt +3 -3
- package/skills/operations/devops/scripts/tests/test_cloudflare_deploy.py +285 -285
- package/skills/operations/devops/scripts/tests/test_docker_optimize.py +436 -436
- package/skills/operations/mcp-builder/LICENSE.txt +201 -201
- package/skills/operations/mcp-builder/SKILL.md +328 -328
- package/skills/operations/mcp-builder/reference/evaluation.md +601 -601
- package/skills/operations/mcp-builder/reference/mcp_best_practices.md +915 -915
- package/skills/operations/mcp-builder/reference/node_mcp_server.md +915 -915
- package/skills/operations/mcp-builder/reference/python_mcp_server.md +751 -751
- package/skills/operations/mcp-builder/scripts/connections.py +151 -151
- package/skills/operations/mcp-builder/scripts/evaluation.py +373 -373
- package/skills/operations/mcp-builder/scripts/example_evaluation.xml +22 -22
- package/skills/operations/mcp-builder/scripts/requirements.txt +2 -2
- package/skills/operations/mcp-management/README.md +219 -219
- package/skills/operations/mcp-management/SKILL.md +175 -175
- package/skills/operations/mcp-management/assets/tools.json +3043 -3043
- package/skills/operations/mcp-management/references/configuration.md +114 -114
- package/skills/operations/mcp-management/references/gemini-cli-integration.md +201 -201
- package/skills/operations/mcp-management/references/mcp-protocol.md +116 -116
- package/skills/operations/mcp-management/scripts/.env.example +10 -10
- package/skills/operations/mcp-management/scripts/cli.ts +155 -155
- package/skills/operations/mcp-management/scripts/dist/analyze-tools.js +70 -70
- package/skills/operations/mcp-management/scripts/dist/cli.js +131 -131
- package/skills/operations/mcp-management/scripts/dist/mcp-client.js +115 -115
- package/skills/operations/mcp-management/scripts/mcp-client.ts +163 -163
- package/skills/operations/mcp-management/scripts/package.json +18 -18
- package/skills/operations/mcp-management/scripts/tsconfig.json +15 -15
- package/skills/problem-solving/collision-zone-thinking/SKILL.md +62 -62
- package/skills/problem-solving/defense-in-depth/SKILL.md +130 -130
- package/skills/problem-solving/inversion-exercise/SKILL.md +58 -58
- package/skills/problem-solving/meta-pattern-recognition/SKILL.md +54 -54
- package/skills/problem-solving/root-cause-tracing/SKILL.md +177 -177
- package/skills/problem-solving/root-cause-tracing/find-polluter.sh +63 -63
- package/skills/problem-solving/scale-game/SKILL.md +63 -63
- package/skills/problem-solving/sequential-thinking/README.md +118 -118
- package/skills/problem-solving/sequential-thinking/SKILL.md +93 -93
- package/skills/problem-solving/sequential-thinking/references/advanced.md +122 -122
- package/skills/problem-solving/sequential-thinking/references/examples.md +274 -274
- package/skills/problem-solving/simplification-cascades/SKILL.md +76 -76
- package/skills/problem-solving/when-stuck/SKILL.md +88 -88
- package/skills/productivity/caveman/SKILL.md +49 -49
- package/skills/productivity/grill-me/SKILL.md +10 -10
- package/skills/productivity/grill-with-docs/ADR-FORMAT.md +47 -47
- package/skills/productivity/grill-with-docs/CONTEXT-FORMAT.md +77 -77
- package/skills/productivity/grill-with-docs/SKILL.md +88 -88
- package/skills/productivity/writing-skills/graphviz-conventions.dot +171 -171
- package/skills/productivity/zoom-out/SKILL.md +7 -7
- package/skills/writing-docs/doc/LICENSE.txt +201 -201
- package/skills/writing-docs/doc/SKILL.md +80 -80
- package/skills/writing-docs/doc/agents/openai.yaml +6 -6
- package/skills/writing-docs/doc/assets/doc-small.svg +3 -3
- package/skills/writing-docs/doc/scripts/render_docx.py +296 -296
- package/skills/writing-docs/docx/LICENSE.txt +30 -30
- package/skills/writing-docs/docx/SKILL.md +196 -196
- package/skills/writing-docs/docx/docx-js.md +349 -349
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
- package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
- package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
- package/skills/writing-docs/docx/ooxml/schemas/mce/mc.xsd +75 -75
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -560
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -67
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -14
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -20
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -13
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
- package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -8
- package/skills/writing-docs/docx/ooxml/scripts/pack.py +159 -159
- package/skills/writing-docs/docx/ooxml/scripts/unpack.py +29 -29
- package/skills/writing-docs/docx/ooxml/scripts/validate.py +69 -69
- package/skills/writing-docs/docx/ooxml/scripts/validation/__init__.py +15 -15
- package/skills/writing-docs/docx/ooxml/scripts/validation/base.py +951 -951
- package/skills/writing-docs/docx/ooxml/scripts/validation/docx.py +274 -274
- package/skills/writing-docs/docx/ooxml/scripts/validation/pptx.py +315 -315
- package/skills/writing-docs/docx/ooxml/scripts/validation/redlining.py +279 -279
- package/skills/writing-docs/docx/ooxml.md +609 -609
- package/skills/writing-docs/docx/scripts/__init__.py +1 -1
- package/skills/writing-docs/docx/scripts/document.py +1276 -1276
- package/skills/writing-docs/docx/scripts/templates/comments.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/commentsExtended.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/commentsExtensible.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/commentsIds.xml +2 -2
- package/skills/writing-docs/docx/scripts/templates/people.xml +2 -2
- package/skills/writing-docs/docx/scripts/utilities.py +374 -374
- package/skills/writing-docs/mermaidjs-v11/SKILL.md +115 -115
- package/skills/writing-docs/mermaidjs-v11/references/cli-usage.md +228 -228
- package/skills/writing-docs/mermaidjs-v11/references/configuration.md +232 -232
- package/skills/writing-docs/mermaidjs-v11/references/diagram-types.md +315 -315
- package/skills/writing-docs/mermaidjs-v11/references/examples.md +344 -344
- package/skills/writing-docs/mermaidjs-v11/references/integration.md +310 -310
- package/skills/writing-docs/pdf/LICENSE.txt +30 -30
- package/skills/writing-docs/pdf/SKILL.md +294 -294
- package/skills/writing-docs/pdf/forms.md +205 -205
- package/skills/writing-docs/pdf/reference.md +611 -611
- package/skills/writing-docs/pdf/scripts/check_bounding_boxes.py +70 -70
- package/skills/writing-docs/pdf/scripts/check_bounding_boxes_test.py +226 -226
- package/skills/writing-docs/pdf/scripts/check_fillable_fields.py +12 -12
- package/skills/writing-docs/pdf/scripts/convert_pdf_to_images.py +35 -35
- package/skills/writing-docs/pdf/scripts/create_validation_image.py +41 -41
- package/skills/writing-docs/pdf/scripts/extract_form_field_info.py +152 -152
- package/skills/writing-docs/pdf/scripts/fill_fillable_fields.py +114 -114
- package/skills/writing-docs/pdf/scripts/fill_pdf_form_with_annotations.py +107 -107
- package/skills/writing-docs/pptx/LICENSE.txt +30 -30
- package/skills/writing-docs/pptx/SKILL.md +483 -483
- package/skills/writing-docs/pptx/html2pptx.md +624 -624
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
- package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
- package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
- package/skills/writing-docs/pptx/ooxml/schemas/mce/mc.xsd +75 -75
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -560
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -67
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -14
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -20
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -13
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
- package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -8
- package/skills/writing-docs/pptx/ooxml/scripts/pack.py +159 -159
- package/skills/writing-docs/pptx/ooxml/scripts/unpack.py +29 -29
- package/skills/writing-docs/pptx/ooxml/scripts/validate.py +69 -69
- package/skills/writing-docs/pptx/ooxml/scripts/validation/__init__.py +15 -15
- package/skills/writing-docs/pptx/ooxml/scripts/validation/base.py +951 -951
- package/skills/writing-docs/pptx/ooxml/scripts/validation/docx.py +274 -274
- package/skills/writing-docs/pptx/ooxml/scripts/validation/pptx.py +315 -315
- package/skills/writing-docs/pptx/ooxml/scripts/validation/redlining.py +279 -279
- package/skills/writing-docs/pptx/ooxml.md +426 -426
- package/skills/writing-docs/pptx/scripts/html2pptx.js +978 -978
- package/skills/writing-docs/pptx/scripts/inventory.py +1020 -1020
- package/skills/writing-docs/pptx/scripts/rearrange.py +231 -231
- package/skills/writing-docs/pptx/scripts/replace.py +385 -385
- package/skills/writing-docs/pptx/scripts/thumbnail.py +450 -450
- package/skills/writing-docs/slides/LICENSE.txt +201 -201
- package/skills/writing-docs/slides/SKILL.md +71 -71
- package/skills/writing-docs/slides/agents/openai.yaml +6 -6
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/code.js +104 -104
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/image.js +333 -333
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/index.js +33 -33
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/latex.js +51 -51
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/layout.js +643 -643
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/layout_builders.js +358 -358
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/svg.js +36 -36
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/text.js +789 -789
- package/skills/writing-docs/slides/assets/pptxgenjs_helpers/util.js +24 -24
- package/skills/writing-docs/slides/assets/slides-small.svg +3 -3
- package/skills/writing-docs/slides/references/pptxgenjs-helpers.md +61 -61
- package/skills/writing-docs/slides/scripts/create_montage.py +300 -300
- package/skills/writing-docs/slides/scripts/detect_font.py +873 -873
- package/skills/writing-docs/slides/scripts/ensure_raster_image.py +202 -202
- package/skills/writing-docs/slides/scripts/render_slides.py +273 -273
- package/skills/writing-docs/slides/scripts/slides_test.py +201 -201
- package/skills/writing-docs/template-skill/SKILL.md +26 -26
- package/skills/writing-docs/xlsx/LICENSE.txt +30 -30
- package/skills/writing-docs/xlsx/SKILL.md +288 -288
- package/skills/writing-docs/xlsx/recalc.py +177 -177
- package/src/core/KILO_MASTER.md +448 -448
- package/src/tools/validate-skill.js +421 -421
|
@@ -1,540 +1,540 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: backend-api-development
|
|
3
|
-
description: >-
|
|
4
|
-
Comprehensive backend API development skill for building robust, scalable APIs.
|
|
5
|
-
Use when creating new endpoints, services, or backend functionality.
|
|
6
|
-
Keywords: API, backend, endpoint, service, REST, GraphQL, server, controller, route
|
|
7
|
-
version: 1.0.0
|
|
8
|
-
behaviors: [generate_with_validation, investigate_codebase, document_code, test_change]
|
|
9
|
-
dependencies: []
|
|
10
|
-
token_estimate:
|
|
11
|
-
min: 2000
|
|
12
|
-
typical: 5000
|
|
13
|
-
max: 12000
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# 🔧 Backend API Development Skill
|
|
17
|
-
|
|
18
|
-
> **Philosophy:** APIs are contracts. Build them right the first time.
|
|
19
|
-
|
|
20
|
-
## When to Use
|
|
21
|
-
|
|
22
|
-
Use this skill when:
|
|
23
|
-
- Creating a new API endpoint
|
|
24
|
-
- Building a new service/module
|
|
25
|
-
- Refactoring existing API code
|
|
26
|
-
- Adding new functionality to backend
|
|
27
|
-
- Need to follow RESTful/GraphQL best practices
|
|
28
|
-
|
|
29
|
-
**Do NOT use this skill when:**
|
|
30
|
-
- Just fixing a small bug (use debugging skill)
|
|
31
|
-
- Only modifying frontend (use frontend skill)
|
|
32
|
-
- Database-only changes (use database skill)
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Prerequisites
|
|
37
|
-
|
|
38
|
-
Before starting:
|
|
39
|
-
- [ ] Requirements are clear (what the API should do)
|
|
40
|
-
- [ ] Understand the existing architecture
|
|
41
|
-
- [ ] Know the target stack (NestJS, Express, FastAPI, etc.)
|
|
42
|
-
- [ ] Database schema exists (or will be created)
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Process
|
|
47
|
-
|
|
48
|
-
### Phase 1: DESIGN 📐
|
|
49
|
-
|
|
50
|
-
**Goal:** Design the API before writing code.
|
|
51
|
-
|
|
52
|
-
**Steps:**
|
|
53
|
-
|
|
54
|
-
1. **Define the Resource**
|
|
55
|
-
```yaml
|
|
56
|
-
resource:
|
|
57
|
-
name: User
|
|
58
|
-
description: Represents a platform user
|
|
59
|
-
domain: authentication
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
2. **Design Endpoints (REST)**
|
|
63
|
-
```yaml
|
|
64
|
-
endpoints:
|
|
65
|
-
- method: GET
|
|
66
|
-
path: /users
|
|
67
|
-
description: List all users
|
|
68
|
-
query_params: [page, limit, search]
|
|
69
|
-
response: User[]
|
|
70
|
-
|
|
71
|
-
- method: GET
|
|
72
|
-
path: /users/:id
|
|
73
|
-
description: Get single user
|
|
74
|
-
response: User
|
|
75
|
-
|
|
76
|
-
- method: POST
|
|
77
|
-
path: /users
|
|
78
|
-
description: Create new user
|
|
79
|
-
body: CreateUserDto
|
|
80
|
-
response: User
|
|
81
|
-
|
|
82
|
-
- method: PUT
|
|
83
|
-
path: /users/:id
|
|
84
|
-
description: Update user
|
|
85
|
-
body: UpdateUserDto
|
|
86
|
-
response: User
|
|
87
|
-
|
|
88
|
-
- method: DELETE
|
|
89
|
-
path: /users/:id
|
|
90
|
-
description: Delete user
|
|
91
|
-
response: void
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
3. **Define DTOs (Data Transfer Objects)**
|
|
95
|
-
```typescript
|
|
96
|
-
// CreateUserDto
|
|
97
|
-
interface CreateUserDto {
|
|
98
|
-
email: string; // required, email format
|
|
99
|
-
password: string; // required, min 8 chars
|
|
100
|
-
name: string; // required, min 2 chars
|
|
101
|
-
role?: UserRole; // optional, default: 'user'
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// UpdateUserDto
|
|
105
|
-
type UpdateUserDto = Partial<CreateUserDto>;
|
|
106
|
-
|
|
107
|
-
// UserResponseDto
|
|
108
|
-
interface UserResponseDto {
|
|
109
|
-
id: string;
|
|
110
|
-
email: string;
|
|
111
|
-
name: string;
|
|
112
|
-
role: UserRole;
|
|
113
|
-
createdAt: DateTime;
|
|
114
|
-
updatedAt: DateTime;
|
|
115
|
-
// Note: password NOT included
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
4. **Plan Error Responses**
|
|
120
|
-
```yaml
|
|
121
|
-
errors:
|
|
122
|
-
- code: 400
|
|
123
|
-
when: Invalid input
|
|
124
|
-
response: { message, errors: [{field, message}] }
|
|
125
|
-
|
|
126
|
-
- code: 401
|
|
127
|
-
when: Not authenticated
|
|
128
|
-
response: { message: "Unauthorized" }
|
|
129
|
-
|
|
130
|
-
- code: 403
|
|
131
|
-
when: Not authorized
|
|
132
|
-
response: { message: "Forbidden" }
|
|
133
|
-
|
|
134
|
-
- code: 404
|
|
135
|
-
when: Resource not found
|
|
136
|
-
response: { message: "User not found" }
|
|
137
|
-
|
|
138
|
-
- code: 409
|
|
139
|
-
when: Conflict (e.g., email exists)
|
|
140
|
-
response: { message: "Email already registered" }
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
**Output:** Complete API design document.
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
### Phase 2: STRUCTURE 🏗️
|
|
148
|
-
|
|
149
|
-
**Goal:** Set up the file structure.
|
|
150
|
-
|
|
151
|
-
**NestJS Structure:**
|
|
152
|
-
```
|
|
153
|
-
src/
|
|
154
|
-
└── users/
|
|
155
|
-
├── users.module.ts # Module definition
|
|
156
|
-
├── users.controller.ts # HTTP layer
|
|
157
|
-
├── users.service.ts # Business logic
|
|
158
|
-
├── users.repository.ts # Data access (optional)
|
|
159
|
-
├── dto/
|
|
160
|
-
│ ├── create-user.dto.ts
|
|
161
|
-
│ ├── update-user.dto.ts
|
|
162
|
-
│ └── user-response.dto.ts
|
|
163
|
-
├── entities/
|
|
164
|
-
│ └── user.entity.ts
|
|
165
|
-
├── guards/
|
|
166
|
-
│ └── user-owner.guard.ts
|
|
167
|
-
└── users.controller.spec.ts
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
**FastAPI Structure:**
|
|
171
|
-
```
|
|
172
|
-
app/
|
|
173
|
-
└── users/
|
|
174
|
-
├── __init__.py
|
|
175
|
-
├── router.py # Routes
|
|
176
|
-
├── service.py # Business logic
|
|
177
|
-
├── repository.py # Data access
|
|
178
|
-
├── schemas.py # Pydantic models
|
|
179
|
-
├── models.py # SQLAlchemy models
|
|
180
|
-
└── dependencies.py # Dependency injection
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
### Phase 3: IMPLEMENTATION 💻
|
|
186
|
-
|
|
187
|
-
**Goal:** Implement the API layer by layer.
|
|
188
|
-
|
|
189
|
-
**Order of Implementation:**
|
|
190
|
-
|
|
191
|
-
1. **Entity/Model First**
|
|
192
|
-
```typescript
|
|
193
|
-
// user.entity.ts
|
|
194
|
-
@Entity('users')
|
|
195
|
-
export class User {
|
|
196
|
-
@PrimaryGeneratedColumn('uuid')
|
|
197
|
-
id: string;
|
|
198
|
-
|
|
199
|
-
@Column({ unique: true })
|
|
200
|
-
@IsEmail()
|
|
201
|
-
email: string;
|
|
202
|
-
|
|
203
|
-
@Column()
|
|
204
|
-
@Exclude() // Never expose password
|
|
205
|
-
password: string;
|
|
206
|
-
|
|
207
|
-
@Column()
|
|
208
|
-
name: string;
|
|
209
|
-
|
|
210
|
-
@Column({ default: 'user' })
|
|
211
|
-
role: UserRole;
|
|
212
|
-
|
|
213
|
-
@CreateDateColumn()
|
|
214
|
-
createdAt: Date;
|
|
215
|
-
|
|
216
|
-
@UpdateDateColumn()
|
|
217
|
-
updatedAt: Date;
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
2. **DTOs with Validation**
|
|
222
|
-
```typescript
|
|
223
|
-
// create-user.dto.ts
|
|
224
|
-
export class CreateUserDto {
|
|
225
|
-
@IsEmail()
|
|
226
|
-
@Transform(({ value }) => value.toLowerCase().trim())
|
|
227
|
-
email: string;
|
|
228
|
-
|
|
229
|
-
@IsString()
|
|
230
|
-
@MinLength(8)
|
|
231
|
-
@Matches(/^(?=.*[A-Za-z])(?=.*\d)/, {
|
|
232
|
-
message: 'Password must contain letters and numbers'
|
|
233
|
-
})
|
|
234
|
-
password: string;
|
|
235
|
-
|
|
236
|
-
@IsString()
|
|
237
|
-
@MinLength(2)
|
|
238
|
-
@MaxLength(50)
|
|
239
|
-
name: string;
|
|
240
|
-
|
|
241
|
-
@IsOptional()
|
|
242
|
-
@IsEnum(UserRole)
|
|
243
|
-
role?: UserRole;
|
|
244
|
-
}
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
3. **Service Layer (Business Logic)**
|
|
248
|
-
```typescript
|
|
249
|
-
// users.service.ts
|
|
250
|
-
@Injectable()
|
|
251
|
-
export class UsersService {
|
|
252
|
-
constructor(
|
|
253
|
-
@InjectRepository(User)
|
|
254
|
-
private usersRepository: Repository<User>,
|
|
255
|
-
) {}
|
|
256
|
-
|
|
257
|
-
async create(dto: CreateUserDto): Promise<User> {
|
|
258
|
-
// Check for existing email
|
|
259
|
-
const existing = await this.findByEmail(dto.email);
|
|
260
|
-
if (existing) {
|
|
261
|
-
throw new ConflictException('Email already registered');
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// Hash password
|
|
265
|
-
const hashedPassword = await bcrypt.hash(dto.password, 10);
|
|
266
|
-
|
|
267
|
-
// Create and save
|
|
268
|
-
const user = this.usersRepository.create({
|
|
269
|
-
...dto,
|
|
270
|
-
password: hashedPassword,
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
return this.usersRepository.save(user);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
async findAll(options: PaginationOptions): Promise<PaginatedResult<User>> {
|
|
277
|
-
// Implementation with pagination
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// ... other methods
|
|
281
|
-
}
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
4. **Controller (HTTP Layer)**
|
|
285
|
-
```typescript
|
|
286
|
-
// users.controller.ts
|
|
287
|
-
@Controller('users')
|
|
288
|
-
@UseInterceptors(ClassSerializerInterceptor)
|
|
289
|
-
export class UsersController {
|
|
290
|
-
constructor(private readonly usersService: UsersService) {}
|
|
291
|
-
|
|
292
|
-
@Post()
|
|
293
|
-
@HttpCode(HttpStatus.CREATED)
|
|
294
|
-
async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
|
|
295
|
-
const user = await this.usersService.create(dto);
|
|
296
|
-
return plainToInstance(UserResponseDto, user);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
@Get()
|
|
300
|
-
@UseGuards(AuthGuard)
|
|
301
|
-
async findAll(
|
|
302
|
-
@Query() query: PaginationQueryDto
|
|
303
|
-
): Promise<PaginatedResult<UserResponseDto>> {
|
|
304
|
-
return this.usersService.findAll(query);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
@Get(':id')
|
|
308
|
-
@UseGuards(AuthGuard)
|
|
309
|
-
async findOne(@Param('id', ParseUUIDPipe) id: string): Promise<UserResponseDto> {
|
|
310
|
-
const user = await this.usersService.findOne(id);
|
|
311
|
-
if (!user) {
|
|
312
|
-
throw new NotFoundException('User not found');
|
|
313
|
-
}
|
|
314
|
-
return plainToInstance(UserResponseDto, user);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// ... other endpoints
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
### Phase 4: SECURITY 🔒
|
|
324
|
-
|
|
325
|
-
**Goal:** Ensure API is secure.
|
|
326
|
-
|
|
327
|
-
**Security Checklist:**
|
|
328
|
-
|
|
329
|
-
1. **Input Validation**
|
|
330
|
-
- [ ] All inputs validated with DTOs
|
|
331
|
-
- [ ] Types enforced
|
|
332
|
-
- [ ] Length limits set
|
|
333
|
-
- [ ] Format validation (email, UUID, etc.)
|
|
334
|
-
|
|
335
|
-
2. **Authentication**
|
|
336
|
-
- [ ] Protected routes require authentication
|
|
337
|
-
- [ ] JWT or session validation
|
|
338
|
-
- [ ] Token expiration handled
|
|
339
|
-
|
|
340
|
-
3. **Authorization**
|
|
341
|
-
- [ ] Role-based access control
|
|
342
|
-
- [ ] Resource ownership verified
|
|
343
|
-
- [ ] Admin-only routes protected
|
|
344
|
-
|
|
345
|
-
4. **Data Protection**
|
|
346
|
-
- [ ] Passwords hashed (bcrypt, argon2)
|
|
347
|
-
- [ ] Sensitive data not logged
|
|
348
|
-
- [ ] Passwords excluded from responses
|
|
349
|
-
|
|
350
|
-
5. **Rate Limiting**
|
|
351
|
-
- [ ] Login attempts limited
|
|
352
|
-
- [ ] API rate limiting in place
|
|
353
|
-
|
|
354
|
-
6. **SQL Injection Prevention**
|
|
355
|
-
- [ ] Parameterized queries used
|
|
356
|
-
- [ ] ORM used correctly
|
|
357
|
-
- [ ] Raw queries avoided or sanitized
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
### Phase 5: TESTING 🧪
|
|
362
|
-
|
|
363
|
-
**Goal:** Write comprehensive tests.
|
|
364
|
-
|
|
365
|
-
**Test Types:**
|
|
366
|
-
|
|
367
|
-
1. **Unit Tests**
|
|
368
|
-
```typescript
|
|
369
|
-
describe('UsersService', () => {
|
|
370
|
-
describe('create', () => {
|
|
371
|
-
it('should create a new user', async () => {
|
|
372
|
-
const dto = { email: 'test@example.com', ... };
|
|
373
|
-
const result = await service.create(dto);
|
|
374
|
-
expect(result.email).toBe(dto.email);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
it('should hash the password', async () => {
|
|
378
|
-
const dto = { password: 'plaintext', ... };
|
|
379
|
-
const result = await service.create(dto);
|
|
380
|
-
expect(result.password).not.toBe(dto.password);
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
it('should throw on duplicate email', async () => {
|
|
384
|
-
// Setup: create user first
|
|
385
|
-
await service.create({ email: 'test@example.com', ... });
|
|
386
|
-
|
|
387
|
-
// Act & Assert
|
|
388
|
-
await expect(
|
|
389
|
-
service.create({ email: 'test@example.com', ... })
|
|
390
|
-
).rejects.toThrow(ConflictException);
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
2. **Integration Tests**
|
|
397
|
-
```typescript
|
|
398
|
-
describe('Users API', () => {
|
|
399
|
-
it('POST /users should create user', async () => {
|
|
400
|
-
const response = await request(app.getHttpServer())
|
|
401
|
-
.post('/users')
|
|
402
|
-
.send({ email: 'test@example.com', password: 'Password1', name: 'Test' })
|
|
403
|
-
.expect(201);
|
|
404
|
-
|
|
405
|
-
expect(response.body.email).toBe('test@example.com');
|
|
406
|
-
expect(response.body.password).toBeUndefined();
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
it('GET /users should require auth', async () => {
|
|
410
|
-
await request(app.getHttpServer())
|
|
411
|
-
.get('/users')
|
|
412
|
-
.expect(401);
|
|
413
|
-
});
|
|
414
|
-
});
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
---
|
|
418
|
-
|
|
419
|
-
### Phase 6: DOCUMENTATION 📝
|
|
420
|
-
|
|
421
|
-
**Goal:** Document the API.
|
|
422
|
-
|
|
423
|
-
**OpenAPI/Swagger:**
|
|
424
|
-
```typescript
|
|
425
|
-
@ApiTags('users')
|
|
426
|
-
@Controller('users')
|
|
427
|
-
export class UsersController {
|
|
428
|
-
@Post()
|
|
429
|
-
@ApiOperation({ summary: 'Create a new user' })
|
|
430
|
-
@ApiResponse({ status: 201, type: UserResponseDto })
|
|
431
|
-
@ApiResponse({ status: 400, description: 'Invalid input' })
|
|
432
|
-
@ApiResponse({ status: 409, description: 'Email already exists' })
|
|
433
|
-
async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
|
|
434
|
-
// ...
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
**Response DTO Documentation:**
|
|
440
|
-
```typescript
|
|
441
|
-
export class UserResponseDto {
|
|
442
|
-
@ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' })
|
|
443
|
-
id: string;
|
|
444
|
-
|
|
445
|
-
@ApiProperty({ example: 'user@example.com' })
|
|
446
|
-
email: string;
|
|
447
|
-
|
|
448
|
-
@ApiProperty({ example: 'John Doe' })
|
|
449
|
-
name: string;
|
|
450
|
-
}
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
---
|
|
454
|
-
|
|
455
|
-
## Best Practices
|
|
456
|
-
|
|
457
|
-
### API Design
|
|
458
|
-
|
|
459
|
-
| Practice | Do | Don't |
|
|
460
|
-
|----------|----|----- |
|
|
461
|
-
| Naming | `GET /users/:id/orders` | `GET /getUserOrders` |
|
|
462
|
-
| Versioning | `/api/v1/users` | No versioning |
|
|
463
|
-
| Pluralization | `/users`, `/orders` | `/user`, `/order` |
|
|
464
|
-
| HTTP Methods | Use correctly (GET=read, POST=create) | POST for everything |
|
|
465
|
-
| Status Codes | 201 for created, 204 for no content | 200 for everything |
|
|
466
|
-
|
|
467
|
-
### Error Handling
|
|
468
|
-
|
|
469
|
-
```typescript
|
|
470
|
-
// Global exception filter
|
|
471
|
-
@Catch()
|
|
472
|
-
export class AllExceptionsFilter implements ExceptionFilter {
|
|
473
|
-
catch(exception: unknown, host: ArgumentsHost) {
|
|
474
|
-
const ctx = host.switchToHttp();
|
|
475
|
-
const response = ctx.getResponse<Response>();
|
|
476
|
-
|
|
477
|
-
const status = exception instanceof HttpException
|
|
478
|
-
? exception.getStatus()
|
|
479
|
-
: HttpStatus.INTERNAL_SERVER_ERROR;
|
|
480
|
-
|
|
481
|
-
const message = exception instanceof HttpException
|
|
482
|
-
? exception.message
|
|
483
|
-
: 'Internal server error';
|
|
484
|
-
|
|
485
|
-
response.status(status).json({
|
|
486
|
-
statusCode: status,
|
|
487
|
-
message,
|
|
488
|
-
timestamp: new Date().toISOString(),
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
```
|
|
493
|
-
|
|
494
|
-
---
|
|
495
|
-
|
|
496
|
-
## Guidelines
|
|
497
|
-
|
|
498
|
-
### DO ✅
|
|
499
|
-
- Design API before coding
|
|
500
|
-
- Use proper HTTP methods and status codes
|
|
501
|
-
- Validate all inputs
|
|
502
|
-
- Handle errors gracefully
|
|
503
|
-
- Write tests first (TDD)
|
|
504
|
-
- Document with OpenAPI
|
|
505
|
-
|
|
506
|
-
### DON'T ❌
|
|
507
|
-
- Expose internal IDs when UUIDs are better
|
|
508
|
-
- Return password or sensitive data
|
|
509
|
-
- Use GET for mutations
|
|
510
|
-
- Skip input validation
|
|
511
|
-
- Catch and swallow errors
|
|
512
|
-
- Use magic strings/numbers
|
|
513
|
-
|
|
514
|
-
---
|
|
515
|
-
|
|
516
|
-
## Success Criteria
|
|
517
|
-
|
|
518
|
-
Before considering API complete:
|
|
519
|
-
|
|
520
|
-
- [ ] All endpoints implemented per design
|
|
521
|
-
- [ ] Input validation on all endpoints
|
|
522
|
-
- [ ] Authentication/Authorization in place
|
|
523
|
-
- [ ] Error handling comprehensive
|
|
524
|
-
- [ ] Unit tests with >80% coverage
|
|
525
|
-
- [ ] Integration tests for main flows
|
|
526
|
-
- [ ] API documented (OpenAPI/Swagger)
|
|
527
|
-
- [ ] Security checklist passed
|
|
528
|
-
|
|
529
|
-
---
|
|
530
|
-
|
|
531
|
-
## Related Skills
|
|
532
|
-
|
|
533
|
-
- `skills/kilo-kit/development/database/` - For data layer
|
|
534
|
-
- `skills/kilo-kit/development/security/` - For security concerns
|
|
535
|
-
- `skills/kilo-kit/quality/testing/` - For test coverage
|
|
536
|
-
- `skills/kilo-kit/architecture/system-design/` - For architecture decisions
|
|
537
|
-
|
|
538
|
-
---
|
|
539
|
-
|
|
540
|
-
*Backend API Development Skill v1.0.0 — APIs built right*
|
|
1
|
+
---
|
|
2
|
+
name: backend-api-development
|
|
3
|
+
description: >-
|
|
4
|
+
Comprehensive backend API development skill for building robust, scalable APIs.
|
|
5
|
+
Use when creating new endpoints, services, or backend functionality.
|
|
6
|
+
Keywords: API, backend, endpoint, service, REST, GraphQL, server, controller, route
|
|
7
|
+
version: 1.0.0
|
|
8
|
+
behaviors: [generate_with_validation, investigate_codebase, document_code, test_change]
|
|
9
|
+
dependencies: []
|
|
10
|
+
token_estimate:
|
|
11
|
+
min: 2000
|
|
12
|
+
typical: 5000
|
|
13
|
+
max: 12000
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# 🔧 Backend API Development Skill
|
|
17
|
+
|
|
18
|
+
> **Philosophy:** APIs are contracts. Build them right the first time.
|
|
19
|
+
|
|
20
|
+
## When to Use
|
|
21
|
+
|
|
22
|
+
Use this skill when:
|
|
23
|
+
- Creating a new API endpoint
|
|
24
|
+
- Building a new service/module
|
|
25
|
+
- Refactoring existing API code
|
|
26
|
+
- Adding new functionality to backend
|
|
27
|
+
- Need to follow RESTful/GraphQL best practices
|
|
28
|
+
|
|
29
|
+
**Do NOT use this skill when:**
|
|
30
|
+
- Just fixing a small bug (use debugging skill)
|
|
31
|
+
- Only modifying frontend (use frontend skill)
|
|
32
|
+
- Database-only changes (use database skill)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Prerequisites
|
|
37
|
+
|
|
38
|
+
Before starting:
|
|
39
|
+
- [ ] Requirements are clear (what the API should do)
|
|
40
|
+
- [ ] Understand the existing architecture
|
|
41
|
+
- [ ] Know the target stack (NestJS, Express, FastAPI, etc.)
|
|
42
|
+
- [ ] Database schema exists (or will be created)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Process
|
|
47
|
+
|
|
48
|
+
### Phase 1: DESIGN 📐
|
|
49
|
+
|
|
50
|
+
**Goal:** Design the API before writing code.
|
|
51
|
+
|
|
52
|
+
**Steps:**
|
|
53
|
+
|
|
54
|
+
1. **Define the Resource**
|
|
55
|
+
```yaml
|
|
56
|
+
resource:
|
|
57
|
+
name: User
|
|
58
|
+
description: Represents a platform user
|
|
59
|
+
domain: authentication
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
2. **Design Endpoints (REST)**
|
|
63
|
+
```yaml
|
|
64
|
+
endpoints:
|
|
65
|
+
- method: GET
|
|
66
|
+
path: /users
|
|
67
|
+
description: List all users
|
|
68
|
+
query_params: [page, limit, search]
|
|
69
|
+
response: User[]
|
|
70
|
+
|
|
71
|
+
- method: GET
|
|
72
|
+
path: /users/:id
|
|
73
|
+
description: Get single user
|
|
74
|
+
response: User
|
|
75
|
+
|
|
76
|
+
- method: POST
|
|
77
|
+
path: /users
|
|
78
|
+
description: Create new user
|
|
79
|
+
body: CreateUserDto
|
|
80
|
+
response: User
|
|
81
|
+
|
|
82
|
+
- method: PUT
|
|
83
|
+
path: /users/:id
|
|
84
|
+
description: Update user
|
|
85
|
+
body: UpdateUserDto
|
|
86
|
+
response: User
|
|
87
|
+
|
|
88
|
+
- method: DELETE
|
|
89
|
+
path: /users/:id
|
|
90
|
+
description: Delete user
|
|
91
|
+
response: void
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
3. **Define DTOs (Data Transfer Objects)**
|
|
95
|
+
```typescript
|
|
96
|
+
// CreateUserDto
|
|
97
|
+
interface CreateUserDto {
|
|
98
|
+
email: string; // required, email format
|
|
99
|
+
password: string; // required, min 8 chars
|
|
100
|
+
name: string; // required, min 2 chars
|
|
101
|
+
role?: UserRole; // optional, default: 'user'
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// UpdateUserDto
|
|
105
|
+
type UpdateUserDto = Partial<CreateUserDto>;
|
|
106
|
+
|
|
107
|
+
// UserResponseDto
|
|
108
|
+
interface UserResponseDto {
|
|
109
|
+
id: string;
|
|
110
|
+
email: string;
|
|
111
|
+
name: string;
|
|
112
|
+
role: UserRole;
|
|
113
|
+
createdAt: DateTime;
|
|
114
|
+
updatedAt: DateTime;
|
|
115
|
+
// Note: password NOT included
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
4. **Plan Error Responses**
|
|
120
|
+
```yaml
|
|
121
|
+
errors:
|
|
122
|
+
- code: 400
|
|
123
|
+
when: Invalid input
|
|
124
|
+
response: { message, errors: [{field, message}] }
|
|
125
|
+
|
|
126
|
+
- code: 401
|
|
127
|
+
when: Not authenticated
|
|
128
|
+
response: { message: "Unauthorized" }
|
|
129
|
+
|
|
130
|
+
- code: 403
|
|
131
|
+
when: Not authorized
|
|
132
|
+
response: { message: "Forbidden" }
|
|
133
|
+
|
|
134
|
+
- code: 404
|
|
135
|
+
when: Resource not found
|
|
136
|
+
response: { message: "User not found" }
|
|
137
|
+
|
|
138
|
+
- code: 409
|
|
139
|
+
when: Conflict (e.g., email exists)
|
|
140
|
+
response: { message: "Email already registered" }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Output:** Complete API design document.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
### Phase 2: STRUCTURE 🏗️
|
|
148
|
+
|
|
149
|
+
**Goal:** Set up the file structure.
|
|
150
|
+
|
|
151
|
+
**NestJS Structure:**
|
|
152
|
+
```
|
|
153
|
+
src/
|
|
154
|
+
└── users/
|
|
155
|
+
├── users.module.ts # Module definition
|
|
156
|
+
├── users.controller.ts # HTTP layer
|
|
157
|
+
├── users.service.ts # Business logic
|
|
158
|
+
├── users.repository.ts # Data access (optional)
|
|
159
|
+
├── dto/
|
|
160
|
+
│ ├── create-user.dto.ts
|
|
161
|
+
│ ├── update-user.dto.ts
|
|
162
|
+
│ └── user-response.dto.ts
|
|
163
|
+
├── entities/
|
|
164
|
+
│ └── user.entity.ts
|
|
165
|
+
├── guards/
|
|
166
|
+
│ └── user-owner.guard.ts
|
|
167
|
+
└── users.controller.spec.ts
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**FastAPI Structure:**
|
|
171
|
+
```
|
|
172
|
+
app/
|
|
173
|
+
└── users/
|
|
174
|
+
├── __init__.py
|
|
175
|
+
├── router.py # Routes
|
|
176
|
+
├── service.py # Business logic
|
|
177
|
+
├── repository.py # Data access
|
|
178
|
+
├── schemas.py # Pydantic models
|
|
179
|
+
├── models.py # SQLAlchemy models
|
|
180
|
+
└── dependencies.py # Dependency injection
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### Phase 3: IMPLEMENTATION 💻
|
|
186
|
+
|
|
187
|
+
**Goal:** Implement the API layer by layer.
|
|
188
|
+
|
|
189
|
+
**Order of Implementation:**
|
|
190
|
+
|
|
191
|
+
1. **Entity/Model First**
|
|
192
|
+
```typescript
|
|
193
|
+
// user.entity.ts
|
|
194
|
+
@Entity('users')
|
|
195
|
+
export class User {
|
|
196
|
+
@PrimaryGeneratedColumn('uuid')
|
|
197
|
+
id: string;
|
|
198
|
+
|
|
199
|
+
@Column({ unique: true })
|
|
200
|
+
@IsEmail()
|
|
201
|
+
email: string;
|
|
202
|
+
|
|
203
|
+
@Column()
|
|
204
|
+
@Exclude() // Never expose password
|
|
205
|
+
password: string;
|
|
206
|
+
|
|
207
|
+
@Column()
|
|
208
|
+
name: string;
|
|
209
|
+
|
|
210
|
+
@Column({ default: 'user' })
|
|
211
|
+
role: UserRole;
|
|
212
|
+
|
|
213
|
+
@CreateDateColumn()
|
|
214
|
+
createdAt: Date;
|
|
215
|
+
|
|
216
|
+
@UpdateDateColumn()
|
|
217
|
+
updatedAt: Date;
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
2. **DTOs with Validation**
|
|
222
|
+
```typescript
|
|
223
|
+
// create-user.dto.ts
|
|
224
|
+
export class CreateUserDto {
|
|
225
|
+
@IsEmail()
|
|
226
|
+
@Transform(({ value }) => value.toLowerCase().trim())
|
|
227
|
+
email: string;
|
|
228
|
+
|
|
229
|
+
@IsString()
|
|
230
|
+
@MinLength(8)
|
|
231
|
+
@Matches(/^(?=.*[A-Za-z])(?=.*\d)/, {
|
|
232
|
+
message: 'Password must contain letters and numbers'
|
|
233
|
+
})
|
|
234
|
+
password: string;
|
|
235
|
+
|
|
236
|
+
@IsString()
|
|
237
|
+
@MinLength(2)
|
|
238
|
+
@MaxLength(50)
|
|
239
|
+
name: string;
|
|
240
|
+
|
|
241
|
+
@IsOptional()
|
|
242
|
+
@IsEnum(UserRole)
|
|
243
|
+
role?: UserRole;
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
3. **Service Layer (Business Logic)**
|
|
248
|
+
```typescript
|
|
249
|
+
// users.service.ts
|
|
250
|
+
@Injectable()
|
|
251
|
+
export class UsersService {
|
|
252
|
+
constructor(
|
|
253
|
+
@InjectRepository(User)
|
|
254
|
+
private usersRepository: Repository<User>,
|
|
255
|
+
) {}
|
|
256
|
+
|
|
257
|
+
async create(dto: CreateUserDto): Promise<User> {
|
|
258
|
+
// Check for existing email
|
|
259
|
+
const existing = await this.findByEmail(dto.email);
|
|
260
|
+
if (existing) {
|
|
261
|
+
throw new ConflictException('Email already registered');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Hash password
|
|
265
|
+
const hashedPassword = await bcrypt.hash(dto.password, 10);
|
|
266
|
+
|
|
267
|
+
// Create and save
|
|
268
|
+
const user = this.usersRepository.create({
|
|
269
|
+
...dto,
|
|
270
|
+
password: hashedPassword,
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
return this.usersRepository.save(user);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async findAll(options: PaginationOptions): Promise<PaginatedResult<User>> {
|
|
277
|
+
// Implementation with pagination
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// ... other methods
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
4. **Controller (HTTP Layer)**
|
|
285
|
+
```typescript
|
|
286
|
+
// users.controller.ts
|
|
287
|
+
@Controller('users')
|
|
288
|
+
@UseInterceptors(ClassSerializerInterceptor)
|
|
289
|
+
export class UsersController {
|
|
290
|
+
constructor(private readonly usersService: UsersService) {}
|
|
291
|
+
|
|
292
|
+
@Post()
|
|
293
|
+
@HttpCode(HttpStatus.CREATED)
|
|
294
|
+
async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
|
|
295
|
+
const user = await this.usersService.create(dto);
|
|
296
|
+
return plainToInstance(UserResponseDto, user);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
@Get()
|
|
300
|
+
@UseGuards(AuthGuard)
|
|
301
|
+
async findAll(
|
|
302
|
+
@Query() query: PaginationQueryDto
|
|
303
|
+
): Promise<PaginatedResult<UserResponseDto>> {
|
|
304
|
+
return this.usersService.findAll(query);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
@Get(':id')
|
|
308
|
+
@UseGuards(AuthGuard)
|
|
309
|
+
async findOne(@Param('id', ParseUUIDPipe) id: string): Promise<UserResponseDto> {
|
|
310
|
+
const user = await this.usersService.findOne(id);
|
|
311
|
+
if (!user) {
|
|
312
|
+
throw new NotFoundException('User not found');
|
|
313
|
+
}
|
|
314
|
+
return plainToInstance(UserResponseDto, user);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ... other endpoints
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
### Phase 4: SECURITY 🔒
|
|
324
|
+
|
|
325
|
+
**Goal:** Ensure API is secure.
|
|
326
|
+
|
|
327
|
+
**Security Checklist:**
|
|
328
|
+
|
|
329
|
+
1. **Input Validation**
|
|
330
|
+
- [ ] All inputs validated with DTOs
|
|
331
|
+
- [ ] Types enforced
|
|
332
|
+
- [ ] Length limits set
|
|
333
|
+
- [ ] Format validation (email, UUID, etc.)
|
|
334
|
+
|
|
335
|
+
2. **Authentication**
|
|
336
|
+
- [ ] Protected routes require authentication
|
|
337
|
+
- [ ] JWT or session validation
|
|
338
|
+
- [ ] Token expiration handled
|
|
339
|
+
|
|
340
|
+
3. **Authorization**
|
|
341
|
+
- [ ] Role-based access control
|
|
342
|
+
- [ ] Resource ownership verified
|
|
343
|
+
- [ ] Admin-only routes protected
|
|
344
|
+
|
|
345
|
+
4. **Data Protection**
|
|
346
|
+
- [ ] Passwords hashed (bcrypt, argon2)
|
|
347
|
+
- [ ] Sensitive data not logged
|
|
348
|
+
- [ ] Passwords excluded from responses
|
|
349
|
+
|
|
350
|
+
5. **Rate Limiting**
|
|
351
|
+
- [ ] Login attempts limited
|
|
352
|
+
- [ ] API rate limiting in place
|
|
353
|
+
|
|
354
|
+
6. **SQL Injection Prevention**
|
|
355
|
+
- [ ] Parameterized queries used
|
|
356
|
+
- [ ] ORM used correctly
|
|
357
|
+
- [ ] Raw queries avoided or sanitized
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
### Phase 5: TESTING 🧪
|
|
362
|
+
|
|
363
|
+
**Goal:** Write comprehensive tests.
|
|
364
|
+
|
|
365
|
+
**Test Types:**
|
|
366
|
+
|
|
367
|
+
1. **Unit Tests**
|
|
368
|
+
```typescript
|
|
369
|
+
describe('UsersService', () => {
|
|
370
|
+
describe('create', () => {
|
|
371
|
+
it('should create a new user', async () => {
|
|
372
|
+
const dto = { email: 'test@example.com', ... };
|
|
373
|
+
const result = await service.create(dto);
|
|
374
|
+
expect(result.email).toBe(dto.email);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it('should hash the password', async () => {
|
|
378
|
+
const dto = { password: 'plaintext', ... };
|
|
379
|
+
const result = await service.create(dto);
|
|
380
|
+
expect(result.password).not.toBe(dto.password);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('should throw on duplicate email', async () => {
|
|
384
|
+
// Setup: create user first
|
|
385
|
+
await service.create({ email: 'test@example.com', ... });
|
|
386
|
+
|
|
387
|
+
// Act & Assert
|
|
388
|
+
await expect(
|
|
389
|
+
service.create({ email: 'test@example.com', ... })
|
|
390
|
+
).rejects.toThrow(ConflictException);
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
2. **Integration Tests**
|
|
397
|
+
```typescript
|
|
398
|
+
describe('Users API', () => {
|
|
399
|
+
it('POST /users should create user', async () => {
|
|
400
|
+
const response = await request(app.getHttpServer())
|
|
401
|
+
.post('/users')
|
|
402
|
+
.send({ email: 'test@example.com', password: 'Password1', name: 'Test' })
|
|
403
|
+
.expect(201);
|
|
404
|
+
|
|
405
|
+
expect(response.body.email).toBe('test@example.com');
|
|
406
|
+
expect(response.body.password).toBeUndefined();
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
it('GET /users should require auth', async () => {
|
|
410
|
+
await request(app.getHttpServer())
|
|
411
|
+
.get('/users')
|
|
412
|
+
.expect(401);
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
### Phase 6: DOCUMENTATION 📝
|
|
420
|
+
|
|
421
|
+
**Goal:** Document the API.
|
|
422
|
+
|
|
423
|
+
**OpenAPI/Swagger:**
|
|
424
|
+
```typescript
|
|
425
|
+
@ApiTags('users')
|
|
426
|
+
@Controller('users')
|
|
427
|
+
export class UsersController {
|
|
428
|
+
@Post()
|
|
429
|
+
@ApiOperation({ summary: 'Create a new user' })
|
|
430
|
+
@ApiResponse({ status: 201, type: UserResponseDto })
|
|
431
|
+
@ApiResponse({ status: 400, description: 'Invalid input' })
|
|
432
|
+
@ApiResponse({ status: 409, description: 'Email already exists' })
|
|
433
|
+
async create(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
|
|
434
|
+
// ...
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**Response DTO Documentation:**
|
|
440
|
+
```typescript
|
|
441
|
+
export class UserResponseDto {
|
|
442
|
+
@ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' })
|
|
443
|
+
id: string;
|
|
444
|
+
|
|
445
|
+
@ApiProperty({ example: 'user@example.com' })
|
|
446
|
+
email: string;
|
|
447
|
+
|
|
448
|
+
@ApiProperty({ example: 'John Doe' })
|
|
449
|
+
name: string;
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Best Practices
|
|
456
|
+
|
|
457
|
+
### API Design
|
|
458
|
+
|
|
459
|
+
| Practice | Do | Don't |
|
|
460
|
+
|----------|----|----- |
|
|
461
|
+
| Naming | `GET /users/:id/orders` | `GET /getUserOrders` |
|
|
462
|
+
| Versioning | `/api/v1/users` | No versioning |
|
|
463
|
+
| Pluralization | `/users`, `/orders` | `/user`, `/order` |
|
|
464
|
+
| HTTP Methods | Use correctly (GET=read, POST=create) | POST for everything |
|
|
465
|
+
| Status Codes | 201 for created, 204 for no content | 200 for everything |
|
|
466
|
+
|
|
467
|
+
### Error Handling
|
|
468
|
+
|
|
469
|
+
```typescript
|
|
470
|
+
// Global exception filter
|
|
471
|
+
@Catch()
|
|
472
|
+
export class AllExceptionsFilter implements ExceptionFilter {
|
|
473
|
+
catch(exception: unknown, host: ArgumentsHost) {
|
|
474
|
+
const ctx = host.switchToHttp();
|
|
475
|
+
const response = ctx.getResponse<Response>();
|
|
476
|
+
|
|
477
|
+
const status = exception instanceof HttpException
|
|
478
|
+
? exception.getStatus()
|
|
479
|
+
: HttpStatus.INTERNAL_SERVER_ERROR;
|
|
480
|
+
|
|
481
|
+
const message = exception instanceof HttpException
|
|
482
|
+
? exception.message
|
|
483
|
+
: 'Internal server error';
|
|
484
|
+
|
|
485
|
+
response.status(status).json({
|
|
486
|
+
statusCode: status,
|
|
487
|
+
message,
|
|
488
|
+
timestamp: new Date().toISOString(),
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
## Guidelines
|
|
497
|
+
|
|
498
|
+
### DO ✅
|
|
499
|
+
- Design API before coding
|
|
500
|
+
- Use proper HTTP methods and status codes
|
|
501
|
+
- Validate all inputs
|
|
502
|
+
- Handle errors gracefully
|
|
503
|
+
- Write tests first (TDD)
|
|
504
|
+
- Document with OpenAPI
|
|
505
|
+
|
|
506
|
+
### DON'T ❌
|
|
507
|
+
- Expose internal IDs when UUIDs are better
|
|
508
|
+
- Return password or sensitive data
|
|
509
|
+
- Use GET for mutations
|
|
510
|
+
- Skip input validation
|
|
511
|
+
- Catch and swallow errors
|
|
512
|
+
- Use magic strings/numbers
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## Success Criteria
|
|
517
|
+
|
|
518
|
+
Before considering API complete:
|
|
519
|
+
|
|
520
|
+
- [ ] All endpoints implemented per design
|
|
521
|
+
- [ ] Input validation on all endpoints
|
|
522
|
+
- [ ] Authentication/Authorization in place
|
|
523
|
+
- [ ] Error handling comprehensive
|
|
524
|
+
- [ ] Unit tests with >80% coverage
|
|
525
|
+
- [ ] Integration tests for main flows
|
|
526
|
+
- [ ] API documented (OpenAPI/Swagger)
|
|
527
|
+
- [ ] Security checklist passed
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
## Related Skills
|
|
532
|
+
|
|
533
|
+
- `skills/kilo-kit/development/database/` - For data layer
|
|
534
|
+
- `skills/kilo-kit/development/security/` - For security concerns
|
|
535
|
+
- `skills/kilo-kit/quality/testing/` - For test coverage
|
|
536
|
+
- `skills/kilo-kit/architecture/system-design/` - For architecture decisions
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
*Backend API Development Skill v1.0.0 — APIs built right*
|