claude-mpm 4.20.3__py3-none-any.whl → 4.25.10__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 claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +23 -6
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/api_qa.json +5 -2
- claude_mpm/agents/templates/circuit_breakers.md +108 -2
- claude_mpm/agents/templates/documentation.json +33 -6
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/php-engineer.json +10 -4
- claude_mpm/agents/templates/pm_red_flags.md +89 -19
- claude_mpm/agents/templates/project_organizer.json +7 -3
- claude_mpm/agents/templates/qa.json +2 -1
- claude_mpm/agents/templates/react_engineer.json +1 -0
- claude_mpm/agents/templates/research.json +82 -12
- claude_mpm/agents/templates/security.json +4 -4
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +10 -6
- claude_mpm/agents/templates/version_control.json +4 -2
- claude_mpm/agents/templates/web_qa.json +2 -1
- claude_mpm/cli/README.md +253 -0
- claude_mpm/cli/__init__.py +11 -1
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
- claude_mpm/cli/commands/mpm_init/README.md +365 -0
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skills.py +522 -34
- claude_mpm/cli/executor.py +56 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +28 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/startup.py +111 -8
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/cli_module/refactoring_guide.md +253 -0
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-init.md +19 -3
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +14 -1
- claude_mpm/core/config.py +8 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +48 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +39 -0
- claude_mpm/d2/.gitignore +22 -0
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
- claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
- claude_mpm/d2/QUICKSTART.md +186 -0
- claude_mpm/d2/README.md +232 -0
- claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
- claude_mpm/d2/TESTING.md +288 -0
- claude_mpm/d2/index.html +118 -0
- claude_mpm/d2/package.json +19 -0
- claude_mpm/d2/src/App.svelte +110 -0
- claude_mpm/d2/src/components/Header.svelte +153 -0
- claude_mpm/d2/src/components/MainContent.svelte +74 -0
- claude_mpm/d2/src/components/Sidebar.svelte +85 -0
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
- claude_mpm/d2/src/lib/socketio.js +144 -0
- claude_mpm/d2/src/main.js +7 -0
- claude_mpm/d2/src/stores/events.js +114 -0
- claude_mpm/d2/src/stores/socket.js +108 -0
- claude_mpm/d2/src/stores/theme.js +65 -0
- claude_mpm/d2/svelte.config.js +12 -0
- claude_mpm/d2/vite.config.js +15 -0
- claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/BUILD_NUMBER +1 -0
- claude_mpm/dashboard/README.md +121 -0
- claude_mpm/dashboard/VERSION +1 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
- claude_mpm/dashboard/react/entries/events.tsx +165 -0
- claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
- claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
- claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
- claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
- claude_mpm/dashboard/static/built/connection-manager.js +76 -76
- claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
- claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/built/react/events.js.map +1 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/built/shared/logger.js +16 -16
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/index.html +22 -22
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/js/shared/logger.js +16 -16
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/static/navigation-test-results.md +118 -0
- claude_mpm/dashboard/static/production/main.html +21 -21
- claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/hooks/README.md +143 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/templates/README.md +180 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/templates/settings.json.example +147 -0
- claude_mpm/schemas/agent_schema.json +596 -0
- claude_mpm/schemas/frontmatter_schema.json +165 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
- claude_mpm/services/agents/local_template_manager.py +3 -1
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +36 -16
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/README.md +244 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/README.md +303 -0
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/framework_claude_md_generator/README.md +119 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/local_ops/__init__.py +2 -0
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/README.md +185 -0
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
- claude_mpm/services/static/.gitkeep +2 -0
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +3 -3
- claude_mpm/skills/agent_skills_injector.py +42 -49
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
- claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/skills_registry.py +44 -48
- claude_mpm/skills/skills_service.py +117 -108
- claude_mpm/templates/questions/EXAMPLES.md +501 -0
- claude_mpm/templates/questions/__init__.py +43 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +314 -0
- claude_mpm/templates/questions/project_init.py +388 -0
- claude_mpm/templates/questions/ticket_mgmt.py +397 -0
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/README.md +64 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +3 -3
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/cli/commands/mpm_init.py +0 -2093
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# Environment Validation Workflows
|
|
2
|
+
|
|
3
|
+
> **Part of**: [env-manager](../SKILL.md)
|
|
4
|
+
> **Category**: infrastructure
|
|
5
|
+
> **Reading Level**: Intermediate
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Complete validation workflows for environment variables: structure checks, completeness verification, naming conventions, and framework-specific validation patterns.
|
|
10
|
+
|
|
11
|
+
## Validation Hierarchy
|
|
12
|
+
|
|
13
|
+
### Level 1: Structure Validation (Basic)
|
|
14
|
+
Validates file format and syntax.
|
|
15
|
+
|
|
16
|
+
### Level 2: Semantic Validation (Intermediate)
|
|
17
|
+
Validates naming, completeness, framework conventions.
|
|
18
|
+
|
|
19
|
+
### Level 3: Integration Validation (Advanced)
|
|
20
|
+
Validates across environments, platforms, and services.
|
|
21
|
+
|
|
22
|
+
## Structure Validation
|
|
23
|
+
|
|
24
|
+
### Check 1: Valid Key-Value Format
|
|
25
|
+
|
|
26
|
+
**What to Check:**
|
|
27
|
+
```bash
|
|
28
|
+
# Valid formats:
|
|
29
|
+
KEY=value
|
|
30
|
+
KEY="value with spaces"
|
|
31
|
+
KEY='single quoted'
|
|
32
|
+
KEY=
|
|
33
|
+
|
|
34
|
+
# Invalid formats:
|
|
35
|
+
key=value # lowercase
|
|
36
|
+
KEY = value # spaces around =
|
|
37
|
+
KEY=value # comment # inline comments (parser-dependent)
|
|
38
|
+
=value # missing key
|
|
39
|
+
KEY # missing =
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Validation Script:**
|
|
43
|
+
```python
|
|
44
|
+
import re
|
|
45
|
+
from pathlib import Path
|
|
46
|
+
|
|
47
|
+
def validate_structure(env_file: Path) -> list[str]:
|
|
48
|
+
"""Validate .env file structure."""
|
|
49
|
+
errors = []
|
|
50
|
+
valid_line_pattern = re.compile(r'^[A-Z_][A-Z0-9_]*=.*$')
|
|
51
|
+
|
|
52
|
+
with open(env_file) as f:
|
|
53
|
+
for line_num, line in enumerate(f, 1):
|
|
54
|
+
line = line.strip()
|
|
55
|
+
|
|
56
|
+
# Skip empty lines and comments
|
|
57
|
+
if not line or line.startswith('#'):
|
|
58
|
+
continue
|
|
59
|
+
|
|
60
|
+
# Check format
|
|
61
|
+
if not valid_line_pattern.match(line):
|
|
62
|
+
errors.append(f"Line {line_num}: Invalid format: {line}")
|
|
63
|
+
|
|
64
|
+
# Check for inline comments (warning)
|
|
65
|
+
if '#' in line and not line.startswith('#'):
|
|
66
|
+
# Check if # is inside quotes
|
|
67
|
+
key, value = line.split('=', 1)
|
|
68
|
+
if '#' in value and not (value.startswith('"') or value.startswith("'")):
|
|
69
|
+
errors.append(f"Line {line_num}: WARNING: Possible inline comment: {line}")
|
|
70
|
+
|
|
71
|
+
return errors
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Check 2: No Duplicate Keys
|
|
75
|
+
|
|
76
|
+
**Issue:**
|
|
77
|
+
```bash
|
|
78
|
+
# .env file
|
|
79
|
+
DATABASE_URL=postgres://local
|
|
80
|
+
DATABASE_URL=postgres://production # Duplicate! Which wins?
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Validation:**
|
|
84
|
+
```python
|
|
85
|
+
def check_duplicates(env_file: Path) -> dict[str, list[int]]:
|
|
86
|
+
"""Find duplicate keys and their line numbers."""
|
|
87
|
+
keys = {}
|
|
88
|
+
|
|
89
|
+
with open(env_file) as f:
|
|
90
|
+
for line_num, line in enumerate(f, 1):
|
|
91
|
+
line = line.strip()
|
|
92
|
+
if not line or line.startswith('#'):
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
if '=' in line:
|
|
96
|
+
key = line.split('=', 1)[0]
|
|
97
|
+
if key in keys:
|
|
98
|
+
keys[key].append(line_num)
|
|
99
|
+
else:
|
|
100
|
+
keys[key] = [line_num]
|
|
101
|
+
|
|
102
|
+
# Return only duplicates
|
|
103
|
+
return {k: v for k, v in keys.items() if len(v) > 1}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Check 3: Proper Quoting
|
|
107
|
+
|
|
108
|
+
**Valid Quoting Patterns:**
|
|
109
|
+
```bash
|
|
110
|
+
# No quotes needed
|
|
111
|
+
SIMPLE_VALUE=hello
|
|
112
|
+
|
|
113
|
+
# Quotes required for spaces
|
|
114
|
+
WITH_SPACES="hello world"
|
|
115
|
+
|
|
116
|
+
# Quotes required for special chars
|
|
117
|
+
SPECIAL_CHARS="value with = or # chars"
|
|
118
|
+
|
|
119
|
+
# Escape quotes inside quotes
|
|
120
|
+
ESCAPED="He said \"hello\""
|
|
121
|
+
ESCAPED_SINGLE='It'\''s working'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Validation:**
|
|
125
|
+
```python
|
|
126
|
+
def validate_quoting(env_file: Path) -> list[str]:
|
|
127
|
+
"""Check for proper quoting."""
|
|
128
|
+
warnings = []
|
|
129
|
+
|
|
130
|
+
with open(env_file) as f:
|
|
131
|
+
for line_num, line in enumerate(f, 1):
|
|
132
|
+
line = line.strip()
|
|
133
|
+
if not line or line.startswith('#') or '=' not in line:
|
|
134
|
+
continue
|
|
135
|
+
|
|
136
|
+
key, value = line.split('=', 1)
|
|
137
|
+
|
|
138
|
+
# Check for spaces without quotes
|
|
139
|
+
if ' ' in value and not (value.startswith('"') or value.startswith("'")):
|
|
140
|
+
warnings.append(f"Line {line_num}: Value with spaces should be quoted: {key}")
|
|
141
|
+
|
|
142
|
+
# Check for special chars without quotes
|
|
143
|
+
if any(char in value for char in ['#', '=', '$']) and not value.startswith(('"', "'")):
|
|
144
|
+
warnings.append(f"Line {line_num}: Value with special chars should be quoted: {key}")
|
|
145
|
+
|
|
146
|
+
return warnings
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Completeness Validation
|
|
150
|
+
|
|
151
|
+
### Compare Against .env.example
|
|
152
|
+
|
|
153
|
+
**Workflow:**
|
|
154
|
+
```python
|
|
155
|
+
def compare_env_files(env_file: Path, example_file: Path) -> dict:
|
|
156
|
+
"""Compare .env against .env.example."""
|
|
157
|
+
|
|
158
|
+
def parse_keys(file_path: Path) -> set[str]:
|
|
159
|
+
keys = set()
|
|
160
|
+
with open(file_path) as f:
|
|
161
|
+
for line in f:
|
|
162
|
+
line = line.strip()
|
|
163
|
+
if line and not line.startswith('#') and '=' in line:
|
|
164
|
+
key = line.split('=', 1)[0]
|
|
165
|
+
keys.add(key)
|
|
166
|
+
return keys
|
|
167
|
+
|
|
168
|
+
env_keys = parse_keys(env_file)
|
|
169
|
+
example_keys = parse_keys(example_file)
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
'missing': example_keys - env_keys, # Required but missing
|
|
173
|
+
'extra': env_keys - example_keys, # Present but not documented
|
|
174
|
+
'common': env_keys & example_keys # Properly documented
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Usage:**
|
|
179
|
+
```bash
|
|
180
|
+
# Find missing required variables
|
|
181
|
+
python validate_env.py .env --compare .env.example
|
|
182
|
+
|
|
183
|
+
# Output:
|
|
184
|
+
# Missing variables (in .env.example but not .env):
|
|
185
|
+
# - DATABASE_URL
|
|
186
|
+
# - JWT_SECRET
|
|
187
|
+
# - SMTP_HOST
|
|
188
|
+
#
|
|
189
|
+
# Extra variables (in .env but not documented):
|
|
190
|
+
# - DEBUG_MODE
|
|
191
|
+
# - TEMP_API_KEY
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Check Required Variables by Environment
|
|
195
|
+
|
|
196
|
+
**Pattern:**
|
|
197
|
+
```python
|
|
198
|
+
REQUIRED_VARS = {
|
|
199
|
+
'development': [
|
|
200
|
+
'NODE_ENV',
|
|
201
|
+
'DATABASE_URL',
|
|
202
|
+
'PORT'
|
|
203
|
+
],
|
|
204
|
+
'production': [
|
|
205
|
+
'NODE_ENV',
|
|
206
|
+
'DATABASE_URL',
|
|
207
|
+
'PORT',
|
|
208
|
+
'JWT_SECRET',
|
|
209
|
+
'API_KEY',
|
|
210
|
+
'REDIS_URL'
|
|
211
|
+
],
|
|
212
|
+
'test': [
|
|
213
|
+
'NODE_ENV',
|
|
214
|
+
'TEST_DATABASE_URL'
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
def validate_required_vars(env_file: Path, environment: str) -> list[str]:
|
|
219
|
+
"""Check if all required variables are present."""
|
|
220
|
+
required = REQUIRED_VARS.get(environment, [])
|
|
221
|
+
present = parse_keys(env_file)
|
|
222
|
+
|
|
223
|
+
missing = [var for var in required if var not in present]
|
|
224
|
+
return missing
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Naming Convention Validation
|
|
228
|
+
|
|
229
|
+
### Standard Conventions
|
|
230
|
+
|
|
231
|
+
**Valid Names:**
|
|
232
|
+
```bash
|
|
233
|
+
# Standard format: UPPERCASE_WITH_UNDERSCORES
|
|
234
|
+
DATABASE_URL=value
|
|
235
|
+
API_KEY=value
|
|
236
|
+
MAX_CONNECTIONS=10
|
|
237
|
+
|
|
238
|
+
# Framework-specific prefixes
|
|
239
|
+
NEXT_PUBLIC_API_URL=value # Next.js client-side
|
|
240
|
+
VITE_API_URL=value # Vite client-side
|
|
241
|
+
REACT_APP_API_URL=value # Create React App
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Invalid Names:**
|
|
245
|
+
```bash
|
|
246
|
+
# Bad patterns
|
|
247
|
+
databaseUrl=value # camelCase
|
|
248
|
+
database-url=value # kebab-case
|
|
249
|
+
database.url=value # dots
|
|
250
|
+
123_KEY=value # starts with number
|
|
251
|
+
_PRIVATE_KEY=value # leading underscore (convention warning)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Validation:**
|
|
255
|
+
```python
|
|
256
|
+
import re
|
|
257
|
+
|
|
258
|
+
def validate_naming_conventions(env_file: Path, framework: str = None) -> list[str]:
|
|
259
|
+
"""Validate variable naming conventions."""
|
|
260
|
+
errors = []
|
|
261
|
+
|
|
262
|
+
# Standard pattern
|
|
263
|
+
standard_pattern = re.compile(r'^[A-Z][A-Z0-9_]*$')
|
|
264
|
+
|
|
265
|
+
# Framework-specific patterns
|
|
266
|
+
framework_patterns = {
|
|
267
|
+
'nextjs': re.compile(r'^(NEXT_PUBLIC_|NEXT_)[A-Z0-9_]+$'),
|
|
268
|
+
'vite': re.compile(r'^(VITE_)?[A-Z0-9_]+$'),
|
|
269
|
+
'react': re.compile(r'^(REACT_APP_)?[A-Z0-9_]+$'),
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
with open(env_file) as f:
|
|
273
|
+
for line_num, line in enumerate(f, 1):
|
|
274
|
+
line = line.strip()
|
|
275
|
+
if not line or line.startswith('#') or '=' not in line:
|
|
276
|
+
continue
|
|
277
|
+
|
|
278
|
+
key = line.split('=', 1)[0]
|
|
279
|
+
|
|
280
|
+
# Check standard pattern
|
|
281
|
+
if not standard_pattern.match(key):
|
|
282
|
+
errors.append(f"Line {line_num}: Invalid naming: {key} (use UPPERCASE_WITH_UNDERSCORES)")
|
|
283
|
+
|
|
284
|
+
# Check framework-specific patterns
|
|
285
|
+
if framework and framework in framework_patterns:
|
|
286
|
+
pattern = framework_patterns[framework]
|
|
287
|
+
if not pattern.match(key):
|
|
288
|
+
errors.append(f"Line {line_num}: {framework} convention violation: {key}")
|
|
289
|
+
|
|
290
|
+
return errors
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Framework-Specific Validation
|
|
294
|
+
|
|
295
|
+
### Next.js Validation
|
|
296
|
+
|
|
297
|
+
**Rules:**
|
|
298
|
+
```python
|
|
299
|
+
def validate_nextjs_env(env_file: Path) -> list[str]:
|
|
300
|
+
"""Validate Next.js environment variables."""
|
|
301
|
+
errors = []
|
|
302
|
+
warnings = []
|
|
303
|
+
|
|
304
|
+
with open(env_file) as f:
|
|
305
|
+
for line_num, line in enumerate(f, 1):
|
|
306
|
+
line = line.strip()
|
|
307
|
+
if not line or line.startswith('#') or '=' not in line:
|
|
308
|
+
continue
|
|
309
|
+
|
|
310
|
+
key, value = line.split('=', 1)
|
|
311
|
+
|
|
312
|
+
# Check NEXT_PUBLIC_ prefix rules
|
|
313
|
+
if key.startswith('NEXT_PUBLIC_'):
|
|
314
|
+
# Warn about secrets in public vars
|
|
315
|
+
if any(secret in key.lower() for secret in ['secret', 'key', 'password', 'token']):
|
|
316
|
+
errors.append(f"Line {line_num}: SECURITY: Secret in NEXT_PUBLIC_ var: {key}")
|
|
317
|
+
|
|
318
|
+
# Check for client-side vars without NEXT_PUBLIC_
|
|
319
|
+
if any(client in key.lower() for client in ['api_url', 'api_endpoint']):
|
|
320
|
+
if not key.startswith('NEXT_PUBLIC_'):
|
|
321
|
+
warnings.append(f"Line {line_num}: Client-side var without NEXT_PUBLIC_: {key}")
|
|
322
|
+
|
|
323
|
+
return errors, warnings
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**File Precedence Check:**
|
|
327
|
+
```python
|
|
328
|
+
def check_nextjs_file_precedence(project_dir: Path) -> dict:
|
|
329
|
+
"""Check Next.js .env file precedence."""
|
|
330
|
+
env_files = [
|
|
331
|
+
'.env.local',
|
|
332
|
+
'.env.development.local',
|
|
333
|
+
'.env.production.local',
|
|
334
|
+
'.env.development',
|
|
335
|
+
'.env.production',
|
|
336
|
+
'.env'
|
|
337
|
+
]
|
|
338
|
+
|
|
339
|
+
found_files = []
|
|
340
|
+
for env_file in env_files:
|
|
341
|
+
if (project_dir / env_file).exists():
|
|
342
|
+
found_files.append(env_file)
|
|
343
|
+
|
|
344
|
+
# Parse and check for conflicts
|
|
345
|
+
all_vars = {}
|
|
346
|
+
for env_file in found_files:
|
|
347
|
+
vars_in_file = parse_env_file(project_dir / env_file)
|
|
348
|
+
for key, value in vars_in_file.items():
|
|
349
|
+
if key in all_vars:
|
|
350
|
+
all_vars[key].append((env_file, value))
|
|
351
|
+
else:
|
|
352
|
+
all_vars[key] = [(env_file, value)]
|
|
353
|
+
|
|
354
|
+
# Find variables defined in multiple files
|
|
355
|
+
conflicts = {k: v for k, v in all_vars.items() if len(v) > 1}
|
|
356
|
+
|
|
357
|
+
return {
|
|
358
|
+
'files_found': found_files,
|
|
359
|
+
'conflicts': conflicts,
|
|
360
|
+
'precedence_order': env_files
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Express/Node.js Validation
|
|
365
|
+
|
|
366
|
+
**Standard Variables:**
|
|
367
|
+
```python
|
|
368
|
+
NODE_STANDARD_VARS = {
|
|
369
|
+
'NODE_ENV': ['development', 'production', 'test'],
|
|
370
|
+
'PORT': r'^\d+$', # Must be a number
|
|
371
|
+
'DATABASE_URL': r'^postgres://|mysql://|mongodb://', # Must be valid connection string
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
def validate_nodejs_env(env_file: Path) -> list[str]:
|
|
375
|
+
"""Validate Node.js environment variables."""
|
|
376
|
+
errors = []
|
|
377
|
+
vars_dict = parse_env_file(env_file)
|
|
378
|
+
|
|
379
|
+
for key, value in vars_dict.items():
|
|
380
|
+
if key in NODE_STANDARD_VARS:
|
|
381
|
+
expected = NODE_STANDARD_VARS[key]
|
|
382
|
+
|
|
383
|
+
if isinstance(expected, list):
|
|
384
|
+
# Check enumeration
|
|
385
|
+
if value not in expected:
|
|
386
|
+
errors.append(f"{key}: Invalid value '{value}', expected one of {expected}")
|
|
387
|
+
elif isinstance(expected, str):
|
|
388
|
+
# Check regex pattern
|
|
389
|
+
if not re.match(expected, value):
|
|
390
|
+
errors.append(f"{key}: Value doesn't match expected format")
|
|
391
|
+
|
|
392
|
+
return errors
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Summary
|
|
396
|
+
|
|
397
|
+
**Validation Workflow:**
|
|
398
|
+
1. **Structure**: Valid format, no duplicates, proper quoting
|
|
399
|
+
2. **Completeness**: All required vars present, compare with .env.example
|
|
400
|
+
3. **Naming**: UPPERCASE_WITH_UNDERSCORES, framework prefixes
|
|
401
|
+
4. **Framework**: Next.js NEXT_PUBLIC_, file precedence
|
|
402
|
+
5. **Platform**: Vercel/Railway/Heroku conventions
|
|
403
|
+
|
|
404
|
+
**Key Validations:**
|
|
405
|
+
- ✅ Valid key-value format
|
|
406
|
+
- ✅ No duplicate keys
|
|
407
|
+
- ✅ Proper quoting for spaces/special chars
|
|
408
|
+
- ✅ All required variables present
|
|
409
|
+
- ✅ Consistent naming conventions
|
|
410
|
+
- ✅ Framework-specific rules followed
|
|
411
|
+
- ✅ No secrets in client-side vars (NEXT_PUBLIC_)
|
|
412
|
+
|
|
413
|
+
## Related References
|
|
414
|
+
|
|
415
|
+
- [Security](security.md): Secret scanning and exposure detection
|
|
416
|
+
- [Synchronization](synchronization.md): Platform sync validation
|
|
417
|
+
- [Frameworks](frameworks.md): Complete framework patterns
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
**Lines**: 285 ✓ 150-300 range
|