tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,395 +1,395 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Workflow Documentation Manager - Organizes documentation by workflow ID.
|
|
3
|
-
|
|
4
|
-
Manages workflow-specific documentation directories and file paths.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import re
|
|
8
|
-
from datetime import datetime
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
import logging
|
|
13
|
-
|
|
14
|
-
try:
|
|
15
|
-
import yaml
|
|
16
|
-
except ImportError:
|
|
17
|
-
yaml = None # type: ignore
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class DocumentationError(Exception):
|
|
23
|
-
"""Exception raised for documentation operation errors."""
|
|
24
|
-
|
|
25
|
-
pass
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class WorkflowDocumentationManager:
|
|
29
|
-
"""Manages workflow-specific documentation organization."""
|
|
30
|
-
|
|
31
|
-
def __init__(
|
|
32
|
-
self,
|
|
33
|
-
base_dir: Path,
|
|
34
|
-
workflow_id: str,
|
|
35
|
-
create_symlink: bool = False,
|
|
36
|
-
):
|
|
37
|
-
"""
|
|
38
|
-
Initialize documentation manager.
|
|
39
|
-
|
|
40
|
-
Args:
|
|
41
|
-
base_dir: Base directory for documentation (e.g., docs/workflows/simple-mode/)
|
|
42
|
-
workflow_id: Workflow identifier
|
|
43
|
-
create_symlink: Create 'latest' symlink to this workflow
|
|
44
|
-
"""
|
|
45
|
-
self.base_dir = Path(base_dir)
|
|
46
|
-
self.workflow_id = workflow_id
|
|
47
|
-
self.create_symlink = create_symlink
|
|
48
|
-
self._doc_dir: Path | None = None
|
|
49
|
-
|
|
50
|
-
@staticmethod
|
|
51
|
-
def generate_workflow_id(base_name: str = "build") -> str:
|
|
52
|
-
"""
|
|
53
|
-
Generate unique workflow ID.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
base_name: Base name for workflow ID
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
Workflow ID in format: {base_name}-{timestamp}
|
|
60
|
-
"""
|
|
61
|
-
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
62
|
-
return f"{base_name}-{timestamp}"
|
|
63
|
-
|
|
64
|
-
def get_documentation_dir(self) -> Path:
|
|
65
|
-
"""
|
|
66
|
-
Get workflow-specific documentation directory.
|
|
67
|
-
|
|
68
|
-
Returns:
|
|
69
|
-
Path to workflow documentation directory
|
|
70
|
-
"""
|
|
71
|
-
if self._doc_dir is None:
|
|
72
|
-
self._doc_dir = self.base_dir / self.workflow_id
|
|
73
|
-
return self._doc_dir
|
|
74
|
-
|
|
75
|
-
def get_step_file_path(
|
|
76
|
-
self, step_number: int, step_name: str | None = None
|
|
77
|
-
) -> Path:
|
|
78
|
-
"""
|
|
79
|
-
Get file path for step documentation.
|
|
80
|
-
|
|
81
|
-
Args:
|
|
82
|
-
step_number: Step number (1-based)
|
|
83
|
-
step_name: Optional step name (e.g., "enhanced-prompt")
|
|
84
|
-
|
|
85
|
-
Returns:
|
|
86
|
-
Path to step documentation file
|
|
87
|
-
"""
|
|
88
|
-
doc_dir = self.get_documentation_dir()
|
|
89
|
-
if step_name:
|
|
90
|
-
filename = f"step{step_number}-{step_name}.md"
|
|
91
|
-
else:
|
|
92
|
-
filename = f"step{step_number}.md"
|
|
93
|
-
return doc_dir / filename
|
|
94
|
-
|
|
95
|
-
def create_directory(self) -> Path:
|
|
96
|
-
"""
|
|
97
|
-
Create workflow documentation directory.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
Path to created directory
|
|
101
|
-
|
|
102
|
-
Raises:
|
|
103
|
-
DocumentationError: If directory creation fails
|
|
104
|
-
"""
|
|
105
|
-
doc_dir = self.get_documentation_dir()
|
|
106
|
-
try:
|
|
107
|
-
doc_dir.mkdir(parents=True, exist_ok=True)
|
|
108
|
-
logger.debug(f"Created documentation directory: {doc_dir}")
|
|
109
|
-
return doc_dir
|
|
110
|
-
except OSError as e:
|
|
111
|
-
raise DocumentationError(
|
|
112
|
-
f"Failed to create documentation directory {doc_dir}: {e}"
|
|
113
|
-
) from e
|
|
114
|
-
|
|
115
|
-
def save_step_documentation(
|
|
116
|
-
self,
|
|
117
|
-
step_number: int,
|
|
118
|
-
content: str,
|
|
119
|
-
step_name: str | None = None,
|
|
120
|
-
) -> Path:
|
|
121
|
-
"""
|
|
122
|
-
Save step documentation to workflow directory.
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
step_number: Step number (1-based)
|
|
126
|
-
content: Documentation content (markdown)
|
|
127
|
-
step_name: Optional step name
|
|
128
|
-
|
|
129
|
-
Returns:
|
|
130
|
-
Path to saved file
|
|
131
|
-
|
|
132
|
-
Raises:
|
|
133
|
-
DocumentationError: If save fails
|
|
134
|
-
"""
|
|
135
|
-
# Ensure directory exists
|
|
136
|
-
self.create_directory()
|
|
137
|
-
|
|
138
|
-
# Get file path
|
|
139
|
-
file_path = self.get_step_file_path(step_number, step_name)
|
|
140
|
-
|
|
141
|
-
try:
|
|
142
|
-
# Write content with UTF-8 encoding
|
|
143
|
-
file_path.write_text(content, encoding="utf-8")
|
|
144
|
-
logger.debug(f"Saved step documentation: {file_path}")
|
|
145
|
-
return file_path
|
|
146
|
-
except OSError as e:
|
|
147
|
-
raise DocumentationError(
|
|
148
|
-
f"Failed to save documentation to {file_path}: {e}"
|
|
149
|
-
) from e
|
|
150
|
-
|
|
151
|
-
def create_latest_symlink(self) -> Path | None:
|
|
152
|
-
"""
|
|
153
|
-
Create 'latest' symlink to this workflow.
|
|
154
|
-
|
|
155
|
-
Returns:
|
|
156
|
-
Path to symlink, or None if creation failed
|
|
157
|
-
"""
|
|
158
|
-
if not self.create_symlink:
|
|
159
|
-
return None
|
|
160
|
-
|
|
161
|
-
symlink_path = self.base_dir / "latest"
|
|
162
|
-
doc_dir = self.get_documentation_dir()
|
|
163
|
-
|
|
164
|
-
try:
|
|
165
|
-
# Remove existing symlink if it exists
|
|
166
|
-
if symlink_path.exists() or symlink_path.is_symlink():
|
|
167
|
-
symlink_path.unlink()
|
|
168
|
-
|
|
169
|
-
# Create symlink (platform-specific)
|
|
170
|
-
import sys
|
|
171
|
-
|
|
172
|
-
if sys.platform == "win32":
|
|
173
|
-
# Windows: Use junction or directory symlink
|
|
174
|
-
# For now, create a text file with path (Windows symlinks require admin)
|
|
175
|
-
symlink_path.write_text(
|
|
176
|
-
f"Latest workflow: {self.workflow_id}\nPath: {doc_dir}",
|
|
177
|
-
encoding="utf-8",
|
|
178
|
-
)
|
|
179
|
-
logger.debug(f"Created latest pointer file: {symlink_path}")
|
|
180
|
-
else:
|
|
181
|
-
# Unix: Create symlink
|
|
182
|
-
symlink_path.symlink_to(doc_dir)
|
|
183
|
-
logger.debug(f"Created latest symlink: {symlink_path}")
|
|
184
|
-
|
|
185
|
-
return symlink_path
|
|
186
|
-
except OSError as e:
|
|
187
|
-
logger.warning(f"Failed to create latest symlink: {e}")
|
|
188
|
-
return None
|
|
189
|
-
|
|
190
|
-
def save_step_state(
|
|
191
|
-
self,
|
|
192
|
-
step_number: int,
|
|
193
|
-
state: dict[str, Any],
|
|
194
|
-
content: str,
|
|
195
|
-
step_name: str | None = None,
|
|
196
|
-
) -> Path:
|
|
197
|
-
"""
|
|
198
|
-
Save workflow state with YAML frontmatter and markdown content.
|
|
199
|
-
|
|
200
|
-
Args:
|
|
201
|
-
step_number: Step number (1-based)
|
|
202
|
-
state: State dictionary to serialize
|
|
203
|
-
content: Markdown content
|
|
204
|
-
step_name: Optional step name
|
|
205
|
-
|
|
206
|
-
Returns:
|
|
207
|
-
Path to saved file
|
|
208
|
-
|
|
209
|
-
Raises:
|
|
210
|
-
DocumentationError: If save fails
|
|
211
|
-
"""
|
|
212
|
-
if yaml is None:
|
|
213
|
-
logger.warning("PyYAML not available, saving without state frontmatter")
|
|
214
|
-
return self.save_step_documentation(step_number, content, step_name)
|
|
215
|
-
|
|
216
|
-
# Ensure directory exists
|
|
217
|
-
self.create_directory()
|
|
218
|
-
|
|
219
|
-
# Get file path
|
|
220
|
-
file_path = self.get_step_file_path(step_number, step_name)
|
|
221
|
-
|
|
222
|
-
try:
|
|
223
|
-
# Serialize state to YAML
|
|
224
|
-
yaml_frontmatter = yaml.dump(state, default_flow_style=False, allow_unicode=True)
|
|
225
|
-
|
|
226
|
-
# Combine YAML frontmatter and markdown content
|
|
227
|
-
# Format: ---\n{yaml}\n---\n\n{markdown}
|
|
228
|
-
full_content = f"---\n{yaml_frontmatter}---\n\n{content}"
|
|
229
|
-
|
|
230
|
-
# Write content with UTF-8 encoding
|
|
231
|
-
file_path.write_text(full_content, encoding="utf-8")
|
|
232
|
-
logger.debug(f"Saved step state and documentation: {file_path}")
|
|
233
|
-
return file_path
|
|
234
|
-
except OSError as e:
|
|
235
|
-
raise DocumentationError(
|
|
236
|
-
f"Failed to save state to {file_path}: {e}"
|
|
237
|
-
) from e
|
|
238
|
-
except Exception as e:
|
|
239
|
-
raise DocumentationError(
|
|
240
|
-
f"Failed to serialize state for step {step_number}: {e}"
|
|
241
|
-
) from e
|
|
242
|
-
|
|
243
|
-
def create_workflow_summary(self) -> Path:
|
|
244
|
-
"""
|
|
245
|
-
Create workflow summary file with key information.
|
|
246
|
-
|
|
247
|
-
Returns:
|
|
248
|
-
Path to summary file
|
|
249
|
-
|
|
250
|
-
Raises:
|
|
251
|
-
DocumentationError: If summary creation fails
|
|
252
|
-
"""
|
|
253
|
-
self.create_directory()
|
|
254
|
-
summary_path = self.get_documentation_dir() / "workflow-summary.md"
|
|
255
|
-
|
|
256
|
-
try:
|
|
257
|
-
# Collect information
|
|
258
|
-
steps_completed = self._get_completed_steps()
|
|
259
|
-
key_decisions = self._extract_key_decisions()
|
|
260
|
-
artifacts_created = self._list_artifacts()
|
|
261
|
-
|
|
262
|
-
# Generate summary markdown
|
|
263
|
-
summary_lines = [
|
|
264
|
-
f"# Workflow Summary: {self.workflow_id}",
|
|
265
|
-
"",
|
|
266
|
-
f"**Workflow ID:** {self.workflow_id}",
|
|
267
|
-
f"**Date:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
|
|
268
|
-
"",
|
|
269
|
-
"## Steps Completed",
|
|
270
|
-
"",
|
|
271
|
-
]
|
|
272
|
-
|
|
273
|
-
if steps_completed:
|
|
274
|
-
for step_num in steps_completed:
|
|
275
|
-
summary_lines.append(f"- Step {step_num}")
|
|
276
|
-
else:
|
|
277
|
-
summary_lines.append("- No steps completed yet")
|
|
278
|
-
|
|
279
|
-
summary_lines.extend([
|
|
280
|
-
"",
|
|
281
|
-
"## Key Decisions",
|
|
282
|
-
"",
|
|
283
|
-
])
|
|
284
|
-
|
|
285
|
-
if key_decisions:
|
|
286
|
-
for decision in key_decisions:
|
|
287
|
-
summary_lines.append(f"- {decision}")
|
|
288
|
-
else:
|
|
289
|
-
summary_lines.append("- No key decisions extracted")
|
|
290
|
-
|
|
291
|
-
summary_lines.extend([
|
|
292
|
-
"",
|
|
293
|
-
"## Artifacts Created",
|
|
294
|
-
"",
|
|
295
|
-
])
|
|
296
|
-
|
|
297
|
-
if artifacts_created:
|
|
298
|
-
for artifact in artifacts_created:
|
|
299
|
-
summary_lines.append(f"- {artifact}")
|
|
300
|
-
else:
|
|
301
|
-
summary_lines.append("- No artifacts listed")
|
|
302
|
-
|
|
303
|
-
summary_lines.extend([
|
|
304
|
-
"",
|
|
305
|
-
"## Step Files",
|
|
306
|
-
"",
|
|
307
|
-
])
|
|
308
|
-
|
|
309
|
-
# List step files
|
|
310
|
-
doc_dir = self.get_documentation_dir()
|
|
311
|
-
step_files = sorted(doc_dir.glob("step*.md"))
|
|
312
|
-
for step_file in step_files:
|
|
313
|
-
summary_lines.append(f"- [{step_file.name}]({step_file.name})")
|
|
314
|
-
|
|
315
|
-
summary_content = "\n".join(summary_lines)
|
|
316
|
-
summary_path.write_text(summary_content, encoding="utf-8")
|
|
317
|
-
logger.debug(f"Created workflow summary: {summary_path}")
|
|
318
|
-
return summary_path
|
|
319
|
-
|
|
320
|
-
except OSError as e:
|
|
321
|
-
raise DocumentationError(
|
|
322
|
-
f"Failed to create workflow summary: {e}"
|
|
323
|
-
) from e
|
|
324
|
-
|
|
325
|
-
def _get_completed_steps(self) -> list[int]:
|
|
326
|
-
"""Get list of completed step numbers."""
|
|
327
|
-
doc_dir = self.get_documentation_dir()
|
|
328
|
-
if not doc_dir.exists():
|
|
329
|
-
return []
|
|
330
|
-
|
|
331
|
-
step_files = doc_dir.glob("step*.md")
|
|
332
|
-
step_numbers = []
|
|
333
|
-
|
|
334
|
-
for step_file in step_files:
|
|
335
|
-
# Extract step number from filename: step{N}-{name}.md or step{N}.md
|
|
336
|
-
match = re.match(r"step(\d+)", step_file.stem)
|
|
337
|
-
if match:
|
|
338
|
-
step_numbers.append(int(match.group(1)))
|
|
339
|
-
|
|
340
|
-
return sorted(step_numbers)
|
|
341
|
-
|
|
342
|
-
def _extract_key_decisions(self) -> list[str]:
|
|
343
|
-
"""Extract key decisions from step files."""
|
|
344
|
-
# Simple extraction: look for "## Key Decisions" or "## Decision" sections
|
|
345
|
-
decisions = []
|
|
346
|
-
doc_dir = self.get_documentation_dir()
|
|
347
|
-
|
|
348
|
-
if not doc_dir.exists():
|
|
349
|
-
return decisions
|
|
350
|
-
|
|
351
|
-
for step_file in sorted(doc_dir.glob("step*.md")):
|
|
352
|
-
try:
|
|
353
|
-
content = step_file.read_text(encoding="utf-8")
|
|
354
|
-
# Look for decision sections
|
|
355
|
-
if "## Key Decisions" in content or "## Decision" in content:
|
|
356
|
-
# Extract decision items (simple heuristic)
|
|
357
|
-
lines = content.split("\n")
|
|
358
|
-
in_decision_section = False
|
|
359
|
-
for line in lines:
|
|
360
|
-
if "## Key Decisions" in line or "## Decision" in line:
|
|
361
|
-
in_decision_section = True
|
|
362
|
-
continue
|
|
363
|
-
if in_decision_section:
|
|
364
|
-
if line.startswith("##"):
|
|
365
|
-
break
|
|
366
|
-
if line.strip().startswith("-") and len(line.strip()) > 5:
|
|
367
|
-
decisions.append(line.strip()[2:]) # Remove "- "
|
|
368
|
-
except Exception as e:
|
|
369
|
-
logger.debug(f"Failed to extract decisions from {step_file}: {e}")
|
|
370
|
-
|
|
371
|
-
return decisions[:10] # Limit to 10 decisions
|
|
372
|
-
|
|
373
|
-
def _list_artifacts(self) -> list[str]:
|
|
374
|
-
"""List artifacts created during workflow."""
|
|
375
|
-
# Simple implementation: list code files created
|
|
376
|
-
artifacts = []
|
|
377
|
-
doc_dir = self.get_documentation_dir()
|
|
378
|
-
|
|
379
|
-
# Check for common artifact patterns in step files
|
|
380
|
-
if doc_dir.exists():
|
|
381
|
-
for step_file in sorted(doc_dir.glob("step*.md")):
|
|
382
|
-
try:
|
|
383
|
-
content = step_file.read_text(encoding="utf-8")
|
|
384
|
-
# Look for file paths mentioned in step files
|
|
385
|
-
import re
|
|
386
|
-
file_pattern = r"`([^`]+\.(py|md|yaml|yml|json))`"
|
|
387
|
-
matches = re.findall(file_pattern, content)
|
|
388
|
-
for match in matches:
|
|
389
|
-
file_path = match[0]
|
|
390
|
-
if file_path not in artifacts:
|
|
391
|
-
artifacts.append(file_path)
|
|
392
|
-
except Exception:
|
|
393
|
-
pass
|
|
394
|
-
|
|
395
|
-
return artifacts[:20] # Limit to 20 artifacts
|
|
1
|
+
"""
|
|
2
|
+
Workflow Documentation Manager - Organizes documentation by workflow ID.
|
|
3
|
+
|
|
4
|
+
Manages workflow-specific documentation directories and file paths.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
import yaml
|
|
16
|
+
except ImportError:
|
|
17
|
+
yaml = None # type: ignore
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DocumentationError(Exception):
|
|
23
|
+
"""Exception raised for documentation operation errors."""
|
|
24
|
+
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class WorkflowDocumentationManager:
|
|
29
|
+
"""Manages workflow-specific documentation organization."""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
base_dir: Path,
|
|
34
|
+
workflow_id: str,
|
|
35
|
+
create_symlink: bool = False,
|
|
36
|
+
):
|
|
37
|
+
"""
|
|
38
|
+
Initialize documentation manager.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
base_dir: Base directory for documentation (e.g., docs/workflows/simple-mode/)
|
|
42
|
+
workflow_id: Workflow identifier
|
|
43
|
+
create_symlink: Create 'latest' symlink to this workflow
|
|
44
|
+
"""
|
|
45
|
+
self.base_dir = Path(base_dir)
|
|
46
|
+
self.workflow_id = workflow_id
|
|
47
|
+
self.create_symlink = create_symlink
|
|
48
|
+
self._doc_dir: Path | None = None
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def generate_workflow_id(base_name: str = "build") -> str:
|
|
52
|
+
"""
|
|
53
|
+
Generate unique workflow ID.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
base_name: Base name for workflow ID
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Workflow ID in format: {base_name}-{timestamp}
|
|
60
|
+
"""
|
|
61
|
+
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
62
|
+
return f"{base_name}-{timestamp}"
|
|
63
|
+
|
|
64
|
+
def get_documentation_dir(self) -> Path:
|
|
65
|
+
"""
|
|
66
|
+
Get workflow-specific documentation directory.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Path to workflow documentation directory
|
|
70
|
+
"""
|
|
71
|
+
if self._doc_dir is None:
|
|
72
|
+
self._doc_dir = self.base_dir / self.workflow_id
|
|
73
|
+
return self._doc_dir
|
|
74
|
+
|
|
75
|
+
def get_step_file_path(
|
|
76
|
+
self, step_number: int, step_name: str | None = None
|
|
77
|
+
) -> Path:
|
|
78
|
+
"""
|
|
79
|
+
Get file path for step documentation.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
step_number: Step number (1-based)
|
|
83
|
+
step_name: Optional step name (e.g., "enhanced-prompt")
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Path to step documentation file
|
|
87
|
+
"""
|
|
88
|
+
doc_dir = self.get_documentation_dir()
|
|
89
|
+
if step_name:
|
|
90
|
+
filename = f"step{step_number}-{step_name}.md"
|
|
91
|
+
else:
|
|
92
|
+
filename = f"step{step_number}.md"
|
|
93
|
+
return doc_dir / filename
|
|
94
|
+
|
|
95
|
+
def create_directory(self) -> Path:
|
|
96
|
+
"""
|
|
97
|
+
Create workflow documentation directory.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Path to created directory
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
DocumentationError: If directory creation fails
|
|
104
|
+
"""
|
|
105
|
+
doc_dir = self.get_documentation_dir()
|
|
106
|
+
try:
|
|
107
|
+
doc_dir.mkdir(parents=True, exist_ok=True)
|
|
108
|
+
logger.debug(f"Created documentation directory: {doc_dir}")
|
|
109
|
+
return doc_dir
|
|
110
|
+
except OSError as e:
|
|
111
|
+
raise DocumentationError(
|
|
112
|
+
f"Failed to create documentation directory {doc_dir}: {e}"
|
|
113
|
+
) from e
|
|
114
|
+
|
|
115
|
+
def save_step_documentation(
|
|
116
|
+
self,
|
|
117
|
+
step_number: int,
|
|
118
|
+
content: str,
|
|
119
|
+
step_name: str | None = None,
|
|
120
|
+
) -> Path:
|
|
121
|
+
"""
|
|
122
|
+
Save step documentation to workflow directory.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
step_number: Step number (1-based)
|
|
126
|
+
content: Documentation content (markdown)
|
|
127
|
+
step_name: Optional step name
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Path to saved file
|
|
131
|
+
|
|
132
|
+
Raises:
|
|
133
|
+
DocumentationError: If save fails
|
|
134
|
+
"""
|
|
135
|
+
# Ensure directory exists
|
|
136
|
+
self.create_directory()
|
|
137
|
+
|
|
138
|
+
# Get file path
|
|
139
|
+
file_path = self.get_step_file_path(step_number, step_name)
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
# Write content with UTF-8 encoding
|
|
143
|
+
file_path.write_text(content, encoding="utf-8")
|
|
144
|
+
logger.debug(f"Saved step documentation: {file_path}")
|
|
145
|
+
return file_path
|
|
146
|
+
except OSError as e:
|
|
147
|
+
raise DocumentationError(
|
|
148
|
+
f"Failed to save documentation to {file_path}: {e}"
|
|
149
|
+
) from e
|
|
150
|
+
|
|
151
|
+
def create_latest_symlink(self) -> Path | None:
|
|
152
|
+
"""
|
|
153
|
+
Create 'latest' symlink to this workflow.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Path to symlink, or None if creation failed
|
|
157
|
+
"""
|
|
158
|
+
if not self.create_symlink:
|
|
159
|
+
return None
|
|
160
|
+
|
|
161
|
+
symlink_path = self.base_dir / "latest"
|
|
162
|
+
doc_dir = self.get_documentation_dir()
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
# Remove existing symlink if it exists
|
|
166
|
+
if symlink_path.exists() or symlink_path.is_symlink():
|
|
167
|
+
symlink_path.unlink()
|
|
168
|
+
|
|
169
|
+
# Create symlink (platform-specific)
|
|
170
|
+
import sys
|
|
171
|
+
|
|
172
|
+
if sys.platform == "win32":
|
|
173
|
+
# Windows: Use junction or directory symlink
|
|
174
|
+
# For now, create a text file with path (Windows symlinks require admin)
|
|
175
|
+
symlink_path.write_text(
|
|
176
|
+
f"Latest workflow: {self.workflow_id}\nPath: {doc_dir}",
|
|
177
|
+
encoding="utf-8",
|
|
178
|
+
)
|
|
179
|
+
logger.debug(f"Created latest pointer file: {symlink_path}")
|
|
180
|
+
else:
|
|
181
|
+
# Unix: Create symlink
|
|
182
|
+
symlink_path.symlink_to(doc_dir)
|
|
183
|
+
logger.debug(f"Created latest symlink: {symlink_path}")
|
|
184
|
+
|
|
185
|
+
return symlink_path
|
|
186
|
+
except OSError as e:
|
|
187
|
+
logger.warning(f"Failed to create latest symlink: {e}")
|
|
188
|
+
return None
|
|
189
|
+
|
|
190
|
+
def save_step_state(
|
|
191
|
+
self,
|
|
192
|
+
step_number: int,
|
|
193
|
+
state: dict[str, Any],
|
|
194
|
+
content: str,
|
|
195
|
+
step_name: str | None = None,
|
|
196
|
+
) -> Path:
|
|
197
|
+
"""
|
|
198
|
+
Save workflow state with YAML frontmatter and markdown content.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
step_number: Step number (1-based)
|
|
202
|
+
state: State dictionary to serialize
|
|
203
|
+
content: Markdown content
|
|
204
|
+
step_name: Optional step name
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Path to saved file
|
|
208
|
+
|
|
209
|
+
Raises:
|
|
210
|
+
DocumentationError: If save fails
|
|
211
|
+
"""
|
|
212
|
+
if yaml is None:
|
|
213
|
+
logger.warning("PyYAML not available, saving without state frontmatter")
|
|
214
|
+
return self.save_step_documentation(step_number, content, step_name)
|
|
215
|
+
|
|
216
|
+
# Ensure directory exists
|
|
217
|
+
self.create_directory()
|
|
218
|
+
|
|
219
|
+
# Get file path
|
|
220
|
+
file_path = self.get_step_file_path(step_number, step_name)
|
|
221
|
+
|
|
222
|
+
try:
|
|
223
|
+
# Serialize state to YAML
|
|
224
|
+
yaml_frontmatter = yaml.dump(state, default_flow_style=False, allow_unicode=True)
|
|
225
|
+
|
|
226
|
+
# Combine YAML frontmatter and markdown content
|
|
227
|
+
# Format: ---\n{yaml}\n---\n\n{markdown}
|
|
228
|
+
full_content = f"---\n{yaml_frontmatter}---\n\n{content}"
|
|
229
|
+
|
|
230
|
+
# Write content with UTF-8 encoding
|
|
231
|
+
file_path.write_text(full_content, encoding="utf-8")
|
|
232
|
+
logger.debug(f"Saved step state and documentation: {file_path}")
|
|
233
|
+
return file_path
|
|
234
|
+
except OSError as e:
|
|
235
|
+
raise DocumentationError(
|
|
236
|
+
f"Failed to save state to {file_path}: {e}"
|
|
237
|
+
) from e
|
|
238
|
+
except Exception as e:
|
|
239
|
+
raise DocumentationError(
|
|
240
|
+
f"Failed to serialize state for step {step_number}: {e}"
|
|
241
|
+
) from e
|
|
242
|
+
|
|
243
|
+
def create_workflow_summary(self) -> Path:
|
|
244
|
+
"""
|
|
245
|
+
Create workflow summary file with key information.
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
Path to summary file
|
|
249
|
+
|
|
250
|
+
Raises:
|
|
251
|
+
DocumentationError: If summary creation fails
|
|
252
|
+
"""
|
|
253
|
+
self.create_directory()
|
|
254
|
+
summary_path = self.get_documentation_dir() / "workflow-summary.md"
|
|
255
|
+
|
|
256
|
+
try:
|
|
257
|
+
# Collect information
|
|
258
|
+
steps_completed = self._get_completed_steps()
|
|
259
|
+
key_decisions = self._extract_key_decisions()
|
|
260
|
+
artifacts_created = self._list_artifacts()
|
|
261
|
+
|
|
262
|
+
# Generate summary markdown
|
|
263
|
+
summary_lines = [
|
|
264
|
+
f"# Workflow Summary: {self.workflow_id}",
|
|
265
|
+
"",
|
|
266
|
+
f"**Workflow ID:** {self.workflow_id}",
|
|
267
|
+
f"**Date:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
|
|
268
|
+
"",
|
|
269
|
+
"## Steps Completed",
|
|
270
|
+
"",
|
|
271
|
+
]
|
|
272
|
+
|
|
273
|
+
if steps_completed:
|
|
274
|
+
for step_num in steps_completed:
|
|
275
|
+
summary_lines.append(f"- Step {step_num}")
|
|
276
|
+
else:
|
|
277
|
+
summary_lines.append("- No steps completed yet")
|
|
278
|
+
|
|
279
|
+
summary_lines.extend([
|
|
280
|
+
"",
|
|
281
|
+
"## Key Decisions",
|
|
282
|
+
"",
|
|
283
|
+
])
|
|
284
|
+
|
|
285
|
+
if key_decisions:
|
|
286
|
+
for decision in key_decisions:
|
|
287
|
+
summary_lines.append(f"- {decision}")
|
|
288
|
+
else:
|
|
289
|
+
summary_lines.append("- No key decisions extracted")
|
|
290
|
+
|
|
291
|
+
summary_lines.extend([
|
|
292
|
+
"",
|
|
293
|
+
"## Artifacts Created",
|
|
294
|
+
"",
|
|
295
|
+
])
|
|
296
|
+
|
|
297
|
+
if artifacts_created:
|
|
298
|
+
for artifact in artifacts_created:
|
|
299
|
+
summary_lines.append(f"- {artifact}")
|
|
300
|
+
else:
|
|
301
|
+
summary_lines.append("- No artifacts listed")
|
|
302
|
+
|
|
303
|
+
summary_lines.extend([
|
|
304
|
+
"",
|
|
305
|
+
"## Step Files",
|
|
306
|
+
"",
|
|
307
|
+
])
|
|
308
|
+
|
|
309
|
+
# List step files
|
|
310
|
+
doc_dir = self.get_documentation_dir()
|
|
311
|
+
step_files = sorted(doc_dir.glob("step*.md"))
|
|
312
|
+
for step_file in step_files:
|
|
313
|
+
summary_lines.append(f"- [{step_file.name}]({step_file.name})")
|
|
314
|
+
|
|
315
|
+
summary_content = "\n".join(summary_lines)
|
|
316
|
+
summary_path.write_text(summary_content, encoding="utf-8")
|
|
317
|
+
logger.debug(f"Created workflow summary: {summary_path}")
|
|
318
|
+
return summary_path
|
|
319
|
+
|
|
320
|
+
except OSError as e:
|
|
321
|
+
raise DocumentationError(
|
|
322
|
+
f"Failed to create workflow summary: {e}"
|
|
323
|
+
) from e
|
|
324
|
+
|
|
325
|
+
def _get_completed_steps(self) -> list[int]:
|
|
326
|
+
"""Get list of completed step numbers."""
|
|
327
|
+
doc_dir = self.get_documentation_dir()
|
|
328
|
+
if not doc_dir.exists():
|
|
329
|
+
return []
|
|
330
|
+
|
|
331
|
+
step_files = doc_dir.glob("step*.md")
|
|
332
|
+
step_numbers = []
|
|
333
|
+
|
|
334
|
+
for step_file in step_files:
|
|
335
|
+
# Extract step number from filename: step{N}-{name}.md or step{N}.md
|
|
336
|
+
match = re.match(r"step(\d+)", step_file.stem)
|
|
337
|
+
if match:
|
|
338
|
+
step_numbers.append(int(match.group(1)))
|
|
339
|
+
|
|
340
|
+
return sorted(step_numbers)
|
|
341
|
+
|
|
342
|
+
def _extract_key_decisions(self) -> list[str]:
|
|
343
|
+
"""Extract key decisions from step files."""
|
|
344
|
+
# Simple extraction: look for "## Key Decisions" or "## Decision" sections
|
|
345
|
+
decisions = []
|
|
346
|
+
doc_dir = self.get_documentation_dir()
|
|
347
|
+
|
|
348
|
+
if not doc_dir.exists():
|
|
349
|
+
return decisions
|
|
350
|
+
|
|
351
|
+
for step_file in sorted(doc_dir.glob("step*.md")):
|
|
352
|
+
try:
|
|
353
|
+
content = step_file.read_text(encoding="utf-8")
|
|
354
|
+
# Look for decision sections
|
|
355
|
+
if "## Key Decisions" in content or "## Decision" in content:
|
|
356
|
+
# Extract decision items (simple heuristic)
|
|
357
|
+
lines = content.split("\n")
|
|
358
|
+
in_decision_section = False
|
|
359
|
+
for line in lines:
|
|
360
|
+
if "## Key Decisions" in line or "## Decision" in line:
|
|
361
|
+
in_decision_section = True
|
|
362
|
+
continue
|
|
363
|
+
if in_decision_section:
|
|
364
|
+
if line.startswith("##"):
|
|
365
|
+
break
|
|
366
|
+
if line.strip().startswith("-") and len(line.strip()) > 5:
|
|
367
|
+
decisions.append(line.strip()[2:]) # Remove "- "
|
|
368
|
+
except Exception as e:
|
|
369
|
+
logger.debug(f"Failed to extract decisions from {step_file}: {e}")
|
|
370
|
+
|
|
371
|
+
return decisions[:10] # Limit to 10 decisions
|
|
372
|
+
|
|
373
|
+
def _list_artifacts(self) -> list[str]:
|
|
374
|
+
"""List artifacts created during workflow."""
|
|
375
|
+
# Simple implementation: list code files created
|
|
376
|
+
artifacts = []
|
|
377
|
+
doc_dir = self.get_documentation_dir()
|
|
378
|
+
|
|
379
|
+
# Check for common artifact patterns in step files
|
|
380
|
+
if doc_dir.exists():
|
|
381
|
+
for step_file in sorted(doc_dir.glob("step*.md")):
|
|
382
|
+
try:
|
|
383
|
+
content = step_file.read_text(encoding="utf-8")
|
|
384
|
+
# Look for file paths mentioned in step files
|
|
385
|
+
import re
|
|
386
|
+
file_pattern = r"`([^`]+\.(py|md|yaml|yml|json))`"
|
|
387
|
+
matches = re.findall(file_pattern, content)
|
|
388
|
+
for match in matches:
|
|
389
|
+
file_path = match[0]
|
|
390
|
+
if file_path not in artifacts:
|
|
391
|
+
artifacts.append(file_path)
|
|
392
|
+
except Exception:
|
|
393
|
+
pass
|
|
394
|
+
|
|
395
|
+
return artifacts[:20] # Limit to 20 artifacts
|