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,382 +1,382 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Code Snippet Handler - Detect and handle pasted code in user input.
|
|
3
|
-
|
|
4
|
-
Detects markdown code blocks, creates temporary files in scratchpad directory,
|
|
5
|
-
and integrates with workflow suggester for automatic *fix workflow invocation.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import hashlib
|
|
11
|
-
import logging
|
|
12
|
-
import re
|
|
13
|
-
import time
|
|
14
|
-
from dataclasses import dataclass
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Optional
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# Language to file extension mapping
|
|
22
|
-
LANGUAGE_EXTENSIONS: dict[str, str] = {
|
|
23
|
-
"python": ".py",
|
|
24
|
-
"py": ".py",
|
|
25
|
-
"javascript": ".js",
|
|
26
|
-
"js": ".js",
|
|
27
|
-
"typescript": ".ts",
|
|
28
|
-
"ts": ".ts",
|
|
29
|
-
"java": ".java",
|
|
30
|
-
"go": ".go",
|
|
31
|
-
"rust": ".rs",
|
|
32
|
-
"rs": ".rs",
|
|
33
|
-
"c": ".c",
|
|
34
|
-
"cpp": ".cpp",
|
|
35
|
-
"c++": ".cpp",
|
|
36
|
-
"csharp": ".cs",
|
|
37
|
-
"cs": ".cs",
|
|
38
|
-
"ruby": ".rb",
|
|
39
|
-
"rb": ".rb",
|
|
40
|
-
"php": ".php",
|
|
41
|
-
"swift": ".swift",
|
|
42
|
-
"kotlin": ".kt",
|
|
43
|
-
"scala": ".scala",
|
|
44
|
-
"shell": ".sh",
|
|
45
|
-
"bash": ".sh",
|
|
46
|
-
"sh": ".sh",
|
|
47
|
-
"sql": ".sql",
|
|
48
|
-
"html": ".html",
|
|
49
|
-
"css": ".css",
|
|
50
|
-
"json": ".json",
|
|
51
|
-
"yaml": ".yaml",
|
|
52
|
-
"yml": ".yml",
|
|
53
|
-
"xml": ".xml",
|
|
54
|
-
"markdown": ".md",
|
|
55
|
-
"md": ".md",
|
|
56
|
-
"text": ".txt",
|
|
57
|
-
"txt": ".txt",
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# Markdown code fence pattern
|
|
62
|
-
MARKDOWN_CODE_FENCE_PATTERN = r"```(?P<lang>\w+)?\s*\n(?P<code>.*?)```"
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
@dataclass(frozen=True, slots=True)
|
|
66
|
-
class CodeSnippet:
|
|
67
|
-
"""
|
|
68
|
-
Detected code snippet with metadata.
|
|
69
|
-
|
|
70
|
-
Attributes:
|
|
71
|
-
code: The extracted code content
|
|
72
|
-
language: Detected language (or 'txt' if unknown)
|
|
73
|
-
extension: File extension for the language
|
|
74
|
-
confidence: Detection confidence (0.0-1.0)
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
code: str
|
|
78
|
-
language: str
|
|
79
|
-
extension: str
|
|
80
|
-
confidence: float
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
@dataclass(frozen=True, slots=True)
|
|
84
|
-
class TempFile:
|
|
85
|
-
"""
|
|
86
|
-
Temporary file information.
|
|
87
|
-
|
|
88
|
-
Attributes:
|
|
89
|
-
path: Full path to the temporary file
|
|
90
|
-
filename: Just the filename
|
|
91
|
-
language: Detected language
|
|
92
|
-
created_at: Timestamp when file was created
|
|
93
|
-
"""
|
|
94
|
-
|
|
95
|
-
path: Path
|
|
96
|
-
filename: str
|
|
97
|
-
language: str
|
|
98
|
-
created_at: float
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
class CodeSnippetHandler:
|
|
102
|
-
"""
|
|
103
|
-
Handler for detecting and processing pasted code snippets.
|
|
104
|
-
|
|
105
|
-
Detects markdown code blocks in user input, creates temporary files
|
|
106
|
-
in the scratchpad directory, and prepares for workflow integration.
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
def __init__(self, scratchpad_dir: Optional[Path] = None):
|
|
110
|
-
"""
|
|
111
|
-
Initialize code snippet handler.
|
|
112
|
-
|
|
113
|
-
Args:
|
|
114
|
-
scratchpad_dir: Path to scratchpad directory for temp files.
|
|
115
|
-
If None, uses default Claude Code scratchpad location.
|
|
116
|
-
"""
|
|
117
|
-
self._logger = logging.getLogger(__name__)
|
|
118
|
-
|
|
119
|
-
# Use provided scratchpad or default location
|
|
120
|
-
if scratchpad_dir is None:
|
|
121
|
-
# Default Claude Code scratchpad location
|
|
122
|
-
import tempfile
|
|
123
|
-
import os
|
|
124
|
-
|
|
125
|
-
base_temp = Path(tempfile.gettempdir())
|
|
126
|
-
claude_dir = base_temp / "claude"
|
|
127
|
-
|
|
128
|
-
# Try to find existing Claude directory with session ID
|
|
129
|
-
if claude_dir.exists():
|
|
130
|
-
# Look for subdirectories (session IDs)
|
|
131
|
-
session_dirs = [d for d in claude_dir.iterdir() if d.is_dir()]
|
|
132
|
-
if session_dirs:
|
|
133
|
-
# Use first session directory found
|
|
134
|
-
scratchpad_dir = session_dirs[0] / "scratchpad"
|
|
135
|
-
else:
|
|
136
|
-
# Create default session directory
|
|
137
|
-
scratchpad_dir = claude_dir / "default" / "scratchpad"
|
|
138
|
-
else:
|
|
139
|
-
# Create default Claude directory structure
|
|
140
|
-
scratchpad_dir = claude_dir / "default" / "scratchpad"
|
|
141
|
-
|
|
142
|
-
self.scratchpad_dir = Path(scratchpad_dir)
|
|
143
|
-
self._logger.debug(f"Scratchpad directory: {self.scratchpad_dir}")
|
|
144
|
-
|
|
145
|
-
# Ensure scratchpad directory exists
|
|
146
|
-
try:
|
|
147
|
-
self.scratchpad_dir.mkdir(parents=True, exist_ok=True)
|
|
148
|
-
except Exception as e:
|
|
149
|
-
self._logger.warning(
|
|
150
|
-
f"Could not create scratchpad directory {self.scratchpad_dir}: {e}"
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
def detect_code_snippet(self, user_input: str) -> Optional[CodeSnippet]:
|
|
154
|
-
"""
|
|
155
|
-
Detect code snippet in user input.
|
|
156
|
-
|
|
157
|
-
Searches for markdown code fences (```lang...```) and extracts
|
|
158
|
-
the code content and language.
|
|
159
|
-
|
|
160
|
-
Args:
|
|
161
|
-
user_input: User's natural language input
|
|
162
|
-
|
|
163
|
-
Returns:
|
|
164
|
-
CodeSnippet if code block detected, None otherwise
|
|
165
|
-
|
|
166
|
-
Example:
|
|
167
|
-
>>> handler = CodeSnippetHandler()
|
|
168
|
-
>>> result = handler.detect_code_snippet('''
|
|
169
|
-
... Fix this code:
|
|
170
|
-
... ```python
|
|
171
|
-
... def add(a, b):
|
|
172
|
-
... return a / b
|
|
173
|
-
... ```
|
|
174
|
-
... ''')
|
|
175
|
-
>>> result.language
|
|
176
|
-
'python'
|
|
177
|
-
>>> result.code
|
|
178
|
-
'def add(a, b):\\n return a / b\\n'
|
|
179
|
-
"""
|
|
180
|
-
if not user_input or not isinstance(user_input, str):
|
|
181
|
-
return None
|
|
182
|
-
|
|
183
|
-
try:
|
|
184
|
-
# Search for markdown code fence
|
|
185
|
-
match = re.search(
|
|
186
|
-
MARKDOWN_CODE_FENCE_PATTERN,
|
|
187
|
-
user_input,
|
|
188
|
-
re.DOTALL | re.IGNORECASE
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
if not match:
|
|
192
|
-
return None
|
|
193
|
-
|
|
194
|
-
# Extract language and code
|
|
195
|
-
language = match.group("lang")
|
|
196
|
-
code = match.group("code")
|
|
197
|
-
|
|
198
|
-
# Normalize language
|
|
199
|
-
if language:
|
|
200
|
-
language = language.lower().strip()
|
|
201
|
-
else:
|
|
202
|
-
language = "txt" # Default if no language specified
|
|
203
|
-
|
|
204
|
-
# Get file extension
|
|
205
|
-
extension = LANGUAGE_EXTENSIONS.get(language, ".txt")
|
|
206
|
-
|
|
207
|
-
# Validate code is not empty
|
|
208
|
-
if not code or not code.strip():
|
|
209
|
-
self._logger.debug("Code block detected but empty")
|
|
210
|
-
return None
|
|
211
|
-
|
|
212
|
-
# High confidence if language specified and code non-empty
|
|
213
|
-
confidence = 0.95 if match.group("lang") else 0.80
|
|
214
|
-
|
|
215
|
-
return CodeSnippet(
|
|
216
|
-
code=code.strip(),
|
|
217
|
-
language=language,
|
|
218
|
-
extension=extension,
|
|
219
|
-
confidence=confidence
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
except Exception as e:
|
|
223
|
-
self._logger.error(f"Error detecting code snippet: {e}", exc_info=True)
|
|
224
|
-
return None
|
|
225
|
-
|
|
226
|
-
def generate_temp_filename(
|
|
227
|
-
self,
|
|
228
|
-
language: str,
|
|
229
|
-
extension: str,
|
|
230
|
-
code_content: str
|
|
231
|
-
) -> str:
|
|
232
|
-
"""
|
|
233
|
-
Generate unique temporary filename.
|
|
234
|
-
|
|
235
|
-
Uses timestamp and hash of code content to ensure uniqueness.
|
|
236
|
-
|
|
237
|
-
Args:
|
|
238
|
-
language: Detected language
|
|
239
|
-
extension: File extension
|
|
240
|
-
code_content: The code content (used for hash)
|
|
241
|
-
|
|
242
|
-
Returns:
|
|
243
|
-
Unique filename like "pasted_code_1234567890_abc123.py"
|
|
244
|
-
|
|
245
|
-
Example:
|
|
246
|
-
>>> handler = CodeSnippetHandler()
|
|
247
|
-
>>> filename = handler.generate_temp_filename("python", ".py", "code")
|
|
248
|
-
>>> filename.startswith("pasted_code_")
|
|
249
|
-
True
|
|
250
|
-
>>> filename.endswith(".py")
|
|
251
|
-
True
|
|
252
|
-
"""
|
|
253
|
-
# Generate timestamp
|
|
254
|
-
timestamp = int(time.time())
|
|
255
|
-
|
|
256
|
-
# Generate hash of code content
|
|
257
|
-
code_hash = hashlib.md5(code_content.encode('utf-8')).hexdigest()[:8]
|
|
258
|
-
|
|
259
|
-
# Construct filename
|
|
260
|
-
filename = f"pasted_code_{timestamp}_{code_hash}{extension}"
|
|
261
|
-
|
|
262
|
-
return filename
|
|
263
|
-
|
|
264
|
-
def create_temp_file(self, snippet: CodeSnippet) -> Optional[TempFile]:
|
|
265
|
-
"""
|
|
266
|
-
Create temporary file with code snippet content.
|
|
267
|
-
|
|
268
|
-
Writes the code snippet to a uniquely named file in the
|
|
269
|
-
scratchpad directory.
|
|
270
|
-
|
|
271
|
-
Args:
|
|
272
|
-
snippet: CodeSnippet to write to file
|
|
273
|
-
|
|
274
|
-
Returns:
|
|
275
|
-
TempFile with file information, or None if creation failed
|
|
276
|
-
|
|
277
|
-
Example:
|
|
278
|
-
>>> handler = CodeSnippetHandler()
|
|
279
|
-
>>> snippet = CodeSnippet(
|
|
280
|
-
... code="print('hello')",
|
|
281
|
-
... language="python",
|
|
282
|
-
... extension=".py",
|
|
283
|
-
... confidence=0.95
|
|
284
|
-
... )
|
|
285
|
-
>>> temp_file = handler.create_temp_file(snippet)
|
|
286
|
-
>>> temp_file.path.exists()
|
|
287
|
-
True
|
|
288
|
-
"""
|
|
289
|
-
try:
|
|
290
|
-
# Generate unique filename
|
|
291
|
-
filename = self.generate_temp_filename(
|
|
292
|
-
snippet.language,
|
|
293
|
-
snippet.extension,
|
|
294
|
-
snippet.code
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
# Construct full path
|
|
298
|
-
file_path = self.scratchpad_dir / filename
|
|
299
|
-
|
|
300
|
-
# Write code to file
|
|
301
|
-
file_path.write_text(snippet.code, encoding='utf-8')
|
|
302
|
-
|
|
303
|
-
self._logger.info(f"Created temp file: {file_path}")
|
|
304
|
-
|
|
305
|
-
return TempFile(
|
|
306
|
-
path=file_path,
|
|
307
|
-
filename=filename,
|
|
308
|
-
language=snippet.language,
|
|
309
|
-
created_at=time.time()
|
|
310
|
-
)
|
|
311
|
-
|
|
312
|
-
except Exception as e:
|
|
313
|
-
self._logger.error(
|
|
314
|
-
f"Failed to create temp file: {e}",
|
|
315
|
-
exc_info=True
|
|
316
|
-
)
|
|
317
|
-
return None
|
|
318
|
-
|
|
319
|
-
def detect_and_create_temp_file(
|
|
320
|
-
self,
|
|
321
|
-
user_input: str
|
|
322
|
-
) -> Optional[TempFile]:
|
|
323
|
-
"""
|
|
324
|
-
Detect code snippet and create temporary file in one step.
|
|
325
|
-
|
|
326
|
-
Convenience method that combines detection and file creation.
|
|
327
|
-
|
|
328
|
-
Args:
|
|
329
|
-
user_input: User's natural language input
|
|
330
|
-
|
|
331
|
-
Returns:
|
|
332
|
-
TempFile if code detected and file created, None otherwise
|
|
333
|
-
|
|
334
|
-
Example:
|
|
335
|
-
>>> handler = CodeSnippetHandler()
|
|
336
|
-
>>> temp_file = handler.detect_and_create_temp_file('''
|
|
337
|
-
... ```python
|
|
338
|
-
... def hello():
|
|
339
|
-
... print("world")
|
|
340
|
-
... ```
|
|
341
|
-
... ''')
|
|
342
|
-
>>> temp_file is not None
|
|
343
|
-
True
|
|
344
|
-
"""
|
|
345
|
-
# Detect code snippet
|
|
346
|
-
snippet = self.detect_code_snippet(user_input)
|
|
347
|
-
if snippet is None:
|
|
348
|
-
return None
|
|
349
|
-
|
|
350
|
-
# Create temp file
|
|
351
|
-
temp_file = self.create_temp_file(snippet)
|
|
352
|
-
return temp_file
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
# Convenience function for workflow integration
|
|
356
|
-
def detect_pasted_code(user_input: str) -> Optional[TempFile]:
|
|
357
|
-
"""
|
|
358
|
-
Detect pasted code and create temporary file.
|
|
359
|
-
|
|
360
|
-
Convenience function for use in workflow suggester and other modules.
|
|
361
|
-
|
|
362
|
-
Args:
|
|
363
|
-
user_input: User's natural language input
|
|
364
|
-
|
|
365
|
-
Returns:
|
|
366
|
-
TempFile if code detected and file created, None otherwise
|
|
367
|
-
|
|
368
|
-
Example:
|
|
369
|
-
>>> temp_file = detect_pasted_code('''
|
|
370
|
-
... Fix this code:
|
|
371
|
-
... ```python
|
|
372
|
-
... def bad_code():
|
|
373
|
-
... return 1 / 0
|
|
374
|
-
... ```
|
|
375
|
-
... ''')
|
|
376
|
-
>>> temp_file is not None
|
|
377
|
-
True
|
|
378
|
-
>>> temp_file.language
|
|
379
|
-
'python'
|
|
380
|
-
"""
|
|
381
|
-
handler = CodeSnippetHandler()
|
|
382
|
-
return handler.detect_and_create_temp_file(user_input)
|
|
1
|
+
"""
|
|
2
|
+
Code Snippet Handler - Detect and handle pasted code in user input.
|
|
3
|
+
|
|
4
|
+
Detects markdown code blocks, creates temporary files in scratchpad directory,
|
|
5
|
+
and integrates with workflow suggester for automatic *fix workflow invocation.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import logging
|
|
12
|
+
import re
|
|
13
|
+
import time
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Optional
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Language to file extension mapping
|
|
22
|
+
LANGUAGE_EXTENSIONS: dict[str, str] = {
|
|
23
|
+
"python": ".py",
|
|
24
|
+
"py": ".py",
|
|
25
|
+
"javascript": ".js",
|
|
26
|
+
"js": ".js",
|
|
27
|
+
"typescript": ".ts",
|
|
28
|
+
"ts": ".ts",
|
|
29
|
+
"java": ".java",
|
|
30
|
+
"go": ".go",
|
|
31
|
+
"rust": ".rs",
|
|
32
|
+
"rs": ".rs",
|
|
33
|
+
"c": ".c",
|
|
34
|
+
"cpp": ".cpp",
|
|
35
|
+
"c++": ".cpp",
|
|
36
|
+
"csharp": ".cs",
|
|
37
|
+
"cs": ".cs",
|
|
38
|
+
"ruby": ".rb",
|
|
39
|
+
"rb": ".rb",
|
|
40
|
+
"php": ".php",
|
|
41
|
+
"swift": ".swift",
|
|
42
|
+
"kotlin": ".kt",
|
|
43
|
+
"scala": ".scala",
|
|
44
|
+
"shell": ".sh",
|
|
45
|
+
"bash": ".sh",
|
|
46
|
+
"sh": ".sh",
|
|
47
|
+
"sql": ".sql",
|
|
48
|
+
"html": ".html",
|
|
49
|
+
"css": ".css",
|
|
50
|
+
"json": ".json",
|
|
51
|
+
"yaml": ".yaml",
|
|
52
|
+
"yml": ".yml",
|
|
53
|
+
"xml": ".xml",
|
|
54
|
+
"markdown": ".md",
|
|
55
|
+
"md": ".md",
|
|
56
|
+
"text": ".txt",
|
|
57
|
+
"txt": ".txt",
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# Markdown code fence pattern
|
|
62
|
+
MARKDOWN_CODE_FENCE_PATTERN = r"```(?P<lang>\w+)?\s*\n(?P<code>.*?)```"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass(frozen=True, slots=True)
|
|
66
|
+
class CodeSnippet:
|
|
67
|
+
"""
|
|
68
|
+
Detected code snippet with metadata.
|
|
69
|
+
|
|
70
|
+
Attributes:
|
|
71
|
+
code: The extracted code content
|
|
72
|
+
language: Detected language (or 'txt' if unknown)
|
|
73
|
+
extension: File extension for the language
|
|
74
|
+
confidence: Detection confidence (0.0-1.0)
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
code: str
|
|
78
|
+
language: str
|
|
79
|
+
extension: str
|
|
80
|
+
confidence: float
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass(frozen=True, slots=True)
|
|
84
|
+
class TempFile:
|
|
85
|
+
"""
|
|
86
|
+
Temporary file information.
|
|
87
|
+
|
|
88
|
+
Attributes:
|
|
89
|
+
path: Full path to the temporary file
|
|
90
|
+
filename: Just the filename
|
|
91
|
+
language: Detected language
|
|
92
|
+
created_at: Timestamp when file was created
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
path: Path
|
|
96
|
+
filename: str
|
|
97
|
+
language: str
|
|
98
|
+
created_at: float
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class CodeSnippetHandler:
|
|
102
|
+
"""
|
|
103
|
+
Handler for detecting and processing pasted code snippets.
|
|
104
|
+
|
|
105
|
+
Detects markdown code blocks in user input, creates temporary files
|
|
106
|
+
in the scratchpad directory, and prepares for workflow integration.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
def __init__(self, scratchpad_dir: Optional[Path] = None):
|
|
110
|
+
"""
|
|
111
|
+
Initialize code snippet handler.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
scratchpad_dir: Path to scratchpad directory for temp files.
|
|
115
|
+
If None, uses default Claude Code scratchpad location.
|
|
116
|
+
"""
|
|
117
|
+
self._logger = logging.getLogger(__name__)
|
|
118
|
+
|
|
119
|
+
# Use provided scratchpad or default location
|
|
120
|
+
if scratchpad_dir is None:
|
|
121
|
+
# Default Claude Code scratchpad location
|
|
122
|
+
import tempfile
|
|
123
|
+
import os
|
|
124
|
+
|
|
125
|
+
base_temp = Path(tempfile.gettempdir())
|
|
126
|
+
claude_dir = base_temp / "claude"
|
|
127
|
+
|
|
128
|
+
# Try to find existing Claude directory with session ID
|
|
129
|
+
if claude_dir.exists():
|
|
130
|
+
# Look for subdirectories (session IDs)
|
|
131
|
+
session_dirs = [d for d in claude_dir.iterdir() if d.is_dir()]
|
|
132
|
+
if session_dirs:
|
|
133
|
+
# Use first session directory found
|
|
134
|
+
scratchpad_dir = session_dirs[0] / "scratchpad"
|
|
135
|
+
else:
|
|
136
|
+
# Create default session directory
|
|
137
|
+
scratchpad_dir = claude_dir / "default" / "scratchpad"
|
|
138
|
+
else:
|
|
139
|
+
# Create default Claude directory structure
|
|
140
|
+
scratchpad_dir = claude_dir / "default" / "scratchpad"
|
|
141
|
+
|
|
142
|
+
self.scratchpad_dir = Path(scratchpad_dir)
|
|
143
|
+
self._logger.debug(f"Scratchpad directory: {self.scratchpad_dir}")
|
|
144
|
+
|
|
145
|
+
# Ensure scratchpad directory exists
|
|
146
|
+
try:
|
|
147
|
+
self.scratchpad_dir.mkdir(parents=True, exist_ok=True)
|
|
148
|
+
except Exception as e:
|
|
149
|
+
self._logger.warning(
|
|
150
|
+
f"Could not create scratchpad directory {self.scratchpad_dir}: {e}"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def detect_code_snippet(self, user_input: str) -> Optional[CodeSnippet]:
|
|
154
|
+
"""
|
|
155
|
+
Detect code snippet in user input.
|
|
156
|
+
|
|
157
|
+
Searches for markdown code fences (```lang...```) and extracts
|
|
158
|
+
the code content and language.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
user_input: User's natural language input
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
CodeSnippet if code block detected, None otherwise
|
|
165
|
+
|
|
166
|
+
Example:
|
|
167
|
+
>>> handler = CodeSnippetHandler()
|
|
168
|
+
>>> result = handler.detect_code_snippet('''
|
|
169
|
+
... Fix this code:
|
|
170
|
+
... ```python
|
|
171
|
+
... def add(a, b):
|
|
172
|
+
... return a / b
|
|
173
|
+
... ```
|
|
174
|
+
... ''')
|
|
175
|
+
>>> result.language
|
|
176
|
+
'python'
|
|
177
|
+
>>> result.code
|
|
178
|
+
'def add(a, b):\\n return a / b\\n'
|
|
179
|
+
"""
|
|
180
|
+
if not user_input or not isinstance(user_input, str):
|
|
181
|
+
return None
|
|
182
|
+
|
|
183
|
+
try:
|
|
184
|
+
# Search for markdown code fence
|
|
185
|
+
match = re.search(
|
|
186
|
+
MARKDOWN_CODE_FENCE_PATTERN,
|
|
187
|
+
user_input,
|
|
188
|
+
re.DOTALL | re.IGNORECASE
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
if not match:
|
|
192
|
+
return None
|
|
193
|
+
|
|
194
|
+
# Extract language and code
|
|
195
|
+
language = match.group("lang")
|
|
196
|
+
code = match.group("code")
|
|
197
|
+
|
|
198
|
+
# Normalize language
|
|
199
|
+
if language:
|
|
200
|
+
language = language.lower().strip()
|
|
201
|
+
else:
|
|
202
|
+
language = "txt" # Default if no language specified
|
|
203
|
+
|
|
204
|
+
# Get file extension
|
|
205
|
+
extension = LANGUAGE_EXTENSIONS.get(language, ".txt")
|
|
206
|
+
|
|
207
|
+
# Validate code is not empty
|
|
208
|
+
if not code or not code.strip():
|
|
209
|
+
self._logger.debug("Code block detected but empty")
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
# High confidence if language specified and code non-empty
|
|
213
|
+
confidence = 0.95 if match.group("lang") else 0.80
|
|
214
|
+
|
|
215
|
+
return CodeSnippet(
|
|
216
|
+
code=code.strip(),
|
|
217
|
+
language=language,
|
|
218
|
+
extension=extension,
|
|
219
|
+
confidence=confidence
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
except Exception as e:
|
|
223
|
+
self._logger.error(f"Error detecting code snippet: {e}", exc_info=True)
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
def generate_temp_filename(
|
|
227
|
+
self,
|
|
228
|
+
language: str,
|
|
229
|
+
extension: str,
|
|
230
|
+
code_content: str
|
|
231
|
+
) -> str:
|
|
232
|
+
"""
|
|
233
|
+
Generate unique temporary filename.
|
|
234
|
+
|
|
235
|
+
Uses timestamp and hash of code content to ensure uniqueness.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
language: Detected language
|
|
239
|
+
extension: File extension
|
|
240
|
+
code_content: The code content (used for hash)
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
Unique filename like "pasted_code_1234567890_abc123.py"
|
|
244
|
+
|
|
245
|
+
Example:
|
|
246
|
+
>>> handler = CodeSnippetHandler()
|
|
247
|
+
>>> filename = handler.generate_temp_filename("python", ".py", "code")
|
|
248
|
+
>>> filename.startswith("pasted_code_")
|
|
249
|
+
True
|
|
250
|
+
>>> filename.endswith(".py")
|
|
251
|
+
True
|
|
252
|
+
"""
|
|
253
|
+
# Generate timestamp
|
|
254
|
+
timestamp = int(time.time())
|
|
255
|
+
|
|
256
|
+
# Generate hash of code content
|
|
257
|
+
code_hash = hashlib.md5(code_content.encode('utf-8')).hexdigest()[:8]
|
|
258
|
+
|
|
259
|
+
# Construct filename
|
|
260
|
+
filename = f"pasted_code_{timestamp}_{code_hash}{extension}"
|
|
261
|
+
|
|
262
|
+
return filename
|
|
263
|
+
|
|
264
|
+
def create_temp_file(self, snippet: CodeSnippet) -> Optional[TempFile]:
|
|
265
|
+
"""
|
|
266
|
+
Create temporary file with code snippet content.
|
|
267
|
+
|
|
268
|
+
Writes the code snippet to a uniquely named file in the
|
|
269
|
+
scratchpad directory.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
snippet: CodeSnippet to write to file
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
TempFile with file information, or None if creation failed
|
|
276
|
+
|
|
277
|
+
Example:
|
|
278
|
+
>>> handler = CodeSnippetHandler()
|
|
279
|
+
>>> snippet = CodeSnippet(
|
|
280
|
+
... code="print('hello')",
|
|
281
|
+
... language="python",
|
|
282
|
+
... extension=".py",
|
|
283
|
+
... confidence=0.95
|
|
284
|
+
... )
|
|
285
|
+
>>> temp_file = handler.create_temp_file(snippet)
|
|
286
|
+
>>> temp_file.path.exists()
|
|
287
|
+
True
|
|
288
|
+
"""
|
|
289
|
+
try:
|
|
290
|
+
# Generate unique filename
|
|
291
|
+
filename = self.generate_temp_filename(
|
|
292
|
+
snippet.language,
|
|
293
|
+
snippet.extension,
|
|
294
|
+
snippet.code
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
# Construct full path
|
|
298
|
+
file_path = self.scratchpad_dir / filename
|
|
299
|
+
|
|
300
|
+
# Write code to file
|
|
301
|
+
file_path.write_text(snippet.code, encoding='utf-8')
|
|
302
|
+
|
|
303
|
+
self._logger.info(f"Created temp file: {file_path}")
|
|
304
|
+
|
|
305
|
+
return TempFile(
|
|
306
|
+
path=file_path,
|
|
307
|
+
filename=filename,
|
|
308
|
+
language=snippet.language,
|
|
309
|
+
created_at=time.time()
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
except Exception as e:
|
|
313
|
+
self._logger.error(
|
|
314
|
+
f"Failed to create temp file: {e}",
|
|
315
|
+
exc_info=True
|
|
316
|
+
)
|
|
317
|
+
return None
|
|
318
|
+
|
|
319
|
+
def detect_and_create_temp_file(
|
|
320
|
+
self,
|
|
321
|
+
user_input: str
|
|
322
|
+
) -> Optional[TempFile]:
|
|
323
|
+
"""
|
|
324
|
+
Detect code snippet and create temporary file in one step.
|
|
325
|
+
|
|
326
|
+
Convenience method that combines detection and file creation.
|
|
327
|
+
|
|
328
|
+
Args:
|
|
329
|
+
user_input: User's natural language input
|
|
330
|
+
|
|
331
|
+
Returns:
|
|
332
|
+
TempFile if code detected and file created, None otherwise
|
|
333
|
+
|
|
334
|
+
Example:
|
|
335
|
+
>>> handler = CodeSnippetHandler()
|
|
336
|
+
>>> temp_file = handler.detect_and_create_temp_file('''
|
|
337
|
+
... ```python
|
|
338
|
+
... def hello():
|
|
339
|
+
... print("world")
|
|
340
|
+
... ```
|
|
341
|
+
... ''')
|
|
342
|
+
>>> temp_file is not None
|
|
343
|
+
True
|
|
344
|
+
"""
|
|
345
|
+
# Detect code snippet
|
|
346
|
+
snippet = self.detect_code_snippet(user_input)
|
|
347
|
+
if snippet is None:
|
|
348
|
+
return None
|
|
349
|
+
|
|
350
|
+
# Create temp file
|
|
351
|
+
temp_file = self.create_temp_file(snippet)
|
|
352
|
+
return temp_file
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
# Convenience function for workflow integration
|
|
356
|
+
def detect_pasted_code(user_input: str) -> Optional[TempFile]:
|
|
357
|
+
"""
|
|
358
|
+
Detect pasted code and create temporary file.
|
|
359
|
+
|
|
360
|
+
Convenience function for use in workflow suggester and other modules.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
user_input: User's natural language input
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
TempFile if code detected and file created, None otherwise
|
|
367
|
+
|
|
368
|
+
Example:
|
|
369
|
+
>>> temp_file = detect_pasted_code('''
|
|
370
|
+
... Fix this code:
|
|
371
|
+
... ```python
|
|
372
|
+
... def bad_code():
|
|
373
|
+
... return 1 / 0
|
|
374
|
+
... ```
|
|
375
|
+
... ''')
|
|
376
|
+
>>> temp_file is not None
|
|
377
|
+
True
|
|
378
|
+
>>> temp_file.language
|
|
379
|
+
'python'
|
|
380
|
+
"""
|
|
381
|
+
handler = CodeSnippetHandler()
|
|
382
|
+
return handler.detect_and_create_temp_file(user_input)
|