claude-mpm 3.4.5__tar.gz → 3.4.7__tar.gz

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.
Files changed (216) hide show
  1. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/MANIFEST.in +3 -0
  2. {claude_mpm-3.4.5/src/claude_mpm.egg-info → claude_mpm-3.4.7}/PKG-INFO +1 -1
  3. claude_mpm-3.4.7/VERSION +1 -0
  4. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/claude_runner.py +70 -6
  5. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/simple_runner.py +70 -6
  6. claude_mpm-3.4.7/src/claude_mpm/scripts/socketio_daemon.py +229 -0
  7. {claude_mpm-3.4.5 → claude_mpm-3.4.7/src/claude_mpm.egg-info}/PKG-INFO +1 -1
  8. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm.egg-info/SOURCES.txt +1 -1
  9. claude_mpm-3.4.5/VERSION +0 -1
  10. claude_mpm-3.4.5/ticket +0 -25
  11. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/CLAUDE.md +0 -0
  12. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/LICENSE +0 -0
  13. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/README.md +0 -0
  14. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/claude-mpm +0 -0
  15. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/pyproject.toml +0 -0
  16. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/requirements.txt +0 -0
  17. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/scripts/run_mpm.py +0 -0
  18. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/scripts/ticket +0 -0
  19. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/setup.cfg +0 -0
  20. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/setup.py +0 -0
  21. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/__init__.py +0 -0
  22. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/__main__.py +0 -0
  23. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -0
  24. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/INSTRUCTIONS.md +0 -0
  25. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/__init__.py +0 -0
  26. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/agent_loader.py +0 -0
  27. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/agent_loader_integration.py +0 -0
  28. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/agents_metadata.py +0 -0
  29. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/backups/INSTRUCTIONS.md +0 -0
  30. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/base_agent.json +0 -0
  31. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/base_agent_loader.py +0 -0
  32. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/schema/agent_schema.json +0 -0
  33. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/system_agent_config.py +0 -0
  34. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -0
  35. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/__init__.py +0 -0
  36. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -0
  37. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -0
  38. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -0
  39. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -0
  40. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -0
  41. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -0
  42. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -0
  43. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -0
  44. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/data_engineer.json +0 -0
  45. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/documentation.json +0 -0
  46. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/engineer.json +0 -0
  47. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/ops.json +0 -0
  48. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/pm.json +0 -0
  49. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/qa.json +0 -0
  50. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/research.json +0 -0
  51. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/security.json +0 -0
  52. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/test_integration.json +0 -0
  53. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/agents/templates/version_control.json +0 -0
  54. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/__init__.py +0 -0
  55. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/__init__.py +0 -0
  56. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/agents.py +0 -0
  57. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/info.py +0 -0
  58. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/memory.py +0 -0
  59. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/monitor.py +0 -0
  60. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/run.py +0 -0
  61. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/tickets.py +0 -0
  62. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/commands/ui.py +0 -0
  63. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/parser.py +0 -0
  64. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli/utils.py +0 -0
  65. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli_module/__init__.py +0 -0
  66. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli_module/args.py +0 -0
  67. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli_module/commands.py +0 -0
  68. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/cli_module/migration_example.py +0 -0
  69. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/config/__init__.py +0 -0
  70. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/config/socketio_config.py +0 -0
  71. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/constants.py +0 -0
  72. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/__init__.py +0 -0
  73. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/agent_name_normalizer.py +0 -0
  74. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/agent_registry.py +0 -0
  75. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/agent_session_manager.py +0 -0
  76. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/base_service.py +0 -0
  77. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/config.py +0 -0
  78. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/config_aliases.py +0 -0
  79. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/container.py +0 -0
  80. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/factories.py +0 -0
  81. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/framework_loader.py +0 -0
  82. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/hook_manager.py +0 -0
  83. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/injectable_service.py +0 -0
  84. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/interfaces.py +0 -0
  85. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/logger.py +0 -0
  86. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/minimal_framework_loader.py +0 -0
  87. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/mixins.py +0 -0
  88. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/pm_hook_interceptor.py +0 -0
  89. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/service_registry.py +0 -0
  90. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/session_manager.py +0 -0
  91. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/socketio_pool.py +0 -0
  92. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/core/tool_access_control.py +0 -0
  93. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/dashboard/open_dashboard.py +0 -0
  94. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/deployment_paths.py +0 -0
  95. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/experimental/cli_enhancements.py +0 -0
  96. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/generators/__init__.py +0 -0
  97. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/generators/agent_profile_generator.py +0 -0
  98. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/__init__.py +0 -0
  99. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/base_hook.py +0 -0
  100. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/__init__.py +0 -0
  101. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/logging_hook_example.py +0 -0
  102. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/memory_hooks_example.py +0 -0
  103. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/mpm_command_hook.py +0 -0
  104. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -0
  105. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -0
  106. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/submit_hook_example.py +0 -0
  107. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -0
  108. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -0
  109. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/builtin/workflow_start_hook.py +0 -0
  110. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/claude_hooks/__init__.py +0 -0
  111. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/claude_hooks/hook_handler.py +0 -0
  112. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/claude_hooks/hook_wrapper.sh +0 -0
  113. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/memory_integration_hook.py +0 -0
  114. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/tool_call_interceptor.py +0 -0
  115. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/hooks/validation_hooks.py +0 -0
  116. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/init.py +0 -0
  117. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/models/__init__.py +0 -0
  118. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/models/agent_definition.py +0 -0
  119. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/__init__.py +0 -0
  120. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/direct_orchestrator.py +0 -0
  121. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/factory.py +0 -0
  122. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -0
  123. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/hook_integration_example.py +0 -0
  124. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -0
  125. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/orchestrator.py +0 -0
  126. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -0
  127. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/pty_orchestrator.py +0 -0
  128. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/simple_orchestrator.py +0 -0
  129. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -0
  130. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -0
  131. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -0
  132. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/schemas/workflow_validator.py +0 -0
  133. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/__init__.py +0 -0
  134. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_capabilities_generator.py +0 -0
  135. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_deployment.py +0 -0
  136. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_lifecycle_manager.py +0 -0
  137. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_management_service.py +0 -0
  138. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_memory_manager.py +0 -0
  139. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_modification_tracker.py +0 -0
  140. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_persistence_service.py +0 -0
  141. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_profile_loader.py +0 -0
  142. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_registry.py +0 -0
  143. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/agent_versioning.py +0 -0
  144. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/base_agent_manager.py +0 -0
  145. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/deployed_agent_discovery.py +0 -0
  146. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/exceptions.py +0 -0
  147. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_agent_loader.py +0 -0
  148. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/__init__.py +0 -0
  149. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/content_assembler.py +0 -0
  150. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/content_validator.py +0 -0
  151. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/deployment_manager.py +0 -0
  152. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -0
  153. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -0
  154. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +0 -0
  155. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +0 -0
  156. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +0 -0
  157. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +0 -0
  158. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +0 -0
  159. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/header.py +0 -0
  160. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +0 -0
  161. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +0 -0
  162. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +0 -0
  163. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +0 -0
  164. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +0 -0
  165. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/section_manager.py +0 -0
  166. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator/version_manager.py +0 -0
  167. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/framework_claude_md_generator.py +0 -0
  168. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/health_monitor.py +0 -0
  169. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/hook_service.py +0 -0
  170. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/memory_builder.py +0 -0
  171. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/memory_optimizer.py +0 -0
  172. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/memory_router.py +0 -0
  173. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/__init__.py +0 -0
  174. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/backup_manager.py +0 -0
  175. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/config_manager.py +0 -0
  176. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -0
  177. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/framework_protector.py +0 -0
  178. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/operations.py +0 -0
  179. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/state_manager.py +0 -0
  180. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/template_deployer.py +0 -0
  181. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/validation_manager.py +0 -0
  182. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -0
  183. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/parent_directory_manager/version_manager.py +0 -0
  184. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/project_analyzer.py +0 -0
  185. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/recovery_manager.py +0 -0
  186. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/shared_prompt_cache.py +0 -0
  187. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/socketio_client_manager.py +0 -0
  188. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/socketio_server.py +0 -0
  189. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/standalone_socketio_server.py +0 -0
  190. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/ticket_manager.py +0 -0
  191. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/ticket_manager_di.py +0 -0
  192. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/ticketing_service_original.py +0 -0
  193. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/version_control/__init__.py +0 -0
  194. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/version_control/branch_strategy.py +0 -0
  195. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/version_control/conflict_resolution.py +0 -0
  196. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/version_control/git_operations.py +0 -0
  197. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/services/version_control/semantic_versioning.py +0 -0
  198. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/ticket_wrapper.py +0 -0
  199. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/ui/__init__.py +0 -0
  200. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/ui/rich_terminal_ui.py +0 -0
  201. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/ui/terminal_ui.py +0 -0
  202. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/__init__.py +0 -0
  203. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/config_manager.py +0 -0
  204. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/dependency_manager.py +0 -0
  205. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/error_handler.py +0 -0
  206. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/framework_detection.py +0 -0
  207. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/import_migration_example.py +0 -0
  208. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/imports.py +0 -0
  209. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/path_operations.py +0 -0
  210. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/utils/paths.py +0 -0
  211. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/validation/__init__.py +0 -0
  212. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm/validation/agent_validator.py +0 -0
  213. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm.egg-info/dependency_links.txt +0 -0
  214. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm.egg-info/entry_points.txt +0 -0
  215. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm.egg-info/requires.txt +0 -0
  216. {claude_mpm-3.4.5 → claude_mpm-3.4.7}/src/claude_mpm.egg-info/top_level.txt +0 -0
