moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,745 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Unified Permission Manager for MoAI-ADK
|
|
3
|
+
|
|
4
|
+
Production-ready permission management system that addresses agent permission validation
|
|
5
|
+
errors identified in Claude Code debug logs. Provides automatic correction, validation,
|
|
6
|
+
and monitoring of agent permissions and access control.
|
|
7
|
+
|
|
8
|
+
Author: MoAI-ADK Core Team
|
|
9
|
+
Version: 1.0.0
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
import time
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
from enum import Enum
|
|
18
|
+
from typing import Any, Dict, List, Optional
|
|
19
|
+
|
|
20
|
+
# Configure logging
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class PermissionMode(Enum):
|
|
25
|
+
"""Valid permission modes for agents"""
|
|
26
|
+
|
|
27
|
+
ACCEPT_EDITS = "acceptEdits"
|
|
28
|
+
BYPASS_PERMISSIONS = "bypassPermissions"
|
|
29
|
+
DEFAULT = "default"
|
|
30
|
+
DONT_ASK = "dontAsk"
|
|
31
|
+
PLAN = "plan"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class PermissionSeverity(Enum):
|
|
35
|
+
"""Permission validation severity levels"""
|
|
36
|
+
|
|
37
|
+
LOW = "low"
|
|
38
|
+
MEDIUM = "medium"
|
|
39
|
+
HIGH = "high"
|
|
40
|
+
CRITICAL = "critical"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ResourceType(Enum):
|
|
44
|
+
"""Types of resources that can be protected"""
|
|
45
|
+
|
|
46
|
+
AGENT = "agent"
|
|
47
|
+
TOOL = "tool"
|
|
48
|
+
FILE = "file"
|
|
49
|
+
COMMAND = "command"
|
|
50
|
+
SETTING = "setting"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class PermissionRule:
|
|
55
|
+
"""Individual permission rule"""
|
|
56
|
+
|
|
57
|
+
resource_type: ResourceType
|
|
58
|
+
resource_name: str
|
|
59
|
+
action: str
|
|
60
|
+
allowed: bool
|
|
61
|
+
conditions: Optional[Dict[str, Any]] = None
|
|
62
|
+
expires_at: Optional[float] = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class ValidationResult:
|
|
67
|
+
"""Result of permission validation"""
|
|
68
|
+
|
|
69
|
+
valid: bool
|
|
70
|
+
corrected_mode: Optional[str] = None
|
|
71
|
+
warnings: List[str] = field(default_factory=list)
|
|
72
|
+
errors: List[str] = field(default_factory=list)
|
|
73
|
+
severity: PermissionSeverity = PermissionSeverity.LOW
|
|
74
|
+
auto_corrected: bool = False
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass
|
|
78
|
+
class PermissionAudit:
|
|
79
|
+
"""Audit log entry for permission changes"""
|
|
80
|
+
|
|
81
|
+
timestamp: float
|
|
82
|
+
user_id: Optional[str]
|
|
83
|
+
resource_type: ResourceType
|
|
84
|
+
resource_name: str
|
|
85
|
+
action: str
|
|
86
|
+
old_permissions: Optional[Dict[str, Any]]
|
|
87
|
+
new_permissions: Optional[Dict[str, Any]]
|
|
88
|
+
reason: str
|
|
89
|
+
auto_corrected: bool
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class UnifiedPermissionManager:
|
|
93
|
+
"""
|
|
94
|
+
Production-ready permission management system that addresses Claude Code
|
|
95
|
+
agent permission validation errors with automatic correction and monitoring.
|
|
96
|
+
|
|
97
|
+
Key Features:
|
|
98
|
+
- Automatic permission mode validation and correction
|
|
99
|
+
- Role-based access control with inheritance
|
|
100
|
+
- Real-time permission monitoring and auditing
|
|
101
|
+
- Configuration file auto-recovery
|
|
102
|
+
- Security-focused fail-safe behavior
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
# Valid permission modes from Claude Code
|
|
106
|
+
VALID_PERMISSION_MODES = {
|
|
107
|
+
"acceptEdits",
|
|
108
|
+
"bypassPermissions",
|
|
109
|
+
"default",
|
|
110
|
+
"dontAsk",
|
|
111
|
+
"plan",
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Default permission mappings
|
|
115
|
+
DEFAULT_PERMISSIONS = {
|
|
116
|
+
"backend-expert": PermissionMode.ACCEPT_EDITS,
|
|
117
|
+
"frontend-expert": PermissionMode.ACCEPT_EDITS,
|
|
118
|
+
"security-expert": PermissionMode.ACCEPT_EDITS,
|
|
119
|
+
"api-designer": PermissionMode.PLAN,
|
|
120
|
+
"database-expert": PermissionMode.ACCEPT_EDITS,
|
|
121
|
+
"docs-manager": PermissionMode.ACCEPT_EDITS,
|
|
122
|
+
"tdd-implementer": PermissionMode.ACCEPT_EDITS,
|
|
123
|
+
"spec-builder": PermissionMode.ACCEPT_EDITS,
|
|
124
|
+
"quality-gate": PermissionMode.ACCEPT_EDITS,
|
|
125
|
+
"default": PermissionMode.DEFAULT,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
def __init__(self, config_path: Optional[str] = None, enable_logging: bool = True):
|
|
129
|
+
self.config_path = config_path or ".claude/settings.json"
|
|
130
|
+
self.enable_logging = enable_logging
|
|
131
|
+
self.permission_cache: Dict[str, Any] = {}
|
|
132
|
+
self.audit_log: List[PermissionAudit] = []
|
|
133
|
+
self.stats = {
|
|
134
|
+
"validations_performed": 0,
|
|
135
|
+
"auto_corrections": 0,
|
|
136
|
+
"security_violations": 0,
|
|
137
|
+
"permission_denied": 0,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
# Role hierarchy for inheritance
|
|
141
|
+
self.role_hierarchy = {
|
|
142
|
+
"admin": ["developer", "user"],
|
|
143
|
+
"developer": ["user"],
|
|
144
|
+
"user": [],
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# Load and validate current configuration
|
|
148
|
+
self.config = self._load_configuration()
|
|
149
|
+
self._validate_all_permissions()
|
|
150
|
+
|
|
151
|
+
def _load_configuration(self) -> Dict[str, Any]:
|
|
152
|
+
"""Load configuration from file with error handling"""
|
|
153
|
+
try:
|
|
154
|
+
if os.path.exists(self.config_path):
|
|
155
|
+
with open(self.config_path, "r", encoding="utf-8") as f:
|
|
156
|
+
config = json.load(f)
|
|
157
|
+
|
|
158
|
+
if self.enable_logging:
|
|
159
|
+
logger.info(f"Loaded configuration from {self.config_path}")
|
|
160
|
+
|
|
161
|
+
return config
|
|
162
|
+
else:
|
|
163
|
+
if self.enable_logging:
|
|
164
|
+
logger.warning(f"Configuration file not found: {self.config_path}")
|
|
165
|
+
return {}
|
|
166
|
+
|
|
167
|
+
except json.JSONDecodeError as e:
|
|
168
|
+
if self.enable_logging:
|
|
169
|
+
logger.error(f"Invalid JSON in configuration file: {e}")
|
|
170
|
+
return {}
|
|
171
|
+
except Exception as e:
|
|
172
|
+
if self.enable_logging:
|
|
173
|
+
logger.error(f"Error loading configuration: {e}")
|
|
174
|
+
return {}
|
|
175
|
+
|
|
176
|
+
def _validate_all_permissions(self) -> None:
|
|
177
|
+
"""Validate all permissions in the current configuration"""
|
|
178
|
+
corrections_made = False
|
|
179
|
+
|
|
180
|
+
# Check agent permissions
|
|
181
|
+
agents_config = self.config.get("agents", {})
|
|
182
|
+
for agent_name, agent_config in agents_config.items():
|
|
183
|
+
result = self.validate_agent_permission(agent_name, agent_config)
|
|
184
|
+
if result.auto_corrected:
|
|
185
|
+
corrections_made = True
|
|
186
|
+
if self.enable_logging:
|
|
187
|
+
logger.info(f"Auto-corrected permissions for agent: {agent_name}")
|
|
188
|
+
|
|
189
|
+
# Check settings permissions
|
|
190
|
+
settings_config = self.config.get("projectSettings", {})
|
|
191
|
+
if "allowedTools" in settings_config:
|
|
192
|
+
result = self.validate_tool_permissions(settings_config["allowedTools"])
|
|
193
|
+
if result.auto_corrected:
|
|
194
|
+
corrections_made = True
|
|
195
|
+
|
|
196
|
+
# Save corrections if any were made
|
|
197
|
+
if corrections_made:
|
|
198
|
+
self._save_configuration()
|
|
199
|
+
if self.enable_logging:
|
|
200
|
+
logger.info("Saved corrected configuration")
|
|
201
|
+
|
|
202
|
+
def validate_agent_permission(self, agent_name: str, agent_config: Dict[str, Any]) -> ValidationResult:
|
|
203
|
+
"""
|
|
204
|
+
Validate and auto-correct agent permission configuration.
|
|
205
|
+
|
|
206
|
+
Addresses the permissionMode validation errors from debug logs:
|
|
207
|
+
- Lines 50-80: Multiple agents with invalid permission modes ('ask', 'auto')
|
|
208
|
+
"""
|
|
209
|
+
self.stats["validations_performed"] += 1
|
|
210
|
+
|
|
211
|
+
result = ValidationResult(valid=True)
|
|
212
|
+
|
|
213
|
+
# Extract current permission mode
|
|
214
|
+
current_mode = agent_config.get("permissionMode", "default")
|
|
215
|
+
|
|
216
|
+
# Validate permission mode
|
|
217
|
+
if current_mode not in self.VALID_PERMISSION_MODES:
|
|
218
|
+
# Auto-correct to appropriate default
|
|
219
|
+
suggested_mode = self._suggest_permission_mode(agent_name)
|
|
220
|
+
|
|
221
|
+
result.errors.append(
|
|
222
|
+
f"Invalid permissionMode '{current_mode}' for agent '{agent_name}'. "
|
|
223
|
+
f"Valid options: {sorted(self.VALID_PERMISSION_MODES)}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Auto-correction
|
|
227
|
+
agent_config["permissionMode"] = suggested_mode
|
|
228
|
+
result.corrected_mode = suggested_mode
|
|
229
|
+
result.auto_corrected = True
|
|
230
|
+
result.severity = PermissionSeverity.HIGH
|
|
231
|
+
|
|
232
|
+
self.stats["auto_corrections"] += 1
|
|
233
|
+
self._audit_permission_change(
|
|
234
|
+
resource_type=ResourceType.AGENT,
|
|
235
|
+
resource_name=agent_name,
|
|
236
|
+
action="permission_mode_correction",
|
|
237
|
+
old_permissions={"permissionMode": current_mode},
|
|
238
|
+
new_permissions={"permissionMode": suggested_mode},
|
|
239
|
+
reason=f"Invalid permission mode '{current_mode}' auto-corrected to '{suggested_mode}'",
|
|
240
|
+
auto_corrected=True,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
if self.enable_logging:
|
|
244
|
+
logger.warning(
|
|
245
|
+
f"Auto-corrected agent '{agent_name}' permissionMode from '{current_mode}' to '{suggested_mode}'"
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Validate other agent configuration
|
|
249
|
+
if "model" in agent_config:
|
|
250
|
+
model = agent_config["model"]
|
|
251
|
+
if not isinstance(model, str) or not model.strip():
|
|
252
|
+
result.errors.append(f"Invalid model configuration for agent '{agent_name}'")
|
|
253
|
+
result.severity = PermissionSeverity.MEDIUM
|
|
254
|
+
|
|
255
|
+
# Check for required fields
|
|
256
|
+
required_fields = ["description", "systemPrompt"]
|
|
257
|
+
for req_field in required_fields:
|
|
258
|
+
if req_field not in agent_config or not agent_config[req_field]:
|
|
259
|
+
result.warnings.append(f"Missing or empty '{req_field}' for agent '{agent_name}'")
|
|
260
|
+
|
|
261
|
+
return result
|
|
262
|
+
|
|
263
|
+
def _suggest_permission_mode(self, agent_name: str) -> str:
|
|
264
|
+
"""
|
|
265
|
+
Suggest appropriate permission mode based on agent name and function.
|
|
266
|
+
|
|
267
|
+
This addresses the core issue from the debug logs where agents had
|
|
268
|
+
invalid permission modes like 'ask' and 'auto'.
|
|
269
|
+
"""
|
|
270
|
+
# Check if agent name matches known patterns
|
|
271
|
+
agent_lower = agent_name.lower()
|
|
272
|
+
|
|
273
|
+
# Security and compliance focused agents should be more restrictive
|
|
274
|
+
if any(keyword in agent_lower for keyword in ["security", "audit", "compliance"]):
|
|
275
|
+
return PermissionMode.PLAN.value
|
|
276
|
+
|
|
277
|
+
# Code execution and modification agents should accept edits
|
|
278
|
+
if any(keyword in agent_lower for keyword in ["expert", "implementer", "builder"]):
|
|
279
|
+
return PermissionMode.ACCEPT_EDITS.value
|
|
280
|
+
|
|
281
|
+
# Planning and analysis agents should use plan mode
|
|
282
|
+
if any(keyword in agent_lower for keyword in ["planner", "analyzer", "designer"]):
|
|
283
|
+
return PermissionMode.PLAN.value
|
|
284
|
+
|
|
285
|
+
# Management agents should have appropriate permissions
|
|
286
|
+
if any(keyword in agent_lower for keyword in ["manager", "coordinator"]):
|
|
287
|
+
return PermissionMode.ACCEPT_EDITS.value
|
|
288
|
+
|
|
289
|
+
# Check against our default mappings
|
|
290
|
+
if agent_name in self.DEFAULT_PERMISSIONS:
|
|
291
|
+
return self.DEFAULT_PERMISSIONS[agent_name].value
|
|
292
|
+
|
|
293
|
+
# Default to safe option
|
|
294
|
+
return PermissionMode.DEFAULT.value
|
|
295
|
+
|
|
296
|
+
def validate_tool_permissions(self, allowed_tools: List[str]) -> ValidationResult:
|
|
297
|
+
"""Validate list of allowed tools for security compliance"""
|
|
298
|
+
result = ValidationResult(valid=True)
|
|
299
|
+
|
|
300
|
+
# Define dangerous tools that should require explicit approval
|
|
301
|
+
dangerous_tools = {
|
|
302
|
+
"Bash(rm -rf:*)",
|
|
303
|
+
"Bash(sudo:*)",
|
|
304
|
+
"Bash(chmod -R 777:*)",
|
|
305
|
+
"Bash(dd:*)",
|
|
306
|
+
"Bash(mkfs:*)",
|
|
307
|
+
"Bash(fdisk:*)",
|
|
308
|
+
"Bash(reboot:*)",
|
|
309
|
+
"Bash(shutdown:*)",
|
|
310
|
+
"Bash(git push --force:*)",
|
|
311
|
+
"Bash(git reset --hard:*)",
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
for tool in allowed_tools:
|
|
315
|
+
if tool in dangerous_tools:
|
|
316
|
+
result.warnings.append(f"Dangerous tool allowed: {tool}. Consider restricting access.")
|
|
317
|
+
result.severity = PermissionSeverity.HIGH
|
|
318
|
+
self.stats["security_violations"] += 1
|
|
319
|
+
|
|
320
|
+
return result
|
|
321
|
+
|
|
322
|
+
def check_tool_permission(self, user_role: str, tool_name: str, operation: str) -> bool:
|
|
323
|
+
"""
|
|
324
|
+
Check if a user role is permitted to use a specific tool.
|
|
325
|
+
|
|
326
|
+
Implements unified permission checking with role hierarchy support.
|
|
327
|
+
"""
|
|
328
|
+
self.stats["validations_performed"] += 1
|
|
329
|
+
|
|
330
|
+
# Check cache first
|
|
331
|
+
cache_key = f"{user_role}:{tool_name}:{operation}"
|
|
332
|
+
if cache_key in self.permission_cache:
|
|
333
|
+
return self.permission_cache[cache_key]
|
|
334
|
+
|
|
335
|
+
# Check direct permissions
|
|
336
|
+
permitted = self._check_direct_permission(user_role, tool_name, operation)
|
|
337
|
+
|
|
338
|
+
# If not directly permitted, check role hierarchy
|
|
339
|
+
if not permitted:
|
|
340
|
+
for subordinate_role in self.role_hierarchy.get(user_role, []):
|
|
341
|
+
if self._check_direct_permission(subordinate_role, tool_name, operation):
|
|
342
|
+
permitted = True
|
|
343
|
+
break
|
|
344
|
+
|
|
345
|
+
# Cache the result
|
|
346
|
+
self.permission_cache[cache_key] = permitted
|
|
347
|
+
|
|
348
|
+
if not permitted:
|
|
349
|
+
self.stats["permission_denied"] += 1
|
|
350
|
+
if self.enable_logging:
|
|
351
|
+
logger.warning(f"Permission denied: {user_role} cannot {operation} with {tool_name}")
|
|
352
|
+
|
|
353
|
+
return permitted
|
|
354
|
+
|
|
355
|
+
def _check_direct_permission(self, role: str, tool_name: str, operation: str) -> bool:
|
|
356
|
+
"""Check direct permissions for a specific role"""
|
|
357
|
+
# Default permissions by role
|
|
358
|
+
role_permissions = {
|
|
359
|
+
"admin": ["*"], # All tools
|
|
360
|
+
"developer": ["Task", "Read", "Write", "Edit", "Bash", "AskUserQuestion"],
|
|
361
|
+
"user": ["Task", "Read", "AskUserQuestion"],
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
allowed_tools = role_permissions.get(role, [])
|
|
365
|
+
|
|
366
|
+
# Wildcard permission
|
|
367
|
+
if "*" in allowed_tools:
|
|
368
|
+
return True
|
|
369
|
+
|
|
370
|
+
# Exact match
|
|
371
|
+
if tool_name in allowed_tools:
|
|
372
|
+
return True
|
|
373
|
+
|
|
374
|
+
# Pattern matching for Bash commands
|
|
375
|
+
if tool_name.startswith("Bash(") and "Bash" in allowed_tools:
|
|
376
|
+
return True
|
|
377
|
+
|
|
378
|
+
return False
|
|
379
|
+
|
|
380
|
+
def validate_configuration(self, config_path: Optional[str] = None) -> ValidationResult:
|
|
381
|
+
"""
|
|
382
|
+
Validate Claude Code configuration file for security and compliance.
|
|
383
|
+
|
|
384
|
+
This addresses the configuration security gaps identified in the analysis.
|
|
385
|
+
"""
|
|
386
|
+
config_to_validate = config_path or self.config_path
|
|
387
|
+
result = ValidationResult(valid=True)
|
|
388
|
+
|
|
389
|
+
try:
|
|
390
|
+
with open(config_to_validate, "r", encoding="utf-8") as f:
|
|
391
|
+
config = json.load(f)
|
|
392
|
+
except FileNotFoundError:
|
|
393
|
+
result.errors.append(f"Configuration file not found: {config_to_validate}")
|
|
394
|
+
result.valid = False
|
|
395
|
+
result.severity = PermissionSeverity.CRITICAL
|
|
396
|
+
return result
|
|
397
|
+
except json.JSONDecodeError as e:
|
|
398
|
+
result.errors.append(f"Invalid JSON in configuration file: {e}")
|
|
399
|
+
result.valid = False
|
|
400
|
+
result.severity = PermissionSeverity.CRITICAL
|
|
401
|
+
return result
|
|
402
|
+
except Exception as e:
|
|
403
|
+
result.errors.append(f"Error reading configuration file: {e}")
|
|
404
|
+
result.valid = False
|
|
405
|
+
result.severity = PermissionSeverity.HIGH
|
|
406
|
+
return result
|
|
407
|
+
|
|
408
|
+
# Security validations
|
|
409
|
+
security_checks = [
|
|
410
|
+
self._validate_file_permissions,
|
|
411
|
+
self._validate_allowed_tools,
|
|
412
|
+
self._validate_sandbox_settings,
|
|
413
|
+
self._validate_mcp_servers,
|
|
414
|
+
]
|
|
415
|
+
|
|
416
|
+
for check in security_checks:
|
|
417
|
+
check_result = check(config)
|
|
418
|
+
if not check_result:
|
|
419
|
+
result.valid = False
|
|
420
|
+
result.severity = PermissionSeverity.CRITICAL
|
|
421
|
+
|
|
422
|
+
return result
|
|
423
|
+
|
|
424
|
+
def _validate_file_permissions(self, config: Dict[str, Any]) -> bool:
|
|
425
|
+
"""Validate file permission settings"""
|
|
426
|
+
permissions = config.get("permissions", {})
|
|
427
|
+
|
|
428
|
+
# Check for overly permissive settings
|
|
429
|
+
if "deniedTools" in permissions:
|
|
430
|
+
denied_tools = permissions["deniedTools"]
|
|
431
|
+
# Ensure dangerous operations are denied
|
|
432
|
+
dangerous_patterns = ["rm -rf", "sudo", "chmod 777", "format", "mkfs"]
|
|
433
|
+
|
|
434
|
+
for pattern in dangerous_patterns:
|
|
435
|
+
found = any(pattern in tool for tool in denied_tools)
|
|
436
|
+
if not found:
|
|
437
|
+
logger.warning(f"Dangerous operation not denied: {pattern}")
|
|
438
|
+
# Don't fail validation for this - just warn
|
|
439
|
+
# return False
|
|
440
|
+
|
|
441
|
+
return True
|
|
442
|
+
|
|
443
|
+
def _validate_allowed_tools(self, config: Dict[str, Any]) -> bool:
|
|
444
|
+
"""Validate allowed tools configuration"""
|
|
445
|
+
permissions = config.get("permissions", {})
|
|
446
|
+
allowed_tools = permissions.get("allowedTools", [])
|
|
447
|
+
|
|
448
|
+
# Ensure essential tools are available (but don't fail validation)
|
|
449
|
+
essential_tools = ["Task", "Read", "AskUserQuestion"]
|
|
450
|
+
for tool in essential_tools:
|
|
451
|
+
if tool not in allowed_tools:
|
|
452
|
+
logger.warning(f"Essential tool not allowed: {tool}")
|
|
453
|
+
# Don't fail validation for this - just warn
|
|
454
|
+
# return False
|
|
455
|
+
|
|
456
|
+
return True
|
|
457
|
+
|
|
458
|
+
def _validate_sandbox_settings(self, config: Dict[str, Any]) -> bool:
|
|
459
|
+
"""Validate sandbox security settings"""
|
|
460
|
+
sandbox = config.get("sandbox", {})
|
|
461
|
+
|
|
462
|
+
# Ensure sandbox is enabled
|
|
463
|
+
if not sandbox.get("allowUnsandboxedCommands", False):
|
|
464
|
+
return True
|
|
465
|
+
|
|
466
|
+
# If sandbox is disabled, ensure validated commands are restricted
|
|
467
|
+
validated_commands = sandbox.get("validatedCommands", [])
|
|
468
|
+
dangerous_commands = ["rm -rf", "sudo", "format", "mkfs"]
|
|
469
|
+
|
|
470
|
+
for dangerous_cmd in dangerous_commands:
|
|
471
|
+
if any(dangerous_cmd in validated_cmd for validated_cmd in validated_commands):
|
|
472
|
+
logger.warning(f"Dangerous command in validated commands: {dangerous_cmd}")
|
|
473
|
+
return False
|
|
474
|
+
|
|
475
|
+
return True
|
|
476
|
+
|
|
477
|
+
def _validate_mcp_servers(self, config: Dict[str, Any]) -> bool:
|
|
478
|
+
"""Validate MCP server configuration for security"""
|
|
479
|
+
mcp_servers = config.get("mcpServers", {})
|
|
480
|
+
|
|
481
|
+
for server_name, server_config in mcp_servers.items():
|
|
482
|
+
# Ensure command doesn't use dangerous flags
|
|
483
|
+
if "command" in server_config:
|
|
484
|
+
command = server_config["command"]
|
|
485
|
+
dangerous_flags = ["--insecure", "--allow-all", "--disable-ssl"]
|
|
486
|
+
|
|
487
|
+
for flag in dangerous_flags:
|
|
488
|
+
if flag in command:
|
|
489
|
+
logger.warning(f"Dangerous flag in MCP server {server_name}: {flag}")
|
|
490
|
+
return False
|
|
491
|
+
|
|
492
|
+
return True
|
|
493
|
+
|
|
494
|
+
def auto_fix_agent_permissions(self, agent_name: str) -> ValidationResult:
|
|
495
|
+
"""
|
|
496
|
+
Automatically fix agent permission configuration.
|
|
497
|
+
|
|
498
|
+
This is the main method to address the permissionMode errors
|
|
499
|
+
from the debug logs (Lines 50-80).
|
|
500
|
+
"""
|
|
501
|
+
# Get current agent configuration
|
|
502
|
+
agents_config = self.config.setdefault("agents", {})
|
|
503
|
+
agent_config = agents_config.get(agent_name, {})
|
|
504
|
+
|
|
505
|
+
# Validate and fix
|
|
506
|
+
result = self.validate_agent_permission(agent_name, agent_config)
|
|
507
|
+
|
|
508
|
+
# Save configuration if corrections were made
|
|
509
|
+
if result.auto_corrected:
|
|
510
|
+
agents_config[agent_name] = agent_config
|
|
511
|
+
self._save_configuration()
|
|
512
|
+
|
|
513
|
+
if self.enable_logging:
|
|
514
|
+
logger.info(f"Fixed permissions for agent: {agent_name}")
|
|
515
|
+
|
|
516
|
+
return result
|
|
517
|
+
|
|
518
|
+
def auto_fix_all_agents(self) -> Dict[str, ValidationResult]:
|
|
519
|
+
"""Auto-fix all agent permissions in the configuration"""
|
|
520
|
+
results = {}
|
|
521
|
+
|
|
522
|
+
agents_config = self.config.get("agents", {})
|
|
523
|
+
for agent_name in agents_config:
|
|
524
|
+
results[agent_name] = self.auto_fix_agent_permissions(agent_name)
|
|
525
|
+
|
|
526
|
+
# Also check for agents mentioned in the debug log that might not be in config
|
|
527
|
+
debug_log_agents = [
|
|
528
|
+
"backend-expert",
|
|
529
|
+
"security-expert",
|
|
530
|
+
"api-designer",
|
|
531
|
+
"monitoring-expert",
|
|
532
|
+
"performance-engineer",
|
|
533
|
+
"migration-expert",
|
|
534
|
+
"mcp-playwright-integrator",
|
|
535
|
+
"quality-gate",
|
|
536
|
+
"frontend-expert",
|
|
537
|
+
"debug-helper",
|
|
538
|
+
"ui-ux-expert",
|
|
539
|
+
"trust-checker",
|
|
540
|
+
"project-manager",
|
|
541
|
+
"mcp-context7-integrator",
|
|
542
|
+
"mcp-figma-integrator",
|
|
543
|
+
"tdd-implementer",
|
|
544
|
+
"format-expert",
|
|
545
|
+
"mcp-notion-integrator",
|
|
546
|
+
"devops-expert",
|
|
547
|
+
"docs-manager",
|
|
548
|
+
"implementation-planner",
|
|
549
|
+
"skill-factory",
|
|
550
|
+
"component-designer",
|
|
551
|
+
"database-expert",
|
|
552
|
+
"agent-factory",
|
|
553
|
+
"git-manager",
|
|
554
|
+
"sync-manager",
|
|
555
|
+
"spec-builder",
|
|
556
|
+
"doc-syncer",
|
|
557
|
+
"accessibility-expert",
|
|
558
|
+
"cc-manager",
|
|
559
|
+
]
|
|
560
|
+
|
|
561
|
+
for agent_name in debug_log_agents:
|
|
562
|
+
if agent_name not in agents_config:
|
|
563
|
+
# Create default configuration for missing agents
|
|
564
|
+
agents_config[agent_name] = {
|
|
565
|
+
"permissionMode": self._suggest_permission_mode(agent_name),
|
|
566
|
+
"description": f"Auto-generated configuration for {agent_name}",
|
|
567
|
+
"systemPrompt": f"Default system prompt for {agent_name}",
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
results[agent_name] = ValidationResult(
|
|
571
|
+
valid=True,
|
|
572
|
+
auto_corrected=True,
|
|
573
|
+
warnings=[f"Created default configuration for agent: {agent_name}"],
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
if any(result.auto_corrected for result in results.values()):
|
|
577
|
+
self._save_configuration()
|
|
578
|
+
|
|
579
|
+
return results
|
|
580
|
+
|
|
581
|
+
def _save_configuration(self) -> None:
|
|
582
|
+
"""Save current configuration to file"""
|
|
583
|
+
try:
|
|
584
|
+
# Create backup
|
|
585
|
+
if os.path.exists(self.config_path):
|
|
586
|
+
backup_path = f"{self.config_path}.backup.{int(time.time())}"
|
|
587
|
+
os.rename(self.config_path, backup_path)
|
|
588
|
+
if self.enable_logging:
|
|
589
|
+
logger.info(f"Created configuration backup: {backup_path}")
|
|
590
|
+
|
|
591
|
+
# Save updated configuration
|
|
592
|
+
with open(self.config_path, "w", encoding="utf-8") as f:
|
|
593
|
+
json.dump(self.config, f, indent=2, ensure_ascii=False)
|
|
594
|
+
|
|
595
|
+
if self.enable_logging:
|
|
596
|
+
logger.info(f"Saved configuration to {self.config_path}")
|
|
597
|
+
|
|
598
|
+
except Exception as e:
|
|
599
|
+
if self.enable_logging:
|
|
600
|
+
logger.error(f"Error saving configuration: {e}")
|
|
601
|
+
|
|
602
|
+
def _audit_permission_change(
|
|
603
|
+
self,
|
|
604
|
+
resource_type: ResourceType,
|
|
605
|
+
resource_name: str,
|
|
606
|
+
action: str,
|
|
607
|
+
old_permissions: Optional[Dict[str, Any]],
|
|
608
|
+
new_permissions: Optional[Dict[str, Any]],
|
|
609
|
+
reason: str,
|
|
610
|
+
auto_corrected: bool,
|
|
611
|
+
) -> None:
|
|
612
|
+
"""Log permission changes for audit trail"""
|
|
613
|
+
audit_entry = PermissionAudit(
|
|
614
|
+
timestamp=time.time(),
|
|
615
|
+
user_id=None, # System correction
|
|
616
|
+
resource_type=resource_type,
|
|
617
|
+
resource_name=resource_name,
|
|
618
|
+
action=action,
|
|
619
|
+
old_permissions=old_permissions,
|
|
620
|
+
new_permissions=new_permissions,
|
|
621
|
+
reason=reason,
|
|
622
|
+
auto_corrected=auto_corrected,
|
|
623
|
+
)
|
|
624
|
+
|
|
625
|
+
self.audit_log.append(audit_entry)
|
|
626
|
+
|
|
627
|
+
# Keep audit log size manageable
|
|
628
|
+
if len(self.audit_log) > 1000:
|
|
629
|
+
self.audit_log = self.audit_log[-1000:]
|
|
630
|
+
|
|
631
|
+
def get_permission_stats(self) -> Dict[str, Any]:
|
|
632
|
+
"""Get permission management statistics"""
|
|
633
|
+
return {
|
|
634
|
+
**self.stats,
|
|
635
|
+
"cached_permissions": len(self.permission_cache),
|
|
636
|
+
"audit_log_entries": len(self.audit_log),
|
|
637
|
+
"configured_agents": len(self.config.get("agents", {})),
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
def get_recent_audits(self, limit: int = 50) -> List[PermissionAudit]:
|
|
641
|
+
"""Get recent permission audit entries"""
|
|
642
|
+
return self.audit_log[-limit:]
|
|
643
|
+
|
|
644
|
+
def export_audit_report(self, output_path: str) -> None:
|
|
645
|
+
"""Export audit report to file"""
|
|
646
|
+
report = {
|
|
647
|
+
"generated_at": time.time(),
|
|
648
|
+
"stats": self.get_permission_stats(),
|
|
649
|
+
"recent_audits": [
|
|
650
|
+
{
|
|
651
|
+
"timestamp": audit.timestamp,
|
|
652
|
+
"resource_type": audit.resource_type.value,
|
|
653
|
+
"resource_name": audit.resource_name,
|
|
654
|
+
"action": audit.action,
|
|
655
|
+
"reason": audit.reason,
|
|
656
|
+
"auto_corrected": audit.auto_corrected,
|
|
657
|
+
}
|
|
658
|
+
for audit in self.get_recent_audits()
|
|
659
|
+
],
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
with open(output_path, "w", encoding="utf-8") as f:
|
|
663
|
+
json.dump(report, f, indent=2, ensure_ascii=False)
|
|
664
|
+
|
|
665
|
+
if self.enable_logging:
|
|
666
|
+
logger.info(f"Exported audit report to {output_path}")
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
# Global instance for easy import
|
|
670
|
+
permission_manager = UnifiedPermissionManager()
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
def validate_agent_permission(agent_name: str, agent_config: Dict[str, Any]) -> ValidationResult:
|
|
674
|
+
"""Convenience function to validate agent permissions"""
|
|
675
|
+
return permission_manager.validate_agent_permission(agent_name, agent_config)
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
def check_tool_permission(user_role: str, tool_name: str, operation: str) -> bool:
|
|
679
|
+
"""Convenience function to check tool permissions"""
|
|
680
|
+
return permission_manager.check_tool_permission(user_role, tool_name, operation)
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
def auto_fix_all_agent_permissions() -> Dict[str, ValidationResult]:
|
|
684
|
+
"""Convenience function to auto-fix all agent permissions"""
|
|
685
|
+
return permission_manager.auto_fix_all_agents()
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
def get_permission_stats() -> Dict[str, Any]:
|
|
689
|
+
"""Convenience function to get permission statistics"""
|
|
690
|
+
return permission_manager.get_permission_stats()
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
if __name__ == "__main__":
|
|
694
|
+
# Demo script for testing the permission manager
|
|
695
|
+
print("🔧 MoAI-ADK Unified Permission Manager Demo")
|
|
696
|
+
print("=" * 50)
|
|
697
|
+
|
|
698
|
+
# Test agent permission validation
|
|
699
|
+
test_agents = [
|
|
700
|
+
{
|
|
701
|
+
"name": "backend-expert",
|
|
702
|
+
"config": {"permissionMode": "ask", "description": "Backend expert agent"},
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
"name": "security-expert",
|
|
706
|
+
"config": {
|
|
707
|
+
"permissionMode": "auto",
|
|
708
|
+
"description": "Security expert agent",
|
|
709
|
+
},
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
"name": "api-designer",
|
|
713
|
+
"config": {"permissionMode": "plan", "description": "API designer agent"},
|
|
714
|
+
},
|
|
715
|
+
]
|
|
716
|
+
|
|
717
|
+
print("Testing agent permission validation and auto-correction...")
|
|
718
|
+
|
|
719
|
+
for agent in test_agents:
|
|
720
|
+
print(f"\nTesting agent: {agent['name']}")
|
|
721
|
+
agent_config: Dict[str, Any] = agent["config"] # type: ignore[assignment]
|
|
722
|
+
print(f"Original permissionMode: {agent_config.get('permissionMode', 'default')}")
|
|
723
|
+
|
|
724
|
+
agent_name: str = agent["name"] # type: ignore[assignment]
|
|
725
|
+
result = permission_manager.validate_agent_permission(agent_name, agent_config)
|
|
726
|
+
|
|
727
|
+
print(f"Valid: {result.valid}")
|
|
728
|
+
print(f"Auto-corrected: {result.auto_corrected}")
|
|
729
|
+
|
|
730
|
+
if result.corrected_mode:
|
|
731
|
+
print(f"Corrected to: {result.corrected_mode}")
|
|
732
|
+
|
|
733
|
+
if result.errors:
|
|
734
|
+
print(f"Errors: {result.errors}")
|
|
735
|
+
|
|
736
|
+
if result.warnings:
|
|
737
|
+
print(f"Warnings: {result.warnings}")
|
|
738
|
+
|
|
739
|
+
print("\n📊 Permission Statistics:")
|
|
740
|
+
stats = permission_manager.get_permission_stats()
|
|
741
|
+
for key, value in stats.items():
|
|
742
|
+
print(f" {key}: {value}")
|
|
743
|
+
|
|
744
|
+
print("\n✨ Demo completed! The Unified Permission Manager addresses")
|
|
745
|
+
print(" the agent permission validation errors from the debug logs.")
|