moai-adk 0.25.4__py3-none-any.whl → 0.32.8__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 +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- 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 +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- 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 +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- 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 +4 -12
- 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 +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- 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/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -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 +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -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-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -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-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -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/design-system-tokens.md +405 -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 +491 -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-foundation-claude/SKILL.md +201 -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-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -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 +346 -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-quality/SKILL.md +362 -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-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -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 +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -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-shadcn/SKILL.md +370 -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-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -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 +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -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/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -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 +71 -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-templates/SKILL.md +374 -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-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -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/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/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 +410 -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 +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -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 +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: moai-workflow-jit-docs/advanced-patterns
|
|
3
|
+
description: Advanced JIT documentation patterns, intelligent doc discovery, lazy loading, and content optimization
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Advanced JIT Documentation Patterns (v5.0.0)
|
|
7
|
+
|
|
8
|
+
## Intelligent Document Discovery
|
|
9
|
+
|
|
10
|
+
### 1. Smart Doc Inference Engine
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
interface DocumentPattern {
|
|
14
|
+
name: string;
|
|
15
|
+
filePattern: RegExp;
|
|
16
|
+
contentPattern: RegExp;
|
|
17
|
+
priority: number;
|
|
18
|
+
extractor: (content: string) => string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class IntelligentDocDiscovery {
|
|
22
|
+
private patterns: DocumentPattern[] = [
|
|
23
|
+
{
|
|
24
|
+
name: 'README',
|
|
25
|
+
filePattern: /README\.(md|mdx|txt)$/i,
|
|
26
|
+
contentPattern: /^#\s+/,
|
|
27
|
+
priority: 100,
|
|
28
|
+
extractor: (content) => content.split('\n').slice(0, 20).join('\n')
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'API Documentation',
|
|
32
|
+
filePattern: /\/api\//i,
|
|
33
|
+
contentPattern: /\/\*\*[\s\S]*?\*\/|\/\/\/.*$/m,
|
|
34
|
+
priority: 90,
|
|
35
|
+
extractor: (content) => this.extractJSDocComments(content)
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Getting Started',
|
|
39
|
+
filePattern: /(getting-started|quick-start|introduction)\.(md|mdx)/i,
|
|
40
|
+
contentPattern: /##\s+(Getting Started|Quick Start|Introduction)/i,
|
|
41
|
+
priority: 80,
|
|
42
|
+
extractor: (content) => content.substring(0, 2000)
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Configuration',
|
|
46
|
+
filePattern: /(config|configure|settings)\.(md|mdx|json|yaml|yml)/i,
|
|
47
|
+
contentPattern: /^#+\s+(Configuration|Settings|Config)/im,
|
|
48
|
+
priority: 70,
|
|
49
|
+
extractor: (content) => this.extractConfiguration(content)
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'Examples',
|
|
53
|
+
filePattern: /(examples?|samples?)\/(.*)\.(js|ts|jsx|tsx|py)/i,
|
|
54
|
+
contentPattern: /\/\*\*|\/\/|'''|"""/,
|
|
55
|
+
priority: 60,
|
|
56
|
+
extractor: (content) => content.substring(0, 1000)
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
async discoverDocs(projectRoot: string): Promise<DiscoveredDoc[]> {
|
|
61
|
+
const docs: DiscoveredDoc[] = [];
|
|
62
|
+
|
|
63
|
+
// Scan entire project
|
|
64
|
+
const allFiles = await this.scanProject(projectRoot);
|
|
65
|
+
|
|
66
|
+
for (const file of allFiles) {
|
|
67
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
68
|
+
|
|
69
|
+
// Try to match against patterns
|
|
70
|
+
for (const pattern of this.patterns) {
|
|
71
|
+
if (pattern.filePattern.test(file) && pattern.contentPattern.test(content)) {
|
|
72
|
+
docs.push({
|
|
73
|
+
type: pattern.name,
|
|
74
|
+
path: file,
|
|
75
|
+
content: pattern.extractor(content),
|
|
76
|
+
priority: pattern.priority,
|
|
77
|
+
relevance: this.calculateRelevance(file, content)
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
break; // Move to next file
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Sort by priority and relevance
|
|
86
|
+
return docs.sort((a, b) => {
|
|
87
|
+
const priorityDiff = b.priority - a.priority;
|
|
88
|
+
return priorityDiff !== 0 ? priorityDiff : b.relevance - a.relevance;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private calculateRelevance(filePath: string, content: string): number {
|
|
93
|
+
let score = 0;
|
|
94
|
+
|
|
95
|
+
// Filename relevance
|
|
96
|
+
const filename = path.basename(filePath);
|
|
97
|
+
if (filename.includes('readme')) score += 30;
|
|
98
|
+
if (filename.includes('guide')) score += 20;
|
|
99
|
+
if (filename.includes('tutorial')) score += 15;
|
|
100
|
+
|
|
101
|
+
// Content metrics
|
|
102
|
+
const lines = content.split('\n').length;
|
|
103
|
+
if (lines > 100) score += 10; // Substantial content
|
|
104
|
+
if (lines < 5) score -= 10; // Too brief
|
|
105
|
+
|
|
106
|
+
// Freshness (modified recently)
|
|
107
|
+
const stats = fs.statSync(filePath);
|
|
108
|
+
const daysSinceModified = (Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60 * 24);
|
|
109
|
+
if (daysSinceModified < 7) score += 15;
|
|
110
|
+
if (daysSinceModified < 30) score += 10;
|
|
111
|
+
|
|
112
|
+
return Math.max(0, score);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private extractJSDocComments(content: string): string {
|
|
116
|
+
const comments = content.match(/\/\*\*[\s\S]*?\*\//g) || [];
|
|
117
|
+
return comments.slice(0, 10).join('\n\n');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private extractConfiguration(content: string): string {
|
|
121
|
+
// Extract key config sections
|
|
122
|
+
const lines = content.split('\n');
|
|
123
|
+
const sections: string[] = [];
|
|
124
|
+
|
|
125
|
+
let inConfig = false;
|
|
126
|
+
let currentSection = '';
|
|
127
|
+
|
|
128
|
+
for (const line of lines) {
|
|
129
|
+
if (line.match(/^#+\s+(Configuration|Settings|Config)/i)) {
|
|
130
|
+
inConfig = true;
|
|
131
|
+
} else if (inConfig && line.match(/^#+\s+(?!Configuration|Settings|Config)/)) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (inConfig) {
|
|
136
|
+
currentSection += line + '\n';
|
|
137
|
+
if (currentSection.split('\n').length > 50) {
|
|
138
|
+
sections.push(currentSection);
|
|
139
|
+
currentSection = '';
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return sections.join('\n\n');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Lazy Loading Strategies
|
|
150
|
+
|
|
151
|
+
### 1. On-Demand Documentation Loading
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
class LazyDocumentationLoader {
|
|
155
|
+
private docCache: Map<string, CachedDoc> = new Map();
|
|
156
|
+
private loadingQueue: Set<string> = new Set();
|
|
157
|
+
|
|
158
|
+
async loadDocLazy(docId: string, priority: 'high' | 'normal' | 'low' = 'normal'): Promise<DocumentContent> {
|
|
159
|
+
// Check cache first
|
|
160
|
+
const cached = this.docCache.get(docId);
|
|
161
|
+
if (cached && !this.isExpired(cached)) {
|
|
162
|
+
return cached.content;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Prevent duplicate loads
|
|
166
|
+
if (this.loadingQueue.has(docId)) {
|
|
167
|
+
// Wait for ongoing load
|
|
168
|
+
return this.waitForLoad(docId);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
this.loadingQueue.add(docId);
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
const content = await this.loadDocumentContent(docId);
|
|
175
|
+
|
|
176
|
+
// Cache with priority-based TTL
|
|
177
|
+
const ttl = priority === 'high' ? 3600000 : priority === 'normal' ? 1800000 : 600000;
|
|
178
|
+
|
|
179
|
+
this.docCache.set(docId, {
|
|
180
|
+
content,
|
|
181
|
+
timestamp: Date.now(),
|
|
182
|
+
ttl,
|
|
183
|
+
size: Buffer.byteLength(JSON.stringify(content))
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
return content;
|
|
187
|
+
} finally {
|
|
188
|
+
this.loadingQueue.delete(docId);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Batch lazy loading for multiple docs
|
|
193
|
+
async loadDocsBatch(docIds: string[]): Promise<Map<string, DocumentContent>> {
|
|
194
|
+
const results = new Map<string, DocumentContent>();
|
|
195
|
+
|
|
196
|
+
// Load high-priority items first
|
|
197
|
+
const highPriority = docIds.slice(0, 3);
|
|
198
|
+
const restPriority = docIds.slice(3);
|
|
199
|
+
|
|
200
|
+
// Load top 3 in parallel
|
|
201
|
+
const topResults = await Promise.all(
|
|
202
|
+
highPriority.map(id => this.loadDocLazy(id, 'high'))
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
topResults.forEach((content, i) => {
|
|
206
|
+
results.set(highPriority[i], content);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Queue rest for background loading
|
|
210
|
+
for (const docId of restPriority) {
|
|
211
|
+
this.loadDocLazy(docId, 'low').then(content => {
|
|
212
|
+
results.set(docId, content);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
private async loadDocumentContent(docId: string): Promise<DocumentContent> {
|
|
220
|
+
// Load from disk/database
|
|
221
|
+
const metadata = await this.getDocMetadata(docId);
|
|
222
|
+
const content = await this.readDocument(metadata.path);
|
|
223
|
+
|
|
224
|
+
return {
|
|
225
|
+
id: docId,
|
|
226
|
+
title: metadata.title,
|
|
227
|
+
content,
|
|
228
|
+
metadata: metadata
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
private isExpired(cached: CachedDoc): boolean {
|
|
233
|
+
return Date.now() - cached.timestamp > cached.ttl;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 2. Progressive Enhancement
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
class ProgressiveDocumentEnhancer {
|
|
242
|
+
async enhanceDocumentProgressive(docId: string): Promise<EnhancedDocument> {
|
|
243
|
+
// Step 1: Load and parse immediately
|
|
244
|
+
const basic = await this.loadBasicDocument(docId);
|
|
245
|
+
|
|
246
|
+
// Step 2: Load metadata asynchronously
|
|
247
|
+
const withMetadata = await this.addMetadata(basic);
|
|
248
|
+
|
|
249
|
+
// Step 3: Process code examples asynchronously
|
|
250
|
+
const withExamples = await this.processCodeExamples(withMetadata);
|
|
251
|
+
|
|
252
|
+
// Step 4: Generate search index asynchronously
|
|
253
|
+
const withSearch = await this.generateSearchIndex(withExamples);
|
|
254
|
+
|
|
255
|
+
// Step 5: Generate related links asynchronously
|
|
256
|
+
const enhanced = await this.generateRelatedLinks(withSearch);
|
|
257
|
+
|
|
258
|
+
return enhanced;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Return document as it loads (streaming approach)
|
|
262
|
+
async* streamDocumentEnhancement(docId: string) {
|
|
263
|
+
// Step 1: Basic content
|
|
264
|
+
const basic = await this.loadBasicDocument(docId);
|
|
265
|
+
yield { stage: 'basic', document: basic };
|
|
266
|
+
|
|
267
|
+
// Step 2: Metadata
|
|
268
|
+
const withMetadata = await this.addMetadata(basic);
|
|
269
|
+
yield { stage: 'metadata', document: withMetadata };
|
|
270
|
+
|
|
271
|
+
// Step 3: Examples
|
|
272
|
+
const withExamples = await this.processCodeExamples(withMetadata);
|
|
273
|
+
yield { stage: 'examples', document: withExamples };
|
|
274
|
+
|
|
275
|
+
// Step 4: Search
|
|
276
|
+
const withSearch = await this.generateSearchIndex(withExamples);
|
|
277
|
+
yield { stage: 'search', document: withSearch };
|
|
278
|
+
|
|
279
|
+
// Step 5: Related
|
|
280
|
+
const enhanced = await this.generateRelatedLinks(withSearch);
|
|
281
|
+
yield { stage: 'complete', document: enhanced };
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// React hook for progressive loading
|
|
286
|
+
export function useProgressiveDoc(docId: string) {
|
|
287
|
+
const [document, setDocument] = useState<DocumentContent>();
|
|
288
|
+
const [stage, setStage] = useState<'loading' | 'basic' | 'enhanced' | 'complete'>('loading');
|
|
289
|
+
|
|
290
|
+
useEffect(() => {
|
|
291
|
+
const enhancer = new ProgressiveDocumentEnhancer();
|
|
292
|
+
const generator = enhancer.streamDocumentEnhancement(docId);
|
|
293
|
+
|
|
294
|
+
(async () => {
|
|
295
|
+
for await (const { stage, document } of generator) {
|
|
296
|
+
setDocument(document);
|
|
297
|
+
setStage(stage as any);
|
|
298
|
+
}
|
|
299
|
+
})();
|
|
300
|
+
}, [docId]);
|
|
301
|
+
|
|
302
|
+
return { document, stage };
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Intelligent Content Recommendation
|
|
307
|
+
|
|
308
|
+
### 1. Related Documentation Discovery
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
class RelatedDocumentFinder {
|
|
312
|
+
async findRelated(currentDocId: string, limit: number = 5): Promise<RelatedDoc[]> {
|
|
313
|
+
const current = await this.getDocument(currentDocId);
|
|
314
|
+
const allDocs = await this.getAllDocuments();
|
|
315
|
+
|
|
316
|
+
// Extract features from current doc
|
|
317
|
+
const features = this.extractFeatures(current);
|
|
318
|
+
|
|
319
|
+
// Score all other docs
|
|
320
|
+
const scored = allDocs
|
|
321
|
+
.filter(doc => doc.id !== currentDocId)
|
|
322
|
+
.map(doc => ({
|
|
323
|
+
doc,
|
|
324
|
+
score: this.calculateSimilarity(features, this.extractFeatures(doc))
|
|
325
|
+
}));
|
|
326
|
+
|
|
327
|
+
// Return top N
|
|
328
|
+
return scored
|
|
329
|
+
.sort((a, b) => b.score - a.score)
|
|
330
|
+
.slice(0, limit)
|
|
331
|
+
.map(s => ({
|
|
332
|
+
...s.doc,
|
|
333
|
+
relevance: s.score
|
|
334
|
+
}));
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
private extractFeatures(doc: DocumentContent): DocumentFeatures {
|
|
338
|
+
return {
|
|
339
|
+
keywords: this.extractKeywords(doc.content),
|
|
340
|
+
tags: doc.metadata?.tags || [],
|
|
341
|
+
section: doc.metadata?.section,
|
|
342
|
+
length: doc.content.length,
|
|
343
|
+
codeExamples: (doc.content.match(/```/g) || []).length / 2
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
private calculateSimilarity(features1: DocumentFeatures, features2: DocumentFeatures): number {
|
|
348
|
+
let score = 0;
|
|
349
|
+
|
|
350
|
+
// Keyword overlap (40%)
|
|
351
|
+
const keywordIntersection = features1.keywords.filter(k =>
|
|
352
|
+
features2.keywords.includes(k)
|
|
353
|
+
).length;
|
|
354
|
+
score += (keywordIntersection / Math.max(1, features1.keywords.length)) * 0.4;
|
|
355
|
+
|
|
356
|
+
// Tag overlap (30%)
|
|
357
|
+
const tagIntersection = features1.tags.filter(t =>
|
|
358
|
+
features2.tags.includes(t)
|
|
359
|
+
).length;
|
|
360
|
+
score += (tagIntersection / Math.max(1, features1.tags.length)) * 0.3;
|
|
361
|
+
|
|
362
|
+
// Same section (20%)
|
|
363
|
+
if (features1.section === features2.section) {
|
|
364
|
+
score += 0.2;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Similar complexity (10%)
|
|
368
|
+
const lengthRatio = Math.min(features1.length, features2.length) /
|
|
369
|
+
Math.max(features1.length, features2.length);
|
|
370
|
+
score += (lengthRatio > 0.8 ? 0.1 : 0);
|
|
371
|
+
|
|
372
|
+
return score;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
Version: 5.0.0 | Last Updated: 2025-11-22 | Enterprise Ready:
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: moai-workflow-jit-docs/optimization
|
|
3
|
+
description: Performance optimization for JIT documentation, indexing, caching, and memory management
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# JIT Documentation Optimization (v5.0.0)
|
|
7
|
+
|
|
8
|
+
## Memory-Efficient Caching
|
|
9
|
+
|
|
10
|
+
### 1. LRU Cache with Size Limits
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
interface CacheEntry<T> {
|
|
14
|
+
value: T;
|
|
15
|
+
size: number;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
accessCount: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class LRUDocumentCache<T> {
|
|
21
|
+
private cache: Map<string, CacheEntry<T>> = new Map();
|
|
22
|
+
private maxSize: number; // bytes
|
|
23
|
+
private currentSize: number = 0;
|
|
24
|
+
|
|
25
|
+
constructor(maxSizeInMB: number = 100) {
|
|
26
|
+
this.maxSize = maxSizeInMB * 1024 * 1024;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
set(key: string, value: T, sizeEstimate: number) {
|
|
30
|
+
// Remove existing entry if present
|
|
31
|
+
if (this.cache.has(key)) {
|
|
32
|
+
const existing = this.cache.get(key)!;
|
|
33
|
+
this.currentSize -= existing.size;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Evict LRU items if necessary
|
|
37
|
+
while (this.currentSize + sizeEstimate > this.maxSize && this.cache.size > 0) {
|
|
38
|
+
this.evictLRU();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Add new entry
|
|
42
|
+
this.cache.set(key, {
|
|
43
|
+
value,
|
|
44
|
+
size: sizeEstimate,
|
|
45
|
+
timestamp: Date.now(),
|
|
46
|
+
accessCount: 0
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
this.currentSize += sizeEstimate;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
get(key: string): T | undefined {
|
|
53
|
+
const entry = this.cache.get(key);
|
|
54
|
+
if (!entry) return undefined;
|
|
55
|
+
|
|
56
|
+
// Update access tracking
|
|
57
|
+
entry.accessCount++;
|
|
58
|
+
entry.timestamp = Date.now();
|
|
59
|
+
|
|
60
|
+
return entry.value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private evictLRU() {
|
|
64
|
+
// Find least recently used item
|
|
65
|
+
let lruKey: string | null = null;
|
|
66
|
+
let lruScore = Infinity;
|
|
67
|
+
|
|
68
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
69
|
+
const score = entry.timestamp + (entry.accessCount * 1000);
|
|
70
|
+
if (score < lruScore) {
|
|
71
|
+
lruScore = score;
|
|
72
|
+
lruKey = key;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (lruKey) {
|
|
77
|
+
const removed = this.cache.get(lruKey)!;
|
|
78
|
+
this.currentSize -= removed.size;
|
|
79
|
+
this.cache.delete(lruKey);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getStats() {
|
|
84
|
+
return {
|
|
85
|
+
items: this.cache.size,
|
|
86
|
+
usedBytes: this.currentSize,
|
|
87
|
+
usedMB: (this.currentSize / 1024 / 1024).toFixed(2),
|
|
88
|
+
maxMB: (this.maxSize / 1024 / 1024).toFixed(2),
|
|
89
|
+
hitRate: this.calculateHitRate()
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Index Optimization
|
|
96
|
+
|
|
97
|
+
### 1. Incremental Indexing
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
class IncrementalDocumentIndex {
|
|
101
|
+
private index: Map<string, Set<string>> = new Map(); // word -> docIds
|
|
102
|
+
private docHashes: Map<string, string> = new Map(); // docId -> contentHash
|
|
103
|
+
|
|
104
|
+
async indexDocuments(docs: DocumentContent[]): Promise<void> {
|
|
105
|
+
for (const doc of docs) {
|
|
106
|
+
const hash = this.calculateHash(doc.content);
|
|
107
|
+
const previousHash = this.docHashes.get(doc.id);
|
|
108
|
+
|
|
109
|
+
// Only reindex if content changed
|
|
110
|
+
if (previousHash !== hash) {
|
|
111
|
+
await this.indexDocument(doc);
|
|
112
|
+
this.docHashes.set(doc.id, hash);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private async indexDocument(doc: DocumentContent) {
|
|
118
|
+
// Extract and tokenize content
|
|
119
|
+
const tokens = this.tokenize(doc.content);
|
|
120
|
+
|
|
121
|
+
for (const token of new Set(tokens)) {
|
|
122
|
+
if (!this.index.has(token)) {
|
|
123
|
+
this.index.set(token, new Set());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
this.index.get(token)!.add(doc.id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async search(query: string): Promise<string[]> {
|
|
131
|
+
const tokens = this.tokenize(query);
|
|
132
|
+
|
|
133
|
+
// Find intersection of document sets
|
|
134
|
+
let results = this.index.get(tokens[0]) || new Set<string>();
|
|
135
|
+
|
|
136
|
+
for (let i = 1; i < tokens.length; i++) {
|
|
137
|
+
const tokenDocs = this.index.get(tokens[i]) || new Set();
|
|
138
|
+
results = new Set([...results].filter(id => tokenDocs.has(id)));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return Array.from(results);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private tokenize(text: string): string[] {
|
|
145
|
+
return text
|
|
146
|
+
.toLowerCase()
|
|
147
|
+
.match(/\b\w+\b/g) || [];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private calculateHash(content: string): string {
|
|
151
|
+
return require('crypto')
|
|
152
|
+
.createHash('sha256')
|
|
153
|
+
.update(content)
|
|
154
|
+
.digest('hex');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Compression and Storage
|
|
160
|
+
|
|
161
|
+
### 1. Content Compression
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
import zlib from 'zlib';
|
|
165
|
+
import brotli from 'brotli';
|
|
166
|
+
|
|
167
|
+
class CompressedDocumentStorage {
|
|
168
|
+
async compressDocument(doc: DocumentContent): Promise<CompressedDoc> {
|
|
169
|
+
const json = JSON.stringify(doc);
|
|
170
|
+
|
|
171
|
+
// Compress with brotli (better compression)
|
|
172
|
+
const compressed = await this.brotliCompress(json);
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
id: doc.id,
|
|
176
|
+
compressed: compressed.toString('base64'),
|
|
177
|
+
originalSize: Buffer.byteLength(json),
|
|
178
|
+
compressedSize: compressed.length,
|
|
179
|
+
compressionRatio: (compressed.length / Buffer.byteLength(json) * 100).toFixed(1) + '%'
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
private async brotliCompress(data: string): Promise<Buffer> {
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
brotli.compress(Buffer.from(data), (err, output) => {
|
|
186
|
+
if (err) reject(err);
|
|
187
|
+
else resolve(output);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async decompressDocument(compressed: CompressedDoc): Promise<DocumentContent> {
|
|
193
|
+
const buffer = Buffer.from(compressed.compressed, 'base64');
|
|
194
|
+
|
|
195
|
+
return new Promise((resolve, reject) => {
|
|
196
|
+
brotli.decompress(buffer, (err, output) => {
|
|
197
|
+
if (err) reject(err);
|
|
198
|
+
else resolve(JSON.parse(output.toString()));
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Performance Monitoring
|
|
206
|
+
|
|
207
|
+
### 1. Load Time Metrics
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
class DocumentLoadMetrics {
|
|
211
|
+
async trackLoadTime(docId: string, stage: 'fetch' | 'parse' | 'enhance' | 'render') {
|
|
212
|
+
const startTime = performance.now();
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
const result = await this.loadDocument(docId);
|
|
216
|
+
|
|
217
|
+
const duration = performance.now() - startTime;
|
|
218
|
+
|
|
219
|
+
// Log metrics
|
|
220
|
+
logger.info('Document load', {
|
|
221
|
+
doc_id: docId,
|
|
222
|
+
stage,
|
|
223
|
+
duration_ms: duration,
|
|
224
|
+
cache_hit: this.wasCacheHit,
|
|
225
|
+
timestamp: new Date()
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Alert if slow
|
|
229
|
+
if (duration > 1000) {
|
|
230
|
+
metrics.increment('doc.load.slow', { stage });
|
|
231
|
+
logger.warn('Slow document load', { docId, stage, duration });
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return result;
|
|
235
|
+
} catch (error) {
|
|
236
|
+
metrics.increment('doc.load.error', { stage });
|
|
237
|
+
logger.error('Document load failed', { docId, stage, error });
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Performance budgets
|
|
243
|
+
validatePerformanceBudget(stage: string, duration: number): boolean {
|
|
244
|
+
const budgets = {
|
|
245
|
+
'fetch': 500, // 500ms
|
|
246
|
+
'parse': 200, // 200ms
|
|
247
|
+
'enhance': 1000, // 1s
|
|
248
|
+
'render': 300 // 300ms
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
const budget = budgets[stage as keyof typeof budgets];
|
|
252
|
+
return duration <= budget;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 2. Memory Usage Monitoring
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
class MemoryMonitor {
|
|
261
|
+
trackMemoryUsage() {
|
|
262
|
+
const memUsage = process.memoryUsage();
|
|
263
|
+
|
|
264
|
+
metrics.gauge('memory.heapUsed', memUsage.heapUsed / 1024 / 1024); // MB
|
|
265
|
+
metrics.gauge('memory.heapTotal', memUsage.heapTotal / 1024 / 1024);
|
|
266
|
+
metrics.gauge('memory.external', memUsage.external / 1024 / 1024);
|
|
267
|
+
|
|
268
|
+
// Alert if heap usage > 80%
|
|
269
|
+
const heapUsagePercent = (memUsage.heapUsed / memUsage.heapTotal) * 100;
|
|
270
|
+
if (heapUsagePercent > 80) {
|
|
271
|
+
logger.warn('High memory usage', {
|
|
272
|
+
heapUsagePercent: heapUsagePercent.toFixed(1)
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// Trigger garbage collection
|
|
276
|
+
if (global.gc) {
|
|
277
|
+
global.gc();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
Version: 5.0.0 | Last Updated: 2025-11-22 | Enterprise Ready:
|