@@ -28,6 +28,9 @@ recursive-include src/claude_mpm/config *.py
28
28
  # Include hook files (including shell scripts)
29
29
  recursive-include src/claude_mpm/hooks *.py *.sh
30
30
 
31
+ # Include package scripts
32
+ recursive-include src/claude_mpm/scripts *.py
33
+
31
34
  # Exclude test and cache files
32
35
  global-exclude __pycache__
33
36
  global-exclude *.py[co]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 3.4.5
3
+ Version: 3.4.7
4
4
  Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
5
5
  Home-page: https://github.com/bobmatnyc/claude-mpm
6
6
  Author: Claude MPM Team
@@ -0,0 +1 @@
1
+ 3.4.7
@@ -184,12 +184,8 @@ class ClaudeRunner:
184
184
  self.logger.warning(f"Failed to connect to Socket.IO server: {e}")
185
185
  self.websocket_server = None
186
186
 
187
- # Get version
188
- try:
189
- from claude_mpm import __version__
190
- version_str = f"v{__version__}"
191
- except:
192
- version_str = "v0.0.0"
187
+ # Get version with robust fallback mechanisms
188
+ version_str = self._get_version()
193
189
 
194
190
  # Print styled welcome box
195
191
  print("\033[32m╭───────────────────────────────────────────────────╮\033[0m")
