@rosetears/aili-pi 0.1.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/LICENSE +21 -0
- package/README.md +109 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/extensions/index.ts +6 -0
- package/install.sh +5 -0
- package/manifests/adapter-evidence.json +45 -0
- package/manifests/capabilities.json +124 -0
- package/manifests/live-verification.json +26 -0
- package/manifests/provenance.json +71 -0
- package/manifests/roles.json +474 -0
- package/manifests/sbom.json +7797 -0
- package/manifests/skill-compatibility.json +8100 -0
- package/manifests/subagent-provenance.json +37 -0
- package/package.json +91 -0
- package/prompts/build.md +8 -0
- package/prompts/define.md +8 -0
- package/prompts/ideate.md +8 -0
- package/prompts/local-review.md +8 -0
- package/prompts/ship.md +8 -0
- package/roles/agent-evaluator.md +47 -0
- package/roles/ai-regression-scout.md +47 -0
- package/roles/browser-qa-runner.md +47 -0
- package/roles/code-reviewer.md +47 -0
- package/roles/code-scout.md +47 -0
- package/roles/convergence-reviewer.md +55 -0
- package/roles/doc-researcher.md +47 -0
- package/roles/e2e-artifact-runner.md +47 -0
- package/roles/implementer.md +47 -0
- package/roles/opensource-sanitizer.md +47 -0
- package/roles/plan-auditor.md +47 -0
- package/roles/pr-test-analyzer.md +47 -0
- package/roles/security-auditor.md +47 -0
- package/roles/silent-failure-reviewer.md +47 -0
- package/roles/spec-miner.md +47 -0
- package/roles/test-coverage-reviewer.md +47 -0
- package/roles/test-engineer.md +48 -0
- package/roles/web-performance-auditor.md +47 -0
- package/roles/web-researcher.md +47 -0
- package/scripts/apply-adapter-evidence.ts +73 -0
- package/scripts/bootstrap.sh +180 -0
- package/scripts/generate-provenance.ts +143 -0
- package/scripts/local-package-e2e.ts +51 -0
- package/scripts/sync-roles.ts +213 -0
- package/scripts/sync-skills.ts +356 -0
- package/scripts/validate-runtime.ts +11 -0
- package/skills/academic-paper-review/SKILL.md +81 -0
- package/skills/agents-md-initialization/SKILL.md +121 -0
- package/skills/agents-md-initialization/references/agents-template.md +83 -0
- package/skills/agents-md-initialization/references/agents_md.py +215 -0
- package/skills/ai-regression-scout/SKILL.md +24 -0
- package/skills/aili-delivery-flow/SKILL.md +125 -0
- package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
- package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
- package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
- package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
- package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
- package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
- package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
- package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
- package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
- package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
- package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
- package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
- package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
- package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
- package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
- package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
- package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
- package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
- package/skills/android-native-dev/SKILL.md +722 -0
- package/skills/android-native-dev/references/accessibility.md +209 -0
- package/skills/android-native-dev/references/adaptive-screens.md +231 -0
- package/skills/android-native-dev/references/design-style-guide.md +365 -0
- package/skills/android-native-dev/references/functional-requirements.md +229 -0
- package/skills/android-native-dev/references/motion-system.md +203 -0
- package/skills/android-native-dev/references/performance-stability.md +223 -0
- package/skills/android-native-dev/references/privacy-security.md +244 -0
- package/skills/android-native-dev/references/testing.md +554 -0
- package/skills/android-native-dev/references/visual-design.md +246 -0
- package/skills/api-and-interface-design/SKILL.md +318 -0
- package/skills/browser-qa/SKILL.md +32 -0
- package/skills/browser-testing-with-devtools/SKILL.md +323 -0
- package/skills/build-failure-repair/SKILL.md +49 -0
- package/skills/chart-visualization/SKILL.md +73 -0
- package/skills/ci-cd-and-automation/SKILL.md +353 -0
- package/skills/code-review-and-quality/SKILL.md +375 -0
- package/skills/code-review-quality-gates/SKILL.md +132 -0
- package/skills/code-simplification/SKILL.md +371 -0
- package/skills/comment-accuracy-review/SKILL.md +37 -0
- package/skills/consulting-analysis/SKILL.md +69 -0
- package/skills/context-engineering/SKILL.md +375 -0
- package/skills/coverage-review/SKILL.md +24 -0
- package/skills/data-analysis/SKILL.md +74 -0
- package/skills/deprecation-and-migration/SKILL.md +222 -0
- package/skills/documentation-and-adrs/SKILL.md +330 -0
- package/skills/e2e-artifact-handling/SKILL.md +30 -0
- package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
- package/skills/explain-by-allegory/SKILL.md +99 -0
- package/skills/flutter-dev/SKILL.md +162 -0
- package/skills/flutter-dev/references/animations.md +497 -0
- package/skills/flutter-dev/references/bloc-state.md +281 -0
- package/skills/flutter-dev/references/forms.md +656 -0
- package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
- package/skills/flutter-dev/references/localization.md +510 -0
- package/skills/flutter-dev/references/networking.md +566 -0
- package/skills/flutter-dev/references/performance.md +305 -0
- package/skills/flutter-dev/references/platform-specific.md +417 -0
- package/skills/flutter-dev/references/project-structure.md +273 -0
- package/skills/flutter-dev/references/riverpod-state.md +232 -0
- package/skills/flutter-dev/references/testing.md +364 -0
- package/skills/flutter-dev/references/widget-patterns.md +233 -0
- package/skills/frontend-dev/SKILL.md +468 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
- package/skills/frontend-dev/references/env-setup.md +33 -0
- package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
- package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
- package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
- package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
- package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
- package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
- package/skills/frontend-dev/references/motion-recipes.md +407 -0
- package/skills/frontend-dev/references/troubleshooting.md +85 -0
- package/skills/frontend-dev/scripts/minimax_image.py +137 -0
- package/skills/frontend-dev/scripts/minimax_music.py +157 -0
- package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
- package/skills/frontend-dev/scripts/minimax_video.py +187 -0
- package/skills/frontend-dev/templates/generator_template.js +223 -0
- package/skills/frontend-dev/templates/viewer.html +599 -0
- package/skills/frontend-ui-engineering/SKILL.md +367 -0
- package/skills/fullstack-dev/SKILL.md +819 -0
- package/skills/fullstack-dev/references/api-design.md +444 -0
- package/skills/fullstack-dev/references/auth-flow.md +165 -0
- package/skills/fullstack-dev/references/db-schema.md +706 -0
- package/skills/fullstack-dev/references/django-best-practices.md +466 -0
- package/skills/fullstack-dev/references/environment-management.md +78 -0
- package/skills/fullstack-dev/references/release-checklist.md +278 -0
- package/skills/fullstack-dev/references/technology-selection.md +254 -0
- package/skills/fullstack-dev/references/testing-strategy.md +404 -0
- package/skills/git-workflow-and-versioning/SKILL.md +446 -0
- package/skills/github-evidence-triage/SKILL.md +115 -0
- package/skills/harness-evolution/SKILL.md +59 -0
- package/skills/harness-evolution/references/activation-matrix.md +13 -0
- package/skills/harness-evolution/references/approval-policy.md +20 -0
- package/skills/harness-evolution/references/change-report-template.md +33 -0
- package/skills/harness-evolution/references/component-taxonomy.md +19 -0
- package/skills/harness-evolution/references/verdict-policy.md +13 -0
- package/skills/harness-issue-triage/SKILL.md +72 -0
- package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
- package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
- package/skills/harness-optimization-audit/SKILL.md +125 -0
- package/skills/idea-refine/SKILL.md +191 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
- package/skills/incremental-implementation/SKILL.md +252 -0
- package/skills/ios-application-dev/SKILL.md +212 -0
- package/skills/ios-application-dev/references/accessibility.md +259 -0
- package/skills/ios-application-dev/references/graphics-animation.md +350 -0
- package/skills/ios-application-dev/references/layout-system.md +199 -0
- package/skills/ios-application-dev/references/metal-shader.md +178 -0
- package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
- package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
- package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
- package/skills/ios-application-dev/references/system-integration.md +401 -0
- package/skills/ios-application-dev/references/uikit-components.md +297 -0
- package/skills/local-review-gate/SKILL.md +207 -0
- package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
- package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
- package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
- package/skills/local-review-gate/references/graphify-local-review.md +33 -0
- package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
- package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
- package/skills/local-review-gate/references/upstream-provenance.md +61 -0
- package/skills/mature-project-pattern-research/SKILL.md +155 -0
- package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
- package/skills/minimax-docx/LICENSE +21 -0
- package/skills/minimax-docx/SKILL.md +273 -0
- package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/skills/minimax-docx/references/comments_guide.md +191 -0
- package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/skills/minimax-docx/references/design_principles.md +819 -0
- package/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/skills/minimax-docx/references/openxml_units.md +72 -0
- package/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/skills/minimax-docx/references/typography_guide.md +294 -0
- package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/skills/minimax-docx/scripts/setup.sh +504 -0
- package/skills/minimax-pdf/README.md +222 -0
- package/skills/minimax-pdf/SKILL.md +218 -0
- package/skills/minimax-pdf/design/design.md +381 -0
- package/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/skills/minimax-pdf/scripts/make.sh +491 -0
- package/skills/minimax-pdf/scripts/merge.py +112 -0
- package/skills/minimax-pdf/scripts/palette.py +521 -0
- package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/skills/minimax-pdf/scripts/render_body.py +1052 -0
- package/skills/minimax-pdf/scripts/render_cover.js +111 -0
- package/skills/minimax-xlsx/SKILL.md +156 -0
- package/skills/minimax-xlsx/references/create.md +691 -0
- package/skills/minimax-xlsx/references/edit.md +684 -0
- package/skills/minimax-xlsx/references/fix.md +37 -0
- package/skills/minimax-xlsx/references/format.md +768 -0
- package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/skills/minimax-xlsx/references/validate.md +772 -0
- package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/skills/newsletter-generation/SKILL.md +71 -0
- package/skills/oss-release-readiness/SKILL.md +47 -0
- package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
- package/skills/performance-optimization/SKILL.md +364 -0
- package/skills/planning-and-task-breakdown/SKILL.md +290 -0
- package/skills/pptx-generator/SKILL.md +275 -0
- package/skills/pptx-generator/references/design-system.md +392 -0
- package/skills/pptx-generator/references/editing.md +162 -0
- package/skills/pptx-generator/references/pitfalls.md +112 -0
- package/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/skills/pptx-generator/references/slide-types.md +413 -0
- package/skills/pr-test-analysis/SKILL.md +24 -0
- package/skills/react-native-dev/SKILL.md +180 -0
- package/skills/react-native-dev/references/animations.md +254 -0
- package/skills/react-native-dev/references/components.md +124 -0
- package/skills/react-native-dev/references/engineering.md +527 -0
- package/skills/react-native-dev/references/forms.md +300 -0
- package/skills/react-native-dev/references/native-capabilities.md +163 -0
- package/skills/react-native-dev/references/navigation.md +271 -0
- package/skills/react-native-dev/references/networking.md +346 -0
- package/skills/react-native-dev/references/performance.md +215 -0
- package/skills/react-native-dev/references/state-management.md +230 -0
- package/skills/react-native-dev/references/styling.md +117 -0
- package/skills/react-native-dev/references/testing.md +341 -0
- package/skills/requirements-grilling/SKILL.md +447 -0
- package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
- package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
- package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
- package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
- package/skills/review-pipeline/SKILL.md +38 -0
- package/skills/rose-memory/SKILL.md +210 -0
- package/skills/rose-memory/references/README.md +48 -0
- package/skills/rose-memory/references/memory_cli.py +2384 -0
- package/skills/rose-memory/references/schema.sql +315 -0
- package/skills/security-and-hardening/SKILL.md +369 -0
- package/skills/session-handoff/SKILL.md +88 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
- package/skills/session-handoff/scripts/session_handoff.py +764 -0
- package/skills/shader-dev/SKILL.md +316 -0
- package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
- package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
- package/skills/shader-dev/reference/anti-aliasing.md +71 -0
- package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
- package/skills/shader-dev/reference/camera-effects.md +80 -0
- package/skills/shader-dev/reference/cellular-automata.md +635 -0
- package/skills/shader-dev/reference/color-palette.md +481 -0
- package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
- package/skills/shader-dev/reference/domain-repetition.md +436 -0
- package/skills/shader-dev/reference/domain-warping.md +419 -0
- package/skills/shader-dev/reference/fluid-simulation.md +425 -0
- package/skills/shader-dev/reference/fractal-rendering.md +525 -0
- package/skills/shader-dev/reference/lighting-model.md +639 -0
- package/skills/shader-dev/reference/matrix-transform.md +535 -0
- package/skills/shader-dev/reference/multipass-buffer.md +571 -0
- package/skills/shader-dev/reference/normal-estimation.md +418 -0
- package/skills/shader-dev/reference/particle-system.md +589 -0
- package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
- package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
- package/skills/shader-dev/reference/post-processing.md +375 -0
- package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
- package/skills/shader-dev/reference/procedural-noise.md +551 -0
- package/skills/shader-dev/reference/ray-marching.md +396 -0
- package/skills/shader-dev/reference/sdf-2d.md +724 -0
- package/skills/shader-dev/reference/sdf-3d.md +805 -0
- package/skills/shader-dev/reference/sdf-tricks.md +63 -0
- package/skills/shader-dev/reference/shadow-techniques.md +476 -0
- package/skills/shader-dev/reference/simulation-physics.md +644 -0
- package/skills/shader-dev/reference/sound-synthesis.md +578 -0
- package/skills/shader-dev/reference/terrain-rendering.md +839 -0
- package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
- package/skills/shader-dev/reference/texture-sampling.md +553 -0
- package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
- package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
- package/skills/shader-dev/reference/voxel-rendering.md +701 -0
- package/skills/shader-dev/reference/water-ocean.md +445 -0
- package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
- package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
- package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
- package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
- package/skills/shader-dev/techniques/camera-effects.md +115 -0
- package/skills/shader-dev/techniques/cellular-automata.md +531 -0
- package/skills/shader-dev/techniques/color-palette.md +380 -0
- package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
- package/skills/shader-dev/techniques/domain-repetition.md +333 -0
- package/skills/shader-dev/techniques/domain-warping.md +414 -0
- package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
- package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
- package/skills/shader-dev/techniques/lighting-model.md +527 -0
- package/skills/shader-dev/techniques/matrix-transform.md +455 -0
- package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
- package/skills/shader-dev/techniques/normal-estimation.md +318 -0
- package/skills/shader-dev/techniques/particle-system.md +1203 -0
- package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
- package/skills/shader-dev/techniques/post-processing.md +788 -0
- package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
- package/skills/shader-dev/techniques/procedural-noise.md +554 -0
- package/skills/shader-dev/techniques/ray-marching.md +467 -0
- package/skills/shader-dev/techniques/sdf-2d.md +631 -0
- package/skills/shader-dev/techniques/sdf-3d.md +589 -0
- package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
- package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
- package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
- package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
- package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
- package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
- package/skills/shader-dev/techniques/texture-sampling.md +382 -0
- package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
- package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
- package/skills/shader-dev/techniques/water-ocean.md +490 -0
- package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
- package/skills/shipping-and-launch/SKILL.md +334 -0
- package/skills/silent-failure-hunting/SKILL.md +24 -0
- package/skills/source-driven-development/SKILL.md +223 -0
- package/skills/spec-driven-development/SKILL.md +235 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
- package/skills/strategy-stress-test/SKILL.md +185 -0
- package/skills/systematic-literature-review/SKILL.md +77 -0
- package/skills/test-document-generator/SKILL.md +152 -0
- package/skills/test-document-generator/references/test-document-template.md +45 -0
- package/skills/test-driven-development/SKILL.md +399 -0
- package/skills/write-skills/GLOSSARY.md +113 -0
- package/skills/write-skills/SKILL.md +133 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
- package/src/runtime/child-guard.ts +70 -0
- package/src/runtime/conflicts.ts +25 -0
- package/src/runtime/contracts.ts +9 -0
- package/src/runtime/doctor.ts +134 -0
- package/src/runtime/global-resources.ts +152 -0
- package/src/runtime/index.ts +23 -0
- package/src/runtime/lifecycle.ts +19 -0
- package/src/runtime/native-integrations.ts +44 -0
- package/src/runtime/path-boundaries.ts +69 -0
- package/src/runtime/registry.ts +213 -0
- package/src/runtime/roles.ts +64 -0
- package/src/runtime/rose-context.ts +24 -0
- package/src/runtime/subagents.ts +426 -0
- package/templates/APPEND_SYSTEM.md +12 -0
- package/upstream/aili-workflows.lock.json +3226 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fullstack-dev-api-design
|
|
3
|
+
description: "API design patterns and best practices. Use when creating endpoints, choosing methods/status codes, implementing pagination, or writing OpenAPI specs. Prevents common REST/GraphQL/gRPC mistakes."
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
version: "2.0.0"
|
|
7
|
+
sources:
|
|
8
|
+
- Microsoft REST API Guidelines
|
|
9
|
+
- Google API Design Guide
|
|
10
|
+
- Zalando RESTful API Guidelines
|
|
11
|
+
- JSON:API Specification
|
|
12
|
+
- RFC 9457 (Problem Details for HTTP APIs)
|
|
13
|
+
- RFC 9110 (HTTP Semantics)
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# API Design Guidelines
|
|
17
|
+
|
|
18
|
+
Framework-agnostic API design guide for backend and full-stack engineers. 50+ rules across 10 categories, prioritized by impact. Covers REST, GraphQL, and gRPC.
|
|
19
|
+
|
|
20
|
+
## Scope
|
|
21
|
+
|
|
22
|
+
**USE this skill when:**
|
|
23
|
+
- Designing a new API or adding endpoints
|
|
24
|
+
- Reviewing API pull requests
|
|
25
|
+
- Choosing between REST / GraphQL / gRPC
|
|
26
|
+
- Writing OpenAPI specifications
|
|
27
|
+
- Migrating or versioning an existing API
|
|
28
|
+
|
|
29
|
+
**NOT for:**
|
|
30
|
+
- Framework-specific implementation details (use your framework's own skill/docs)
|
|
31
|
+
- Frontend data fetching patterns (use React Query / SWR docs)
|
|
32
|
+
- Authentication implementation details (use your auth library's docs)
|
|
33
|
+
- Database schema design (→ `database-schema-design`)
|
|
34
|
+
|
|
35
|
+
## Context Required
|
|
36
|
+
|
|
37
|
+
Before applying this skill, gather:
|
|
38
|
+
|
|
39
|
+
| Required | Optional |
|
|
40
|
+
|----------|----------|
|
|
41
|
+
| Target consumers (browser, mobile, service) | Existing API conventions in the project |
|
|
42
|
+
| Expected request volume (RPS estimate) | Current OpenAPI / Swagger spec |
|
|
43
|
+
| Authentication method (JWT, API key, OAuth) | Rate limiting requirements |
|
|
44
|
+
| Data model / domain entities | Caching strategy |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Quick Start Checklist
|
|
49
|
+
|
|
50
|
+
New API endpoint? Run through this before writing code:
|
|
51
|
+
|
|
52
|
+
- [ ] Resource named as **plural noun** (`/orders`, not `/getOrders`)
|
|
53
|
+
- [ ] URL in **kebab-case**, body fields in **camelCase**
|
|
54
|
+
- [ ] Correct **HTTP method** (GET=read, POST=create, PUT=replace, PATCH=partial, DELETE=remove)
|
|
55
|
+
- [ ] Correct **status code** (201 Created, 422 Validation, 404 Not Found…)
|
|
56
|
+
- [ ] Error response follows **RFC 9457** envelope
|
|
57
|
+
- [ ] **Pagination** on all list endpoints (default 20, max 100)
|
|
58
|
+
- [ ] **Authentication** required (Bearer token, not query param)
|
|
59
|
+
- [ ] **Request ID** in response header (`X-Request-Id`)
|
|
60
|
+
- [ ] **Rate limit** headers included
|
|
61
|
+
- [ ] Endpoint documented in **OpenAPI spec**
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Quick Navigation
|
|
66
|
+
|
|
67
|
+
| Need to… | Jump to |
|
|
68
|
+
|----------|---------|
|
|
69
|
+
| Name a resource URL | [1. Resource Modeling](#1-resource-modeling-critical) |
|
|
70
|
+
| Pick HTTP method + status code | [3. HTTP Methods & Status Codes](#3-http-methods--status-codes-critical) |
|
|
71
|
+
| Format error responses | [4. Error Handling](#4-error-handling-high) |
|
|
72
|
+
| Add pagination or filtering | [6. Pagination & Filtering](#6-pagination--filtering-high) |
|
|
73
|
+
| Choose API style (REST vs GraphQL vs gRPC) | [10. API Style Decision](#10-api-style-decision-tree) |
|
|
74
|
+
| Version an existing API | [7. Versioning](#7-versioning-medium-high) |
|
|
75
|
+
| Avoid common mistakes | [Anti-Patterns](#anti-patterns-checklist) |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 1. Resource Modeling (CRITICAL)
|
|
80
|
+
|
|
81
|
+
### Core Rules
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
✅ /users — plural noun
|
|
85
|
+
✅ /users/{id}/orders — 1 level nesting
|
|
86
|
+
✅ /reviews?orderId={oid} — flatten deep nesting with query params
|
|
87
|
+
|
|
88
|
+
❌ /getUsers — verb in URL
|
|
89
|
+
❌ /user — singular
|
|
90
|
+
❌ /users/{uid}/orders/{oid}/items/{iid}/reviews — 3+ levels deep
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Max nesting: 2 levels.** Beyond that, promote to top-level resource with filters.
|
|
94
|
+
|
|
95
|
+
### Domain Alignment
|
|
96
|
+
|
|
97
|
+
Resources map to **domain concepts**, not database tables:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
✅ /checkout-sessions (domain aggregate)
|
|
101
|
+
✅ /shipping-labels (domain concept)
|
|
102
|
+
|
|
103
|
+
❌ /tbl_order_header (database table leak)
|
|
104
|
+
❌ /join_user_role (internal schema leak)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 2. URL & Naming (CRITICAL)
|
|
110
|
+
|
|
111
|
+
| Context | Convention | Example |
|
|
112
|
+
|---------|-----------|---------|
|
|
113
|
+
| URL path | kebab-case | `/order-items` |
|
|
114
|
+
| JSON body fields | camelCase | `{ "firstName": "Jane" }` |
|
|
115
|
+
| Query params | camelCase or snake_case (be consistent) | `?sortBy=createdAt` |
|
|
116
|
+
| Headers | Train-Case | `X-Request-Id` |
|
|
117
|
+
|
|
118
|
+
**Python exception:** If your entire stack is Python/snake_case, you MAY use `snake_case` in JSON — but be **consistent across all endpoints**.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
✅ GET /users ❌ GET /users/
|
|
122
|
+
✅ GET /reports/annual ❌ GET /reports/annual.json
|
|
123
|
+
✅ POST /users ❌ POST /users/create
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 3. HTTP Methods & Status Codes (CRITICAL)
|
|
129
|
+
|
|
130
|
+
### Method Semantics
|
|
131
|
+
|
|
132
|
+
| Method | Semantics | Idempotent | Safe | Request Body |
|
|
133
|
+
|--------|-----------|-----------|------|-------------|
|
|
134
|
+
| GET | Read | ✅ | ✅ | ❌ Never |
|
|
135
|
+
| POST | Create / Action | ❌ | ❌ | ✅ Always |
|
|
136
|
+
| PUT | Full replace | ✅ | ❌ | ✅ Always |
|
|
137
|
+
| PATCH | Partial update | ❌* | ❌ | ✅ Always |
|
|
138
|
+
| DELETE | Remove | ✅ | ❌ | ❌ Rarely |
|
|
139
|
+
|
|
140
|
+
### Status Code Quick Reference
|
|
141
|
+
|
|
142
|
+
**Success:**
|
|
143
|
+
|
|
144
|
+
| Code | When | Response Body |
|
|
145
|
+
|------|------|--------------|
|
|
146
|
+
| 200 OK | GET, PUT, PATCH success | Resource / result |
|
|
147
|
+
| 201 Created | POST created resource | Created resource + `Location` header |
|
|
148
|
+
| 202 Accepted | Async operation started | Job ID / status URL |
|
|
149
|
+
| 204 No Content | DELETE success, PUT with no body | None |
|
|
150
|
+
|
|
151
|
+
**Client Errors:**
|
|
152
|
+
|
|
153
|
+
| Code | When | Key Distinction |
|
|
154
|
+
|------|------|-----------------|
|
|
155
|
+
| 400 Bad Request | Malformed syntax | Can't even parse |
|
|
156
|
+
| 401 Unauthorized | Missing / invalid auth | "Who are you?" |
|
|
157
|
+
| 403 Forbidden | Authenticated, no permission | "I know you, but no" |
|
|
158
|
+
| 404 Not Found | Resource doesn't exist | Also use to hide 403 |
|
|
159
|
+
| 409 Conflict | Duplicate, version mismatch | State conflict |
|
|
160
|
+
| 422 Unprocessable | Valid syntax, failed validation | Semantic errors |
|
|
161
|
+
| 429 Too Many Requests | Rate limit hit | Include `Retry-After` |
|
|
162
|
+
|
|
163
|
+
**Server Errors:** 500 (unexpected), 502 (upstream fail), 503 (overloaded), 504 (upstream timeout)
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 4. Error Handling (HIGH)
|
|
168
|
+
|
|
169
|
+
### Standard Error Envelope (RFC 9457)
|
|
170
|
+
|
|
171
|
+
Every error response uses this format:
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"type": "https://api.example.com/errors/insufficient-funds",
|
|
176
|
+
"title": "Insufficient Funds",
|
|
177
|
+
"status": 422,
|
|
178
|
+
"detail": "Account balance $10.00 is less than withdrawal $50.00.",
|
|
179
|
+
"instance": "/transactions/txn_abc123",
|
|
180
|
+
"request_id": "req_7f3a8b2c",
|
|
181
|
+
"errors": [
|
|
182
|
+
{ "field": "amount", "message": "Exceeds balance", "code": "INSUFFICIENT_BALANCE" }
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Multi-Language Implementation
|
|
188
|
+
|
|
189
|
+
**TypeScript (Express):**
|
|
190
|
+
```typescript
|
|
191
|
+
class AppError extends Error {
|
|
192
|
+
constructor(
|
|
193
|
+
public readonly title: string,
|
|
194
|
+
public readonly status: number,
|
|
195
|
+
public readonly detail: string,
|
|
196
|
+
public readonly code: string,
|
|
197
|
+
) { super(detail); }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Middleware
|
|
201
|
+
app.use((err, req, res, next) => {
|
|
202
|
+
if (err instanceof AppError) {
|
|
203
|
+
return res.status(err.status).json({
|
|
204
|
+
type: `https://api.example.com/errors/${err.code}`,
|
|
205
|
+
title: err.title, status: err.status,
|
|
206
|
+
detail: err.detail, request_id: req.id,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
res.status(500).json({ title: 'Internal Error', status: 500, request_id: req.id });
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Python (FastAPI):**
|
|
214
|
+
```python
|
|
215
|
+
from fastapi import Request
|
|
216
|
+
from fastapi.responses import JSONResponse
|
|
217
|
+
|
|
218
|
+
class AppError(Exception):
|
|
219
|
+
def __init__(self, title: str, status: int, detail: str, code: str):
|
|
220
|
+
self.title, self.status, self.detail, self.code = title, status, detail, code
|
|
221
|
+
|
|
222
|
+
@app.exception_handler(AppError)
|
|
223
|
+
async def app_error_handler(request: Request, exc: AppError):
|
|
224
|
+
return JSONResponse(status_code=exc.status, content={
|
|
225
|
+
"type": f"https://api.example.com/errors/{exc.code}",
|
|
226
|
+
"title": exc.title, "status": exc.status,
|
|
227
|
+
"detail": exc.detail, "request_id": request.state.request_id,
|
|
228
|
+
})
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Iron Rules
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
✅ Return RFC 9457 error envelope for ALL errors
|
|
235
|
+
✅ Include request_id in every error response
|
|
236
|
+
✅ Return per-field validation errors in `errors` array
|
|
237
|
+
|
|
238
|
+
❌ Never expose stack traces in production
|
|
239
|
+
❌ Never return 200 for errors
|
|
240
|
+
❌ Never swallow errors silently
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 5. Authentication & Authorization (HIGH)
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
✅ Authorization: Bearer eyJhbGci... (header)
|
|
249
|
+
❌ GET /users?token=eyJhbGci... (URL — appears in logs)
|
|
250
|
+
|
|
251
|
+
✅ 401 → "Who are you?" (missing/invalid credentials)
|
|
252
|
+
✅ 403 → "You can't do this" (authenticated, no permission)
|
|
253
|
+
✅ 404 → Hide resource existence (use instead of 403 when needed)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Rate Limit Headers (always include):**
|
|
257
|
+
```
|
|
258
|
+
X-RateLimit-Limit: 100
|
|
259
|
+
X-RateLimit-Remaining: 42
|
|
260
|
+
X-RateLimit-Reset: 1625097600
|
|
261
|
+
Retry-After: 30
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 6. Pagination & Filtering (HIGH)
|
|
267
|
+
|
|
268
|
+
### Cursor vs Offset
|
|
269
|
+
|
|
270
|
+
| Strategy | When | Pros | Cons |
|
|
271
|
+
|----------|------|------|------|
|
|
272
|
+
| **Cursor** (preferred) | Large/dynamic datasets | Consistent, no skips | Can't jump to page N |
|
|
273
|
+
| **Offset** | Small/stable datasets, admin UIs | Simple, page jumps | Drift on insert/delete |
|
|
274
|
+
|
|
275
|
+
**Cursor pagination response:**
|
|
276
|
+
```json
|
|
277
|
+
{
|
|
278
|
+
"data": [...],
|
|
279
|
+
"pagination": { "next_cursor": "eyJpZCI6MTIwfQ", "has_more": true }
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Offset pagination response:**
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"data": [...],
|
|
287
|
+
"pagination": { "page": 3, "per_page": 20, "total": 256, "total_pages": 13 }
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Always enforce:** Default 20 items, max 100 items.
|
|
292
|
+
|
|
293
|
+
### Standard Filter Patterns
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
GET /orders?status=shipped&created_after=2025-01-01&sort=-created_at&fields=id,status
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
| Pattern | Convention |
|
|
300
|
+
|---------|-----------|
|
|
301
|
+
| Exact match | `?status=shipped` |
|
|
302
|
+
| Range | `?price_gte=10&price_lte=100` |
|
|
303
|
+
| Date range | `?created_after=2025-01-01&created_before=2025-12-31` |
|
|
304
|
+
| Sort | `?sort=field` (asc), `?sort=-field` (desc) |
|
|
305
|
+
| Sparse fields | `?fields=id,name,email` |
|
|
306
|
+
| Search | `?q=search+term` |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 7. Versioning (MEDIUM-HIGH)
|
|
311
|
+
|
|
312
|
+
| Strategy | Format | Best For |
|
|
313
|
+
|----------|--------|----------|
|
|
314
|
+
| **URL path** (recommended) | `/v1/users` | Public APIs |
|
|
315
|
+
| **Header** | `Api-Version: 2` | Internal APIs |
|
|
316
|
+
| **Query param** | `?version=2` | Legacy (avoid) |
|
|
317
|
+
|
|
318
|
+
**Non-breaking changes (no version bump):** New optional response fields, new endpoints, new optional params.
|
|
319
|
+
|
|
320
|
+
**Breaking changes (new version required):** Removing/renaming fields, changing types, stricter validation, removing endpoints.
|
|
321
|
+
|
|
322
|
+
**Deprecation headers:**
|
|
323
|
+
```
|
|
324
|
+
Sunset: Sat, 01 Mar 2026 00:00:00 GMT
|
|
325
|
+
Deprecation: true
|
|
326
|
+
Link: <https://api.example.com/v2/users>; rel="successor-version"
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 8. Request / Response Design (MEDIUM)
|
|
332
|
+
|
|
333
|
+
### Consistent Envelope
|
|
334
|
+
|
|
335
|
+
```json
|
|
336
|
+
{
|
|
337
|
+
"data": { "id": "ord_123", "status": "pending", "total": 99.50 },
|
|
338
|
+
"meta": { "request_id": "req_abc123", "timestamp": "2025-06-15T10:30:00Z" }
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Key Rules
|
|
343
|
+
|
|
344
|
+
| Rule | Correct | Wrong |
|
|
345
|
+
|------|---------|-------|
|
|
346
|
+
| Timestamps | `"2025-06-15T10:30:00Z"` (ISO 8601) | `"06/15/2025"` or `1718447400` |
|
|
347
|
+
| Public IDs | UUID `"550e8400-..."` | Auto-increment `42` |
|
|
348
|
+
| Null vs absent (PATCH) | `{ "nickname": null }` = clear field | Absent field = don't change |
|
|
349
|
+
| HATEOAS (public APIs) | `"links": { "cancel": "/orders/123/cancel" }` | No discoverability |
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 9. Documentation — OpenAPI (MEDIUM)
|
|
354
|
+
|
|
355
|
+
**Design-first workflow:**
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
1. Write OpenAPI 3.1 spec
|
|
359
|
+
2. Review spec with stakeholders
|
|
360
|
+
3. Generate server stubs + client SDKs
|
|
361
|
+
4. Implement handlers
|
|
362
|
+
5. Validate responses against spec in CI
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
Every endpoint documents: summary, all parameters, request body + examples, all response codes + schemas, auth requirements.
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## 10. API Style Decision Tree
|
|
370
|
+
|
|
371
|
+
```
|
|
372
|
+
What kind of API?
|
|
373
|
+
│
|
|
374
|
+
├─ Browser + mobile clients, flexible queries
|
|
375
|
+
│ └─ GraphQL
|
|
376
|
+
│ Rules: DataLoader (no N+1), depth limit ≤7, Relay pagination
|
|
377
|
+
│
|
|
378
|
+
├─ Standard CRUD, public consumers, caching important
|
|
379
|
+
│ └─ REST (this guide)
|
|
380
|
+
│ Rules: Resources, HTTP methods, status codes, OpenAPI
|
|
381
|
+
│
|
|
382
|
+
├─ Service-to-service, high throughput, strong typing
|
|
383
|
+
│ └─ gRPC
|
|
384
|
+
│ Rules: Protobuf schemas, streaming for large data, deadlines
|
|
385
|
+
│
|
|
386
|
+
├─ Full-stack TypeScript, same team owns client + server
|
|
387
|
+
│ └─ tRPC
|
|
388
|
+
│ Rules: Shared types, no code generation needed
|
|
389
|
+
│
|
|
390
|
+
└─ Real-time bidirectional
|
|
391
|
+
└─ WebSocket / SSE
|
|
392
|
+
Rules: Heartbeat, reconnection, message ordering
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Anti-Patterns Checklist
|
|
398
|
+
|
|
399
|
+
| # | ❌ Don't | ✅ Do Instead |
|
|
400
|
+
|---|---------|--------------|
|
|
401
|
+
| 1 | Verbs in URLs (`/getUser`) | HTTP methods + noun resources |
|
|
402
|
+
| 2 | Return 200 for errors | Correct 4xx/5xx status codes |
|
|
403
|
+
| 3 | Mix naming styles | One convention per context |
|
|
404
|
+
| 4 | Expose database IDs | UUIDs for public identifiers |
|
|
405
|
+
| 5 | No pagination on lists | Always paginate (default 20) |
|
|
406
|
+
| 6 | Swallow errors silently | Structured RFC 9457 errors |
|
|
407
|
+
| 7 | Token in URL query | Authorization header |
|
|
408
|
+
| 8 | Deep nesting (3+ levels) | Flatten with query params |
|
|
409
|
+
| 9 | Break changes without version | Maintain compatibility or version |
|
|
410
|
+
| 10 | No rate limiting | Implement + communicate via headers |
|
|
411
|
+
| 11 | No request ID | `X-Request-Id` on every response |
|
|
412
|
+
| 12 | Stack traces in production | Safe error message + internal log |
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Common Issues
|
|
417
|
+
|
|
418
|
+
### Issue 1: "Should this be a new resource or a sub-resource?"
|
|
419
|
+
|
|
420
|
+
**Symptom:** URL path keeps growing (`/users/{id}/orders/{id}/items/{id}/reviews`)
|
|
421
|
+
|
|
422
|
+
**Rule:** If the child entity makes sense on its own, promote it. If it only exists within the parent context, keep it nested (max 2 levels).
|
|
423
|
+
|
|
424
|
+
```
|
|
425
|
+
/reviews?orderId=123 ✅ (reviews exist independently)
|
|
426
|
+
/orders/{id}/items ✅ (items belong to orders, 1 level)
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Issue 2: "PUT or PATCH?"
|
|
430
|
+
|
|
431
|
+
**Symptom:** Team can't agree on update semantics.
|
|
432
|
+
|
|
433
|
+
**Rule:**
|
|
434
|
+
- PUT = client sends **complete** resource (missing fields → set to default/null)
|
|
435
|
+
- PATCH = client sends **only changed fields** (missing fields → unchanged)
|
|
436
|
+
- When unsure → **PATCH** (safer, less surprising)
|
|
437
|
+
|
|
438
|
+
### Issue 3: "400 or 422?"
|
|
439
|
+
|
|
440
|
+
**Symptom:** Inconsistent validation error codes.
|
|
441
|
+
|
|
442
|
+
**Rule:**
|
|
443
|
+
- 400 = can't parse request at all (malformed JSON, wrong content-type)
|
|
444
|
+
- 422 = parsed OK, but values fail validation (invalid email, negative quantity)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Authentication Flow Patterns
|
|
2
|
+
|
|
3
|
+
Complete auth flow across frontend and backend. Covers JWT bearer flow, automatic token refresh, Next.js server-side auth, RBAC, and backend middleware order.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## JWT Bearer Flow (Most Common)
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
1. Login
|
|
11
|
+
Client → POST /api/auth/login { email, password }
|
|
12
|
+
Server → { accessToken (15min), refreshToken (7d, httpOnly cookie) }
|
|
13
|
+
|
|
14
|
+
2. Authenticated Requests
|
|
15
|
+
Client → GET /api/orders Authorization: Bearer <accessToken>
|
|
16
|
+
Server → validates JWT → returns data
|
|
17
|
+
|
|
18
|
+
3. Token Refresh (transparent)
|
|
19
|
+
Client → 401 received → POST /api/auth/refresh (cookie auto-sent)
|
|
20
|
+
Server → new accessToken
|
|
21
|
+
Client → retry original request with new token
|
|
22
|
+
|
|
23
|
+
4. Logout
|
|
24
|
+
Client → POST /api/auth/logout
|
|
25
|
+
Server → invalidate refresh token → clear cookie
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Frontend: Automatic Token Refresh
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// lib/api-client.ts — add to existing fetch wrapper
|
|
34
|
+
async function apiWithRefresh<T>(path: string, options: RequestInit = {}): Promise<T> {
|
|
35
|
+
try {
|
|
36
|
+
return await api<T>(path, options);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
if (err instanceof ApiError && err.status === 401) {
|
|
39
|
+
// Try refresh
|
|
40
|
+
const refreshed = await api<{ accessToken: string }>('/api/auth/refresh', {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
credentials: 'include', // send httpOnly cookie
|
|
43
|
+
});
|
|
44
|
+
setAuthToken(refreshed.accessToken);
|
|
45
|
+
// Retry original request
|
|
46
|
+
return api<T>(path, options);
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Next.js: Server-Side Auth (App Router)
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// middleware.ts — protect routes server-side
|
|
59
|
+
import { NextResponse } from 'next/server';
|
|
60
|
+
import type { NextRequest } from 'next/server';
|
|
61
|
+
|
|
62
|
+
export function middleware(request: NextRequest) {
|
|
63
|
+
const token = request.cookies.get('session')?.value;
|
|
64
|
+
if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
|
|
65
|
+
return NextResponse.redirect(new URL('/login', request.url));
|
|
66
|
+
}
|
|
67
|
+
return NextResponse.next();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// app/dashboard/page.tsx — server component with auth
|
|
71
|
+
import { cookies } from 'next/headers';
|
|
72
|
+
|
|
73
|
+
export default async function Dashboard() {
|
|
74
|
+
const token = (await cookies()).get('session')?.value;
|
|
75
|
+
const user = await fetch(`${process.env.API_URL}/api/me`, {
|
|
76
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
77
|
+
}).then(r => r.json());
|
|
78
|
+
|
|
79
|
+
return <DashboardContent user={user} />;
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Backend: Standard Middleware Order
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Request → 1.RequestID → 2.Logging → 3.CORS → 4.RateLimit → 5.BodyParse
|
|
89
|
+
→ 6.Auth → 7.Authz → 8.Validation → 9.Handler → 10.ErrorHandler → Response
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Backend: JWT Rules
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
✅ Short expiry access token (15min) + refresh token (server-stored)
|
|
98
|
+
✅ Minimal claims: userId, roles (not entire user object)
|
|
99
|
+
✅ Rotate signing keys periodically
|
|
100
|
+
|
|
101
|
+
❌ Never store tokens in localStorage (XSS risk)
|
|
102
|
+
❌ Never pass tokens in URL query params
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Backend: RBAC Pattern
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
function authorize(...roles: Role[]) {
|
|
111
|
+
return (req, res, next) => {
|
|
112
|
+
if (!req.user) throw new UnauthorizedError();
|
|
113
|
+
if (!roles.some(r => req.user.roles.includes(r))) throw new ForbiddenError();
|
|
114
|
+
next();
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
router.delete('/users/:id', authenticate, authorize('admin'), deleteUser);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Auth Decision Table
|
|
123
|
+
|
|
124
|
+
| Method | When | Frontend |
|
|
125
|
+
|--------|------|----------|
|
|
126
|
+
| Session | Same-domain, SSR, Django templates | Django templates / htmx |
|
|
127
|
+
| JWT | Different domain, SPA, mobile | React, Vue, mobile apps |
|
|
128
|
+
| OAuth2 | Third-party login, API consumers | Any |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Iron Rules
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
✅ Access token: short-lived (15min), in memory
|
|
136
|
+
✅ Refresh token: httpOnly cookie (XSS-safe)
|
|
137
|
+
✅ Automatic transparent refresh on 401
|
|
138
|
+
✅ Redirect to login when refresh fails
|
|
139
|
+
|
|
140
|
+
❌ Never store tokens in localStorage (XSS risk)
|
|
141
|
+
❌ Never send tokens in URL query params (logged)
|
|
142
|
+
❌ Never trust client-side auth checks alone (server must validate)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Common Issues
|
|
148
|
+
|
|
149
|
+
### Issue 1: "Auth works on page load but breaks on navigation"
|
|
150
|
+
|
|
151
|
+
**Cause:** Token stored in component state (lost on unmount).
|
|
152
|
+
|
|
153
|
+
**Fix:** Store access token in a persistent location:
|
|
154
|
+
- React Context (survives navigation, lost on refresh)
|
|
155
|
+
- Cookie (survives refresh)
|
|
156
|
+
- React Query cache with `staleTime: Infinity` for session
|
|
157
|
+
|
|
158
|
+
### Issue 2: "CORS error with auth requests"
|
|
159
|
+
|
|
160
|
+
**Cause:** Missing `credentials: 'include'` on frontend or `credentials: true` on backend CORS config.
|
|
161
|
+
|
|
162
|
+
**Fix:**
|
|
163
|
+
1. Frontend: `fetch(url, { credentials: 'include' })`
|
|
164
|
+
2. Backend: `cors({ origin: 'https://your-frontend.com', credentials: true })`
|
|
165
|
+
3. Backend: explicit origin (not `*`) when using credentials
|