moai-adk 0.4.5__py3-none-any.whl → 0.20.1__py3-none-any.whl
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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +1 -1
- moai_adk/__main__.py +74 -1
- moai_adk/cli/commands/__init__.py +1 -1
- moai_adk/cli/commands/analyze.py +119 -0
- moai_adk/cli/commands/backup.py +25 -1
- moai_adk/cli/commands/doctor.py +31 -5
- moai_adk/cli/commands/improve_user_experience.py +307 -0
- moai_adk/cli/commands/init.py +111 -10
- moai_adk/cli/commands/status.py +33 -3
- moai_adk/cli/commands/update.py +921 -130
- moai_adk/cli/commands/validate_links.py +120 -0
- moai_adk/cli/prompts/init_prompts.py +22 -87
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +388 -0
- moai_adk/core/analysis/tag_chain_analyzer.py +344 -0
- moai_adk/core/analysis/tag_chain_repair.py +879 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/migration.py +235 -0
- moai_adk/core/git/__init__.py +1 -1
- moai_adk/core/git/branch.py +1 -1
- moai_adk/core/git/commit.py +1 -1
- moai_adk/core/git/manager.py +1 -1
- moai_adk/core/issue_creator.py +313 -0
- moai_adk/core/mcp/setup.py +56 -0
- moai_adk/core/mcp/setup_old.py +296 -0
- moai_adk/core/project/backup_utils.py +1 -1
- moai_adk/core/project/checker.py +2 -2
- moai_adk/core/project/detector.py +211 -12
- moai_adk/core/project/initializer.py +85 -15
- moai_adk/core/project/phase_executor.py +76 -13
- moai_adk/core/project/validator.py +13 -13
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +1 -1
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/tags/__init__.py +86 -0
- moai_adk/core/tags/auto_corrector.py +693 -0
- moai_adk/core/tags/ci_validator.py +463 -0
- moai_adk/core/tags/cli.py +283 -0
- moai_adk/core/tags/generator.py +109 -0
- moai_adk/core/tags/inserter.py +99 -0
- moai_adk/core/tags/mapper.py +126 -0
- moai_adk/core/tags/parser.py +76 -0
- moai_adk/core/tags/policy_validator.py +580 -0
- moai_adk/core/tags/pre_commit_validator.py +421 -0
- moai_adk/core/tags/reporter.py +956 -0
- moai_adk/core/tags/rollback_manager.py +525 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/core/template/__init__.py +1 -1
- moai_adk/core/template/backup.py +1 -1
- moai_adk/core/template/merger.py +50 -1
- moai_adk/core/template/processor.py +119 -13
- moai_adk/core/template_engine.py +268 -0
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +348 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +209 -944
- moai_adk/templates/.claude/agents/alfred/database-expert.md +352 -0
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +34 -5
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +38 -8
- moai_adk/templates/.claude/agents/alfred/format-expert.md +469 -0
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
- moai_adk/templates/.claude/agents/alfred/git-manager.md +128 -9
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +104 -6
- moai_adk/templates/.claude/agents/alfred/project-manager.md +88 -16
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +36 -9
- moai_adk/templates/.claude/agents/alfred/security-expert.md +270 -0
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +865 -0
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +214 -43
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +111 -9
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +309 -160
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +36 -7
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +605 -0
- moai_adk/templates/.claude/commands/alfred/0-project.md +393 -966
- moai_adk/templates/.claude/commands/alfred/1-plan.md +651 -367
- moai_adk/templates/.claude/commands/alfred/2-run.md +388 -241
- moai_adk/templates/.claude/commands/alfred/3-sync.md +1921 -410
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +153 -0
- moai_adk/templates/.claude/commands/alfred/release-new.md +3604 -0
- moai_adk/templates/.claude/hooks/alfred/core/project.py +484 -20
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +14 -6
- moai_adk/templates/.claude/hooks/alfred/post_tool__enable_streaming_ui.py +50 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +93 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__tag_auto_corrector.py +407 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +99 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__realtime_tag_monitor.py +335 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__tag_policy_validator.py +325 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +93 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__auto_cleanup.py +580 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +298 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +170 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +3 -3
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +5 -5
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +230 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/daily_analysis.py +351 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +174 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +87 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +61 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +111 -0
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
- moai_adk/templates/.claude/hooks/alfred/utils/hook_config.py +94 -0
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
- moai_adk/templates/.claude/output-styles/alfred/alfred-moai-adk-beginner.md +267 -0
- moai_adk/templates/.claude/output-styles/alfred/keating-personal-tutor.md +440 -0
- moai_adk/templates/.claude/output-styles/alfred/r2d2-agentic-coding.md +583 -0
- moai_adk/templates/.claude/settings.json +96 -14
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +70 -0
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +242 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/SKILL.md +237 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/examples.md +871 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/reference.md +653 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/README.md +162 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/SKILL.md +227 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/examples.md +354 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/reference.md +158 -0
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/SKILL.md +179 -79
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/examples.md +117 -0
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/scripts/pre-review-check.sh +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +132 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +444 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +405 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +51 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +355 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +239 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +286 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +126 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +229 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +150 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +87 -73
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/README.md +42 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/SKILL.md +429 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/examples.md +520 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/reference.md +405 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +89 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +122 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +369 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +508 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +481 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +100 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +77 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +265 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +539 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +84 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +137 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +219 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +161 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +541 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +622 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +19 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +211 -0
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +269 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +32 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +26 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +21 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +252 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +24 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +199 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +39 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +18 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +263 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +30 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +482 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +303 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +524 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +477 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +429 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +391 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +431 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +577 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +273 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +466 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +583 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +526 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +608 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +328 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +312 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +245 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +285 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +278 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +303 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +15 -0
- moai_adk/templates/.claude/skills/moai-change-logger/SKILL.md +563 -0
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +802 -0
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +1238 -0
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +673 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +234 -43
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +1633 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +660 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +97 -69
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +97 -72
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +97 -74
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +102 -73
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +97 -73
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +97 -67
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +97 -79
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +97 -71
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +265 -64
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +1064 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +1047 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +87 -78
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +87 -70
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +87 -86
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +80 -62
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +207 -50
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +90 -71
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +78 -58
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +78 -51
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/.!11330!examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +253 -32
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +1099 -0
- moai_adk/templates/.claude/skills/moai-jit-docs-enhanced/SKILL.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +98 -76
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +2358 -70
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +2962 -68
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +1898 -70
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +1465 -68
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +2364 -66
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +32 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +1630 -69
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +89 -61
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +735 -66
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +624 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +316 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +97 -73
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +98 -73
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +1834 -70
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +99 -74
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +97 -74
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +1959 -69
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-template/SKILL.md +348 -0
- moai_adk/templates/.claude/skills/moai-lang-template/VARIABLES.md +98 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +1230 -66
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +34 -0
- moai_adk/templates/.claude/skills/moai-learning-optimizer/SKILL.md +575 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/README.md +50 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/SKILL.md +304 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/examples.md +417 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/README.md +87 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/SKILL.md +552 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/examples.md +1109 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/reference.md +514 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/validate.py +106 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/README.md +11 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/SKILL.md +622 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/examples.md +20 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/reference.md +12 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/README.md +152 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/SKILL.md +285 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/examples.md +333 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/reference.md +386 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/README.md +49 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/examples.md +58 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/reference.md +123 -0
- moai_adk/templates/.claude/skills/moai-session-info/SKILL.md +314 -0
- moai_adk/templates/.claude/skills/moai-streaming-ui/SKILL.md +552 -0
- moai_adk/templates/.claude/skills/moai-tag-policy-validator/SKILL.md +570 -0
- moai_adk/templates/.git-hooks/pre-commit +66 -0
- moai_adk/templates/.git-hooks/pre-push +255 -0
- moai_adk/templates/.github/workflows/c-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/go-tag-validation.yml +130 -0
- moai_adk/templates/.github/workflows/java-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +135 -0
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/moai-gitflow.yml +166 -3
- moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +188 -0
- moai_adk/templates/.github/workflows/php-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/python-tag-validation.yml +118 -0
- moai_adk/templates/.github/workflows/release.yml +118 -0
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +338 -0
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/tag-report.yml +269 -0
- moai_adk/templates/.github/workflows/tag-validation.yml +186 -0
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +154 -0
- moai_adk/templates/.mcp.json +31 -0
- moai_adk/templates/.moai/config.json +80 -7
- moai_adk/templates/CLAUDE.md +562 -546
- moai_adk/utils/banner.py +5 -5
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +235 -0
- moai_adk/utils/logger.py +8 -8
- moai_adk/utils/user_experience.py +451 -0
- moai_adk-0.20.1.dist-info/METADATA +233 -0
- moai_adk-0.20.1.dist-info/RECORD +404 -0
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -156
- moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -85
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -92
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -70
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -41
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -636
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -692
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -470
- moai_adk/templates/.claude/skills/moai-alfred-debugger-pro/SKILL.md +0 -103
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -103
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -95
- moai_adk/templates/.claude/skills/moai-alfred-performance-optimizer/SKILL.md +0 -105
- moai_adk/templates/.claude/skills/moai-alfred-refactoring-coach/SKILL.md +0 -97
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -97
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -90
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -99
- moai_adk/templates/.claude/skills/moai-alfred-tui-survey/SKILL.md +0 -87
- moai_adk/templates/.claude/skills/moai-alfred-tui-survey/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-claude-code/SKILL.md +0 -94
- moai_adk/templates/.claude/skills/moai-claude-code/examples.md +0 -513
- moai_adk/templates/.claude/skills/moai-claude-code/reference.md +0 -433
- moai_adk/templates/.claude/skills/moai-claude-code/templates/agent-full.md +0 -332
- moai_adk/templates/.claude/skills/moai-claude-code/templates/command-full.md +0 -384
- moai_adk/templates/.claude/skills/moai-claude-code/templates/plugin-full.json +0 -363
- moai_adk/templates/.claude/skills/moai-claude-code/templates/settings-full.json +0 -595
- moai_adk/templates/.claude/skills/moai-claude-code/templates/skill-full.md +0 -496
- moai_adk/templates/.claude/skills/moai-lang-clojure/SKILL.md +0 -100
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +0 -99
- moai_adk/templates/.claude/skills/moai-lang-haskell/SKILL.md +0 -100
- moai_adk/templates/.claude/skills/moai-lang-julia/SKILL.md +0 -98
- moai_adk/templates/.claude/skills/moai-lang-lua/SKILL.md +0 -98
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
- moai_adk/templates/.moai/memory/development-guide.md +0 -344
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- moai_adk/templates/.moai/project/product.md +0 -161
- moai_adk/templates/.moai/project/structure.md +0 -156
- moai_adk/templates/.moai/project/tech.md +0 -227
- moai_adk/templates/__init__.py +0 -2
- moai_adk-0.4.5.dist-info/METADATA +0 -369
- moai_adk-0.4.5.dist-info/RECORD +0 -152
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/WHEEL +0 -0
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,96 +1,765 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
2
|
name: moai-lang-python
|
|
4
|
-
|
|
3
|
+
version: 2.0.0
|
|
4
|
+
created: 2025-11-06
|
|
5
|
+
updated: 2025-11-06
|
|
6
|
+
status: active
|
|
7
|
+
description: "Python best practices with modern frameworks, AI/ML integration, and performance optimization for 2025"
|
|
8
|
+
keywords: [python, programming, backend, ai, ml, data-science, fastapi, django, testing]
|
|
5
9
|
allowed-tools:
|
|
6
10
|
- Read
|
|
11
|
+
- Write
|
|
12
|
+
- Edit
|
|
7
13
|
- Bash
|
|
14
|
+
- WebFetch
|
|
15
|
+
- WebSearch
|
|
8
16
|
---
|
|
9
17
|
|
|
10
|
-
# Python
|
|
18
|
+
# Python Development Mastery
|
|
19
|
+
|
|
20
|
+
**Modern Python Development with 2025 Best Practices**
|
|
21
|
+
|
|
22
|
+
> Comprehensive Python development guidance covering backend APIs, AI/ML integration, data science, and production-ready applications using the latest tools and frameworks.
|
|
23
|
+
|
|
24
|
+
## What It Does
|
|
25
|
+
|
|
26
|
+
- **Backend API Development**: FastAPI, Django, Flask applications with modern async patterns
|
|
27
|
+
- **AI/ML Integration**: TensorFlow, PyTorch, scikit-learn with deployment strategies
|
|
28
|
+
- **Data Science Pipelines**: Pandas, NumPy, Polars for high-performance data processing
|
|
29
|
+
- **Testing & Quality**: pytest, coverage, type checking with mypy and ruff
|
|
30
|
+
- **Performance Optimization**: Async programming, profiling, memory optimization
|
|
31
|
+
- **Production Deployment**: Docker, Kubernetes, CI/CD pipelines, monitoring
|
|
32
|
+
- **Security Best Practices**: Input validation, authentication, dependency scanning
|
|
33
|
+
- **Code Quality**: Type hints, formatting, linting, pre-commit hooks
|
|
34
|
+
|
|
35
|
+
## When to Use
|
|
36
|
+
|
|
37
|
+
### Perfect Scenarios
|
|
38
|
+
- **Building REST APIs and microservices**
|
|
39
|
+
- **Developing AI/ML models and data pipelines**
|
|
40
|
+
- **Creating web applications with Django/Flask**
|
|
41
|
+
- **Data analysis and scientific computing**
|
|
42
|
+
- **Automating workflows and DevOps tasks**
|
|
43
|
+
- **Prototyping and rapid development**
|
|
44
|
+
- **Integrating with cloud services (AWS, GCP, Azure)**
|
|
45
|
+
|
|
46
|
+
### Common Triggers
|
|
47
|
+
- "Create a Python API"
|
|
48
|
+
- "Set up Django project"
|
|
49
|
+
- "Optimize Python performance"
|
|
50
|
+
- "Test Python code"
|
|
51
|
+
- "Deploy Python application"
|
|
52
|
+
- "Python best practices"
|
|
53
|
+
- "AI/ML with Python"
|
|
54
|
+
|
|
55
|
+
## Tool Version Matrix (2025-11-06)
|
|
56
|
+
|
|
57
|
+
### Core Python
|
|
58
|
+
- **Python**: 3.13.0 (latest) / 3.12.x (LTS)
|
|
59
|
+
- **Package Managers**: uv 0.5.x (primary), pip 24.x, poetry 1.8.x
|
|
60
|
+
- **Virtual Environment**: venv (built-in), conda 24.x, uv venv
|
|
61
|
+
|
|
62
|
+
### Web Frameworks
|
|
63
|
+
- **FastAPI**: 0.115.x - High-performance async APIs
|
|
64
|
+
- **Django**: 5.1.x - Full-stack web framework
|
|
65
|
+
- **Flask**: 3.1.x - Lightweight web framework
|
|
66
|
+
- **Starlette**: 0.41.x - ASGI toolkit
|
|
67
|
+
|
|
68
|
+
### Testing Tools
|
|
69
|
+
- **pytest**: 8.3.x - Primary testing framework
|
|
70
|
+
- **pytest-asyncio**: 0.24.x - Async testing support
|
|
71
|
+
- **coverage**: 7.6.x - Code coverage analysis
|
|
72
|
+
- **tox**: 4.23.x - Multi-environment testing
|
|
73
|
+
|
|
74
|
+
### Code Quality
|
|
75
|
+
- **ruff**: 0.7.x - Fast linter and formatter
|
|
76
|
+
- **black**: 24.x - Code formatting
|
|
77
|
+
- **mypy**: 1.13.x - Static type checking
|
|
78
|
+
- **pre-commit**: 4.0.x - Git hooks
|
|
79
|
+
|
|
80
|
+
### AI/ML Stack
|
|
81
|
+
- **TensorFlow**: 2.18.x - Deep learning
|
|
82
|
+
- **PyTorch**: 2.5.x - Deep learning framework
|
|
83
|
+
- **scikit-learn**: 1.6.x - Machine learning
|
|
84
|
+
- **pandas**: 2.2.x - Data manipulation
|
|
85
|
+
- **polars**: 1.9.x - High-performance dataframes
|
|
86
|
+
|
|
87
|
+
### Performance Tools
|
|
88
|
+
- **py-spy**: 0.3.x - Sampling profiler
|
|
89
|
+
- **memory-profiler**: 0.64.x - Memory profiling
|
|
90
|
+
- **line-profiler**: 4.2.x - Line-by-line profiling
|
|
91
|
+
|
|
92
|
+
## Ecosystem Overview
|
|
93
|
+
|
|
94
|
+
### Package Management
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Modern Python with uv (recommended)
|
|
98
|
+
uv init project-name
|
|
99
|
+
uv add fastapi uvicorn pytest ruff mypy
|
|
100
|
+
uv run python main.py
|
|
101
|
+
|
|
102
|
+
# Traditional approach
|
|
103
|
+
python -m venv venv
|
|
104
|
+
source venv/bin/activate # Windows: venv\Scripts\activate
|
|
105
|
+
pip install -r requirements.txt
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Project Structure (2025 Best Practice)
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
my-python-project/
|
|
112
|
+
├── pyproject.toml # Modern project configuration
|
|
113
|
+
├── src/
|
|
114
|
+
│ └── my_project/
|
|
115
|
+
│ ├── __init__.py
|
|
116
|
+
│ ├── main.py # Application entry point
|
|
117
|
+
│ ├── api/ # API endpoints
|
|
118
|
+
│ ├── models/ # Data models
|
|
119
|
+
│ ├── services/ # Business logic
|
|
120
|
+
│ └── utils/ # Utilities
|
|
121
|
+
├── tests/
|
|
122
|
+
│ ├── unit/ # Unit tests
|
|
123
|
+
│ ├── integration/ # Integration tests
|
|
124
|
+
│ └── conftest.py # pytest configuration
|
|
125
|
+
├── .github/
|
|
126
|
+
│ └── workflows/ # CI/CD pipelines
|
|
127
|
+
├── Dockerfile
|
|
128
|
+
├── README.md
|
|
129
|
+
└── .pre-commit-config.yaml
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Modern Development Patterns
|
|
133
|
+
|
|
134
|
+
### Type-Driven Development with PEP 695
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
from typing import TypeVar, Iterable, Protocol
|
|
138
|
+
from collections.abc import Sequence
|
|
139
|
+
|
|
140
|
+
# New type parameter syntax (Python 3.12+)
|
|
141
|
+
def max[T](args: Iterable[T]) -> T: ...
|
|
142
|
+
type Point = tuple[float, float]
|
|
143
|
+
|
|
144
|
+
# Runtime-checkable protocols
|
|
145
|
+
class Drawable(Protocol):
|
|
146
|
+
def draw(self) -> None: ...
|
|
147
|
+
|
|
148
|
+
class Shape:
|
|
149
|
+
def draw(self) -> None:
|
|
150
|
+
print("Drawing shape")
|
|
151
|
+
|
|
152
|
+
def render(obj: Drawable) -> None:
|
|
153
|
+
obj.draw()
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Async Programming Patterns
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
import asyncio
|
|
160
|
+
from contextlib import asynccontextmanager
|
|
161
|
+
from fastapi import FastAPI
|
|
162
|
+
from typing import AsyncGenerator
|
|
163
|
+
|
|
164
|
+
@asynccontextmanager
|
|
165
|
+
async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
|
|
166
|
+
# Startup
|
|
167
|
+
print("Application starting...")
|
|
168
|
+
yield
|
|
169
|
+
# Shutdown
|
|
170
|
+
print("Application shutting down...")
|
|
171
|
+
|
|
172
|
+
app = FastAPI(lifespan=lifespan)
|
|
173
|
+
|
|
174
|
+
# Efficient async patterns
|
|
175
|
+
async def process_items(items: Sequence[str]) -> list[str]:
|
|
176
|
+
# Process items concurrently
|
|
177
|
+
semaphore = asyncio.Semaphore(10) # Limit concurrency
|
|
178
|
+
async def process_item(item: str) -> str:
|
|
179
|
+
async with semaphore:
|
|
180
|
+
return await expensive_operation(item)
|
|
181
|
+
|
|
182
|
+
tasks = [process_item(item) for item in items]
|
|
183
|
+
return await asyncio.gather(*tasks)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Data Class Patterns with Pydantic v2
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
from pydantic import BaseModel, Field, field_validator, computed_field
|
|
190
|
+
from datetime import datetime
|
|
191
|
+
from typing import Optional
|
|
192
|
+
|
|
193
|
+
class User(BaseModel):
|
|
194
|
+
id: int
|
|
195
|
+
username: str = Field(min_length=3, max_length=50)
|
|
196
|
+
email: str = Field(pattern=r"[^@]+@[^@]+\.[^@]+")
|
|
197
|
+
created_at: datetime
|
|
198
|
+
updated_at: Optional[datetime] = None
|
|
199
|
+
|
|
200
|
+
@field_validator('username')
|
|
201
|
+
@classmethod
|
|
202
|
+
def username_must_be_alpha(cls, v: str) -> str:
|
|
203
|
+
if not v.isalnum():
|
|
204
|
+
raise ValueError('Username must be alphanumeric')
|
|
205
|
+
return v.lower()
|
|
206
|
+
|
|
207
|
+
@computed_field
|
|
208
|
+
@property
|
|
209
|
+
def display_name(self) -> str:
|
|
210
|
+
return self.username.title()
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Performance Considerations
|
|
214
|
+
|
|
215
|
+
### Algorithmic Optimization
|
|
216
|
+
|
|
217
|
+
```python
|
|
218
|
+
# Use built-in functions and comprehensions
|
|
219
|
+
def process_data_fast(data: list[int]) -> list[int]:
|
|
220
|
+
# List comprehensions are optimized in Python 3.12+
|
|
221
|
+
return [x * 2 for x in data if x % 2 == 0]
|
|
222
|
+
|
|
223
|
+
# Use efficient data structures
|
|
224
|
+
from collections import deque
|
|
225
|
+
from typing import Deque
|
|
226
|
+
|
|
227
|
+
def sliding_window(items: list[int], window_size: int) -> list[int]:
|
|
228
|
+
window: Deque[int] = deque(maxlen=window_size)
|
|
229
|
+
results = []
|
|
230
|
+
for item in items:
|
|
231
|
+
window.append(item)
|
|
232
|
+
if len(window) == window_size:
|
|
233
|
+
results.append(sum(window))
|
|
234
|
+
return results
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Memory Optimization
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
import gc
|
|
241
|
+
import weakref
|
|
242
|
+
from dataclasses import dataclass
|
|
243
|
+
from typing import Optional
|
|
244
|
+
|
|
245
|
+
@dataclass(slots=True) # Memory-efficient dataclass
|
|
246
|
+
class Point:
|
|
247
|
+
x: float
|
|
248
|
+
y: float
|
|
249
|
+
|
|
250
|
+
# Use generators for large datasets
|
|
251
|
+
def process_large_file(filename: str) -> None:
|
|
252
|
+
with open(filename) as file:
|
|
253
|
+
for line in file: # Generator pattern
|
|
254
|
+
yield process_line(line)
|
|
255
|
+
|
|
256
|
+
# Weak references to avoid memory leaks
|
|
257
|
+
class Cache:
|
|
258
|
+
def __init__(self):
|
|
259
|
+
self._cache = weakref.WeakValueDictionary()
|
|
260
|
+
|
|
261
|
+
def get(self, key: str) -> Optional[object]:
|
|
262
|
+
return self._cache.get(key)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Profiling and Monitoring
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
# Performance profiling
|
|
269
|
+
py-spy top -- python my_app.py
|
|
270
|
+
py-spy record -o profile.svg -- python my_app.py
|
|
271
|
+
|
|
272
|
+
# Memory profiling
|
|
273
|
+
python -m memory_profiler my_app.py
|
|
274
|
+
|
|
275
|
+
# Line-by-line profiling
|
|
276
|
+
kernprof -l -v my_script.py
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Testing Strategy
|
|
280
|
+
|
|
281
|
+
### pytest Configuration (pyproject.toml)
|
|
282
|
+
|
|
283
|
+
```toml
|
|
284
|
+
[tool.pytest.ini_options]
|
|
285
|
+
minversion = "6.0"
|
|
286
|
+
addopts = [
|
|
287
|
+
"-ra",
|
|
288
|
+
"--strict-markers",
|
|
289
|
+
"--strict-config",
|
|
290
|
+
"--cov=src",
|
|
291
|
+
"--cov-report=term-missing",
|
|
292
|
+
"--cov-report=html",
|
|
293
|
+
"--cov-report=xml",
|
|
294
|
+
]
|
|
295
|
+
testpaths = ["tests"]
|
|
296
|
+
python_files = ["test_*.py", "*_test.py"]
|
|
297
|
+
python_classes = ["Test*"]
|
|
298
|
+
python_functions = ["test_*"]
|
|
299
|
+
markers = [
|
|
300
|
+
"slow: marks tests as slow",
|
|
301
|
+
"integration: marks tests as integration tests",
|
|
302
|
+
"unit: marks tests as unit tests",
|
|
303
|
+
]
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Modern Testing Patterns
|
|
307
|
+
|
|
308
|
+
```python
|
|
309
|
+
import pytest
|
|
310
|
+
from unittest.mock import AsyncMock, patch
|
|
311
|
+
from httpx import AsyncClient
|
|
312
|
+
from typing import Generator
|
|
11
313
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
| Tier | 3 |
|
|
314
|
+
# Fixtures with dependency injection
|
|
315
|
+
@pytest.fixture
|
|
316
|
+
async def async_client() -> AsyncGenerator[AsyncClient, None]:
|
|
317
|
+
from my_app.main import app
|
|
318
|
+
async with AsyncClient(app=app, base_url="http://test") as ac:
|
|
319
|
+
yield ac
|
|
19
320
|
|
|
20
|
-
|
|
321
|
+
# Async testing
|
|
322
|
+
@pytest.mark.asyncio
|
|
323
|
+
async def test_create_user(async_client: AsyncClient) -> None:
|
|
324
|
+
response = await async_client.post(
|
|
325
|
+
"/users",
|
|
326
|
+
json={"username": "testuser", "email": "test@example.com"}
|
|
327
|
+
)
|
|
328
|
+
assert response.status_code == 201
|
|
329
|
+
assert response.json()["username"] == "testuser"
|
|
21
330
|
|
|
22
|
-
|
|
331
|
+
# Property-based testing with hypothesis
|
|
332
|
+
from hypothesis import given, strategies as st
|
|
23
333
|
|
|
24
|
-
|
|
334
|
+
@given(st.lists(st.integers(), min_size=1))
|
|
335
|
+
def test_sort_preserves_length(numbers: list[int]) -> None:
|
|
336
|
+
sorted_numbers = sorted(numbers)
|
|
337
|
+
assert len(sorted_numbers) == len(numbers)
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Integration Testing
|
|
341
|
+
|
|
342
|
+
```python
|
|
343
|
+
import pytest
|
|
344
|
+
from testcontainers.compose import DockerCompose
|
|
345
|
+
from testcontainers.postgres import PostgresContainer
|
|
346
|
+
import asyncio
|
|
25
347
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
348
|
+
@pytest.fixture(scope="session")
|
|
349
|
+
async def postgres_container() -> AsyncGenerator[str, None]:
|
|
350
|
+
with PostgresContainer("postgres:16") as postgres:
|
|
351
|
+
yield postgres.get_connection_url()
|
|
352
|
+
|
|
353
|
+
@pytest.mark.integration
|
|
354
|
+
async def test_database_operations(postgres_container: str) -> None:
|
|
355
|
+
# Test with real database
|
|
356
|
+
await setup_database(postgres_container)
|
|
357
|
+
result = await perform_database_operation()
|
|
358
|
+
assert result.success
|
|
359
|
+
```
|
|
30
360
|
|
|
31
|
-
##
|
|
361
|
+
## Security Best Practices
|
|
32
362
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
363
|
+
### Input Validation and Sanitization
|
|
364
|
+
|
|
365
|
+
```python
|
|
366
|
+
from pydantic import BaseModel, Field, validator
|
|
367
|
+
import bleach
|
|
368
|
+
import re
|
|
369
|
+
|
|
370
|
+
class UserInput(BaseModel):
|
|
371
|
+
content: str = Field(max_length=10000)
|
|
372
|
+
|
|
373
|
+
@validator('content')
|
|
374
|
+
def sanitize_content(cls, v: str) -> str:
|
|
375
|
+
# Remove HTML tags and scripts
|
|
376
|
+
return bleach.clean(v, tags=[], attributes={})
|
|
377
|
+
|
|
378
|
+
class SecureForm(BaseModel):
|
|
379
|
+
email: str = Field(regex=r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")
|
|
380
|
+
phone: Optional[str] = Field(regex=r"^\+?1?\d{9,15}$")
|
|
381
|
+
|
|
382
|
+
@validator('phone')
|
|
383
|
+
def validate_phone(cls, v: Optional[str]) -> Optional[str]:
|
|
384
|
+
if v and not re.match(r"^\+?1?\d{9,15}$", v):
|
|
385
|
+
raise ValueError("Invalid phone number format")
|
|
386
|
+
return v
|
|
387
|
+
```
|
|
37
388
|
|
|
38
|
-
|
|
39
|
-
- **mypy**: Static type checking with strict mode
|
|
40
|
-
- Type hints for function signatures, return types
|
|
41
|
-
- Generic types, Protocols, TypedDict
|
|
389
|
+
### Authentication and Authorization
|
|
42
390
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
391
|
+
```python
|
|
392
|
+
from fastapi import Depends, HTTPException, status
|
|
393
|
+
from fastapi.security import OAuth2PasswordBearer
|
|
394
|
+
from jose import JWTError, jwt
|
|
395
|
+
from passlib.context import CryptContext
|
|
396
|
+
from datetime import datetime, timedelta
|
|
47
397
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- Virtual environment management
|
|
398
|
+
SECRET_KEY = "your-secret-key-here"
|
|
399
|
+
ALGORITHM = "HS256"
|
|
400
|
+
ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
|
52
401
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
402
|
+
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
403
|
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
|
404
|
+
|
|
405
|
+
def verify_password(plain_password: str, hashed_password: str) -> bool:
|
|
406
|
+
return pwd_context.verify(plain_password, hashed_password)
|
|
407
|
+
|
|
408
|
+
def get_password_hash(password: str) -> str:
|
|
409
|
+
return pwd_context.hash(password)
|
|
410
|
+
|
|
411
|
+
async def get_current_user(token: str = Depends(oauth2_scheme)):
|
|
412
|
+
credentials_exception = HTTPException(
|
|
413
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
414
|
+
detail="Could not validate credentials",
|
|
415
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
416
|
+
)
|
|
417
|
+
try:
|
|
418
|
+
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
|
|
419
|
+
username: str = payload.get("sub")
|
|
420
|
+
if username is None:
|
|
421
|
+
raise credentials_exception
|
|
422
|
+
except JWTError:
|
|
423
|
+
raise credentials_exception
|
|
424
|
+
|
|
425
|
+
user = get_user(username)
|
|
426
|
+
if user is None:
|
|
427
|
+
raise credentials_exception
|
|
428
|
+
return user
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Dependency Security Scanning
|
|
58
432
|
|
|
59
|
-
## Examples
|
|
60
433
|
```bash
|
|
61
|
-
|
|
434
|
+
# Add to pyproject.toml
|
|
435
|
+
[tool.pip-audit]
|
|
436
|
+
requirements = ["pyproject.toml"]
|
|
437
|
+
ignore-vulns = []
|
|
438
|
+
|
|
439
|
+
# Regular security scanning
|
|
440
|
+
pip-audit --requirement pyproject.toml
|
|
441
|
+
safety check --json
|
|
442
|
+
bandit -r src/ -f json
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
## Integration Patterns
|
|
446
|
+
|
|
447
|
+
### Database Integration
|
|
448
|
+
|
|
449
|
+
```python
|
|
450
|
+
# SQLAlchemy 2.0 async patterns
|
|
451
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
452
|
+
from sqlalchemy.orm import declarative_base, sessionmaker
|
|
453
|
+
from sqlalchemy import Column, Integer, String, DateTime
|
|
454
|
+
|
|
455
|
+
Base = declarative_base()
|
|
456
|
+
|
|
457
|
+
class User(Base):
|
|
458
|
+
__tablename__ = "users"
|
|
459
|
+
|
|
460
|
+
id = Column(Integer, primary_key=True)
|
|
461
|
+
username = Column(String, unique=True)
|
|
462
|
+
created_at = Column(DateTime, default=datetime.utcnow)
|
|
463
|
+
|
|
464
|
+
# Async database session
|
|
465
|
+
async def get_async_session() -> AsyncGenerator[AsyncSession, None]:
|
|
466
|
+
engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db")
|
|
467
|
+
async_session = sessionmaker(
|
|
468
|
+
engine, class_=AsyncSession, expire_on_commit=False
|
|
469
|
+
)
|
|
470
|
+
async with async_session() as session:
|
|
471
|
+
yield session
|
|
472
|
+
|
|
473
|
+
# Usage in FastAPI
|
|
474
|
+
@app.get("/users/{user_id}")
|
|
475
|
+
async def get_user(user_id: int, db: AsyncSession = Depends(get_async_session)):
|
|
476
|
+
result = await db.execute(select(User).where(User.id == user_id))
|
|
477
|
+
user = result.scalar_one_or_none()
|
|
478
|
+
if user is None:
|
|
479
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
480
|
+
return user
|
|
62
481
|
```
|
|
63
482
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
483
|
+
### Cloud Service Integration
|
|
484
|
+
|
|
485
|
+
```python
|
|
486
|
+
# AWS S3 with boto3
|
|
487
|
+
import boto3
|
|
488
|
+
from botocore.exceptions import ClientError
|
|
489
|
+
import io
|
|
490
|
+
|
|
491
|
+
class S3Service:
|
|
492
|
+
def __init__(self, bucket_name: str):
|
|
493
|
+
self.s3_client = boto3.client("s3")
|
|
494
|
+
self.bucket_name = bucket_name
|
|
495
|
+
|
|
496
|
+
async def upload_file(self, key: str, file_data: bytes) -> bool:
|
|
497
|
+
try:
|
|
498
|
+
self.s3_client.put_object(
|
|
499
|
+
Bucket=self.bucket_name,
|
|
500
|
+
Key=key,
|
|
501
|
+
Body=file_data
|
|
502
|
+
)
|
|
503
|
+
return True
|
|
504
|
+
except ClientError:
|
|
505
|
+
return False
|
|
506
|
+
|
|
507
|
+
# Redis with aioredis
|
|
508
|
+
import aioredis
|
|
509
|
+
from typing import Optional
|
|
68
510
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
511
|
+
class CacheService:
|
|
512
|
+
def __init__(self, redis_url: str):
|
|
513
|
+
self.redis_url = redis_url
|
|
514
|
+
self._redis: Optional[aioredis.Redis] = None
|
|
515
|
+
|
|
516
|
+
async def connect(self) -> None:
|
|
517
|
+
self._redis = await aioredis.from_url(self.redis_url)
|
|
518
|
+
|
|
519
|
+
async def get(self, key: str) -> Optional[str]:
|
|
520
|
+
if self._redis:
|
|
521
|
+
return await self._redis.get(key)
|
|
522
|
+
return None
|
|
523
|
+
|
|
524
|
+
async def set(self, key: str, value: str, expire: int = 3600) -> None:
|
|
525
|
+
if self._redis:
|
|
526
|
+
await self._redis.setex(key, expire, value)
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### Message Queue Integration
|
|
530
|
+
|
|
531
|
+
```python
|
|
532
|
+
# Celery with Redis
|
|
533
|
+
from celery import Celery
|
|
534
|
+
from celery.result import AsyncResult
|
|
535
|
+
|
|
536
|
+
celery_app = Celery(
|
|
537
|
+
"tasks",
|
|
538
|
+
broker="redis://localhost:6379/0",
|
|
539
|
+
backend="redis://localhost:6379/1"
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
@celery_app.task
|
|
543
|
+
def process_data_task(data: dict) -> dict:
|
|
544
|
+
# Heavy processing task
|
|
545
|
+
result = expensive_computation(data)
|
|
546
|
+
return {"result": result, "status": "completed"}
|
|
547
|
+
|
|
548
|
+
# In FastAPI
|
|
549
|
+
@app.post("/process")
|
|
550
|
+
async def start_processing(data: dict):
|
|
551
|
+
task = process_data_task.delay(data)
|
|
552
|
+
return {"task_id": task.id, "status": "processing"}
|
|
553
|
+
|
|
554
|
+
@app.get("/task/{task_id}")
|
|
555
|
+
async def get_task_status(task_id: str):
|
|
556
|
+
result = AsyncResult(task_id)
|
|
557
|
+
return {
|
|
558
|
+
"task_id": task_id,
|
|
559
|
+
"status": result.status,
|
|
560
|
+
"result": result.result if result.successful() else None
|
|
561
|
+
}
|
|
562
|
+
```
|
|
72
563
|
|
|
73
|
-
##
|
|
74
|
-
- When the language runtime or package manager is not installed.
|
|
75
|
-
- When the main language cannot be determined in a multilingual project.
|
|
564
|
+
## Modern Development Workflow
|
|
76
565
|
|
|
77
|
-
|
|
78
|
-
- Access to the project file is required using the Read/Grep tool.
|
|
79
|
-
- When used with `Skill("moai-foundation-langs")`, it is easy to share cross-language conventions.
|
|
566
|
+
### pyproject.toml Configuration
|
|
80
567
|
|
|
81
|
-
|
|
82
|
-
-
|
|
83
|
-
|
|
568
|
+
```toml
|
|
569
|
+
[build-system]
|
|
570
|
+
requires = ["hatchling"]
|
|
571
|
+
build-backend = "hatchling.build"
|
|
84
572
|
|
|
85
|
-
|
|
86
|
-
|
|
573
|
+
[project]
|
|
574
|
+
name = "my-python-project"
|
|
575
|
+
version = "0.1.0"
|
|
576
|
+
description = "Modern Python project"
|
|
577
|
+
dependencies = [
|
|
578
|
+
"fastapi>=0.115.0",
|
|
579
|
+
"uvicorn[standard]>=0.32.0",
|
|
580
|
+
"pydantic>=2.9.0",
|
|
581
|
+
"sqlalchemy>=2.0.0",
|
|
582
|
+
"alembic>=1.13.0",
|
|
583
|
+
]
|
|
87
584
|
|
|
88
|
-
|
|
585
|
+
[project.optional-dependencies]
|
|
586
|
+
dev = [
|
|
587
|
+
"pytest>=8.3.0",
|
|
588
|
+
"pytest-asyncio>=0.24.0",
|
|
589
|
+
"pytest-cov>=5.0.0",
|
|
590
|
+
"ruff>=0.7.0",
|
|
591
|
+
"mypy>=1.13.0",
|
|
592
|
+
"black>=24.0.0",
|
|
593
|
+
"pre-commit>=4.0.0",
|
|
594
|
+
]
|
|
595
|
+
test = [
|
|
596
|
+
"pytest>=8.3.0",
|
|
597
|
+
"pytest-asyncio>=0.24.0",
|
|
598
|
+
"pytest-cov>=5.0.0",
|
|
599
|
+
"httpx>=0.28.0",
|
|
600
|
+
"testcontainers>=3.7.0",
|
|
601
|
+
]
|
|
602
|
+
|
|
603
|
+
[tool.ruff]
|
|
604
|
+
line-length = 88
|
|
605
|
+
target-version = "py312"
|
|
606
|
+
select = ["E", "F", "W", "I", "N", "B", "C90", "UP"]
|
|
607
|
+
|
|
608
|
+
[tool.mypy]
|
|
609
|
+
python_version = "3.12"
|
|
610
|
+
warn_return_any = true
|
|
611
|
+
warn_unused_configs = true
|
|
612
|
+
disallow_untyped_defs = true
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### Pre-commit Configuration
|
|
616
|
+
|
|
617
|
+
```yaml
|
|
618
|
+
# .pre-commit-config.yaml
|
|
619
|
+
repos:
|
|
620
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
621
|
+
rev: v5.0.0
|
|
622
|
+
hooks:
|
|
623
|
+
- id: trailing-whitespace
|
|
624
|
+
- id: end-of-file-fixer
|
|
625
|
+
- id: check-yaml
|
|
626
|
+
- id: check-added-large-files
|
|
627
|
+
- id: check-merge-conflict
|
|
628
|
+
|
|
629
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
630
|
+
rev: v0.7.0
|
|
631
|
+
hooks:
|
|
632
|
+
- id: ruff
|
|
633
|
+
args: [--fix]
|
|
634
|
+
- id: ruff-format
|
|
635
|
+
|
|
636
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
637
|
+
rev: v1.13.0
|
|
638
|
+
hooks:
|
|
639
|
+
- id: mypy
|
|
640
|
+
additional_dependencies: [types-all]
|
|
641
|
+
|
|
642
|
+
- repo: https://github.com/pycqa/bandit
|
|
643
|
+
rev: 1.7.6
|
|
644
|
+
hooks:
|
|
645
|
+
- id: bandit
|
|
646
|
+
args: [-r, src/]
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
### Docker Best Practices
|
|
650
|
+
|
|
651
|
+
```dockerfile
|
|
652
|
+
# Multi-stage build
|
|
653
|
+
FROM python:3.13-slim as builder
|
|
654
|
+
|
|
655
|
+
WORKDIR /app
|
|
656
|
+
COPY pyproject.toml .
|
|
657
|
+
RUN pip install --no-cache-dir uv && \
|
|
658
|
+
uv pip install --no-deps -r <(uv pip compile pyproject.toml)
|
|
659
|
+
|
|
660
|
+
FROM python:3.13-slim as runtime
|
|
661
|
+
|
|
662
|
+
# Security best practices
|
|
663
|
+
RUN adduser --disabled-password --gecos '' appuser && \
|
|
664
|
+
mkdir -p /app && chown -R appuser:appuser /app
|
|
665
|
+
|
|
666
|
+
WORKDIR /app
|
|
667
|
+
COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
|
|
668
|
+
COPY --from=builder /usr/local/bin /usr/local/bin
|
|
669
|
+
COPY --chown=appuser:appuser . .
|
|
670
|
+
|
|
671
|
+
USER appuser
|
|
672
|
+
EXPOSE 8000
|
|
673
|
+
|
|
674
|
+
CMD ["uvicorn", "my_project.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
## AI/ML Integration
|
|
678
|
+
|
|
679
|
+
### Model Deployment with FastAPI
|
|
680
|
+
|
|
681
|
+
```python
|
|
682
|
+
import torch
|
|
683
|
+
import numpy as np
|
|
684
|
+
from fastapi import FastAPI, File, UploadFile
|
|
685
|
+
from PIL import Image
|
|
686
|
+
import io
|
|
687
|
+
|
|
688
|
+
app = FastAPI()
|
|
689
|
+
|
|
690
|
+
# Load model at startup
|
|
691
|
+
model = None
|
|
692
|
+
|
|
693
|
+
@app.on_event("startup")
|
|
694
|
+
async def load_model():
|
|
695
|
+
global model
|
|
696
|
+
model = torch.load("model.pth")
|
|
697
|
+
model.eval()
|
|
698
|
+
|
|
699
|
+
@app.post("/predict")
|
|
700
|
+
async def predict(file: UploadFile = File(...)):
|
|
701
|
+
# Preprocess image
|
|
702
|
+
image = Image.open(io.BytesIO(await file.read()))
|
|
703
|
+
image = preprocess_image(image)
|
|
704
|
+
|
|
705
|
+
# Make prediction
|
|
706
|
+
with torch.no_grad():
|
|
707
|
+
tensor = torch.tensor(image).unsqueeze(0)
|
|
708
|
+
prediction = model(tensor)
|
|
709
|
+
|
|
710
|
+
return {
|
|
711
|
+
"prediction": prediction.tolist(),
|
|
712
|
+
"confidence": torch.softmax(prediction, dim=1).max().item()
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
def preprocess_image(image: Image.Image) -> np.ndarray:
|
|
716
|
+
# Image preprocessing logic
|
|
717
|
+
image = image.resize((224, 224))
|
|
718
|
+
image_array = np.array(image) / 255.0
|
|
719
|
+
return image_array.transpose(2, 0, 1)
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
### Data Pipeline with Polars
|
|
723
|
+
|
|
724
|
+
```python
|
|
725
|
+
import polars as pl
|
|
726
|
+
from typing import Optional
|
|
727
|
+
|
|
728
|
+
class DataProcessor:
|
|
729
|
+
def __init__(self, data_path: str):
|
|
730
|
+
self.data_path = data_path
|
|
731
|
+
self.df: Optional[pl.DataFrame] = None
|
|
732
|
+
|
|
733
|
+
def load_data(self) -> None:
|
|
734
|
+
"""Load data using high-performance polars"""
|
|
735
|
+
self.df = pl.read_parquet(self.data_path)
|
|
736
|
+
|
|
737
|
+
def process_data(self) -> pl.DataFrame:
|
|
738
|
+
"""Process data with polars lazy evaluation"""
|
|
739
|
+
return (
|
|
740
|
+
self.df.lazy()
|
|
741
|
+
.filter(pl.col("value") > 0)
|
|
742
|
+
.group_by("category")
|
|
743
|
+
.agg([
|
|
744
|
+
pl.mean("value").alias("avg_value"),
|
|
745
|
+
pl.std("value").alias("std_value"),
|
|
746
|
+
pl.len().alias("count")
|
|
747
|
+
])
|
|
748
|
+
.sort("avg_value", descending=True)
|
|
749
|
+
.collect()
|
|
750
|
+
)
|
|
751
|
+
|
|
752
|
+
def export_results(self, output_path: str) -> None:
|
|
753
|
+
"""Export processed data"""
|
|
754
|
+
processed = self.process_data()
|
|
755
|
+
processed.write_csv(output_path)
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
---
|
|
89
759
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
760
|
+
**Created by**: MoAI Language Skill Factory
|
|
761
|
+
**Last Updated**: 2025-11-06
|
|
762
|
+
**Version**: 2.0.0
|
|
763
|
+
**Python Target**: 3.12+ with modern async and type features
|
|
93
764
|
|
|
94
|
-
|
|
95
|
-
- Enable automatic validation by matching your linter with the language's official style guide.
|
|
96
|
-
- Fix test/build pipelines with reproducible commands in CI.
|
|
765
|
+
This skill provides comprehensive Python development guidance with 2025 best practices, covering everything from basic project setup to advanced AI/ML integration and production deployment patterns.
|