@@ -750,6 +746,74 @@ class ClaudeRunner:
750
746
  except Exception as e:
751
747
  self.logger.debug(f"Failed to log session event: {e}")
752
748
 
749
+ def _get_version(self) -> str:
750
+ """
751
+ Robust version determination with multiple fallback mechanisms.
752
+
753
+ WHY: The version display is critical for debugging and user experience.
754
+ This implementation ensures we always show the correct version rather than
755
+ defaulting to v0.0.0, even in edge cases where imports might fail.
756
+
757
+ DESIGN DECISION: We try multiple methods in order of preference:
758
+ 1. Package import (__version__) - fastest for normal installations
759
+ 2. importlib.metadata - standard for installed packages
760
+ 3. VERSION file reading - fallback for development environments
761
+ 4. Only then default to v0.0.0 with detailed error logging
762
+
763
+ Returns version string formatted as "vX.Y.Z"
764
+ """
765
+ version = "0.0.0"
766
+ method_used = "default"
767
+
768
+ # Method 1: Try package import (fastest, most common)
769
+ try:
770
+ from claude_mpm import __version__
771
+ version = __version__
772
+ method_used = "package_import"
773
+ self.logger.debug(f"Version obtained via package import: {version}")
774
+ except ImportError as e:
775
+ self.logger.debug(f"Package import failed: {e}")
776
+ except Exception as e:
777
+ self.logger.warning(f"Unexpected error in package import: {e}")
778
+
779
+ # Method 2: Try importlib.metadata (standard for installed packages)
780
+ if version == "0.0.0":
781
+ try:
782
+ import importlib.metadata
783
+ version = importlib.metadata.version('claude-mpm')
784
+ method_used = "importlib_metadata"
785
+ self.logger.debug(f"Version obtained via importlib.metadata: {version}")
786
+ except importlib.metadata.PackageNotFoundError:
787
+ self.logger.debug("Package not found in importlib.metadata (likely development install)")
788
+ except ImportError:
789
+ self.logger.debug("importlib.metadata not available (Python < 3.8)")
790
+ except Exception as e:
791
+ self.logger.warning(f"Unexpected error in importlib.metadata: {e}")
792
+
793
+ # Method 3: Try reading VERSION file directly (development fallback)
794
+ if version == "0.0.0":
795
+ try:
796
+ # Calculate path relative to this file
797
+ version_file = Path(__file__).parent.parent.parent.parent / "VERSION"
798
+ if version_file.exists():
799
+ version = version_file.read_text().strip()
800
+ method_used = "version_file"
801
+ self.logger.debug(f"Version obtained via VERSION file: {version}")
802
+ else:
803
+ self.logger.debug(f"VERSION file not found at: {version_file}")
804
+ except Exception as e:
805
+ self.logger.warning(f"Failed to read VERSION file: {e}")
806
+
807
+ # Log final result
808
+ if version == "0.0.0":
809
+ self.logger.error(
810
+ "All version detection methods failed. This indicates a packaging or installation issue."
811
+ )
812
+ else:
813
+ self.logger.debug(f"Final version: {version} (method: {method_used})")
814
+
815
+ return f"v{version}"
816
+
753
817
  def _register_memory_hooks(self):
