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
tapps_agents/epic/beads_sync.py
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Sync an Epic to Beads (bd): create one bd issue per story and bd dep add from Story.dependencies.
|
|
3
|
-
|
|
4
|
-
On run_bd failure we log, return the partial story_id->bd_id mapping, and do not re-raise
|
|
5
|
-
so the Epic run can continue.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import logging
|
|
9
|
-
from collections.abc import Callable
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import Any
|
|
12
|
-
|
|
13
|
-
from ..beads import parse_bd_id_from_stdout
|
|
14
|
-
from .models import EpicDocument, Story
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def sync_epic_to_beads(
|
|
20
|
-
epic: EpicDocument,
|
|
21
|
-
project_root: Path,
|
|
22
|
-
run_bd: Callable[[list[str], Path | None], Any],
|
|
23
|
-
*,
|
|
24
|
-
create_parent: bool = True,
|
|
25
|
-
) -> tuple[dict[str, str], str | None]:
|
|
26
|
-
"""
|
|
27
|
-
Create a bd issue for each story and bd dep add for each dependency.
|
|
28
|
-
|
|
29
|
-
Optionally create a parent Epic issue (for grouping only; no story->parent deps).
|
|
30
|
-
|
|
31
|
-
run_bd(args, cwd) runs bd and returns a CompletedProcess-like object with
|
|
32
|
-
.returncode, .stdout, .stderr. It is typically beads.client.run_bd partially
|
|
33
|
-
applied with project_root.
|
|
34
|
-
|
|
35
|
-
On any run_bd failure we log, return the partial story_id->bd_id mapping,
|
|
36
|
-
and do not re-raise.
|
|
37
|
-
|
|
38
|
-
Args:
|
|
39
|
-
epic: Parsed Epic document.
|
|
40
|
-
project_root: Project root (used as cwd when run_bd does not override).
|
|
41
|
-
run_bd: (args, cwd=None) -> result with .returncode, .stdout, .stderr.
|
|
42
|
-
create_parent: If True, create a parent bd issue for the Epic (grouping only).
|
|
43
|
-
|
|
44
|
-
Returns:
|
|
45
|
-
(story_id -> bd_id mapping, epic_parent_id or None).
|
|
46
|
-
"""
|
|
47
|
-
story_to_bd: dict[str, str] = {}
|
|
48
|
-
epic_parent_id: str | None = None
|
|
49
|
-
cwd = project_root
|
|
50
|
-
|
|
51
|
-
# Optional: create parent Epic issue (grouping only; no story->parent deps)
|
|
52
|
-
if create_parent:
|
|
53
|
-
title = f"Epic {epic.epic_number}: {epic.title}"[:200].strip()
|
|
54
|
-
desc = (epic.description or epic.goal or "")[:500].replace("\n", " ").strip()
|
|
55
|
-
args = ["create", title]
|
|
56
|
-
if desc:
|
|
57
|
-
args.extend(["-d", desc])
|
|
58
|
-
try:
|
|
59
|
-
r = run_bd(args, cwd)
|
|
60
|
-
if r.returncode == 0:
|
|
61
|
-
epic_parent_id = parse_bd_id_from_stdout(r.stdout)
|
|
62
|
-
else:
|
|
63
|
-
logger.warning("beads_sync: bd create parent failed: %s", r.stderr)
|
|
64
|
-
except Exception as e:
|
|
65
|
-
logger.warning("beads_sync: bd create parent failed: %s", e)
|
|
66
|
-
|
|
67
|
-
# Create one bd issue per story
|
|
68
|
-
for story in epic.stories:
|
|
69
|
-
title = (story.title or f"Story {story.story_id}")[:200].strip()
|
|
70
|
-
desc = (story.description or "")[:500].replace("\n", " ").strip()
|
|
71
|
-
args = ["create", title]
|
|
72
|
-
if desc:
|
|
73
|
-
args.extend(["-d", desc])
|
|
74
|
-
try:
|
|
75
|
-
r = run_bd(args, cwd)
|
|
76
|
-
if r.returncode != 0:
|
|
77
|
-
logger.warning(
|
|
78
|
-
"beads_sync: bd create failed for %s: %s", story.story_id, r.stderr
|
|
79
|
-
)
|
|
80
|
-
continue
|
|
81
|
-
bd_id = parse_bd_id_from_stdout(r.stdout)
|
|
82
|
-
if bd_id:
|
|
83
|
-
story_to_bd[story.story_id] = bd_id
|
|
84
|
-
else:
|
|
85
|
-
logger.warning(
|
|
86
|
-
"beads_sync: could not parse bd id from create stdout for %s",
|
|
87
|
-
story.story_id,
|
|
88
|
-
)
|
|
89
|
-
except Exception as e:
|
|
90
|
-
logger.warning("beads_sync: bd create failed for %s: %s", story.story_id, e)
|
|
91
|
-
|
|
92
|
-
# bd dep add child parent => parent blocks child (child depends on parent)
|
|
93
|
-
for story in epic.stories:
|
|
94
|
-
s_bd = story_to_bd.get(story.story_id)
|
|
95
|
-
if not s_bd or not story.dependencies:
|
|
96
|
-
continue
|
|
97
|
-
for dep_id in story.dependencies:
|
|
98
|
-
dep_bd = story_to_bd.get(dep_id)
|
|
99
|
-
if not dep_bd:
|
|
100
|
-
continue
|
|
101
|
-
try:
|
|
102
|
-
r = run_bd(["dep", "add", s_bd, dep_bd], cwd)
|
|
103
|
-
if r.returncode != 0:
|
|
104
|
-
logger.warning(
|
|
105
|
-
"beads_sync: bd dep add %s %s failed: %s",
|
|
106
|
-
s_bd,
|
|
107
|
-
dep_bd,
|
|
108
|
-
r.stderr,
|
|
109
|
-
)
|
|
110
|
-
except Exception as e:
|
|
111
|
-
logger.warning(
|
|
112
|
-
"beads_sync: bd dep add %s %s failed: %s", s_bd, dep_bd, e
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
return (story_to_bd, epic_parent_id)
|
|
1
|
+
"""
|
|
2
|
+
Sync an Epic to Beads (bd): create one bd issue per story and bd dep add from Story.dependencies.
|
|
3
|
+
|
|
4
|
+
On run_bd failure we log, return the partial story_id->bd_id mapping, and do not re-raise
|
|
5
|
+
so the Epic run can continue.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from ..beads import parse_bd_id_from_stdout
|
|
14
|
+
from .models import EpicDocument, Story
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def sync_epic_to_beads(
|
|
20
|
+
epic: EpicDocument,
|
|
21
|
+
project_root: Path,
|
|
22
|
+
run_bd: Callable[[list[str], Path | None], Any],
|
|
23
|
+
*,
|
|
24
|
+
create_parent: bool = True,
|
|
25
|
+
) -> tuple[dict[str, str], str | None]:
|
|
26
|
+
"""
|
|
27
|
+
Create a bd issue for each story and bd dep add for each dependency.
|
|
28
|
+
|
|
29
|
+
Optionally create a parent Epic issue (for grouping only; no story->parent deps).
|
|
30
|
+
|
|
31
|
+
run_bd(args, cwd) runs bd and returns a CompletedProcess-like object with
|
|
32
|
+
.returncode, .stdout, .stderr. It is typically beads.client.run_bd partially
|
|
33
|
+
applied with project_root.
|
|
34
|
+
|
|
35
|
+
On any run_bd failure we log, return the partial story_id->bd_id mapping,
|
|
36
|
+
and do not re-raise.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
epic: Parsed Epic document.
|
|
40
|
+
project_root: Project root (used as cwd when run_bd does not override).
|
|
41
|
+
run_bd: (args, cwd=None) -> result with .returncode, .stdout, .stderr.
|
|
42
|
+
create_parent: If True, create a parent bd issue for the Epic (grouping only).
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
(story_id -> bd_id mapping, epic_parent_id or None).
|
|
46
|
+
"""
|
|
47
|
+
story_to_bd: dict[str, str] = {}
|
|
48
|
+
epic_parent_id: str | None = None
|
|
49
|
+
cwd = project_root
|
|
50
|
+
|
|
51
|
+
# Optional: create parent Epic issue (grouping only; no story->parent deps)
|
|
52
|
+
if create_parent:
|
|
53
|
+
title = f"Epic {epic.epic_number}: {epic.title}"[:200].strip()
|
|
54
|
+
desc = (epic.description or epic.goal or "")[:500].replace("\n", " ").strip()
|
|
55
|
+
args = ["create", title]
|
|
56
|
+
if desc:
|
|
57
|
+
args.extend(["-d", desc])
|
|
58
|
+
try:
|
|
59
|
+
r = run_bd(args, cwd)
|
|
60
|
+
if r.returncode == 0:
|
|
61
|
+
epic_parent_id = parse_bd_id_from_stdout(r.stdout)
|
|
62
|
+
else:
|
|
63
|
+
logger.warning("beads_sync: bd create parent failed: %s", r.stderr)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
logger.warning("beads_sync: bd create parent failed: %s", e)
|
|
66
|
+
|
|
67
|
+
# Create one bd issue per story
|
|
68
|
+
for story in epic.stories:
|
|
69
|
+
title = (story.title or f"Story {story.story_id}")[:200].strip()
|
|
70
|
+
desc = (story.description or "")[:500].replace("\n", " ").strip()
|
|
71
|
+
args = ["create", title]
|
|
72
|
+
if desc:
|
|
73
|
+
args.extend(["-d", desc])
|
|
74
|
+
try:
|
|
75
|
+
r = run_bd(args, cwd)
|
|
76
|
+
if r.returncode != 0:
|
|
77
|
+
logger.warning(
|
|
78
|
+
"beads_sync: bd create failed for %s: %s", story.story_id, r.stderr
|
|
79
|
+
)
|
|
80
|
+
continue
|
|
81
|
+
bd_id = parse_bd_id_from_stdout(r.stdout)
|
|
82
|
+
if bd_id:
|
|
83
|
+
story_to_bd[story.story_id] = bd_id
|
|
84
|
+
else:
|
|
85
|
+
logger.warning(
|
|
86
|
+
"beads_sync: could not parse bd id from create stdout for %s",
|
|
87
|
+
story.story_id,
|
|
88
|
+
)
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.warning("beads_sync: bd create failed for %s: %s", story.story_id, e)
|
|
91
|
+
|
|
92
|
+
# bd dep add child parent => parent blocks child (child depends on parent)
|
|
93
|
+
for story in epic.stories:
|
|
94
|
+
s_bd = story_to_bd.get(story.story_id)
|
|
95
|
+
if not s_bd or not story.dependencies:
|
|
96
|
+
continue
|
|
97
|
+
for dep_id in story.dependencies:
|
|
98
|
+
dep_bd = story_to_bd.get(dep_id)
|
|
99
|
+
if not dep_bd:
|
|
100
|
+
continue
|
|
101
|
+
try:
|
|
102
|
+
r = run_bd(["dep", "add", s_bd, dep_bd], cwd)
|
|
103
|
+
if r.returncode != 0:
|
|
104
|
+
logger.warning(
|
|
105
|
+
"beads_sync: bd dep add %s %s failed: %s",
|
|
106
|
+
s_bd,
|
|
107
|
+
dep_bd,
|
|
108
|
+
r.stderr,
|
|
109
|
+
)
|
|
110
|
+
except Exception as e:
|
|
111
|
+
logger.warning(
|
|
112
|
+
"beads_sync: bd dep add %s %s failed: %s", s_bd, dep_bd, e
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return (story_to_bd, epic_parent_id)
|
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Sync epic execution status from report JSON back into the epic markdown file.
|
|
3
|
-
|
|
4
|
-
Updates each story block with **Execution status:** done | failed so the .md
|
|
5
|
-
reflects the last run. Run after epic execution or when you have a report file.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import json
|
|
9
|
-
import re
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def update_epic_markdown_from_report(
|
|
14
|
-
epic_path: Path | str,
|
|
15
|
-
report_path: Path | None = None,
|
|
16
|
-
project_root: Path | None = None,
|
|
17
|
-
) -> None:
|
|
18
|
-
"""
|
|
19
|
-
Update the epic markdown file with execution status from the report JSON.
|
|
20
|
-
|
|
21
|
-
For each story in the report, adds or replaces a line
|
|
22
|
-
"**Execution status:** done" or "**Execution status:** failed"
|
|
23
|
-
in the corresponding story block.
|
|
24
|
-
|
|
25
|
-
Args:
|
|
26
|
-
epic_path: Path to the epic .md file.
|
|
27
|
-
report_path: Path to epic-N-report.json. If None, uses same directory
|
|
28
|
-
as epic_path and filename epic-{N}-report.json (N from epic content).
|
|
29
|
-
project_root: Project root for resolving relative epic_path. Defaults to cwd.
|
|
30
|
-
|
|
31
|
-
Raises:
|
|
32
|
-
FileNotFoundError: If epic or report file is missing.
|
|
33
|
-
ValueError: If report format is invalid or epic number cannot be determined.
|
|
34
|
-
"""
|
|
35
|
-
root = Path(project_root or Path.cwd())
|
|
36
|
-
epic_path = Path(epic_path)
|
|
37
|
-
if not epic_path.is_absolute():
|
|
38
|
-
for base in [root, root / "stories", root / "docs" / "prd"]:
|
|
39
|
-
candidate = base / epic_path.name if epic_path.parent.name else base / epic_path
|
|
40
|
-
if candidate.exists():
|
|
41
|
-
epic_path = candidate
|
|
42
|
-
break
|
|
43
|
-
else:
|
|
44
|
-
epic_path = root / epic_path
|
|
45
|
-
|
|
46
|
-
if not epic_path.exists():
|
|
47
|
-
raise FileNotFoundError(f"Epic file not found: {epic_path}")
|
|
48
|
-
|
|
49
|
-
content = epic_path.read_text(encoding="utf-8")
|
|
50
|
-
|
|
51
|
-
# Determine epic number from content
|
|
52
|
-
epic_num_match = re.search(r"^#\s+Epic\s+(\d+):", content, re.MULTILINE)
|
|
53
|
-
if not epic_num_match:
|
|
54
|
-
epic_num_match = re.search(r"epic-(\d+)", epic_path.name, re.IGNORECASE)
|
|
55
|
-
if not epic_num_match:
|
|
56
|
-
raise ValueError(f"Could not determine epic number from {epic_path}")
|
|
57
|
-
epic_number = int(epic_num_match.group(1))
|
|
58
|
-
|
|
59
|
-
if report_path is None:
|
|
60
|
-
report_path = epic_path.parent / f"epic-{epic_number}-report.json"
|
|
61
|
-
else:
|
|
62
|
-
report_path = Path(report_path)
|
|
63
|
-
if not report_path.is_absolute():
|
|
64
|
-
report_path = root / report_path
|
|
65
|
-
|
|
66
|
-
if not report_path.exists():
|
|
67
|
-
raise FileNotFoundError(f"Report file not found: {report_path}")
|
|
68
|
-
|
|
69
|
-
report = json.loads(report_path.read_text(encoding="utf-8"))
|
|
70
|
-
stories = report.get("stories") or []
|
|
71
|
-
if not stories:
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
# Build map story_id -> status (done | failed | in_progress)
|
|
75
|
-
status_by_id: dict[str, str] = {}
|
|
76
|
-
for s in stories:
|
|
77
|
-
sid = s.get("story_id")
|
|
78
|
-
if sid:
|
|
79
|
-
status_by_id[sid] = (s.get("status") or "unknown").lower()
|
|
80
|
-
|
|
81
|
-
# For each story id, find the story block and add/replace **Execution status:**
|
|
82
|
-
def replace_or_add_status(match: re.Match[str]) -> str:
|
|
83
|
-
story_id = match.group(2) # e.g. "2.1"
|
|
84
|
-
title_line = match.group(1)
|
|
85
|
-
rest = match.group(3)
|
|
86
|
-
status = status_by_id.get(story_id, "not run")
|
|
87
|
-
status_line = f" **Execution status:** {status}\n"
|
|
88
|
-
existing = re.search(r"^(\s*\*\*Execution status:\*\*\s*)[^\n]*\n", rest, re.MULTILINE)
|
|
89
|
-
if existing:
|
|
90
|
-
rest = rest[: existing.start()] + status_line.strip() + "\n" + rest[existing.end() :]
|
|
91
|
-
else:
|
|
92
|
-
rest = status_line + rest
|
|
93
|
-
return title_line + rest
|
|
94
|
-
|
|
95
|
-
pattern = re.compile(
|
|
96
|
-
r"^(\d+\.\s*\*\*Story\s+(\d+\.\d+):[^*]*\*\*[^\n]*\n)(.*?)(?=^\d+\.\s*\*\*Story\s|\Z)",
|
|
97
|
-
re.MULTILINE | re.DOTALL,
|
|
98
|
-
)
|
|
99
|
-
new_content = pattern.sub(
|
|
100
|
-
lambda m: replace_or_add_status(m) if m.group(2) in status_by_id else m.group(0),
|
|
101
|
-
content,
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
if new_content != content:
|
|
105
|
-
epic_path.write_text(new_content, encoding="utf-8")
|
|
1
|
+
"""
|
|
2
|
+
Sync epic execution status from report JSON back into the epic markdown file.
|
|
3
|
+
|
|
4
|
+
Updates each story block with **Execution status:** done | failed so the .md
|
|
5
|
+
reflects the last run. Run after epic execution or when you have a report file.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import re
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def update_epic_markdown_from_report(
|
|
14
|
+
epic_path: Path | str,
|
|
15
|
+
report_path: Path | None = None,
|
|
16
|
+
project_root: Path | None = None,
|
|
17
|
+
) -> None:
|
|
18
|
+
"""
|
|
19
|
+
Update the epic markdown file with execution status from the report JSON.
|
|
20
|
+
|
|
21
|
+
For each story in the report, adds or replaces a line
|
|
22
|
+
"**Execution status:** done" or "**Execution status:** failed"
|
|
23
|
+
in the corresponding story block.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
epic_path: Path to the epic .md file.
|
|
27
|
+
report_path: Path to epic-N-report.json. If None, uses same directory
|
|
28
|
+
as epic_path and filename epic-{N}-report.json (N from epic content).
|
|
29
|
+
project_root: Project root for resolving relative epic_path. Defaults to cwd.
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
FileNotFoundError: If epic or report file is missing.
|
|
33
|
+
ValueError: If report format is invalid or epic number cannot be determined.
|
|
34
|
+
"""
|
|
35
|
+
root = Path(project_root or Path.cwd())
|
|
36
|
+
epic_path = Path(epic_path)
|
|
37
|
+
if not epic_path.is_absolute():
|
|
38
|
+
for base in [root, root / "stories", root / "docs" / "prd"]:
|
|
39
|
+
candidate = base / epic_path.name if epic_path.parent.name else base / epic_path
|
|
40
|
+
if candidate.exists():
|
|
41
|
+
epic_path = candidate
|
|
42
|
+
break
|
|
43
|
+
else:
|
|
44
|
+
epic_path = root / epic_path
|
|
45
|
+
|
|
46
|
+
if not epic_path.exists():
|
|
47
|
+
raise FileNotFoundError(f"Epic file not found: {epic_path}")
|
|
48
|
+
|
|
49
|
+
content = epic_path.read_text(encoding="utf-8")
|
|
50
|
+
|
|
51
|
+
# Determine epic number from content
|
|
52
|
+
epic_num_match = re.search(r"^#\s+Epic\s+(\d+):", content, re.MULTILINE)
|
|
53
|
+
if not epic_num_match:
|
|
54
|
+
epic_num_match = re.search(r"epic-(\d+)", epic_path.name, re.IGNORECASE)
|
|
55
|
+
if not epic_num_match:
|
|
56
|
+
raise ValueError(f"Could not determine epic number from {epic_path}")
|
|
57
|
+
epic_number = int(epic_num_match.group(1))
|
|
58
|
+
|
|
59
|
+
if report_path is None:
|
|
60
|
+
report_path = epic_path.parent / f"epic-{epic_number}-report.json"
|
|
61
|
+
else:
|
|
62
|
+
report_path = Path(report_path)
|
|
63
|
+
if not report_path.is_absolute():
|
|
64
|
+
report_path = root / report_path
|
|
65
|
+
|
|
66
|
+
if not report_path.exists():
|
|
67
|
+
raise FileNotFoundError(f"Report file not found: {report_path}")
|
|
68
|
+
|
|
69
|
+
report = json.loads(report_path.read_text(encoding="utf-8"))
|
|
70
|
+
stories = report.get("stories") or []
|
|
71
|
+
if not stories:
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
# Build map story_id -> status (done | failed | in_progress)
|
|
75
|
+
status_by_id: dict[str, str] = {}
|
|
76
|
+
for s in stories:
|
|
77
|
+
sid = s.get("story_id")
|
|
78
|
+
if sid:
|
|
79
|
+
status_by_id[sid] = (s.get("status") or "unknown").lower()
|
|
80
|
+
|
|
81
|
+
# For each story id, find the story block and add/replace **Execution status:**
|
|
82
|
+
def replace_or_add_status(match: re.Match[str]) -> str:
|
|
83
|
+
story_id = match.group(2) # e.g. "2.1"
|
|
84
|
+
title_line = match.group(1)
|
|
85
|
+
rest = match.group(3)
|
|
86
|
+
status = status_by_id.get(story_id, "not run")
|
|
87
|
+
status_line = f" **Execution status:** {status}\n"
|
|
88
|
+
existing = re.search(r"^(\s*\*\*Execution status:\*\*\s*)[^\n]*\n", rest, re.MULTILINE)
|
|
89
|
+
if existing:
|
|
90
|
+
rest = rest[: existing.start()] + status_line.strip() + "\n" + rest[existing.end() :]
|
|
91
|
+
else:
|
|
92
|
+
rest = status_line + rest
|
|
93
|
+
return title_line + rest
|
|
94
|
+
|
|
95
|
+
pattern = re.compile(
|
|
96
|
+
r"^(\d+\.\s*\*\*Story\s+(\d+\.\d+):[^*]*\*\*[^\n]*\n)(.*?)(?=^\d+\.\s*\*\*Story\s|\Z)",
|
|
97
|
+
re.MULTILINE | re.DOTALL,
|
|
98
|
+
)
|
|
99
|
+
new_content = pattern.sub(
|
|
100
|
+
lambda m: replace_or_add_status(m) if m.group(2) in status_by_id else m.group(0),
|
|
101
|
+
content,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
if new_content != content:
|
|
105
|
+
epic_path.write_text(new_content, encoding="utf-8")
|
tapps_agents/epic/models.py
CHANGED
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Data models for Epic parsing and orchestration.
|
|
3
|
-
|
|
4
|
-
Migrated to Pydantic BaseModel for runtime validation and type safety.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
from enum import Enum
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import Any
|
|
12
|
-
|
|
13
|
-
from pydantic import BaseModel, Field
|
|
14
|
-
|
|
15
|
-
from ..workflow.common_enums import Priority, StoryStatus
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class AcceptanceCriterion(BaseModel):
|
|
19
|
-
"""Acceptance criterion for a story."""
|
|
20
|
-
|
|
21
|
-
description: str
|
|
22
|
-
verified: bool = False
|
|
23
|
-
|
|
24
|
-
model_config = {"extra": "forbid"}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class Story(BaseModel):
|
|
28
|
-
"""Represents a single story within an Epic."""
|
|
29
|
-
|
|
30
|
-
epic_number: int
|
|
31
|
-
story_number: int
|
|
32
|
-
title: str
|
|
33
|
-
description: str
|
|
34
|
-
acceptance_criteria: list[AcceptanceCriterion] = Field(default_factory=list)
|
|
35
|
-
dependencies: list[str] = Field(default_factory=list) # Story IDs like "8.1", "8.2"
|
|
36
|
-
story_points: int | None = Field(default=None, ge=1)
|
|
37
|
-
status: StoryStatus = StoryStatus.NOT_STARTED
|
|
38
|
-
file_path: Path | None = None # Path to story file if exists
|
|
39
|
-
|
|
40
|
-
model_config = {"extra": "forbid"}
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def story_id(self) -> str:
|
|
44
|
-
"""Get story ID in format X.Y."""
|
|
45
|
-
return f"{self.epic_number}.{self.story_number}"
|
|
46
|
-
|
|
47
|
-
@property
|
|
48
|
-
def full_id(self) -> str:
|
|
49
|
-
"""Get full story ID with prefix."""
|
|
50
|
-
return f"Story {self.story_id}"
|
|
51
|
-
|
|
52
|
-
def depends_on(self, other_story_id: str) -> bool:
|
|
53
|
-
"""Check if this story depends on another story."""
|
|
54
|
-
return other_story_id in self.dependencies
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class EpicDocument(BaseModel):
|
|
58
|
-
"""Represents a parsed Epic document."""
|
|
59
|
-
|
|
60
|
-
epic_number: int
|
|
61
|
-
title: str
|
|
62
|
-
goal: str
|
|
63
|
-
description: str
|
|
64
|
-
stories: list[Story] = Field(default_factory=list)
|
|
65
|
-
priority: Priority | None = None
|
|
66
|
-
timeline: str | None = None
|
|
67
|
-
prerequisites: list[str] = Field(default_factory=list)
|
|
68
|
-
execution_notes: dict[str, Any] = Field(default_factory=dict)
|
|
69
|
-
definition_of_done: list[str] = Field(default_factory=list)
|
|
70
|
-
status: str | None = None
|
|
71
|
-
file_path: Path | None = None
|
|
72
|
-
|
|
73
|
-
model_config = {"extra": "forbid"}
|
|
74
|
-
|
|
75
|
-
def get_story(self, story_id: str) -> Story | None:
|
|
76
|
-
"""Get a story by its ID (e.g., '8.1')."""
|
|
77
|
-
for story in self.stories:
|
|
78
|
-
if story.story_id == story_id:
|
|
79
|
-
return story
|
|
80
|
-
return None
|
|
81
|
-
|
|
82
|
-
def get_stories_by_status(self, status: StoryStatus) -> list[Story]:
|
|
83
|
-
"""Get all stories with a specific status."""
|
|
84
|
-
return [s for s in self.stories if s.status == status]
|
|
85
|
-
|
|
86
|
-
def is_complete(self) -> bool:
|
|
87
|
-
"""Check if all stories are done."""
|
|
88
|
-
return all(s.status == StoryStatus.DONE for s in self.stories)
|
|
89
|
-
|
|
90
|
-
def completion_percentage(self) -> float:
|
|
91
|
-
"""Calculate completion percentage."""
|
|
92
|
-
if not self.stories:
|
|
93
|
-
return 0.0
|
|
94
|
-
done_count = sum(1 for s in self.stories if s.status == StoryStatus.DONE)
|
|
95
|
-
return (done_count / len(self.stories)) * 100.0
|
|
96
|
-
|
|
1
|
+
"""
|
|
2
|
+
Data models for Epic parsing and orchestration.
|
|
3
|
+
|
|
4
|
+
Migrated to Pydantic BaseModel for runtime validation and type safety.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from enum import Enum
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
14
|
+
|
|
15
|
+
from ..workflow.common_enums import Priority, StoryStatus
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AcceptanceCriterion(BaseModel):
|
|
19
|
+
"""Acceptance criterion for a story."""
|
|
20
|
+
|
|
21
|
+
description: str
|
|
22
|
+
verified: bool = False
|
|
23
|
+
|
|
24
|
+
model_config = {"extra": "forbid"}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Story(BaseModel):
|
|
28
|
+
"""Represents a single story within an Epic."""
|
|
29
|
+
|
|
30
|
+
epic_number: int
|
|
31
|
+
story_number: int
|
|
32
|
+
title: str
|
|
33
|
+
description: str
|
|
34
|
+
acceptance_criteria: list[AcceptanceCriterion] = Field(default_factory=list)
|
|
35
|
+
dependencies: list[str] = Field(default_factory=list) # Story IDs like "8.1", "8.2"
|
|
36
|
+
story_points: int | None = Field(default=None, ge=1)
|
|
37
|
+
status: StoryStatus = StoryStatus.NOT_STARTED
|
|
38
|
+
file_path: Path | None = None # Path to story file if exists
|
|
39
|
+
|
|
40
|
+
model_config = {"extra": "forbid"}
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def story_id(self) -> str:
|
|
44
|
+
"""Get story ID in format X.Y."""
|
|
45
|
+
return f"{self.epic_number}.{self.story_number}"
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def full_id(self) -> str:
|
|
49
|
+
"""Get full story ID with prefix."""
|
|
50
|
+
return f"Story {self.story_id}"
|
|
51
|
+
|
|
52
|
+
def depends_on(self, other_story_id: str) -> bool:
|
|
53
|
+
"""Check if this story depends on another story."""
|
|
54
|
+
return other_story_id in self.dependencies
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class EpicDocument(BaseModel):
|
|
58
|
+
"""Represents a parsed Epic document."""
|
|
59
|
+
|
|
60
|
+
epic_number: int
|
|
61
|
+
title: str
|
|
62
|
+
goal: str
|
|
63
|
+
description: str
|
|
64
|
+
stories: list[Story] = Field(default_factory=list)
|
|
65
|
+
priority: Priority | None = None
|
|
66
|
+
timeline: str | None = None
|
|
67
|
+
prerequisites: list[str] = Field(default_factory=list)
|
|
68
|
+
execution_notes: dict[str, Any] = Field(default_factory=dict)
|
|
69
|
+
definition_of_done: list[str] = Field(default_factory=list)
|
|
70
|
+
status: str | None = None
|
|
71
|
+
file_path: Path | None = None
|
|
72
|
+
|
|
73
|
+
model_config = {"extra": "forbid"}
|
|
74
|
+
|
|
75
|
+
def get_story(self, story_id: str) -> Story | None:
|
|
76
|
+
"""Get a story by its ID (e.g., '8.1')."""
|
|
77
|
+
for story in self.stories:
|
|
78
|
+
if story.story_id == story_id:
|
|
79
|
+
return story
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
def get_stories_by_status(self, status: StoryStatus) -> list[Story]:
|
|
83
|
+
"""Get all stories with a specific status."""
|
|
84
|
+
return [s for s in self.stories if s.status == status]
|
|
85
|
+
|
|
86
|
+
def is_complete(self) -> bool:
|
|
87
|
+
"""Check if all stories are done."""
|
|
88
|
+
return all(s.status == StoryStatus.DONE for s in self.stories)
|
|
89
|
+
|
|
90
|
+
def completion_percentage(self) -> float:
|
|
91
|
+
"""Calculate completion percentage."""
|
|
92
|
+
if not self.stories:
|
|
93
|
+
return 0.0
|
|
94
|
+
done_count = sum(1 for s in self.stories if s.status == StoryStatus.DONE)
|
|
95
|
+
return (done_count / len(self.stories)) * 100.0
|
|
96
|
+
|