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,651 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Session Manager for MoAI-ADK Agent Orchestration
|
|
3
|
+
|
|
4
|
+
Manages sub-agent session IDs and resume logic based on official Claude Code documentation.
|
|
5
|
+
Provides session tracking, result storage, and resume decision making.
|
|
6
|
+
|
|
7
|
+
Official Documentation Reference:
|
|
8
|
+
https://code.claude.com/docs/en/sub-agents
|
|
9
|
+
|
|
10
|
+
Key Principles:
|
|
11
|
+
- Sub-agents operate in isolated context windows
|
|
12
|
+
- No direct agent-to-agent communication
|
|
13
|
+
- Results flow through main conversation thread (Alfred)
|
|
14
|
+
- Resume preserves full conversation history
|
|
15
|
+
- Each execution gets unique agentId
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import json
|
|
19
|
+
import logging
|
|
20
|
+
from datetime import datetime
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Dict, List, Optional
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SessionManager:
|
|
28
|
+
"""
|
|
29
|
+
Manages sub-agent session IDs and resume logic.
|
|
30
|
+
|
|
31
|
+
Based on official Claude Code sub-agent pattern:
|
|
32
|
+
- Each agent execution gets unique agentId
|
|
33
|
+
- Resume parameter inherits full conversation history
|
|
34
|
+
- Session transcripts stored in agent-{agentId}.jsonl
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
_sessions: Mapping of agent_name to current agentId
|
|
38
|
+
_results: Storage of agent execution results (agentId → result data)
|
|
39
|
+
_chains: Workflow chains tracking (chain_name → [agentIds])
|
|
40
|
+
_session_file: Persistent storage location
|
|
41
|
+
_transcript_dir: Directory for conversation transcripts
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
session_file: Optional[Path] = None,
|
|
47
|
+
transcript_dir: Optional[Path] = None,
|
|
48
|
+
):
|
|
49
|
+
"""
|
|
50
|
+
Initialize SessionManager.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
session_file: Path to session storage JSON file
|
|
54
|
+
(default: .moai/memory/agent-sessions.json)
|
|
55
|
+
transcript_dir: Directory for agent transcripts
|
|
56
|
+
(default: .moai/logs/agent-transcripts/)
|
|
57
|
+
"""
|
|
58
|
+
# Default paths
|
|
59
|
+
project_root = Path.cwd()
|
|
60
|
+
self._session_file = session_file or project_root / ".moai" / "memory" / "agent-sessions.json"
|
|
61
|
+
self._transcript_dir = transcript_dir or project_root / ".moai" / "logs" / "agent-transcripts"
|
|
62
|
+
|
|
63
|
+
# Ensure directories exist
|
|
64
|
+
self._session_file.parent.mkdir(parents=True, exist_ok=True)
|
|
65
|
+
self._transcript_dir.mkdir(parents=True, exist_ok=True)
|
|
66
|
+
|
|
67
|
+
# In-memory storage
|
|
68
|
+
self._sessions: Dict[str, str] = {} # agent_name → current agentId
|
|
69
|
+
self._results: Dict[str, Any] = {} # agentId → result data
|
|
70
|
+
self._chains: Dict[str, List[str]] = {} # chain_name → [agentIds]
|
|
71
|
+
self._metadata: Dict[str, Dict[str, Any]] = {} # agentId → metadata
|
|
72
|
+
|
|
73
|
+
# Load existing sessions
|
|
74
|
+
self._load_sessions()
|
|
75
|
+
|
|
76
|
+
def _load_sessions(self) -> None:
|
|
77
|
+
"""Load session data from persistent storage."""
|
|
78
|
+
if self._session_file.exists():
|
|
79
|
+
try:
|
|
80
|
+
with open(self._session_file, "r", encoding="utf-8") as f:
|
|
81
|
+
data = json.load(f)
|
|
82
|
+
self._sessions = data.get("sessions", {})
|
|
83
|
+
self._chains = data.get("chains", {})
|
|
84
|
+
self._metadata = data.get("metadata", {})
|
|
85
|
+
logger.info(f"Loaded {len(self._sessions)} sessions from {self._session_file}")
|
|
86
|
+
except json.JSONDecodeError as e:
|
|
87
|
+
logger.warning(f"Failed to load sessions: {e}")
|
|
88
|
+
self._sessions = {}
|
|
89
|
+
self._chains = {}
|
|
90
|
+
self._metadata = {}
|
|
91
|
+
|
|
92
|
+
def _save_sessions(self) -> None:
|
|
93
|
+
"""Save session data to persistent storage."""
|
|
94
|
+
data = {
|
|
95
|
+
"sessions": self._sessions,
|
|
96
|
+
"chains": self._chains,
|
|
97
|
+
"metadata": self._metadata,
|
|
98
|
+
"last_updated": datetime.now().isoformat(),
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
with open(self._session_file, "w", encoding="utf-8") as f:
|
|
103
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
104
|
+
logger.debug(f"Saved sessions to {self._session_file}")
|
|
105
|
+
except IOError as e:
|
|
106
|
+
logger.error(f"Failed to save sessions: {e}")
|
|
107
|
+
|
|
108
|
+
def register_agent_result(
|
|
109
|
+
self,
|
|
110
|
+
agent_name: str,
|
|
111
|
+
agent_id: str,
|
|
112
|
+
result: Any,
|
|
113
|
+
chain_id: Optional[str] = None,
|
|
114
|
+
) -> None:
|
|
115
|
+
"""
|
|
116
|
+
Register agent execution result in main context.
|
|
117
|
+
|
|
118
|
+
This method implements the official pattern:
|
|
119
|
+
"Results flow through main conversation thread"
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
agent_name: Name of the agent (e.g., "tdd-implementer")
|
|
123
|
+
agent_id: Unique agentId returned from Task() execution
|
|
124
|
+
result: Result data from agent execution
|
|
125
|
+
chain_id: Optional workflow chain identifier (e.g., "SPEC-AUTH-001-implementation")
|
|
126
|
+
"""
|
|
127
|
+
# Store agent ID mapping
|
|
128
|
+
self._sessions[agent_name] = agent_id
|
|
129
|
+
|
|
130
|
+
# Store result data
|
|
131
|
+
self._results[agent_id] = {
|
|
132
|
+
"agent_name": agent_name,
|
|
133
|
+
"result": result,
|
|
134
|
+
"timestamp": datetime.now().isoformat(),
|
|
135
|
+
"chain_id": chain_id,
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
# Track in workflow chain
|
|
139
|
+
if chain_id:
|
|
140
|
+
if chain_id not in self._chains:
|
|
141
|
+
self._chains[chain_id] = []
|
|
142
|
+
self._chains[chain_id].append(agent_id)
|
|
143
|
+
|
|
144
|
+
# Store metadata
|
|
145
|
+
self._metadata[agent_id] = {
|
|
146
|
+
"agent_name": agent_name,
|
|
147
|
+
"created_at": datetime.now().isoformat(),
|
|
148
|
+
"chain_id": chain_id,
|
|
149
|
+
"resume_count": 0,
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Persist to disk
|
|
153
|
+
self._save_sessions()
|
|
154
|
+
|
|
155
|
+
logger.info(f"Registered agent result: {agent_name} (agentId: {agent_id[:8]}..., chain: {chain_id})")
|
|
156
|
+
|
|
157
|
+
def get_resume_id(
|
|
158
|
+
self,
|
|
159
|
+
agent_name: str,
|
|
160
|
+
chain_id: Optional[str] = None,
|
|
161
|
+
) -> Optional[str]:
|
|
162
|
+
"""
|
|
163
|
+
Get agentId to resume if continuing same work.
|
|
164
|
+
|
|
165
|
+
Official pattern:
|
|
166
|
+
- resume parameter preserves full conversation history
|
|
167
|
+
- Same agent can continue work with context
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
agent_name: Name of the agent to resume
|
|
171
|
+
chain_id: Optional workflow chain to resume
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
agentId to resume, or None if should start new session
|
|
175
|
+
"""
|
|
176
|
+
# Check if agent has previous session
|
|
177
|
+
if agent_name not in self._sessions:
|
|
178
|
+
logger.debug(f"No previous session for {agent_name}")
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
agent_id = self._sessions[agent_name]
|
|
182
|
+
|
|
183
|
+
# Validate chain_id if provided
|
|
184
|
+
if chain_id:
|
|
185
|
+
metadata = self._metadata.get(agent_id, {})
|
|
186
|
+
if metadata.get("chain_id") != chain_id:
|
|
187
|
+
logger.debug(f"Chain mismatch: {agent_name} was in {metadata.get('chain_id')}, requested {chain_id}")
|
|
188
|
+
return None
|
|
189
|
+
|
|
190
|
+
logger.info(f"Resume ID for {agent_name}: {agent_id[:8]}...")
|
|
191
|
+
return agent_id
|
|
192
|
+
|
|
193
|
+
def should_resume(
|
|
194
|
+
self,
|
|
195
|
+
agent_name: str,
|
|
196
|
+
current_task: str,
|
|
197
|
+
previous_task: Optional[str] = None,
|
|
198
|
+
) -> bool:
|
|
199
|
+
"""
|
|
200
|
+
Determine if resume or new invocation is appropriate.
|
|
201
|
+
|
|
202
|
+
Decision logic based on official best practices:
|
|
203
|
+
- Resume: Same agent, continuing previous task, context continuity needed
|
|
204
|
+
- New: Different agent, independent task, context switch
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
agent_name: Name of the agent
|
|
208
|
+
current_task: Description of current task
|
|
209
|
+
previous_task: Description of previous task (if any)
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
True if should resume, False if should start new session
|
|
213
|
+
"""
|
|
214
|
+
# No previous session → new
|
|
215
|
+
if agent_name not in self._sessions:
|
|
216
|
+
return False
|
|
217
|
+
|
|
218
|
+
# No previous task information → new
|
|
219
|
+
if not previous_task:
|
|
220
|
+
return False
|
|
221
|
+
|
|
222
|
+
# Check resume count (prevent infinite loops)
|
|
223
|
+
agent_id = self._sessions[agent_name]
|
|
224
|
+
metadata = self._metadata.get(agent_id, {})
|
|
225
|
+
resume_count = metadata.get("resume_count", 0)
|
|
226
|
+
|
|
227
|
+
if resume_count >= 5: # Max resume depth from config
|
|
228
|
+
logger.warning(f"{agent_name} has been resumed {resume_count} times, starting new session")
|
|
229
|
+
return False
|
|
230
|
+
|
|
231
|
+
# Heuristic: Check if tasks are related
|
|
232
|
+
# (This can be enhanced with semantic similarity)
|
|
233
|
+
task_keywords_match = any(
|
|
234
|
+
keyword in current_task.lower() for keyword in previous_task.lower().split() if len(keyword) > 4
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
if task_keywords_match:
|
|
238
|
+
logger.info(f"Tasks appear related, resuming {agent_name}")
|
|
239
|
+
return True
|
|
240
|
+
|
|
241
|
+
logger.info(f"Tasks appear independent, starting new session for {agent_name}")
|
|
242
|
+
return False
|
|
243
|
+
|
|
244
|
+
def increment_resume_count(self, agent_id: str) -> None:
|
|
245
|
+
"""
|
|
246
|
+
Increment resume count for an agent session.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
agent_id: Agent session ID
|
|
250
|
+
"""
|
|
251
|
+
if agent_id in self._metadata:
|
|
252
|
+
self._metadata[agent_id]["resume_count"] += 1
|
|
253
|
+
self._metadata[agent_id]["last_resumed_at"] = datetime.now().isoformat()
|
|
254
|
+
self._save_sessions()
|
|
255
|
+
|
|
256
|
+
def get_agent_result(self, agent_id: str) -> Optional[Any]:
|
|
257
|
+
"""
|
|
258
|
+
Retrieve stored result for an agent execution.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
agent_id: Agent session ID
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Stored result data, or None if not found
|
|
265
|
+
"""
|
|
266
|
+
result_data = self._results.get(agent_id)
|
|
267
|
+
if result_data:
|
|
268
|
+
return result_data["result"]
|
|
269
|
+
return None
|
|
270
|
+
|
|
271
|
+
def get_chain_results(self, chain_id: str) -> List[Dict[str, Any]]:
|
|
272
|
+
"""
|
|
273
|
+
Get all agent results in a workflow chain.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
chain_id: Workflow chain identifier
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
List of result dictionaries in execution order
|
|
280
|
+
"""
|
|
281
|
+
if chain_id not in self._chains:
|
|
282
|
+
return []
|
|
283
|
+
|
|
284
|
+
agent_ids = self._chains[chain_id]
|
|
285
|
+
results = []
|
|
286
|
+
|
|
287
|
+
for agent_id in agent_ids:
|
|
288
|
+
if agent_id in self._results:
|
|
289
|
+
results.append(self._results[agent_id])
|
|
290
|
+
|
|
291
|
+
return results
|
|
292
|
+
|
|
293
|
+
def get_chain_summary(self, chain_id: str) -> Dict[str, Any]:
|
|
294
|
+
"""
|
|
295
|
+
Get summary of a workflow chain.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
chain_id: Workflow chain identifier
|
|
299
|
+
|
|
300
|
+
Returns:
|
|
301
|
+
Summary dictionary with agent names, timestamps, etc.
|
|
302
|
+
"""
|
|
303
|
+
results = self.get_chain_results(chain_id)
|
|
304
|
+
|
|
305
|
+
if not results:
|
|
306
|
+
return {"chain_id": chain_id, "status": "not_found"}
|
|
307
|
+
|
|
308
|
+
return {
|
|
309
|
+
"chain_id": chain_id,
|
|
310
|
+
"agent_count": len(results),
|
|
311
|
+
"agents": [r["agent_name"] for r in results],
|
|
312
|
+
"started_at": results[0]["timestamp"] if results else None,
|
|
313
|
+
"completed_at": results[-1]["timestamp"] if results else None,
|
|
314
|
+
"status": "completed",
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
def clear_agent_session(self, agent_name: str) -> None:
|
|
318
|
+
"""
|
|
319
|
+
Clear session data for a specific agent.
|
|
320
|
+
|
|
321
|
+
Use when you want to force a new session for an agent.
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
agent_name: Name of the agent
|
|
325
|
+
"""
|
|
326
|
+
if agent_name in self._sessions:
|
|
327
|
+
agent_id = self._sessions[agent_name]
|
|
328
|
+
del self._sessions[agent_name]
|
|
329
|
+
|
|
330
|
+
if agent_id in self._results:
|
|
331
|
+
del self._results[agent_id]
|
|
332
|
+
|
|
333
|
+
if agent_id in self._metadata:
|
|
334
|
+
del self._metadata[agent_id]
|
|
335
|
+
|
|
336
|
+
self._save_sessions()
|
|
337
|
+
logger.info(f"Cleared session for {agent_name}")
|
|
338
|
+
|
|
339
|
+
def clear_chain(self, chain_id: str) -> None:
|
|
340
|
+
"""
|
|
341
|
+
Clear all sessions in a workflow chain.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
chain_id: Workflow chain identifier
|
|
345
|
+
"""
|
|
346
|
+
if chain_id in self._chains:
|
|
347
|
+
agent_ids = self._chains[chain_id]
|
|
348
|
+
|
|
349
|
+
for agent_id in agent_ids:
|
|
350
|
+
if agent_id in self._results:
|
|
351
|
+
del self._results[agent_id]
|
|
352
|
+
if agent_id in self._metadata:
|
|
353
|
+
del self._metadata[agent_id]
|
|
354
|
+
|
|
355
|
+
del self._chains[chain_id]
|
|
356
|
+
self._save_sessions()
|
|
357
|
+
logger.info(f"Cleared chain: {chain_id}")
|
|
358
|
+
|
|
359
|
+
def get_all_sessions(self) -> Dict[str, Any]:
|
|
360
|
+
"""
|
|
361
|
+
Get all active sessions.
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
Dictionary with all session data
|
|
365
|
+
"""
|
|
366
|
+
return {
|
|
367
|
+
"sessions": self._sessions,
|
|
368
|
+
"chains": list(self._chains.keys()),
|
|
369
|
+
"total_results": len(self._results),
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
def export_transcript(self, agent_id: str) -> Optional[Path]:
|
|
373
|
+
"""
|
|
374
|
+
Get path to agent conversation transcript.
|
|
375
|
+
|
|
376
|
+
Official pattern:
|
|
377
|
+
- Transcripts stored in agent-{agentId}.jsonl
|
|
378
|
+
- Contains full conversation history
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
agent_id: Agent session ID
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
Path to transcript file, or None if not found
|
|
385
|
+
"""
|
|
386
|
+
transcript_file = self._transcript_dir / f"agent-{agent_id}.jsonl"
|
|
387
|
+
|
|
388
|
+
if transcript_file.exists():
|
|
389
|
+
return transcript_file
|
|
390
|
+
|
|
391
|
+
logger.warning(f"Transcript not found for agentId: {agent_id}")
|
|
392
|
+
return None
|
|
393
|
+
|
|
394
|
+
def create_chain(
|
|
395
|
+
self,
|
|
396
|
+
chain_id: str,
|
|
397
|
+
agent_sequence: List[str],
|
|
398
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
399
|
+
) -> None:
|
|
400
|
+
"""
|
|
401
|
+
Create a new workflow chain.
|
|
402
|
+
|
|
403
|
+
Args:
|
|
404
|
+
chain_id: Unique chain identifier (e.g., "SPEC-AUTH-001-implementation")
|
|
405
|
+
agent_sequence: Expected agent execution order
|
|
406
|
+
metadata: Optional metadata for the chain
|
|
407
|
+
"""
|
|
408
|
+
self._chains[chain_id] = []
|
|
409
|
+
|
|
410
|
+
chain_metadata = {
|
|
411
|
+
"created_at": datetime.now().isoformat(),
|
|
412
|
+
"expected_sequence": agent_sequence,
|
|
413
|
+
"metadata": metadata or {},
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
# Store in a separate chains metadata file
|
|
417
|
+
chains_file = self._session_file.parent / "workflow-chains.json"
|
|
418
|
+
|
|
419
|
+
if chains_file.exists():
|
|
420
|
+
with open(chains_file, "r", encoding="utf-8") as f:
|
|
421
|
+
chains_data = json.load(f)
|
|
422
|
+
else:
|
|
423
|
+
chains_data = {}
|
|
424
|
+
|
|
425
|
+
chains_data[chain_id] = chain_metadata
|
|
426
|
+
|
|
427
|
+
with open(chains_file, "w", encoding="utf-8") as f:
|
|
428
|
+
json.dump(chains_data, f, indent=2, ensure_ascii=False)
|
|
429
|
+
|
|
430
|
+
logger.info(f"Created workflow chain: {chain_id} with {len(agent_sequence)} agents")
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
# Global instance (singleton pattern)
|
|
434
|
+
_session_manager_instance: Optional[SessionManager] = None
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def get_session_manager() -> SessionManager:
|
|
438
|
+
"""
|
|
439
|
+
Get global SessionManager instance (singleton).
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
SessionManager instance
|
|
443
|
+
"""
|
|
444
|
+
global _session_manager_instance
|
|
445
|
+
|
|
446
|
+
if _session_manager_instance is None:
|
|
447
|
+
_session_manager_instance = SessionManager()
|
|
448
|
+
|
|
449
|
+
return _session_manager_instance
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
# Convenience functions for direct use
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def register_agent(
|
|
456
|
+
agent_name: str,
|
|
457
|
+
agent_id: str,
|
|
458
|
+
result: Any,
|
|
459
|
+
chain_id: Optional[str] = None,
|
|
460
|
+
) -> None:
|
|
461
|
+
"""
|
|
462
|
+
Convenience function to register agent result.
|
|
463
|
+
|
|
464
|
+
Args:
|
|
465
|
+
agent_name: Name of the agent
|
|
466
|
+
agent_id: Unique agentId from Task() execution
|
|
467
|
+
result: Result data
|
|
468
|
+
chain_id: Optional workflow chain identifier
|
|
469
|
+
"""
|
|
470
|
+
manager = get_session_manager()
|
|
471
|
+
manager.register_agent_result(agent_name, agent_id, result, chain_id)
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
def get_resume_id(agent_name: str, chain_id: Optional[str] = None) -> Optional[str]:
|
|
475
|
+
"""
|
|
476
|
+
Convenience function to get resume ID.
|
|
477
|
+
|
|
478
|
+
Args:
|
|
479
|
+
agent_name: Name of the agent
|
|
480
|
+
chain_id: Optional workflow chain
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
agentId to resume, or None
|
|
484
|
+
"""
|
|
485
|
+
manager = get_session_manager()
|
|
486
|
+
return manager.get_resume_id(agent_name, chain_id)
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def should_resume(
|
|
490
|
+
agent_name: str,
|
|
491
|
+
current_task: str,
|
|
492
|
+
previous_task: Optional[str] = None,
|
|
493
|
+
) -> bool:
|
|
494
|
+
"""
|
|
495
|
+
Convenience function to check if should resume.
|
|
496
|
+
|
|
497
|
+
Args:
|
|
498
|
+
agent_name: Name of the agent
|
|
499
|
+
current_task: Description of current task
|
|
500
|
+
previous_task: Description of previous task
|
|
501
|
+
|
|
502
|
+
Returns:
|
|
503
|
+
True if should resume
|
|
504
|
+
"""
|
|
505
|
+
manager = get_session_manager()
|
|
506
|
+
return manager.should_resume(agent_name, current_task, previous_task)
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
# Example usage for documentation
|
|
510
|
+
if __name__ == "__main__":
|
|
511
|
+
"""
|
|
512
|
+
Example usage of SessionManager.
|
|
513
|
+
|
|
514
|
+
This demonstrates the official Claude Code sub-agent patterns.
|
|
515
|
+
"""
|
|
516
|
+
|
|
517
|
+
# Initialize manager
|
|
518
|
+
manager = SessionManager()
|
|
519
|
+
|
|
520
|
+
# Example 1: Linear Chain (spec-builder → implementation-planner)
|
|
521
|
+
print("=== Example 1: Linear Chain ===")
|
|
522
|
+
|
|
523
|
+
# Create workflow chain
|
|
524
|
+
manager.create_chain(
|
|
525
|
+
chain_id="SPEC-AUTH-001-planning",
|
|
526
|
+
agent_sequence=["spec-builder", "implementation-planner"],
|
|
527
|
+
metadata={"spec_id": "SPEC-AUTH-001", "feature": "User Authentication"},
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
# Simulate spec-builder execution
|
|
531
|
+
spec_result = {
|
|
532
|
+
"spec_id": "SPEC-AUTH-001",
|
|
533
|
+
"files_created": [".moai/specs/SPEC-AUTH-001/spec.md"],
|
|
534
|
+
"status": "success",
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
manager.register_agent_result(
|
|
538
|
+
agent_name="spec-builder",
|
|
539
|
+
agent_id="spec-abc123",
|
|
540
|
+
result=spec_result,
|
|
541
|
+
chain_id="SPEC-AUTH-001-planning",
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
# Simulate implementation-planner execution
|
|
545
|
+
plan_result = {
|
|
546
|
+
"dependencies": {"fastapi": ">=0.118.3"},
|
|
547
|
+
"status": "success",
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
manager.register_agent_result(
|
|
551
|
+
agent_name="implementation-planner",
|
|
552
|
+
agent_id="plan-def456",
|
|
553
|
+
result=plan_result,
|
|
554
|
+
chain_id="SPEC-AUTH-001-planning",
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
# Get chain summary
|
|
558
|
+
summary = manager.get_chain_summary("SPEC-AUTH-001-planning")
|
|
559
|
+
print(f"Chain summary: {json.dumps(summary, indent=2)}")
|
|
560
|
+
|
|
561
|
+
# Example 2: Resume Pattern (tdd-implementer continues work)
|
|
562
|
+
print("\n=== Example 2: Resume Pattern ===")
|
|
563
|
+
|
|
564
|
+
manager.create_chain(
|
|
565
|
+
chain_id="SPEC-AUTH-001-implementation",
|
|
566
|
+
agent_sequence=["tdd-implementer"],
|
|
567
|
+
)
|
|
568
|
+
|
|
569
|
+
# First execution: Implementation phase 1
|
|
570
|
+
implementation_001_result = {
|
|
571
|
+
"phase": "phase_1",
|
|
572
|
+
"tests_created": ["tests/test_registration.py"],
|
|
573
|
+
"code_created": ["src/auth/registration.py"],
|
|
574
|
+
"status": "success",
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
manager.register_agent_result(
|
|
578
|
+
agent_name="tdd-implementer",
|
|
579
|
+
agent_id="tdd-ghi789",
|
|
580
|
+
result=implementation_001_result,
|
|
581
|
+
chain_id="SPEC-AUTH-001-implementation",
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
# Get resume ID for continuing work
|
|
585
|
+
resume_id = manager.get_resume_id(
|
|
586
|
+
agent_name="tdd-implementer",
|
|
587
|
+
chain_id="SPEC-AUTH-001-implementation",
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
print(f"Resume ID for tdd-implementer: {resume_id}")
|
|
591
|
+
|
|
592
|
+
# Should resume? (continuing user auth flow)
|
|
593
|
+
should_resume_decision = manager.should_resume(
|
|
594
|
+
agent_name="tdd-implementer",
|
|
595
|
+
current_task="Implement user login endpoint",
|
|
596
|
+
previous_task="Implement user registration endpoint",
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
print(f"Should resume? {should_resume_decision}")
|
|
600
|
+
|
|
601
|
+
if should_resume_decision and resume_id:
|
|
602
|
+
print(f"✅ Resume with agentId: {resume_id}")
|
|
603
|
+
manager.increment_resume_count(resume_id)
|
|
604
|
+
else:
|
|
605
|
+
print("❌ Start new session")
|
|
606
|
+
|
|
607
|
+
# Example 3: Parallel Analysis
|
|
608
|
+
print("\n=== Example 3: Parallel Analysis ===")
|
|
609
|
+
|
|
610
|
+
manager.create_chain(
|
|
611
|
+
chain_id="SPEC-AUTH-001-review",
|
|
612
|
+
agent_sequence=["backend-expert", "security-expert", "frontend-expert"],
|
|
613
|
+
metadata={"review_type": "expert_consultation"},
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
# All experts run independently (no resume)
|
|
617
|
+
experts_results = {
|
|
618
|
+
"backend-expert": {
|
|
619
|
+
"recommendations": ["Use JWT for auth"],
|
|
620
|
+
"agent_id": "backend-jkl012",
|
|
621
|
+
},
|
|
622
|
+
"security-expert": {
|
|
623
|
+
"vulnerabilities": ["Rate limiting needed"],
|
|
624
|
+
"agent_id": "security-mno345",
|
|
625
|
+
},
|
|
626
|
+
"frontend-expert": {
|
|
627
|
+
"ui_concerns": ["Token refresh flow"],
|
|
628
|
+
"agent_id": "frontend-pqr678",
|
|
629
|
+
},
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
for expert_name, data in experts_results.items():
|
|
633
|
+
agent_id_value: str = data["agent_id"] # type: ignore[assignment]
|
|
634
|
+
manager.register_agent_result(
|
|
635
|
+
agent_name=expert_name,
|
|
636
|
+
agent_id=agent_id_value,
|
|
637
|
+
result={k: v for k, v in data.items() if k != "agent_id"},
|
|
638
|
+
chain_id="SPEC-AUTH-001-review",
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
# Get all review results
|
|
642
|
+
review_results = manager.get_chain_results("SPEC-AUTH-001-review")
|
|
643
|
+
print(f"Expert reviews: {len(review_results)} experts")
|
|
644
|
+
|
|
645
|
+
for result in review_results:
|
|
646
|
+
print(f" - {result['agent_name']}: {list(result['result'].keys())}")
|
|
647
|
+
|
|
648
|
+
# Get all sessions
|
|
649
|
+
print("\n=== All Sessions ===")
|
|
650
|
+
all_sessions = manager.get_all_sessions()
|
|
651
|
+
print(json.dumps(all_sessions, indent=2))
|