754
818
  """Register memory integration hooks with the hook service.
755
819
 
@@ -184,12 +184,8 @@ class ClaudeRunner:
184
184
  self.logger.warning(f"Failed to connect to Socket.IO server: {e}")
185
185
  self.websocket_server = None
186
186
 
187
- # Get version
188
- try:
189
- from claude_mpm import __version__
190
- version_str = f"v{__version__}"
191
- except:
192
- version_str = "v0.0.0"
187
+ # Get version with robust fallback mechanisms
188
+ version_str = self._get_version()
193
189
 
194
190
  # Print styled welcome box
195
191
  print("\033[32m╭───────────────────────────────────────────────────╮\033[0m")
@@ -750,6 +746,74 @@ class ClaudeRunner:
750
746
  except Exception as e:
751
747
  self.logger.debug(f"Failed to log session event: {e}")
752
748
 
749
+ def _get_version(self) -> str:
750
+ """
751
+ Robust version determination with multiple fallback mechanisms.
752
+
753
+ WHY: The version display is critical for debugging and user experience.
754
+ This implementation ensures we always show the correct version rather than
755
+ defaulting to v0.0.0, even in edge cases where imports might fail.
756
+
757
+ DESIGN DECISION: We try multiple methods in order of preference:
758
+ 1. Package import (__version__) - fastest for normal installations
759
+ 2. importlib.metadata - standard for installed packages
760
+ 3. VERSION file reading - fallback for development environments
761
+ 4. Only then default to v0.0.0 with detailed error logging
762
+
763
+ Returns version string formatted as "vX.Y.Z"
764
+ """
765
+ version = "0.0.0"
766
+ method_used = "default"
767
+
768
+ # Method 1: Try package import (fastest, most common)
769
+ try:
770
+ from claude_mpm import __version__
771
+ version = __version__
772
+ method_used = "package_import"
773
+ self.logger.debug(f"Version obtained via package import: {version}")
774
+ except ImportError as e:
775
+ self.logger.debug(f"Package import failed: {e}")
776
+ except Exception as e:
777
+ self.logger.warning(f"Unexpected error in package import: {e}")
778
+
779
+ # Method 2: Try importlib.metadata (standard for installed packages)
780
+ if version == "0.0.0":
781
+ try:
782
+ import importlib.metadata
783
+ version = importlib.metadata.version('claude-mpm')
784
+ method_used = "importlib_metadata"
785
+ self.logger.debug(f"Version obtained via importlib.metadata: {version}")
786
+ except importlib.metadata.PackageNotFoundError:
787
+ self.logger.debug("Package not found in importlib.metadata (likely development install)")
788
+ except ImportError:
789
+ self.logger.debug("importlib.metadata not available (Python < 3.8)")
790
+ except Exception as e:
791
+ self.logger.warning(f"Unexpected error in importlib.metadata: {e}")
792
+
793
+ # Method 3: Try reading VERSION file directly (development fallback)
794
+ if version == "0.0.0":
795
+ try:
796
+ # Calculate path relative to this file
797
+ version_file = Path(__file__).parent.parent.parent.parent / "VERSION"
798
+ if version_file.exists():
799
+ version = version_file.read_text().strip()
800
+ method_used = "version_file"
801
+ self.logger.debug(f"Version obtained via VERSION file: {version}")
802
+ else:
803
+ self.logger.debug(f"VERSION file not found at: {version_file}")
804
+ except Exception as e:
805
+ self.logger.warning(f"Failed to read VERSION file: {e}")
806
+
807
+ # Log final result
808
+ if version == "0.0.0":
809
+ self.logger.error(
810
+ "All version detection methods failed. This indicates a packaging or installation issue."
811
+ )
812
+ else:
813
+ self.logger.debug(f"Final version: {version} (method: {method_used})")
814
+
815
+ return f"v{version}"
816
+
753
817
  def _register_memory_hooks(self):
754
818
  """Register memory integration hooks with the hook service.
