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,373 +1,373 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Security and Compliance for Context7 Integration
|
|
3
|
-
|
|
4
|
-
Provides security audit, compliance verification, and API key management.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import hashlib
|
|
8
|
-
import logging
|
|
9
|
-
import os
|
|
10
|
-
from dataclasses import asdict, dataclass
|
|
11
|
-
from datetime import UTC, datetime
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
import yaml
|
|
16
|
-
|
|
17
|
-
try:
|
|
18
|
-
from cryptography.fernet import Fernet
|
|
19
|
-
|
|
20
|
-
CRYPTO_AVAILABLE = True
|
|
21
|
-
except ImportError:
|
|
22
|
-
CRYPTO_AVAILABLE = False
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
logger = logging.getLogger(__name__)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@dataclass
|
|
29
|
-
class SecurityAuditResult:
|
|
30
|
-
"""Result of a security audit."""
|
|
31
|
-
|
|
32
|
-
passed: bool
|
|
33
|
-
issues: list[str]
|
|
34
|
-
warnings: list[str]
|
|
35
|
-
recommendations: list[str]
|
|
36
|
-
timestamp: str
|
|
37
|
-
compliance_status: dict[str, bool]
|
|
38
|
-
|
|
39
|
-
def to_dict(self) -> dict[str, Any]:
|
|
40
|
-
"""Convert to dictionary."""
|
|
41
|
-
return asdict(self)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@dataclass
|
|
45
|
-
class ComplianceStatus:
|
|
46
|
-
"""SOC 2 compliance status."""
|
|
47
|
-
|
|
48
|
-
soc2_verified: bool = False
|
|
49
|
-
data_retention_compliant: bool = False
|
|
50
|
-
audit_logging_enabled: bool = False
|
|
51
|
-
api_key_encrypted: bool = False
|
|
52
|
-
privacy_mode_enabled: bool = False
|
|
53
|
-
|
|
54
|
-
def to_dict(self) -> dict[str, Any]:
|
|
55
|
-
"""Convert to dictionary."""
|
|
56
|
-
return asdict(self)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class APIKeyManager:
|
|
60
|
-
"""Manages API keys with encryption support."""
|
|
61
|
-
|
|
62
|
-
def __init__(self, config_dir: Path | None = None):
|
|
63
|
-
"""
|
|
64
|
-
Initialize API key manager.
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
config_dir: Configuration directory (default: .tapps-agents)
|
|
68
|
-
"""
|
|
69
|
-
if config_dir is None:
|
|
70
|
-
config_dir = Path.cwd() / ".tapps-agents"
|
|
71
|
-
|
|
72
|
-
self.config_dir = Path(config_dir)
|
|
73
|
-
self.config_dir.mkdir(parents=True, exist_ok=True)
|
|
74
|
-
|
|
75
|
-
self.keys_file = self.config_dir / "api-keys.encrypted"
|
|
76
|
-
self.master_key_file = self.config_dir / ".master-key"
|
|
77
|
-
|
|
78
|
-
self._master_key: bytes | None = None
|
|
79
|
-
self._cipher: Fernet | None = None
|
|
80
|
-
|
|
81
|
-
if CRYPTO_AVAILABLE:
|
|
82
|
-
self._load_or_create_master_key()
|
|
83
|
-
|
|
84
|
-
def _load_or_create_master_key(self):
|
|
85
|
-
"""Load or create master encryption key."""
|
|
86
|
-
if not CRYPTO_AVAILABLE:
|
|
87
|
-
return
|
|
88
|
-
|
|
89
|
-
try:
|
|
90
|
-
if self.master_key_file.exists():
|
|
91
|
-
# Load existing key
|
|
92
|
-
self._master_key = self.master_key_file.read_bytes()
|
|
93
|
-
else:
|
|
94
|
-
# Generate new key
|
|
95
|
-
self._master_key = Fernet.generate_key()
|
|
96
|
-
# Store with restricted permissions (owner read/write only)
|
|
97
|
-
self.master_key_file.write_bytes(self._master_key)
|
|
98
|
-
try:
|
|
99
|
-
os.chmod(self.master_key_file, 0o600)
|
|
100
|
-
except Exception:
|
|
101
|
-
# Windows may not support chmod; best-effort only.
|
|
102
|
-
logger.debug("chmod not supported for master key file", exc_info=True)
|
|
103
|
-
|
|
104
|
-
if self._master_key:
|
|
105
|
-
self._cipher = Fernet(self._master_key)
|
|
106
|
-
except Exception as e:
|
|
107
|
-
# If master key initialization fails, log and continue without encryption
|
|
108
|
-
logger.warning(
|
|
109
|
-
f"Failed to initialize encryption master key: {e}. "
|
|
110
|
-
f"API keys will not be encrypted. This is non-fatal."
|
|
111
|
-
)
|
|
112
|
-
self._master_key = None
|
|
113
|
-
self._cipher = None
|
|
114
|
-
|
|
115
|
-
def encrypt_api_key(self, api_key: str) -> str:
|
|
116
|
-
"""
|
|
117
|
-
Encrypt an API key.
|
|
118
|
-
|
|
119
|
-
Args:
|
|
120
|
-
api_key: Plain text API key
|
|
121
|
-
|
|
122
|
-
Returns:
|
|
123
|
-
Encrypted API key (base64)
|
|
124
|
-
"""
|
|
125
|
-
if not CRYPTO_AVAILABLE:
|
|
126
|
-
# Fallback: hash the key (one-way, not reversible)
|
|
127
|
-
return hashlib.sha256(api_key.encode()).hexdigest()
|
|
128
|
-
|
|
129
|
-
if not self._cipher:
|
|
130
|
-
self._load_or_create_master_key()
|
|
131
|
-
|
|
132
|
-
if self._cipher is None:
|
|
133
|
-
raise ValueError("Encryption not available. Failed to initialize cipher.")
|
|
134
|
-
|
|
135
|
-
encrypted = self._cipher.encrypt(api_key.encode())
|
|
136
|
-
return encrypted.decode("utf-8")
|
|
137
|
-
|
|
138
|
-
def decrypt_api_key(self, encrypted_key: str) -> str:
|
|
139
|
-
"""
|
|
140
|
-
Decrypt an API key.
|
|
141
|
-
|
|
142
|
-
Args:
|
|
143
|
-
encrypted_key: Encrypted API key
|
|
144
|
-
|
|
145
|
-
Returns:
|
|
146
|
-
Plain text API key
|
|
147
|
-
"""
|
|
148
|
-
if not CRYPTO_AVAILABLE:
|
|
149
|
-
raise ValueError("Encryption not available. Install cryptography package.")
|
|
150
|
-
|
|
151
|
-
if not self._cipher:
|
|
152
|
-
self._load_or_create_master_key()
|
|
153
|
-
|
|
154
|
-
if self._cipher is None:
|
|
155
|
-
raise ValueError("Encryption not available. Failed to initialize cipher.")
|
|
156
|
-
|
|
157
|
-
decrypted = self._cipher.decrypt(encrypted_key.encode())
|
|
158
|
-
return decrypted.decode("utf-8")
|
|
159
|
-
|
|
160
|
-
def store_api_key(self, key_name: str, api_key: str, encrypt: bool = True):
|
|
161
|
-
"""
|
|
162
|
-
Store an API key.
|
|
163
|
-
|
|
164
|
-
Args:
|
|
165
|
-
key_name: Name of the key (e.g., "context7", "anthropic")
|
|
166
|
-
api_key: API key value
|
|
167
|
-
encrypt: Whether to encrypt the key
|
|
168
|
-
"""
|
|
169
|
-
keys = self.load_all_keys()
|
|
170
|
-
|
|
171
|
-
if encrypt:
|
|
172
|
-
keys[key_name] = {
|
|
173
|
-
"encrypted": True,
|
|
174
|
-
"value": self.encrypt_api_key(api_key),
|
|
175
|
-
"stored_at": datetime.now(UTC).isoformat(),
|
|
176
|
-
}
|
|
177
|
-
else:
|
|
178
|
-
keys[key_name] = {
|
|
179
|
-
"encrypted": False,
|
|
180
|
-
"value": api_key,
|
|
181
|
-
"stored_at": datetime.now(UTC).isoformat(),
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
# Save to file
|
|
185
|
-
with open(self.keys_file, "w", encoding="utf-8") as f:
|
|
186
|
-
yaml.safe_dump(keys, f, default_flow_style=False)
|
|
187
|
-
|
|
188
|
-
# Restrict file permissions
|
|
189
|
-
try:
|
|
190
|
-
os.chmod(self.keys_file, 0o600)
|
|
191
|
-
except Exception:
|
|
192
|
-
# Best-effort only (Windows may not support chmod).
|
|
193
|
-
logger.debug("chmod not supported for keys file", exc_info=True)
|
|
194
|
-
|
|
195
|
-
def load_api_key(self, key_name: str) -> str | None:
|
|
196
|
-
"""
|
|
197
|
-
Load an API key.
|
|
198
|
-
|
|
199
|
-
Args:
|
|
200
|
-
key_name: Name of the key
|
|
201
|
-
|
|
202
|
-
Returns:
|
|
203
|
-
API key value or None if not found
|
|
204
|
-
"""
|
|
205
|
-
keys = self.load_all_keys()
|
|
206
|
-
|
|
207
|
-
if key_name not in keys:
|
|
208
|
-
return None
|
|
209
|
-
|
|
210
|
-
key_data = keys[key_name]
|
|
211
|
-
|
|
212
|
-
if key_data.get("encrypted"):
|
|
213
|
-
try:
|
|
214
|
-
return self.decrypt_api_key(key_data["value"])
|
|
215
|
-
except Exception:
|
|
216
|
-
return None
|
|
217
|
-
else:
|
|
218
|
-
return key_data.get("value")
|
|
219
|
-
|
|
220
|
-
def load_all_keys(self) -> dict[str, Any]:
|
|
221
|
-
"""Load all stored API keys."""
|
|
222
|
-
if not self.keys_file.exists():
|
|
223
|
-
return {}
|
|
224
|
-
|
|
225
|
-
try:
|
|
226
|
-
with open(self.keys_file, encoding="utf-8") as f:
|
|
227
|
-
return yaml.safe_load(f) or {}
|
|
228
|
-
except Exception:
|
|
229
|
-
return {}
|
|
230
|
-
|
|
231
|
-
def delete_api_key(self, key_name: str):
|
|
232
|
-
"""Delete a stored API key."""
|
|
233
|
-
keys = self.load_all_keys()
|
|
234
|
-
if key_name in keys:
|
|
235
|
-
del keys[key_name]
|
|
236
|
-
with open(self.keys_file, "w", encoding="utf-8") as f:
|
|
237
|
-
yaml.safe_dump(keys, f, default_flow_style=False)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
class SecurityAuditor:
|
|
241
|
-
"""Performs security audits and compliance verification."""
|
|
242
|
-
|
|
243
|
-
def __init__(self, config_dir: Path | None = None, cache_dir: Path | None = None):
|
|
244
|
-
"""
|
|
245
|
-
Initialize security auditor.
|
|
246
|
-
|
|
247
|
-
Args:
|
|
248
|
-
config_dir: Configuration directory
|
|
249
|
-
cache_dir: Cache directory
|
|
250
|
-
"""
|
|
251
|
-
if config_dir is None:
|
|
252
|
-
config_dir = Path.cwd() / ".tapps-agents"
|
|
253
|
-
if cache_dir is None:
|
|
254
|
-
cache_dir = config_dir / "kb" / "context7-cache"
|
|
255
|
-
|
|
256
|
-
self.config_dir = Path(config_dir)
|
|
257
|
-
self.cache_dir = Path(cache_dir)
|
|
258
|
-
self.api_key_manager = APIKeyManager(config_dir)
|
|
259
|
-
|
|
260
|
-
def audit(self) -> SecurityAuditResult:
|
|
261
|
-
"""
|
|
262
|
-
Perform security audit.
|
|
263
|
-
|
|
264
|
-
Returns:
|
|
265
|
-
SecurityAuditResult with audit findings
|
|
266
|
-
"""
|
|
267
|
-
issues = []
|
|
268
|
-
warnings = []
|
|
269
|
-
recommendations = []
|
|
270
|
-
compliance = ComplianceStatus()
|
|
271
|
-
|
|
272
|
-
# Check API key storage
|
|
273
|
-
if not CRYPTO_AVAILABLE:
|
|
274
|
-
warnings.append(
|
|
275
|
-
"cryptography package not installed - API keys cannot be encrypted"
|
|
276
|
-
)
|
|
277
|
-
recommendations.append(
|
|
278
|
-
"Install cryptography package: pip install cryptography"
|
|
279
|
-
)
|
|
280
|
-
else:
|
|
281
|
-
compliance.api_key_encrypted = True
|
|
282
|
-
|
|
283
|
-
# Check environment variable usage
|
|
284
|
-
env_keys = ["CONTEXT7_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"]
|
|
285
|
-
|
|
286
|
-
env_keys_found = [key for key in env_keys if os.getenv(key)]
|
|
287
|
-
if env_keys_found:
|
|
288
|
-
warnings.append(
|
|
289
|
-
f"API keys found in environment variables: {', '.join(env_keys_found)}"
|
|
290
|
-
)
|
|
291
|
-
recommendations.append(
|
|
292
|
-
"Consider using encrypted storage instead of environment variables"
|
|
293
|
-
)
|
|
294
|
-
|
|
295
|
-
# Check file permissions
|
|
296
|
-
keys_file = self.config_dir / "api-keys.encrypted"
|
|
297
|
-
if keys_file.exists():
|
|
298
|
-
try:
|
|
299
|
-
stat = keys_file.stat()
|
|
300
|
-
mode = stat.st_mode & 0o777
|
|
301
|
-
if mode > 0o600:
|
|
302
|
-
issues.append(
|
|
303
|
-
f"API keys file has insecure permissions: {oct(mode)}"
|
|
304
|
-
)
|
|
305
|
-
recommendations.append(
|
|
306
|
-
"Set file permissions to 600 (owner read/write only)"
|
|
307
|
-
)
|
|
308
|
-
except Exception:
|
|
309
|
-
logger.debug("Failed to stat API keys file permissions", exc_info=True)
|
|
310
|
-
|
|
311
|
-
# Check cache directory permissions
|
|
312
|
-
if self.cache_dir.exists():
|
|
313
|
-
try:
|
|
314
|
-
stat = self.cache_dir.stat()
|
|
315
|
-
mode = stat.st_mode & 0o777
|
|
316
|
-
if mode > 0o755:
|
|
317
|
-
warnings.append(
|
|
318
|
-
f"Cache directory has open permissions: {oct(mode)}"
|
|
319
|
-
)
|
|
320
|
-
except Exception:
|
|
321
|
-
logger.debug(
|
|
322
|
-
"Failed to stat cache directory permissions", exc_info=True
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
# Check for sensitive data in cache
|
|
326
|
-
# (This is a simplified check - in production, scan for patterns)
|
|
327
|
-
|
|
328
|
-
# Compliance checks
|
|
329
|
-
compliance.audit_logging_enabled = True # Assume enabled if audit is running
|
|
330
|
-
compliance.data_retention_compliant = (
|
|
331
|
-
True # Assume compliant if cache cleanup exists
|
|
332
|
-
)
|
|
333
|
-
compliance.privacy_mode_enabled = True # Context7 queries stay local by design
|
|
334
|
-
|
|
335
|
-
# SOC 2 verification (simplified - would need actual certification)
|
|
336
|
-
compliance.soc2_verified = len(issues) == 0 and len(warnings) < 3
|
|
337
|
-
|
|
338
|
-
passed = len(issues) == 0
|
|
339
|
-
|
|
340
|
-
return SecurityAuditResult(
|
|
341
|
-
passed=passed,
|
|
342
|
-
issues=issues,
|
|
343
|
-
warnings=warnings,
|
|
344
|
-
recommendations=recommendations,
|
|
345
|
-
timestamp=datetime.now(UTC).isoformat(),
|
|
346
|
-
compliance_status=compliance.to_dict(),
|
|
347
|
-
)
|
|
348
|
-
|
|
349
|
-
def verify_compliance(self) -> ComplianceStatus:
|
|
350
|
-
"""
|
|
351
|
-
Verify SOC 2 compliance.
|
|
352
|
-
|
|
353
|
-
Returns:
|
|
354
|
-
ComplianceStatus
|
|
355
|
-
"""
|
|
356
|
-
audit = self.audit()
|
|
357
|
-
return ComplianceStatus(**audit.compliance_status)
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
def create_security_auditor(
|
|
361
|
-
config_dir: Path | None = None, cache_dir: Path | None = None
|
|
362
|
-
) -> SecurityAuditor:
|
|
363
|
-
"""
|
|
364
|
-
Convenience function to create a security auditor.
|
|
365
|
-
|
|
366
|
-
Args:
|
|
367
|
-
config_dir: Configuration directory
|
|
368
|
-
cache_dir: Cache directory
|
|
369
|
-
|
|
370
|
-
Returns:
|
|
371
|
-
SecurityAuditor instance
|
|
372
|
-
"""
|
|
373
|
-
return SecurityAuditor(config_dir=config_dir, cache_dir=cache_dir)
|
|
1
|
+
"""
|
|
2
|
+
Security and Compliance for Context7 Integration
|
|
3
|
+
|
|
4
|
+
Provides security audit, compliance verification, and API key management.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
from dataclasses import asdict, dataclass
|
|
11
|
+
from datetime import UTC, datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
import yaml
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from cryptography.fernet import Fernet
|
|
19
|
+
|
|
20
|
+
CRYPTO_AVAILABLE = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
CRYPTO_AVAILABLE = False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class SecurityAuditResult:
|
|
30
|
+
"""Result of a security audit."""
|
|
31
|
+
|
|
32
|
+
passed: bool
|
|
33
|
+
issues: list[str]
|
|
34
|
+
warnings: list[str]
|
|
35
|
+
recommendations: list[str]
|
|
36
|
+
timestamp: str
|
|
37
|
+
compliance_status: dict[str, bool]
|
|
38
|
+
|
|
39
|
+
def to_dict(self) -> dict[str, Any]:
|
|
40
|
+
"""Convert to dictionary."""
|
|
41
|
+
return asdict(self)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class ComplianceStatus:
|
|
46
|
+
"""SOC 2 compliance status."""
|
|
47
|
+
|
|
48
|
+
soc2_verified: bool = False
|
|
49
|
+
data_retention_compliant: bool = False
|
|
50
|
+
audit_logging_enabled: bool = False
|
|
51
|
+
api_key_encrypted: bool = False
|
|
52
|
+
privacy_mode_enabled: bool = False
|
|
53
|
+
|
|
54
|
+
def to_dict(self) -> dict[str, Any]:
|
|
55
|
+
"""Convert to dictionary."""
|
|
56
|
+
return asdict(self)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class APIKeyManager:
|
|
60
|
+
"""Manages API keys with encryption support."""
|
|
61
|
+
|
|
62
|
+
def __init__(self, config_dir: Path | None = None):
|
|
63
|
+
"""
|
|
64
|
+
Initialize API key manager.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
config_dir: Configuration directory (default: .tapps-agents)
|
|
68
|
+
"""
|
|
69
|
+
if config_dir is None:
|
|
70
|
+
config_dir = Path.cwd() / ".tapps-agents"
|
|
71
|
+
|
|
72
|
+
self.config_dir = Path(config_dir)
|
|
73
|
+
self.config_dir.mkdir(parents=True, exist_ok=True)
|
|
74
|
+
|
|
75
|
+
self.keys_file = self.config_dir / "api-keys.encrypted"
|
|
76
|
+
self.master_key_file = self.config_dir / ".master-key"
|
|
77
|
+
|
|
78
|
+
self._master_key: bytes | None = None
|
|
79
|
+
self._cipher: Fernet | None = None
|
|
80
|
+
|
|
81
|
+
if CRYPTO_AVAILABLE:
|
|
82
|
+
self._load_or_create_master_key()
|
|
83
|
+
|
|
84
|
+
def _load_or_create_master_key(self):
|
|
85
|
+
"""Load or create master encryption key."""
|
|
86
|
+
if not CRYPTO_AVAILABLE:
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
if self.master_key_file.exists():
|
|
91
|
+
# Load existing key
|
|
92
|
+
self._master_key = self.master_key_file.read_bytes()
|
|
93
|
+
else:
|
|
94
|
+
# Generate new key
|
|
95
|
+
self._master_key = Fernet.generate_key()
|
|
96
|
+
# Store with restricted permissions (owner read/write only)
|
|
97
|
+
self.master_key_file.write_bytes(self._master_key)
|
|
98
|
+
try:
|
|
99
|
+
os.chmod(self.master_key_file, 0o600)
|
|
100
|
+
except Exception:
|
|
101
|
+
# Windows may not support chmod; best-effort only.
|
|
102
|
+
logger.debug("chmod not supported for master key file", exc_info=True)
|
|
103
|
+
|
|
104
|
+
if self._master_key:
|
|
105
|
+
self._cipher = Fernet(self._master_key)
|
|
106
|
+
except Exception as e:
|
|
107
|
+
# If master key initialization fails, log and continue without encryption
|
|
108
|
+
logger.warning(
|
|
109
|
+
f"Failed to initialize encryption master key: {e}. "
|
|
110
|
+
f"API keys will not be encrypted. This is non-fatal."
|
|
111
|
+
)
|
|
112
|
+
self._master_key = None
|
|
113
|
+
self._cipher = None
|
|
114
|
+
|
|
115
|
+
def encrypt_api_key(self, api_key: str) -> str:
|
|
116
|
+
"""
|
|
117
|
+
Encrypt an API key.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
api_key: Plain text API key
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Encrypted API key (base64)
|
|
124
|
+
"""
|
|
125
|
+
if not CRYPTO_AVAILABLE:
|
|
126
|
+
# Fallback: hash the key (one-way, not reversible)
|
|
127
|
+
return hashlib.sha256(api_key.encode()).hexdigest()
|
|
128
|
+
|
|
129
|
+
if not self._cipher:
|
|
130
|
+
self._load_or_create_master_key()
|
|
131
|
+
|
|
132
|
+
if self._cipher is None:
|
|
133
|
+
raise ValueError("Encryption not available. Failed to initialize cipher.")
|
|
134
|
+
|
|
135
|
+
encrypted = self._cipher.encrypt(api_key.encode())
|
|
136
|
+
return encrypted.decode("utf-8")
|
|
137
|
+
|
|
138
|
+
def decrypt_api_key(self, encrypted_key: str) -> str:
|
|
139
|
+
"""
|
|
140
|
+
Decrypt an API key.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
encrypted_key: Encrypted API key
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Plain text API key
|
|
147
|
+
"""
|
|
148
|
+
if not CRYPTO_AVAILABLE:
|
|
149
|
+
raise ValueError("Encryption not available. Install cryptography package.")
|
|
150
|
+
|
|
151
|
+
if not self._cipher:
|
|
152
|
+
self._load_or_create_master_key()
|
|
153
|
+
|
|
154
|
+
if self._cipher is None:
|
|
155
|
+
raise ValueError("Encryption not available. Failed to initialize cipher.")
|
|
156
|
+
|
|
157
|
+
decrypted = self._cipher.decrypt(encrypted_key.encode())
|
|
158
|
+
return decrypted.decode("utf-8")
|
|
159
|
+
|
|
160
|
+
def store_api_key(self, key_name: str, api_key: str, encrypt: bool = True):
|
|
161
|
+
"""
|
|
162
|
+
Store an API key.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
key_name: Name of the key (e.g., "context7", "anthropic")
|
|
166
|
+
api_key: API key value
|
|
167
|
+
encrypt: Whether to encrypt the key
|
|
168
|
+
"""
|
|
169
|
+
keys = self.load_all_keys()
|
|
170
|
+
|
|
171
|
+
if encrypt:
|
|
172
|
+
keys[key_name] = {
|
|
173
|
+
"encrypted": True,
|
|
174
|
+
"value": self.encrypt_api_key(api_key),
|
|
175
|
+
"stored_at": datetime.now(UTC).isoformat(),
|
|
176
|
+
}
|
|
177
|
+
else:
|
|
178
|
+
keys[key_name] = {
|
|
179
|
+
"encrypted": False,
|
|
180
|
+
"value": api_key,
|
|
181
|
+
"stored_at": datetime.now(UTC).isoformat(),
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
# Save to file
|
|
185
|
+
with open(self.keys_file, "w", encoding="utf-8") as f:
|
|
186
|
+
yaml.safe_dump(keys, f, default_flow_style=False)
|
|
187
|
+
|
|
188
|
+
# Restrict file permissions
|
|
189
|
+
try:
|
|
190
|
+
os.chmod(self.keys_file, 0o600)
|
|
191
|
+
except Exception:
|
|
192
|
+
# Best-effort only (Windows may not support chmod).
|
|
193
|
+
logger.debug("chmod not supported for keys file", exc_info=True)
|
|
194
|
+
|
|
195
|
+
def load_api_key(self, key_name: str) -> str | None:
|
|
196
|
+
"""
|
|
197
|
+
Load an API key.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
key_name: Name of the key
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
API key value or None if not found
|
|
204
|
+
"""
|
|
205
|
+
keys = self.load_all_keys()
|
|
206
|
+
|
|
207
|
+
if key_name not in keys:
|
|
208
|
+
return None
|
|
209
|
+
|
|
210
|
+
key_data = keys[key_name]
|
|
211
|
+
|
|
212
|
+
if key_data.get("encrypted"):
|
|
213
|
+
try:
|
|
214
|
+
return self.decrypt_api_key(key_data["value"])
|
|
215
|
+
except Exception:
|
|
216
|
+
return None
|
|
217
|
+
else:
|
|
218
|
+
return key_data.get("value")
|
|
219
|
+
|
|
220
|
+
def load_all_keys(self) -> dict[str, Any]:
|
|
221
|
+
"""Load all stored API keys."""
|
|
222
|
+
if not self.keys_file.exists():
|
|
223
|
+
return {}
|
|
224
|
+
|
|
225
|
+
try:
|
|
226
|
+
with open(self.keys_file, encoding="utf-8") as f:
|
|
227
|
+
return yaml.safe_load(f) or {}
|
|
228
|
+
except Exception:
|
|
229
|
+
return {}
|
|
230
|
+
|
|
231
|
+
def delete_api_key(self, key_name: str):
|
|
232
|
+
"""Delete a stored API key."""
|
|
233
|
+
keys = self.load_all_keys()
|
|
234
|
+
if key_name in keys:
|
|
235
|
+
del keys[key_name]
|
|
236
|
+
with open(self.keys_file, "w", encoding="utf-8") as f:
|
|
237
|
+
yaml.safe_dump(keys, f, default_flow_style=False)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class SecurityAuditor:
|
|
241
|
+
"""Performs security audits and compliance verification."""
|
|
242
|
+
|
|
243
|
+
def __init__(self, config_dir: Path | None = None, cache_dir: Path | None = None):
|
|
244
|
+
"""
|
|
245
|
+
Initialize security auditor.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
config_dir: Configuration directory
|
|
249
|
+
cache_dir: Cache directory
|
|
250
|
+
"""
|
|
251
|
+
if config_dir is None:
|
|
252
|
+
config_dir = Path.cwd() / ".tapps-agents"
|
|
253
|
+
if cache_dir is None:
|
|
254
|
+
cache_dir = config_dir / "kb" / "context7-cache"
|
|
255
|
+
|
|
256
|
+
self.config_dir = Path(config_dir)
|
|
257
|
+
self.cache_dir = Path(cache_dir)
|
|
258
|
+
self.api_key_manager = APIKeyManager(config_dir)
|
|
259
|
+
|
|
260
|
+
def audit(self) -> SecurityAuditResult:
|
|
261
|
+
"""
|
|
262
|
+
Perform security audit.
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
SecurityAuditResult with audit findings
|
|
266
|
+
"""
|
|
267
|
+
issues = []
|
|
268
|
+
warnings = []
|
|
269
|
+
recommendations = []
|
|
270
|
+
compliance = ComplianceStatus()
|
|
271
|
+
|
|
272
|
+
# Check API key storage
|
|
273
|
+
if not CRYPTO_AVAILABLE:
|
|
274
|
+
warnings.append(
|
|
275
|
+
"cryptography package not installed - API keys cannot be encrypted"
|
|
276
|
+
)
|
|
277
|
+
recommendations.append(
|
|
278
|
+
"Install cryptography package: pip install cryptography"
|
|
279
|
+
)
|
|
280
|
+
else:
|
|
281
|
+
compliance.api_key_encrypted = True
|
|
282
|
+
|
|
283
|
+
# Check environment variable usage
|
|
284
|
+
env_keys = ["CONTEXT7_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"]
|
|
285
|
+
|
|
286
|
+
env_keys_found = [key for key in env_keys if os.getenv(key)]
|
|
287
|
+
if env_keys_found:
|
|
288
|
+
warnings.append(
|
|
289
|
+
f"API keys found in environment variables: {', '.join(env_keys_found)}"
|
|
290
|
+
)
|
|
291
|
+
recommendations.append(
|
|
292
|
+
"Consider using encrypted storage instead of environment variables"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
# Check file permissions
|
|
296
|
+
keys_file = self.config_dir / "api-keys.encrypted"
|
|
297
|
+
if keys_file.exists():
|
|
298
|
+
try:
|
|
299
|
+
stat = keys_file.stat()
|
|
300
|
+
mode = stat.st_mode & 0o777
|
|
301
|
+
if mode > 0o600:
|
|
302
|
+
issues.append(
|
|
303
|
+
f"API keys file has insecure permissions: {oct(mode)}"
|
|
304
|
+
)
|
|
305
|
+
recommendations.append(
|
|
306
|
+
"Set file permissions to 600 (owner read/write only)"
|
|
307
|
+
)
|
|
308
|
+
except Exception:
|
|
309
|
+
logger.debug("Failed to stat API keys file permissions", exc_info=True)
|
|
310
|
+
|
|
311
|
+
# Check cache directory permissions
|
|
312
|
+
if self.cache_dir.exists():
|
|
313
|
+
try:
|
|
314
|
+
stat = self.cache_dir.stat()
|
|
315
|
+
mode = stat.st_mode & 0o777
|
|
316
|
+
if mode > 0o755:
|
|
317
|
+
warnings.append(
|
|
318
|
+
f"Cache directory has open permissions: {oct(mode)}"
|
|
319
|
+
)
|
|
320
|
+
except Exception:
|
|
321
|
+
logger.debug(
|
|
322
|
+
"Failed to stat cache directory permissions", exc_info=True
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
# Check for sensitive data in cache
|
|
326
|
+
# (This is a simplified check - in production, scan for patterns)
|
|
327
|
+
|
|
328
|
+
# Compliance checks
|
|
329
|
+
compliance.audit_logging_enabled = True # Assume enabled if audit is running
|
|
330
|
+
compliance.data_retention_compliant = (
|
|
331
|
+
True # Assume compliant if cache cleanup exists
|
|
332
|
+
)
|
|
333
|
+
compliance.privacy_mode_enabled = True # Context7 queries stay local by design
|
|
334
|
+
|
|
335
|
+
# SOC 2 verification (simplified - would need actual certification)
|
|
336
|
+
compliance.soc2_verified = len(issues) == 0 and len(warnings) < 3
|
|
337
|
+
|
|
338
|
+
passed = len(issues) == 0
|
|
339
|
+
|
|
340
|
+
return SecurityAuditResult(
|
|
341
|
+
passed=passed,
|
|
342
|
+
issues=issues,
|
|
343
|
+
warnings=warnings,
|
|
344
|
+
recommendations=recommendations,
|
|
345
|
+
timestamp=datetime.now(UTC).isoformat(),
|
|
346
|
+
compliance_status=compliance.to_dict(),
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
def verify_compliance(self) -> ComplianceStatus:
|
|
350
|
+
"""
|
|
351
|
+
Verify SOC 2 compliance.
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
ComplianceStatus
|
|
355
|
+
"""
|
|
356
|
+
audit = self.audit()
|
|
357
|
+
return ComplianceStatus(**audit.compliance_status)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def create_security_auditor(
|
|
361
|
+
config_dir: Path | None = None, cache_dir: Path | None = None
|
|
362
|
+
) -> SecurityAuditor:
|
|
363
|
+
"""
|
|
364
|
+
Convenience function to create a security auditor.
|
|
365
|
+
|
|
366
|
+
Args:
|
|
367
|
+
config_dir: Configuration directory
|
|
368
|
+
cache_dir: Cache directory
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
SecurityAuditor instance
|
|
372
|
+
"""
|
|
373
|
+
return SecurityAuditor(config_dir=config_dir, cache_dir=cache_dir)
|