tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,438 +1,438 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Knowledge Ingestion Pipeline
|
|
3
|
-
|
|
4
|
-
Automatically populates project KB from multiple sources:
|
|
5
|
-
- Project sources (requirements, architecture docs, ADRs, runbooks, SDLC reports)
|
|
6
|
-
- Context7 dependency sources (auto-fetch library docs)
|
|
7
|
-
- Operational sources (CI failures, runtime exceptions, monitoring alerts)
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import re
|
|
13
|
-
from dataclasses import dataclass, field
|
|
14
|
-
from datetime import datetime
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import TYPE_CHECKING, Any
|
|
17
|
-
|
|
18
|
-
from .domain_detector import DomainStackDetector
|
|
19
|
-
from .governance import GovernanceLayer, GovernancePolicy
|
|
20
|
-
from .simple_rag import KnowledgeChunk, SimpleKnowledgeBase
|
|
21
|
-
from .vector_rag import VectorKnowledgeBase
|
|
22
|
-
|
|
23
|
-
if TYPE_CHECKING:
|
|
24
|
-
from ..context7.agent_integration import Context7AgentHelper
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@dataclass
|
|
28
|
-
class IngestionResult:
|
|
29
|
-
"""Result of knowledge ingestion operation."""
|
|
30
|
-
|
|
31
|
-
source_type: str # project, context7, operational
|
|
32
|
-
entries_ingested: int
|
|
33
|
-
entries_failed: int
|
|
34
|
-
errors: list[str] = field(default_factory=list)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@dataclass
|
|
38
|
-
class KnowledgeEntry:
|
|
39
|
-
"""A knowledge entry to be ingested."""
|
|
40
|
-
|
|
41
|
-
title: str
|
|
42
|
-
content: str
|
|
43
|
-
domain: str
|
|
44
|
-
source: str # Source file or identifier
|
|
45
|
-
source_type: str # project, context7, operational
|
|
46
|
-
metadata: dict[str, Any] = field(default_factory=dict)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
class KnowledgeIngestionPipeline:
|
|
50
|
-
"""
|
|
51
|
-
Pipeline for ingesting knowledge from multiple sources.
|
|
52
|
-
|
|
53
|
-
Automatically populates project KB from:
|
|
54
|
-
- Project documentation (requirements, architecture, ADRs, runbooks)
|
|
55
|
-
- Context7 library documentation (auto-fetched on dependency detection)
|
|
56
|
-
- Operational sources (CI failures, exceptions, alerts)
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
# Project source patterns
|
|
60
|
-
PROJECT_SOURCE_PATTERNS = {
|
|
61
|
-
"requirements": ["requirements*.txt", "requirements*.yaml", "requirements*.yml"],
|
|
62
|
-
"architecture": ["docs/**/architecture*.md", "docs/**/arch*.md", "ARCHITECTURE.md"],
|
|
63
|
-
"adr": ["docs/adr/**/*.md", "docs/decisions/**/*.md", "adr/**/*.md"],
|
|
64
|
-
"runbook": ["docs/runbook*.md", "runbooks/**/*.md", "docs/ops/**/*.md"],
|
|
65
|
-
"sdlc_report": [".tapps-agents/reports/**/*.md", "reports/**/*.md"],
|
|
66
|
-
"lessons_learned": ["docs/lessons*.md", "docs/learnings*.md"],
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
def __init__(
|
|
70
|
-
self,
|
|
71
|
-
project_root: Path,
|
|
72
|
-
context7_helper: Context7AgentHelper | None = None,
|
|
73
|
-
governance_policy: GovernancePolicy | None = None,
|
|
74
|
-
):
|
|
75
|
-
"""
|
|
76
|
-
Initialize Knowledge Ingestion Pipeline.
|
|
77
|
-
|
|
78
|
-
Args:
|
|
79
|
-
project_root: Project root directory
|
|
80
|
-
context7_helper: Optional Context7 helper for library docs
|
|
81
|
-
governance_policy: Optional governance policy configuration
|
|
82
|
-
"""
|
|
83
|
-
self.project_root = project_root
|
|
84
|
-
self.config_dir = project_root / ".tapps-agents"
|
|
85
|
-
self.knowledge_base_dir = self.config_dir / "knowledge"
|
|
86
|
-
self.context7_helper = context7_helper
|
|
87
|
-
self.domain_detector = DomainStackDetector(project_root=project_root)
|
|
88
|
-
|
|
89
|
-
# Initialize governance layer (Story 28.5)
|
|
90
|
-
if governance_policy is None:
|
|
91
|
-
governance_policy = GovernancePolicy()
|
|
92
|
-
self.governance = GovernanceLayer(policy=governance_policy)
|
|
93
|
-
|
|
94
|
-
async def ingest_all_sources(
|
|
95
|
-
self, include_context7: bool = True, include_operational: bool = True
|
|
96
|
-
) -> dict[str, IngestionResult]:
|
|
97
|
-
"""
|
|
98
|
-
Ingest knowledge from all available sources.
|
|
99
|
-
|
|
100
|
-
Args:
|
|
101
|
-
include_context7: Whether to ingest Context7 library docs
|
|
102
|
-
include_operational: Whether to ingest operational sources
|
|
103
|
-
|
|
104
|
-
Returns:
|
|
105
|
-
Dictionary mapping source types to ingestion results
|
|
106
|
-
"""
|
|
107
|
-
results = {}
|
|
108
|
-
|
|
109
|
-
# Ingest project sources
|
|
110
|
-
project_result = self.ingest_project_sources()
|
|
111
|
-
results["project"] = project_result
|
|
112
|
-
|
|
113
|
-
# Ingest Context7 sources
|
|
114
|
-
if include_context7 and self.context7_helper:
|
|
115
|
-
context7_result = await self.ingest_context7_sources()
|
|
116
|
-
results["context7"] = context7_result
|
|
117
|
-
|
|
118
|
-
# Ingest operational sources
|
|
119
|
-
if include_operational:
|
|
120
|
-
operational_result = self.ingest_operational_sources()
|
|
121
|
-
results["operational"] = operational_result
|
|
122
|
-
|
|
123
|
-
return results
|
|
124
|
-
|
|
125
|
-
def ingest_project_sources(self) -> IngestionResult:
|
|
126
|
-
"""Ingest knowledge from project documentation sources."""
|
|
127
|
-
entries_ingested = 0
|
|
128
|
-
entries_failed = 0
|
|
129
|
-
errors = []
|
|
130
|
-
|
|
131
|
-
# Detect stack to determine relevant domains
|
|
132
|
-
detection_result = self.domain_detector.detect_stack()
|
|
133
|
-
domains = [dm.domain for dm in detection_result.domains]
|
|
134
|
-
|
|
135
|
-
# Ingest each source type
|
|
136
|
-
for source_type, patterns in self.PROJECT_SOURCE_PATTERNS.items():
|
|
137
|
-
try:
|
|
138
|
-
entries = self._ingest_source_type(source_type, patterns, domains)
|
|
139
|
-
entries_ingested += len(entries)
|
|
140
|
-
self._store_knowledge_entries(entries)
|
|
141
|
-
except Exception as e:
|
|
142
|
-
entries_failed += 1
|
|
143
|
-
errors.append(f"{source_type}: {str(e)}")
|
|
144
|
-
|
|
145
|
-
return IngestionResult(
|
|
146
|
-
source_type="project",
|
|
147
|
-
entries_ingested=entries_ingested,
|
|
148
|
-
entries_failed=entries_failed,
|
|
149
|
-
errors=errors,
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
def _ingest_source_type(
|
|
153
|
-
self, source_type: str, patterns: list[str], domains: list[str]
|
|
154
|
-
) -> list[KnowledgeEntry]:
|
|
155
|
-
"""Ingest knowledge from a specific source type."""
|
|
156
|
-
entries = []
|
|
157
|
-
|
|
158
|
-
# Find matching files
|
|
159
|
-
for pattern in patterns:
|
|
160
|
-
if "**" in pattern:
|
|
161
|
-
# Recursive glob
|
|
162
|
-
for path in self.project_root.rglob(pattern.replace("**/", "")):
|
|
163
|
-
if path.is_file():
|
|
164
|
-
entries.extend(self._parse_source_file(path, source_type, domains))
|
|
165
|
-
else:
|
|
166
|
-
# Simple glob
|
|
167
|
-
for path in self.project_root.glob(pattern):
|
|
168
|
-
if path.is_file():
|
|
169
|
-
entries.extend(self._parse_source_file(path, source_type, domains))
|
|
170
|
-
|
|
171
|
-
return entries
|
|
172
|
-
|
|
173
|
-
def _parse_source_file(
|
|
174
|
-
self, file_path: Path, source_type: str, domains: list[str]
|
|
175
|
-
) -> list[KnowledgeEntry]:
|
|
176
|
-
"""Parse a source file and extract knowledge entries."""
|
|
177
|
-
entries = []
|
|
178
|
-
|
|
179
|
-
try:
|
|
180
|
-
content = file_path.read_text(encoding="utf-8")
|
|
181
|
-
|
|
182
|
-
# Determine domain (use first matching domain or "general")
|
|
183
|
-
domain = domains[0] if domains else "general"
|
|
184
|
-
|
|
185
|
-
# Extract title from filename or content
|
|
186
|
-
title = self._extract_title(file_path, content)
|
|
187
|
-
|
|
188
|
-
# Create knowledge entry
|
|
189
|
-
entry = KnowledgeEntry(
|
|
190
|
-
title=title,
|
|
191
|
-
content=content,
|
|
192
|
-
domain=domain,
|
|
193
|
-
source=str(file_path.relative_to(self.project_root)),
|
|
194
|
-
source_type="project",
|
|
195
|
-
metadata={
|
|
196
|
-
"file_type": source_type,
|
|
197
|
-
"file_path": str(file_path),
|
|
198
|
-
"ingested_at": datetime.now().isoformat(),
|
|
199
|
-
},
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
entries.append(entry)
|
|
203
|
-
except Exception as e:
|
|
204
|
-
# Log error but continue
|
|
205
|
-
print(f"Error parsing {file_path}: {e}")
|
|
206
|
-
|
|
207
|
-
return entries
|
|
208
|
-
|
|
209
|
-
def _extract_title(self, file_path: Path, content: str) -> str:
|
|
210
|
-
"""Extract title from file path or content."""
|
|
211
|
-
# Try to extract from markdown header
|
|
212
|
-
header_match = re.search(r"^#\s+(.+)$", content, re.MULTILINE)
|
|
213
|
-
if header_match:
|
|
214
|
-
return header_match.group(1).strip()
|
|
215
|
-
|
|
216
|
-
# Use filename as fallback
|
|
217
|
-
return file_path.stem.replace("_", " ").replace("-", " ").title()
|
|
218
|
-
|
|
219
|
-
async def ingest_context7_sources(self) -> IngestionResult:
|
|
220
|
-
"""Ingest knowledge from Context7 library documentation."""
|
|
221
|
-
if not self.context7_helper:
|
|
222
|
-
return IngestionResult(
|
|
223
|
-
source_type="context7",
|
|
224
|
-
entries_ingested=0,
|
|
225
|
-
entries_failed=0,
|
|
226
|
-
errors=["Context7 helper not available"],
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
entries_ingested = 0
|
|
230
|
-
entries_failed = 0
|
|
231
|
-
errors = []
|
|
232
|
-
|
|
233
|
-
# Detect dependencies
|
|
234
|
-
detection_result = self.domain_detector.detect_stack()
|
|
235
|
-
dependencies = self._extract_dependencies(detection_result)
|
|
236
|
-
|
|
237
|
-
# Fetch Context7 docs for each dependency
|
|
238
|
-
for library in dependencies:
|
|
239
|
-
try:
|
|
240
|
-
# Fetch overview
|
|
241
|
-
overview = await self.context7_helper.get_documentation(library, topic=None)
|
|
242
|
-
if overview:
|
|
243
|
-
entry = self._create_context7_entry(
|
|
244
|
-
library, "overview", overview.get("content", "")
|
|
245
|
-
)
|
|
246
|
-
self._store_knowledge_entries([entry])
|
|
247
|
-
entries_ingested += 1
|
|
248
|
-
|
|
249
|
-
# Fetch patterns
|
|
250
|
-
patterns = await self.context7_helper.get_documentation(library, topic="patterns")
|
|
251
|
-
if patterns:
|
|
252
|
-
entry = self._create_context7_entry(
|
|
253
|
-
library, "patterns", patterns.get("content", "")
|
|
254
|
-
)
|
|
255
|
-
self._store_knowledge_entries([entry])
|
|
256
|
-
entries_ingested += 1
|
|
257
|
-
|
|
258
|
-
# Fetch pitfalls
|
|
259
|
-
pitfalls = await self.context7_helper.get_documentation(library, topic="pitfalls")
|
|
260
|
-
if pitfalls:
|
|
261
|
-
entry = self._create_context7_entry(
|
|
262
|
-
library, "pitfalls", pitfalls.get("content", "")
|
|
263
|
-
)
|
|
264
|
-
self._store_knowledge_entries([entry])
|
|
265
|
-
entries_ingested += 1
|
|
266
|
-
|
|
267
|
-
# Fetch security notes
|
|
268
|
-
security = await self.context7_helper.get_documentation(library, topic="security")
|
|
269
|
-
if security:
|
|
270
|
-
entry = self._create_context7_entry(
|
|
271
|
-
library, "security", security.get("content", "")
|
|
272
|
-
)
|
|
273
|
-
self._store_knowledge_entries([entry])
|
|
274
|
-
entries_ingested += 1
|
|
275
|
-
|
|
276
|
-
except Exception as e:
|
|
277
|
-
entries_failed += 1
|
|
278
|
-
errors.append(f"{library}: {str(e)}")
|
|
279
|
-
|
|
280
|
-
return IngestionResult(
|
|
281
|
-
source_type="context7",
|
|
282
|
-
entries_ingested=entries_ingested,
|
|
283
|
-
entries_failed=entries_failed,
|
|
284
|
-
errors=errors,
|
|
285
|
-
)
|
|
286
|
-
|
|
287
|
-
def _extract_dependencies(self, detection_result) -> list[str]:
|
|
288
|
-
"""Extract library dependencies from detection result."""
|
|
289
|
-
dependencies = []
|
|
290
|
-
|
|
291
|
-
# Extract from dependency signals
|
|
292
|
-
for signal in detection_result.signals:
|
|
293
|
-
if signal.signal_type == "dependency":
|
|
294
|
-
# Try to extract library name from signal value
|
|
295
|
-
if isinstance(signal.value, str):
|
|
296
|
-
# Parse common dependency formats
|
|
297
|
-
lib_name = signal.value.split("==")[0].split("@")[0].strip()
|
|
298
|
-
if lib_name:
|
|
299
|
-
dependencies.append(lib_name)
|
|
300
|
-
|
|
301
|
-
return list(set(dependencies)) # Remove duplicates
|
|
302
|
-
|
|
303
|
-
def _create_context7_entry(
|
|
304
|
-
self, library: str, topic: str, content: str
|
|
305
|
-
) -> KnowledgeEntry:
|
|
306
|
-
"""Create knowledge entry from Context7 documentation."""
|
|
307
|
-
# Distill Context7 content into project-specific format
|
|
308
|
-
distilled_content = self._distill_context7_content(library, topic, content)
|
|
309
|
-
|
|
310
|
-
return KnowledgeEntry(
|
|
311
|
-
title=f"{library} - {topic}",
|
|
312
|
-
content=distilled_content,
|
|
313
|
-
domain=library.lower().replace("-", "_"),
|
|
314
|
-
source=f"context7://{library}/{topic}",
|
|
315
|
-
source_type="context7",
|
|
316
|
-
metadata={
|
|
317
|
-
"library": library,
|
|
318
|
-
"topic": topic,
|
|
319
|
-
"ingested_at": datetime.now().isoformat(),
|
|
320
|
-
},
|
|
321
|
-
)
|
|
322
|
-
|
|
323
|
-
def _distill_context7_content(self, library: str, topic: str, content: str) -> str:
|
|
324
|
-
"""Distill Context7 content into project-specific knowledge."""
|
|
325
|
-
# Create "how we use X here" format
|
|
326
|
-
distilled = f"# How We Use {library} - {topic}\n\n"
|
|
327
|
-
distilled += f"## Overview\n\n{content}\n\n"
|
|
328
|
-
distilled += "## Project-Specific Notes\n\n"
|
|
329
|
-
distilled += "_Add project-specific patterns and usage here_\n"
|
|
330
|
-
|
|
331
|
-
return distilled
|
|
332
|
-
|
|
333
|
-
def ingest_operational_sources(self) -> IngestionResult:
|
|
334
|
-
"""Ingest knowledge from operational sources (CI failures, exceptions, alerts)."""
|
|
335
|
-
entries_ingested = 0
|
|
336
|
-
entries_failed = 0
|
|
337
|
-
errors = []
|
|
338
|
-
|
|
339
|
-
# Look for operational sources
|
|
340
|
-
operational_sources = [
|
|
341
|
-
self.project_root / ".github" / "workflows",
|
|
342
|
-
self.project_root / ".gitlab-ci.yml",
|
|
343
|
-
self.config_dir / "reports",
|
|
344
|
-
]
|
|
345
|
-
|
|
346
|
-
for source_path in operational_sources:
|
|
347
|
-
if not source_path.exists():
|
|
348
|
-
continue
|
|
349
|
-
|
|
350
|
-
try:
|
|
351
|
-
entries = self._parse_operational_source(source_path)
|
|
352
|
-
entries_ingested += len(entries)
|
|
353
|
-
self._store_knowledge_entries(entries)
|
|
354
|
-
except Exception as e:
|
|
355
|
-
entries_failed += 1
|
|
356
|
-
errors.append(f"{source_path}: {str(e)}")
|
|
357
|
-
|
|
358
|
-
return IngestionResult(
|
|
359
|
-
source_type="operational",
|
|
360
|
-
entries_ingested=entries_ingested,
|
|
361
|
-
entries_failed=entries_failed,
|
|
362
|
-
errors=errors,
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
def _parse_operational_source(self, source_path: Path) -> list[KnowledgeEntry]:
|
|
366
|
-
"""Parse operational source and extract known issues."""
|
|
367
|
-
entries = []
|
|
368
|
-
|
|
369
|
-
# This is a simplified implementation
|
|
370
|
-
# In practice, would parse CI logs, exception traces, monitoring alerts
|
|
371
|
-
# and convert to structured KB entries
|
|
372
|
-
|
|
373
|
-
return entries
|
|
374
|
-
|
|
375
|
-
def _store_knowledge_entries(self, entries: list[KnowledgeEntry]):
|
|
376
|
-
"""Store knowledge entries in appropriate KB backends with governance checks."""
|
|
377
|
-
# Group entries by domain
|
|
378
|
-
entries_by_domain: dict[str, list[KnowledgeEntry]] = {}
|
|
379
|
-
for entry in entries:
|
|
380
|
-
if entry.domain not in entries_by_domain:
|
|
381
|
-
entries_by_domain[entry.domain] = []
|
|
382
|
-
entries_by_domain[entry.domain].append(entry)
|
|
383
|
-
|
|
384
|
-
# Store in domain-specific knowledge bases
|
|
385
|
-
for domain, domain_entries in entries_by_domain.items():
|
|
386
|
-
domain_kb_dir = self.knowledge_base_dir / domain
|
|
387
|
-
domain_kb_dir.mkdir(parents=True, exist_ok=True)
|
|
388
|
-
|
|
389
|
-
# Try VectorKnowledgeBase first, fallback to SimpleKnowledgeBase
|
|
390
|
-
try:
|
|
391
|
-
_kb = VectorKnowledgeBase(knowledge_dir=domain_kb_dir, domain=domain)
|
|
392
|
-
except Exception:
|
|
393
|
-
_kb = SimpleKnowledgeBase(knowledge_dir=domain_kb_dir, domain=domain)
|
|
394
|
-
|
|
395
|
-
# Convert entries to knowledge chunks and add with governance checks
|
|
396
|
-
# Note: KB is created but currently using markdown file fallback
|
|
397
|
-
for entry in domain_entries:
|
|
398
|
-
# Apply governance layer (Story 28.5)
|
|
399
|
-
# 1. Filter content for secrets/PII
|
|
400
|
-
filter_result = self.governance.filter_content(entry.content, entry.source)
|
|
401
|
-
|
|
402
|
-
# 2. Use filtered content if available
|
|
403
|
-
if filter_result.filtered_content:
|
|
404
|
-
entry.content = filter_result.filtered_content
|
|
405
|
-
|
|
406
|
-
# 3. Validate entry against governance policies
|
|
407
|
-
is_valid, reason = self.governance.validate_knowledge_entry(entry)
|
|
408
|
-
|
|
409
|
-
if not is_valid:
|
|
410
|
-
# Entry failed validation - log and skip
|
|
411
|
-
print(f"Governance validation failed for {entry.title}: {reason}")
|
|
412
|
-
continue
|
|
413
|
-
|
|
414
|
-
# 4. Entry passed all checks - store it
|
|
415
|
-
_chunk = KnowledgeChunk(
|
|
416
|
-
content=entry.content,
|
|
417
|
-
metadata={
|
|
418
|
-
"title": entry.title,
|
|
419
|
-
"source": entry.source,
|
|
420
|
-
"source_type": entry.source_type,
|
|
421
|
-
**entry.metadata,
|
|
422
|
-
},
|
|
423
|
-
)
|
|
424
|
-
# Add to knowledge base (implementation depends on KB backend)
|
|
425
|
-
# For now, write to markdown files
|
|
426
|
-
# TODO: Use _kb.add_chunk(_chunk) when KB backend is fully implemented
|
|
427
|
-
self._write_knowledge_file(domain_kb_dir, entry)
|
|
428
|
-
|
|
429
|
-
def _write_knowledge_file(self, domain_dir: Path, entry: KnowledgeEntry):
|
|
430
|
-
"""Write knowledge entry to markdown file."""
|
|
431
|
-
# Sanitize title for filename
|
|
432
|
-
safe_title = re.sub(r"[^\w\s-]", "", entry.title).strip().replace(" ", "_")
|
|
433
|
-
filename = f"{safe_title}.md"
|
|
434
|
-
|
|
435
|
-
# Write content
|
|
436
|
-
file_path = domain_dir / filename
|
|
437
|
-
file_path.write_text(entry.content, encoding="utf-8")
|
|
438
|
-
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Ingestion Pipeline
|
|
3
|
+
|
|
4
|
+
Automatically populates project KB from multiple sources:
|
|
5
|
+
- Project sources (requirements, architecture docs, ADRs, runbooks, SDLC reports)
|
|
6
|
+
- Context7 dependency sources (auto-fetch library docs)
|
|
7
|
+
- Operational sources (CI failures, runtime exceptions, monitoring alerts)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import TYPE_CHECKING, Any
|
|
17
|
+
|
|
18
|
+
from .domain_detector import DomainStackDetector
|
|
19
|
+
from .governance import GovernanceLayer, GovernancePolicy
|
|
20
|
+
from .simple_rag import KnowledgeChunk, SimpleKnowledgeBase
|
|
21
|
+
from .vector_rag import VectorKnowledgeBase
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from ..context7.agent_integration import Context7AgentHelper
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class IngestionResult:
|
|
29
|
+
"""Result of knowledge ingestion operation."""
|
|
30
|
+
|
|
31
|
+
source_type: str # project, context7, operational
|
|
32
|
+
entries_ingested: int
|
|
33
|
+
entries_failed: int
|
|
34
|
+
errors: list[str] = field(default_factory=list)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class KnowledgeEntry:
|
|
39
|
+
"""A knowledge entry to be ingested."""
|
|
40
|
+
|
|
41
|
+
title: str
|
|
42
|
+
content: str
|
|
43
|
+
domain: str
|
|
44
|
+
source: str # Source file or identifier
|
|
45
|
+
source_type: str # project, context7, operational
|
|
46
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class KnowledgeIngestionPipeline:
|
|
50
|
+
"""
|
|
51
|
+
Pipeline for ingesting knowledge from multiple sources.
|
|
52
|
+
|
|
53
|
+
Automatically populates project KB from:
|
|
54
|
+
- Project documentation (requirements, architecture, ADRs, runbooks)
|
|
55
|
+
- Context7 library documentation (auto-fetched on dependency detection)
|
|
56
|
+
- Operational sources (CI failures, exceptions, alerts)
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
# Project source patterns
|
|
60
|
+
PROJECT_SOURCE_PATTERNS = {
|
|
61
|
+
"requirements": ["requirements*.txt", "requirements*.yaml", "requirements*.yml"],
|
|
62
|
+
"architecture": ["docs/**/architecture*.md", "docs/**/arch*.md", "ARCHITECTURE.md"],
|
|
63
|
+
"adr": ["docs/adr/**/*.md", "docs/decisions/**/*.md", "adr/**/*.md"],
|
|
64
|
+
"runbook": ["docs/runbook*.md", "runbooks/**/*.md", "docs/ops/**/*.md"],
|
|
65
|
+
"sdlc_report": [".tapps-agents/reports/**/*.md", "reports/**/*.md"],
|
|
66
|
+
"lessons_learned": ["docs/lessons*.md", "docs/learnings*.md"],
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
def __init__(
|
|
70
|
+
self,
|
|
71
|
+
project_root: Path,
|
|
72
|
+
context7_helper: Context7AgentHelper | None = None,
|
|
73
|
+
governance_policy: GovernancePolicy | None = None,
|
|
74
|
+
):
|
|
75
|
+
"""
|
|
76
|
+
Initialize Knowledge Ingestion Pipeline.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
project_root: Project root directory
|
|
80
|
+
context7_helper: Optional Context7 helper for library docs
|
|
81
|
+
governance_policy: Optional governance policy configuration
|
|
82
|
+
"""
|
|
83
|
+
self.project_root = project_root
|
|
84
|
+
self.config_dir = project_root / ".tapps-agents"
|
|
85
|
+
self.knowledge_base_dir = self.config_dir / "knowledge"
|
|
86
|
+
self.context7_helper = context7_helper
|
|
87
|
+
self.domain_detector = DomainStackDetector(project_root=project_root)
|
|
88
|
+
|
|
89
|
+
# Initialize governance layer (Story 28.5)
|
|
90
|
+
if governance_policy is None:
|
|
91
|
+
governance_policy = GovernancePolicy()
|
|
92
|
+
self.governance = GovernanceLayer(policy=governance_policy)
|
|
93
|
+
|
|
94
|
+
async def ingest_all_sources(
|
|
95
|
+
self, include_context7: bool = True, include_operational: bool = True
|
|
96
|
+
) -> dict[str, IngestionResult]:
|
|
97
|
+
"""
|
|
98
|
+
Ingest knowledge from all available sources.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
include_context7: Whether to ingest Context7 library docs
|
|
102
|
+
include_operational: Whether to ingest operational sources
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Dictionary mapping source types to ingestion results
|
|
106
|
+
"""
|
|
107
|
+
results = {}
|
|
108
|
+
|
|
109
|
+
# Ingest project sources
|
|
110
|
+
project_result = self.ingest_project_sources()
|
|
111
|
+
results["project"] = project_result
|
|
112
|
+
|
|
113
|
+
# Ingest Context7 sources
|
|
114
|
+
if include_context7 and self.context7_helper:
|
|
115
|
+
context7_result = await self.ingest_context7_sources()
|
|
116
|
+
results["context7"] = context7_result
|
|
117
|
+
|
|
118
|
+
# Ingest operational sources
|
|
119
|
+
if include_operational:
|
|
120
|
+
operational_result = self.ingest_operational_sources()
|
|
121
|
+
results["operational"] = operational_result
|
|
122
|
+
|
|
123
|
+
return results
|
|
124
|
+
|
|
125
|
+
def ingest_project_sources(self) -> IngestionResult:
|
|
126
|
+
"""Ingest knowledge from project documentation sources."""
|
|
127
|
+
entries_ingested = 0
|
|
128
|
+
entries_failed = 0
|
|
129
|
+
errors = []
|
|
130
|
+
|
|
131
|
+
# Detect stack to determine relevant domains
|
|
132
|
+
detection_result = self.domain_detector.detect_stack()
|
|
133
|
+
domains = [dm.domain for dm in detection_result.domains]
|
|
134
|
+
|
|
135
|
+
# Ingest each source type
|
|
136
|
+
for source_type, patterns in self.PROJECT_SOURCE_PATTERNS.items():
|
|
137
|
+
try:
|
|
138
|
+
entries = self._ingest_source_type(source_type, patterns, domains)
|
|
139
|
+
entries_ingested += len(entries)
|
|
140
|
+
self._store_knowledge_entries(entries)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
entries_failed += 1
|
|
143
|
+
errors.append(f"{source_type}: {str(e)}")
|
|
144
|
+
|
|
145
|
+
return IngestionResult(
|
|
146
|
+
source_type="project",
|
|
147
|
+
entries_ingested=entries_ingested,
|
|
148
|
+
entries_failed=entries_failed,
|
|
149
|
+
errors=errors,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def _ingest_source_type(
|
|
153
|
+
self, source_type: str, patterns: list[str], domains: list[str]
|
|
154
|
+
) -> list[KnowledgeEntry]:
|
|
155
|
+
"""Ingest knowledge from a specific source type."""
|
|
156
|
+
entries = []
|
|
157
|
+
|
|
158
|
+
# Find matching files
|
|
159
|
+
for pattern in patterns:
|
|
160
|
+
if "**" in pattern:
|
|
161
|
+
# Recursive glob
|
|
162
|
+
for path in self.project_root.rglob(pattern.replace("**/", "")):
|
|
163
|
+
if path.is_file():
|
|
164
|
+
entries.extend(self._parse_source_file(path, source_type, domains))
|
|
165
|
+
else:
|
|
166
|
+
# Simple glob
|
|
167
|
+
for path in self.project_root.glob(pattern):
|
|
168
|
+
if path.is_file():
|
|
169
|
+
entries.extend(self._parse_source_file(path, source_type, domains))
|
|
170
|
+
|
|
171
|
+
return entries
|
|
172
|
+
|
|
173
|
+
def _parse_source_file(
|
|
174
|
+
self, file_path: Path, source_type: str, domains: list[str]
|
|
175
|
+
) -> list[KnowledgeEntry]:
|
|
176
|
+
"""Parse a source file and extract knowledge entries."""
|
|
177
|
+
entries = []
|
|
178
|
+
|
|
179
|
+
try:
|
|
180
|
+
content = file_path.read_text(encoding="utf-8")
|
|
181
|
+
|
|
182
|
+
# Determine domain (use first matching domain or "general")
|
|
183
|
+
domain = domains[0] if domains else "general"
|
|
184
|
+
|
|
185
|
+
# Extract title from filename or content
|
|
186
|
+
title = self._extract_title(file_path, content)
|
|
187
|
+
|
|
188
|
+
# Create knowledge entry
|
|
189
|
+
entry = KnowledgeEntry(
|
|
190
|
+
title=title,
|
|
191
|
+
content=content,
|
|
192
|
+
domain=domain,
|
|
193
|
+
source=str(file_path.relative_to(self.project_root)),
|
|
194
|
+
source_type="project",
|
|
195
|
+
metadata={
|
|
196
|
+
"file_type": source_type,
|
|
197
|
+
"file_path": str(file_path),
|
|
198
|
+
"ingested_at": datetime.now().isoformat(),
|
|
199
|
+
},
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
entries.append(entry)
|
|
203
|
+
except Exception as e:
|
|
204
|
+
# Log error but continue
|
|
205
|
+
print(f"Error parsing {file_path}: {e}")
|
|
206
|
+
|
|
207
|
+
return entries
|
|
208
|
+
|
|
209
|
+
def _extract_title(self, file_path: Path, content: str) -> str:
|
|
210
|
+
"""Extract title from file path or content."""
|
|
211
|
+
# Try to extract from markdown header
|
|
212
|
+
header_match = re.search(r"^#\s+(.+)$", content, re.MULTILINE)
|
|
213
|
+
if header_match:
|
|
214
|
+
return header_match.group(1).strip()
|
|
215
|
+
|
|
216
|
+
# Use filename as fallback
|
|
217
|
+
return file_path.stem.replace("_", " ").replace("-", " ").title()
|
|
218
|
+
|
|
219
|
+
async def ingest_context7_sources(self) -> IngestionResult:
|
|
220
|
+
"""Ingest knowledge from Context7 library documentation."""
|
|
221
|
+
if not self.context7_helper:
|
|
222
|
+
return IngestionResult(
|
|
223
|
+
source_type="context7",
|
|
224
|
+
entries_ingested=0,
|
|
225
|
+
entries_failed=0,
|
|
226
|
+
errors=["Context7 helper not available"],
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
entries_ingested = 0
|
|
230
|
+
entries_failed = 0
|
|
231
|
+
errors = []
|
|
232
|
+
|
|
233
|
+
# Detect dependencies
|
|
234
|
+
detection_result = self.domain_detector.detect_stack()
|
|
235
|
+
dependencies = self._extract_dependencies(detection_result)
|
|
236
|
+
|
|
237
|
+
# Fetch Context7 docs for each dependency
|
|
238
|
+
for library in dependencies:
|
|
239
|
+
try:
|
|
240
|
+
# Fetch overview
|
|
241
|
+
overview = await self.context7_helper.get_documentation(library, topic=None)
|
|
242
|
+
if overview:
|
|
243
|
+
entry = self._create_context7_entry(
|
|
244
|
+
library, "overview", overview.get("content", "")
|
|
245
|
+
)
|
|
246
|
+
self._store_knowledge_entries([entry])
|
|
247
|
+
entries_ingested += 1
|
|
248
|
+
|
|
249
|
+
# Fetch patterns
|
|
250
|
+
patterns = await self.context7_helper.get_documentation(library, topic="patterns")
|
|
251
|
+
if patterns:
|
|
252
|
+
entry = self._create_context7_entry(
|
|
253
|
+
library, "patterns", patterns.get("content", "")
|
|
254
|
+
)
|
|
255
|
+
self._store_knowledge_entries([entry])
|
|
256
|
+
entries_ingested += 1
|
|
257
|
+
|
|
258
|
+
# Fetch pitfalls
|
|
259
|
+
pitfalls = await self.context7_helper.get_documentation(library, topic="pitfalls")
|
|
260
|
+
if pitfalls:
|
|
261
|
+
entry = self._create_context7_entry(
|
|
262
|
+
library, "pitfalls", pitfalls.get("content", "")
|
|
263
|
+
)
|
|
264
|
+
self._store_knowledge_entries([entry])
|
|
265
|
+
entries_ingested += 1
|
|
266
|
+
|
|
267
|
+
# Fetch security notes
|
|
268
|
+
security = await self.context7_helper.get_documentation(library, topic="security")
|
|
269
|
+
if security:
|
|
270
|
+
entry = self._create_context7_entry(
|
|
271
|
+
library, "security", security.get("content", "")
|
|
272
|
+
)
|
|
273
|
+
self._store_knowledge_entries([entry])
|
|
274
|
+
entries_ingested += 1
|
|
275
|
+
|
|
276
|
+
except Exception as e:
|
|
277
|
+
entries_failed += 1
|
|
278
|
+
errors.append(f"{library}: {str(e)}")
|
|
279
|
+
|
|
280
|
+
return IngestionResult(
|
|
281
|
+
source_type="context7",
|
|
282
|
+
entries_ingested=entries_ingested,
|
|
283
|
+
entries_failed=entries_failed,
|
|
284
|
+
errors=errors,
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
def _extract_dependencies(self, detection_result) -> list[str]:
|
|
288
|
+
"""Extract library dependencies from detection result."""
|
|
289
|
+
dependencies = []
|
|
290
|
+
|
|
291
|
+
# Extract from dependency signals
|
|
292
|
+
for signal in detection_result.signals:
|
|
293
|
+
if signal.signal_type == "dependency":
|
|
294
|
+
# Try to extract library name from signal value
|
|
295
|
+
if isinstance(signal.value, str):
|
|
296
|
+
# Parse common dependency formats
|
|
297
|
+
lib_name = signal.value.split("==")[0].split("@")[0].strip()
|
|
298
|
+
if lib_name:
|
|
299
|
+
dependencies.append(lib_name)
|
|
300
|
+
|
|
301
|
+
return list(set(dependencies)) # Remove duplicates
|
|
302
|
+
|
|
303
|
+
def _create_context7_entry(
|
|
304
|
+
self, library: str, topic: str, content: str
|
|
305
|
+
) -> KnowledgeEntry:
|
|
306
|
+
"""Create knowledge entry from Context7 documentation."""
|
|
307
|
+
# Distill Context7 content into project-specific format
|
|
308
|
+
distilled_content = self._distill_context7_content(library, topic, content)
|
|
309
|
+
|
|
310
|
+
return KnowledgeEntry(
|
|
311
|
+
title=f"{library} - {topic}",
|
|
312
|
+
content=distilled_content,
|
|
313
|
+
domain=library.lower().replace("-", "_"),
|
|
314
|
+
source=f"context7://{library}/{topic}",
|
|
315
|
+
source_type="context7",
|
|
316
|
+
metadata={
|
|
317
|
+
"library": library,
|
|
318
|
+
"topic": topic,
|
|
319
|
+
"ingested_at": datetime.now().isoformat(),
|
|
320
|
+
},
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
def _distill_context7_content(self, library: str, topic: str, content: str) -> str:
|
|
324
|
+
"""Distill Context7 content into project-specific knowledge."""
|
|
325
|
+
# Create "how we use X here" format
|
|
326
|
+
distilled = f"# How We Use {library} - {topic}\n\n"
|
|
327
|
+
distilled += f"## Overview\n\n{content}\n\n"
|
|
328
|
+
distilled += "## Project-Specific Notes\n\n"
|
|
329
|
+
distilled += "_Add project-specific patterns and usage here_\n"
|
|
330
|
+
|
|
331
|
+
return distilled
|
|
332
|
+
|
|
333
|
+
def ingest_operational_sources(self) -> IngestionResult:
|
|
334
|
+
"""Ingest knowledge from operational sources (CI failures, exceptions, alerts)."""
|
|
335
|
+
entries_ingested = 0
|
|
336
|
+
entries_failed = 0
|
|
337
|
+
errors = []
|
|
338
|
+
|
|
339
|
+
# Look for operational sources
|
|
340
|
+
operational_sources = [
|
|
341
|
+
self.project_root / ".github" / "workflows",
|
|
342
|
+
self.project_root / ".gitlab-ci.yml",
|
|
343
|
+
self.config_dir / "reports",
|
|
344
|
+
]
|
|
345
|
+
|
|
346
|
+
for source_path in operational_sources:
|
|
347
|
+
if not source_path.exists():
|
|
348
|
+
continue
|
|
349
|
+
|
|
350
|
+
try:
|
|
351
|
+
entries = self._parse_operational_source(source_path)
|
|
352
|
+
entries_ingested += len(entries)
|
|
353
|
+
self._store_knowledge_entries(entries)
|
|
354
|
+
except Exception as e:
|
|
355
|
+
entries_failed += 1
|
|
356
|
+
errors.append(f"{source_path}: {str(e)}")
|
|
357
|
+
|
|
358
|
+
return IngestionResult(
|
|
359
|
+
source_type="operational",
|
|
360
|
+
entries_ingested=entries_ingested,
|
|
361
|
+
entries_failed=entries_failed,
|
|
362
|
+
errors=errors,
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
def _parse_operational_source(self, source_path: Path) -> list[KnowledgeEntry]:
|
|
366
|
+
"""Parse operational source and extract known issues."""
|
|
367
|
+
entries = []
|
|
368
|
+
|
|
369
|
+
# This is a simplified implementation
|
|
370
|
+
# In practice, would parse CI logs, exception traces, monitoring alerts
|
|
371
|
+
# and convert to structured KB entries
|
|
372
|
+
|
|
373
|
+
return entries
|
|
374
|
+
|
|
375
|
+
def _store_knowledge_entries(self, entries: list[KnowledgeEntry]):
|
|
376
|
+
"""Store knowledge entries in appropriate KB backends with governance checks."""
|
|
377
|
+
# Group entries by domain
|
|
378
|
+
entries_by_domain: dict[str, list[KnowledgeEntry]] = {}
|
|
379
|
+
for entry in entries:
|
|
380
|
+
if entry.domain not in entries_by_domain:
|
|
381
|
+
entries_by_domain[entry.domain] = []
|
|
382
|
+
entries_by_domain[entry.domain].append(entry)
|
|
383
|
+
|
|
384
|
+
# Store in domain-specific knowledge bases
|
|
385
|
+
for domain, domain_entries in entries_by_domain.items():
|
|
386
|
+
domain_kb_dir = self.knowledge_base_dir / domain
|
|
387
|
+
domain_kb_dir.mkdir(parents=True, exist_ok=True)
|
|
388
|
+
|
|
389
|
+
# Try VectorKnowledgeBase first, fallback to SimpleKnowledgeBase
|
|
390
|
+
try:
|
|
391
|
+
_kb = VectorKnowledgeBase(knowledge_dir=domain_kb_dir, domain=domain)
|
|
392
|
+
except Exception:
|
|
393
|
+
_kb = SimpleKnowledgeBase(knowledge_dir=domain_kb_dir, domain=domain)
|
|
394
|
+
|
|
395
|
+
# Convert entries to knowledge chunks and add with governance checks
|
|
396
|
+
# Note: KB is created but currently using markdown file fallback
|
|
397
|
+
for entry in domain_entries:
|
|
398
|
+
# Apply governance layer (Story 28.5)
|
|
399
|
+
# 1. Filter content for secrets/PII
|
|
400
|
+
filter_result = self.governance.filter_content(entry.content, entry.source)
|
|
401
|
+
|
|
402
|
+
# 2. Use filtered content if available
|
|
403
|
+
if filter_result.filtered_content:
|
|
404
|
+
entry.content = filter_result.filtered_content
|
|
405
|
+
|
|
406
|
+
# 3. Validate entry against governance policies
|
|
407
|
+
is_valid, reason = self.governance.validate_knowledge_entry(entry)
|
|
408
|
+
|
|
409
|
+
if not is_valid:
|
|
410
|
+
# Entry failed validation - log and skip
|
|
411
|
+
print(f"Governance validation failed for {entry.title}: {reason}")
|
|
412
|
+
continue
|
|
413
|
+
|
|
414
|
+
# 4. Entry passed all checks - store it
|
|
415
|
+
_chunk = KnowledgeChunk(
|
|
416
|
+
content=entry.content,
|
|
417
|
+
metadata={
|
|
418
|
+
"title": entry.title,
|
|
419
|
+
"source": entry.source,
|
|
420
|
+
"source_type": entry.source_type,
|
|
421
|
+
**entry.metadata,
|
|
422
|
+
},
|
|
423
|
+
)
|
|
424
|
+
# Add to knowledge base (implementation depends on KB backend)
|
|
425
|
+
# For now, write to markdown files
|
|
426
|
+
# TODO: Use _kb.add_chunk(_chunk) when KB backend is fully implemented
|
|
427
|
+
self._write_knowledge_file(domain_kb_dir, entry)
|
|
428
|
+
|
|
429
|
+
def _write_knowledge_file(self, domain_dir: Path, entry: KnowledgeEntry):
|
|
430
|
+
"""Write knowledge entry to markdown file."""
|
|
431
|
+
# Sanitize title for filename
|
|
432
|
+
safe_title = re.sub(r"[^\w\s-]", "", entry.title).strip().replace(" ", "_")
|
|
433
|
+
filename = f"{safe_title}.md"
|
|
434
|
+
|
|
435
|
+
# Write content
|
|
436
|
+
file_path = domain_dir / filename
|
|
437
|
+
file_path.write_text(entry.content, encoding="utf-8")
|
|
438
|
+
|