755
819
 
@@ -0,0 +1,229 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Pure Python daemon management for Socket.IO server.
4
+ No external dependencies required.
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ import time
10
+ import signal
11
+ import subprocess
12
+ import psutil
13
+ import json
14
+ from pathlib import Path
15
+
16
+ # Handle imports for both development and installed scenarios
17
+ script_dir = Path(__file__).parent
18
+ try:
19
+ # When installed as package, this should work directly
20
+ from claude_mpm.services.socketio_server import SocketIOServer
21
+ except ImportError:
22
+ # When in development, add src to path
23
+ project_root = script_dir.parent.parent.parent # from scripts -> claude_mpm -> src -> project_root
24
+ src_path = project_root / "src"
25
+ if src_path.exists():
26
+ sys.path.insert(0, str(src_path))
27
+ from claude_mpm.services.socketio_server import SocketIOServer
28
+
29
+ PID_FILE = Path.home() / ".claude-mpm" / "socketio-server.pid"
30
+ LOG_FILE = Path.home() / ".claude-mpm" / "socketio-server.log"
31
+
32
+ def ensure_dirs():
33
+ """Ensure required directories exist."""
34
+ PID_FILE.parent.mkdir(parents=True, exist_ok=True)
35
+
36
+ def is_running():
37
+ """Check if server is already running."""
38
+ if not PID_FILE.exists():
39
+ return False
40
+
41
+ try:
42
+ with open(PID_FILE) as f:
43
+ pid = int(f.read().strip())
44
+
45
+ # Check if process exists
46
+ process = psutil.Process(pid)
47
+ return process.is_running()
48
+ except (ValueError, psutil.NoSuchProcess, psutil.AccessDenied):
49
+ # Clean up stale PID file
50
+ PID_FILE.unlink(missing_ok=True)
51
+ return False
52
+
53
+ def start_server():
54
+ """Start the Socket.IO server as a daemon with conflict detection."""
55
+ if is_running():
56
+ print("Socket.IO daemon server is already running.")
57
+ print(f"Use '{__file__} status' for details")
58
+ return
59
+
60
+ # Check for HTTP-managed server conflict
61
+ try:
62
+ import requests
63
+ response = requests.get("http://localhost:8765/health", timeout=1.0)
64
+ if response.status_code == 200:
65
+ data = response.json()
66
+ if 'server_id' in data:
67
+ print(f"⚠️ HTTP-managed server already running: {data.get('server_id')}")
68
+ print(f" Stop it first: socketio_server_manager.py stop --port 8765")
69
+ print(f" Or diagnose: socketio_server_manager.py diagnose")
70
+ return
71
+ except:
72
+ pass # No HTTP server, continue
73
+
74
+ ensure_dirs()
75
+
76
+ # Fork to create daemon
77
+ pid = os.fork()
78
+ if pid > 0:
79
+ # Parent process
80
+ print(f"Starting Socket.IO server (PID: {pid})...")
81
+ with open(PID_FILE, 'w') as f:
82
+ f.write(str(pid))
83
+ print("Socket.IO server started successfully.")
84
+ print(f"PID file: {PID_FILE}")
85
+ print(f"Log file: {LOG_FILE}")
86
+ sys.exit(0)
87
+
88
+ # Child process - become daemon
89
+ os.setsid()
90
+ os.umask(0)
91
+
92
+ # Redirect stdout/stderr to log file
93
+ with open(LOG_FILE, 'a') as log:
94
+ os.dup2(log.fileno(), sys.stdout.fileno())
95
+ os.dup2(log.fileno(), sys.stderr.fileno())
96
+
97
+ # Start server
98
+ print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Starting Socket.IO server...")
99
+ server = SocketIOServer(host="localhost", port=8765)
100
+
101
+ # Handle signals
102
+ def signal_handler(signum, frame):
103
+ print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Received signal {signum}, shutting down...")
104
+ server.stop()
105
+ PID_FILE.unlink(missing_ok=True)
106
+ sys.exit(0)
107
+
108
+ signal.signal(signal.SIGTERM, signal_handler)
109
+ signal.signal(signal.SIGINT, signal_handler)
110
+
111
+ # Start server
112
+ server.start()
113
+
114
+ # Keep running
115
+ try:
116
+ while True:
117
+ time.sleep(1)
118
+ except KeyboardInterrupt:
119
+ signal_handler(signal.SIGINT, None)
120
+
121
+ def stop_server():
122
+ """Stop the Socket.IO daemon server."""
123
+ if not is_running():
124
+ print("Socket.IO daemon server is not running.")
125
+ print(f"Check for other servers: socketio_server_manager.py status")
126
+ return
127
+
128
+ try:
129
+ with open(PID_FILE) as f:
130
+ pid = int(f.read().strip())
131
+
132
+ print(f"Stopping Socket.IO server (PID: {pid})...")
133
+ os.kill(pid, signal.SIGTERM)
134
+
135
+ # Wait for process to stop
136
+ for _ in range(10):
137
+ if not is_running():
138
+ print("Socket.IO server stopped successfully.")
139
+ PID_FILE.unlink(missing_ok=True)
140
+ return
141
+ time.sleep(0.5)
142
+
143
+ # Force kill if still running
144
+ print("Server didn't stop gracefully, forcing...")
145
+ os.kill(pid, signal.SIGKILL)
146
+ PID_FILE.unlink(missing_ok=True)
147
+
148
+ except Exception as e:
149
+ print(f"Error stopping server: {e}")
150
+
151
+ def status_server():
152
+ """Check server status with manager integration info."""
153
+ if is_running():
154
+ with open(PID_FILE) as f:
155
+ pid = int(f.read().strip())
156
+ print(f"Socket.IO daemon server is running (PID: {pid})")
157
+ print(f"PID file: {PID_FILE}")
158
+
159
+ # Check if port is listening
160
+ try:
161
+ import socket
162
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
163
+ result = sock.connect_ex(('localhost', 8765))
164
+ sock.close()
165
+ if result == 0:
166
+ print("✅ Server is listening on port 8765")
167
+ print("🔧 Management style: daemon")
168
+ else:
169
+ print("⚠️ WARNING: Server process exists but port 8765 is not accessible")
170
+ except:
171
+ pass
172
+
173
+ # Show management commands
174
+ print("\n🔧 Management Commands:")
175
+ print(f" • Stop: {__file__} stop")
176
+ print(f" • Restart: {__file__} restart")
177
+
178
+ # Check for manager conflicts
179
+ try:
180
+ import requests
181
+ response = requests.get("http://localhost:8765/health", timeout=1.0)
182
+ if response.status_code == 200:
183
+ data = response.json()
184
+ if 'server_id' in data and data.get('server_id') != 'daemon-socketio':
185
+ print(f"\n⚠️ POTENTIAL CONFLICT: HTTP-managed server also detected")
186
+ print(f" Server ID: {data.get('server_id')}")
187
+ print(f" Use 'socketio_server_manager.py diagnose' to resolve")
188
+ except:
189
+ pass
190
+
191
+ else:
192
+ print("Socket.IO daemon server is not running")
193
+ print(f"\n🔧 Start Commands:")
194
+ print(f" • Daemon: {__file__} start")
195
+ print(f" • HTTP-managed: socketio_server_manager.py start")
196
+
197
+ def main():
198
+ """Main entry point."""
199
+ if len(sys.argv) < 2:
200
+ print("Usage: socketio-daemon.py {start|stop|restart|status}")
201
+ sys.exit(1)
202
+
203
+ command = sys.argv[1]
204
+
205
+ if command == "start":
206
+ start_server()
207
+ elif command == "stop":
208
+ stop_server()
209
+ elif command == "restart":
210
+ stop_server()
211
+ time.sleep(1)
212
+ start_server()
213
+ elif command == "status":
214
+ status_server()
215
+ else:
216
+ print(f"Unknown command: {command}")
217
+ print("Usage: socketio-daemon.py {start|stop|restart|status}")
218
+ sys.exit(1)
219
+
220
+ if __name__ == "__main__":
221
+ # Install psutil if not available
222
+ try:
223
+ import psutil
224
+ except ImportError:
225
+ print("Installing psutil...")
226
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "psutil"])
227
+ import psutil
228
+
229
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 3.4.5
3
+ Version: 3.4.7
4
4
  Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
