moai-adk 0.25.4__py3-none-any.whl → 0.32.8__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 +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- 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 +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- 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 +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- 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 +4 -12
- 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 +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- 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/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -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 +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -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-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -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-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -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/design-system-tokens.md +405 -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 +491 -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-foundation-claude/SKILL.md +201 -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-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -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 +346 -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-quality/SKILL.md +362 -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-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -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 +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -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-shadcn/SKILL.md +370 -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-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -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 +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -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/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -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 +71 -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-templates/SKILL.md +374 -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-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -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/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/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 +410 -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 +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -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 +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Test Suite for Hooks System Improvements
|
|
3
|
+
|
|
4
|
+
Comprehensive testing script to validate all the improvements made to prevent
|
|
5
|
+
aborted() errors and optimize timeout handling in the MoAI-ADK hooks system.
|
|
6
|
+
|
|
7
|
+
Test Coverage:
|
|
8
|
+
- Unified timeout manager functionality
|
|
9
|
+
- Git operations manager performance
|
|
10
|
+
- Configuration validation
|
|
11
|
+
- Hook-specific improvements
|
|
12
|
+
- Graceful degradation mechanisms
|
|
13
|
+
- Performance benchmarks
|
|
14
|
+
- Error handling scenarios
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import subprocess
|
|
19
|
+
import sys
|
|
20
|
+
import tempfile
|
|
21
|
+
import time
|
|
22
|
+
from datetime import datetime
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
# Add lib directory to path
|
|
26
|
+
hooks_dir = Path(__file__).parent
|
|
27
|
+
sys.path.insert(0, str(hooks_dir))
|
|
28
|
+
|
|
29
|
+
# Import modules to test
|
|
30
|
+
try:
|
|
31
|
+
from config_validator import ( # noqa: F401 - imports used for availability check
|
|
32
|
+
ValidationIssue,
|
|
33
|
+
ValidationLevel,
|
|
34
|
+
get_config_validator,
|
|
35
|
+
)
|
|
36
|
+
from git_operations_manager import ( # noqa: F401 - imports used for availability check
|
|
37
|
+
GitCommand,
|
|
38
|
+
GitOperationType,
|
|
39
|
+
get_git_manager,
|
|
40
|
+
)
|
|
41
|
+
from unified_timeout_manager import ( # noqa: F401 - imports used for availability check
|
|
42
|
+
HookTimeoutConfig,
|
|
43
|
+
HookTimeoutError,
|
|
44
|
+
TimeoutPolicy,
|
|
45
|
+
get_timeout_manager,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
TIMEOUT_MANAGER_AVAILABLE = True
|
|
49
|
+
GIT_MANAGER_AVAILABLE = True
|
|
50
|
+
CONFIG_VALIDATOR_AVAILABLE = True
|
|
51
|
+
except ImportError as e:
|
|
52
|
+
print(f"⚠️ Import error: {e}")
|
|
53
|
+
TIMEOUT_MANAGER_AVAILABLE = False
|
|
54
|
+
GIT_MANAGER_AVAILABLE = False
|
|
55
|
+
CONFIG_VALIDATOR_AVAILABLE = False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class HooksTestSuite:
|
|
59
|
+
"""Comprehensive test suite for hooks improvements"""
|
|
60
|
+
|
|
61
|
+
def __init__(self):
|
|
62
|
+
self.test_results = []
|
|
63
|
+
self.start_time = datetime.now()
|
|
64
|
+
self.temp_dir = Path(tempfile.mkdtemp(prefix="hooks_test_"))
|
|
65
|
+
|
|
66
|
+
def log_test_result(self, test_name: str, passed: bool, message: str = "", duration: float = 0):
|
|
67
|
+
"""Log a test result"""
|
|
68
|
+
status = "✅ PASS" if passed else "❌ FAIL"
|
|
69
|
+
result = {
|
|
70
|
+
"test_name": test_name,
|
|
71
|
+
"status": status,
|
|
72
|
+
"passed": passed,
|
|
73
|
+
"message": message,
|
|
74
|
+
"duration": duration,
|
|
75
|
+
"timestamp": datetime.now().isoformat(),
|
|
76
|
+
}
|
|
77
|
+
self.test_results.append(result)
|
|
78
|
+
print(f"{status} {test_name}{f' - {message}' if message else ''} ({duration:.3f}s)")
|
|
79
|
+
|
|
80
|
+
def test_timeout_manager_basic(self) -> None:
|
|
81
|
+
"""Test basic timeout manager functionality"""
|
|
82
|
+
if not TIMEOUT_MANAGER_AVAILABLE:
|
|
83
|
+
self.log_test_result("Timeout Manager - Basic", False, "Module not available")
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
start = time.time()
|
|
87
|
+
try:
|
|
88
|
+
manager = get_timeout_manager()
|
|
89
|
+
assert manager is not None, "Timeout manager should be available"
|
|
90
|
+
|
|
91
|
+
# Test timeout configuration
|
|
92
|
+
config = HookTimeoutConfig(
|
|
93
|
+
policy=TimeoutPolicy.FAST,
|
|
94
|
+
custom_timeout_ms=1000,
|
|
95
|
+
retry_count=1,
|
|
96
|
+
graceful_degradation=True,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Test successful execution
|
|
100
|
+
def quick_task():
|
|
101
|
+
return "success"
|
|
102
|
+
|
|
103
|
+
result = manager.execute_with_timeout("test_hook", quick_task, config=config)
|
|
104
|
+
assert result == "success", "Quick task should return success"
|
|
105
|
+
|
|
106
|
+
duration = time.time() - start
|
|
107
|
+
self.log_test_result("Timeout Manager - Basic", True, "All basic tests passed", duration)
|
|
108
|
+
|
|
109
|
+
except Exception as e:
|
|
110
|
+
duration = time.time() - start
|
|
111
|
+
self.log_test_result("Timeout Manager - Basic", False, str(e), duration)
|
|
112
|
+
|
|
113
|
+
def test_timeout_manager_timeout(self) -> None:
|
|
114
|
+
"""Test timeout manager timeout handling"""
|
|
115
|
+
if not TIMEOUT_MANAGER_AVAILABLE:
|
|
116
|
+
self.log_test_result("Timeout Manager - Timeout", False, "Module not available")
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
start = time.time()
|
|
120
|
+
try:
|
|
121
|
+
manager = get_timeout_manager()
|
|
122
|
+
|
|
123
|
+
# Test timeout with slow task
|
|
124
|
+
def slow_task():
|
|
125
|
+
time.sleep(2) # Sleep longer than timeout
|
|
126
|
+
return "should not reach"
|
|
127
|
+
|
|
128
|
+
config = HookTimeoutConfig(
|
|
129
|
+
policy=TimeoutPolicy.FAST,
|
|
130
|
+
custom_timeout_ms=500, # 0.5 second timeout
|
|
131
|
+
retry_count=0, # No retries for timeout test
|
|
132
|
+
graceful_degradation=True,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
result = manager.execute_with_timeout("test_timeout", slow_task, config=config)
|
|
137
|
+
# If graceful degradation is enabled, should return default result
|
|
138
|
+
assert "graceful_degradation" in str(result), "Should return graceful degradation result"
|
|
139
|
+
duration = time.time() - start
|
|
140
|
+
self.log_test_result(
|
|
141
|
+
"Timeout Manager - Timeout",
|
|
142
|
+
True,
|
|
143
|
+
"Graceful degradation working",
|
|
144
|
+
duration,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
except HookTimeoutError:
|
|
148
|
+
duration = time.time() - start
|
|
149
|
+
self.log_test_result(
|
|
150
|
+
"Timeout Manager - Timeout",
|
|
151
|
+
True,
|
|
152
|
+
"Timeout exception raised correctly",
|
|
153
|
+
duration,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
duration = time.time() - start
|
|
158
|
+
self.log_test_result("Timeout Manager - Timeout", False, str(e), duration)
|
|
159
|
+
|
|
160
|
+
def test_git_operations_manager(self) -> None:
|
|
161
|
+
"""Test Git operations manager functionality"""
|
|
162
|
+
if not GIT_MANAGER_AVAILABLE:
|
|
163
|
+
self.log_test_result("Git Operations Manager", False, "Module not available")
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
start = time.time()
|
|
167
|
+
try:
|
|
168
|
+
manager = get_git_manager()
|
|
169
|
+
assert manager is not None, "Git manager should be available"
|
|
170
|
+
|
|
171
|
+
# Test git info retrieval
|
|
172
|
+
project_info = manager.get_project_info(use_cache=True)
|
|
173
|
+
assert isinstance(project_info, dict), "Should return dictionary"
|
|
174
|
+
assert "branch" in project_info, "Should contain branch info"
|
|
175
|
+
|
|
176
|
+
# Test statistics
|
|
177
|
+
stats = manager.get_statistics()
|
|
178
|
+
assert isinstance(stats, dict), "Statistics should be dictionary"
|
|
179
|
+
assert "operations" in stats, "Should contain operations stats"
|
|
180
|
+
|
|
181
|
+
# Test cache clearing
|
|
182
|
+
cleared_count = manager.clear_cache()
|
|
183
|
+
assert isinstance(cleared_count, int), "Should return count of cleared entries"
|
|
184
|
+
|
|
185
|
+
duration = time.time() - start
|
|
186
|
+
self.log_test_result(
|
|
187
|
+
"Git Operations Manager",
|
|
188
|
+
True,
|
|
189
|
+
f"Cached {len(project_info)} fields",
|
|
190
|
+
duration,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
except Exception as e:
|
|
194
|
+
duration = time.time() - start
|
|
195
|
+
self.log_test_result("Git Operations Manager", False, str(e), duration)
|
|
196
|
+
|
|
197
|
+
def test_config_validator(self) -> None:
|
|
198
|
+
"""Test configuration validator functionality"""
|
|
199
|
+
if not CONFIG_VALIDATOR_AVAILABLE:
|
|
200
|
+
self.log_test_result("Configuration Validator", False, "Module not available")
|
|
201
|
+
return
|
|
202
|
+
|
|
203
|
+
start = time.time()
|
|
204
|
+
try:
|
|
205
|
+
validator = get_config_validator()
|
|
206
|
+
assert validator is not None, "Config validator should be available"
|
|
207
|
+
|
|
208
|
+
# Load example config
|
|
209
|
+
example_config_path = hooks_dir / "example_config.json"
|
|
210
|
+
assert example_config_path.exists(), "Example config should exist"
|
|
211
|
+
|
|
212
|
+
with open(example_config_path, "r") as f:
|
|
213
|
+
config = json.load(f)
|
|
214
|
+
|
|
215
|
+
# Validate configuration
|
|
216
|
+
is_valid, issues = validator.validate_config(config)
|
|
217
|
+
|
|
218
|
+
# Check that critical issues are not present
|
|
219
|
+
critical_issues = [i for i in issues if i.level == ValidationLevel.CRITICAL]
|
|
220
|
+
error_issues = [i for i in issues if i.level == ValidationLevel.ERROR]
|
|
221
|
+
|
|
222
|
+
success = len(critical_issues) == 0 and len(error_issues) == 0
|
|
223
|
+
message = f"Found {len(issues)} issues ({len(error_issues)} errors)" if issues else "No issues found"
|
|
224
|
+
|
|
225
|
+
# Test normalization
|
|
226
|
+
normalized = validator.normalize_config({})
|
|
227
|
+
assert isinstance(normalized, dict), "Normalization should return dict"
|
|
228
|
+
|
|
229
|
+
duration = time.time() - start
|
|
230
|
+
self.log_test_result("Configuration Validator", success, message, duration)
|
|
231
|
+
|
|
232
|
+
except Exception as e:
|
|
233
|
+
duration = time.time() - start
|
|
234
|
+
self.log_test_result("Configuration Validator", False, str(e), duration)
|
|
235
|
+
|
|
236
|
+
def test_hook_integration(self) -> None:
|
|
237
|
+
"""Test integration with actual hooks"""
|
|
238
|
+
start = time.time()
|
|
239
|
+
try:
|
|
240
|
+
# Test session_start hook
|
|
241
|
+
session_start_hook = hooks_dir / "session_start__show_project_info.py"
|
|
242
|
+
assert session_start_hook.exists(), "Session start hook should exist"
|
|
243
|
+
|
|
244
|
+
# Test with empty input
|
|
245
|
+
result = subprocess.run(
|
|
246
|
+
[sys.executable, str(session_start_hook)],
|
|
247
|
+
input="{}",
|
|
248
|
+
text=True,
|
|
249
|
+
capture_output=True,
|
|
250
|
+
timeout=10,
|
|
251
|
+
cwd=self.temp_dir,
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
# Should not crash and should produce JSON output
|
|
255
|
+
try:
|
|
256
|
+
output = json.loads(result.stdout)
|
|
257
|
+
assert isinstance(output, dict), "Should return JSON object"
|
|
258
|
+
success = result.returncode == 0
|
|
259
|
+
message = "Hook executed successfully" if success else f"Exit code: {result.returncode}"
|
|
260
|
+
except json.JSONDecodeError:
|
|
261
|
+
success = False
|
|
262
|
+
message = "Invalid JSON output"
|
|
263
|
+
|
|
264
|
+
duration = time.time() - start
|
|
265
|
+
self.log_test_result("Hook Integration - Session Start", success, message, duration)
|
|
266
|
+
|
|
267
|
+
except subprocess.TimeoutExpired:
|
|
268
|
+
duration = time.time() - start
|
|
269
|
+
self.log_test_result("Hook Integration - Session Start", False, "Hook timeout", duration)
|
|
270
|
+
except Exception as e:
|
|
271
|
+
duration = time.time() - start
|
|
272
|
+
self.log_test_result("Hook Integration - Session Start", False, str(e), duration)
|
|
273
|
+
|
|
274
|
+
def test_performance_benchmarks(self) -> None:
|
|
275
|
+
"""Test performance benchmarks"""
|
|
276
|
+
start = time.time()
|
|
277
|
+
try:
|
|
278
|
+
# Test multiple parallel operations
|
|
279
|
+
if GIT_MANAGER_AVAILABLE:
|
|
280
|
+
manager = get_git_manager()
|
|
281
|
+
|
|
282
|
+
# Benchmark git info retrieval
|
|
283
|
+
git_start = time.time()
|
|
284
|
+
for _ in range(5):
|
|
285
|
+
manager.get_project_info(use_cache=True)
|
|
286
|
+
git_duration = time.time() - git_start
|
|
287
|
+
|
|
288
|
+
avg_git_time = git_duration / 5
|
|
289
|
+
message = f"Avg Git info retrieval: {avg_git_time:.3f}s"
|
|
290
|
+
success = avg_git_time < 1.0 # Should be under 1 second with caching
|
|
291
|
+
else:
|
|
292
|
+
avg_git_time = 0
|
|
293
|
+
message = "Git manager not available"
|
|
294
|
+
success = False
|
|
295
|
+
|
|
296
|
+
duration = time.time() - start
|
|
297
|
+
self.log_test_result("Performance Benchmarks", success, message, duration)
|
|
298
|
+
|
|
299
|
+
except Exception as e:
|
|
300
|
+
duration = time.time() - start
|
|
301
|
+
self.log_test_result("Performance Benchmarks", False, str(e), duration)
|
|
302
|
+
|
|
303
|
+
def test_error_handling(self) -> None:
|
|
304
|
+
"""Test error handling scenarios"""
|
|
305
|
+
start = time.time()
|
|
306
|
+
try:
|
|
307
|
+
errors_tested = 0
|
|
308
|
+
errors_passed = 0
|
|
309
|
+
|
|
310
|
+
# Test invalid configuration
|
|
311
|
+
if CONFIG_VALIDATOR_AVAILABLE:
|
|
312
|
+
validator = get_config_validator()
|
|
313
|
+
invalid_config = {
|
|
314
|
+
"timeout_manager": {
|
|
315
|
+
"global_timeout_ms": -1000, # Invalid negative timeout
|
|
316
|
+
"default_retry_count": "invalid", # Invalid type
|
|
317
|
+
"graceful_degradation": "maybe", # Invalid boolean
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
is_valid, issues = validator.validate_config(invalid_config)
|
|
322
|
+
errors_tested += 1
|
|
323
|
+
if not is_valid and len(issues) > 0:
|
|
324
|
+
errors_passed += 1
|
|
325
|
+
|
|
326
|
+
# Test timeout with graceful degradation
|
|
327
|
+
if TIMEOUT_MANAGER_AVAILABLE:
|
|
328
|
+
manager = get_timeout_manager()
|
|
329
|
+
config = HookTimeoutConfig(
|
|
330
|
+
policy=TimeoutPolicy.FAST,
|
|
331
|
+
custom_timeout_ms=100,
|
|
332
|
+
retry_count=0,
|
|
333
|
+
graceful_degradation=True,
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
def failing_task():
|
|
337
|
+
time.sleep(0.5)
|
|
338
|
+
raise Exception("Simulated failure")
|
|
339
|
+
|
|
340
|
+
try:
|
|
341
|
+
result = manager.execute_with_timeout("test_error", failing_task, config=config)
|
|
342
|
+
errors_tested += 1
|
|
343
|
+
# Should return graceful degradation result
|
|
344
|
+
if isinstance(result, dict) and "graceful_degradation" in str(result):
|
|
345
|
+
errors_passed += 1
|
|
346
|
+
except Exception:
|
|
347
|
+
# Exception is also acceptable
|
|
348
|
+
errors_passed += 1
|
|
349
|
+
errors_tested += 1
|
|
350
|
+
|
|
351
|
+
success = errors_passed > 0 and errors_passed == errors_tested
|
|
352
|
+
message = f"Error handling: {errors_passed}/{errors_tested} scenarios passed"
|
|
353
|
+
|
|
354
|
+
duration = time.time() - start
|
|
355
|
+
self.log_test_result("Error Handling", success, message, duration)
|
|
356
|
+
|
|
357
|
+
except Exception as e:
|
|
358
|
+
duration = time.time() - start
|
|
359
|
+
self.log_test_result("Error Handling", False, str(e), duration)
|
|
360
|
+
|
|
361
|
+
def run_all_tests(self) -> None:
|
|
362
|
+
"""Run all tests in the suite"""
|
|
363
|
+
print("🚀 Starting Hooks System Improvements Test Suite")
|
|
364
|
+
print(f"📍 Test directory: {self.temp_dir}")
|
|
365
|
+
print(f"🕐 Started at: {self.start_time}")
|
|
366
|
+
print("=" * 60)
|
|
367
|
+
|
|
368
|
+
# Run all tests
|
|
369
|
+
self.test_timeout_manager_basic()
|
|
370
|
+
self.test_timeout_manager_timeout()
|
|
371
|
+
self.test_git_operations_manager()
|
|
372
|
+
self.test_config_validator()
|
|
373
|
+
self.test_hook_integration()
|
|
374
|
+
self.test_performance_benchmarks()
|
|
375
|
+
self.test_error_handling()
|
|
376
|
+
|
|
377
|
+
# Generate summary
|
|
378
|
+
self.generate_summary()
|
|
379
|
+
|
|
380
|
+
def generate_summary(self) -> None:
|
|
381
|
+
"""Generate test summary report"""
|
|
382
|
+
total_tests = len(self.test_results)
|
|
383
|
+
passed_tests = sum(1 for r in self.test_results if r["passed"])
|
|
384
|
+
failed_tests = total_tests - passed_tests
|
|
385
|
+
total_duration = sum(r["duration"] for r in self.test_results)
|
|
386
|
+
|
|
387
|
+
end_time = datetime.now()
|
|
388
|
+
suite_duration = (end_time - self.start_time).total_seconds()
|
|
389
|
+
|
|
390
|
+
print("\n" + "=" * 60)
|
|
391
|
+
print("📊 TEST SUMMARY")
|
|
392
|
+
print("=" * 60)
|
|
393
|
+
print(f"Total Tests: {total_tests}")
|
|
394
|
+
print(f"Passed: {passed_tests} ✅")
|
|
395
|
+
print(f"Failed: {failed_tests} ❌")
|
|
396
|
+
print(f"Success Rate: {(passed_tests / total_tests * 100):.1f}%")
|
|
397
|
+
print(f"Total Duration: {total_duration:.3f}s")
|
|
398
|
+
print(f"Suite Duration: {suite_duration:.3f}s")
|
|
399
|
+
print(f"Completed at: {end_time}")
|
|
400
|
+
|
|
401
|
+
if failed_tests > 0:
|
|
402
|
+
print("\n❌ FAILED TESTS:")
|
|
403
|
+
for result in self.test_results:
|
|
404
|
+
if not result["passed"]:
|
|
405
|
+
print(f" • {result['test_name']}: {result['message']}")
|
|
406
|
+
|
|
407
|
+
# Module availability report
|
|
408
|
+
print("\n🔧 MODULE AVAILABILITY:")
|
|
409
|
+
print(f" Timeout Manager: {'✅ Available' if TIMEOUT_MANAGER_AVAILABLE else '❌ Not Available'}")
|
|
410
|
+
print(f" Git Operations Manager: {'✅ Available' if GIT_MANAGER_AVAILABLE else '❌ Not Available'}")
|
|
411
|
+
print(f" Config Validator: {'✅ Available' if CONFIG_VALIDATOR_AVAILABLE else '❌ Not Available'}")
|
|
412
|
+
|
|
413
|
+
# Performance summary
|
|
414
|
+
if GIT_MANAGER_AVAILABLE:
|
|
415
|
+
try:
|
|
416
|
+
stats = get_git_manager().get_statistics()
|
|
417
|
+
print("\n📈 PERFORMANCE SUMMARY:")
|
|
418
|
+
print(f" Git Operations: {stats['operations']['total']}")
|
|
419
|
+
print(f" Cache Hit Rate: {stats['operations']['cache_hit_rate']:.1%}")
|
|
420
|
+
print(f" Cache Size: {stats['cache']['size']}/{stats['cache']['size_limit']}")
|
|
421
|
+
except Exception:
|
|
422
|
+
pass
|
|
423
|
+
|
|
424
|
+
# Cleanup
|
|
425
|
+
try:
|
|
426
|
+
import shutil
|
|
427
|
+
|
|
428
|
+
shutil.rmtree(self.temp_dir)
|
|
429
|
+
print(f"\n🧹 Cleaned up test directory: {self.temp_dir}")
|
|
430
|
+
except Exception:
|
|
431
|
+
pass
|
|
432
|
+
|
|
433
|
+
print("\n" + "=" * 60)
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def main():
|
|
437
|
+
"""Main test runner"""
|
|
438
|
+
test_suite = HooksTestSuite()
|
|
439
|
+
test_suite.run_all_tests()
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
if __name__ == "__main__":
|
|
443
|
+
main()
|
|
@@ -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 Any, Callable, Optional
|
|
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[signal.Handlers | Callable[[int, Any], Any]] = 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) # type: ignore[assignment]
|
|
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()
|