moai-adk 0.35.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 +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
moai_adk/utils/logger.py
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Logging system built on Python's logging module
|
|
3
|
+
|
|
4
|
+
SPEC requirements:
|
|
5
|
+
- Store logs at .moai/logs/moai.log
|
|
6
|
+
- Mask sensitive data: API Key, Email, Password
|
|
7
|
+
- Log levels: development (DEBUG), test (INFO), production (WARNING)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SensitiveDataFilter(logging.Filter):
|
|
17
|
+
"""
|
|
18
|
+
Filter that masks sensitive information.
|
|
19
|
+
|
|
20
|
+
Automatically detects and obfuscates sensitive values in log messages.
|
|
21
|
+
|
|
22
|
+
Supported patterns:
|
|
23
|
+
- API Key: strings that start with sk-
|
|
24
|
+
- Email: standard email address format
|
|
25
|
+
- Password: values following password/passwd/pwd keywords
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
>>> filter_instance = SensitiveDataFilter()
|
|
29
|
+
>>> record = logging.LogRecord(
|
|
30
|
+
... name="app", level=logging.INFO, pathname="", lineno=0,
|
|
31
|
+
... msg="API Key: sk-secret123", args=(), exc_info=None
|
|
32
|
+
... )
|
|
33
|
+
>>> filter_instance.filter(record)
|
|
34
|
+
>>> print(record.msg)
|
|
35
|
+
API Key: ***REDACTED***
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
PATTERNS = [
|
|
39
|
+
(r"sk-[a-zA-Z0-9]+", "***REDACTED***"), # API Key
|
|
40
|
+
(
|
|
41
|
+
r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b",
|
|
42
|
+
"***REDACTED***",
|
|
43
|
+
), # Email
|
|
44
|
+
(r"(?i)(password|passwd|pwd)[\s:=]+\S+", r"\1: ***REDACTED***"), # Password
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
48
|
+
"""
|
|
49
|
+
Mask sensitive data in the log record message.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
record: Log record to inspect.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
True to keep the record.
|
|
56
|
+
"""
|
|
57
|
+
message = record.getMessage()
|
|
58
|
+
for pattern, replacement in self.PATTERNS:
|
|
59
|
+
message = re.sub(pattern, replacement, message)
|
|
60
|
+
|
|
61
|
+
record.msg = message
|
|
62
|
+
record.args = () # Clear args so getMessage() returns msg unchanged
|
|
63
|
+
|
|
64
|
+
return True
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def setup_logger(
|
|
68
|
+
name: str,
|
|
69
|
+
log_dir: str | None = None,
|
|
70
|
+
level: int | None = None,
|
|
71
|
+
) -> logging.Logger:
|
|
72
|
+
"""
|
|
73
|
+
Configure and return a logger instance.
|
|
74
|
+
|
|
75
|
+
Supports simultaneous console and file output while masking sensitive data.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
name: Logger name (module or application).
|
|
79
|
+
log_dir: Directory where logs are written.
|
|
80
|
+
Default: .moai/logs (created automatically).
|
|
81
|
+
level: Logging level (logging.DEBUG, INFO, WARNING, etc.).
|
|
82
|
+
Default: derived from the MOAI_ENV environment variable.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Configured Logger object with console and file handlers.
|
|
86
|
+
|
|
87
|
+
Log level per environment (MOAI_ENV):
|
|
88
|
+
- development: DEBUG (emit all logs)
|
|
89
|
+
- test: INFO (informational and above)
|
|
90
|
+
- production: WARNING (warnings and above)
|
|
91
|
+
- default: INFO (when the environment variable is unset)
|
|
92
|
+
|
|
93
|
+
Example:
|
|
94
|
+
>>> logger = setup_logger("my_app")
|
|
95
|
+
>>> logger.info("Application started")
|
|
96
|
+
>>> logger.debug("Detailed debug info")
|
|
97
|
+
>>> logger.error("Error occurred")
|
|
98
|
+
|
|
99
|
+
# Production environment (only WARNING and above)
|
|
100
|
+
>>> import os
|
|
101
|
+
>>> os.environ["MOAI_ENV"] = "production"
|
|
102
|
+
>>> prod_logger = setup_logger("prod_app")
|
|
103
|
+
>>> prod_logger.warning("This will be logged")
|
|
104
|
+
>>> prod_logger.info("This will NOT be logged")
|
|
105
|
+
|
|
106
|
+
Notes:
|
|
107
|
+
- Log files are written using UTF-8 encoding.
|
|
108
|
+
- Sensitive data (API Key, Email, Password) is automatically masked.
|
|
109
|
+
- Existing handlers are removed to prevent duplicates.
|
|
110
|
+
"""
|
|
111
|
+
if level is None:
|
|
112
|
+
env = os.getenv("MOAI_ENV", "").lower()
|
|
113
|
+
level_map = {
|
|
114
|
+
"development": logging.DEBUG,
|
|
115
|
+
"test": logging.INFO,
|
|
116
|
+
"production": logging.WARNING,
|
|
117
|
+
}
|
|
118
|
+
level = level_map.get(env, logging.INFO)
|
|
119
|
+
|
|
120
|
+
logger = logging.getLogger(name)
|
|
121
|
+
logger.setLevel(level)
|
|
122
|
+
logger.handlers.clear() # Remove existing handlers to avoid duplicates
|
|
123
|
+
|
|
124
|
+
if log_dir is None:
|
|
125
|
+
log_dir = ".moai/logs"
|
|
126
|
+
log_path = Path(log_dir)
|
|
127
|
+
log_path.mkdir(parents=True, exist_ok=True)
|
|
128
|
+
|
|
129
|
+
formatter = logging.Formatter(
|
|
130
|
+
fmt="[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s",
|
|
131
|
+
datefmt="%Y-%m-%d %H:%M:%S",
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
console_handler = logging.StreamHandler()
|
|
135
|
+
console_handler.setLevel(level)
|
|
136
|
+
console_handler.setFormatter(formatter)
|
|
137
|
+
console_handler.addFilter(SensitiveDataFilter())
|
|
138
|
+
logger.addHandler(console_handler)
|
|
139
|
+
|
|
140
|
+
log_file = log_path / "moai.log"
|
|
141
|
+
file_handler = logging.FileHandler(log_file, encoding="utf-8")
|
|
142
|
+
file_handler.setLevel(level)
|
|
143
|
+
file_handler.setFormatter(formatter)
|
|
144
|
+
file_handler.addFilter(SensitiveDataFilter())
|
|
145
|
+
logger.addHandler(file_handler)
|
|
146
|
+
|
|
147
|
+
return logger
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Safe File Reader Utility
|
|
4
|
+
|
|
5
|
+
Provides safe file reading with multiple encoding fallbacks and error handling.
|
|
6
|
+
Resolves UTF-8 encoding issues found in MoAI-ADK project.
|
|
7
|
+
|
|
8
|
+
Author: Alfred@MoAI
|
|
9
|
+
Date: 2025-11-11
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import List, Optional, Union
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SafeFileReader:
|
|
17
|
+
"""
|
|
18
|
+
Safe file reader with encoding fallback support.
|
|
19
|
+
|
|
20
|
+
Handles various encoding issues including:
|
|
21
|
+
- UTF-8 vs CP1252 encoding conflicts
|
|
22
|
+
- Binary files with special characters
|
|
23
|
+
- File system encoding issues
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
# Encoding priority order (most common to least common)
|
|
27
|
+
DEFAULT_ENCODINGS = [
|
|
28
|
+
"utf-8", # Standard UTF-8
|
|
29
|
+
"cp1252", # Windows-1252 (Western European)
|
|
30
|
+
"iso-8859-1", # Latin-1 (Western European)
|
|
31
|
+
"latin1", # Alternative Latin-1
|
|
32
|
+
"utf-16", # UTF-16 with BOM detection
|
|
33
|
+
"ascii", # Pure ASCII fallback
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
def __init__(self, encodings: Optional[List[str]] = None, errors: str = "ignore"):
|
|
37
|
+
"""
|
|
38
|
+
Initialize SafeFileReader.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
encodings: List of encodings to try in order
|
|
42
|
+
errors: Error handling strategy ('ignore', 'replace', 'strict')
|
|
43
|
+
"""
|
|
44
|
+
self.encodings = encodings or self.DEFAULT_ENCODINGS
|
|
45
|
+
self.errors = errors
|
|
46
|
+
|
|
47
|
+
def read_text(self, file_path: Union[str, Path]) -> Optional[str]:
|
|
48
|
+
"""
|
|
49
|
+
Safely read text file with encoding fallbacks.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
file_path: Path to the file to read
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
File content as string, or None if all attempts fail
|
|
56
|
+
"""
|
|
57
|
+
file_path = Path(file_path)
|
|
58
|
+
|
|
59
|
+
if not file_path.exists():
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
# Try each encoding in order
|
|
63
|
+
for encoding in self.encodings:
|
|
64
|
+
try:
|
|
65
|
+
return file_path.read_text(encoding=encoding)
|
|
66
|
+
except UnicodeDecodeError:
|
|
67
|
+
continue
|
|
68
|
+
except Exception as e:
|
|
69
|
+
# Log non-decoding errors but continue
|
|
70
|
+
print(f"Warning: Error reading {file_path} with {encoding}: {e}")
|
|
71
|
+
continue
|
|
72
|
+
|
|
73
|
+
# Final fallback with specified error handling
|
|
74
|
+
try:
|
|
75
|
+
return file_path.read_text(encoding="utf-8", errors=self.errors)
|
|
76
|
+
except Exception as e:
|
|
77
|
+
print(f"Error: Could not read {file_path}: {e}")
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
def read_lines(self, file_path: Union[str, Path]) -> List[str]:
|
|
81
|
+
"""
|
|
82
|
+
Safely read file as list of lines.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
file_path: Path to the file to read
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
List of lines, or empty list if reading fails
|
|
89
|
+
"""
|
|
90
|
+
content = self.read_text(file_path)
|
|
91
|
+
if content is None:
|
|
92
|
+
return []
|
|
93
|
+
|
|
94
|
+
return content.splitlines(keepends=True)
|
|
95
|
+
|
|
96
|
+
def safe_glob_read(self, pattern: str, base_path: Union[str, Path] = ".") -> dict:
|
|
97
|
+
"""
|
|
98
|
+
Safely read multiple files matching a glob pattern.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
pattern: Glob pattern to match files
|
|
102
|
+
base_path: Base directory for glob search
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Dictionary mapping file paths to their contents
|
|
106
|
+
"""
|
|
107
|
+
base_path = Path(base_path)
|
|
108
|
+
results = {}
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
for file_path in base_path.glob(pattern):
|
|
112
|
+
if file_path.is_file():
|
|
113
|
+
content = self.read_text(file_path)
|
|
114
|
+
if content is not None:
|
|
115
|
+
results[str(file_path)] = content
|
|
116
|
+
except Exception as e:
|
|
117
|
+
print(f"Error: Failed to glob pattern '{pattern}': {e}")
|
|
118
|
+
|
|
119
|
+
return results
|
|
120
|
+
|
|
121
|
+
def is_safe_file(self, file_path: Union[str, Path]) -> bool:
|
|
122
|
+
"""
|
|
123
|
+
Check if file can be safely read.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
file_path: Path to the file to check
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
True if file can be read safely, False otherwise
|
|
130
|
+
"""
|
|
131
|
+
content = self.read_text(file_path)
|
|
132
|
+
return content is not None
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# Global convenience functions
|
|
136
|
+
def safe_read_file(file_path: Union[str, Path], encodings: Optional[List[str]] = None) -> Optional[str]:
|
|
137
|
+
"""
|
|
138
|
+
Convenience function to safely read a single file.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
file_path: Path to the file to read
|
|
142
|
+
encodings: List of encodings to try in order
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
File content as string, or None if reading fails
|
|
146
|
+
"""
|
|
147
|
+
reader = SafeFileReader(encodings=encodings)
|
|
148
|
+
return reader.read_text(file_path)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def safe_read_lines(file_path: Union[str, Path], encodings: Optional[List[str]] = None) -> List[str]:
|
|
152
|
+
"""
|
|
153
|
+
Convenience function to safely read file lines.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
file_path: Path to the file to read
|
|
157
|
+
encodings: List of encodings to try in order
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
List of lines, or empty list if reading fails
|
|
161
|
+
"""
|
|
162
|
+
reader = SafeFileReader(encodings=encodings)
|
|
163
|
+
return reader.read_lines(file_path)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def safe_glob_read(
|
|
167
|
+
pattern: str,
|
|
168
|
+
base_path: Union[str, Path] = ".",
|
|
169
|
+
encodings: Optional[List[str]] = None,
|
|
170
|
+
) -> dict:
|
|
171
|
+
"""
|
|
172
|
+
Convenience function to safely read multiple files.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
pattern: Glob pattern to match files
|
|
176
|
+
base_path: Base directory for search
|
|
177
|
+
encodings: List of encodings to try in order
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Dictionary mapping file paths to their contents
|
|
181
|
+
"""
|
|
182
|
+
reader = SafeFileReader(encodings=encodings)
|
|
183
|
+
return reader.safe_glob_read(pattern, base_path)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
if __name__ == "__main__":
|
|
187
|
+
# Test the safe file reader
|
|
188
|
+
import logging
|
|
189
|
+
import sys
|
|
190
|
+
|
|
191
|
+
# Set up logging
|
|
192
|
+
logging.basicConfig(level=logging.INFO)
|
|
193
|
+
logger = logging.getLogger(__name__)
|
|
194
|
+
|
|
195
|
+
# Test reading this file
|
|
196
|
+
reader = SafeFileReader()
|
|
197
|
+
content = reader.read_text(__file__)
|
|
198
|
+
|
|
199
|
+
if content:
|
|
200
|
+
print("Successfully read file with safe encoding detection")
|
|
201
|
+
print(f"File length: {len(content)} characters")
|
|
202
|
+
else:
|
|
203
|
+
print("Failed to read file")
|
|
204
|
+
sys.exit(1)
|
|
205
|
+
|
|
206
|
+
print("SafeFileReader test completed successfully!")
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# # REMOVED_ORPHAN_CODE:TIMEOUT-001 | SPEC: SPEC-TIMEOUT-HANDLING-001
|
|
3
|
+
"""Cross-Platform Timeout Handler for Windows & Unix Compatibility
|
|
4
|
+
|
|
5
|
+
Provides a unified timeout mechanism that works on both Windows (threading-based)
|
|
6
|
+
and Unix/POSIX systems (signal-based).
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
- Windows: threading.Timer with exception injection
|
|
10
|
+
- Unix/POSIX: signal.SIGALRM (traditional approach)
|
|
11
|
+
- Both: Context manager for clean cancellation
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import platform
|
|
15
|
+
import signal
|
|
16
|
+
import threading
|
|
17
|
+
from contextlib import contextmanager
|
|
18
|
+
from typing import Callable, Optional, Union
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TimeoutError(Exception):
|
|
22
|
+
"""Timeout exception raised when deadline exceeded"""
|
|
23
|
+
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class CrossPlatformTimeout:
|
|
28
|
+
"""Cross-platform timeout handler supporting Windows and Unix.
|
|
29
|
+
|
|
30
|
+
Windows: Uses threading.Timer to schedule timeout exception
|
|
31
|
+
Unix: Uses signal.SIGALRM for timeout handling
|
|
32
|
+
|
|
33
|
+
Usage:
|
|
34
|
+
# Context manager (recommended)
|
|
35
|
+
with CrossPlatformTimeout(5):
|
|
36
|
+
long_running_operation()
|
|
37
|
+
|
|
38
|
+
# Manual control
|
|
39
|
+
timeout = CrossPlatformTimeout(5)
|
|
40
|
+
timeout.start()
|
|
41
|
+
try:
|
|
42
|
+
long_running_operation()
|
|
43
|
+
finally:
|
|
44
|
+
timeout.cancel()
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, timeout_seconds: float, callback: Optional[Callable] = None):
|
|
48
|
+
"""Initialize timeout with duration in seconds.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
timeout_seconds: Timeout duration in seconds (float or int)
|
|
52
|
+
callback: Optional callback to execute before raising TimeoutError
|
|
53
|
+
"""
|
|
54
|
+
# Convert float to int for signal.alarm()
|
|
55
|
+
self.timeout_seconds = timeout_seconds
|
|
56
|
+
self.timeout_seconds_int = max(1, int(timeout_seconds)) # signal.alarm requires >=1
|
|
57
|
+
self.callback = callback
|
|
58
|
+
self.timer: Optional[threading.Timer] = None
|
|
59
|
+
self._is_windows = platform.system() == "Windows"
|
|
60
|
+
self._old_handler: Optional[Union[Callable, int]] = None
|
|
61
|
+
|
|
62
|
+
def start(self) -> None:
|
|
63
|
+
"""Start timeout countdown."""
|
|
64
|
+
# Handle zero/negative timeouts
|
|
65
|
+
if self.timeout_seconds <= 0:
|
|
66
|
+
if self.timeout_seconds == 0:
|
|
67
|
+
# Zero timeout: raise immediately
|
|
68
|
+
if self.callback:
|
|
69
|
+
self.callback()
|
|
70
|
+
raise TimeoutError("Timeout of 0 seconds exceeded immediately")
|
|
71
|
+
else:
|
|
72
|
+
# Negative timeout: don't timeout at all
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
if self._is_windows:
|
|
76
|
+
self._start_windows_timeout()
|
|
77
|
+
else:
|
|
78
|
+
self._start_unix_timeout()
|
|
79
|
+
|
|
80
|
+
def cancel(self) -> None:
|
|
81
|
+
"""Cancel timeout (must call before timeout expires)."""
|
|
82
|
+
if self._is_windows:
|
|
83
|
+
self._cancel_windows_timeout()
|
|
84
|
+
else:
|
|
85
|
+
self._cancel_unix_timeout()
|
|
86
|
+
|
|
87
|
+
def _start_windows_timeout(self) -> None:
|
|
88
|
+
"""Windows: Use threading.Timer to raise exception."""
|
|
89
|
+
|
|
90
|
+
def timeout_handler():
|
|
91
|
+
if self.callback:
|
|
92
|
+
self.callback()
|
|
93
|
+
raise TimeoutError(f"Operation exceeded {self.timeout_seconds}s timeout (Windows threading)")
|
|
94
|
+
|
|
95
|
+
self.timer = threading.Timer(self.timeout_seconds, timeout_handler)
|
|
96
|
+
self.timer.daemon = True
|
|
97
|
+
self.timer.start()
|
|
98
|
+
|
|
99
|
+
def _cancel_windows_timeout(self) -> None:
|
|
100
|
+
"""Windows: Cancel timer thread."""
|
|
101
|
+
if self.timer:
|
|
102
|
+
self.timer.cancel()
|
|
103
|
+
self.timer = None
|
|
104
|
+
|
|
105
|
+
def _start_unix_timeout(self) -> None:
|
|
106
|
+
"""Unix/POSIX: Use signal.SIGALRM for timeout."""
|
|
107
|
+
|
|
108
|
+
def signal_handler(signum, frame):
|
|
109
|
+
if self.callback:
|
|
110
|
+
try:
|
|
111
|
+
self.callback()
|
|
112
|
+
except Exception:
|
|
113
|
+
# Ignore callback exceptions, timeout error takes precedence
|
|
114
|
+
pass
|
|
115
|
+
raise TimeoutError(f"Operation exceeded {self.timeout_seconds}s timeout (Unix signal)")
|
|
116
|
+
|
|
117
|
+
# Save old handler to restore later
|
|
118
|
+
self._old_handler = signal.signal(signal.SIGALRM, signal_handler)
|
|
119
|
+
# Use integer timeout_seconds_int for signal.alarm()
|
|
120
|
+
signal.alarm(self.timeout_seconds_int)
|
|
121
|
+
|
|
122
|
+
def _cancel_unix_timeout(self) -> None:
|
|
123
|
+
"""Unix/POSIX: Cancel alarm and restore old handler."""
|
|
124
|
+
signal.alarm(0) # Cancel pending alarm
|
|
125
|
+
if self._old_handler is not None:
|
|
126
|
+
signal.signal(signal.SIGALRM, self._old_handler)
|
|
127
|
+
self._old_handler = None
|
|
128
|
+
|
|
129
|
+
def __enter__(self):
|
|
130
|
+
"""Context manager entry."""
|
|
131
|
+
self.start()
|
|
132
|
+
return self
|
|
133
|
+
|
|
134
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
135
|
+
"""Context manager exit - always cancel."""
|
|
136
|
+
self.cancel()
|
|
137
|
+
return False # Don't suppress exceptions
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@contextmanager
|
|
141
|
+
def timeout_context(timeout_seconds: float, callback: Optional[Callable] = None):
|
|
142
|
+
"""Decorator/context manager for timeout.
|
|
143
|
+
|
|
144
|
+
Usage:
|
|
145
|
+
with timeout_context(5):
|
|
146
|
+
slow_function()
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
timeout_seconds: Timeout duration in seconds (float or int)
|
|
150
|
+
callback: Optional callback to execute before raising TimeoutError
|
|
151
|
+
|
|
152
|
+
Yields:
|
|
153
|
+
CrossPlatformTimeout instance
|
|
154
|
+
"""
|
|
155
|
+
timeout = CrossPlatformTimeout(timeout_seconds, callback=callback)
|
|
156
|
+
timeout.start()
|
|
157
|
+
try:
|
|
158
|
+
yield timeout
|
|
159
|
+
finally:
|
|
160
|
+
timeout.cancel()
|