5
5
  Home-page: https://github.com/bobmatnyc/claude-mpm
6
6
  Author: Claude MPM Team
@@ -7,7 +7,6 @@ claude-mpm
7
7
  pyproject.toml
8
8
  requirements.txt
9
9
  setup.py
10
- ticket
11
10
  scripts/run_mpm.py
12
11
  scripts/ticket
13
12
  src/claude_mpm/__init__.py
@@ -131,6 +130,7 @@ src/claude_mpm/orchestration/archive/subprocess_orchestrator.py
131
130
  src/claude_mpm/orchestration/archive/system_prompt_orchestrator.py
132
131
  src/claude_mpm/orchestration/archive/wrapper_orchestrator.py
133
132
  src/claude_mpm/schemas/workflow_validator.py
133
+ src/claude_mpm/scripts/socketio_daemon.py
134
134
  src/claude_mpm/services/__init__.py
135
135
  src/claude_mpm/services/agent_capabilities_generator.py
136
136
  src/claude_mpm/services/agent_deployment.py
claude_mpm-3.4.5/VERSION DELETED
@@ -1 +0,0 @@
1
- 3.4.5
claude_mpm-3.4.5/ticket DELETED
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Project-level ticket wrapper that delegates to aitrackdown
3
-
4
- set -e
5
-
6
- # Get the directory where this script is located
7
- SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
-
9
- # Check if virtual environment exists and activate it
10
- VENV_DIR="$SCRIPT_DIR/venv"
11
- if [ -d "$VENV_DIR" ]; then
12
- source "$VENV_DIR/bin/activate"
13
- elif [ -f "$SCRIPT_DIR/scripts/ticket" ]; then
14
- # Delegate to the scripts version if no venv
15
- exec "$SCRIPT_DIR/scripts/ticket" "$@"
16
- fi
17
-
18
- # Check if aitrackdown is available
19
- if ! command -v aitrackdown &> /dev/null; then
20
- echo "Error: aitrackdown not found. Please run ./install_dev.sh"
21
- exit 1
22
- fi
23
-
24
- # Execute the ticket script logic
25
- exec "$SCRIPT_DIR/scripts/ticket" "$@"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes