tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,786 +1,786 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Designer Agent - API contracts, data models, UI/UX specifications.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import json
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
from ...context7.agent_integration import Context7AgentHelper, get_context7_helper
|
|
10
|
-
from ...core.agent_base import BaseAgent
|
|
11
|
-
from ...core.config import ProjectConfig, load_config
|
|
12
|
-
from ...core.instructions import GenericInstruction
|
|
13
|
-
from ...experts.agent_integration import ExpertSupportMixin
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class DesignerAgent(BaseAgent, ExpertSupportMixin):
|
|
17
|
-
"""
|
|
18
|
-
Designer Agent - API contracts, data models, UI/UX specifications.
|
|
19
|
-
|
|
20
|
-
Permissions: Read, Write, Grep, Glob (no Edit, no Bash)
|
|
21
|
-
|
|
22
|
-
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
23
|
-
- NEVER make up, invent, or fabricate information - Only report verified facts
|
|
24
|
-
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
25
|
-
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
26
|
-
- Distinguish between code paths executing and actual functionality working
|
|
27
|
-
- Admit uncertainty explicitly when you cannot verify
|
|
28
|
-
|
|
29
|
-
Responsibilities:
|
|
30
|
-
- Design API contracts
|
|
31
|
-
- Define data models
|
|
32
|
-
- Create UI/UX specifications
|
|
33
|
-
- Design wireframes (text-based)
|
|
34
|
-
- Define design systems
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
def __init__(self, config: ProjectConfig | None = None):
|
|
38
|
-
super().__init__(
|
|
39
|
-
agent_id="designer", agent_name="Designer Agent", config=config
|
|
40
|
-
)
|
|
41
|
-
if config is None:
|
|
42
|
-
config = load_config()
|
|
43
|
-
self.config = config
|
|
44
|
-
|
|
45
|
-
# Expert registry initialization (required due to multiple inheritance MRO issue)
|
|
46
|
-
# BaseAgent.__init__() doesn't call super().__init__(), so ExpertSupportMixin.__init__()
|
|
47
|
-
# is never called via MRO. We must manually initialize to avoid AttributeError.
|
|
48
|
-
# The registry will be properly initialized in activate() via _initialize_expert_support()
|
|
49
|
-
self.expert_registry: Any | None = None
|
|
50
|
-
|
|
51
|
-
# Initialize Context7 helper
|
|
52
|
-
self.context7: Context7AgentHelper | None = None
|
|
53
|
-
if config:
|
|
54
|
-
self.context7 = get_context7_helper(self, config)
|
|
55
|
-
|
|
56
|
-
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
57
|
-
"""Activate the designer agent with expert support."""
|
|
58
|
-
# Validate that expert_registry attribute exists (safety check)
|
|
59
|
-
if not hasattr(self, 'expert_registry'):
|
|
60
|
-
raise AttributeError(
|
|
61
|
-
f"{self.__class__.__name__}.expert_registry not initialized. "
|
|
62
|
-
"This should not happen if __init__() properly initializes the attribute."
|
|
63
|
-
)
|
|
64
|
-
await super().activate(project_root, offline_mode=offline_mode)
|
|
65
|
-
await self._initialize_expert_support(project_root, offline_mode=offline_mode)
|
|
66
|
-
|
|
67
|
-
def get_commands(self) -> list[dict[str, str]]:
|
|
68
|
-
"""Return available commands for designer agent"""
|
|
69
|
-
base_commands = super().get_commands()
|
|
70
|
-
return base_commands + [
|
|
71
|
-
{
|
|
72
|
-
"command": "*design-api",
|
|
73
|
-
"description": "Design API contracts and endpoints",
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"command": "*design-data-model",
|
|
77
|
-
"description": "Design data models and schemas",
|
|
78
|
-
},
|
|
79
|
-
{"command": "*design-ui", "description": "Design UI/UX specifications"},
|
|
80
|
-
{
|
|
81
|
-
"command": "*create-wireframe",
|
|
82
|
-
"description": "Create wireframe (text-based)",
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
"command": "*define-design-system",
|
|
86
|
-
"description": "Define design system (colors, typography, components)",
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
"command": "*evaluate-design",
|
|
90
|
-
"description": "Evaluate design quality and completeness",
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"command": "*validate-api-consistency",
|
|
94
|
-
"description": "Validate API design consistency with project patterns",
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"command": "*validate-api-nfr",
|
|
98
|
-
"description": "Validate API design against non-functional requirements",
|
|
99
|
-
},
|
|
100
|
-
]
|
|
101
|
-
|
|
102
|
-
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
103
|
-
"""
|
|
104
|
-
Execute designer agent command.
|
|
105
|
-
|
|
106
|
-
Commands:
|
|
107
|
-
- *design-api: Design API contracts
|
|
108
|
-
- *design-data-model: Design data models
|
|
109
|
-
- *design-ui: Design UI/UX specifications
|
|
110
|
-
- *create-wireframe: Create wireframe
|
|
111
|
-
- *define-design-system: Define design system
|
|
112
|
-
- *help: Show help
|
|
113
|
-
"""
|
|
114
|
-
command = command.lstrip("*")
|
|
115
|
-
|
|
116
|
-
if command == "help":
|
|
117
|
-
return {"type": "help", "content": self.format_help()}
|
|
118
|
-
|
|
119
|
-
elif command == "design-api":
|
|
120
|
-
requirements = kwargs.get("requirements", "")
|
|
121
|
-
api_type = kwargs.get("api_type", "REST")
|
|
122
|
-
output_file = kwargs.get("output_file", None)
|
|
123
|
-
generate_doc = kwargs.get("generate_doc", False) or kwargs.get("generate-doc", False)
|
|
124
|
-
generate_code = kwargs.get("generate_code", False) or kwargs.get("generate-code", False)
|
|
125
|
-
code_language = kwargs.get("code_language", "typescript") or kwargs.get("code-language", "typescript")
|
|
126
|
-
output_format = kwargs.get("output_format", "markdown") or kwargs.get("output-format", "markdown")
|
|
127
|
-
|
|
128
|
-
result = await self._design_api(requirements, api_type, output_file)
|
|
129
|
-
|
|
130
|
-
# Generate document if requested
|
|
131
|
-
if generate_doc:
|
|
132
|
-
from ...core.document_generator import DocumentGenerator
|
|
133
|
-
doc_generator = DocumentGenerator(project_root=self._project_root)
|
|
134
|
-
|
|
135
|
-
# Determine output file if not provided
|
|
136
|
-
if not output_file:
|
|
137
|
-
docs_dir = self._project_root / "docs" / "api"
|
|
138
|
-
docs_dir.mkdir(parents=True, exist_ok=True)
|
|
139
|
-
safe_name = "api_design"
|
|
140
|
-
output_file = docs_dir / f"{safe_name}.{output_format if output_format != 'html' else 'html'}"
|
|
141
|
-
|
|
142
|
-
# Generate document
|
|
143
|
-
doc_path = doc_generator.generate_api_design_doc(
|
|
144
|
-
api_data=result,
|
|
145
|
-
output_file=output_file,
|
|
146
|
-
format=output_format,
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
result["document"] = {
|
|
150
|
-
"path": str(doc_path),
|
|
151
|
-
"format": output_format,
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
# Generate code if requested
|
|
155
|
-
if generate_code:
|
|
156
|
-
from ...core.code_generator import CodeGenerator
|
|
157
|
-
code_generator = CodeGenerator(project_root=self._project_root)
|
|
158
|
-
|
|
159
|
-
# Determine code output file
|
|
160
|
-
if code_language == "typescript":
|
|
161
|
-
code_dir = self._project_root / "src" / "api" / "clients"
|
|
162
|
-
code_dir.mkdir(parents=True, exist_ok=True)
|
|
163
|
-
api_name = result.get("name", "ApiClient") or "ApiClient"
|
|
164
|
-
code_file = code_dir / f"{api_name}.ts"
|
|
165
|
-
else:
|
|
166
|
-
code_dir = self._project_root / "src" / "api"
|
|
167
|
-
code_dir.mkdir(parents=True, exist_ok=True)
|
|
168
|
-
api_name = result.get("name", "api_client") or "api_client"
|
|
169
|
-
code_file = code_dir / f"{api_name}.py"
|
|
170
|
-
|
|
171
|
-
# Generate API client code
|
|
172
|
-
try:
|
|
173
|
-
code_path = code_generator.generate_api_client(
|
|
174
|
-
api_data=result,
|
|
175
|
-
output_file=code_file,
|
|
176
|
-
language=code_language,
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
result["code"] = {
|
|
180
|
-
"path": str(code_path),
|
|
181
|
-
"language": code_language,
|
|
182
|
-
}
|
|
183
|
-
except Exception as e:
|
|
184
|
-
result["code_error"] = str(e)
|
|
185
|
-
|
|
186
|
-
return result
|
|
187
|
-
|
|
188
|
-
elif command == "design-data-model":
|
|
189
|
-
requirements = kwargs.get("requirements", "")
|
|
190
|
-
data_source = kwargs.get("data_source", "")
|
|
191
|
-
output_file = kwargs.get("output_file", None)
|
|
192
|
-
generate_code = kwargs.get("generate_code", False) or kwargs.get("generate-code", False)
|
|
193
|
-
code_language = kwargs.get("code_language", "typescript") or kwargs.get("code-language", "typescript")
|
|
194
|
-
|
|
195
|
-
result = await self._design_data_model(requirements, data_source, output_file)
|
|
196
|
-
|
|
197
|
-
# Generate code if requested
|
|
198
|
-
if generate_code:
|
|
199
|
-
from ...core.code_generator import CodeGenerator
|
|
200
|
-
code_generator = CodeGenerator(project_root=self._project_root)
|
|
201
|
-
|
|
202
|
-
# Determine code output file based on language
|
|
203
|
-
if code_language == "typescript":
|
|
204
|
-
code_dir = self._project_root / "src" / "models"
|
|
205
|
-
code_dir.mkdir(parents=True, exist_ok=True)
|
|
206
|
-
model_name = result.get("name", "Model") or "Model"
|
|
207
|
-
code_file = code_dir / f"{model_name}.ts"
|
|
208
|
-
|
|
209
|
-
# Generate TypeScript interface
|
|
210
|
-
try:
|
|
211
|
-
code_path = code_generator.generate_typescript_interface(
|
|
212
|
-
interface_data=result,
|
|
213
|
-
output_file=code_file,
|
|
214
|
-
)
|
|
215
|
-
result["code"] = {
|
|
216
|
-
"path": str(code_path),
|
|
217
|
-
"language": code_language,
|
|
218
|
-
"type": "interface",
|
|
219
|
-
}
|
|
220
|
-
except Exception as e:
|
|
221
|
-
result["code_error"] = str(e)
|
|
222
|
-
elif code_language == "python":
|
|
223
|
-
code_dir = self._project_root / "src" / "models"
|
|
224
|
-
code_dir.mkdir(parents=True, exist_ok=True)
|
|
225
|
-
model_name = result.get("name", "model") or "model"
|
|
226
|
-
code_file = code_dir / f"{model_name}.py"
|
|
227
|
-
|
|
228
|
-
# Generate Python class
|
|
229
|
-
try:
|
|
230
|
-
code_path = code_generator.generate_python_class(
|
|
231
|
-
class_data=result,
|
|
232
|
-
output_file=code_file,
|
|
233
|
-
)
|
|
234
|
-
result["code"] = {
|
|
235
|
-
"path": str(code_path),
|
|
236
|
-
"language": code_language,
|
|
237
|
-
"type": "class",
|
|
238
|
-
}
|
|
239
|
-
except Exception as e:
|
|
240
|
-
result["code_error"] = str(e)
|
|
241
|
-
|
|
242
|
-
return result
|
|
243
|
-
|
|
244
|
-
elif command == "design-ui":
|
|
245
|
-
feature_description = kwargs.get("feature_description", "")
|
|
246
|
-
user_stories = kwargs.get("user_stories", [])
|
|
247
|
-
output_file = kwargs.get("output_file", None)
|
|
248
|
-
|
|
249
|
-
return await self._design_ui(feature_description, user_stories, output_file)
|
|
250
|
-
|
|
251
|
-
elif command == "create-wireframe":
|
|
252
|
-
screen_description = kwargs.get("screen_description", "")
|
|
253
|
-
wireframe_type = kwargs.get("wireframe_type", "page")
|
|
254
|
-
output_file = kwargs.get("output_file", None)
|
|
255
|
-
|
|
256
|
-
return await self._create_wireframe(
|
|
257
|
-
screen_description, wireframe_type, output_file
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
elif command == "define-design-system":
|
|
261
|
-
project_description = kwargs.get("project_description", "")
|
|
262
|
-
brand_guidelines = kwargs.get("brand_guidelines", "")
|
|
263
|
-
output_file = kwargs.get("output_file", None)
|
|
264
|
-
|
|
265
|
-
return await self._define_design_system(
|
|
266
|
-
project_description, brand_guidelines, output_file
|
|
267
|
-
)
|
|
268
|
-
|
|
269
|
-
elif command == "evaluate-design":
|
|
270
|
-
design = kwargs.get("design", {})
|
|
271
|
-
if isinstance(design, str):
|
|
272
|
-
design_path = Path(design)
|
|
273
|
-
if design_path.exists():
|
|
274
|
-
import json
|
|
275
|
-
design = json.loads(design_path.read_text(encoding="utf-8"))
|
|
276
|
-
else:
|
|
277
|
-
return {"error": f"Design file not found: {design}"}
|
|
278
|
-
|
|
279
|
-
return await self._evaluate_design(design)
|
|
280
|
-
|
|
281
|
-
elif command == "validate-api-consistency":
|
|
282
|
-
api_design = kwargs.get("api_design", {})
|
|
283
|
-
project_patterns = kwargs.get("project_patterns", {})
|
|
284
|
-
|
|
285
|
-
if isinstance(api_design, str):
|
|
286
|
-
api_path = Path(api_design)
|
|
287
|
-
if api_path.exists():
|
|
288
|
-
import json
|
|
289
|
-
api_design = json.loads(api_path.read_text(encoding="utf-8"))
|
|
290
|
-
else:
|
|
291
|
-
return {"error": f"API design file not found: {api_design}"}
|
|
292
|
-
|
|
293
|
-
return await self._validate_api_consistency(api_design, project_patterns)
|
|
294
|
-
|
|
295
|
-
elif command == "validate-api-nfr":
|
|
296
|
-
api_design = kwargs.get("api_design", {})
|
|
297
|
-
nfr_requirements = kwargs.get("nfr_requirements", {})
|
|
298
|
-
|
|
299
|
-
if isinstance(api_design, str):
|
|
300
|
-
api_path = Path(api_design)
|
|
301
|
-
if api_path.exists():
|
|
302
|
-
import json
|
|
303
|
-
api_design = json.loads(api_path.read_text(encoding="utf-8"))
|
|
304
|
-
else:
|
|
305
|
-
return {"error": f"API design file not found: {api_design}"}
|
|
306
|
-
|
|
307
|
-
if isinstance(nfr_requirements, str):
|
|
308
|
-
nfr_path = Path(nfr_requirements)
|
|
309
|
-
if nfr_path.exists():
|
|
310
|
-
import json
|
|
311
|
-
nfr_requirements = json.loads(nfr_path.read_text(encoding="utf-8"))
|
|
312
|
-
else:
|
|
313
|
-
return {"error": f"NFR requirements file not found: {nfr_requirements}"}
|
|
314
|
-
|
|
315
|
-
return await self._validate_api_nfr(api_design, nfr_requirements)
|
|
316
|
-
|
|
317
|
-
else:
|
|
318
|
-
return {"error": f"Unknown command: {command}"}
|
|
319
|
-
|
|
320
|
-
async def _design_api(
|
|
321
|
-
self,
|
|
322
|
-
requirements: str,
|
|
323
|
-
api_type: str = "REST",
|
|
324
|
-
output_file: str | None = None,
|
|
325
|
-
) -> dict[str, Any]:
|
|
326
|
-
"""Design API contracts and endpoints."""
|
|
327
|
-
if not requirements:
|
|
328
|
-
return {"error": "requirements is required"}
|
|
329
|
-
|
|
330
|
-
# Consult Data Privacy expert for API design
|
|
331
|
-
privacy_guidance = ""
|
|
332
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
333
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
334
|
-
privacy_consultation = await self.expert_registry.consult(
|
|
335
|
-
query=f"Provide data privacy and security best practices for designing a {api_type} API with the following requirements: {requirements[:500]}",
|
|
336
|
-
domain="data-privacy-compliance",
|
|
337
|
-
agent_id=self.agent_id,
|
|
338
|
-
prioritize_builtin=True,
|
|
339
|
-
)
|
|
340
|
-
if (
|
|
341
|
-
privacy_consultation.confidence
|
|
342
|
-
>= privacy_consultation.confidence_threshold
|
|
343
|
-
):
|
|
344
|
-
privacy_guidance = privacy_consultation.weighted_answer
|
|
345
|
-
|
|
346
|
-
privacy_guidance_section = (
|
|
347
|
-
f"Data Privacy Expert Guidance:\n{privacy_guidance}\n"
|
|
348
|
-
if privacy_guidance
|
|
349
|
-
else ""
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
prompt = f"""Design an API contract for the following requirements.
|
|
353
|
-
|
|
354
|
-
Requirements:
|
|
355
|
-
{requirements}
|
|
356
|
-
|
|
357
|
-
API Type: {api_type}
|
|
358
|
-
|
|
359
|
-
{privacy_guidance_section}
|
|
360
|
-
|
|
361
|
-
Provide a comprehensive API design including:
|
|
362
|
-
1. API Overview and Purpose
|
|
363
|
-
2. Base URL and Versioning Strategy
|
|
364
|
-
3. Endpoints (with HTTP methods)
|
|
365
|
-
4. Request/Response Schemas (JSON format)
|
|
366
|
-
5. Authentication & Authorization
|
|
367
|
-
6. Error Handling (error codes and messages)
|
|
368
|
-
7. Rate Limiting
|
|
369
|
-
8. Pagination (if applicable)
|
|
370
|
-
9. Query Parameters
|
|
371
|
-
10. Example Requests/Responses
|
|
372
|
-
|
|
373
|
-
Format as structured JSON with OpenAPI-style specification."""
|
|
374
|
-
|
|
375
|
-
try:
|
|
376
|
-
# Prepare instruction for Cursor Skills
|
|
377
|
-
instruction = GenericInstruction(
|
|
378
|
-
agent_name="designer",
|
|
379
|
-
command="design-api",
|
|
380
|
-
prompt=prompt,
|
|
381
|
-
parameters={
|
|
382
|
-
"api_type": api_type,
|
|
383
|
-
"requirements": requirements,
|
|
384
|
-
"output_file": str(output_file) if output_file else None,
|
|
385
|
-
},
|
|
386
|
-
)
|
|
387
|
-
|
|
388
|
-
return {
|
|
389
|
-
"success": True,
|
|
390
|
-
"instruction": instruction.to_dict(),
|
|
391
|
-
"skill_command": instruction.to_skill_command(),
|
|
392
|
-
}
|
|
393
|
-
except Exception as e:
|
|
394
|
-
return {"error": f"Failed to design API: {str(e)}"}
|
|
395
|
-
|
|
396
|
-
async def _design_data_model(
|
|
397
|
-
self,
|
|
398
|
-
requirements: str,
|
|
399
|
-
data_source: str = "",
|
|
400
|
-
output_file: str | None = None,
|
|
401
|
-
) -> dict[str, Any]:
|
|
402
|
-
"""Design data models and schemas."""
|
|
403
|
-
if not requirements:
|
|
404
|
-
return {"error": "requirements is required"}
|
|
405
|
-
|
|
406
|
-
# Consult Data Privacy expert for data model design
|
|
407
|
-
privacy_guidance = ""
|
|
408
|
-
database_guidance = ""
|
|
409
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
410
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
411
|
-
privacy_consultation = await self.expert_registry.consult(
|
|
412
|
-
query=f"Provide data privacy and security best practices for designing data models with the following requirements: {requirements[:500]}",
|
|
413
|
-
domain="data-privacy-compliance",
|
|
414
|
-
agent_id=self.agent_id,
|
|
415
|
-
prioritize_builtin=True,
|
|
416
|
-
)
|
|
417
|
-
if (
|
|
418
|
-
privacy_consultation.confidence
|
|
419
|
-
>= privacy_consultation.confidence_threshold
|
|
420
|
-
):
|
|
421
|
-
privacy_guidance = privacy_consultation.weighted_answer
|
|
422
|
-
|
|
423
|
-
# Consult Database expert for time-series/InfluxDB patterns (Phase 1.2: HomeIQ Support)
|
|
424
|
-
requirements_lower = requirements.lower()
|
|
425
|
-
if any(keyword in requirements_lower for keyword in ["influxdb", "time-series", "time series", "iot", "sensor", "metrics"]):
|
|
426
|
-
database_consultation = await self.expert_registry.consult(
|
|
427
|
-
query=f"Provide database design patterns for time-series data modeling with the following requirements: {requirements[:500]}",
|
|
428
|
-
domain="database-data-management",
|
|
429
|
-
agent_id=self.agent_id,
|
|
430
|
-
prioritize_builtin=True,
|
|
431
|
-
)
|
|
432
|
-
if (
|
|
433
|
-
database_consultation.confidence
|
|
434
|
-
>= database_consultation.confidence_threshold
|
|
435
|
-
):
|
|
436
|
-
database_guidance = database_consultation.weighted_answer
|
|
437
|
-
|
|
438
|
-
privacy_guidance_section = (
|
|
439
|
-
f"Data Privacy Expert Guidance:\n{privacy_guidance}\n"
|
|
440
|
-
if privacy_guidance
|
|
441
|
-
else ""
|
|
442
|
-
)
|
|
443
|
-
database_guidance_section = (
|
|
444
|
-
f"Database Expert Guidance (Time-Series/InfluxDB):\n{database_guidance}\n"
|
|
445
|
-
if database_guidance
|
|
446
|
-
else ""
|
|
447
|
-
)
|
|
448
|
-
|
|
449
|
-
prompt = f"""Design data models and schemas for the following requirements.
|
|
450
|
-
|
|
451
|
-
Requirements:
|
|
452
|
-
{requirements}
|
|
453
|
-
|
|
454
|
-
{f"Data Source: {data_source}" if data_source else ""}
|
|
455
|
-
|
|
456
|
-
{privacy_guidance_section}
|
|
457
|
-
{database_guidance_section}
|
|
458
|
-
|
|
459
|
-
Provide comprehensive data model design including:
|
|
460
|
-
1. Entity Relationship Overview
|
|
461
|
-
2. Data Models/Entities (with attributes)
|
|
462
|
-
3. Data Types and Constraints
|
|
463
|
-
4. Relationships (one-to-one, one-to-many, many-to-many)
|
|
464
|
-
5. Indexes and Keys
|
|
465
|
-
6. Data Validation Rules
|
|
466
|
-
7. Data Migration Considerations
|
|
467
|
-
8. Schema Definition (JSON Schema or similar)
|
|
468
|
-
|
|
469
|
-
Format as structured JSON with detailed data model specification."""
|
|
470
|
-
|
|
471
|
-
try:
|
|
472
|
-
# Prepare instruction for Cursor Skills
|
|
473
|
-
instruction = GenericInstruction(
|
|
474
|
-
agent_name="designer",
|
|
475
|
-
command="design-data-model",
|
|
476
|
-
prompt=prompt,
|
|
477
|
-
parameters={
|
|
478
|
-
"requirements": requirements,
|
|
479
|
-
"data_source": data_source,
|
|
480
|
-
"output_file": str(output_file) if output_file else None,
|
|
481
|
-
},
|
|
482
|
-
)
|
|
483
|
-
|
|
484
|
-
return {
|
|
485
|
-
"success": True,
|
|
486
|
-
"instruction": instruction.to_dict(),
|
|
487
|
-
"skill_command": instruction.to_skill_command(),
|
|
488
|
-
}
|
|
489
|
-
except Exception as e:
|
|
490
|
-
return {"error": f"Failed to design data model: {str(e)}"}
|
|
491
|
-
|
|
492
|
-
async def _design_ui(
|
|
493
|
-
self,
|
|
494
|
-
feature_description: str,
|
|
495
|
-
user_stories: list[str] | None = None,
|
|
496
|
-
output_file: str | None = None,
|
|
497
|
-
) -> dict[str, Any]:
|
|
498
|
-
"""Design UI/UX specifications."""
|
|
499
|
-
if not feature_description:
|
|
500
|
-
return {"error": "feature_description is required"}
|
|
501
|
-
|
|
502
|
-
if user_stories is None:
|
|
503
|
-
user_stories = []
|
|
504
|
-
|
|
505
|
-
# Consult UX and Accessibility experts
|
|
506
|
-
ux_guidance = ""
|
|
507
|
-
accessibility_guidance = ""
|
|
508
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
509
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
510
|
-
ux_consultation = await self.expert_registry.consult(
|
|
511
|
-
query=f"Provide UX best practices for designing UI for: {feature_description[:500]}",
|
|
512
|
-
domain="user-experience",
|
|
513
|
-
agent_id=self.agent_id,
|
|
514
|
-
prioritize_builtin=True,
|
|
515
|
-
)
|
|
516
|
-
if ux_consultation.confidence >= ux_consultation.confidence_threshold:
|
|
517
|
-
ux_guidance = ux_consultation.weighted_answer
|
|
518
|
-
|
|
519
|
-
accessibility_consultation = await self.expert_registry.consult(
|
|
520
|
-
query=f"Provide accessibility best practices for designing UI for: {feature_description[:500]}",
|
|
521
|
-
domain="accessibility",
|
|
522
|
-
agent_id=self.agent_id,
|
|
523
|
-
prioritize_builtin=True,
|
|
524
|
-
)
|
|
525
|
-
if (
|
|
526
|
-
accessibility_consultation.confidence
|
|
527
|
-
>= accessibility_consultation.confidence_threshold
|
|
528
|
-
):
|
|
529
|
-
accessibility_guidance = accessibility_consultation.weighted_answer
|
|
530
|
-
|
|
531
|
-
ux_guidance_section = (
|
|
532
|
-
f"UX Expert Guidance:\n{ux_guidance}\n" if ux_guidance else ""
|
|
533
|
-
)
|
|
534
|
-
accessibility_guidance_section = (
|
|
535
|
-
f"Accessibility Expert Guidance:\n{accessibility_guidance}\n"
|
|
536
|
-
if accessibility_guidance
|
|
537
|
-
else ""
|
|
538
|
-
)
|
|
539
|
-
|
|
540
|
-
prompt = f"""Design UI/UX specifications for the following feature.
|
|
541
|
-
|
|
542
|
-
Feature Description:
|
|
543
|
-
{feature_description}
|
|
544
|
-
|
|
545
|
-
{f"User Stories: {chr(10).join(f'- {story}' for story in user_stories)}" if user_stories else ""}
|
|
546
|
-
|
|
547
|
-
{ux_guidance_section}
|
|
548
|
-
{accessibility_guidance_section}
|
|
549
|
-
|
|
550
|
-
Provide comprehensive UI/UX design including:
|
|
551
|
-
1. User Journey/Flow
|
|
552
|
-
2. Screen Layouts
|
|
553
|
-
3. User Interactions
|
|
554
|
-
4. Navigation Structure
|
|
555
|
-
5. Accessibility Requirements
|
|
556
|
-
6. Responsive Design Considerations
|
|
557
|
-
7. UI Components Needed
|
|
558
|
-
8. User Feedback Mechanisms
|
|
559
|
-
9. Error States and Handling
|
|
560
|
-
10. Loading States
|
|
561
|
-
|
|
562
|
-
Format as structured JSON with detailed UI/UX specification."""
|
|
563
|
-
|
|
564
|
-
try:
|
|
565
|
-
# Prepare instruction for Cursor Skills
|
|
566
|
-
instruction = GenericInstruction(
|
|
567
|
-
agent_name="designer",
|
|
568
|
-
command="design-ui",
|
|
569
|
-
prompt=prompt,
|
|
570
|
-
parameters={
|
|
571
|
-
"feature": feature_description,
|
|
572
|
-
"user_stories": user_stories,
|
|
573
|
-
"output_file": str(output_file) if output_file else None,
|
|
574
|
-
},
|
|
575
|
-
)
|
|
576
|
-
|
|
577
|
-
return {
|
|
578
|
-
"success": True,
|
|
579
|
-
"instruction": instruction.to_dict(),
|
|
580
|
-
"skill_command": instruction.to_skill_command(),
|
|
581
|
-
}
|
|
582
|
-
except Exception as e:
|
|
583
|
-
return {"error": f"Failed to design UI: {str(e)}"}
|
|
584
|
-
|
|
585
|
-
async def _create_wireframe(
|
|
586
|
-
self,
|
|
587
|
-
screen_description: str,
|
|
588
|
-
wireframe_type: str = "page",
|
|
589
|
-
output_file: str | None = None,
|
|
590
|
-
) -> dict[str, Any]:
|
|
591
|
-
"""Create wireframe (text-based)."""
|
|
592
|
-
if not screen_description:
|
|
593
|
-
return {"error": "screen_description is required"}
|
|
594
|
-
|
|
595
|
-
prompt = f"""Create a text-based wireframe for the following screen.
|
|
596
|
-
|
|
597
|
-
Screen Description:
|
|
598
|
-
{screen_description}
|
|
599
|
-
|
|
600
|
-
Wireframe Type: {wireframe_type}
|
|
601
|
-
|
|
602
|
-
Provide a clear, ASCII/text-based wireframe that can be rendered in markdown or plain text.
|
|
603
|
-
Use boxes, lines, and labels to represent:
|
|
604
|
-
- Layout structure
|
|
605
|
-
- UI components
|
|
606
|
-
- Content areas
|
|
607
|
-
- Navigation elements
|
|
608
|
-
- Interactive elements
|
|
609
|
-
|
|
610
|
-
Include:
|
|
611
|
-
1. Wireframe (ASCII/text format)
|
|
612
|
-
2. Component Labels
|
|
613
|
-
3. Layout Explanation
|
|
614
|
-
4. User Flow Notes
|
|
615
|
-
|
|
616
|
-
Format as structured content."""
|
|
617
|
-
|
|
618
|
-
try:
|
|
619
|
-
# Prepare instruction for Cursor Skills
|
|
620
|
-
instruction = GenericInstruction(
|
|
621
|
-
agent_name="designer",
|
|
622
|
-
command="create-wireframe",
|
|
623
|
-
prompt=prompt,
|
|
624
|
-
parameters={
|
|
625
|
-
"type": wireframe_type,
|
|
626
|
-
"screen": screen_description,
|
|
627
|
-
"output_file": str(output_file) if output_file else None,
|
|
628
|
-
},
|
|
629
|
-
)
|
|
630
|
-
|
|
631
|
-
return {
|
|
632
|
-
"success": True,
|
|
633
|
-
"instruction": instruction.to_dict(),
|
|
634
|
-
"skill_command": instruction.to_skill_command(),
|
|
635
|
-
}
|
|
636
|
-
except Exception as e:
|
|
637
|
-
return {"error": f"Failed to create wireframe: {str(e)}"}
|
|
638
|
-
|
|
639
|
-
async def _define_design_system(
|
|
640
|
-
self,
|
|
641
|
-
project_description: str,
|
|
642
|
-
brand_guidelines: str = "",
|
|
643
|
-
output_file: str | None = None,
|
|
644
|
-
) -> dict[str, Any]:
|
|
645
|
-
"""Define design system (colors, typography, components)."""
|
|
646
|
-
if not project_description:
|
|
647
|
-
return {"error": "project_description is required"}
|
|
648
|
-
|
|
649
|
-
# Consult UX and Accessibility experts
|
|
650
|
-
ux_guidance = ""
|
|
651
|
-
accessibility_guidance = ""
|
|
652
|
-
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
653
|
-
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
654
|
-
ux_consultation = await self.expert_registry.consult(
|
|
655
|
-
query=f"Provide UX best practices for defining a design system for: {project_description[:500]}",
|
|
656
|
-
domain="user-experience",
|
|
657
|
-
agent_id=self.agent_id,
|
|
658
|
-
prioritize_builtin=True,
|
|
659
|
-
)
|
|
660
|
-
if ux_consultation.confidence >= ux_consultation.confidence_threshold:
|
|
661
|
-
ux_guidance = ux_consultation.weighted_answer
|
|
662
|
-
|
|
663
|
-
accessibility_consultation = await self.expert_registry.consult(
|
|
664
|
-
query=f"Provide accessibility best practices for defining a design system for: {project_description[:500]}",
|
|
665
|
-
domain="accessibility",
|
|
666
|
-
agent_id=self.agent_id,
|
|
667
|
-
prioritize_builtin=True,
|
|
668
|
-
)
|
|
669
|
-
if (
|
|
670
|
-
accessibility_consultation.confidence
|
|
671
|
-
>= accessibility_consultation.confidence_threshold
|
|
672
|
-
):
|
|
673
|
-
accessibility_guidance = accessibility_consultation.weighted_answer
|
|
674
|
-
|
|
675
|
-
ux_guidance_section = (
|
|
676
|
-
f"UX Expert Guidance:\n{ux_guidance}\n" if ux_guidance else ""
|
|
677
|
-
)
|
|
678
|
-
accessibility_guidance_section = (
|
|
679
|
-
f"Accessibility Expert Guidance:\n{accessibility_guidance}\n"
|
|
680
|
-
if accessibility_guidance
|
|
681
|
-
else ""
|
|
682
|
-
)
|
|
683
|
-
|
|
684
|
-
prompt = f"""Define a design system for the following project.
|
|
685
|
-
|
|
686
|
-
Project Description:
|
|
687
|
-
{project_description}
|
|
688
|
-
|
|
689
|
-
{f"Brand Guidelines: {brand_guidelines}" if brand_guidelines else ""}
|
|
690
|
-
|
|
691
|
-
{ux_guidance_section}
|
|
692
|
-
{accessibility_guidance_section}
|
|
693
|
-
|
|
694
|
-
Provide comprehensive design system including:
|
|
695
|
-
1. Color Palette (primary, secondary, accent, neutral)
|
|
696
|
-
2. Typography (font families, sizes, weights, line heights)
|
|
697
|
-
3. Spacing System (margins, padding, grid)
|
|
698
|
-
4. Component Library (buttons, forms, cards, etc.)
|
|
699
|
-
5. Iconography
|
|
700
|
-
6. Imagery Guidelines
|
|
701
|
-
7. Animation/Transition Guidelines
|
|
702
|
-
8. Accessibility Standards
|
|
703
|
-
9. Design Tokens
|
|
704
|
-
|
|
705
|
-
Format as structured JSON with detailed design system specification."""
|
|
706
|
-
|
|
707
|
-
try:
|
|
708
|
-
# Prepare instruction for Cursor Skills
|
|
709
|
-
instruction = GenericInstruction(
|
|
710
|
-
agent_name="designer",
|
|
711
|
-
command="create-design-system",
|
|
712
|
-
prompt=prompt,
|
|
713
|
-
parameters={
|
|
714
|
-
"project": project_description,
|
|
715
|
-
"brand_guidelines": brand_guidelines,
|
|
716
|
-
"output_file": str(output_file) if output_file else None,
|
|
717
|
-
},
|
|
718
|
-
)
|
|
719
|
-
|
|
720
|
-
# Save to file if specified
|
|
721
|
-
if output_file:
|
|
722
|
-
output_path = Path(output_file)
|
|
723
|
-
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
724
|
-
output_path.write_text(json.dumps(design_system, indent=2))
|
|
725
|
-
design_system["output_file"] = str(output_path)
|
|
726
|
-
|
|
727
|
-
return {"success": True, "design_system": design_system}
|
|
728
|
-
except Exception as e:
|
|
729
|
-
return {"error": f"Failed to define design system: {str(e)}"}
|
|
730
|
-
|
|
731
|
-
async def _evaluate_design(self, design: dict[str, Any]) -> dict[str, Any]:
|
|
732
|
-
"""Evaluate design quality and completeness."""
|
|
733
|
-
# Basic evaluation - can be enhanced with more sophisticated analysis
|
|
734
|
-
score = {
|
|
735
|
-
"overall": 75.0, # Placeholder
|
|
736
|
-
"endpoints_defined": len(design.get("endpoints", [])) > 0,
|
|
737
|
-
"schemas_defined": len(design.get("schemas", [])) > 0,
|
|
738
|
-
"authentication_specified": "auth" in str(design).lower(),
|
|
739
|
-
"documentation_present": "description" in str(design).lower() or "docs" in str(design).lower(),
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
return {
|
|
743
|
-
"success": True,
|
|
744
|
-
"score": score,
|
|
745
|
-
"design": design,
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
async def _validate_api_consistency(
|
|
749
|
-
self, api_design: dict[str, Any], project_patterns: dict[str, Any] | None = None
|
|
750
|
-
) -> dict[str, Any]:
|
|
751
|
-
"""Validate API design consistency with project patterns."""
|
|
752
|
-
from ...core.design_validator import DesignValidator
|
|
753
|
-
|
|
754
|
-
validator = DesignValidator()
|
|
755
|
-
result = validator.validate_api_consistency(api_design, project_patterns)
|
|
756
|
-
|
|
757
|
-
return {
|
|
758
|
-
"success": True,
|
|
759
|
-
"is_consistent": result.is_consistent,
|
|
760
|
-
"violations": result.violations,
|
|
761
|
-
"pattern_deviations": result.pattern_deviations,
|
|
762
|
-
"naming_inconsistencies": result.naming_inconsistencies,
|
|
763
|
-
"recommendations": result.recommendations,
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
async def _validate_api_nfr(
|
|
767
|
-
self, api_design: dict[str, Any], nfr_requirements: dict[str, Any]
|
|
768
|
-
) -> dict[str, Any]:
|
|
769
|
-
"""Validate API design against non-functional requirements."""
|
|
770
|
-
from ...core.nfr_validator import NFRValidator
|
|
771
|
-
|
|
772
|
-
validator = NFRValidator()
|
|
773
|
-
result = validator.validate_api_nfr(api_design, nfr_requirements)
|
|
774
|
-
|
|
775
|
-
return {
|
|
776
|
-
"success": True,
|
|
777
|
-
"is_valid": result.is_valid,
|
|
778
|
-
"overall_score": result.overall_score,
|
|
779
|
-
"security_score": result.security_score,
|
|
780
|
-
"performance_score": result.performance_score,
|
|
781
|
-
"reliability_score": result.reliability_score,
|
|
782
|
-
"maintainability_score": result.maintainability_score,
|
|
783
|
-
"security_issues": result.security_issues,
|
|
784
|
-
"performance_issues": result.performance_issues,
|
|
785
|
-
"recommendations": result.recommendations,
|
|
786
|
-
}
|
|
1
|
+
"""
|
|
2
|
+
Designer Agent - API contracts, data models, UI/UX specifications.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from ...context7.agent_integration import Context7AgentHelper, get_context7_helper
|
|
10
|
+
from ...core.agent_base import BaseAgent
|
|
11
|
+
from ...core.config import ProjectConfig, load_config
|
|
12
|
+
from ...core.instructions import GenericInstruction
|
|
13
|
+
from ...experts.agent_integration import ExpertSupportMixin
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DesignerAgent(BaseAgent, ExpertSupportMixin):
|
|
17
|
+
"""
|
|
18
|
+
Designer Agent - API contracts, data models, UI/UX specifications.
|
|
19
|
+
|
|
20
|
+
Permissions: Read, Write, Grep, Glob (no Edit, no Bash)
|
|
21
|
+
|
|
22
|
+
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
23
|
+
- NEVER make up, invent, or fabricate information - Only report verified facts
|
|
24
|
+
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
25
|
+
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
26
|
+
- Distinguish between code paths executing and actual functionality working
|
|
27
|
+
- Admit uncertainty explicitly when you cannot verify
|
|
28
|
+
|
|
29
|
+
Responsibilities:
|
|
30
|
+
- Design API contracts
|
|
31
|
+
- Define data models
|
|
32
|
+
- Create UI/UX specifications
|
|
33
|
+
- Design wireframes (text-based)
|
|
34
|
+
- Define design systems
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, config: ProjectConfig | None = None):
|
|
38
|
+
super().__init__(
|
|
39
|
+
agent_id="designer", agent_name="Designer Agent", config=config
|
|
40
|
+
)
|
|
41
|
+
if config is None:
|
|
42
|
+
config = load_config()
|
|
43
|
+
self.config = config
|
|
44
|
+
|
|
45
|
+
# Expert registry initialization (required due to multiple inheritance MRO issue)
|
|
46
|
+
# BaseAgent.__init__() doesn't call super().__init__(), so ExpertSupportMixin.__init__()
|
|
47
|
+
# is never called via MRO. We must manually initialize to avoid AttributeError.
|
|
48
|
+
# The registry will be properly initialized in activate() via _initialize_expert_support()
|
|
49
|
+
self.expert_registry: Any | None = None
|
|
50
|
+
|
|
51
|
+
# Initialize Context7 helper
|
|
52
|
+
self.context7: Context7AgentHelper | None = None
|
|
53
|
+
if config:
|
|
54
|
+
self.context7 = get_context7_helper(self, config)
|
|
55
|
+
|
|
56
|
+
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
57
|
+
"""Activate the designer agent with expert support."""
|
|
58
|
+
# Validate that expert_registry attribute exists (safety check)
|
|
59
|
+
if not hasattr(self, 'expert_registry'):
|
|
60
|
+
raise AttributeError(
|
|
61
|
+
f"{self.__class__.__name__}.expert_registry not initialized. "
|
|
62
|
+
"This should not happen if __init__() properly initializes the attribute."
|
|
63
|
+
)
|
|
64
|
+
await super().activate(project_root, offline_mode=offline_mode)
|
|
65
|
+
await self._initialize_expert_support(project_root, offline_mode=offline_mode)
|
|
66
|
+
|
|
67
|
+
def get_commands(self) -> list[dict[str, str]]:
|
|
68
|
+
"""Return available commands for designer agent"""
|
|
69
|
+
base_commands = super().get_commands()
|
|
70
|
+
return base_commands + [
|
|
71
|
+
{
|
|
72
|
+
"command": "*design-api",
|
|
73
|
+
"description": "Design API contracts and endpoints",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"command": "*design-data-model",
|
|
77
|
+
"description": "Design data models and schemas",
|
|
78
|
+
},
|
|
79
|
+
{"command": "*design-ui", "description": "Design UI/UX specifications"},
|
|
80
|
+
{
|
|
81
|
+
"command": "*create-wireframe",
|
|
82
|
+
"description": "Create wireframe (text-based)",
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"command": "*define-design-system",
|
|
86
|
+
"description": "Define design system (colors, typography, components)",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"command": "*evaluate-design",
|
|
90
|
+
"description": "Evaluate design quality and completeness",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"command": "*validate-api-consistency",
|
|
94
|
+
"description": "Validate API design consistency with project patterns",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"command": "*validate-api-nfr",
|
|
98
|
+
"description": "Validate API design against non-functional requirements",
|
|
99
|
+
},
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
103
|
+
"""
|
|
104
|
+
Execute designer agent command.
|
|
105
|
+
|
|
106
|
+
Commands:
|
|
107
|
+
- *design-api: Design API contracts
|
|
108
|
+
- *design-data-model: Design data models
|
|
109
|
+
- *design-ui: Design UI/UX specifications
|
|
110
|
+
- *create-wireframe: Create wireframe
|
|
111
|
+
- *define-design-system: Define design system
|
|
112
|
+
- *help: Show help
|
|
113
|
+
"""
|
|
114
|
+
command = command.lstrip("*")
|
|
115
|
+
|
|
116
|
+
if command == "help":
|
|
117
|
+
return {"type": "help", "content": self.format_help()}
|
|
118
|
+
|
|
119
|
+
elif command == "design-api":
|
|
120
|
+
requirements = kwargs.get("requirements", "")
|
|
121
|
+
api_type = kwargs.get("api_type", "REST")
|
|
122
|
+
output_file = kwargs.get("output_file", None)
|
|
123
|
+
generate_doc = kwargs.get("generate_doc", False) or kwargs.get("generate-doc", False)
|
|
124
|
+
generate_code = kwargs.get("generate_code", False) or kwargs.get("generate-code", False)
|
|
125
|
+
code_language = kwargs.get("code_language", "typescript") or kwargs.get("code-language", "typescript")
|
|
126
|
+
output_format = kwargs.get("output_format", "markdown") or kwargs.get("output-format", "markdown")
|
|
127
|
+
|
|
128
|
+
result = await self._design_api(requirements, api_type, output_file)
|
|
129
|
+
|
|
130
|
+
# Generate document if requested
|
|
131
|
+
if generate_doc:
|
|
132
|
+
from ...core.document_generator import DocumentGenerator
|
|
133
|
+
doc_generator = DocumentGenerator(project_root=self._project_root)
|
|
134
|
+
|
|
135
|
+
# Determine output file if not provided
|
|
136
|
+
if not output_file:
|
|
137
|
+
docs_dir = self._project_root / "docs" / "api"
|
|
138
|
+
docs_dir.mkdir(parents=True, exist_ok=True)
|
|
139
|
+
safe_name = "api_design"
|
|
140
|
+
output_file = docs_dir / f"{safe_name}.{output_format if output_format != 'html' else 'html'}"
|
|
141
|
+
|
|
142
|
+
# Generate document
|
|
143
|
+
doc_path = doc_generator.generate_api_design_doc(
|
|
144
|
+
api_data=result,
|
|
145
|
+
output_file=output_file,
|
|
146
|
+
format=output_format,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
result["document"] = {
|
|
150
|
+
"path": str(doc_path),
|
|
151
|
+
"format": output_format,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
# Generate code if requested
|
|
155
|
+
if generate_code:
|
|
156
|
+
from ...core.code_generator import CodeGenerator
|
|
157
|
+
code_generator = CodeGenerator(project_root=self._project_root)
|
|
158
|
+
|
|
159
|
+
# Determine code output file
|
|
160
|
+
if code_language == "typescript":
|
|
161
|
+
code_dir = self._project_root / "src" / "api" / "clients"
|
|
162
|
+
code_dir.mkdir(parents=True, exist_ok=True)
|
|
163
|
+
api_name = result.get("name", "ApiClient") or "ApiClient"
|
|
164
|
+
code_file = code_dir / f"{api_name}.ts"
|
|
165
|
+
else:
|
|
166
|
+
code_dir = self._project_root / "src" / "api"
|
|
167
|
+
code_dir.mkdir(parents=True, exist_ok=True)
|
|
168
|
+
api_name = result.get("name", "api_client") or "api_client"
|
|
169
|
+
code_file = code_dir / f"{api_name}.py"
|
|
170
|
+
|
|
171
|
+
# Generate API client code
|
|
172
|
+
try:
|
|
173
|
+
code_path = code_generator.generate_api_client(
|
|
174
|
+
api_data=result,
|
|
175
|
+
output_file=code_file,
|
|
176
|
+
language=code_language,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
result["code"] = {
|
|
180
|
+
"path": str(code_path),
|
|
181
|
+
"language": code_language,
|
|
182
|
+
}
|
|
183
|
+
except Exception as e:
|
|
184
|
+
result["code_error"] = str(e)
|
|
185
|
+
|
|
186
|
+
return result
|
|
187
|
+
|
|
188
|
+
elif command == "design-data-model":
|
|
189
|
+
requirements = kwargs.get("requirements", "")
|
|
190
|
+
data_source = kwargs.get("data_source", "")
|
|
191
|
+
output_file = kwargs.get("output_file", None)
|
|
192
|
+
generate_code = kwargs.get("generate_code", False) or kwargs.get("generate-code", False)
|
|
193
|
+
code_language = kwargs.get("code_language", "typescript") or kwargs.get("code-language", "typescript")
|
|
194
|
+
|
|
195
|
+
result = await self._design_data_model(requirements, data_source, output_file)
|
|
196
|
+
|
|
197
|
+
# Generate code if requested
|
|
198
|
+
if generate_code:
|
|
199
|
+
from ...core.code_generator import CodeGenerator
|
|
200
|
+
code_generator = CodeGenerator(project_root=self._project_root)
|
|
201
|
+
|
|
202
|
+
# Determine code output file based on language
|
|
203
|
+
if code_language == "typescript":
|
|
204
|
+
code_dir = self._project_root / "src" / "models"
|
|
205
|
+
code_dir.mkdir(parents=True, exist_ok=True)
|
|
206
|
+
model_name = result.get("name", "Model") or "Model"
|
|
207
|
+
code_file = code_dir / f"{model_name}.ts"
|
|
208
|
+
|
|
209
|
+
# Generate TypeScript interface
|
|
210
|
+
try:
|
|
211
|
+
code_path = code_generator.generate_typescript_interface(
|
|
212
|
+
interface_data=result,
|
|
213
|
+
output_file=code_file,
|
|
214
|
+
)
|
|
215
|
+
result["code"] = {
|
|
216
|
+
"path": str(code_path),
|
|
217
|
+
"language": code_language,
|
|
218
|
+
"type": "interface",
|
|
219
|
+
}
|
|
220
|
+
except Exception as e:
|
|
221
|
+
result["code_error"] = str(e)
|
|
222
|
+
elif code_language == "python":
|
|
223
|
+
code_dir = self._project_root / "src" / "models"
|
|
224
|
+
code_dir.mkdir(parents=True, exist_ok=True)
|
|
225
|
+
model_name = result.get("name", "model") or "model"
|
|
226
|
+
code_file = code_dir / f"{model_name}.py"
|
|
227
|
+
|
|
228
|
+
# Generate Python class
|
|
229
|
+
try:
|
|
230
|
+
code_path = code_generator.generate_python_class(
|
|
231
|
+
class_data=result,
|
|
232
|
+
output_file=code_file,
|
|
233
|
+
)
|
|
234
|
+
result["code"] = {
|
|
235
|
+
"path": str(code_path),
|
|
236
|
+
"language": code_language,
|
|
237
|
+
"type": "class",
|
|
238
|
+
}
|
|
239
|
+
except Exception as e:
|
|
240
|
+
result["code_error"] = str(e)
|
|
241
|
+
|
|
242
|
+
return result
|
|
243
|
+
|
|
244
|
+
elif command == "design-ui":
|
|
245
|
+
feature_description = kwargs.get("feature_description", "")
|
|
246
|
+
user_stories = kwargs.get("user_stories", [])
|
|
247
|
+
output_file = kwargs.get("output_file", None)
|
|
248
|
+
|
|
249
|
+
return await self._design_ui(feature_description, user_stories, output_file)
|
|
250
|
+
|
|
251
|
+
elif command == "create-wireframe":
|
|
252
|
+
screen_description = kwargs.get("screen_description", "")
|
|
253
|
+
wireframe_type = kwargs.get("wireframe_type", "page")
|
|
254
|
+
output_file = kwargs.get("output_file", None)
|
|
255
|
+
|
|
256
|
+
return await self._create_wireframe(
|
|
257
|
+
screen_description, wireframe_type, output_file
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
elif command == "define-design-system":
|
|
261
|
+
project_description = kwargs.get("project_description", "")
|
|
262
|
+
brand_guidelines = kwargs.get("brand_guidelines", "")
|
|
263
|
+
output_file = kwargs.get("output_file", None)
|
|
264
|
+
|
|
265
|
+
return await self._define_design_system(
|
|
266
|
+
project_description, brand_guidelines, output_file
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
elif command == "evaluate-design":
|
|
270
|
+
design = kwargs.get("design", {})
|
|
271
|
+
if isinstance(design, str):
|
|
272
|
+
design_path = Path(design)
|
|
273
|
+
if design_path.exists():
|
|
274
|
+
import json
|
|
275
|
+
design = json.loads(design_path.read_text(encoding="utf-8"))
|
|
276
|
+
else:
|
|
277
|
+
return {"error": f"Design file not found: {design}"}
|
|
278
|
+
|
|
279
|
+
return await self._evaluate_design(design)
|
|
280
|
+
|
|
281
|
+
elif command == "validate-api-consistency":
|
|
282
|
+
api_design = kwargs.get("api_design", {})
|
|
283
|
+
project_patterns = kwargs.get("project_patterns", {})
|
|
284
|
+
|
|
285
|
+
if isinstance(api_design, str):
|
|
286
|
+
api_path = Path(api_design)
|
|
287
|
+
if api_path.exists():
|
|
288
|
+
import json
|
|
289
|
+
api_design = json.loads(api_path.read_text(encoding="utf-8"))
|
|
290
|
+
else:
|
|
291
|
+
return {"error": f"API design file not found: {api_design}"}
|
|
292
|
+
|
|
293
|
+
return await self._validate_api_consistency(api_design, project_patterns)
|
|
294
|
+
|
|
295
|
+
elif command == "validate-api-nfr":
|
|
296
|
+
api_design = kwargs.get("api_design", {})
|
|
297
|
+
nfr_requirements = kwargs.get("nfr_requirements", {})
|
|
298
|
+
|
|
299
|
+
if isinstance(api_design, str):
|
|
300
|
+
api_path = Path(api_design)
|
|
301
|
+
if api_path.exists():
|
|
302
|
+
import json
|
|
303
|
+
api_design = json.loads(api_path.read_text(encoding="utf-8"))
|
|
304
|
+
else:
|
|
305
|
+
return {"error": f"API design file not found: {api_design}"}
|
|
306
|
+
|
|
307
|
+
if isinstance(nfr_requirements, str):
|
|
308
|
+
nfr_path = Path(nfr_requirements)
|
|
309
|
+
if nfr_path.exists():
|
|
310
|
+
import json
|
|
311
|
+
nfr_requirements = json.loads(nfr_path.read_text(encoding="utf-8"))
|
|
312
|
+
else:
|
|
313
|
+
return {"error": f"NFR requirements file not found: {nfr_requirements}"}
|
|
314
|
+
|
|
315
|
+
return await self._validate_api_nfr(api_design, nfr_requirements)
|
|
316
|
+
|
|
317
|
+
else:
|
|
318
|
+
return {"error": f"Unknown command: {command}"}
|
|
319
|
+
|
|
320
|
+
async def _design_api(
|
|
321
|
+
self,
|
|
322
|
+
requirements: str,
|
|
323
|
+
api_type: str = "REST",
|
|
324
|
+
output_file: str | None = None,
|
|
325
|
+
) -> dict[str, Any]:
|
|
326
|
+
"""Design API contracts and endpoints."""
|
|
327
|
+
if not requirements:
|
|
328
|
+
return {"error": "requirements is required"}
|
|
329
|
+
|
|
330
|
+
# Consult Data Privacy expert for API design
|
|
331
|
+
privacy_guidance = ""
|
|
332
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
333
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
334
|
+
privacy_consultation = await self.expert_registry.consult(
|
|
335
|
+
query=f"Provide data privacy and security best practices for designing a {api_type} API with the following requirements: {requirements[:500]}",
|
|
336
|
+
domain="data-privacy-compliance",
|
|
337
|
+
agent_id=self.agent_id,
|
|
338
|
+
prioritize_builtin=True,
|
|
339
|
+
)
|
|
340
|
+
if (
|
|
341
|
+
privacy_consultation.confidence
|
|
342
|
+
>= privacy_consultation.confidence_threshold
|
|
343
|
+
):
|
|
344
|
+
privacy_guidance = privacy_consultation.weighted_answer
|
|
345
|
+
|
|
346
|
+
privacy_guidance_section = (
|
|
347
|
+
f"Data Privacy Expert Guidance:\n{privacy_guidance}\n"
|
|
348
|
+
if privacy_guidance
|
|
349
|
+
else ""
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
prompt = f"""Design an API contract for the following requirements.
|
|
353
|
+
|
|
354
|
+
Requirements:
|
|
355
|
+
{requirements}
|
|
356
|
+
|
|
357
|
+
API Type: {api_type}
|
|
358
|
+
|
|
359
|
+
{privacy_guidance_section}
|
|
360
|
+
|
|
361
|
+
Provide a comprehensive API design including:
|
|
362
|
+
1. API Overview and Purpose
|
|
363
|
+
2. Base URL and Versioning Strategy
|
|
364
|
+
3. Endpoints (with HTTP methods)
|
|
365
|
+
4. Request/Response Schemas (JSON format)
|
|
366
|
+
5. Authentication & Authorization
|
|
367
|
+
6. Error Handling (error codes and messages)
|
|
368
|
+
7. Rate Limiting
|
|
369
|
+
8. Pagination (if applicable)
|
|
370
|
+
9. Query Parameters
|
|
371
|
+
10. Example Requests/Responses
|
|
372
|
+
|
|
373
|
+
Format as structured JSON with OpenAPI-style specification."""
|
|
374
|
+
|
|
375
|
+
try:
|
|
376
|
+
# Prepare instruction for Cursor Skills
|
|
377
|
+
instruction = GenericInstruction(
|
|
378
|
+
agent_name="designer",
|
|
379
|
+
command="design-api",
|
|
380
|
+
prompt=prompt,
|
|
381
|
+
parameters={
|
|
382
|
+
"api_type": api_type,
|
|
383
|
+
"requirements": requirements,
|
|
384
|
+
"output_file": str(output_file) if output_file else None,
|
|
385
|
+
},
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
return {
|
|
389
|
+
"success": True,
|
|
390
|
+
"instruction": instruction.to_dict(),
|
|
391
|
+
"skill_command": instruction.to_skill_command(),
|
|
392
|
+
}
|
|
393
|
+
except Exception as e:
|
|
394
|
+
return {"error": f"Failed to design API: {str(e)}"}
|
|
395
|
+
|
|
396
|
+
async def _design_data_model(
|
|
397
|
+
self,
|
|
398
|
+
requirements: str,
|
|
399
|
+
data_source: str = "",
|
|
400
|
+
output_file: str | None = None,
|
|
401
|
+
) -> dict[str, Any]:
|
|
402
|
+
"""Design data models and schemas."""
|
|
403
|
+
if not requirements:
|
|
404
|
+
return {"error": "requirements is required"}
|
|
405
|
+
|
|
406
|
+
# Consult Data Privacy expert for data model design
|
|
407
|
+
privacy_guidance = ""
|
|
408
|
+
database_guidance = ""
|
|
409
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
410
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
411
|
+
privacy_consultation = await self.expert_registry.consult(
|
|
412
|
+
query=f"Provide data privacy and security best practices for designing data models with the following requirements: {requirements[:500]}",
|
|
413
|
+
domain="data-privacy-compliance",
|
|
414
|
+
agent_id=self.agent_id,
|
|
415
|
+
prioritize_builtin=True,
|
|
416
|
+
)
|
|
417
|
+
if (
|
|
418
|
+
privacy_consultation.confidence
|
|
419
|
+
>= privacy_consultation.confidence_threshold
|
|
420
|
+
):
|
|
421
|
+
privacy_guidance = privacy_consultation.weighted_answer
|
|
422
|
+
|
|
423
|
+
# Consult Database expert for time-series/InfluxDB patterns (Phase 1.2: HomeIQ Support)
|
|
424
|
+
requirements_lower = requirements.lower()
|
|
425
|
+
if any(keyword in requirements_lower for keyword in ["influxdb", "time-series", "time series", "iot", "sensor", "metrics"]):
|
|
426
|
+
database_consultation = await self.expert_registry.consult(
|
|
427
|
+
query=f"Provide database design patterns for time-series data modeling with the following requirements: {requirements[:500]}",
|
|
428
|
+
domain="database-data-management",
|
|
429
|
+
agent_id=self.agent_id,
|
|
430
|
+
prioritize_builtin=True,
|
|
431
|
+
)
|
|
432
|
+
if (
|
|
433
|
+
database_consultation.confidence
|
|
434
|
+
>= database_consultation.confidence_threshold
|
|
435
|
+
):
|
|
436
|
+
database_guidance = database_consultation.weighted_answer
|
|
437
|
+
|
|
438
|
+
privacy_guidance_section = (
|
|
439
|
+
f"Data Privacy Expert Guidance:\n{privacy_guidance}\n"
|
|
440
|
+
if privacy_guidance
|
|
441
|
+
else ""
|
|
442
|
+
)
|
|
443
|
+
database_guidance_section = (
|
|
444
|
+
f"Database Expert Guidance (Time-Series/InfluxDB):\n{database_guidance}\n"
|
|
445
|
+
if database_guidance
|
|
446
|
+
else ""
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
prompt = f"""Design data models and schemas for the following requirements.
|
|
450
|
+
|
|
451
|
+
Requirements:
|
|
452
|
+
{requirements}
|
|
453
|
+
|
|
454
|
+
{f"Data Source: {data_source}" if data_source else ""}
|
|
455
|
+
|
|
456
|
+
{privacy_guidance_section}
|
|
457
|
+
{database_guidance_section}
|
|
458
|
+
|
|
459
|
+
Provide comprehensive data model design including:
|
|
460
|
+
1. Entity Relationship Overview
|
|
461
|
+
2. Data Models/Entities (with attributes)
|
|
462
|
+
3. Data Types and Constraints
|
|
463
|
+
4. Relationships (one-to-one, one-to-many, many-to-many)
|
|
464
|
+
5. Indexes and Keys
|
|
465
|
+
6. Data Validation Rules
|
|
466
|
+
7. Data Migration Considerations
|
|
467
|
+
8. Schema Definition (JSON Schema or similar)
|
|
468
|
+
|
|
469
|
+
Format as structured JSON with detailed data model specification."""
|
|
470
|
+
|
|
471
|
+
try:
|
|
472
|
+
# Prepare instruction for Cursor Skills
|
|
473
|
+
instruction = GenericInstruction(
|
|
474
|
+
agent_name="designer",
|
|
475
|
+
command="design-data-model",
|
|
476
|
+
prompt=prompt,
|
|
477
|
+
parameters={
|
|
478
|
+
"requirements": requirements,
|
|
479
|
+
"data_source": data_source,
|
|
480
|
+
"output_file": str(output_file) if output_file else None,
|
|
481
|
+
},
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
return {
|
|
485
|
+
"success": True,
|
|
486
|
+
"instruction": instruction.to_dict(),
|
|
487
|
+
"skill_command": instruction.to_skill_command(),
|
|
488
|
+
}
|
|
489
|
+
except Exception as e:
|
|
490
|
+
return {"error": f"Failed to design data model: {str(e)}"}
|
|
491
|
+
|
|
492
|
+
async def _design_ui(
|
|
493
|
+
self,
|
|
494
|
+
feature_description: str,
|
|
495
|
+
user_stories: list[str] | None = None,
|
|
496
|
+
output_file: str | None = None,
|
|
497
|
+
) -> dict[str, Any]:
|
|
498
|
+
"""Design UI/UX specifications."""
|
|
499
|
+
if not feature_description:
|
|
500
|
+
return {"error": "feature_description is required"}
|
|
501
|
+
|
|
502
|
+
if user_stories is None:
|
|
503
|
+
user_stories = []
|
|
504
|
+
|
|
505
|
+
# Consult UX and Accessibility experts
|
|
506
|
+
ux_guidance = ""
|
|
507
|
+
accessibility_guidance = ""
|
|
508
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
509
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
510
|
+
ux_consultation = await self.expert_registry.consult(
|
|
511
|
+
query=f"Provide UX best practices for designing UI for: {feature_description[:500]}",
|
|
512
|
+
domain="user-experience",
|
|
513
|
+
agent_id=self.agent_id,
|
|
514
|
+
prioritize_builtin=True,
|
|
515
|
+
)
|
|
516
|
+
if ux_consultation.confidence >= ux_consultation.confidence_threshold:
|
|
517
|
+
ux_guidance = ux_consultation.weighted_answer
|
|
518
|
+
|
|
519
|
+
accessibility_consultation = await self.expert_registry.consult(
|
|
520
|
+
query=f"Provide accessibility best practices for designing UI for: {feature_description[:500]}",
|
|
521
|
+
domain="accessibility",
|
|
522
|
+
agent_id=self.agent_id,
|
|
523
|
+
prioritize_builtin=True,
|
|
524
|
+
)
|
|
525
|
+
if (
|
|
526
|
+
accessibility_consultation.confidence
|
|
527
|
+
>= accessibility_consultation.confidence_threshold
|
|
528
|
+
):
|
|
529
|
+
accessibility_guidance = accessibility_consultation.weighted_answer
|
|
530
|
+
|
|
531
|
+
ux_guidance_section = (
|
|
532
|
+
f"UX Expert Guidance:\n{ux_guidance}\n" if ux_guidance else ""
|
|
533
|
+
)
|
|
534
|
+
accessibility_guidance_section = (
|
|
535
|
+
f"Accessibility Expert Guidance:\n{accessibility_guidance}\n"
|
|
536
|
+
if accessibility_guidance
|
|
537
|
+
else ""
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
prompt = f"""Design UI/UX specifications for the following feature.
|
|
541
|
+
|
|
542
|
+
Feature Description:
|
|
543
|
+
{feature_description}
|
|
544
|
+
|
|
545
|
+
{f"User Stories: {chr(10).join(f'- {story}' for story in user_stories)}" if user_stories else ""}
|
|
546
|
+
|
|
547
|
+
{ux_guidance_section}
|
|
548
|
+
{accessibility_guidance_section}
|
|
549
|
+
|
|
550
|
+
Provide comprehensive UI/UX design including:
|
|
551
|
+
1. User Journey/Flow
|
|
552
|
+
2. Screen Layouts
|
|
553
|
+
3. User Interactions
|
|
554
|
+
4. Navigation Structure
|
|
555
|
+
5. Accessibility Requirements
|
|
556
|
+
6. Responsive Design Considerations
|
|
557
|
+
7. UI Components Needed
|
|
558
|
+
8. User Feedback Mechanisms
|
|
559
|
+
9. Error States and Handling
|
|
560
|
+
10. Loading States
|
|
561
|
+
|
|
562
|
+
Format as structured JSON with detailed UI/UX specification."""
|
|
563
|
+
|
|
564
|
+
try:
|
|
565
|
+
# Prepare instruction for Cursor Skills
|
|
566
|
+
instruction = GenericInstruction(
|
|
567
|
+
agent_name="designer",
|
|
568
|
+
command="design-ui",
|
|
569
|
+
prompt=prompt,
|
|
570
|
+
parameters={
|
|
571
|
+
"feature": feature_description,
|
|
572
|
+
"user_stories": user_stories,
|
|
573
|
+
"output_file": str(output_file) if output_file else None,
|
|
574
|
+
},
|
|
575
|
+
)
|
|
576
|
+
|
|
577
|
+
return {
|
|
578
|
+
"success": True,
|
|
579
|
+
"instruction": instruction.to_dict(),
|
|
580
|
+
"skill_command": instruction.to_skill_command(),
|
|
581
|
+
}
|
|
582
|
+
except Exception as e:
|
|
583
|
+
return {"error": f"Failed to design UI: {str(e)}"}
|
|
584
|
+
|
|
585
|
+
async def _create_wireframe(
|
|
586
|
+
self,
|
|
587
|
+
screen_description: str,
|
|
588
|
+
wireframe_type: str = "page",
|
|
589
|
+
output_file: str | None = None,
|
|
590
|
+
) -> dict[str, Any]:
|
|
591
|
+
"""Create wireframe (text-based)."""
|
|
592
|
+
if not screen_description:
|
|
593
|
+
return {"error": "screen_description is required"}
|
|
594
|
+
|
|
595
|
+
prompt = f"""Create a text-based wireframe for the following screen.
|
|
596
|
+
|
|
597
|
+
Screen Description:
|
|
598
|
+
{screen_description}
|
|
599
|
+
|
|
600
|
+
Wireframe Type: {wireframe_type}
|
|
601
|
+
|
|
602
|
+
Provide a clear, ASCII/text-based wireframe that can be rendered in markdown or plain text.
|
|
603
|
+
Use boxes, lines, and labels to represent:
|
|
604
|
+
- Layout structure
|
|
605
|
+
- UI components
|
|
606
|
+
- Content areas
|
|
607
|
+
- Navigation elements
|
|
608
|
+
- Interactive elements
|
|
609
|
+
|
|
610
|
+
Include:
|
|
611
|
+
1. Wireframe (ASCII/text format)
|
|
612
|
+
2. Component Labels
|
|
613
|
+
3. Layout Explanation
|
|
614
|
+
4. User Flow Notes
|
|
615
|
+
|
|
616
|
+
Format as structured content."""
|
|
617
|
+
|
|
618
|
+
try:
|
|
619
|
+
# Prepare instruction for Cursor Skills
|
|
620
|
+
instruction = GenericInstruction(
|
|
621
|
+
agent_name="designer",
|
|
622
|
+
command="create-wireframe",
|
|
623
|
+
prompt=prompt,
|
|
624
|
+
parameters={
|
|
625
|
+
"type": wireframe_type,
|
|
626
|
+
"screen": screen_description,
|
|
627
|
+
"output_file": str(output_file) if output_file else None,
|
|
628
|
+
},
|
|
629
|
+
)
|
|
630
|
+
|
|
631
|
+
return {
|
|
632
|
+
"success": True,
|
|
633
|
+
"instruction": instruction.to_dict(),
|
|
634
|
+
"skill_command": instruction.to_skill_command(),
|
|
635
|
+
}
|
|
636
|
+
except Exception as e:
|
|
637
|
+
return {"error": f"Failed to create wireframe: {str(e)}"}
|
|
638
|
+
|
|
639
|
+
async def _define_design_system(
|
|
640
|
+
self,
|
|
641
|
+
project_description: str,
|
|
642
|
+
brand_guidelines: str = "",
|
|
643
|
+
output_file: str | None = None,
|
|
644
|
+
) -> dict[str, Any]:
|
|
645
|
+
"""Define design system (colors, typography, components)."""
|
|
646
|
+
if not project_description:
|
|
647
|
+
return {"error": "project_description is required"}
|
|
648
|
+
|
|
649
|
+
# Consult UX and Accessibility experts
|
|
650
|
+
ux_guidance = ""
|
|
651
|
+
accessibility_guidance = ""
|
|
652
|
+
# Use defensive check to ensure attribute exists (safety for MRO issue)
|
|
653
|
+
if hasattr(self, 'expert_registry') and self.expert_registry:
|
|
654
|
+
ux_consultation = await self.expert_registry.consult(
|
|
655
|
+
query=f"Provide UX best practices for defining a design system for: {project_description[:500]}",
|
|
656
|
+
domain="user-experience",
|
|
657
|
+
agent_id=self.agent_id,
|
|
658
|
+
prioritize_builtin=True,
|
|
659
|
+
)
|
|
660
|
+
if ux_consultation.confidence >= ux_consultation.confidence_threshold:
|
|
661
|
+
ux_guidance = ux_consultation.weighted_answer
|
|
662
|
+
|
|
663
|
+
accessibility_consultation = await self.expert_registry.consult(
|
|
664
|
+
query=f"Provide accessibility best practices for defining a design system for: {project_description[:500]}",
|
|
665
|
+
domain="accessibility",
|
|
666
|
+
agent_id=self.agent_id,
|
|
667
|
+
prioritize_builtin=True,
|
|
668
|
+
)
|
|
669
|
+
if (
|
|
670
|
+
accessibility_consultation.confidence
|
|
671
|
+
>= accessibility_consultation.confidence_threshold
|
|
672
|
+
):
|
|
673
|
+
accessibility_guidance = accessibility_consultation.weighted_answer
|
|
674
|
+
|
|
675
|
+
ux_guidance_section = (
|
|
676
|
+
f"UX Expert Guidance:\n{ux_guidance}\n" if ux_guidance else ""
|
|
677
|
+
)
|
|
678
|
+
accessibility_guidance_section = (
|
|
679
|
+
f"Accessibility Expert Guidance:\n{accessibility_guidance}\n"
|
|
680
|
+
if accessibility_guidance
|
|
681
|
+
else ""
|
|
682
|
+
)
|
|
683
|
+
|
|
684
|
+
prompt = f"""Define a design system for the following project.
|
|
685
|
+
|
|
686
|
+
Project Description:
|
|
687
|
+
{project_description}
|
|
688
|
+
|
|
689
|
+
{f"Brand Guidelines: {brand_guidelines}" if brand_guidelines else ""}
|
|
690
|
+
|
|
691
|
+
{ux_guidance_section}
|
|
692
|
+
{accessibility_guidance_section}
|
|
693
|
+
|
|
694
|
+
Provide comprehensive design system including:
|
|
695
|
+
1. Color Palette (primary, secondary, accent, neutral)
|
|
696
|
+
2. Typography (font families, sizes, weights, line heights)
|
|
697
|
+
3. Spacing System (margins, padding, grid)
|
|
698
|
+
4. Component Library (buttons, forms, cards, etc.)
|
|
699
|
+
5. Iconography
|
|
700
|
+
6. Imagery Guidelines
|
|
701
|
+
7. Animation/Transition Guidelines
|
|
702
|
+
8. Accessibility Standards
|
|
703
|
+
9. Design Tokens
|
|
704
|
+
|
|
705
|
+
Format as structured JSON with detailed design system specification."""
|
|
706
|
+
|
|
707
|
+
try:
|
|
708
|
+
# Prepare instruction for Cursor Skills
|
|
709
|
+
instruction = GenericInstruction(
|
|
710
|
+
agent_name="designer",
|
|
711
|
+
command="create-design-system",
|
|
712
|
+
prompt=prompt,
|
|
713
|
+
parameters={
|
|
714
|
+
"project": project_description,
|
|
715
|
+
"brand_guidelines": brand_guidelines,
|
|
716
|
+
"output_file": str(output_file) if output_file else None,
|
|
717
|
+
},
|
|
718
|
+
)
|
|
719
|
+
|
|
720
|
+
# Save to file if specified
|
|
721
|
+
if output_file:
|
|
722
|
+
output_path = Path(output_file)
|
|
723
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
724
|
+
output_path.write_text(json.dumps(design_system, indent=2))
|
|
725
|
+
design_system["output_file"] = str(output_path)
|
|
726
|
+
|
|
727
|
+
return {"success": True, "design_system": design_system}
|
|
728
|
+
except Exception as e:
|
|
729
|
+
return {"error": f"Failed to define design system: {str(e)}"}
|
|
730
|
+
|
|
731
|
+
async def _evaluate_design(self, design: dict[str, Any]) -> dict[str, Any]:
|
|
732
|
+
"""Evaluate design quality and completeness."""
|
|
733
|
+
# Basic evaluation - can be enhanced with more sophisticated analysis
|
|
734
|
+
score = {
|
|
735
|
+
"overall": 75.0, # Placeholder
|
|
736
|
+
"endpoints_defined": len(design.get("endpoints", [])) > 0,
|
|
737
|
+
"schemas_defined": len(design.get("schemas", [])) > 0,
|
|
738
|
+
"authentication_specified": "auth" in str(design).lower(),
|
|
739
|
+
"documentation_present": "description" in str(design).lower() or "docs" in str(design).lower(),
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
return {
|
|
743
|
+
"success": True,
|
|
744
|
+
"score": score,
|
|
745
|
+
"design": design,
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
async def _validate_api_consistency(
|
|
749
|
+
self, api_design: dict[str, Any], project_patterns: dict[str, Any] | None = None
|
|
750
|
+
) -> dict[str, Any]:
|
|
751
|
+
"""Validate API design consistency with project patterns."""
|
|
752
|
+
from ...core.design_validator import DesignValidator
|
|
753
|
+
|
|
754
|
+
validator = DesignValidator()
|
|
755
|
+
result = validator.validate_api_consistency(api_design, project_patterns)
|
|
756
|
+
|
|
757
|
+
return {
|
|
758
|
+
"success": True,
|
|
759
|
+
"is_consistent": result.is_consistent,
|
|
760
|
+
"violations": result.violations,
|
|
761
|
+
"pattern_deviations": result.pattern_deviations,
|
|
762
|
+
"naming_inconsistencies": result.naming_inconsistencies,
|
|
763
|
+
"recommendations": result.recommendations,
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
async def _validate_api_nfr(
|
|
767
|
+
self, api_design: dict[str, Any], nfr_requirements: dict[str, Any]
|
|
768
|
+
) -> dict[str, Any]:
|
|
769
|
+
"""Validate API design against non-functional requirements."""
|
|
770
|
+
from ...core.nfr_validator import NFRValidator
|
|
771
|
+
|
|
772
|
+
validator = NFRValidator()
|
|
773
|
+
result = validator.validate_api_nfr(api_design, nfr_requirements)
|
|
774
|
+
|
|
775
|
+
return {
|
|
776
|
+
"success": True,
|
|
777
|
+
"is_valid": result.is_valid,
|
|
778
|
+
"overall_score": result.overall_score,
|
|
779
|
+
"security_score": result.security_score,
|
|
780
|
+
"performance_score": result.performance_score,
|
|
781
|
+
"reliability_score": result.reliability_score,
|
|
782
|
+
"maintainability_score": result.maintainability_score,
|
|
783
|
+
"security_issues": result.security_issues,
|
|
784
|
+
"performance_issues": result.performance_issues,
|
|
785
|
+
"recommendations": result.recommendations,
|
|
786
|
+
}
|