tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/service_discovery.py +534 -534
- 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/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 -227
- tapps_agents/cli/commands/tester.py +191 -191
- 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/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/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.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- 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/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/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- 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/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- 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/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_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/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 -148
- 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.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,493 +1,493 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Framework Documentation Updater - Updates project documentation for framework changes.
|
|
3
|
-
|
|
4
|
-
This module updates README.md, API.md, ARCHITECTURE.md, and agent-capabilities.mdc
|
|
5
|
-
when new agents are added to the framework.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
import re
|
|
10
|
-
import shutil
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
from ...simple_mode.framework_change_detector import AgentInfo
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class UpdateResult:
|
|
22
|
-
"""Result of documentation updates."""
|
|
23
|
-
|
|
24
|
-
readme_updated: bool = False
|
|
25
|
-
api_updated: bool = False
|
|
26
|
-
architecture_updated: bool = False
|
|
27
|
-
capabilities_updated: bool = False
|
|
28
|
-
backups_created: list[Path] = field(default_factory=list)
|
|
29
|
-
errors: list[str] = field(default_factory=list)
|
|
30
|
-
warnings: list[str] = field(default_factory=list)
|
|
31
|
-
|
|
32
|
-
@property
|
|
33
|
-
def success(self) -> bool:
|
|
34
|
-
"""Check if all updates were successful."""
|
|
35
|
-
return (
|
|
36
|
-
self.readme_updated
|
|
37
|
-
and self.api_updated
|
|
38
|
-
and self.architecture_updated
|
|
39
|
-
and self.capabilities_updated
|
|
40
|
-
and not self.errors
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class FrameworkDocUpdater:
|
|
45
|
-
"""Update project documentation files with new agent information."""
|
|
46
|
-
|
|
47
|
-
def __init__(self, project_root: Path, create_backups: bool = True):
|
|
48
|
-
"""
|
|
49
|
-
Initialize documentation updater.
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
project_root: Project root directory
|
|
53
|
-
create_backups: Whether to create backups before updates
|
|
54
|
-
"""
|
|
55
|
-
self.project_root = project_root
|
|
56
|
-
self.create_backups = create_backups
|
|
57
|
-
self.backup_dir = project_root / ".tapps-agents" / "backups"
|
|
58
|
-
self.backup_dir.mkdir(parents=True, exist_ok=True)
|
|
59
|
-
|
|
60
|
-
def update_all_docs(
|
|
61
|
-
self, agent_name: str, agent_info: AgentInfo
|
|
62
|
-
) -> UpdateResult:
|
|
63
|
-
"""
|
|
64
|
-
Update all project documentation for a new agent.
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
agent_name: Name of the new agent
|
|
68
|
-
agent_info: Agent information
|
|
69
|
-
|
|
70
|
-
Returns:
|
|
71
|
-
UpdateResult with update status for each file
|
|
72
|
-
"""
|
|
73
|
-
result = UpdateResult()
|
|
74
|
-
|
|
75
|
-
# Update README.md
|
|
76
|
-
try:
|
|
77
|
-
result.readme_updated = self.update_readme(agent_name, agent_info)
|
|
78
|
-
except Exception as e:
|
|
79
|
-
result.errors.append(f"Failed to update README.md: {e}")
|
|
80
|
-
logger.error(f"Failed to update README.md: {e}")
|
|
81
|
-
|
|
82
|
-
# Update API.md
|
|
83
|
-
try:
|
|
84
|
-
result.api_updated = self.update_api_docs(agent_name, agent_info)
|
|
85
|
-
except Exception as e:
|
|
86
|
-
result.errors.append(f"Failed to update API.md: {e}")
|
|
87
|
-
logger.error(f"Failed to update API.md: {e}")
|
|
88
|
-
|
|
89
|
-
# Update ARCHITECTURE.md
|
|
90
|
-
try:
|
|
91
|
-
result.architecture_updated = self.update_architecture_docs(
|
|
92
|
-
agent_name, agent_info
|
|
93
|
-
)
|
|
94
|
-
except Exception as e:
|
|
95
|
-
result.errors.append(f"Failed to update ARCHITECTURE.md: {e}")
|
|
96
|
-
logger.error(f"Failed to update ARCHITECTURE.md: {e}")
|
|
97
|
-
|
|
98
|
-
# Update agent-capabilities.mdc
|
|
99
|
-
try:
|
|
100
|
-
result.capabilities_updated = self.update_agent_capabilities(
|
|
101
|
-
agent_name, agent_info
|
|
102
|
-
)
|
|
103
|
-
except Exception as e:
|
|
104
|
-
result.errors.append(f"Failed to update agent-capabilities.mdc: {e}")
|
|
105
|
-
logger.error(f"Failed to update agent-capabilities.mdc: {e}")
|
|
106
|
-
|
|
107
|
-
return result
|
|
108
|
-
|
|
109
|
-
def update_readme(
|
|
110
|
-
self,
|
|
111
|
-
agent_name: str,
|
|
112
|
-
agent_info: AgentInfo,
|
|
113
|
-
readme_path: Path | None = None,
|
|
114
|
-
) -> bool:
|
|
115
|
-
"""
|
|
116
|
-
Update README.md with new agent.
|
|
117
|
-
|
|
118
|
-
Updates:
|
|
119
|
-
- Agent count: Increment from (N) to (N+1)
|
|
120
|
-
- Agent list: Add agent to list in alphabetical order
|
|
121
|
-
|
|
122
|
-
Args:
|
|
123
|
-
agent_name: Name of the new agent
|
|
124
|
-
agent_info: Agent information
|
|
125
|
-
readme_path: README.md path (default: project_root/README.md)
|
|
126
|
-
|
|
127
|
-
Returns:
|
|
128
|
-
True if update successful
|
|
129
|
-
"""
|
|
130
|
-
if readme_path is None:
|
|
131
|
-
readme_path = self.project_root / "README.md"
|
|
132
|
-
|
|
133
|
-
if not readme_path.exists():
|
|
134
|
-
logger.warning(f"README.md not found: {readme_path}")
|
|
135
|
-
return False
|
|
136
|
-
|
|
137
|
-
# Create backup
|
|
138
|
-
if self.create_backups:
|
|
139
|
-
backup_path = self.create_backup(readme_path)
|
|
140
|
-
if backup_path:
|
|
141
|
-
logger.info(f"Created backup: {backup_path}")
|
|
142
|
-
|
|
143
|
-
# Read content
|
|
144
|
-
content = readme_path.read_text(encoding="utf-8")
|
|
145
|
-
|
|
146
|
-
# Update agent count
|
|
147
|
-
# Pattern: "- **Workflow Agents** (N):"
|
|
148
|
-
count_pattern = r"- \*\*Workflow Agents\*\* \((\d+)\):"
|
|
149
|
-
match = re.search(count_pattern, content)
|
|
150
|
-
if match:
|
|
151
|
-
current_count = int(match.group(1))
|
|
152
|
-
new_count = current_count + 1
|
|
153
|
-
content = re.sub(
|
|
154
|
-
count_pattern,
|
|
155
|
-
f"- **Workflow Agents** ({new_count}):",
|
|
156
|
-
content,
|
|
157
|
-
count=1,
|
|
158
|
-
)
|
|
159
|
-
logger.info(f"Updated agent count from {current_count} to {new_count}")
|
|
160
|
-
|
|
161
|
-
# Add agent to list
|
|
162
|
-
# Find agent list section and insert in alphabetical order
|
|
163
|
-
# Pattern: "- `@{agent_name}` - {description}"
|
|
164
|
-
agent_list_pattern = r"(- `@(\w+)` - .+?)(?=\n- `@|\n\n|$)"
|
|
165
|
-
matches = list(re.finditer(agent_list_pattern, content, re.MULTILINE))
|
|
166
|
-
|
|
167
|
-
if matches:
|
|
168
|
-
# Find insertion point (alphabetical order)
|
|
169
|
-
agent_entry = f"- `@{agent_name}` - {agent_info.purpose or agent_name.title()} Agent"
|
|
170
|
-
insertion_index = None
|
|
171
|
-
|
|
172
|
-
for i, match in enumerate(matches):
|
|
173
|
-
existing_agent = match.group(2)
|
|
174
|
-
if agent_name < existing_agent:
|
|
175
|
-
insertion_index = match.start()
|
|
176
|
-
break
|
|
177
|
-
|
|
178
|
-
if insertion_index is not None:
|
|
179
|
-
# Insert before the agent that comes after alphabetically
|
|
180
|
-
content = (
|
|
181
|
-
content[:insertion_index]
|
|
182
|
-
+ agent_entry
|
|
183
|
-
+ "\n"
|
|
184
|
-
+ content[insertion_index:]
|
|
185
|
-
)
|
|
186
|
-
else:
|
|
187
|
-
# Insert at end of list
|
|
188
|
-
last_match = matches[-1]
|
|
189
|
-
insertion_point = last_match.end()
|
|
190
|
-
content = (
|
|
191
|
-
content[:insertion_point]
|
|
192
|
-
+ "\n"
|
|
193
|
-
+ agent_entry
|
|
194
|
-
+ content[insertion_point:]
|
|
195
|
-
)
|
|
196
|
-
logger.info(f"Added {agent_name} to agent list")
|
|
197
|
-
else:
|
|
198
|
-
logger.warning("Could not find agent list in README.md")
|
|
199
|
-
|
|
200
|
-
# Write updated content
|
|
201
|
-
readme_path.write_text(content, encoding="utf-8")
|
|
202
|
-
return True
|
|
203
|
-
|
|
204
|
-
def update_api_docs(
|
|
205
|
-
self,
|
|
206
|
-
agent_name: str,
|
|
207
|
-
agent_info: AgentInfo,
|
|
208
|
-
api_path: Path | None = None,
|
|
209
|
-
) -> bool:
|
|
210
|
-
"""
|
|
211
|
-
Update API.md with agent documentation.
|
|
212
|
-
|
|
213
|
-
Updates:
|
|
214
|
-
- Subcommands list: Add agent to subcommands
|
|
215
|
-
- API section: Add agent API documentation section
|
|
216
|
-
|
|
217
|
-
Args:
|
|
218
|
-
agent_name: Name of the new agent
|
|
219
|
-
agent_info: Agent information
|
|
220
|
-
api_path: API.md path (default: project_root/docs/API.md)
|
|
221
|
-
|
|
222
|
-
Returns:
|
|
223
|
-
True if update successful
|
|
224
|
-
"""
|
|
225
|
-
if api_path is None:
|
|
226
|
-
api_path = self.project_root / "docs" / "API.md"
|
|
227
|
-
|
|
228
|
-
if not api_path.exists():
|
|
229
|
-
logger.warning(f"API.md not found: {api_path}")
|
|
230
|
-
return False
|
|
231
|
-
|
|
232
|
-
# Create backup
|
|
233
|
-
if self.create_backups:
|
|
234
|
-
backup_path = self.create_backup(api_path)
|
|
235
|
-
if backup_path:
|
|
236
|
-
logger.info(f"Created backup: {backup_path}")
|
|
237
|
-
|
|
238
|
-
# Read content
|
|
239
|
-
content = api_path.read_text(encoding="utf-8")
|
|
240
|
-
|
|
241
|
-
# Add to subcommands list
|
|
242
|
-
# Pattern: "## Agent subcommands:" or "### Agent subcommands:"
|
|
243
|
-
subcommands_pattern = r"(## Agent subcommands:.*?\n)(- `\w+` - .+?)(?=\n\n|$)"
|
|
244
|
-
match = re.search(subcommands_pattern, content, re.MULTILINE | re.DOTALL)
|
|
245
|
-
if match:
|
|
246
|
-
subcommands_section = match.group(0)
|
|
247
|
-
agent_entry = f"- `{agent_name}` - {agent_info.purpose or agent_name.title()} Agent"
|
|
248
|
-
# Insert in alphabetical order
|
|
249
|
-
if agent_entry not in subcommands_section:
|
|
250
|
-
# Find insertion point
|
|
251
|
-
agent_list_pattern = r"- `(\w+)` -"
|
|
252
|
-
agent_matches = list(re.finditer(agent_list_pattern, subcommands_section))
|
|
253
|
-
insertion_index = None
|
|
254
|
-
|
|
255
|
-
for i, agent_match in enumerate(agent_matches):
|
|
256
|
-
existing_agent = agent_match.group(1)
|
|
257
|
-
if agent_name < existing_agent:
|
|
258
|
-
insertion_index = agent_match.start()
|
|
259
|
-
break
|
|
260
|
-
|
|
261
|
-
if insertion_index is not None:
|
|
262
|
-
subcommands_section = (
|
|
263
|
-
subcommands_section[:insertion_index]
|
|
264
|
-
+ agent_entry
|
|
265
|
-
+ "\n"
|
|
266
|
-
+ subcommands_section[insertion_index:]
|
|
267
|
-
)
|
|
268
|
-
else:
|
|
269
|
-
# Insert at end
|
|
270
|
-
subcommands_section = subcommands_section.rstrip() + "\n" + agent_entry + "\n"
|
|
271
|
-
|
|
272
|
-
content = content.replace(match.group(0), subcommands_section)
|
|
273
|
-
logger.info(f"Added {agent_name} to subcommands list")
|
|
274
|
-
|
|
275
|
-
# Add API section
|
|
276
|
-
# Insert after last agent section
|
|
277
|
-
# Convert snake_case to Title Case (e.g., "new_agent" -> "New Agent")
|
|
278
|
-
agent_name_title = agent_name.replace("_", " ").title()
|
|
279
|
-
api_section = f"\n## {agent_name_title} Agent\n\n"
|
|
280
|
-
if agent_info.purpose:
|
|
281
|
-
api_section += f"{agent_info.purpose}\n\n"
|
|
282
|
-
|
|
283
|
-
if agent_info.commands:
|
|
284
|
-
api_section += "### Commands\n\n"
|
|
285
|
-
for command in agent_info.commands:
|
|
286
|
-
api_section += f"- `{command}` - {agent_info.description or 'See agent documentation'}\n"
|
|
287
|
-
api_section += "\n"
|
|
288
|
-
|
|
289
|
-
# Find insertion point (after last agent section)
|
|
290
|
-
# Look for last "## AgentName Agent" section
|
|
291
|
-
agent_section_pattern = r"## \w+ Agent\n"
|
|
292
|
-
agent_sections = list(re.finditer(agent_section_pattern, content))
|
|
293
|
-
if agent_sections:
|
|
294
|
-
last_section = agent_sections[-1]
|
|
295
|
-
# Find end of that section (next ## or end of file)
|
|
296
|
-
next_section = re.search(
|
|
297
|
-
r"\n## [^#]", content[last_section.end() :], re.MULTILINE
|
|
298
|
-
)
|
|
299
|
-
if next_section:
|
|
300
|
-
insertion_point = last_section.end() + next_section.start()
|
|
301
|
-
else:
|
|
302
|
-
insertion_point = len(content)
|
|
303
|
-
content = content[:insertion_point] + api_section + content[insertion_point:]
|
|
304
|
-
logger.info(f"Added {agent_name} API section")
|
|
305
|
-
else:
|
|
306
|
-
# Append at end
|
|
307
|
-
content = content.rstrip() + "\n" + api_section
|
|
308
|
-
logger.info(f"Appended {agent_name} API section")
|
|
309
|
-
|
|
310
|
-
# Write updated content
|
|
311
|
-
api_path.write_text(content, encoding="utf-8")
|
|
312
|
-
return True
|
|
313
|
-
|
|
314
|
-
def update_architecture_docs(
|
|
315
|
-
self,
|
|
316
|
-
agent_name: str,
|
|
317
|
-
agent_info: AgentInfo,
|
|
318
|
-
arch_path: Path | None = None,
|
|
319
|
-
) -> bool:
|
|
320
|
-
"""
|
|
321
|
-
Update ARCHITECTURE.md with agent details.
|
|
322
|
-
|
|
323
|
-
Updates:
|
|
324
|
-
- Agent list: Add agent to agent list
|
|
325
|
-
- Agent details: Add agent purpose and relationships
|
|
326
|
-
|
|
327
|
-
Args:
|
|
328
|
-
agent_name: Name of the new agent
|
|
329
|
-
agent_info: Agent information
|
|
330
|
-
arch_path: ARCHITECTURE.md path (default: project_root/docs/ARCHITECTURE.md)
|
|
331
|
-
|
|
332
|
-
Returns:
|
|
333
|
-
True if update successful
|
|
334
|
-
"""
|
|
335
|
-
if arch_path is None:
|
|
336
|
-
arch_path = self.project_root / "docs" / "ARCHITECTURE.md"
|
|
337
|
-
|
|
338
|
-
if not arch_path.exists():
|
|
339
|
-
logger.warning(f"ARCHITECTURE.md not found: {arch_path}")
|
|
340
|
-
return False
|
|
341
|
-
|
|
342
|
-
# Create backup
|
|
343
|
-
if self.create_backups:
|
|
344
|
-
backup_path = self.create_backup(arch_path)
|
|
345
|
-
if backup_path:
|
|
346
|
-
logger.info(f"Created backup: {backup_path}")
|
|
347
|
-
|
|
348
|
-
# Read content
|
|
349
|
-
content = arch_path.read_text(encoding="utf-8")
|
|
350
|
-
|
|
351
|
-
# Add to agent list
|
|
352
|
-
# Pattern: "## Agents" or "### Agents"
|
|
353
|
-
agents_section_pattern = r"(## Agents.*?\n)(- \*\*\w+ Agent\*\* - .+?)(?=\n\n|$)"
|
|
354
|
-
match = re.search(agents_section_pattern, content, re.MULTILINE | re.DOTALL)
|
|
355
|
-
if match:
|
|
356
|
-
agents_section = match.group(0)
|
|
357
|
-
# Convert snake_case to Title Case
|
|
358
|
-
agent_name_title = agent_name.replace("_", " ").title()
|
|
359
|
-
agent_entry = f"- **{agent_name_title} Agent** - {agent_info.purpose or agent_name_title} Agent"
|
|
360
|
-
# Insert in alphabetical order
|
|
361
|
-
if agent_entry not in agents_section:
|
|
362
|
-
# Find insertion point
|
|
363
|
-
agent_list_pattern = r"- \*\*(\w+) Agent\*\* -"
|
|
364
|
-
agent_matches = list(re.finditer(agent_list_pattern, agents_section))
|
|
365
|
-
insertion_index = None
|
|
366
|
-
|
|
367
|
-
for i, agent_match in enumerate(agent_matches):
|
|
368
|
-
existing_agent = agent_match.group(1).lower()
|
|
369
|
-
if agent_name.lower() < existing_agent:
|
|
370
|
-
insertion_index = agent_match.start()
|
|
371
|
-
break
|
|
372
|
-
|
|
373
|
-
if insertion_index is not None:
|
|
374
|
-
agents_section = (
|
|
375
|
-
agents_section[:insertion_index]
|
|
376
|
-
+ agent_entry
|
|
377
|
-
+ "\n"
|
|
378
|
-
+ agents_section[insertion_index:]
|
|
379
|
-
)
|
|
380
|
-
else:
|
|
381
|
-
# Insert at end
|
|
382
|
-
agents_section = agents_section.rstrip() + "\n" + agent_entry + "\n"
|
|
383
|
-
|
|
384
|
-
content = content.replace(match.group(0), agents_section)
|
|
385
|
-
logger.info(f"Added {agent_name} to architecture agent list")
|
|
386
|
-
|
|
387
|
-
# Write updated content
|
|
388
|
-
arch_path.write_text(content, encoding="utf-8")
|
|
389
|
-
return True
|
|
390
|
-
|
|
391
|
-
def update_agent_capabilities(
|
|
392
|
-
self,
|
|
393
|
-
agent_name: str,
|
|
394
|
-
agent_info: AgentInfo,
|
|
395
|
-
capabilities_path: Path | None = None,
|
|
396
|
-
) -> bool:
|
|
397
|
-
"""
|
|
398
|
-
Update agent-capabilities.mdc with agent section.
|
|
399
|
-
|
|
400
|
-
Updates:
|
|
401
|
-
- Agent section: Add agent section with purpose and commands
|
|
402
|
-
|
|
403
|
-
Args:
|
|
404
|
-
agent_name: Name of the new agent
|
|
405
|
-
agent_info: Agent information
|
|
406
|
-
capabilities_path: agent-capabilities.mdc path (default: project_root/.cursor/rules/agent-capabilities.mdc)
|
|
407
|
-
|
|
408
|
-
Returns:
|
|
409
|
-
True if update successful
|
|
410
|
-
"""
|
|
411
|
-
if capabilities_path is None:
|
|
412
|
-
capabilities_path = (
|
|
413
|
-
self.project_root / ".cursor" / "rules" / "agent-capabilities.mdc"
|
|
414
|
-
)
|
|
415
|
-
|
|
416
|
-
if not capabilities_path.exists():
|
|
417
|
-
logger.warning(f"agent-capabilities.mdc not found: {capabilities_path}")
|
|
418
|
-
return False
|
|
419
|
-
|
|
420
|
-
# Create backup
|
|
421
|
-
if self.create_backups:
|
|
422
|
-
backup_path = self.create_backup(capabilities_path)
|
|
423
|
-
if backup_path:
|
|
424
|
-
logger.info(f"Created backup: {backup_path}")
|
|
425
|
-
|
|
426
|
-
# Read content
|
|
427
|
-
content = capabilities_path.read_text(encoding="utf-8")
|
|
428
|
-
|
|
429
|
-
# Create agent section
|
|
430
|
-
# Convert snake_case to Title Case
|
|
431
|
-
agent_name_title = agent_name.replace("_", " ").title()
|
|
432
|
-
agent_section = f"\n### {agent_name_title} Agent\n\n"
|
|
433
|
-
if agent_info.purpose:
|
|
434
|
-
agent_section += f"**Purpose**: {agent_info.purpose}\n\n"
|
|
435
|
-
else:
|
|
436
|
-
agent_section += f"**Purpose**: {agent_name_title} Agent\n\n"
|
|
437
|
-
|
|
438
|
-
if agent_info.commands:
|
|
439
|
-
agent_section += "**Commands**:\n"
|
|
440
|
-
for command in agent_info.commands:
|
|
441
|
-
agent_section += f"- `*{command}` - {agent_info.description or 'See agent documentation'}\n"
|
|
442
|
-
agent_section += "\n"
|
|
443
|
-
|
|
444
|
-
# Find insertion point (after last agent section)
|
|
445
|
-
# Look for last "### AgentName Agent" section
|
|
446
|
-
agent_section_pattern = r"### \w+ Agent\n"
|
|
447
|
-
agent_sections = list(re.finditer(agent_section_pattern, content))
|
|
448
|
-
if agent_sections:
|
|
449
|
-
last_section = agent_sections[-1]
|
|
450
|
-
# Find end of that section (next ### or end of file)
|
|
451
|
-
next_section = re.search(
|
|
452
|
-
r"\n### [^#]", content[last_section.end() :], re.MULTILINE
|
|
453
|
-
)
|
|
454
|
-
if next_section:
|
|
455
|
-
insertion_point = last_section.end() + next_section.start()
|
|
456
|
-
else:
|
|
457
|
-
insertion_point = len(content)
|
|
458
|
-
content = content[:insertion_point] + agent_section + content[insertion_point:]
|
|
459
|
-
logger.info(f"Added {agent_name} to agent-capabilities.mdc")
|
|
460
|
-
else:
|
|
461
|
-
# Append at end
|
|
462
|
-
content = content.rstrip() + "\n" + agent_section
|
|
463
|
-
logger.info(f"Appended {agent_name} to agent-capabilities.mdc")
|
|
464
|
-
|
|
465
|
-
# Write updated content
|
|
466
|
-
capabilities_path.write_text(content, encoding="utf-8")
|
|
467
|
-
return True
|
|
468
|
-
|
|
469
|
-
def create_backup(self, file_path: Path) -> Path | None:
|
|
470
|
-
"""
|
|
471
|
-
Create backup of file before update.
|
|
472
|
-
|
|
473
|
-
Args:
|
|
474
|
-
file_path: File to backup
|
|
475
|
-
|
|
476
|
-
Returns:
|
|
477
|
-
Backup file path, or None if backup failed
|
|
478
|
-
"""
|
|
479
|
-
if not file_path.exists():
|
|
480
|
-
return None
|
|
481
|
-
|
|
482
|
-
try:
|
|
483
|
-
from datetime import datetime
|
|
484
|
-
|
|
485
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
486
|
-
backup_filename = f"{file_path.stem}_{timestamp}{file_path.suffix}"
|
|
487
|
-
backup_path = self.backup_dir / backup_filename
|
|
488
|
-
|
|
489
|
-
shutil.copy2(file_path, backup_path)
|
|
490
|
-
return backup_path
|
|
491
|
-
except Exception as e:
|
|
492
|
-
logger.warning(f"Failed to create backup for {file_path}: {e}")
|
|
493
|
-
return None
|
|
1
|
+
"""
|
|
2
|
+
Framework Documentation Updater - Updates project documentation for framework changes.
|
|
3
|
+
|
|
4
|
+
This module updates README.md, API.md, ARCHITECTURE.md, and agent-capabilities.mdc
|
|
5
|
+
when new agents are added to the framework.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import re
|
|
10
|
+
import shutil
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from ...simple_mode.framework_change_detector import AgentInfo
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class UpdateResult:
|
|
22
|
+
"""Result of documentation updates."""
|
|
23
|
+
|
|
24
|
+
readme_updated: bool = False
|
|
25
|
+
api_updated: bool = False
|
|
26
|
+
architecture_updated: bool = False
|
|
27
|
+
capabilities_updated: bool = False
|
|
28
|
+
backups_created: list[Path] = field(default_factory=list)
|
|
29
|
+
errors: list[str] = field(default_factory=list)
|
|
30
|
+
warnings: list[str] = field(default_factory=list)
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def success(self) -> bool:
|
|
34
|
+
"""Check if all updates were successful."""
|
|
35
|
+
return (
|
|
36
|
+
self.readme_updated
|
|
37
|
+
and self.api_updated
|
|
38
|
+
and self.architecture_updated
|
|
39
|
+
and self.capabilities_updated
|
|
40
|
+
and not self.errors
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class FrameworkDocUpdater:
|
|
45
|
+
"""Update project documentation files with new agent information."""
|
|
46
|
+
|
|
47
|
+
def __init__(self, project_root: Path, create_backups: bool = True):
|
|
48
|
+
"""
|
|
49
|
+
Initialize documentation updater.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
project_root: Project root directory
|
|
53
|
+
create_backups: Whether to create backups before updates
|
|
54
|
+
"""
|
|
55
|
+
self.project_root = project_root
|
|
56
|
+
self.create_backups = create_backups
|
|
57
|
+
self.backup_dir = project_root / ".tapps-agents" / "backups"
|
|
58
|
+
self.backup_dir.mkdir(parents=True, exist_ok=True)
|
|
59
|
+
|
|
60
|
+
def update_all_docs(
|
|
61
|
+
self, agent_name: str, agent_info: AgentInfo
|
|
62
|
+
) -> UpdateResult:
|
|
63
|
+
"""
|
|
64
|
+
Update all project documentation for a new agent.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
agent_name: Name of the new agent
|
|
68
|
+
agent_info: Agent information
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
UpdateResult with update status for each file
|
|
72
|
+
"""
|
|
73
|
+
result = UpdateResult()
|
|
74
|
+
|
|
75
|
+
# Update README.md
|
|
76
|
+
try:
|
|
77
|
+
result.readme_updated = self.update_readme(agent_name, agent_info)
|
|
78
|
+
except Exception as e:
|
|
79
|
+
result.errors.append(f"Failed to update README.md: {e}")
|
|
80
|
+
logger.error(f"Failed to update README.md: {e}")
|
|
81
|
+
|
|
82
|
+
# Update API.md
|
|
83
|
+
try:
|
|
84
|
+
result.api_updated = self.update_api_docs(agent_name, agent_info)
|
|
85
|
+
except Exception as e:
|
|
86
|
+
result.errors.append(f"Failed to update API.md: {e}")
|
|
87
|
+
logger.error(f"Failed to update API.md: {e}")
|
|
88
|
+
|
|
89
|
+
# Update ARCHITECTURE.md
|
|
90
|
+
try:
|
|
91
|
+
result.architecture_updated = self.update_architecture_docs(
|
|
92
|
+
agent_name, agent_info
|
|
93
|
+
)
|
|
94
|
+
except Exception as e:
|
|
95
|
+
result.errors.append(f"Failed to update ARCHITECTURE.md: {e}")
|
|
96
|
+
logger.error(f"Failed to update ARCHITECTURE.md: {e}")
|
|
97
|
+
|
|
98
|
+
# Update agent-capabilities.mdc
|
|
99
|
+
try:
|
|
100
|
+
result.capabilities_updated = self.update_agent_capabilities(
|
|
101
|
+
agent_name, agent_info
|
|
102
|
+
)
|
|
103
|
+
except Exception as e:
|
|
104
|
+
result.errors.append(f"Failed to update agent-capabilities.mdc: {e}")
|
|
105
|
+
logger.error(f"Failed to update agent-capabilities.mdc: {e}")
|
|
106
|
+
|
|
107
|
+
return result
|
|
108
|
+
|
|
109
|
+
def update_readme(
|
|
110
|
+
self,
|
|
111
|
+
agent_name: str,
|
|
112
|
+
agent_info: AgentInfo,
|
|
113
|
+
readme_path: Path | None = None,
|
|
114
|
+
) -> bool:
|
|
115
|
+
"""
|
|
116
|
+
Update README.md with new agent.
|
|
117
|
+
|
|
118
|
+
Updates:
|
|
119
|
+
- Agent count: Increment from (N) to (N+1)
|
|
120
|
+
- Agent list: Add agent to list in alphabetical order
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
agent_name: Name of the new agent
|
|
124
|
+
agent_info: Agent information
|
|
125
|
+
readme_path: README.md path (default: project_root/README.md)
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
True if update successful
|
|
129
|
+
"""
|
|
130
|
+
if readme_path is None:
|
|
131
|
+
readme_path = self.project_root / "README.md"
|
|
132
|
+
|
|
133
|
+
if not readme_path.exists():
|
|
134
|
+
logger.warning(f"README.md not found: {readme_path}")
|
|
135
|
+
return False
|
|
136
|
+
|
|
137
|
+
# Create backup
|
|
138
|
+
if self.create_backups:
|
|
139
|
+
backup_path = self.create_backup(readme_path)
|
|
140
|
+
if backup_path:
|
|
141
|
+
logger.info(f"Created backup: {backup_path}")
|
|
142
|
+
|
|
143
|
+
# Read content
|
|
144
|
+
content = readme_path.read_text(encoding="utf-8")
|
|
145
|
+
|
|
146
|
+
# Update agent count
|
|
147
|
+
# Pattern: "- **Workflow Agents** (N):"
|
|
148
|
+
count_pattern = r"- \*\*Workflow Agents\*\* \((\d+)\):"
|
|
149
|
+
match = re.search(count_pattern, content)
|
|
150
|
+
if match:
|
|
151
|
+
current_count = int(match.group(1))
|
|
152
|
+
new_count = current_count + 1
|
|
153
|
+
content = re.sub(
|
|
154
|
+
count_pattern,
|
|
155
|
+
f"- **Workflow Agents** ({new_count}):",
|
|
156
|
+
content,
|
|
157
|
+
count=1,
|
|
158
|
+
)
|
|
159
|
+
logger.info(f"Updated agent count from {current_count} to {new_count}")
|
|
160
|
+
|
|
161
|
+
# Add agent to list
|
|
162
|
+
# Find agent list section and insert in alphabetical order
|
|
163
|
+
# Pattern: "- `@{agent_name}` - {description}"
|
|
164
|
+
agent_list_pattern = r"(- `@(\w+)` - .+?)(?=\n- `@|\n\n|$)"
|
|
165
|
+
matches = list(re.finditer(agent_list_pattern, content, re.MULTILINE))
|
|
166
|
+
|
|
167
|
+
if matches:
|
|
168
|
+
# Find insertion point (alphabetical order)
|
|
169
|
+
agent_entry = f"- `@{agent_name}` - {agent_info.purpose or agent_name.title()} Agent"
|
|
170
|
+
insertion_index = None
|
|
171
|
+
|
|
172
|
+
for i, match in enumerate(matches):
|
|
173
|
+
existing_agent = match.group(2)
|
|
174
|
+
if agent_name < existing_agent:
|
|
175
|
+
insertion_index = match.start()
|
|
176
|
+
break
|
|
177
|
+
|
|
178
|
+
if insertion_index is not None:
|
|
179
|
+
# Insert before the agent that comes after alphabetically
|
|
180
|
+
content = (
|
|
181
|
+
content[:insertion_index]
|
|
182
|
+
+ agent_entry
|
|
183
|
+
+ "\n"
|
|
184
|
+
+ content[insertion_index:]
|
|
185
|
+
)
|
|
186
|
+
else:
|
|
187
|
+
# Insert at end of list
|
|
188
|
+
last_match = matches[-1]
|
|
189
|
+
insertion_point = last_match.end()
|
|
190
|
+
content = (
|
|
191
|
+
content[:insertion_point]
|
|
192
|
+
+ "\n"
|
|
193
|
+
+ agent_entry
|
|
194
|
+
+ content[insertion_point:]
|
|
195
|
+
)
|
|
196
|
+
logger.info(f"Added {agent_name} to agent list")
|
|
197
|
+
else:
|
|
198
|
+
logger.warning("Could not find agent list in README.md")
|
|
199
|
+
|
|
200
|
+
# Write updated content
|
|
201
|
+
readme_path.write_text(content, encoding="utf-8")
|
|
202
|
+
return True
|
|
203
|
+
|
|
204
|
+
def update_api_docs(
|
|
205
|
+
self,
|
|
206
|
+
agent_name: str,
|
|
207
|
+
agent_info: AgentInfo,
|
|
208
|
+
api_path: Path | None = None,
|
|
209
|
+
) -> bool:
|
|
210
|
+
"""
|
|
211
|
+
Update API.md with agent documentation.
|
|
212
|
+
|
|
213
|
+
Updates:
|
|
214
|
+
- Subcommands list: Add agent to subcommands
|
|
215
|
+
- API section: Add agent API documentation section
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
agent_name: Name of the new agent
|
|
219
|
+
agent_info: Agent information
|
|
220
|
+
api_path: API.md path (default: project_root/docs/API.md)
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
True if update successful
|
|
224
|
+
"""
|
|
225
|
+
if api_path is None:
|
|
226
|
+
api_path = self.project_root / "docs" / "API.md"
|
|
227
|
+
|
|
228
|
+
if not api_path.exists():
|
|
229
|
+
logger.warning(f"API.md not found: {api_path}")
|
|
230
|
+
return False
|
|
231
|
+
|
|
232
|
+
# Create backup
|
|
233
|
+
if self.create_backups:
|
|
234
|
+
backup_path = self.create_backup(api_path)
|
|
235
|
+
if backup_path:
|
|
236
|
+
logger.info(f"Created backup: {backup_path}")
|
|
237
|
+
|
|
238
|
+
# Read content
|
|
239
|
+
content = api_path.read_text(encoding="utf-8")
|
|
240
|
+
|
|
241
|
+
# Add to subcommands list
|
|
242
|
+
# Pattern: "## Agent subcommands:" or "### Agent subcommands:"
|
|
243
|
+
subcommands_pattern = r"(## Agent subcommands:.*?\n)(- `\w+` - .+?)(?=\n\n|$)"
|
|
244
|
+
match = re.search(subcommands_pattern, content, re.MULTILINE | re.DOTALL)
|
|
245
|
+
if match:
|
|
246
|
+
subcommands_section = match.group(0)
|
|
247
|
+
agent_entry = f"- `{agent_name}` - {agent_info.purpose or agent_name.title()} Agent"
|
|
248
|
+
# Insert in alphabetical order
|
|
249
|
+
if agent_entry not in subcommands_section:
|
|
250
|
+
# Find insertion point
|
|
251
|
+
agent_list_pattern = r"- `(\w+)` -"
|
|
252
|
+
agent_matches = list(re.finditer(agent_list_pattern, subcommands_section))
|
|
253
|
+
insertion_index = None
|
|
254
|
+
|
|
255
|
+
for i, agent_match in enumerate(agent_matches):
|
|
256
|
+
existing_agent = agent_match.group(1)
|
|
257
|
+
if agent_name < existing_agent:
|
|
258
|
+
insertion_index = agent_match.start()
|
|
259
|
+
break
|
|
260
|
+
|
|
261
|
+
if insertion_index is not None:
|
|
262
|
+
subcommands_section = (
|
|
263
|
+
subcommands_section[:insertion_index]
|
|
264
|
+
+ agent_entry
|
|
265
|
+
+ "\n"
|
|
266
|
+
+ subcommands_section[insertion_index:]
|
|
267
|
+
)
|
|
268
|
+
else:
|
|
269
|
+
# Insert at end
|
|
270
|
+
subcommands_section = subcommands_section.rstrip() + "\n" + agent_entry + "\n"
|
|
271
|
+
|
|
272
|
+
content = content.replace(match.group(0), subcommands_section)
|
|
273
|
+
logger.info(f"Added {agent_name} to subcommands list")
|
|
274
|
+
|
|
275
|
+
# Add API section
|
|
276
|
+
# Insert after last agent section
|
|
277
|
+
# Convert snake_case to Title Case (e.g., "new_agent" -> "New Agent")
|
|
278
|
+
agent_name_title = agent_name.replace("_", " ").title()
|
|
279
|
+
api_section = f"\n## {agent_name_title} Agent\n\n"
|
|
280
|
+
if agent_info.purpose:
|
|
281
|
+
api_section += f"{agent_info.purpose}\n\n"
|
|
282
|
+
|
|
283
|
+
if agent_info.commands:
|
|
284
|
+
api_section += "### Commands\n\n"
|
|
285
|
+
for command in agent_info.commands:
|
|
286
|
+
api_section += f"- `{command}` - {agent_info.description or 'See agent documentation'}\n"
|
|
287
|
+
api_section += "\n"
|
|
288
|
+
|
|
289
|
+
# Find insertion point (after last agent section)
|
|
290
|
+
# Look for last "## AgentName Agent" section
|
|
291
|
+
agent_section_pattern = r"## \w+ Agent\n"
|
|
292
|
+
agent_sections = list(re.finditer(agent_section_pattern, content))
|
|
293
|
+
if agent_sections:
|
|
294
|
+
last_section = agent_sections[-1]
|
|
295
|
+
# Find end of that section (next ## or end of file)
|
|
296
|
+
next_section = re.search(
|
|
297
|
+
r"\n## [^#]", content[last_section.end() :], re.MULTILINE
|
|
298
|
+
)
|
|
299
|
+
if next_section:
|
|
300
|
+
insertion_point = last_section.end() + next_section.start()
|
|
301
|
+
else:
|
|
302
|
+
insertion_point = len(content)
|
|
303
|
+
content = content[:insertion_point] + api_section + content[insertion_point:]
|
|
304
|
+
logger.info(f"Added {agent_name} API section")
|
|
305
|
+
else:
|
|
306
|
+
# Append at end
|
|
307
|
+
content = content.rstrip() + "\n" + api_section
|
|
308
|
+
logger.info(f"Appended {agent_name} API section")
|
|
309
|
+
|
|
310
|
+
# Write updated content
|
|
311
|
+
api_path.write_text(content, encoding="utf-8")
|
|
312
|
+
return True
|
|
313
|
+
|
|
314
|
+
def update_architecture_docs(
|
|
315
|
+
self,
|
|
316
|
+
agent_name: str,
|
|
317
|
+
agent_info: AgentInfo,
|
|
318
|
+
arch_path: Path | None = None,
|
|
319
|
+
) -> bool:
|
|
320
|
+
"""
|
|
321
|
+
Update ARCHITECTURE.md with agent details.
|
|
322
|
+
|
|
323
|
+
Updates:
|
|
324
|
+
- Agent list: Add agent to agent list
|
|
325
|
+
- Agent details: Add agent purpose and relationships
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
agent_name: Name of the new agent
|
|
329
|
+
agent_info: Agent information
|
|
330
|
+
arch_path: ARCHITECTURE.md path (default: project_root/docs/ARCHITECTURE.md)
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
True if update successful
|
|
334
|
+
"""
|
|
335
|
+
if arch_path is None:
|
|
336
|
+
arch_path = self.project_root / "docs" / "ARCHITECTURE.md"
|
|
337
|
+
|
|
338
|
+
if not arch_path.exists():
|
|
339
|
+
logger.warning(f"ARCHITECTURE.md not found: {arch_path}")
|
|
340
|
+
return False
|
|
341
|
+
|
|
342
|
+
# Create backup
|
|
343
|
+
if self.create_backups:
|
|
344
|
+
backup_path = self.create_backup(arch_path)
|
|
345
|
+
if backup_path:
|
|
346
|
+
logger.info(f"Created backup: {backup_path}")
|
|
347
|
+
|
|
348
|
+
# Read content
|
|
349
|
+
content = arch_path.read_text(encoding="utf-8")
|
|
350
|
+
|
|
351
|
+
# Add to agent list
|
|
352
|
+
# Pattern: "## Agents" or "### Agents"
|
|
353
|
+
agents_section_pattern = r"(## Agents.*?\n)(- \*\*\w+ Agent\*\* - .+?)(?=\n\n|$)"
|
|
354
|
+
match = re.search(agents_section_pattern, content, re.MULTILINE | re.DOTALL)
|
|
355
|
+
if match:
|
|
356
|
+
agents_section = match.group(0)
|
|
357
|
+
# Convert snake_case to Title Case
|
|
358
|
+
agent_name_title = agent_name.replace("_", " ").title()
|
|
359
|
+
agent_entry = f"- **{agent_name_title} Agent** - {agent_info.purpose or agent_name_title} Agent"
|
|
360
|
+
# Insert in alphabetical order
|
|
361
|
+
if agent_entry not in agents_section:
|
|
362
|
+
# Find insertion point
|
|
363
|
+
agent_list_pattern = r"- \*\*(\w+) Agent\*\* -"
|
|
364
|
+
agent_matches = list(re.finditer(agent_list_pattern, agents_section))
|
|
365
|
+
insertion_index = None
|
|
366
|
+
|
|
367
|
+
for i, agent_match in enumerate(agent_matches):
|
|
368
|
+
existing_agent = agent_match.group(1).lower()
|
|
369
|
+
if agent_name.lower() < existing_agent:
|
|
370
|
+
insertion_index = agent_match.start()
|
|
371
|
+
break
|
|
372
|
+
|
|
373
|
+
if insertion_index is not None:
|
|
374
|
+
agents_section = (
|
|
375
|
+
agents_section[:insertion_index]
|
|
376
|
+
+ agent_entry
|
|
377
|
+
+ "\n"
|
|
378
|
+
+ agents_section[insertion_index:]
|
|
379
|
+
)
|
|
380
|
+
else:
|
|
381
|
+
# Insert at end
|
|
382
|
+
agents_section = agents_section.rstrip() + "\n" + agent_entry + "\n"
|
|
383
|
+
|
|
384
|
+
content = content.replace(match.group(0), agents_section)
|
|
385
|
+
logger.info(f"Added {agent_name} to architecture agent list")
|
|
386
|
+
|
|
387
|
+
# Write updated content
|
|
388
|
+
arch_path.write_text(content, encoding="utf-8")
|
|
389
|
+
return True
|
|
390
|
+
|
|
391
|
+
def update_agent_capabilities(
|
|
392
|
+
self,
|
|
393
|
+
agent_name: str,
|
|
394
|
+
agent_info: AgentInfo,
|
|
395
|
+
capabilities_path: Path | None = None,
|
|
396
|
+
) -> bool:
|
|
397
|
+
"""
|
|
398
|
+
Update agent-capabilities.mdc with agent section.
|
|
399
|
+
|
|
400
|
+
Updates:
|
|
401
|
+
- Agent section: Add agent section with purpose and commands
|
|
402
|
+
|
|
403
|
+
Args:
|
|
404
|
+
agent_name: Name of the new agent
|
|
405
|
+
agent_info: Agent information
|
|
406
|
+
capabilities_path: agent-capabilities.mdc path (default: project_root/.cursor/rules/agent-capabilities.mdc)
|
|
407
|
+
|
|
408
|
+
Returns:
|
|
409
|
+
True if update successful
|
|
410
|
+
"""
|
|
411
|
+
if capabilities_path is None:
|
|
412
|
+
capabilities_path = (
|
|
413
|
+
self.project_root / ".cursor" / "rules" / "agent-capabilities.mdc"
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
if not capabilities_path.exists():
|
|
417
|
+
logger.warning(f"agent-capabilities.mdc not found: {capabilities_path}")
|
|
418
|
+
return False
|
|
419
|
+
|
|
420
|
+
# Create backup
|
|
421
|
+
if self.create_backups:
|
|
422
|
+
backup_path = self.create_backup(capabilities_path)
|
|
423
|
+
if backup_path:
|
|
424
|
+
logger.info(f"Created backup: {backup_path}")
|
|
425
|
+
|
|
426
|
+
# Read content
|
|
427
|
+
content = capabilities_path.read_text(encoding="utf-8")
|
|
428
|
+
|
|
429
|
+
# Create agent section
|
|
430
|
+
# Convert snake_case to Title Case
|
|
431
|
+
agent_name_title = agent_name.replace("_", " ").title()
|
|
432
|
+
agent_section = f"\n### {agent_name_title} Agent\n\n"
|
|
433
|
+
if agent_info.purpose:
|
|
434
|
+
agent_section += f"**Purpose**: {agent_info.purpose}\n\n"
|
|
435
|
+
else:
|
|
436
|
+
agent_section += f"**Purpose**: {agent_name_title} Agent\n\n"
|
|
437
|
+
|
|
438
|
+
if agent_info.commands:
|
|
439
|
+
agent_section += "**Commands**:\n"
|
|
440
|
+
for command in agent_info.commands:
|
|
441
|
+
agent_section += f"- `*{command}` - {agent_info.description or 'See agent documentation'}\n"
|
|
442
|
+
agent_section += "\n"
|
|
443
|
+
|
|
444
|
+
# Find insertion point (after last agent section)
|
|
445
|
+
# Look for last "### AgentName Agent" section
|
|
446
|
+
agent_section_pattern = r"### \w+ Agent\n"
|
|
447
|
+
agent_sections = list(re.finditer(agent_section_pattern, content))
|
|
448
|
+
if agent_sections:
|
|
449
|
+
last_section = agent_sections[-1]
|
|
450
|
+
# Find end of that section (next ### or end of file)
|
|
451
|
+
next_section = re.search(
|
|
452
|
+
r"\n### [^#]", content[last_section.end() :], re.MULTILINE
|
|
453
|
+
)
|
|
454
|
+
if next_section:
|
|
455
|
+
insertion_point = last_section.end() + next_section.start()
|
|
456
|
+
else:
|
|
457
|
+
insertion_point = len(content)
|
|
458
|
+
content = content[:insertion_point] + agent_section + content[insertion_point:]
|
|
459
|
+
logger.info(f"Added {agent_name} to agent-capabilities.mdc")
|
|
460
|
+
else:
|
|
461
|
+
# Append at end
|
|
462
|
+
content = content.rstrip() + "\n" + agent_section
|
|
463
|
+
logger.info(f"Appended {agent_name} to agent-capabilities.mdc")
|
|
464
|
+
|
|
465
|
+
# Write updated content
|
|
466
|
+
capabilities_path.write_text(content, encoding="utf-8")
|
|
467
|
+
return True
|
|
468
|
+
|
|
469
|
+
def create_backup(self, file_path: Path) -> Path | None:
|
|
470
|
+
"""
|
|
471
|
+
Create backup of file before update.
|
|
472
|
+
|
|
473
|
+
Args:
|
|
474
|
+
file_path: File to backup
|
|
475
|
+
|
|
476
|
+
Returns:
|
|
477
|
+
Backup file path, or None if backup failed
|
|
478
|
+
"""
|
|
479
|
+
if not file_path.exists():
|
|
480
|
+
return None
|
|
481
|
+
|
|
482
|
+
try:
|
|
483
|
+
from datetime import datetime
|
|
484
|
+
|
|
485
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
486
|
+
backup_filename = f"{file_path.stem}_{timestamp}{file_path.suffix}"
|
|
487
|
+
backup_path = self.backup_dir / backup_filename
|
|
488
|
+
|
|
489
|
+
shutil.copy2(file_path, backup_path)
|
|
490
|
+
return backup_path
|
|
491
|
+
except Exception as e:
|
|
492
|
+
logger.warning(f"Failed to create backup for {file_path}: {e}")
|
|
493
|
+
return None
|