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,431 @@
|
|
|
1
|
+
"""
|
|
2
|
+
EARS (Event-Agent-Result-Scenario) Implementation.
|
|
3
|
+
|
|
4
|
+
Provides:
|
|
5
|
+
- EARSParser: Parse natural language requirements into EARS patterns
|
|
6
|
+
- EARSValidator: Validate EARS requirement completeness and clarity
|
|
7
|
+
- EARSAnalyzer: Analyze requirements and generate test cases
|
|
8
|
+
|
|
9
|
+
Reference: EARS methodology for structured requirement specification
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from enum import Enum
|
|
15
|
+
from typing import Any, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EARSPatternType(Enum):
|
|
19
|
+
"""Enumeration of EARS pattern types."""
|
|
20
|
+
|
|
21
|
+
EVENT = "event"
|
|
22
|
+
AGENT = "agent"
|
|
23
|
+
SCENARIO = "scenario"
|
|
24
|
+
VALIDATION = "validation"
|
|
25
|
+
COMPLEX = "complex"
|
|
26
|
+
UNKNOWN = "unknown"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class EARSResult:
|
|
31
|
+
"""Result of EARS parsing or analysis."""
|
|
32
|
+
|
|
33
|
+
pattern_type: str
|
|
34
|
+
trigger: Optional[str] = None
|
|
35
|
+
triggers: List[str] = field(default_factory=list)
|
|
36
|
+
event: Optional[str] = None
|
|
37
|
+
agent: Optional[str] = None
|
|
38
|
+
agents: List[str] = field(default_factory=list)
|
|
39
|
+
condition: Optional[str] = None
|
|
40
|
+
conditions: List[str] = field(default_factory=list)
|
|
41
|
+
result: Optional[str] = None
|
|
42
|
+
results: List[str] = field(default_factory=list)
|
|
43
|
+
scenario: Optional[str] = None
|
|
44
|
+
capability: Optional[str] = None # For agent patterns
|
|
45
|
+
action: Optional[str] = None # Alias for capability
|
|
46
|
+
priority: int = 5
|
|
47
|
+
is_valid: bool = True
|
|
48
|
+
errors: List[str] = field(default_factory=list)
|
|
49
|
+
missing_elements: List[str] = field(default_factory=list)
|
|
50
|
+
|
|
51
|
+
def __getitem__(self, key):
|
|
52
|
+
"""Allow dict-like access for backward compatibility."""
|
|
53
|
+
if isinstance(key, str):
|
|
54
|
+
return getattr(self, key, None)
|
|
55
|
+
# Handle integer indexing - convert to attribute access
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
def __contains__(self, key):
|
|
59
|
+
"""Support 'in' operator for dict-like behavior."""
|
|
60
|
+
return hasattr(self, key) and getattr(self, key) is not None
|
|
61
|
+
|
|
62
|
+
def get(self, key, default=None):
|
|
63
|
+
"""Allow dict.get() compatibility."""
|
|
64
|
+
return getattr(self, key, default)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class EARSParser:
|
|
68
|
+
"""Parse natural language requirements into EARS patterns."""
|
|
69
|
+
|
|
70
|
+
# Regex patterns for EARS components
|
|
71
|
+
WHEN_PATTERN = re.compile(r"when\s+([^,\.]*?)(?:,|where|then|\.|$)", re.IGNORECASE)
|
|
72
|
+
AGENT_PATTERN = re.compile(r"as\s+(?:an?\s+)?([^,\n]+?)(?:,|\n|when|shall|i\s+shall|\.|$)", re.IGNORECASE)
|
|
73
|
+
WHERE_PATTERN = re.compile(r"where\s+([^,\.]*?)(?:,|then|$)", re.IGNORECASE)
|
|
74
|
+
THEN_PATTERN = re.compile(r"then\s+([^\.]*?)(?:\.|$)", re.IGNORECASE)
|
|
75
|
+
SCENARIO_PATTERN = re.compile(r"scenario\s*:\s*([^\n]+)", re.IGNORECASE)
|
|
76
|
+
|
|
77
|
+
def parse(self, requirement: str) -> EARSResult:
|
|
78
|
+
"""
|
|
79
|
+
Parse requirement text into EARS components.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
requirement: Natural language requirement text
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
EARSResult: Parsed requirement with identified pattern and components
|
|
86
|
+
"""
|
|
87
|
+
if not requirement or not requirement.strip():
|
|
88
|
+
return EARSResult(pattern_type="unknown")
|
|
89
|
+
|
|
90
|
+
requirement = requirement.strip()
|
|
91
|
+
|
|
92
|
+
# Try to identify pattern type
|
|
93
|
+
pattern_type = self._identify_pattern_type(requirement)
|
|
94
|
+
|
|
95
|
+
# Extract components based on pattern
|
|
96
|
+
result = EARSResult(pattern_type=pattern_type)
|
|
97
|
+
|
|
98
|
+
# Extract EARS components
|
|
99
|
+
self._extract_agents(requirement, result)
|
|
100
|
+
self._extract_triggers(requirement, result)
|
|
101
|
+
self._extract_conditions(requirement, result)
|
|
102
|
+
self._extract_results(requirement, result)
|
|
103
|
+
self._extract_scenario(requirement, result)
|
|
104
|
+
|
|
105
|
+
return result
|
|
106
|
+
|
|
107
|
+
def _identify_pattern_type(self, text: str) -> str:
|
|
108
|
+
"""Identify which EARS pattern type the requirement follows."""
|
|
109
|
+
text_lower = text.lower()
|
|
110
|
+
|
|
111
|
+
# Check for scenario first (most specific)
|
|
112
|
+
if re.search(r"scenario\s*:", text_lower):
|
|
113
|
+
return EARSPatternType.SCENARIO.value
|
|
114
|
+
|
|
115
|
+
# Check for when...then (EVENT) - higher priority
|
|
116
|
+
has_when = re.search(r"when\s+[a-z]", text_lower)
|
|
117
|
+
has_then = re.search(r"then\s+[a-z]", text_lower)
|
|
118
|
+
if has_when and has_then:
|
|
119
|
+
return EARSPatternType.EVENT.value
|
|
120
|
+
|
|
121
|
+
# Check for where...then (VALIDATION)
|
|
122
|
+
has_where = re.search(r"where\s+[a-z]", text_lower)
|
|
123
|
+
if has_where and has_then:
|
|
124
|
+
return EARSPatternType.VALIDATION.value
|
|
125
|
+
|
|
126
|
+
# Check for as a...shall/can (AGENT)
|
|
127
|
+
has_agent = re.search(r"as\s+(?:an?\s+)?[a-z]", text_lower)
|
|
128
|
+
has_capability = re.search(r"shall|can|able|be able", text_lower)
|
|
129
|
+
if has_agent and has_capability and not has_when:
|
|
130
|
+
return EARSPatternType.AGENT.value
|
|
131
|
+
|
|
132
|
+
# Special case: as a + when + then = EVENT with agent
|
|
133
|
+
if has_agent and has_when and has_then:
|
|
134
|
+
return EARSPatternType.EVENT.value
|
|
135
|
+
|
|
136
|
+
return EARSPatternType.UNKNOWN.value
|
|
137
|
+
|
|
138
|
+
def _extract_agents(self, text: str, result: EARSResult) -> None:
|
|
139
|
+
"""Extract agent/role information."""
|
|
140
|
+
matches = self.AGENT_PATTERN.findall(text)
|
|
141
|
+
if matches:
|
|
142
|
+
if len(matches) == 1:
|
|
143
|
+
result.agent = matches[0].strip()
|
|
144
|
+
else:
|
|
145
|
+
result.agents = [m.strip() for m in matches]
|
|
146
|
+
if matches:
|
|
147
|
+
result.agent = matches[0].strip()
|
|
148
|
+
|
|
149
|
+
# Extract capability/action for agent patterns
|
|
150
|
+
# Look for: shall <action>, can <action>, able to <action>
|
|
151
|
+
capability_pattern = re.compile(r"(?:shall|can|able to)\s+([^\.]*?)(?:\.|$)", re.IGNORECASE)
|
|
152
|
+
cap_matches = capability_pattern.findall(text)
|
|
153
|
+
if cap_matches:
|
|
154
|
+
# For agent patterns, treat first capability as the result and capability
|
|
155
|
+
capability = cap_matches[0].strip() if cap_matches else None
|
|
156
|
+
if capability:
|
|
157
|
+
result.result = capability
|
|
158
|
+
result.capability = capability
|
|
159
|
+
result.action = capability
|
|
160
|
+
|
|
161
|
+
def _extract_triggers(self, text: str, result: EARSResult) -> None:
|
|
162
|
+
"""Extract trigger/event information."""
|
|
163
|
+
matches = self.WHEN_PATTERN.findall(text)
|
|
164
|
+
if matches:
|
|
165
|
+
triggers = [m.strip() for m in matches if m.strip()]
|
|
166
|
+
if triggers:
|
|
167
|
+
if len(triggers) == 1:
|
|
168
|
+
result.trigger = triggers[0]
|
|
169
|
+
else:
|
|
170
|
+
result.triggers = triggers
|
|
171
|
+
result.trigger = triggers[0]
|
|
172
|
+
|
|
173
|
+
def _extract_conditions(self, text: str, result: EARSResult) -> None:
|
|
174
|
+
"""Extract condition information."""
|
|
175
|
+
matches = self.WHERE_PATTERN.findall(text)
|
|
176
|
+
if matches:
|
|
177
|
+
conditions = [m.strip() for m in matches if m.strip()]
|
|
178
|
+
if conditions:
|
|
179
|
+
if len(conditions) == 1:
|
|
180
|
+
result.condition = conditions[0]
|
|
181
|
+
else:
|
|
182
|
+
result.conditions = conditions
|
|
183
|
+
result.condition = conditions[0]
|
|
184
|
+
|
|
185
|
+
def _extract_results(self, text: str, result: EARSResult) -> None:
|
|
186
|
+
"""Extract result/outcome information."""
|
|
187
|
+
matches = self.THEN_PATTERN.findall(text)
|
|
188
|
+
if matches:
|
|
189
|
+
results = [m.strip() for m in matches if m.strip()]
|
|
190
|
+
if results:
|
|
191
|
+
if len(results) == 1:
|
|
192
|
+
result.result = results[0]
|
|
193
|
+
else:
|
|
194
|
+
result.results = results
|
|
195
|
+
result.result = results[0]
|
|
196
|
+
|
|
197
|
+
def _extract_scenario(self, text: str, result: EARSResult) -> None:
|
|
198
|
+
"""Extract scenario context if present."""
|
|
199
|
+
match = self.SCENARIO_PATTERN.search(text)
|
|
200
|
+
if match:
|
|
201
|
+
result.scenario = match.group(1).strip()
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class EARSValidator:
|
|
205
|
+
"""Validate EARS requirements for completeness and clarity."""
|
|
206
|
+
|
|
207
|
+
# Required elements for each pattern type
|
|
208
|
+
PATTERN_REQUIREMENTS = {
|
|
209
|
+
"event": ["trigger", "result"],
|
|
210
|
+
"agent": [
|
|
211
|
+
"agent",
|
|
212
|
+
"trigger",
|
|
213
|
+
"result",
|
|
214
|
+
], # Agent patterns should have trigger (When does agent use capability?)
|
|
215
|
+
"scenario": ["scenario", "result"],
|
|
216
|
+
"validation": ["condition", "result"],
|
|
217
|
+
"complex": ["trigger", "condition", "result"],
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
# Keywords that indicate missing elements
|
|
221
|
+
WEAK_KEYWORDS = ["should", "maybe", "might", "could", "might"]
|
|
222
|
+
|
|
223
|
+
def validate(self, requirement: str) -> Dict[str, Any]:
|
|
224
|
+
"""
|
|
225
|
+
Validate EARS requirement completeness.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
requirement: Requirement text to validate
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Dict with validation results: {is_valid, errors, missing_elements, suggestions}
|
|
232
|
+
"""
|
|
233
|
+
parser = EARSParser()
|
|
234
|
+
parsed = parser.parse(requirement)
|
|
235
|
+
|
|
236
|
+
errors = []
|
|
237
|
+
missing_elements = []
|
|
238
|
+
suggestions = []
|
|
239
|
+
is_valid = True
|
|
240
|
+
|
|
241
|
+
# Check if requirement is empty
|
|
242
|
+
if not requirement or not requirement.strip():
|
|
243
|
+
return {
|
|
244
|
+
"is_valid": False,
|
|
245
|
+
"errors": ["Requirement text is empty"],
|
|
246
|
+
"missing_elements": ["When", "Then"],
|
|
247
|
+
"suggestions": ["Provide a complete EARS requirement with When and Then clauses"],
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
# Check for required elements based on pattern type
|
|
251
|
+
pattern_type = parsed.pattern_type
|
|
252
|
+
req_lower = requirement.lower()
|
|
253
|
+
|
|
254
|
+
# Check for basic EARS keywords if pattern was identified
|
|
255
|
+
if pattern_type != "unknown":
|
|
256
|
+
required = self.PATTERN_REQUIREMENTS.get(pattern_type, [])
|
|
257
|
+
for element in required:
|
|
258
|
+
if not getattr(parsed, element, None):
|
|
259
|
+
# Use 'When' for 'trigger', 'Where' for 'condition', etc.
|
|
260
|
+
element_name = {
|
|
261
|
+
"trigger": "When",
|
|
262
|
+
"condition": "Where",
|
|
263
|
+
"result": "Then",
|
|
264
|
+
"agent": "Agent",
|
|
265
|
+
"scenario": "Scenario",
|
|
266
|
+
}.get(element, element.capitalize())
|
|
267
|
+
missing_elements.append(element_name)
|
|
268
|
+
is_valid = False
|
|
269
|
+
else:
|
|
270
|
+
# For unknown patterns, suggest missing keywords
|
|
271
|
+
if "when" not in req_lower and "as a" not in req_lower:
|
|
272
|
+
missing_elements.append("When")
|
|
273
|
+
is_valid = False
|
|
274
|
+
if "then" not in req_lower:
|
|
275
|
+
missing_elements.append("Then")
|
|
276
|
+
is_valid = False
|
|
277
|
+
|
|
278
|
+
# Check for vague language
|
|
279
|
+
for weak in self.WEAK_KEYWORDS:
|
|
280
|
+
if weak in req_lower:
|
|
281
|
+
errors.append(f"Weak keyword '{weak}' found - use 'shall' instead")
|
|
282
|
+
suggestions.append(f"Replace '{weak}' with 'shall'")
|
|
283
|
+
is_valid = False
|
|
284
|
+
|
|
285
|
+
# Check if pattern was identified
|
|
286
|
+
if pattern_type == "unknown":
|
|
287
|
+
errors.append("Could not identify EARS pattern (Event/Agent/Scenario/Validation)")
|
|
288
|
+
suggestions.append("Use clear EARS keywords: When, As a, Where, Then")
|
|
289
|
+
is_valid = False
|
|
290
|
+
|
|
291
|
+
# Suggest improvements
|
|
292
|
+
if not parsed.trigger and not parsed.agent:
|
|
293
|
+
suggestions.append("Add 'When...' (event) or 'As a...' (agent) clause")
|
|
294
|
+
if "When" not in missing_elements:
|
|
295
|
+
missing_elements.append("When")
|
|
296
|
+
if not parsed.result:
|
|
297
|
+
suggestions.append("Add 'Then...' clause describing expected result")
|
|
298
|
+
|
|
299
|
+
return {
|
|
300
|
+
"is_valid": is_valid,
|
|
301
|
+
"errors": errors,
|
|
302
|
+
"missing_elements": missing_elements,
|
|
303
|
+
"suggestions": suggestions,
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
def analyze(self, requirement: str) -> Dict[str, Any]:
|
|
307
|
+
"""
|
|
308
|
+
Analyze requirement and extract metadata.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
requirement: Requirement text
|
|
312
|
+
|
|
313
|
+
Returns:
|
|
314
|
+
Dict with analysis results including priority
|
|
315
|
+
"""
|
|
316
|
+
validation = self.validate(requirement)
|
|
317
|
+
req_lower = requirement.lower()
|
|
318
|
+
|
|
319
|
+
# Assign priority based on requirement type
|
|
320
|
+
priority = 5 # Default
|
|
321
|
+
|
|
322
|
+
if any(word in req_lower for word in ["security", "authentication", "authorization", "encrypt"]):
|
|
323
|
+
priority = 8
|
|
324
|
+
elif any(word in req_lower for word in ["performance", "optimize", "fast"]):
|
|
325
|
+
priority = 6
|
|
326
|
+
elif any(word in req_lower for word in ["user experience", "ui", "tooltip", "hover"]):
|
|
327
|
+
priority = 4
|
|
328
|
+
elif any(word in req_lower for word in ["core", "critical", "essential"]):
|
|
329
|
+
priority = 9
|
|
330
|
+
elif any(word in req_lower for word in ["nice to have", "optional"]):
|
|
331
|
+
priority = 2
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
"is_valid": validation["is_valid"],
|
|
335
|
+
"priority": priority,
|
|
336
|
+
"errors": validation["errors"],
|
|
337
|
+
"suggestions": validation["suggestions"],
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class EARSAnalyzer:
|
|
342
|
+
"""Analyze EARS requirements and generate test cases."""
|
|
343
|
+
|
|
344
|
+
def generate_test_cases(self, requirement: str) -> List[Dict[str, str]]:
|
|
345
|
+
"""
|
|
346
|
+
Generate test cases from EARS requirement.
|
|
347
|
+
|
|
348
|
+
Args:
|
|
349
|
+
requirement: EARS requirement text
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
List of test case dictionaries with given/when/then structure
|
|
353
|
+
"""
|
|
354
|
+
parser = EARSParser()
|
|
355
|
+
parsed = parser.parse(requirement)
|
|
356
|
+
|
|
357
|
+
test_cases = []
|
|
358
|
+
|
|
359
|
+
# Happy path test
|
|
360
|
+
if parsed.trigger and parsed.result:
|
|
361
|
+
happy_test = {
|
|
362
|
+
"name": "Happy Path",
|
|
363
|
+
"given": f"A requirement with trigger: {parsed.trigger[:50]}",
|
|
364
|
+
"when": parsed.trigger[:100] if parsed.trigger else "trigger occurs",
|
|
365
|
+
"then": parsed.result[:100] if parsed.result else "result occurs",
|
|
366
|
+
}
|
|
367
|
+
test_cases.append(happy_test)
|
|
368
|
+
|
|
369
|
+
# Condition-based test cases
|
|
370
|
+
if parsed.condition:
|
|
371
|
+
valid_condition = {
|
|
372
|
+
"name": "Valid Condition Test",
|
|
373
|
+
"given": f"Condition is met: {parsed.condition[:50]}",
|
|
374
|
+
"when": parsed.trigger[:100] if parsed.trigger else "trigger occurs",
|
|
375
|
+
"then": f"System {parsed.result[:80] if parsed.result else 'responds appropriately'}",
|
|
376
|
+
}
|
|
377
|
+
test_cases.append(valid_condition)
|
|
378
|
+
|
|
379
|
+
# Also create inverse condition test
|
|
380
|
+
invalid_condition = {
|
|
381
|
+
"name": "Invalid Condition Test",
|
|
382
|
+
"given": f"Condition is NOT met: {parsed.condition[:50]}",
|
|
383
|
+
"when": parsed.trigger[:100] if parsed.trigger else "trigger occurs",
|
|
384
|
+
"then": "System handles error appropriately",
|
|
385
|
+
}
|
|
386
|
+
test_cases.append(invalid_condition)
|
|
387
|
+
|
|
388
|
+
# If no test cases were generated, create a basic one
|
|
389
|
+
if not test_cases:
|
|
390
|
+
basic_test = {
|
|
391
|
+
"name": "Basic Test",
|
|
392
|
+
"given": "Requirement is triggered",
|
|
393
|
+
"when": parsed.trigger or "event occurs",
|
|
394
|
+
"then": parsed.result or "expected behavior occurs",
|
|
395
|
+
}
|
|
396
|
+
test_cases.append(basic_test)
|
|
397
|
+
|
|
398
|
+
return test_cases
|
|
399
|
+
|
|
400
|
+
def analyze(self, requirement: str) -> Dict[str, Any]:
|
|
401
|
+
"""
|
|
402
|
+
Complete analysis of EARS requirement.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
requirement: Requirement text
|
|
406
|
+
|
|
407
|
+
Returns:
|
|
408
|
+
Dict with comprehensive analysis
|
|
409
|
+
"""
|
|
410
|
+
parser = EARSParser()
|
|
411
|
+
validator = EARSValidator()
|
|
412
|
+
|
|
413
|
+
parsed = parser.parse(requirement)
|
|
414
|
+
validation = validator.analyze(requirement)
|
|
415
|
+
test_cases = self.generate_test_cases(requirement)
|
|
416
|
+
|
|
417
|
+
return {
|
|
418
|
+
"parsed": {
|
|
419
|
+
"pattern_type": parsed.pattern_type,
|
|
420
|
+
"agent": parsed.agent,
|
|
421
|
+
"trigger": parsed.trigger,
|
|
422
|
+
"condition": parsed.condition,
|
|
423
|
+
"result": parsed.result,
|
|
424
|
+
},
|
|
425
|
+
"priority": validation["priority"],
|
|
426
|
+
"is_valid": validation["is_valid"],
|
|
427
|
+
"errors": validation["errors"],
|
|
428
|
+
"suggestions": validation["suggestions"],
|
|
429
|
+
"test_cases": test_cases,
|
|
430
|
+
"test_count": len(test_cases),
|
|
431
|
+
}
|